From eae631ba046919dd9d989bedff1942c0084cf68f Mon Sep 17 00:00:00 2001 From: arcattack Date: Mon, 6 Jul 2026 19:34:58 -0500 Subject: [PATCH] docs: record oneOfSeveralPixInt (increment 5) + update remaining-widget list GAUGE_COMPOSITE.md + CLAUDE.md: add the OneOfSeveral/oneOfSeveralPixInt button- lamp reconstruction to the done list; narrow the remaining widgets to map (radar marquee), PlayerStatus, vehicleSubSystems, plus the follow-ups to make the duck/searchlight buttons dynamic (extend the Mech table to 0x37 + a Searchlight table). Co-Authored-By: Claude Opus 4.8 (1M context) --- CLAUDE.md | 12 +++++++----- docs/GAUGE_COMPOSITE.md | 18 ++++++++++++++---- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 8d8d227..01a7453 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -711,13 +711,15 @@ gap slots uninitialized and `Find` strcmps EVERY slot → a published table MUST `NextAttributeID`; fill gaps with a shared read-only pad member.** Done: **HeatSink table** (`CurrentTemperature` → Heat readout shows 77), **Mech table** (dense prefix 0x15..0x21, `LinearSpeed` → SPEED readout shows ~225), **vertBar** (coolant bars; x87 pixel math recovered by disassembly), **segmentArcRatio** (speed arc; thin subclass -of engine `SegmentArc`). **Base primitives `numeric`/`numericSpeed`/`digitalClock`/`rankAndScore` are ENGINE -(L4GAUGE.cpp) — only need the data; `vertBar`/`segmentArcRatio`/`oneOfSeveralPixInt`/`map`/`PlayerStatus`/ +of engine `SegmentArc`), and **oneOfSeveralPixInt** (the button-state lamps — reconstructed the whole OneOfSeveral +strip-selector family + PixMap8 blit path). **Base primitives `numeric`/`numericSpeed`/`digitalClock`/`rankAndScore` +are ENGINE (L4GAUGE.cpp) — only need the data; `vertBar`/`segmentArcRatio`/`oneOfSeveralPixInt`/`map`/`PlayerStatus`/ `vehicleSubSystems` are BT-specific (reconstruct + register).** Technique added: `tools/disas2.py ` (recover FPU math Ghidra drops — `FUN_004dcd94`=round, `FUN_004dcd00`=fabs) + `tools/vtdump.py ` -(find a vtable override the assert-anchored decomp didn't export). REMAINING: `oneOfSeveralPixInt`/`map`/ -`PlayerStatus`/`vehicleSubSystems` (task #13) + the aggregate HeatSink-bank `AmbientTemperature` (`#if 0`'d 0xBBE) -+ the Reservoir `coolantCapacity` shadow. +(find a vtable override the assert-anchored decomp didn't export). REMAINING: `map` (radar — the marquee, needs the +Mech table extended to 0x31 + a Sensor table + the `MapDisplay` renderer), `PlayerStatus`, `vehicleSubSystems` +(task #13) + the aggregate HeatSink-bank `AmbientTemperature` (`#if 0`'d 0xBBE) + the Reservoir `coolantCapacity` +shadow + making the duck/searchlight buttons dynamic (extend the Mech table to 0x37 + a Searchlight table). **Alternate route considered:** run original `btrel410.exe` under DOSBox — **blocked**: it needs the VPX/IG board DOSBox can't emulate; bypassing it = the shim work anyway. diff --git a/docs/GAUGE_COMPOSITE.md b/docs/GAUGE_COMPOSITE.md index 369719d..070ed93 100644 --- a/docs/GAUGE_COMPOSITE.md +++ b/docs/GAUGE_COMPOSITE.md @@ -399,6 +399,13 @@ fill the gaps (bind not-yet-needed ids to a shared read-only pad member). 4. **segmentArcRatio** (SegmentArcRatio, btl4gaug) — the SPEED arc. Thin subclass of engine `SegmentArc`; Execute override (`FUN_004dcd00`=fabs): `currentValue = clamp(|num/den * segmentSpan|,0,1)` then `SegmentArc::Execute()`. `segmentSpan = (Scalar)(|n|/(|n|-1))*0.75f` (int division → 0.75 for 36 segs). +5. **oneOfSeveralPixInt** (OneOfSeveral base + PixInt, btl4gaug) — the button-state LAMPS. Reconstructed + the whole OneOfSeveral family (strip selector: `col=selected%columns, row=selected/columns` → blit that + sub-rect via `DrawPixelMap8`(pixmap)/`DrawBitMapOpaque`(bitmap); strip resource via + `warehouse->pixelMap8Bin`). PixInt forces the PixMap path + one `GaugeConnectionDirectOf` → the + frame index; added the missing `OneOfSeveral::foregroundColor`@0x9C. Config binds duck/searchlight/ + display-mode/piloting-mode buttons; `ControlsMapper/DisplayMode` resolves live, the rest degrade to + frame 0 until their tables land. ### Reconstruction-technique additions (durable) - **x87 float math Ghidra drops** (`FUN_004dcd94()`/`FUN_004dcd00()` show no args = FPU-stack operands): @@ -418,7 +425,10 @@ fill the gaps (bind not-yet-needed ids to a shared read-only pad member). - Reservoir shadow: `Reservoir::coolantCapacity`@0x128 shadows the inherited `thermalCapacity` the gauge reads → `Reservoir/CoolantCapacity` reads the base default; fix = delete the shadow + write thermalCapacity in the Reservoir ctor (bundle with the Reservoir coolant-bar verification). -- Remaining widgets (task #13): `oneOfSeveralPixInt` (button lamps — `ControlsMapper/DisplayMode` already - publishes; `DuckState`/`Searchlight/LightOn` need the Mech dense table extended to 0x37 + a Sensor/ - Searchlight table), `map` (radar — needs Mech RadarRange/LinearPos/AngularPos published + Sensor - RadarPercent), `PlayerStatus`, `vehicleSubSystems`. +- ✅ **oneOfSeveralPixInt** DONE (increment 5 above). To make its `DuckState`/`Searchlight/LightOn` + buttons DYNAMIC (they read frame 0 today): extend the Mech dense table to 0x37 (DuckState@0x3f8) + add a + Searchlight `LightOn` table. +- Remaining widgets (task #13): `map` (radar — the marquee; needs the Mech dense table extended to 0x31 for + RadarRange/RadarLinearPosition/RadarAngularPosition + a Sensor `RadarPercent` table + the map/radar + renderer reconstruction, base `MapDisplay` in btl4rdr.cpp), `PlayerStatus` (comm/score, 8 uses), + `vehicleSubSystems` (26 uses).