# Optional Classic HUD

Options -> Extras -> HUD cycles Original / Classic with Left/Right, Enter or a
mouse click. Original remains the default. The choice applies immediately and
persists through the existing CRC-protected settings file. Version8 uses byte11
bit7 for HUD style and its lower seven bits for sound volume; all version1..7
files load as Original without losing other preferences. Automap and Jump remain
Off by default. Clear Data restores those defaults.

Original HUD preserves the original GBA constructor/controller coordinates and
transparent sprite padding: lives top-left, weapon icon top-right, score/clock
top-center, status bottom-left and ammo bottom-right. No margin normalization
or rearrangement applies to its240x160 OAM. Software rendering anchors those
same groups to the viewport, preserving their native distance from each edge.
The Serious Engine positioning below describes Classic only.

## Fixed crosshair (2026-10-22)

Classic uses the user's exact19x19 `crosshair.png`, padded into24x24 storage
without resizing, pixel filtering or generated shading. Its isolated center dot
at(12,12) stays exactly on the aim coordinate. The original light/dark OBJ81/206
colors and binary transparency match the PNG pixel for pixel without a target.
Original HUD retains
both original crosshair animations. Classic replaces type18 only in presentation
OAM; its original controller and weapon/target behavior remain intact.

The color thresholds follow Croteam's `PlayerWeapons.es` RenderCrosshair:
[Serious Engine source](https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/EntitiesMP/PlayerWeapons.es).
A living enemy is green at>=60% nominal species health, yellow at25..59%, red
below25%; no enemy, pickups, obstructions and corpses use white. Prion health
above the original species maximum stays green. The existing original activation
table supplies nominal maxima without a duplicate health table.

View preparation samples the existing dedicated unlimited sight trace, with no
combat callbacks or gameplay-query changes. Native vertical aim stays centered;
GBA and native autoaim use the existing unbobbing projected cursor, including the
third-person correction. Classic shows the fixed crosshair for every weapon.
A separate center-anchored layer avoids accidental corner anchoring when autoaim
moves the cursor over other HUD rows. The GBA RGB555 and Software/Vulkan RGB888
compositors share the art/palette helper. Death, automap and suppressed HUD hide it.

Focused checks cover exact25/60% boundaries, unchanged shape, palette colors,
real-world target/dead-target/obstruction queries, all aiming policies, GBA/native
composition, aspect-ratio anchoring and original-HUD restoration. These are
focused renderer checks, not a campaign playthrough.

## Serious Engine positioning

