Skip to content

Codex/issue 69 localization fix#75

Merged
themuffinator merged 13 commits into
mainfrom
codex/issue-69-localization-fix
Jun 18, 2026
Merged

Codex/issue 69 localization fix#75
themuffinator merged 13 commits into
mainfrom
codex/issue-69-localization-fix

Conversation

@themuffinator

Copy link
Copy Markdown
Owner

No description provided.

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.
@themuffinator themuffinator merged commit 24dfed5 into main Jun 18, 2026
7 checks passed
@themuffinator themuffinator deleted the codex/issue-69-localization-fix branch June 18, 2026 22:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant