Codex/issue 69 localization fix#75
Merged
Merged
Conversation
Fix split-map transitions so an explicit entity filter selected by map/devmap/session-command callers is preserved when MoveToNewMap normalizes the destination. This prevents scripted transitions such as game/storage1 second from being overwritten by the bare split-map default of first. Add openq4_assertMapState for validation harnesses and a campaign-split-state-transition gameplay profile that triggers the real end-level chain from game/mcc_2 through game/storage1 first, game/storage2, game/storage1 second, and game/tram1. Wire the regression guard into CI/static validation, document the benchmark profile, and add the release-completion note. Validation: python tools\\tests\\campaign_split_state_transition.py; python -m py_compile tools\\tests\\renderer_gameplay_benchmark.py tools\\tests\\renderer_validation_matrix.py tools\\tests\\campaign_split_state_transition.py tools\\validation\\openq4_validate.py; previously ran the full campaign-split-state-transition gameplay profile successfully.
The walker shield damage feedback resolves `fx_shield` to the stock `effects/vehicles/walker/shield.fx` effect, which combines an oriented ripple with sprite sparks. The SP/MP vehicle code already dispatches the effect when a driven vehicle still has shield health, so the remaining mismatch was BSE particle surface generation. Mirror the retail Quake 4 BSE renderer for sprite and oriented particles: - carry the particle center through the draw-vertex normal payload - emit the full-size cross-quad vertex layout used by retail sprites - use the decompiled oriented-particle basis signs and vertex order - record the player-visible BSE parity fix in the release checklist Tested: - git diff --check -- src/bse/BSE_Particle.cpp docs-dev/release-completion.md - .\tools\build\meson_setup.ps1 compile -C builddir openQ4-client_x64
Retail Quake 4 fires the player cursor GUI weaponHit event when the local player damages an enemy. The stock cursor GUI implements the single-player red hit flash by assigning matcolor_x/y/z on the active crosshair windows, but openQ4 only resolved r/g/b/w component aliases for built-in window color vectors. As a result the event could run without changing the drawn crosshair color. Resolve x/y/z as aliases for r/g/b on backColor, matColor, foreColor, hoverColor, and borderColor. This keeps the stock cursor asset working unchanged, restores the single-player red damage-hit flash, and also covers the same Quake 4 vector-component spelling for other GUI color fields. No new gameplay setting or cvar is involved. Existing HUD/crosshair visibility settings still apply, and the retail cursor asset still gates the red color path to gui::mp == 0, so multiplayer keeps the stock asset behavior. Update the release completion list with the player-visible crosshair feedback fix. Validation: tools/build/meson_setup.ps1 compile -C builddir; tools/build/meson_setup.ps1 install -C builddir --no-rebuild; python tools/tests/renderer_gameplay_benchmark.py --profile smoke --sample-frames 60 --output-dir .tmp/crosshair-hit-smoke.
The System settings menu now exposes a modern display-resolution picker instead of binding the visible row directly to the legacy r_mode table. The picker is built from Desktop Native, Custom, and SDL3-reported fullscreen modes for the selected display, with the existing predefined mode list retained as the non-SDL fallback. Explicit fullscreen selections now apply as exact custom dimensions by writing r_mode -1 plus r_customWidth/r_customHeight. Desktop Native writes r_mode -2. Changing the selected display refreshes the available mode and refresh choices, and custom fullscreen width/height entry selects custom fullscreen mode automatically. Refresh-rate choices are now generated from the selected display's SDL3 fullscreen modes when available, with common presets as fallback. The renderer accepts r_displayRefresh values up to 1000 Hz so modern high refresh displays are not rejected by the cvar range. This also adds localized menu labels, updates the user/developer display settings documentation and registry metadata, records the release-note entry, and extends settings-menu coverage for the new display adapter. Validation already run: - python tools\tests\settings_menu_coverage.py - python tools\tests\sdl3_multidisplay_windowing.py - git diff --check -- <session files> - tools\build\meson_setup.ps1 compile - python tools\validation\openq4_validate.py push --skip-build
The Settings menu was correctly updating r_brightness/r_gamma and the renderer was rebuilding the legacy gamma table, but SDL3 and legacy Win32 never applied that table because their GLimp_SetGamma implementations are no-ops. Add GLimp_UseNativeGammaRamps() so the renderer can distinguish platforms that still apply OS display ramps from those that need renderer-owned presentation color mapping. SDL3, legacy Win32, stub, and dedicated-server backends now report that they do not use native ramps; native Linux and macOS keep their existing OS ramp paths. For non-native-ramp backends, add a final built-in GLSL backbuffer color-mapping pass after resolution scaling/CRT and before swap. The pass applies the same brightness clamp and gamma curve as the legacy gamma table to the completed framebuffer, covering scene, GUI, and debug presentation without double-applying on native-ramp platforms. Add regression coverage for the display color-mapping math, final present-path ordering, and per-backend native-ramp routing, and record the player-facing fix in the release completion notes. Validated: - python tools/tests/hdr_postprocess_math.py - python tools/tests/settings_menu_coverage.py - .\tools\build\meson_setup.ps1 compile -C builddir - .\tools\build\meson_setup.ps1 install -C builddir --no-rebuild --skip-subprojects - Hidden SP smoke on game/storage1 with r_brightness 1.35 and r_gamma 1.4; log loaded builtin/final_color_mapping and entered the map.
Normalize sys_lang before language-table filtering, including command-line values with casing or whitespace, and fall back to English when no matching language files are available. Load English language tables before non-English tables so incomplete localized packs still resolve openQ4 GUI strings through English fallback. Handle the Settings menu reloadLanguage, reloadGuis, and CVarStrcmp command sequence so language changes apply immediately and the current language index refreshes. Parse localized choice labels with literal semicolon splitting instead of idLexer tokenization so accented labels do not emit ChoiceList punctuation warnings. Document the player-visible localization fix in the release-completion notes. Validation: git diff --cached --check; GUI string coverage for 474 referenced GUI ids across English, Spanish, French, and Italian with English fallback; .\tools\build\meson_setup.ps1 compile -C builddir; python tools\build\stage_windows_runtime.py --source-root . --build-dir builddir; hidden French startup had no Unknown string id, ChoiceList, or unknown punctuation localization warnings; python tools\tests\settings_menu_coverage.py.
Modify and add numerous lightgrid .tga assets across multiple maps. Replaced ambient lightgrids for airdefense1 and many MP maps (q4dm1, q4dm2, q4dm10, q4dm11, etc.), and added new ambient/pos/vis lightgrid sets for airdefense2 and mp/q4dm11v1. These changes refresh per-area lighting data used by the engine.
Add four new localization entries (#str_229972–#str_229975) to English, French, Italian, and Spanish language files: scope sensitivity, desktop native, custom, and display resolution. Updated .install/baseoq4/strings/{english,french,italian,spanish}_openq4.lang to include these translations.
Introduce a new UI string (#str_229972) for the "Scope Sensitivity" option across English, French, Italian, and Spanish localization files. Updates added to content/baseoq4/strings/*_openq4.lang to support the new setting in the options menu.
Point the release broadcaster's default avatar URL at assets/img/avatar.png in both workflow entry points and the shared Discord announcement script. Document the default avatar path for release operators and add the PNG asset so raw GitHub avatar links resolve after push.
Track the selected sound-shader entry on active channels so material/light amplitude queries use the same entry that was started for playback. Evaluate Quake 4 sound-shader shakeData in CurrentAmplitude, including no-flicker and s_constantAmplitude handling, while keeping decoded sample amplitude as the fallback for sounds without authored shake data. This restores nonzero sound registers for stock light materials such as lights/round_snd, fixing Air Defense 1's hum-driven corridor light_7219 being pruned as black. Validation: tools/build/meson_setup.ps1 compile -C builddir; tools/build/meson_setup.ps1 install -C builddir --no-rebuild --skip-subprojects; renderer_gameplay_benchmark.py sp-airdefense1 at setviewpos 9303.19 -2163.12 84.25 272.3 with r_showViewLights reporting affect[97] shader='lights/round_snd'.
Reintroduce the machinegun zoom-scope blur windows for the center canvas and aspect-expanded gutters, including the staged .install copies used by local package runs. Replace the old POTCorrection/video-size sampling path with current-render viewport uniforms so SniperStretch2 samples _currentRender in active viewport coordinates while preserving the scope mask's GUI-local UVs. Clamp the current-render and mask samplers to avoid edge wrapping at exact-size framebuffer captures. Add GLSL shaderParm bindings for currentRenderViewportOrigin, currentRenderViewportSize, and currentRenderTextureScale so post-GUI materials can remain correct for non-4:3, letterboxed, pillarboxed, and non-origin viewports. Document the restored aspect-safe blur in release-completion notes. Validation: tools/build/meson_setup.ps1 compile -C builddir; testGUI guis/weapons/machinegun_scope.gui at 1280x720 and 720x1280 loaded glsl/SniperStretch2.glsl without shader/material errors.
Introduce a new "Scope Sensitivity" option (pm_zoomedSlow) with a slider and numeric entry in the Settings->Game UI. Adds pm_zoomedSlow default (50) to content/baseoq4/default.cfg and updates mainmenu and settings GUI files (content/.install) to show/hide, hover, background and noevents handling for the new control. Adjusts layout: increases content pane height, shifts subsequent option rects and hover areas, and bumps settings section scroll indexes/high values accordingly. Also adds new GUI assets (vehicles/airdef_cannon, vehicles/hud, weapons/nailgun_scope) and updates .gitignore to ignore /$outDir.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.