The current layout follows the [Serious Engine HUD anchors](https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/EntitiesMP/Common/HUD.cpp#L767)
with the retained GBA art at its original size. The reference's6px edge inset
rounds to2px on the240x160 HUD canvas. Armor/health follow its40:32 row spacing;
finite weapons use the175/640 horizontal anchor, infinite weapons205/640, the
selector sits near70% view height and pickup text near82%. Pixel-art dimensions
and the requested1px ammo/selector gaps are preserved, so this is an adaptation
of the positions rather than an exact rendering of the PC textures.
The latest user correction identifies the old top-center panel as HIGH SCORE.
It now stays at X88, inset2px from above, showing max(saved high score,current
run score), following [the reference high-score logic](https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/EntitiesMP/Common/HUD.cpp#L1218).
Windows level setup supplies the leading record from the loaded score table;
the timer sits immediately underneath as a separate small counter.
This supersedes the earlier request to leave the timer panel at88,0.

| Element | Current native position |
| --- | --- |
| Score | Frame2,2; digits14,4 |
| High score | Frame88,2; shaded podium89,3; digits100,4 |
| Timer | Backing104,13 (26x7); digits105,14 and120,14, colon117,15/17 |
| Unread NETRICSA | Idle215,2; attention108,28 (108,40 with boss); digits atX+10/Y+2 |
| Boss bar | Frame91,26; skull92,27; health101,29 up to47x4 |
| Analyzing | Sprite100,28;100,40 with boss; no backing |
| Armor | Icon2,121; counter frame18,120; digits21,123 |
| Health | Icon2,141; counter frame18,140; digits21,143 |
| Finite weapon | Icon66,141; counter84,141, digits87,143 |
| Finite weapon with eight ammo badges | Icon58,141; counter76,141, digits79,143 |
| Chainsaw/Colts | Icon77,141; no ammo counter |
| Ammo badges | Rightmost223,142; visible frame ends237,157 |
| Weapon selector | Centered row atY103..119 |
| Pickup text | Centered atY127..134 |

The eight-badge case shifts only the finite-weapon group left8px to leave6px
between its counter backing and the first ammo badge. This accommodates the
GBA's full-size badges; the reference instead scales its ammo row to80%.
Both renderers use the same adjusted native layout. The software renderer
anchors score/armor/health to the left edge and inbox/ammo to the right edge of
the actual viewport. Their vertical edge insets also hold in4:3 windows. It
keeps sprites uniformly scaled, centers the boss bar/selector/notices, and puts
the weapon group at its screen-width anchor, applying clearance only if needed.
This avoids an inset3:2 HUD box on wide screens. High score and timer now both
follow the top edge. Inbox movement interpolates between the right-edge anchor
and the upper-center analysis anchor; it never leaves a second panel behind.
Boss/analysis rows leave clearance for the high-score/timer stack.
The selector clears the armor row even with all ten weapons. Sprites, shading,
flash durations, equipment and gameplay are unchanged.
`src/pc_renderer.c` classifies the disjoint atlas regions in `classic_region`;
future layout changes must update those region boundaries together with the
native positions. No extra frame allocations or world resampling are needed.

Classic uses retained ROM sprites and the OBJ palette: green panels63..65,
status icons80..88, meters89..98, weapon icons67..75, and digit sets110..129. It displays health,
armor and selected-weapon ammunition below, score inside the top-left frame,
with the entire armor icon/frame/counter hidden when armor is zero,
and high score/time/unread NETRICSA dossiers above. Eight finite ammunition slots run along
the bottom right, with no counters or bars above them. Each icon overlays a
retained three-pixel-wide vertical meter on its right side, inside its frame.
The ammo icon and its frame hide when its
count is zero and reappear when ammo is acquired. Visible icons pack against
the right edge, in weapon order, with one clear pixel between their frames.
Boss encounters add a green health bar below
the central header. Infinite-ammo weapons (chainsaw and single/dual Colts) hide
the selected ammo counter and its frame; the weapon icon remains visible.
Counters suppress padding zeros and remain right-aligned; meaningful zeros
(100 health, for example) remain, and clock seconds retain two digits.
Spending finite ammo flashes that pool's meter and the selected ammo digits
with a green-to-neutral palette swap for40 simulation ticks (about0.67s), then
green again. Matching brightness levels preserve the original numeral shading,
black and transparency; the glyphs are never flattened to one white color.
Meters use the same green artwork and palette swap, keeping identical shapes
throughout the flash. Repeat use refreshes the
flash, pickups do not trigger it, and pause freezes it. Comparing inventory
after pickups and before/after weapon controllers handles same-frame pickups.
Draw calls never age or reset the feedback. Original HUD behavior is unchanged.
New weapon/enemy dossiers show retained green analyzing sprite79 for120
simulation ticks (2s), without a backing rectangle. It keeps its ROM pixels and
spelling near20% view height. The inbox then travels from215,2 to108,28 over30
ticks, holds120 ticks, and returns over30 ticks. With a boss, text and inbox
attention move down12px to clear the boss bar. The full timeline lasts300 ticks
(5s). Green65/white66 artwork and shaded digits blink every15 ticks during it.
The reference uses the same2s analysis and .5s/2s/.5s inbox movement timing;
the existing requested green/white blink and retained GBA art remain native
adaptations. A genuinely new unread type refreshes the timer; repeated kills, repeated
acquisitions, rendering and old carried dossiers do not. Reading every entry
clears it. Pause freezes the timer; automap, death, completion and clean overlay
captures omit the effect. The inbox retains its translucent backing; analysis has none.
No unread entries means no inbox panel. Both counter digits fit inside the
retained frame; the corner panel is absent while the inbox is moved inward.
Positions follow the [reference HUD's upper-right inbox](https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/EntitiesMP/Common/HUD.cpp#L1228)
and [upper-center analysis text](https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/EntitiesMP/Player.es#L2393).
The requested green/white blink is native presentation policy, not a claim that
the PC reference or the original GBA retail HUD uses this exact color animation.
The selected weapon's ammo icon stays white inside its square frame through
the same shade-preserving palette swap. Only its13x13 interior is recolored;
frame and spacing remain green/transparent. The highlight follows the requested
weapon immediately, including during a pending switch. The meter is composited afterward
and retains its separate consumption flash.
Taking damage flashes only the health digits through the same shaded neutral
palette for40 ticks (~0.67s). Repeat damage refreshes it, healing does not, and
pause freezes it. Health is sampled at frame/entity boundaries; once observed,
damage feedback survives a later pickup restoring health.

Changing weapons opens a horizontal selector centered at the bottom half of
the view (native Y103), above the permanent status row. Available weapons follow
weapon order, with one single-Colt icon shared by both single/dual variants,
as requested in the First Encounter style. Retained weapon icons keep their
shaded green palette; the requested
weapon, including its complete frame, swaps to matching neutral shades. The
Colt entry highlights for either equipped variant.
Weapon and ammo highlights update as soon as selection changes, before the
store/draw animation completes or the new weapon can fire. Rapid selection
changes immediately move the highlight again; gameplay switching/firing timing
is unchanged. The read-only Classic projection uses the requested weapon rather
than the currently committed controller weapon for this presentation.
Items have16px footprints and17px spacing, leaving a1px gap.
The supplied Time Strike artwork retains its exact pixels. Individual backings
use the same transparency as the rest of Classic, with clear gaps between items.
Selection and completed changes refresh a180-tick (3s) timer. Pause freezes it;
rendering does not advance it. Fire clicks, including very short or buffered
clicks and infinite-ammo weapons, dismiss it immediately. A pending handoff
cannot reopen a selector dismissed by firing. Original HUD, automap and clean
NETRICSA/completion captures omit the selector.

The old type5 health-digit controller
selects the health animations; the remaining missing data bindings are native
presentation code using canonical current game state.
The top-right number counts unread NETRICSA weapon and enemy dossiers (up to22),
as corrected by the user. Each weapon/enemy type contributes at most one entry.
Weapon ownership unlocks a dossier. Starting equipment on every level is
familiar and creates no new unread entries or alerts, including password/level
selection and alternate loadouts. The first simulation tick commits this
baseline before pickups; weapons discovered during play still notify. Existing
unread dossiers carry through level changes without being acknowledged. The
earlier first-level Schofield familiarity also remains. All owned dossiers stay
browsable; read status survives levels/retries.
Enemies unlock only after a kill, never merely from spawning or attacking.
A fully visible dossier is marked read
only after its frame is presented. Opening a briefing/statistics page or fading
does not mark unseen dossiers read. Discovery/read masks carry across levels
and retries, and reset for a fresh run; no save-file format changes are needed.
Original HUD's life counter continues to show remaining lives independently.

Classic notice text uses the original static8px menu font, decoded once from
ROM0B7A60 with original character mapping/metrics and shaded white palette tones.
Pickup text (original IDs8C..AB) is centered at native Y127, below the selector's
Y103..119 row and above the bottom status row. It stays there when the selector
is hidden. Boss/death notices retain their original vertical placement. All
notices keep the original localized strings and shared timer. The old animated type13 glyphs and type14
backdrop are omitted only from Classic's OAM snapshot; controllers, animation
and cache state still run normally, preserving immediate Original restoration.
Classic composes the static text and its translucent backing into both renderer
layers without changing the source sprites or their palette.

Classic panels and icons now have black backings with45% transparency (55% black
opacity). A separate coverage mask follows visible score/time/unread panels,
health, positive armor, weapon, finite selected-ammo counter, nonempty ammo icons
and boss panel. Ammo backings cover15 pixels of each16-pixel slot, keeping the
one-pixel gaps transparent. Hidden elements produce no backing. The indexed foreground stays
fully opaque, with its original palette, pixel layout and shading. Backings blend
once above the world/weapon layer and below the HUD art: RGB555 in GBA mode and
RGB888 at the actual software-renderer resolution, retaining45% of each source
channel with rounding. Automap, clean captures and Original HUD suppress this
mask along with Classic. Pause and NETRICSA use their existing capture/fade flows.

The initial layout followed visible panels/icons in the user's
[May16,2002 prototype footage reference](https://www.youtube.com/watch?v=VUotqe5A75k).
YouTube's public135x90 storyboard frames were inspected, including gameplay
previews. They establish the broad panel arrangement, but do not establish exact
pixel positions or all counters' meanings. The time binding, boss display and
the new ammo-indicator layout are explicit
reconstructions. This is a usable optional presentation, not proof of recovery of
the missing old constructor or the unidentified original GAME+34C field. See
[legacy-hud.md](legacy-hud.md) for the separate original-code audit.

The score stays inside the first frame, without its former health fill.
The selected weapon/ammo panel makes room for up to eight original-size16pixel
ammo icons at Y142. Visible15px frames end at X237; with all eight present the
first starts at X111. The old
meter sprites89..98 sit at icon X+10, bottom-aligned at Y+12, three pixels wide
with up to11 filled pixels (one pixel up/left from the preceding layout). A black
backing keeps the meter readable over the icon, entirely inside the frame.
The green set has no four-pixel image, so that level composes its retained
three-pixel and one-pixel images. The white99..109 sprite set is not used for
feedback. Ratios use the original per-weapon
capacity records at0844BC8C, not invented shared ammunition pools. Tommygun and
minigun therefore have separate indicators even though their old bullet artwork
is shared. The retail HUD handlers F1C0/F27C select animations42..4B/DF..E8 from
the requested weapon at player+78;40 whole original-routine calls verify those
bindings and automap visibility. The green art is associated by visual identity:

| Weapon | Green weapon image | Ammo image | Original capacity |
| --- | --- | --- | --- |
| Chainsaw | 68 | Infinite | 999 |
| Colt | 67 | Infinite | 999 |
| Shotgun | 69 | 84 | 100 |
| Tommygun | 70 | 83 | 300 |
| Minigun | 71 | 83 | 300 |
| Rocket launcher | 72 | 85 | 25 |
| Prion Gun | 74 | New green biohazard | 10 |
| UMT | 73 | 86 (radioactive) | 3 |
| Time Strike | Supplied framed PNG, recolored green | New green clock | 10 |
| Cannon | 75 | 88 | 10 |

There is no retained green Time Strike weapon icon. The replacement now uses the
actual user file, copied unchanged from `C:\Users\brian\Desktop\download.png` to
`assets/classic-hud/time-strike-reference.png`. It is16x24, with its framed device
in the top17 rows and transparent padding below. The icon blits at X66/Y141
(X58 when all eight ammo badges are present)
without resizing, cropping or fitting: its frame and all opaque/transparent pixels
keep their supplied positions. `scripts/import-classic-time-strike.ps1` embeds its
RGB555 pixels in `src/classic_time_strike.inc`. Runtime changes colors only:
maximum RGB brightness maps to the original green OBJ ramp, opaque black stays
opaque, and saturated-green frame pixels match the HUD's bright green. The
original palette and user PNG remain unchanged. The former reduced world-sprite
lookup is removed; it did not match the supplied artwork.

The latest user-directed ammo symbols assign the original radioactive image86
to UMT. Prion Gun now has a biohazard and Time Strike an analog clock with hands
pointing up/right. The corrected variants copy the actual shaded circle image88,
including its frame, round silhouette and original highlight pattern. The circular
interior expands from11x11 to13x13 with centered sampling, enlarging the green face
to11x11 to match UMT. The16x16 icon frame stays fixed, and the symbols remain
centered. Dark inset symbols sit on the face, lifted halfway toward maximum green through the
existing OBJ ramp for contrast; the template and palette stay unchanged.
The biohazard uses a9x9 coverage mask of the standard three crescents and center
hole, with contrast hinting to retain the fine tips and openings. Its public-domain
vector reference and sampling details are kept in [assets/classic-hud](../assets/classic-hud/README.md).
The clock uses hands and four hour marks on the circular face. Both keep the
same16x16 slot and frame alignment; neither uses the former empty frame87 layout.
These symbols are new UI artwork, not recovered ROM images. No ROM assets are
modified. Original source does not establish the missing old full-layout
constructor or gauge behavior; the indicator presentation follows the user's
request while counts, limits and retail fallback bindings use original data.

`classic_hud.c` draws a transparent240x160 indexed foreground plus an optional
backing mask. Both the GBA renderer and software renderer composite it through the
original palette and existing HUD scaling. Classic hides retail statistics in a
private OAM snapshot, retaining weapons, crosshair and transient
sprites. Original controllers, pool objects and cache continue normally; toggling
does not reset weapons, inventory or simulation. Dual-Colt presentation still uses
the existing mirrored weapon path. Automap hides Classic. NETRICSA captures remove
it with the other HUD while preserving the weapon, and completion captures remove
the entire HUD/weapon. Pause keeps and darkens the frozen HUD.

Validation commands:

```powershell
wsl -d Ubuntu --exec /mnt/c/SeriousEngine/Coding/ss-advance-decomp/.venv-linux/bin/python /mnt/c/SeriousEngine/Coding/ss-advance-decomp/tests/test_classic_hud.py
.\scripts\test-classic-hud.ps1 -SkipBuild
.\scripts\test-audio-settings.ps1 -SkipBuild
.\scripts\test-intermission.ps1 -SkipBuild
.\scripts\test-native-startup.ps1 -SkipBuild
```

Pre-level switching fix (2026-10-19): the reported session log
`build/logs/launch-21297-16128-9372/stderr.log` was empty. The exit was reproduced
with Enhanced weapons On, as in the saved settings. The menu's native HUD setter
tried to build OAM while the starting Colt still had unresolved previous_frameFFFF;
the alternate weapon builder rejected that image, and settings_change marked the
app failed without a diagnostic. Before the first simulation frame, the setter
now records the style and leaves OAM untouched. The ordinary first-frame sprite/
animation/cache stages construct it. No dummy ticks, item grants or cache resets
are added. A failed later rebuild restores the previous style; the frontend now
logs a HUD-application failure rather than exiting silently.

The focused GCC sanitizer test and matching MSVC test pass121,632 checks over368
draws, including Egypt/Rome, both renderers, all ten weapon projections, live
counters, boss health, automap/suppression, dual Colts and exact same-frame
Original restoration. Additional checks isolate score changes to the top-left
frame. Original-mode captures also verify the live life digit (Normal3) in both
renderers, after fixing the missing native game_value projection. Separate
native death/retry checks cover5/3/2 starts, reduced counts and final0. Other
checks verify all nine retained green weapon images, isolate each ammo pool's
changes to its own slot and verify empty/full/low meters inside the frame.
An actual Tommygun shot checks shaded neutral digits and the same three-pixel
meter geometry, read-only redraws, paused feedback, all39 intervening ticks and
the40th-tick return to green, with both renderer captures.
Backing checks verify the45% source-color retention in both real compositors,
opaque foreground colors, hidden armor and disabled backing in suppressed and
automap views. Original same-frame restoration still passes.
Weapon-selector checks cover the centered ten-entry row, shaded white frames,
the shared Colt icon before/after a dual toggle, read-only draws, pause, the
180th-tick timeout, mouse-wheel/Q handoffs, and both an infinite-ammo shot and
a short buffered click during a pending finite-weapon switch. Fire dismissal
survives the later handoff. Both renderer captures were visually checked.
Immediate-selection checks queue Tommygun, Rocket Launcher and Tommygun again
while the committed weapon is still dual Colts, without advancing simulation.
Each read-only draw highlights the latest requested weapon/frame and matching
ammo interior; other ammo art and frames preserve their source indices. The
pending-switch captures show white Tommygun selection while Colt models remain
drawn in both renderers.
Damage checks apply actual native combat damage and verify shaded white health
digits, read-only draws, pause,40-tick expiry and no healing flash. Notice checks
exercise all three localized pickup strings through the static white font below
the visible selector and original timer; Classic omits type13/14 OAM art.
They also check white Game Over text at its original central Y64.
Software/reference text captures and the
right-aligned single-ammo capture were inspected. Sparse ammo fixtures verify
the rightmost frame ends at X237, with empty pools omitted.
Notification checks compare all640 sprite pixels directly against the decoded
ROM image and verify its backing is empty. Captures cover analysis and the
centered inbox in both renderers and widescreen. Checks verify120-tick analysis,
30-tick travel,120-tick hold,30-tick return, blink, pause, no duplicate refresh
and read cancellation. High-score checks isolate record changes, verify
max(record,current score), isolate timer updates, and bind a real frontend score
table. The suite also verifies screen-edge/weapon anchors in854x480 and640x480,
with separate high-score/timer, boss and analysis rows. Whole-layout
captures include all ten selector entries, armor, score, boss and eight ammo
badges in both chapters. See the current check/draw counts in
classic-hud-validation.json and windows-classic-hud-validation.json.
The current focused sanitizer/MSVC result is124,829 checks/383 draws, with286
Windows presentation checks and768 direct supplied-PNG comparisons. Native,
software, widescreen and4:3 whole-layout captures were visually inspected.
Starter checks verify all36 campaign level/difficulty loadouts are silent before
and after their first tick, plus alternate starts on all12 maps. They retain
normal later weapon/kill alerts and carried unread messages. Windows reading
presents a genuinely new shotgun
dossier and retains its read mask after retry.
Journal checks reject spawn-only discoveries, perform actual combat kills,
acquire another weapon, verify one entry per type, check that unread changes
affect only the Classic top-right panel, and preserve read masks through a
campaign carry. Windows276 checks include presenting the selected weapon
dossier to clear its unread flag and retaining that read flag through retry
reload, in both renderers. Original HUD continues to display actual lives.
The Time Strike case checks the supplied full-width frame, shadow, original
transparent hole, larger device detail and multiple green shades. The Windows
script additionally compares every visible icon pixel directly against the user
PNG after palette conversion, and verifies that the clipped padding is transparent.
A cold-start regression also verifies repeated changes
with the starting alternate Colt, unchanged inventory/OAM/counter and successful
first-frame rendering. Windows frontend checks cover keyboard and mouse changes
before gameplay with Enhanced weapons Off/On in both renderers, disk round
trips, and pause, NETRICSA and clean
completion captures in both renderers. Settings/localization/audio regression
checks pass38,922 native assertions and23,381 Windows assertions, including saved
style changes and version7 migration. Existing intermission tests pass143,825
native checks and all12 Windows pause/six completion routes.

Reports: `classic-hud-validation.json`, `windows-classic-hud-validation.json`,
`audio-settings-validation.json`, `windows-audio-settings-validation.json`,
`intermission-validation.json`, `windows-intermission-validation.json` and
`windows-native-startup-validation.json`. Captures under `build/classic-hud-tests`
and the three localized Extras captures were visually inspected. The static
Windows executable and125 libraries are rebuilt. These are focused checks;
physical input and a full campaign playthrough were not performed. The original
ROM is unchanged, and this presentation work adds no exact matching claims.

HUD refinements (2026-10-19): Classic timer backing is now26x7 pixels at105,14
(previously29x10). Analyzing keeps sprite79 and its green shading but pulses
opacity using TFE Player.es2393..2398's sin(seconds*10)*127+128 formula. The
notification's simulation clock supplies phase, so pause freezes it. RGB555 and
software RGB888 blend over the current scene, without a black text rectangle.
Inbox travel, its separate green/white blink and starter/unread rules remain.
Reference: https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/EntitiesMP/Player.es#L2393

Classic now shows retained Use sprite77 at112,92 while an unlatched button is in
the original64-unit interaction sweep. Its olive source ramp now shares the
Analyzing palette mapping, matching the HUD's bright green while preserving shaded pixels,
black and transparency. A separately owned use_query refreshes a
presentation cache after simulation; it does not activate buttons, share scratch
with gameplay/world/camera or change the world's blocking entity. Activation
removes the prompt on that tick; death, completion and automap omit it. The
Tommygun badge uses a new shaded box magazine inside the original15px frame,
with the original OBJ palette. Minigun retains83. Ammo meters, flashing and
selection palette swaps apply to both independently. This is new native UI art,
not recovered ROM artwork.

Original HUD now groups score upper-left, lives upper-right, status bars
lower-left and selected weapon/ammo lower-right, keeping clock centered above.
Private sprite copies relocate the layout; original controllers, live object
coordinates, art and animations are retained. Status Y coordinates stay native
so the original scanline health/armor/boss palette changes remain correct.
Six cached OAM snapshots separate corners, top-center clock and central weapon/
reticle/notices. PC output anchors only their appropriate axes to the viewport;
weapon models and reticle remain centered. Native240x160 uses the same corner
layout. Pause/NETRICSA captures save/restore these snapshots with the full OAM,
including failure paths; completion keeps its clean scene.

Validation: GCC ASan/UBSan/leaks=1 and matching MSVC pass133,104 checks/395 draws
across both renderers. This includes a real map button before/after actual
activation, all source Use pixels, genuine RGB555/RGB888 opacity blending,
and every visible Original corner/clock pixel at854x480 and640x480. Captures
for both chapters, Use, ammo, analysis and both aspect ratios were inspected.
Windows Classic menu/overlay checks pass286 assertions plus768 supplied Time
Strike PNG comparisons. Additional hidden-window intermission regression:
6,205 checks,12 pause paths,6 completion routes and6 Main-menu quits, two
renderers/three languages (build/intermission-tests/hud-regression.json).
125 static Windows libraries and frontend rebuilt; executable SHA256:
b07c3e0e16b122ad01680491511fda73516ea30ce3294bcdf1381d8b2e4ac53a.
ROM SHA1 remains4ff48d8c18b70a5184758f1917343ae85a70858e.
No campaign playthrough, physical input validation or new exact-match claim.
Launcher verification also passes on this executable: normal software/GBA startup,
raw-input registration, repaint/restart, map transitions, error logging and two
concurrent launches. See windows-native-startup-validation.json. No full replay.

Classic resource alert colors (2026-10-19): checked Croteam's Common/HUD.cpp
GetCurrentColor and DrawHUD health/armor/ammo sections, especially778..845 and
898..914. Apply the requested red/gray alerts while retaining Classic green for
other resource amounts: health below25 is red; positive armor below25 is light
gray; selected ammo count below15% of its own capacity is red; each small ammo
meter below25% of its own capacity is red. All comparisons are strict, as in
GetCurrentColor: exactly25 health/armor,15% count and25% meter are not low.
No difficulty-dependent health/armor normalization is added (the reference
explicitly uses100). Keep the existing independent GBA ammo capacities; one UMT
round out of its three-round capacity is above both alert thresholds.
References:
https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/EntitiesMP/Common/HUD.cpp#L778
https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/EntitiesMP/Common/HUD.cpp#L898
https://github.com/Croteam-official/Serious-Engine/blob/master/Sources/Engine/Graphics/Color.h#L21

Recolor the original green shading ramp through existing OBJ palette indices,
not flat silhouettes or changed assets. Red uses the nearest retained red shades;
armor gray scales the ramp by23/31 (TFE light gray0xBF), so it remains distinct
from the white flash. Black/shadows, transparency, glyph geometry, badge/frame
colors, selected icon highlights and zero/empty hiding policies are preserved.
The user's existing40-tick white health/ammo consumption cues override alert
colors; on expiry the current resource value determines the resulting color.
Original HUD and gameplay rules are unaffected.

Final focused GCC sanitizer and matching MSVC result:170,256 checks/403 draws,
two renderers. Tests cover health/armor0,1,24,25,50,100,200; all eight real ammo
capacities at zero and immediately below/at/above15% and25%, full and overfull;
white priority over low values, omitted empty badges, read-only draws, and actual
RGB555/RGB888 palette output. Existing actual-damage/shot tests retain pause and
40-tick expiry, now returning low ammo to red instead of green. Egypt/Rome low
resource and separated counter/meter threshold captures were visually inspected.
The static Windows frontend and125 libraries are rebuilt. Executable SHA256:
a8c889df55809079a0f68492ea3028c6ccbd21459282bf6330e7a68ca619ae7a.
ROM SHA1 remains4ff48d8c18b70a5184758f1917343ae85a70858e. No campaign replay,
new exact matching or fresh full launcher suite was needed for this palette edit.

Timer backing offset (2026-10-19): move only the Classic clock's26x7 backing
from105,14 to105,13. Minute/second digits remain105,14 and120,14; colon remains
117,15/17. Shared native/software layers apply the same one-GBA-pixel offset.

Tommygun drum icon (2026-10-19): replace the box-magazine pattern with a
front-facing round drum, short feed neck, concentric rim and central winding
hub. Reference is the actual Tommygun ammo pickup animation0x3A: frame word25,
resource58/image26 (exported frame-026.png), not resource58/image1's shared Colt
art. Keep the established9x11 art area inside the15px green badge, original OBJ
shades, right-side meter, selected white palette swap and low/flash meter colors.
Minigun artwork remains unchanged. New HUD pixels are native UI art; the original
ROM/pickup sprite is not modified. Compare build/classic-tommy-drum-preview.png.
Rebuilt125static Windows libraries/frontend. Existing MSVC HUD checks pass171315
checks/403draws/two renderer paths; atlas and in-game captures inspected at native
and enlarged size. See classic-tommy-drum-validation.json for current source and
binary hashes. Full sanitizer/launcher suites were not repeated for this icon edit.

Original HUD GBA-layout restoration (2026-10-19): supersedes the earlier Original
corner rearrangement described above. Remove original_corner_offsets entirely
and remove the weapon icon's104px downward shift. Original HUD uses its unmodified
recovered constructor/controller coordinates, full transparent sprite padding,
original variable-width score centering, scanline palette boundaries and OAM
composition. There is no forced2px margin. GBA/reference rendering uses the full
raw OAM, preserving its native240x160 layout pixel for pixel.

Retain six isolated OAM snapshots for software anchoring only:0 central weapon/
reticle/notices;1 top-center score+clock;2 top-left lives;3 bottom-left status;
4 top-right weapon icon;5 bottom-right ammo. Each snapshot also retains native
coordinates. PC renderer changes only the relevant viewport origin: left-edge
zeroX, right-edge2*letterboxX, centered letterboxX, top zeroY, bottom2*letterboxY.
This preserves each group's original GBA padding instead of measuring/cropping
its bounds. Native full-OAM and private pause/NETRICSA capture ownership are intact.

New independent Original layout checks bypass the HUD adapter and feed untouched
live sprite coordinates directly into recovered FCE4/ssa_sprite_oam_build, then
the native display. All raw OAM entries and153,600 RGB555 pixels across four
Egypt/Rome equipment fixtures match. Cases include default chainsaw and finite
Tommygun ammo, armor75, health150, an eight-digit score and real remaining lives.
Widescreen854x480 and portrait640x480 checks compare visible source art at the
correct anchors. Native/default/equipped/widescreen captures were inspected.
GCC ASan/UBSan/leaks=1 and MSVC333,649 checks/405 counted draws/two paths pass;
Windows560 overlay/menu/reopen checks plus768 user-PNG checks pass. Additional
original-HUD intermission regression passes6,205 checks/12pause/6completion/
6menu-quit paths in both renderers (build/intermission-tests/original-hud-regression.json).
Static frontend/125libraries rebuilt; SHA256:
4647317503861ea2e4a9f6539a24ed1d6274a6b6e587d0b1e25c47470202e7b7.
Current source/binary evidence: classic-hud-validation.json and
windows-classic-hud-validation.json. Original ROM unchanged. No full campaign
replay, new exact matching claim or full launcher rerun was made for this fix.

Latest analysing text correction (2026-10-19): supersedes the earlier sinusoidal
opacity behavior. Analysing is fully visible/invisible in alternating15-tick
phases (0.25s per phase), starting visible. It retains the2s analysis interval,
upper-center/boss-adjusted position, no backing, pause behavior and inbox timing.
Sprite79 is recolored to the existing HUD's green ramp: its brightest shade
matches the HUD's bright green, with lighter/darker lettering shades preserved.
For the current ROM this maps green24/19 to green29/24; black/transparency and
all sprite pixels stay intact. RGB555 and RGB888 compositors share the same
binary alpha and palette mapping. The two Classic-only audio cues are unchanged.
Validation for the latest blink/palette change: native ASan/UBSan/leaks=1 and
MSVC each pass337601 checks/409 counted draws/two renderer paths. Checks cover
all120 analysis ticks including boss placement, exact recolored sprite pixels,
full-strength on pixels and unchanged scene pixels when off in both outputs.
The prior double-cue/audio, unread and Original layout checks still pass.
Windows frontend560 checks and768 supplied Time Strike pixels pass. On/off PC
captures were visually inspected. Static125libraries/frontend rebuilt; SHA256:
42c166bfdd988592784727387d544dbaec04c9b36a4bdf9a78102d1a6e6a1e11
Current reports: classic-hud-validation.json/windows-classic-hud-validation.json.
Original ROM unchanged; no full campaign replay or physical-input test.

Latest Tommygun ammo artwork (2026-10-19): supersedes the drum design. Use two
upright cartridges in the same9x11 interior, each3px wide and11px long, with
pointed tips, neck bands, shaded cases and base rims. This is fewer, longer and
thicker rounds than Minigun's five short horizontal bullets. Retain image83's
15px frame, right ammo meter, original green ramp, selection/flash white swap
and alert colors. Minigun/world pickup/ROM artwork unchanged. Existing MSVC HUD
checks357231/409draws/two paths pass. Side-by-side enlarged native-pixel preview
inspected: build/classic-tommy-bullets-preview.png. Static125libraries/frontend
rebuilt; SHA256 63b406c7bec3424271e6086b61987b55da767632d9ab386d305cff8b2b7f4c49.
See classic-tommy-bullets-validation.json. No new tests or broad sanitizer/
launcher/campaign rerun was added for this small code-native sprite adjustment.

User-edited Tommygun icon (2026-10-19): the final selected image is the existing
assets/classic-hud/tommygun-ammo.png, explicitly provided by local path after
superseding the first attachment. Its SHA256 is
e5ae9c9e20c6667cbe9f701ff4cce41295749ffe30af15c87775c2692364f071.
The16x16 PNG replaces the prior two-cartridge procedural pattern. A dedicated
importer writes exact original-palette indices and transparent0 to
classic_tommy_ammo.inc; no resizing, cropping, color replacement or approximated
pixels. It rejects dimensions, alpha or colors outside the expected format.
The unchanged PNG remains the editable source. Runtime blits it directly and
then draws the separate ammo meter; existing selected/flash/low-ammo behavior
remains. Minigun and world pickup sprites remain original.
Validation: existing MSVC390399 HUD checks/409 draws/two paths pass. A direct
comparison against the supplied PNG matches446 pixels across Egypt/Rome,
excluding only the dynamic3x11 meter. Side-by-side rendered preview inspected.
The source PNG SHA256 stayse5ae9c9e20c6667cbe9f701ff4cce41295749ffe30af15c87775c2692364f071.
Static125libraries/frontend rebuilt; executable SHA256:
bbad6918a6e4414c67b20be73c7dcc3ea2135a9e493fdba6115d242ac5fc7655
See classic-tommy-import-validation.json. No new tests or full sanitizer/
launcher/campaign rerun were added for this exact sprite replacement.

Classic pause/completion typography (2026-10-19): `intermission.c` now uses the
main-menu ROM font/palettes for pause and its quit confirmation, end-level
labels, score/bonus values and localized Sam greetings. Inactive choices,
labels and greetings are green; the pause heading, selected choices and numeric
values are white. Existing row positions, frozen backdrop and black glyph
outlines remain. Original HUD's animated glyph sprites and all tally/input/
audio/readable-hold timing are unchanged.

Validation: GCC ASan/UBSan/leaks and MSVC agree on145940 intermission checks,
36 original completion starts/69917 tally frames, plus Classic pause and
first/final-level completion fixtures in all three languages. Actual Windows
routes pass12pause/6completion/6Main-menu Quit paths in both renderers; the
Classic hidden-window frontend passes560checks/two renderer paths. Pause,
bonus and localized final greeting captures were visually checked. Static125
libraries/frontend build passes; executable SHA256:
a7c0f66357c9111e0c66bdebdc531919aecd1f95bbeb6a1276d44c218bc0ea6a
See intermission-validation.json and windows-intermission-validation.json.
These are focused presentation checks, not a campaign playthrough or physical
input/listening validation.

Instant inbox movement and green pause heading (2026-10-19): GAME PAUSED and
its translations now use green in Classic mode; selected choices remain white.
The inbox teleports inward immediately after2s analysis, holds2s, and returns
instantly to the top-right corner. The existing5s notification lifetime and
blink remain; the final second is spent at the corner. Shared attention is
only0/30, so native-resolution PC anchors snap as well as GBA positions. The
green-sprite palette swap and half-duration audio gap remain unchanged.
Existing MSVC checks pass382206 HUD/409draws and145940 intermission assertions;
hidden-window checks pass560 Classic and6205 pause/completion assertions over
both renderers and all three languages.125libraries/frontend rebuilt. Pause
and inbox previews inspected; no broad sanitizer/campaign rerun. See
classic-hud-snap-validation.json.

Transparent empty ammo meters (2026-10-19): meters no longer erase their full
3x11 area to black before drawing. Only the filled original meter art overlays
the ammo icon, preserving its pixels where the bar is not full. Selected icon
palettes, red low-ammo fill, white consumption flash, frames and HUD backings
remain. Existing meter checks now compare exposed space with the bare icon and
inspect alert/flash colors only within the filled part. MSVC382094checks/
409draws and Windows560checks/two renderers pass;125libraries/frontend rebuilt.
Low-ammo preview inspected. See classic-ammo-transparency-validation.json.
No broad sanitizer or campaign rerun for this small presentation change.

Panel icons (2026-10-19): the high-score/leaderboard panel now has a7x7 podium
inside its left square, and the boss panel a7x7 skull. Both are code-native
pixel glyphs shaded with the retained HUD green ramp (29/19/9 brightness), lit
from above/left. The podium's center step is tallest, then left, then right.
Existing frame/divider pixels
and transparent gaps intact. Boss fill now starts at101,29 and spans at most
47x4, wholly inside the right rectangle with padding; it never crosses the
divider or skull. Existing full-health checks verify the skull eye remains
open and the fill stays within its rectangle. MSVC382452checks/409draws and
Windows1666checks/two renderers pass;125libraries/frontend rebuilt. GBA and
4:3 PC previews inspected. See classic-bar-icons-validation.json. No broad
sanitizer/campaign replay for this small HUD change.

Use prompt green (2026-10-19): sprite77's olive source colors RGB555(12,21,3)
and(11,17,2) now map to the HUD's retained green ramp, peaking at(0,29,0).
The shared lettering helper preserves the original shading, black pixels,
transparency and112,92 position; Analyzing retains its green-only mapping.
The existing real-button capture checks the prompt's silhouette and green hue.
Both GBA and software previews were inspected. Windows HUD integration passes
1666 checks/two renderers and the rebuilt frontend passes30 startup frames.
No campaign replay or gameplay changes.

The supplied artwork contains49 light and24 dark pixels. Health colors preserve
its two-tone detail using the original18/28 intensity ratio and nearest existing
palette colors; no-target uses the PNG's exact original palette colors.
