Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions .github/workflows/commit-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@ permissions:

env:
# Keep the engine's shared File/FileSystem ABI locked to the companion
# revision that implements GAME_API 45 and generated-animation cache v3.
OPENQ4_GAMELIBS_SHA: 09fa7e175efa5a5d819569ba577fd0e11c38a891
# revision that implements GAME_API 46, generated-animation cache v3, and
# the game-owned transient time-scale interface.
OPENQ4_GAMELIBS_SHA: 67fcd3e2142bc07c4871873ea1ec6fe592ac8a5a

jobs:
script-smoke:
Expand Down Expand Up @@ -83,6 +84,7 @@ jobs:
tools/tests/aas_settings_contract.py \
tools/tests/arena_campaign.py \
tools/tests/async_drop_client_contract.py \
tools/tests/base64_input_safety.py \
tools/tests/campaign_split_state_transition.py \
tools/tests/clang_tidy_input_safety.py \
tools/tests/cmdargs_append_contract.py \
Expand All @@ -105,6 +107,7 @@ jobs:
tools/tests/level_load_cache.py \
tools/tests/hdr_postprocess_math.py \
tools/tests/idstr_input_safety.py \
tools/tests/lexer_input_safety.py \
tools/tests/lexer_peek_contract.py \
tools/tests/key_bind_presentation.py \
tools/tests/levelshot_inventory.py \
Expand Down Expand Up @@ -134,6 +137,8 @@ jobs:
tools/tests/loading_continue_input.py \
tools/tests/loading_pacifier_pacing.py \
tools/tests/map_entity_strings.py \
tools/tests/weapon_wheel_time_scale.py \
tools/tests/weapon_zoom_view_alignment.py \
tools/tests/macos_apple_gl21_arb2_corridor.py \
tools/tests/macos_dedicated_server_smoke.py \
tools/tests/macos_dedicated_server_smoke_contract.py \
Expand Down Expand Up @@ -192,6 +197,7 @@ jobs:
tools/tests/renderer_advanced_lighting.py \
tools/tests/renderer_budget_contract.py \
tools/tests/renderer_cel_shading.py \
tools/tests/renderer_demo_projection_safety.py \
tools/tests/renderer_gpu_frame_timing.py \
tools/tests/renderer_gpu_skinning.py \
tools/tests/renderer_temporal_presentation.py \
Expand Down Expand Up @@ -231,6 +237,8 @@ jobs:
tools/tests/stock_asset_baseline.py \
tools/tests/stock_media_fallbacks.py \
tools/tests/ui_embedded_icons.py \
tools/tests/ui_cursor_state_safety.py \
tools/tests/ui_window_state_safety.py \
tools/tests/validation_hardening.py \
tools/tests/vk_shader_header_pin.py \
tools/tests/vk_temporal_resolve_shader_pin.py \
Expand All @@ -244,6 +252,7 @@ jobs:
python tools/tests/aas_settings_contract.py
python tools/tests/arena_campaign.py
python tools/tests/async_drop_client_contract.py
python tools/tests/base64_input_safety.py
python tools/tests/campaign_split_state_transition.py
python tools/tests/clang_tidy_input_safety.py
python tools/tests/cmdargs_append_contract.py
Expand All @@ -266,6 +275,7 @@ jobs:
python tools/tests/level_load_cache.py
python tools/tests/hdr_postprocess_math.py
python tools/tests/idstr_input_safety.py
python tools/tests/lexer_input_safety.py
python tools/tests/lexer_peek_contract.py
python tools/tests/key_bind_presentation.py
python tools/tests/levelshot_inventory.py
Expand All @@ -292,6 +302,8 @@ jobs:
python tools/tests/loading_continue_input.py
python tools/tests/loading_pacifier_pacing.py
python tools/tests/map_entity_strings.py
python tools/tests/weapon_wheel_time_scale.py
python tools/tests/weapon_zoom_view_alignment.py
python tools/tests/macos_apple_gl21_arb2_corridor.py
python tools/tests/macos_dedicated_server_smoke_contract.py
python tools/tests/macos_evidence_plumbing.py
Expand Down Expand Up @@ -349,6 +361,7 @@ jobs:
python tools/tests/renderer_advanced_lighting.py
python tools/tests/renderer_budget_contract.py
python tools/tests/renderer_cel_shading.py
python tools/tests/renderer_demo_projection_safety.py
python tools/tests/renderer_gpu_frame_timing.py
python tools/tests/renderer_gpu_skinning.py
python tools/tests/renderer_temporal_presentation.py
Expand Down Expand Up @@ -386,6 +399,8 @@ jobs:
python tools/tests/stock_asset_baseline.py
python tools/tests/stock_media_fallbacks.py
python tools/tests/ui_embedded_icons.py
python tools/tests/ui_cursor_state_safety.py
python tools/tests/ui_window_state_safety.py
python tools/tests/validation_hardening.py
python tools/tests/vk_shader_header_pin.py
python tools/tests/vk_temporal_resolve_shader_pin.py
Expand Down
19 changes: 17 additions & 2 deletions .github/workflows/push-verification.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ permissions:

