From 3430f87305a39f1d9454fa47779468929b66254e Mon Sep 17 00:00:00 2001 From: arcattack Date: Thu, 9 Jul 2026 08:49:54 -0500 Subject: [PATCH] HUD colors corrected vs the binary ctor (validated by a period screenshot) A period pod screenshot from players who know the game flagged the overlay. Stroke-by-stroke re-read of the ctor (@4546-4587) against it: - The range caret triangle is GREEN width 1 (ctor @4550-4551 sets SetLineWidth(1)+SetColor(0,0.75,0) AFTER the yellow bar's CallList) -- my transcription left it yellow/2. Same for the bottom bowtie carets (@4569-4570). Both fixed; the caret polylines also get the binary's explicit 4th closing point (@4558). - The screenshot otherwise CONFIRMS our layout (yellow range bar, green caret, colored pip dots, tick tape + green bowtie, rotating compass, mid-ladder range with no lock = the world-pick terrain range). - Its crosshair is ~2.5x taller with arrowhead arms -- NOT our binary's +-0.04..0.16 program: a different pod revision. Ours stays [T1] to BTL4OPT.EXE 4.10. Co-Authored-By: Claude Fable 5 --- context/gauges-hud.md | 13 ++++++++++--- game/reconstructed/btl4vid.cpp | 22 ++++++++++++++++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/context/gauges-hud.md b/context/gauges-hud.md index 137549b..dc6419e 100644 --- a/context/gauges-hud.md +++ b/context/gauges-hud.md @@ -98,9 +98,16 @@ range caret binds to the live target range (`BTSetHudTargetRange`, fed by mech4' **The per-frame `Execute` @004cdcf0 is RECOVERED (task #37, capstone disasm via `tools/disas2.py` — the full annotated read: the task-37 commit + btl4vid.cpp comments) [T1], and every instrument is now live [T2]:** -- **Right ladder** = range 0–1200 m: a BAR from ladder-top to the caret + the yellow caret - translate (`-scaleY·frac`); pegs at 1200 with no target; the DISPLAYED range slides at - **500 m/s** toward the true pick range (HudSimulation :5652 [T1]). **The weapon pips sit on +- **Right ladder** = range 0–1200 m: a YELLOW width-2 BAR from ladder-top to the caret + a + **GREEN width-1 caret triangle** (ctor @4550-4551 sets green/1 AFTER the yellow bar call — + transcription color bug caught by a period reference screenshot, 2026-07-09; same for the + bottom bowtie carets @4569-4570); pegs at 1200 with no target; the DISPLAYED range slides at + **500 m/s** toward the true pick range (HudSimulation :5652 [T1]). ⚠ A period pod screenshot + (`C:\git\image.webp`, likely a DIFFERENT pod revision — its crosshair is ~2.5× taller with + arrowhead arms, NOT our binary's ±0.04..0.16 program) structurally CONFIRMS our layout: yellow + bar + green caret + colored pip dots on the right ladder, bottom tape + green bowtie, rotating + compass circle bottom-left, and a mid-ladder range reading with no lock (the world-pick + terrain range). Our glyph constants remain [T1] from OUR 4.10 binary. **The weapon pips sit on this same ladder at each weapon's authored max-range mark** — caret below a pip = that weapon reaches the target. BLH authored data (live dump): 3× ER-M laser red @**500 m** (two stacked at one column; PipExtendedRange=1), 2× missile amber (0.6,0.4,0) @**800 m**, 2× PPC blue diff --git a/game/reconstructed/btl4vid.cpp b/game/reconstructed/btl4vid.cpp index 6413431..841cdf8 100644 --- a/game/reconstructed/btl4vid.cpp +++ b/game/reconstructed/btl4vid.cpp @@ -1127,16 +1127,22 @@ BTReticleRenderable::BTReticleRenderable(Entity *entity, Scalar *range_attr) // the RIGHT range ladder (13 ticks up the right side, dir 3 = -y travel) BTReticleTickLadder(m, kRetTicksR, 1, kRetScaleY, kRetOriginX, kRetOriginY, 3, kRetTickMinor, kRetTickMajor); - // the range CARET (yellow triangle; its called list holds the live - // translate the Draw rebuilds each frame from the target range) + // the range group (ctor @4546-4560 [T1], color-corrected vs the reference + // screenshot which CONFIRMS the binary): the YELLOW width-2 state applies + // to the CALLED live list (the range BAR + caret translate the Draw + // rebuilds); the caret TRIANGLE itself is GREEN width 1 (@4550-4551 -- + // SetLineWidth(1) + SetColor(0,0.75,0) BEFORE the polyline). dpl2d_PushState(m); dpl2d_SetLineWidth(m, 2.0f); - dpl2d_SetColor(m, 0.75f, 0.75f, 0.0f); + dpl2d_SetColor(m, 0.75f, 0.75f, 0.0f); // yellow: the live bar dpl2d_CallList(m, rangeCaretR); + dpl2d_SetLineWidth(m, 1.0f); + dpl2d_SetColor(m, 0.0f, 0.75f, 0.0f); // green: the caret triangle dpl2d_OpenPolyline(m); dpl2d_AddPoint(m, kRetOriginX - kRetTickMajor, kRetOriginY); dpl2d_AddPoint(m, kRetOriginX - kRetCaret - kRetTickMajor, kRetOriginY + kRetCaret); dpl2d_AddPoint(m, kRetOriginX - kRetCaret - kRetTickMajor, kRetOriginY - kRetCaret); + dpl2d_AddPoint(m, kRetOriginX - kRetTickMajor, kRetOriginY); // close @4558 dpl2d_ClosePolyline(m); dpl2d_PopState(m); // the BOTTOM heading ladder (21 ticks across, dir 0 = +x travel) @@ -1144,21 +1150,29 @@ BTReticleRenderable::BTReticleRenderable(Entity *entity, Scalar *range_attr) kRetBotX, kRetBotY, 0, kRetTickMinor, kRetTickMajor); // the heading carets (over/under triangles at the ladder centre, shifted // by the called heading translate) + // (ctor @4565-4587 [T1], color-corrected like the range caret: yellow + // width 2 for the CALLED live twist-deflection list, then GREEN width 1 + // @4569-4570 for the bowtie triangles. The binary pops state between the + // over- and under-caret (@4579) -- same green/1 either way.) { float cx = kRetBotX + kRetBotSpan * 0.5f; // _DAT_004cd7f8 = 0.5 [T1] dpl2d_PushState(m); dpl2d_SetLineWidth(m, 2.0f); - dpl2d_SetColor(m, 0.75f, 0.75f, 0.0f); + dpl2d_SetColor(m, 0.75f, 0.75f, 0.0f); // yellow: the live deflection line dpl2d_CallList(m, rangeCaretB); + dpl2d_SetLineWidth(m, 1.0f); + dpl2d_SetColor(m, 0.0f, 0.75f, 0.0f); // green: the bowtie carets dpl2d_OpenPolyline(m); dpl2d_AddPoint(m, cx, kRetBotY - kRetTickMajor); dpl2d_AddPoint(m, cx + kRetCaret, kRetBotY - kRetCaret - kRetTickMajor); dpl2d_AddPoint(m, cx - kRetCaret, kRetBotY - kRetCaret - kRetTickMajor); + dpl2d_AddPoint(m, cx, kRetBotY - kRetTickMajor); dpl2d_ClosePolyline(m); dpl2d_OpenPolyline(m); dpl2d_AddPoint(m, cx, kRetBotY + kRetTickMajor); dpl2d_AddPoint(m, cx + kRetCaret, kRetBotY + kRetCaret + kRetTickMajor); dpl2d_AddPoint(m, cx - kRetCaret, kRetBotY + kRetCaret + kRetTickMajor); + dpl2d_AddPoint(m, cx, kRetBotY + kRetTickMajor); dpl2d_ClosePolyline(m); dpl2d_PopState(m); }