- Original HUD bitmaps, weapon icons, reticles, compass and vehicle instruments
are present, but layout is adapted. Inventory/preferences menus are simplified;
station selection covers armor and Repair Pack, not the full T2 loadout system.
Energy Packs are absent. Quick chat is nine Bot1 lines, not the full voice tree.
- Files: `stationMenu.ts`, `hud.ts`, `voicebinds.ts`, related client menus and sim
loadout handling. Reference evidence: `docs/ui-audio-reference.md`.
- Acceptance: compare on-foot, zoom, vehicle, station and commander screens at
matching aspect ratios; reproduce source functionality and selected loadouts.
Preserve contact activation, number-key vehicle selection and released cursor.
Continuation context: [docs/ISSUES.md](https://github.com/STRML/clans/blob/main/docs/ISSUES.md).
The concrete complaints are fixed: full armour, pack and weapons selection, `PackId.None/Repair/Energy`, a sanitized weapon bitmask, persistence across respawn and a networked HUD.
Still open: the reticle, compass and vehicle-instrument pixel layout is unconstrained by the committed reference; the Repair Pack renders as a text cell because no icon is committed (`packages/client/src/hud.ts:232-234`); and `maxWeapons` is deliberately unconsumed (`packages/sim/src/baseObjects.ts:318-321`). Both of the latter are now being finished.
---
Status verified against the code at `d1ba6db` by an automated sweep over this backlog. Left open deliberately.
Correction to the residual list above, and one of those residuals is now closed in code.
**The vehicle reticles were not unconstrained, and are now the game's own.** `scripts/hud.cs:39-53` is a table keyed by datablock name, and the datablock names map onto our kinds without guesswork: the Tank is `AssaultVehicle` (`vehicle_tank.cs:197`) and the Bomber is `BomberFlyer` (`vehicle_bomber.cs:176`).
```
AssaultVehicle slot 1 gui/hud_ret_tankchaingun frame = true
AssaultVehicle slot 2 gui/hud_ret_tankmortar frame = true
BomberFlyer slot 1 gui/hud_ret_shrike frame = false
BomberFlyer slot 2 (no bitmap at all)
BomberFlyer slot 3 gui/hud_ret_targlaser frame = false
```
The client used to draw the on-foot weapon crosshair for every vehicle except the Shrike. `reticleBitmapFor` now implements that table, and the two tank bitmaps, which were missing from our assets, are committed (`hud_ret_tankchaingun.png`, `hud_ret_tankmortar.png`).
Two things I am recording instead of hiding. Our sim carries no vehicle weapon-slot selection (no wire field, no input, so the client knows only the mounted kind), so each kind draws its slot 1 art. And in that table the art named for the Shrike belongs to the **Bomber**, while the Shrike's own datablock (`ScoutFlyer`, `vehicle_shrike.cs:93`) has no row at all: the Shrike keeps drawing that art here, because removing it would take a reticle away from a vehicle the source leaves unset.
Verified in the running client, not by reading: `e2e/vehicle-reticle.spec.ts` teleports to the pad, waits for the menu (the Tank's row is "Beowulf", the script's own `targetNameTag`), buys it with Digit 2, advances the fabrication, and asserts the crosshair resolves to `hud_ret_tankchaingun.png` and that the bitmap loads. Screenshot reviewed: cockpit, ring reticle, dash with speed readout.
**The other two named residuals are also done on current main**, for the record: the Repair Pack icon is the source's own `hud_new_packrepair.png` (committed with the twelve recordings in `e59eb98`), and `maxWeapons` is consumed by the weapon-slot cap (`3dc8aa4`). The compass already draws `hud_new_cog.png` / `hud_new_compass.png` / `hud_new_NSEW.png`.
What genuinely remains unconstrained is the *pixel layout* of the compass and the vehicle instrument cluster, and this is now measured rather than asserted: neither game-data dump carries a `.gui` layout file; the dash bitmap is a shaped 176x108 overlay with 53 percent of its pixels transparent and no cut-out sized for the other two instrument bitmaps; and `hud_veh_speedaltwin.png` and `hud_veh_enrgbar.png` are single-colour alpha masks (shape carried entirely in the alpha channel), which pins their own sizes -- 74x57 and 77x14 -- and nothing about where they sit. Closing that needs the layout files or a measured comparison against reference screens, which is the half of this issue's acceptance a test cannot do.
Commit `04a3a04`. Gates: 1,304 unit tests, 41 browser cases, `tsc -b`, `eslint .`, `prettier --check .` all exit 0.
---
Verified against the current tree by an automated pass; reopen or correct if you disagree.
The measured comparison this issue's acceptance and your last comment named is done — recorded here rather than left implied, and **left open for your verdict** since two of the five screens have no reference to compare against.
Method: our five screens regenerate on demand at the reference 16:10 (`e2e/hud-screens.spec.ts` → `docs/hud-screens/`); each pair was described element-by-element by a vision model against the rubric in `docs/ui-audio-reference.md` (corner anchoring, teal/green/cyan palette, narrow icon cells, thin reticles, compact cluster). This is a good-faith measured pass against medium-confidence external frames — not pixel proof.
**On foot** (`01-on-foot.jpg` vs the RAWG and PlayT2 infantry frames) — matches on every rubric axis: teal translucent notification panel top-left, two status bars (green over blue) feeding a circular compass/clock top-right, two-row flag table bottom-left, narrow icon rack on the right edge, centre clear. **One concrete mismatch surfaced and is fixed on `main`** (`f21d737`): the reference tables read **Storm** and **Inferno**, ours said Team 1 / Team 2 — the names now flow through the flag table, scores line, game-over line and scoreboard headings, sourced from the frames' row order (Katabatic's mission file is not in either game-data dump, so row order is the evidence, cited in `packages/client/src/teams.ts`).
**Vehicle** (`03-vehicle.jpg` vs the WSGF 16:10 frame) — the compact instrument cluster matches: bottom-centre, speed readout over a blue bar and a green bar flanking a circular gauge, ~20% screen width and under 12% height, centred. Top-right circular display present in both. Our reticle follows the `scripts/hud.cs` table (source evidence); its colour differs from the frame's marker.
**Zoom** (`02-zoom.jpg`) — small faint reticle, HUD pinned to the edges, centre clear, no scope mask: the vanilla non-sniper zoom pattern.
**Station (`04`) and commander (`05`)** — no committed reference frame exists for either (the audit's only menu reference is the shell New-Warrior screen), so these two are recorded as *unconstrained* rather than passed.
With the comparison done, the pixel-layout question shrinks to honest approximations beside measured proportions. If the comparison reads right to you, this closes; if you want the compass/instrument offsets chased further, the reference set needs a real T2 screenshot at known resolution first.