env:
# Keep the engine's shared File/FileSystem ABI locked to the companion
# revision that implements GAME_API 45 and generated-animation cache v3.
OPENQ4_GAMELIBS_SHA: 09fa7e175efa5a5d819569ba577fd0e11c38a891
# revision that implements GAME_API 46, generated-animation cache v3, and
# the game-owned transient time-scale interface.
OPENQ4_GAMELIBS_SHA: 67fcd3e2142bc07c4871873ea1ec6fe592ac8a5a

concurrency:
group: openq4-push-verification-${{ github.ref }}
Expand Down Expand Up @@ -83,6 +84,7 @@ jobs:
tools/tests/aas_settings_contract.py \
tools/tests/arena_campaign.py \
tools/tests/async_drop_client_contract.py \
tools/tests/base64_input_safety.py \
tools/tests/campaign_split_state_transition.py \
tools/tests/clang_tidy_input_safety.py \
tools/tests/cmdargs_append_contract.py \
Expand All @@ -105,6 +107,7 @@ jobs:
tools/tests/level_load_cache.py \
tools/tests/hdr_postprocess_math.py \
tools/tests/idstr_input_safety.py \
tools/tests/lexer_input_safety.py \
tools/tests/lexer_peek_contract.py \
tools/tests/key_bind_presentation.py \
tools/tests/levelshot_inventory.py \
Expand Down Expand Up @@ -134,6 +137,8 @@ jobs:
tools/tests/loading_continue_input.py \
tools/tests/loading_pacifier_pacing.py \
tools/tests/map_entity_strings.py \
tools/tests/weapon_wheel_time_scale.py \
tools/tests/weapon_zoom_view_alignment.py \
tools/tests/macos_apple_gl21_arb2_corridor.py \
tools/tests/macos_dedicated_server_smoke.py \
tools/tests/macos_dedicated_server_smoke_contract.py \
Expand Down Expand Up @@ -192,6 +197,7 @@ jobs:
tools/tests/renderer_advanced_lighting.py \
tools/tests/renderer_budget_contract.py \
tools/tests/renderer_cel_shading.py \
tools/tests/renderer_demo_projection_safety.py \
tools/tests/renderer_gpu_frame_timing.py \
tools/tests/renderer_gpu_skinning.py \
tools/tests/renderer_temporal_presentation.py \
Expand Down Expand Up @@ -231,6 +237,8 @@ jobs:
tools/tests/stock_asset_baseline.py \
tools/tests/stock_media_fallbacks.py \
tools/tests/ui_embedded_icons.py \
tools/tests/ui_cursor_state_safety.py \
tools/tests/ui_window_state_safety.py \
tools/tests/validation_hardening.py \
tools/tests/vk_shader_header_pin.py \
tools/tests/vk_temporal_resolve_shader_pin.py \
Expand All @@ -244,6 +252,7 @@ jobs:
python tools/tests/aas_settings_contract.py
python tools/tests/arena_campaign.py
python tools/tests/async_drop_client_contract.py
python tools/tests/base64_input_safety.py
python tools/tests/campaign_split_state_transition.py
python tools/tests/clang_tidy_input_safety.py
python tools/tests/cmdargs_append_contract.py
Expand All @@ -266,6 +275,7 @@ jobs:
python tools/tests/level_load_cache.py
python tools/tests/hdr_postprocess_math.py
python tools/tests/idstr_input_safety.py
python tools/tests/lexer_input_safety.py
python tools/tests/lexer_peek_contract.py
python tools/tests/key_bind_presentation.py
python tools/tests/levelshot_inventory.py
Expand All @@ -292,6 +302,8 @@ jobs:
python tools/tests/loading_continue_input.py
python tools/tests/loading_pacifier_pacing.py
python tools/tests/map_entity_strings.py
python tools/tests/weapon_wheel_time_scale.py
python tools/tests/weapon_zoom_view_alignment.py
python tools/tests/macos_apple_gl21_arb2_corridor.py
python tools/tests/macos_dedicated_server_smoke_contract.py
python tools/tests/macos_evidence_plumbing.py
Expand Down Expand Up @@ -349,6 +361,7 @@ jobs:
python tools/tests/renderer_advanced_lighting.py
python tools/tests/renderer_budget_contract.py
python tools/tests/renderer_cel_shading.py
python tools/tests/renderer_demo_projection_safety.py
python tools/tests/renderer_gpu_frame_timing.py
python tools/tests/renderer_gpu_skinning.py
python tools/tests/renderer_temporal_presentation.py
Expand Down Expand Up @@ -386,6 +399,8 @@ jobs:
python tools/tests/stock_asset_baseline.py
python tools/tests/stock_media_fallbacks.py
python tools/tests/ui_embedded_icons.py
python tools/tests/ui_cursor_state_safety.py
python tools/tests/ui_window_state_safety.py
python tools/tests/validation_hardening.py
python tools/tests/vk_shader_header_pin.py
python tools/tests/vk_temporal_resolve_shader_pin.py
Expand Down
2 changes: 1 addition & 1 deletion TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ This file tracks current known issues and upcoming features.
- [x] Viewport sometimes remains black when changing between SP and MP; investigate update/refresh logic during module transitions.
- [ ] Menu cursor handling needs improvement (focus, capture, and consistency across input modes and resolutions).
- [x] The locked door/scripted trigger progression bug inherited from Quake4Doom was fixed by porting OpenD3's x64 script-compiler pointer-temp storage guard (4-byte object-ref temp vs 8-byte pointer temp mismatch).
- [ ] Machinegun zoom projection yaw differs from viewangles yaw.
- [x] Machinegun zoom projection yaw now follows the interpolated camera actually presented in both SP and MP.

## Upcoming Features and Improvements

Expand Down
5 changes: 5 additions & 0 deletions docs/dev/release-completion.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ is `docs/dev/macos-moltenvk-decision.md`.

## Ready For Changelog

- [x] Machinegun scope markings now follow the interpolated camera that is actually displayed, rather than the weapon's last 60 Hz simulation pose. Turning while zoomed therefore stays aligned at high refresh rates in both single-player and multiplayer, and the same presentation-state route is available to other weapon zoom GUIs.
- [x] Asset parsing and GUI state handling now fail safely at several legacy edge cases. Default parser tokens initialize all metadata, lexer file loads reject impossible lengths, allocation failures, and short reads before touching the buffer, and GUI cursor/save values reject NaN or infinity. Relative input, absolute input, demos, and save restores now share one finite, aspect-aware cursor-bounds path instead of allowing invalid or off-canvas state to persist.
- [x] Corrupt auxiliary data now stops at a safe boundary instead of leaking state into later rendering or restore work. Engine and GameLib Base64 paths agree on bounded allocation, null handling, whitespace, and invalid characters; GUI timelines reject malformed or overflowing timestamps and clean up failed scripts; GUI window saves validate writes, structure, identity, and finite layout values; and malformed GUI/decal demo payloads or undefined decal projections are rejected before they can produce invalid geometry.
- [x] Post-map validation configs now enter the engine command queue instead of executing synchronously from the active game draw. This removes a reentrant screen-update path that could leave SP screenshots and save previews filled with untouched allocator memory; the strict windowed retail-PK4 baseline now passes SP capture, save/restore, demo playback, MP listen/client capture, image-integrity checks, and all map-specific CPU/GPU budgets.
- [x] Opening the in-game menu in single-player no longer waits for save-game, mod, key-binding, audio-device, display-mode, or multiplayer-model enumeration. The pause screen now activates immediately and refreshes each potentially expensive catalog only when the player opens the page that needs it; its background, fallback levelshot, and music are also re-referenced during normal level precaching instead of on the first Escape press.
- [x] Bitmap GUI text now selects its 12-, 24-, or 48-point source atlas using the final viewport enlargement as well as the authored 640x480-era text scale. Menus and HUD text therefore stay sharp at 1080p, 1440p, and 4K without the community workaround of forcing both font-limit CVars to zero, while text layout and low-resolution behavior remain unchanged.
- [x] Developer and nightly builds now regenerate their Git-derived version header on every build invocation while avoiding downstream recompilation when the value is unchanged. The console banner, executable metadata, engine, and both game modules therefore report the current commit without requiring a fresh Meson setup.
Expand Down Expand Up @@ -563,6 +567,7 @@ is `docs/dev/macos-moltenvk-decision.md`.
- [x] Linux Wayland startup guidance is clearer before SDL video initialization: mixed and pure Wayland sessions now report openQ4's `OPENQ4_FORCE_X11`, `OPENQ4_WAYLAND_PREFER_LIBDECOR`, and `OPENQ4_WAYLAND_SYNC_WINDOW_OPS` fallback/diagnostic switches instead of only pointing users at raw SDL driver variables.
- [x] SDL3 Linux desktop-resolution detection is more robust on unusual compositors: if SDL cannot report a desktop display mode, openQ4 now falls back to the current display mode and then display bounds before failing the query.
- [x] Multiplayer weapon-wheel handling no longer tries to restore the cheat-protected `timescale` cvar every frame, removing the repeated "timescale cannot be changed in multiplayer" warning while preserving normal MP weapon selection.
- [x] The single-player weapon wheel no longer owns the public `timescale` cvar: a dedicated transient engine/GameLib time-scale channel now drives smooth simulation and audio slowdown and releases cleanly on wheel close or Escape. The Quake 4 SDK walk/run condition is restored as well, so console changes to `timescale` remain intact and `pm_walkspeed` once again governs walking instead of being bypassed by forced running.
- [x] Startup and SP map validation logs are cleaner: stock intro loading screens now select their cinematic loading background from engine code without a mapDef override, openQ4 napalm gameplay decl replacements apply without duplicate-decl noise, stale staged intro-video material overrides no longer shadow stock assets, and optional packed-MD5R shader probes skip missing variants quietly.
- [x] Stock mappack material loading is quieter: known Quake 4 addon redeclarations between `mapobjects_mp2`, `mappack1`, and `stroyent_mp` no longer flood developer logs while unrelated duplicate material warnings remain visible.
- [x] Developer map-launch logs are less noisy during stock content validation: duplicate/tripled silhouette-edge topology diagnostics are now opt-in through `r_reportSilhouetteEdgeWarnings` instead of flooding normal `developer 1` runs.
Expand Down
Loading
Loading