From 4a4ec6855cf85d5d310de8e8b83a17f3651619b5 Mon Sep 17 00:00:00 2001 From: arcattack Date: Tue, 7 Jul 2026 21:25:48 -0500 Subject: [PATCH] gauge-complete P4e: SectorDisplay reconstructed + registered -> radar SECTOR X/Z read-out LIVE The "sectorDisplay" cockpit primitive (Secondary overlay, the radar SECTOR X/Z coordinate read-out) was PROSE-ONLY in btl4gau3 (placeholder Make, no ctor/ methodDescription/registration) -> the config line was parse-SKIPPED and never built. Reconstructed byte-verified from the disassembly (ctor @4c9e10, Execute @4ca07c, methodDescription PE-parse): SectorDisplay : GraphicGauge, sizeof 0xC4. Its Execute reads the linked mech's world position and shows two 100-unit sector numerics: numericA = Round(-localOrigin.z * 0.01) + 500 numericB = Round( localOrigin.x * 0.01) + 500 (rounding = round-to-nearest == FUN_004dcd94, corrected from the reviewer's wrong "truncate" claim; 0.01 const PE-verified; -Z/+X axis + fchs confirmed from asm). Overridden slots: LinkToEntity(9) caches the subject, BecameActive(3, non-inactivating), Execute(16) -> satisfies the container-Execute rule. Layout overflow-locked (static_assert sizeof<=0xC4). Make/ctor/dtor mirror the registered PilotList sibling; the config image name is copied (nameCopy) since Execute reads it per-frame. Registered in BTL4MethodDescription[]. VERIFIED LIVE (BT_SECTOR_LOG): Make port=1 pos=(125,579) image=helv15.pcc gridCached=1; Execute -Z=960.4 X=361.6 -> sectorA=510 sectorB=504 (Round(9.6)+500=510, Round(3.6)+500=504 -- authentic 100-unit sectors from live mech position). Gauge composite renders full, no crash. The skip list is now exactly the two remaining widgets (prepEngr x12, messageBoard). Also: a permanent BT_GAUGE_SKIP_LOG diagnostic (GAUGREND.cpp, gated) that logs each unregistered gauge primitive the dev-parse skips -- the tool that pinned this down (earlier "not built" runs were killed before the lazy gauge-renderer init). Co-Authored-By: Claude Opus 4.8 (1M context) --- engine/MUNGA/GAUGREND.cpp | 3 + game/reconstructed/btl4gau3.cpp | 203 +++++++++--- game/reconstructed/btl4gau3.hpp | 53 ++-- game/reconstructed/btl4grnd.cpp | 1 + scratchpad/braces.py | 23 ++ scratchpad/braces2.py | 22 ++ scratchpad/cropsect.py | 6 + scratchpad/cropsect2.py | 6 + scratchpad/dumpwf.py | 16 + scratchpad/rdtbyte.py | 16 + scratchpad/rdwf.py | 13 + scratchpad/sect_gauge.png | Bin 0 -> 45867 bytes scratchpad/sect_zoom.png | Bin 0 -> 105510 bytes scratchpad/sect_zoom2.png | Bin 0 -> 45623 bytes scratchpad/wf_0_MessageBoard_decode.md | 332 ++++++++++++++++++++ scratchpad/wf_1_SectorDisplay_decode.md | 294 ++++++++++++++++++ scratchpad/wf_2_PrepEngr_decode.md | 390 ++++++++++++++++++++++++ scratchpad/wf_3_MessageBoard_verify.md | 42 +++ scratchpad/wf_4_SectorDisplay_verify.md | 71 +++++ scratchpad/wf_5_PrepEngr_verify.md | 47 +++ 20 files changed, 1468 insertions(+), 70 deletions(-) create mode 100644 scratchpad/braces.py create mode 100644 scratchpad/braces2.py create mode 100644 scratchpad/cropsect.py create mode 100644 scratchpad/cropsect2.py create mode 100644 scratchpad/dumpwf.py create mode 100644 scratchpad/rdtbyte.py create mode 100644 scratchpad/rdwf.py create mode 100644 scratchpad/sect_gauge.png create mode 100644 scratchpad/sect_zoom.png create mode 100644 scratchpad/sect_zoom2.png create mode 100644 scratchpad/wf_0_MessageBoard_decode.md create mode 100644 scratchpad/wf_1_SectorDisplay_decode.md create mode 100644 scratchpad/wf_2_PrepEngr_decode.md create mode 100644 scratchpad/wf_3_MessageBoard_verify.md create mode 100644 scratchpad/wf_4_SectorDisplay_verify.md create mode 100644 scratchpad/wf_5_PrepEngr_verify.md diff --git a/engine/MUNGA/GAUGREND.cpp b/engine/MUNGA/GAUGREND.cpp index 67fa8c9..dc55a9a 100644 --- a/engine/MUNGA/GAUGREND.cpp +++ b/engine/MUNGA/GAUGREND.cpp @@ -1349,6 +1349,9 @@ void // if (getenv("BT_DEV_GAUGES") != NULL) { + if (getenv("BT_GAUGE_SKIP_LOG")) + DEBUG_STREAM << "[gskip] unresolved primitive '" + << local_name << "' -> skipped\n" << std::flush; const char *skip_token; int diff --git a/game/reconstructed/btl4gau3.cpp b/game/reconstructed/btl4gau3.cpp index 7621a53..d14ce3f 100644 --- a/game/reconstructed/btl4gau3.cpp +++ b/game/reconstructed/btl4gau3.cpp @@ -59,18 +59,8 @@ # include #endif -// -// Unrecovered .data resource pools used by the two Make() factories below. The -// concrete bytes (rate/mode/colours/image names) were not recovered from the -// optimised image; declared here as typed placeholders so the construction -// paths compile. (BEST-EFFORT.) DebugStream is provided by the shared recon -// headers. -// -static int DAT_0051a2bc = 0; // SectorDisplay GaugeRate -static int DAT_0051a300 = 0; // SectorDisplay ModeMask -static char DAT_0051a344[] = ""; // SectorDisplay grid image name -// (PlayerStatus's DAT_ placeholder pool removed -- its rewired Make reads -// methodDescription.parameterList[] like the other registered widgets.) +// (SectorDisplay's + PlayerStatus's DAT_ placeholder pools removed -- their rewired +// Make()s read methodDescription.parameterList[] like the other registered widgets.) //########################################################################### @@ -92,61 +82,178 @@ static char DAT_0051a344[] = ""; // SectorDisplay grid image name // SectorDisplay @004c9d44 Make / @004c9e10 ctor //########################################################################### +// @0x51a2b0 -- registered so the interpreter builds the CFG line +// sectorDisplay( K, ModeAlwaysActive, helv15.pcc, 0, 3 ) (L4GAUGE.CFG:5146; the +// port index + offset=(125,579) arrive via Make's args, not config tokens). +MethodDescription + SectorDisplay::methodDescription = + { + "sectorDisplay", + SectorDisplay::Make, + { + { ParameterDescription::typeRate, NULL }, // p[0] rate [row0 type=1] + { ParameterDescription::typeModeMask, NULL }, // p[1] modeMask [row1 type=2] + { ParameterDescription::typeString, NULL }, // p[2] image [row2 type=9] + { ParameterDescription::typeColor, NULL }, // p[3] color [row3 type=4] + { ParameterDescription::typeColor, NULL }, // p[4] okColor [row4 type=4] + PARAMETER_DESCRIPTION_END + } + }; + // -// @004c9d44 -- Make. Allocate (0xc4) and construct "SectorDisplay" from the -// resource strings (DAT_0051a2bc..0051a3cc). Then verify the grid image exists -// (BitMapCache); if missing, warn "SectorDisplay: Missing image ". +// @004c9d44 -- Make. Alloc 0xc4 + construct; then peek the grid image and warn +// "SectorDisplay: Missing image " if absent (binary-faithful: the base ctor +// self-registers the gauge regardless of the return value). // Logical SectorDisplay::Make( - int /*display_port_index*/, - Vector2DOf /*position*/, - Entity *entity, + int display_port_index, + Vector2DOf position, + Entity * /*entity -- unused*/, GaugeRenderer *gauge_renderer ) { - SectorDisplay *gauge = (SectorDisplay *)operator new(0xc4); + ParameterDescription *p = methodDescription.parameterList; + + SectorDisplay *gauge = (SectorDisplay *)operator new(0xc4); // FUN_00402298(0xc4) if (gauge != NULL) - { - // - // Construct with the recovered grid-image name; the remaining geometry / - // colour / font-image arguments were not recovered, so are typed - // placeholders. - // new (gauge) SectorDisplay( - (GaugeRate)DAT_0051a2bc, // rate - (ModeMask)DAT_0051a300, // mode mask + p[0].data.rate, p[1].data.modeMask, (L4GaugeRenderer *)gauge_renderer, - 0, // graphics port number - 0, 0, // x, y - (char *)&DAT_0051a344, // grid image - (char *)0, // font image - 0, // color + display_port_index, // graphics_port_number (FIX: was 0) + position.x, position.y, // SetOrigin (FIX: was 0,0) + p[2].data.string, // grid/font image (helv15.pcc) + p[3].data.color, // numericColor + p[4].data.color, // gridColor / numeric okColor "SectorDisplay"); - } BitMap *grid = gauge_renderer->warehousePointer->bitMapBin.GetIfAlreadyExists( - (char *)&DAT_0051a344); // FUN_00442aec (peek, no AddRef) + p[2].data.string); // FUN_00442aec (peek, no AddRef) if (grid == NULL) - { - DebugStream << "SectorDisplay: Missing image " - << (char *)&DAT_0051a344 << "\n"; // FUN_004dbb24 x3 - } + DebugStream << "SectorDisplay: Missing image " << p[2].data.string << "\n"; + if (getenv("BT_SECTOR_LOG")) + DEBUG_STREAM << "[sector] Make port=" << display_port_index << " pos=(" + << position.x << "," << position.y << ") image=" << p[2].data.string + << " gridCached=" << (int)(grid != NULL) << "\n" << std::flush; return (grid != NULL); } // -// @004c9e10 -- ctor (vtable PTR_FUN_0051beec). GraphicGauge base, interns the -// grid image; computes cellWidth = imageWidth/14, gridLeft = cellWidth*12, -// gridRight = cellWidth*12 + cellWidth - 1, gridHeight = imageHeight; sets the -// port origin; builds two NumericDisplays (this[0x2F] at origin, this[0x30] at -// +cellWidth*4). baseLine = dirty = 500. -// @004c9f94 -- dtor: release grid, delete both numerics, GraphicGauge::~GraphicGauge. -// @004ca038 -- BecameActive: dirty=1; reset both numerics. -// @004ca068 -- SetEnable: this[0x24] = enable. -// @004ca07c -- Execute: when enabled, DrawAt the two numerics at the rounded -// cursor position (+offsets), and on the first pass blit the grid image. +// @004c9e10 -- ctor (vtable PTR_FUN_0051beec). GraphicGauge base (owner 0); copy +// the grid-image name; from the cached bitmap compute cellWidth=imageW/14, +// gridLeft=cellWidth*12, gridRight=cellWidth*13-1, gridHeight=imageH; SetOrigin; +// build two 3-digit NumericDisplays (@0 and @cellWidth*4). // +SectorDisplay::SectorDisplay( + GaugeRate rate, ModeMask mode_mask, L4GaugeRenderer *renderer_in, + int graphics_port_number, int x, int y, + const char *image, int color, int ok_color, const char *identification_string) + : GraphicGauge(rate, mode_mask, renderer_in, 0, // FUN_00444818 (owner 0) + graphics_port_number, identification_string) +{ + // nameCopy(image) -- Execute reads gridImage per-frame, so it must outlive the + // (transient) config parameterList string; store a durable copy (FUN_004700ac). + gridImage = NULL; + if (image != NULL) { + gridImage = new char[strlen(image) + 1]; + strcpy(gridImage, image); + } + numericColor = color; // @0xA8 + gridColor = ok_color; // @0xAC + subject = NULL; // @0x90 + sectorBaseB = 500; // @0xB4 (0x1f4) + sectorBaseA = 500; // @0xB0 + dirty = 1; // @0xB8 (binary leaves uninit; BecameActive sets it) + + L4Warehouse *wh = (L4Warehouse *)renderer_in->warehousePointer; // renderer+0x4c + BitMap *img = wh->bitMapBin.GetIfAlreadyExists(gridImage); // FUN_00442aec (peek) + if (img == NULL) { + cellWidth = gridLeft = gridRight = gridHeight = 0; + } else { + cellWidth = img->Data.Size.x / 14; // img+0xc width + gridLeft = cellWidth * 12; + gridRight = cellWidth * 12 + cellWidth - 1; + gridHeight = img->Data.Size.y; // img+0x10 height + } + localView.SetOrigin(x, y); // this+0x48 vtbl+0x10 + + // NumericDisplay(warehouse, x, y, image, fieldWidth=3, format=unsignedFormat(0), color, okColor) + numericA = new NumericDisplay(wh, 0, 0, image, 3, + NumericDisplay::unsignedFormat, color, ok_color); + numericB = new NumericDisplay(wh, cellWidth * 4, 0, image, 3, + NumericDisplay::unsignedFormat, color, ok_color); +} + +// +// @004c9f94 -- dtor. Free the copied name + both numerics; the base +// GraphicGauge::~GraphicGauge runs implicitly (do NOT call it). +// +SectorDisplay::~SectorDisplay() +{ + delete[] gridImage; gridImage = NULL; + delete numericA; numericA = NULL; // FUN_0047018c + delete numericB; numericB = NULL; +} + +// @004ca020 -- TestInstance: out-of-line forward to the base (so it isn't /FORCE-stubbed). +Logical + SectorDisplay::TestInstance() const { return GraphicGauge::TestInstance(); } + +// @004ca068 -- LinkToEntity (slot 9): cache the renderer's linked entity as the subject. +void + SectorDisplay::LinkToEntity(Entity *entity) { subject = entity; } + +// @004ca038 -- BecameActive (slot 3): mark dirty + reset both numerics. NON-inactivating +// (does NOT chain the base) -> satisfies the container-Execute rule. +void + SectorDisplay::BecameActive() +{ + dirty = 1; + numericB->ForceUpdate(); // FUN_004703f4 (B then A, binary order) + numericA->ForceUpdate(); +} + +// @004ca07c -- Execute (slot 16): draw the two sector numerics from the linked mech's +// world X/Z (Round via the codebase +0.5 idiom == FUN_004dcd94), then on the first +// active frame blit the grid-cell background. +void + SectorDisplay::Execute() +{ + Entity *s = subject; // this+0x90 + // PORT accommodation (marked): the LinkToEntity broadcast may be unwired on + // WinTesla -> fall back to the viewpoint mech (same as btl4rdr ResolveOperatorEntity). + // The binary gates purely on `subject != 0` (@0x4ca08e). + if (s == NULL && application != NULL) + s = (Entity *)application->GetViewpointEntity(); + if (s == NULL) + return; + + const Point3D &pos = s->localOrigin.linearPosition; // s+0x100 (x@+0x100, z@+0x108) + Scalar za = -pos.z * 0.01f; // @0x4ca194 = 0.01 (100-unit sectors) + Scalar xb = pos.x * 0.01f; + int vA = (int)(za + (za < 0.0f ? -0.5f : 0.5f)) + sectorBaseA; // Round(-Z*0.01)+500 + int vB = (int)(xb + (xb < 0.0f ? -0.5f : 0.5f)) + sectorBaseB; // Round( X*0.01)+500 + numericA->Draw(&localView, (Scalar)vA); // FUN_00470430 + numericB->Draw(&localView, (Scalar)vB); + + if (getenv("BT_SECTOR_LOG")) { + static int s_n = 0; + if ((s_n++ % 120) == 0) + DEBUG_STREAM << "[sector] Execute -Z=" << (-pos.z) << " X=" << pos.x + << " -> sectorA=" << vA << " sectorB=" << vB << "\n" << std::flush; + } + + if (dirty) { // this+0xB8 + dirty = 0; + BitMap *grid = ((L4Warehouse *)renderer->warehousePointer) + ->bitMapBin.GetIfAlreadyExists(gridImage); // FUN_00442aec + if (grid != NULL) { + localView.MoveToAbsolute(cellWidth * 3, 0); // vtbl+0x24 + localView.SetColor(gridColor); // vtbl+0x18 (this+0xAC) + localView.DrawBitMap(0, grid, gridLeft, 0, gridRight, gridHeight); // vtbl+0x54 + } + } +} //########################################################################### diff --git a/game/reconstructed/btl4gau3.hpp b/game/reconstructed/btl4gau3.hpp index 1ef3c5c..c75758c 100644 --- a/game/reconstructed/btl4gau3.hpp +++ b/game/reconstructed/btl4gau3.hpp @@ -88,41 +88,50 @@ //####################################################################### - // SectorDisplay -- a 14-column bitmap status grid with two NumericDisplays. + // SectorDisplay (config keyword "sectorDisplay") -- the radar SECTOR X/Z + // read-out on the Secondary overlay: a one-shot grid-cell background blit + + // two 3-digit NumericDisplays showing the linked mech's world sector coords + // (Round(-Z*0.01)+500, Round(X*0.01)+500 -> 100-unit sectors). // @004c9d44 Make / @004c9e10 ctor / @004c9f94 dtor / @004ca038 BecameActive / - // @004ca068 SetEnable / @004ca07c Execute. vtable PTR_FUN_0051beec. - // Make warns "SectorDisplay: Missing image ". The numeric pair shows - // a row/column read-out aligned to the grid bitmap (image width / 14). + // @004ca068 LinkToEntity (slot 9) / @004ca07c Execute (slot 16). vtable 0x51beec. + // Was PROSE-ONLY (placeholder Make, no ctor/methodDescription) -> the config + // "sectorDisplay" line was parse-skipped. Reconstructed byte-verified from the + // disassembly (ctor @4c9e10, Execute @4ca07c) + methodDescription PE-parse. //####################################################################### class SectorDisplay : public GraphicGauge { public: + static MethodDescription methodDescription; // "sectorDisplay" static Logical Make(int, Vector2DOf, Entity *, GaugeRenderer *); // @004c9d44 - SectorDisplay( // @004c9e10 - GaugeRate, ModeMask, L4GaugeRenderer *, int, - int x, int y, const char *grid_image, - const char *font_image, int color, + SectorDisplay( // @004c9e10 (owner folded to 0, like the siblings) + GaugeRate, ModeMask, L4GaugeRenderer *, int graphics_port_number, + int x, int y, const char *image, int color, int ok_color, const char *identification_string); ~SectorDisplay(); // @004c9f94 Logical TestInstance() const; - void SetEnable(Logical); // @004ca068 this[0x24] - void BecameActive(); // @004ca038 - void Execute(); // @004ca07c + void LinkToEntity(Entity *); // @004ca068 slot 9 -- caches the subject mech + void BecameActive(); // @004ca038 slot 3 (non-inactivating) + void Execute(); // @004ca07c slot 16 protected: - Logical enabled; // @0x90 this[0x24] - char *gridImage; // @0x94 this[0x25] - int cellWidth; // @0x98 this[0x26] imageW/14 - int gridLeft; // @0x9C this[0x27] cellWidth*12 - int gridRight; // @0xA0 this[0x28] - int gridHeight; // @0xA4 this[0x29] - int color; // @0xAC this[0x2B] - int baseLine; // @0xB0 this[0x2C] =500 - int dirty; // @0xB4 this[0x2D] =500 + Entity *subject; // @0x90 LinkToEntity target (ctor=0) + char *gridImage; // @0x94 interned image name (copied; blit source) + int cellWidth; // @0x98 imageWidth / 14 + int gridLeft; // @0x9C cellWidth*12 + int gridRight; // @0xA0 cellWidth*13 - 1 + int gridHeight; // @0xA4 imageHeight + int numericColor; // @0xA8 param_9 (both numerics' color) + int gridColor; // @0xAC param_10 (blit color + numeric okColor) + int sectorBaseA; // @0xB0 = 500 (added to the -Z numeric) + int sectorBaseB; // @0xB4 = 500 (added to the +X numeric) + int dirty; // @0xB8 redraw flag (BecameActive=1, Execute clears) NumericDisplay - *numericA, // @0xBC this[0x2F] - *numericB; // @0xC0 this[0x30] + *numericA, // @0xBC -Z sector readout + *numericB; // @0xC0 X sector readout + // sizeof == 0xC4 (== Make alloc); overflow-lock only (2007 GraphicGauge base + // is not byte-identical to 1995, and every read here is via named members). }; + static_assert(sizeof(SectorDisplay) <= 0xC4, "SectorDisplay must fit its 0xC4 Make alloc"); //####################################################################### diff --git a/game/reconstructed/btl4grnd.cpp b/game/reconstructed/btl4grnd.cpp index 7a17118..87f96f5 100644 --- a/game/reconstructed/btl4grnd.cpp +++ b/game/reconstructed/btl4grnd.cpp @@ -147,6 +147,7 @@ MethodDescription &VertNormalSlider::methodDescription, // "vertNormalSlider" -- condenser valve-setting slider (heat MFD) &PilotList::methodDescription, // "pilotList" -- Comm KILLS/DEATHS pilot roster &GeneratorCluster::methodDescription, // "GeneratorCluster" -- the 4 generator engineering panels (buttons 9-12) + &SectorDisplay::methodDescription, // "sectorDisplay" -- radar SECTOR X/Z read-out (Secondary overlay) &BTL4ChainToPrevious }; diff --git a/scratchpad/braces.py b/scratchpad/braces.py new file mode 100644 index 0000000..1306038 --- /dev/null +++ b/scratchpad/braces.py @@ -0,0 +1,23 @@ +lines=open('GAUGE/L4GAUGE.CFG',encoding='latin-1').read().split('\n') +depth=0; start=None +for i,l in enumerate(lines[4900:5160],start=4901): + for ch in l: + if ch=='{': depth+=1 + elif ch=='}': depth-=1 + if i in (4901,4902,5127,5129,5146,5152) or depth==0 and i>4902 and start is None: + pass +# find Secondary1 block extent +depth=0; opened=False; close=None +for i,l in enumerate(lines,start=1): + if i<4901: continue + for ch in l: + if ch=='{': depth+=1; opened=True + elif ch=='}': depth-=1 + if opened and depth==0: + close=i; break +print("Secondary1 block: 4901 ..", close, "| sectorDisplay@5146 inside:", 4901<=5146<=close) +# what ports are in the block +for i in range(4901,close+1): + l=lines[i-1].strip() + if l.startswith('port') or 'sectorDisplay' in l or l.endswith('overlay;'): + print(f" {i}: {l}") diff --git a/scratchpad/braces2.py b/scratchpad/braces2.py new file mode 100644 index 0000000..890bf4a --- /dev/null +++ b/scratchpad/braces2.py @@ -0,0 +1,22 @@ +lines=open('GAUGE/L4GAUGE.CFG',encoding='latin-1').read().split('\n') +# MechInit block extent from 4390 +depth=0; opened=False; close=None +for i in range(4390,len(lines)+1): + l=lines[i-1] + for ch in l: + if ch=='{': depth+=1; opened=True + elif ch=='}': depth-=1 + if opened and depth==0: close=i; break +print("MechInit block: 4390 ..", close, "| prepEngr@4595 inside:", 4390<=4595<=(close or 0)) +# structure between 4407 and 4600 +print("--- lines 4408-4430 & around 4590-4600 ---") +for i in list(range(4408,4416))+list(range(4590,4600)): + print(f" {i}: {lines[i-1].strip()[:70]}") +# any nested braces / sub-blocks between 4407 and 4595? +d=0 +for i in range(4390,4600): + for ch in lines[i-1]: + if ch=='{': d+=1 + elif ch=='}': d-=1 + if lines[i-1].strip().endswith('{') or lines[i-1].strip()=='}': + print(f" brace@{i} depth->{d}: {lines[i-1].strip()[:50]}") diff --git a/scratchpad/cropsect.py b/scratchpad/cropsect.py new file mode 100644 index 0000000..e1739c3 --- /dev/null +++ b/scratchpad/cropsect.py @@ -0,0 +1,6 @@ +from PIL import Image +im=Image.open('scratchpad/sect_gauge.png') +# radar/secondary tile is bottom-center; sectorDisplay at secondary (125,579)=lower-left +c=im.crop((340,250,660,415)).resize((960,495)) +c.save('scratchpad/sect_zoom.png') +print("saved", c.size) diff --git a/scratchpad/cropsect2.py b/scratchpad/cropsect2.py new file mode 100644 index 0000000..bb44f93 --- /dev/null +++ b/scratchpad/cropsect2.py @@ -0,0 +1,6 @@ +from PIL import Image +im=Image.open('scratchpad/sect_gauge.png') +# bottom-left of the radar tile (the SECTOR label area) +c=im.crop((345,355,430,410)).resize((680,440)) +c.save('scratchpad/sect_zoom2.png') +print("saved", c.size) diff --git a/scratchpad/dumpwf.py b/scratchpad/dumpwf.py new file mode 100644 index 0000000..cc03c9e --- /dev/null +++ b/scratchpad/dumpwf.py @@ -0,0 +1,16 @@ +import json,sys,re +p=r'C:\Users\epilectrik\.claude\projects\C--git-bt411\09bf24bb-f92d-423a-b815-1eb662736f58\subagents\workflows\wf_35445603-8db\journal.jsonl' +out=[] +for line in open(p,encoding='utf-8',errors='replace'): + try: d=json.loads(line) + except: continue + if d.get('type')=='result': + out.append(str(d.get('result') or d.get('value') or '')) +for i,r in enumerate(out): + # guess widget by keyword frequency + w={'PrepEngr':r.count('PrepEngr'),'SectorDisplay':r.count('SectorDisplay'),'MessageBoard':r.count('MessageBoard')} + widget=max(w,key=w.get) + kind='verify' if ('VERDICT' in r or 'adversarial' in r[:400].lower() or 'CONFIRMED' in r[:400]) else 'decode' + fn=f'scratchpad/wf_{i}_{widget}_{kind}.md' + open(fn,'w',encoding='utf-8').write(r) + print(f'{i}: {widget:16} {kind:7} len={len(r):6} -> {fn}') diff --git a/scratchpad/rdtbyte.py b/scratchpad/rdtbyte.py new file mode 100644 index 0000000..d62f4c6 --- /dev/null +++ b/scratchpad/rdtbyte.py @@ -0,0 +1,16 @@ +import struct,sys +va=int(sys.argv[1],16) +f=open('content/BTL4OPT.EXE','rb').read() +pe=struct.unpack_from('*Fk1hu#NF$61C#RKrF*VZ56=o|Yov9U(nC;{ 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 literal 0 HcmV?d00001 diff --git a/scratchpad/sect_zoom.png b/scratchpad/sect_zoom.png new file mode 100644 index 0000000000000000000000000000000000000000..dc4a9fa735f99c73821cde290e37e2a672edeaaf GIT binary patch literal 105510 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 z

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 pvJLEf>bc>8*#^l(uPE@HdYNZt_?QK7 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 FV1m-LiQNDI literal 0 HcmV?d00001 diff --git a/scratchpad/sect_zoom2.png b/scratchpad/sect_zoom2.png new file mode 100644 index 0000000000000000000000000000000000000000..435487d0cf8242067794abddbb61458c82768891 GIT binary patch literal 45623 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�HCJdW6V zxS{bm;C)4We~L+E#U3W5Qkb^hMH&})3_Xb}TE#+-v^7KNu^flz>u|%zug+V^g37tU zr-dkG=oVod5Bx^L6ZcSvVXmK=lK^u|X&15houDBU&VvYt;QLr9Q1i*p(oz@zU@gEP zfNgNpT|HFGLHxjd;te-H1^^7`SdG$Rk;R_%T&{xdhit8*NOiM(l;**T=WR04pXWmS z+2Ya^%D>mL)8AOkezfW33Q4Y$p&6~xHt$D0hy)S#(nzZ*1S;fiq$ zUcR5h)enOT7U%962!qK%Tg9cvySGZ9@{c(L2}S(fLzR1`ryPs66Og4aFIr7Gm(sJs zd4rks*BCdjIBd?(r-rRham*0INv~GN>-2z&Iwv%BqWn$h{(1cRUfH(55q({Ay^F2 ziTSb9oQMZ`oh<%bm>({ZT3hZo#b~x4Ixaaev^5Ah8T=^x!R3w(6gn=5Qu!y=j$|y~ zC|f&H@L(-=-uHp}j#2#Av1Sb(zU>#Zoc0J*fLIKOYP@%f)91F(bZW45t~|_@CDEBe z9@xSaf14b}s{Js;K|Gi41=c~Oo7}@U;7)Bztt5fUUo%#xw7kB=@mux#tl79Zi?nBf zwyXx;8so#_`uG0+UikQJf@O=|JQlUJn903`H-Y6T#zECVeK~TOslGX?{eJG%L7g>o z)Oe8-f$gd5ptf};*@_$Dv{UDlaig&AM*?ZzB;NAS97bza4U=hFCwHo(WXoMNGH_!_ zE=ib@q7be`t6^^c`J8LFY$5y}5XVmg6gws|hk!17x0>R2aoDZxSw(78@TucyRIFiq ztRFuJe!Bc8W~azm89v|foA-n;gWB978PZ0NSfJ(7V_A6e=|1J;-{7*=-OB{3?<5zi zW;qY|8deO%b%i?b4geIYSdDHvgO~2q9Je@Hvbm`__kNFW$E~KxeBL_<^fU%&R|r)E zWL41mV=ak;Rv;j|@@`>qtaaE@A>~~FhmP?~JdX7k=h)4-;m0vt84#^C&Ntj)6n6Lx z`Y-lqi9j7Z@A1p}a=zsEdD#3uy~IiW4W^xC>wUf6_X6{E)ajDn;Vb(6bq2UK-yD-N zIWFZ!A=QGq42&_Lp?)F6sdYwF3|CCK-@Y`s99~&>ypTtb- zVS&ZXIL5i3JQj`koRPf5dYJ7_d%gZWkE@Yoxe`bl&(G^UNtCdBoiQh2YIcH-gSlBv z%1LNT4DJeu4|T)Hu*9u1$&~e=kMO&p^)H2G9kxaZ8phIhiUu`jZ1e+R$nG3iia^}Y2$_lCVac$k6uE)X!5ky#L^YzJ$tkGI}_|-cU$Yj_q96RU;)J} z4s)zt?r_BGZU6Fmz-#kT5m z^i4GF@9?$!{=W15c*59Uz0$sh7?u>Ib7Z9G#4qSyT4Pge@QFu zjnwc=b8D__a@>w>gZpz-Hll3e^{XePofq?XkxMegdm2rRg-i5*km=uHYT` znB*M7lsN-^jRyu;CH9ZL`Jy$DJVa_=?%FntfO!|4#nFm6 zaj6CMo>-;8Ta$cJGbw80G?vsXR{4J2`opAtgDe{I7m|~G!irV1 z|DHK^=P77AV!?ef%$+kL_`j1)n4X_krkxYL6{xl-5w;D-FaJKc-TQ5Nyq(yE$=p<-#F_c2$>u9*0t9^ZY5^cY5#a z>2` (×32 px): `srcRect = [cellX, cellY, cellX+0x7f, cellY+0x1f]` (`part_014.c:3969-3979`). `id == -1` → clear the cell to `color` (`:3963-3967`). +- **Name cell** (view-rel `(0x80,0)`): blits the *sender's* name bitmap from the App name/palette cache (`part_014.c:3983-4008`). + +**The data source it reads (decoded from `FUN_004cb82c`):** +``` +source = this->trackedMech // this[0x24] @0x90 (set by SetSource @004cb818) +player = *(source + 0x190) // mech -> owning BTPlayer (:3949 == MECH_OWNING_PLAYER) +msg = *(player + 0x1dc) // BTPlayer's current status-message record (:3951) + msg == 0 -> messageId = -1, nameEntity = 0 (:3952-3955) + else -> nameEntity = *(msg+0x10), messageId = *(msg+0xc) (:3957-3958) +nameEntity -> +0x1e0 = palette/name key -> App+0xc8 name-bitmap cache lookup (:3992-3994, 4002-4004) +``` +`mech+0x190 = owningPlayer (BTPlayer*)` is confirmed by `btplayer.cpp:68` and the `MECH_OWNING_PLAYER` macro; `TeamStatusDisplay` uses the same `mech+0x190` (`btl4gau3.cpp:167`). + +**Is the data LIVE now? NO — DEFERRED. Two independent blockers:** + +1. **The source is never bound.** `SetSource` (`FUN_004cb818`, the *only* writer of `this[0x24]` besides the ctor's `=0`) has **zero recovered callers** (grep across `reference/decomp/all` returns only its own definition). The Make **ignores** its `entity` param (`FUN_004cb678` never touches `param_4`), so nothing binds a mech at construction either. → `trackedMech` stays `NULL` → the whole Execute body is gated `if (source != 0 …)` (`part_014.c:3949`) → **no-op**. + +2. **The message-record feed is a NULL stub.** The record at `BTPlayer+0x1dc` is populated only by `AddStatusMessage(Player__StatusMessage*)`, and that is gated on `StatusMessagePool` — **a NULL bring-up stub** (`btplayer.cpp:135` `extern MemoryBlock *StatusMessagePool;`, guarded at `:508` `if (sender_owner && StatusMessagePool)`). No status messages are ever created, so even a bound mech would read `msg == 0` → messageId `-1` → empty. + +**⚠ Correction to the task hint:** the source is **NOT** the `SubsystemMessageManager` (0xBD3). That class *is* reconstructed (`game/reconstructed/messmgr.cpp`) but it is the **per-mech DAMAGE/explosion hub** (`ConsolidateAndSendDamage`, `weaponExplosions`, `commonDamageInformation`) — its fields are damage records, not `{msgId, nameEntity}`, and the MessageBoard never references it. The real source is the **`BTPlayer` status-message queue** (`Player__StatusMessage`, `btplayer.cpp:513`) gated by `StatusMessagePool`. **That pool is the blocker to name.** + +--- + +## 3. Class layout (byte-exact) + locks + +`GraphicGauge` base ends at `0x90` (`Gauge` 0x48 + `GraphicsView localView` 0x48; confirmed by every sibling: `VertTwoPartBar` first field `tileImage@0x90`, `btl4gaug.cpp:1138`). MessageBoard adds `this[0x24..0x28]`: + +```cpp +class MessageBoard : public GraphicGauge { + ... +protected: + Entity *trackedMech; // @0x90 this[0x24] source mech (SetSource); ctor=0 ⟵ WAS "int enabled" (MISLABEL) + char *stripImage; // @0x94 this[0x25] interned "btsmsgs.pcx" (held bitmap ref) + int color; // @0x98 this[0x26] param_10 (CFG 4th arg = 0) + int previousNameId; // @0x9C this[0x27] BecameActive=-1 ⟵ WAS "previousMessageId" (SWAPPED) + int previousMessageId; // @0xA0 this[0x28] BecameActive=-2 ⟵ WAS "previousNameId" (SWAPPED) + friend struct MessageBoardLayoutCheck; +}; +``` + +**Three header corrections** vs the current `btl4gau3.hpp:273-279`: +- `int enabled` → **`Entity *trackedMech`** (it's a pointer dereferenced `*(src+0x190)` at `:3949`, not a bool; the setter is `SetSource`, not `SetEnable`). +- `previousMessageId`/`previousNameId` are **swapped**. Proof: BecameActive writes `+0x9c=-1`, `+0xa0=-2` (`:3916-3917`); Execute's *message-id* compare is against `+0xa0` (`:3960`) and the *name-entity* compare against `+0x9c` (`:3983`). So `+0x9c=previousNameId(-1)`, `+0xa0=previousMessageId(-2)`. (The prose at `btl4gau3.cpp:784` already states "previousNameId=-1; previousMessageId=-2" — the struct labels contradict the prose.) + +**Locks (add to `btl4gau3.cpp`; protected members ⇒ `friend struct`):** +```cpp +struct MessageBoardLayoutCheck { + static_assert(sizeof(GraphicGauge) == 0x90, "GraphicGauge base size"); + static_assert(offsetof(MessageBoard, trackedMech) == 0x90, "trackedMech"); + static_assert(offsetof(MessageBoard, stripImage) == 0x94, "stripImage"); + static_assert(offsetof(MessageBoard, color) == 0x98, "color"); + static_assert(offsetof(MessageBoard, previousNameId) == 0x9C, "previousNameId"); + static_assert(offsetof(MessageBoard, previousMessageId)== 0xA0, "previousMessageId"); + static_assert(sizeof(MessageBoard) == 0xA4, "MessageBoard sizeof == Make alloc 0xa4"); +}; +``` + +--- + +## 4. Full method bodies to write + +### 4.0 CFG call shape → `methodDescription` +`content/GAUGE/L4GAUGE.CFG:4912-4917`: +``` +offset = (113,607); +messageBoard( + E, # p[0] rate + ModeAlwaysActive, # p[1] mode mask + btsmsgs.pcx, # p[2] strip bitmap + 0 # p[3] draw/erase color +); +``` +`offset` supplies `position` (x=113, y=607) to Make (the ctor's `SetOrigin`). 4 in-paren params: + +```cpp +MethodDescription + MessageBoard::methodDescription = + { + "messageBoard", + MessageBoard::Make, + { + { ParameterDescription::typeRate, NULL }, // p[0] rate (E) + { ParameterDescription::typeModeMask, NULL }, // p[1] mode (ModeAlwaysActive) + { ParameterDescription::typeString, NULL }, // p[2] strip bitmap (btsmsgs.pcx) + { ParameterDescription::typeColor, NULL }, // p[3] draw/erase color (0) + PARAMETER_DESCRIPTION_END + } + }; +``` + +### 4.1 Deferred data bridge (declare near top of `btl4gau3.cpp`) +```cpp +// Resolve the viewpoint player's current HUD status message for `tracked_mech`. +// Returns True if the mech has a bound owning-player record; fills: +// *messageId -- btsmsgs.pcx strip cell index (-1 = no active message) +// *nameBitmap -- sender's name bitmap (NULL = none / App name-cache not wired) +// DEFERRED: StatusMessagePool (btplayer.cpp) is a NULL stub + BTPlayer+0x1dc is +// never populated, so this returns False today -> the board stays empty. Reads +// the raw BTPlayer/StatusMessage offsets in a COMPLETE-BTPlayer TU (never here), +// dodging the databinding trap. Implement in btplayer.cpp / btl4mppr.cpp. +extern Logical BTResolveMessageBoard(Entity *tracked_mech, int *messageId, BitMap **nameBitmap); +``` +(Provide a stub `Logical BTResolveMessageBoard(Entity*, int *id, BitMap **bmp){ *id=-1; *bmp=NULL; return False; }` in `btplayer.cpp` until the feed lands — mirrors `LookupPlayerNameBitmap`/`BTResolveRosterPilot`.) + +### 4.2 Make — `@004cb678` +Alloc `0xa4`, construct, then presence-check the strip bitmap (`FUN_00442aec` Get / `FUN_00442c12` Release) and return whether it exists. `param_5`=renderer, `param_5+0x4c+4`=`bitMapBin`. +```cpp +Logical + MessageBoard::Make( + int display_port_index, + Vector2DOf position, + Entity * /*entity -- ignored by the binary (FUN_004cb678)*/, + GaugeRenderer *gauge_renderer + ) +{ + ParameterDescription *p = methodDescription.parameterList; + + MessageBoard *gauge = (MessageBoard *)operator new(0xa4); // FUN_00402298(0xa4) + if (gauge != NULL) + { + new (gauge) MessageBoard( + p[0].data.rate, p[1].data.modeMask, + (L4GaugeRenderer *)gauge_renderer, + display_port_index, // graphics_port_number + position.x, position.y, // x, y (offset=(113,607)) + p[2].data.string, // strip image (btsmsgs.pcx) + p[3].data.color, // color (0) + "MessageBoard"); + } + + // Presence-check the strip bitmap (binary returns this as the Make result). + L4Warehouse *wh = (L4Warehouse *)gauge_renderer->warehousePointer; // renderer+0x4c + BitMap *strip = wh->bitMapBin.Get(p[2].data.string); // FUN_00442aec + if (strip == NULL) + return False; + wh->bitMapBin.Release(p[2].data.string); // FUN_00442c12 + return True; +} +``` + +### 4.3 ctor — `@004cb704` +```cpp +MessageBoard::MessageBoard( + GaugeRate rate, ModeMask mode_mask, L4GaugeRenderer *renderer_in, + int graphics_port_number, int x, int y, + const char *strip_image, int color_in, const char *identification_string) + : GraphicGauge(rate, mode_mask, renderer_in, 0, // FUN_00444818 (owner 0 folded in) + graphics_port_number, identification_string) +{ + // vtable PTR_FUN_0051bddc set by the base->derived chain. + stripImage = new char[strlen(strip_image) + 1]; // FUN_004700ac (intern a private copy) + strcpy(stripImage, strip_image); + L4Warehouse *wh = (L4Warehouse *)renderer_in->warehousePointer; + wh->bitMapBin.Get(stripImage); // FUN_00442aec (hold a ref for life) + + localView.SetOrigin(x, y); // this+0x48 vtbl+0x10 + color = color_in; // this[0x26] + trackedMech = NULL; // this[0x24] (param_1[0x24]=0, :3864) + // previousNameId / previousMessageId set by BecameActive (byte-faithful). +} +``` + +### 4.4 dtor — `@004cb788` +Release the strip ref (keyed on the name, **before** the free), free the name; **do not** write the base-dtor call (compiler emits `FUN_00444870`). +```cpp +MessageBoard::~MessageBoard() +{ + L4Warehouse *wh = (L4Warehouse *)renderer->warehousePointer; + wh->bitMapBin.Release(stripImage); // FUN_00442c12 + delete[] stripImage; // FUN_004022e8 + stripImage = NULL; +} +``` + +### 4.5 TestInstance — `@004cb7e4` +```cpp +Logical MessageBoard::TestInstance() const { return GraphicGauge::TestInstance(); } // FUN_004448ac +``` +(`@004cb7f4` is an empty no-op virtual slot — `ShowInstance`; omit it and inherit, as `PlayerStatus`/`PilotList` do.) + +### 4.6 SetSource — `@004cb818` (retained; no recovered caller ⇒ deferred) +```cpp +void MessageBoard::SetSource(Entity *mech) { trackedMech = mech; } // this[0x24] = param_2 +``` + +### 4.7 BecameActive — `@004cb7fc` +```cpp +void MessageBoard::BecameActive() +{ + previousNameId = -1; // this[0x27] @0x9c (0xffffffff, :3916) + previousMessageId = -2; // this[0x28] @0xa0 (0xfffffffe, :3917) +} +``` + +### 4.8 Execute — `@004cb82c` (safe reconstruction; faithful draw path via the bridge) +```cpp +void MessageBoard::Execute() +{ + // FAITHFUL LITERAL: the board only draws while a source mech is bound. The + // binder (SetSource @004cb818) has no recovered caller AND the per-player + // status feed (StatusMessagePool, btplayer.cpp) is a NULL stub, so trackedMech + // stays NULL and Execute is a safe no-op == the DEFERRED / empty board. + if (trackedMech == NULL) // binary gate :3949 + return; + + // Message record via the safe bridge (NOT raw *(mech+0x190)/+0x1dc offsets: + // the databinding trap -- our compiled BTPlayer/StatusMessage layout != 1995). + int messageId = -1; + BitMap *nameBitmap = NULL; + BTResolveMessageBoard(trackedMech, &messageId, &nameBitmap); + + // --- message strip cell (:3960-3981) ------------------------------------- + if (messageId != previousMessageId) + { + previousMessageId = messageId; + localView.MoveToAbsolute(0, 0); // vtbl+0x24 :3962 + if (messageId == -1) // no message -> clear + { + localView.SetColor(color); // vtbl+0x18 :3964 + localView.DrawFilledRectangleToRelative(0x80, 0x20); // vtbl+0x4c :3966 + } + else + { + int cellX = (messageId & 3) << 7; // :3969 + int cellY = (messageId >> 2) << 5; // :3970 + localView.SetColor(7); // FUN_004c2f88()==7 :3971 + L4Warehouse *wh = (L4Warehouse *)renderer->warehousePointer; + BitMap *strip = wh->bitMapBin.Get(stripImage); // FUN_00442aec :3974 + if (strip != NULL) + localView.DrawBitMapOpaque(color, 0, strip, // vtbl+0x58 :3976 + cellX, cellY, cellX + 0x7f, cellY + 0x1f); + wh->bitMapBin.Release(stripImage); // FUN_00442c12 :3980 + } + } + + // --- sender name cell (:3983-4009) --------------------------------------- + // Binary tracks the name ENTITY pointer + reads (+0x1e0)->App+0xc8 cache; the + // safe bridge form returns the resolved bitmap directly (App name cache is not + // wired -> NULL -> the "clear" branch, same deferral as PilotList). + int nameState = (nameBitmap != NULL) ? 1 : 0; + if (nameState != previousNameId) + { + localView.MoveToAbsolute(0x80, 0); // vtbl+0x24 (name cell x=128) :3984-3985 + if (nameBitmap == NULL) + { + localView.SetColor(color); // vtbl+0x18 :3987 + localView.DrawFilledRectangleToRelative(0x80, 0x20); // vtbl+0x4c :3989 + } + else + { + localView.SetColor(7); // :4000 + localView.DrawBitMapOpaque(color, 0, nameBitmap, 0, 0, // vtbl+0x58 :4005 + nameBitmap->Data.Size.x - 1, nameBitmap->Data.Size.y - 1); + } + previousNameId = nameState; // :4009 + } +} +``` +GraphicsView vtable slots confirmed from `engine/MUNGA/GRAPH2D.h`: `SetOrigin@0x10:557`, `SetColor@0x18:568`, `MoveToAbsolute@0x24:581`, `DrawFilledRectangleToAbsolute@0x44:621`, `DrawFilledRectangleToRelative@0x4c:624`, `DrawBitMap@0x54:636`, `DrawBitMapOpaque@0x58:656`, `DrawPixelMap8@0x5c:679`. The binary's name-*erase*-previous path uses `DrawBitMap` (vtbl+0x54, `part_014.c:3995`) — collapsed into the clear branch above since no previous bitmap is tracked in the safe bridge form. + +### 4.9 Registration (`btl4grnd.cpp`, before `&BTL4ChainToPrevious` at line 150) +```cpp + &PilotList::methodDescription, // "pilotList" + &GeneratorCluster::methodDescription, // "GeneratorCluster" + &MessageBoard::methodDescription, // "messageBoard" -- sec-MFD comm/status ticker (DEFERRED source) + &BTL4ChainToPrevious +``` +Add `static MethodDescription methodDescription;` to the `MessageBoard` class in `btl4gau3.hpp`. + +--- + +## 5. Systemic-check verdicts + +- **Container-Execute rule:** N/A — `MessageBoard` is a **leaf** `GraphicGauge`, not a container (no child gauges, no `Execute=Fail` base risk). It **overrides `Execute`** (`FUN_004cb82c`) and **overrides `BecameActive`** (`FUN_004cb7fc`) with a **non-inactivating** body (sets sentinels only) → satisfies the rule inherently. ✅ +- **Shadow fields:** none. Derived fields start at `0x90` (`GraphicGauge` ends there); `renderer`/`localView` are inherited base members, accessed by name — no re-declaration. ✅ +- **Alias fields:** none. `trackedMech`/`stripImage`/`color`/`previousNameId`/`previousMessageId` are all genuine new slots (`0x90`–`0xA3`). ✅ +- **Phantom fields:** none — last member `previousMessageId@0xA0` (4 bytes) ends at `0xA4 == sizeof == Make alloc`. ✅ +- **Field mislabels (fix in header):** `enabled`→`trackedMech` (pointer, not bool; setter is `SetSource` not `SetEnable`); `previousMessageId`/`previousNameId` **swapped**. ✅ (§3) +- **Databinding NULL risks:** the raw `*(mech+0x190)`, `*(player+0x1dc)`, `nameEntity+0x1e0`, `App+0xc8` reads are the **databinding trap** — kept **out** of this TU via `BTResolveMessageBoard` (complete-BTPlayer TU). The `bitMapBin.Get` result is NULL-checked (`:3975`) before the strip blit. ✅ +- **Every-mech crash risk:** none. With `trackedMech==NULL` (always, until wired) Execute early-returns — zero draws, zero visual change to the sec-MFD composite, byte-identical to the current parse-skipped behavior. Make/ctor allocate + hold one bitmap ref (released in dtor, per the corrected base-dtor-glue rule — no explicit base call). ✅ +- **`/FORCE` stub risk:** `BTResolveMessageBoard` **must** have a real (stub) definition, or the `/FORCE` link turns the call into a runtime AV (CLAUDE.md gotcha). Provide the returns-`False` stub in `btplayer.cpp`. ⚠ + +--- + +## 6. Confidence + unknowns + +**Confidence: HIGH** for Make/ctor/dtor/BecameActive/TestInstance/SetSource/layout/registration — all fully recovered, sizeof/vtable/offsets cross-checked against the `VertTwoPartBar`/`PlayerStatus`/`PilotList` templates and the GraphicsView vtable header. The widget will **build, register (stop parse-skipping), construct, and run as a safe no-op**. + +**Confidence: HIGH** on the blocker: the board is **DEFERRED/empty** because (1) `SetSource` is never called (no recovered caller) and (2) `StatusMessagePool` is a NULL stub (`btplayer.cpp:135/508`). Both confirmed by grep + source. + +**Unknowns / follow-ups (do not block the landing):** +1. **Who calls `SetSource`.** No caller in the recovered window — likely in the gauge renderer's viewpoint-bind step (`GAUGREND`/`btl4grnd`, not in `part_014.c`). To bring the board **alive** without it, self-resolve in Execute: `trackedMech = (Entity*)application->GetViewpointEntity();` (`APP.h:373`) — the accepted approach `PlayerStatus`/`PilotList` already use. Left as the safe no-op by default to guarantee zero regression on the dev-gauge composite. +2. **The `Player__StatusMessage` record layout** (`+0xc` messageId, `+0x10` nameEntity) and the App+0xc8 name-bitmap cache — needed inside `BTResolveMessageBoard` once `StatusMessagePool` is wired. These live in `btplayer.cpp`'s domain (`Player__StatusMessage` ctor at `:513`); decode `FUN_0042e580`=`AddStatusMessage` and the message record ctor to expose `messageId`/`nameEntity` as compiled accessors. +3. **`btsmsgs.pcx` cell grid** (4 cols × N rows of 128×32) is derived from the `(id&3)<<7,(id>>2)<<5` math (`:3969-3970`), not from the file — verify against the asset when the feed is live. +4. Cosmetic: the empty-state `color==0` clear boxes are never painted in the default landing (guarded off); if self-resolve is enabled later, confirm palette index 0 on the sec MFD is background (else the message region paints black — faithful, but verify visually). \ No newline at end of file diff --git a/scratchpad/wf_1_SectorDisplay_decode.md b/scratchpad/wf_1_SectorDisplay_decode.md new file mode 100644 index 0000000..615bc92 --- /dev/null +++ b/scratchpad/wf_1_SectorDisplay_decode.md @@ -0,0 +1,294 @@ +I now have the complete picture, verified against disassembly, the PE method-description table, the CFG, and the sibling reconstructions. Here is the full implementation spec. + +--- + +# SectorDisplay — Reconstruction Spec + +Cockpit **radar SECTOR X/Z read-out** (the Secondary-overlay grid + two 3-digit coordinate numerics). Config keyword `sectorDisplay`, currently **prose-only** in `game/reconstructed/btl4gau3.cpp` (a placeholder `Make`, no ctor/`methodDescription`/registration) → the CFG line is **parse-skipped**. Everything below is decoded from `BTL4OPT.EXE` (Execute/ctor/vtable disassembled; methodDescription PE-parsed) and cross-checked against `part_014.c` and the already-reconstructed siblings. + +--- + +## 1. Identity + +| Field | Value | Evidence | +|---|---|---| +| Class | `SectorDisplay` | id string `s_SectorDisplay_0051bb34` `part_014.c:2635`; `"sectorDisplay"` keyword `@0x51bc82` | +| Base | `GraphicGauge` (→`GraphicGaugeBackground`→`GaugeBase`); base ctor `FUN_00444818`, base vtable `@0x4ee088` | ctor `@0x4c9e38` calls `0x444818`; `btl4gau3.hpp:97` | +| Config keyword | `sectorDisplay` (1 use, `L4GAUGE.CFG:5146`) | methodDescription name ptr `@0x51a2b0` → `@0x51bc82` | +| **Make** | `@0x4c9d44` (returns `Logical`; alloc `operator new(0xc4)`) | `part_014.c:2625`; disasm | +| ctor | `@0x4c9e10` (sets vtable `0x51beec`, sizeof `0xc4`) | `part_014.c:2654`; disasm | +| dtor | `@0x4c9f94` (slot 0) | `part_014.c:2712` | +| BecameActive | `@0x4ca038` (slot 3, +0x0c) | vtdump `0x51beec` | +| **LinkToEntity(Entity\*)** | `@0x4ca068` (slot 9, +0x24) — *the subject setter* | vtdump; base slot9 `0x444088` = empty `LinkToEntity` (`GAUGE.h:62`) | +| Execute | `@0x4ca07c` (slot 16, +0x40) | vtdump | +| TestInstance | `@0x4ca020` → `FUN_004448ac`→`FUN_004443a4` (base test); `@0x4ca030` = empty no-op (`TestClass`/dead) | `part_014.c:2736,2747` | +| **methodDescription** | `@0x51a2b0` → keyword `@0x51bc82`, Make `0x4c9d44`, 5 param rows | PE dump | +| vtable | `PTR_FUN_0051beec` (17 slots; overrides 0/3/9/16) | vtdump | +| sizeof | **0xC4** (== Make alloc `FUN_00402298(0xc4)`, `@0x4c9d54`) | disasm | +| GUID / RTTI | none | vtable has no RTTI slot | + +**Overridden vtable slots** (vs base `0x4ee088`): slot0 dtor `0x4c9f94`; slot3 `BecameActive` `0x4ca038`; **slot9 `LinkToEntity` `0x4ca068`** (base `0x444088` is an empty `ret`); slot16 `Execute` `0x4ca07c`. All others inherited. + +--- + +## 2. What it displays & the data binding — **DATA-LIVE** + +Two `NumericDisplay`s show the linked mech's **world sector coordinates**, plus a one-shot grid-cell background blit. + +The subject is an **`Entity*`** cached at `+0x90` by the overridden **`LinkToEntity(Entity*)`** (slot 9). The engine `GaugeRenderer::LinkToEntity` (`GAUGREND.cpp:3008`, == binary broadcast `FUN_00447b70` `part_006.c:5295` which calls slot9 on all three gauge lists) pushes the viewpoint entity to every gauge each frame. + +Execute reads the subject's position (disasm `@0x4ca096`–`@0x4ca0b9`): + +``` +numericA value = (int)(-subject->localOrigin.linearPosition.z * 0.01f) + 500 // -Z/100 + 500 +numericB value = (int)( subject->localOrigin.linearPosition.x * 0.01f) + 500 // X/100 + 500 +``` + +- Scale const `@0x4ca194` is the **80-bit extended `0.01`** (= ÷100 → 100-unit sectors); decoded exact. +- `-Z` uses `fchs` `@0x4ca09c`; both truncate toward zero (`FUN_004dcd94` sets FPU RC=chop `or 0xc`, `fistp` — it is `(long)`, **not** round-to-nearest). +- `entity+0x100` == `Entity::localOrigin.linearPosition` is **already established** by the reconstructed radar (`btl4rdr.cpp:150,622` `FUN_00408440(this+0x310, owner+0x100)`); `.x@+0x100, .z@+0x108`. `Origin localOrigin` is a base-`Entity` member (`ENTITY.h:140`, `ORIGIN.h:15`), read via the **engine type** (compiled-consistent) — **not** a raw offset, so no databinding-trap garbage. +- Heading is **not** read (the task's "heading" hint is inaccurate — only X/Z position feed the two numerics). + +**LIVE now**, with one caveat: the radar notes the renderer's linked-entity socket "may be unwired on WinTesla" (`btl4rdr.cpp:1029`). Mitigation (faithful to intent, same as `ResolveOperatorEntity`/`HeadingPointer::Execute`): when `subject==NULL`, fall back to `application->GetViewpointEntity()`. The grid background blits once (dirty-gated) from cell 12 of the `helv15.pcc` strip; if that image isn't cached the blit is skipped and Make warns `"SectorDisplay: Missing image …"` (`@0x4c9e91` peek). + +--- + +## 3. Class layout (byte-exact) + locks + +⚠ The **current `btl4gau3.hpp` layout is wrong** (mislabels `+0x90` as `enabled`, omits `+0xA8` and the `+0xB8` dirty flag, mislabels the two `500` offsets as `baseLine/dirty`). Corrected from ctor/Execute disasm: + +```cpp +class SectorDisplay : public GraphicGauge +{ +public: + static MethodDescription methodDescription; // register "sectorDisplay" + static Logical Make(int, Vector2DOf, Entity *, GaugeRenderer *); // @0x4c9d44 + SectorDisplay(GaugeRate, ModeMask, L4GaugeRenderer *, + int graphics_port_number, int x, int y, + const char *image, int color, int ok_color, + const char *identification_string); // @0x4c9e10 (10 args; owner folded to 0) + ~SectorDisplay(); // @0x4c9f94 + Logical TestInstance() const; // @0x4ca020 + void LinkToEntity(Entity *entity); // @0x4ca068 (slot 9 override) + void BecameActive(); // @0x4ca038 (slot 3) + void Execute(); // @0x4ca07c (slot 16) +protected: + Entity *subject; // @0x90 this[0x24] LinkToEntity target (linked mech); ctor=0 + char *gridImage; // @0x94 this[0x25] interned image name (helv15.pcc) + int cellWidth; // @0x98 this[0x26] imageWidth / 14 + int gridLeft; // @0x9C this[0x27] cellWidth*12 + int gridRight; // @0xA0 this[0x28] cellWidth*13 - 1 + int gridHeight; // @0xA4 this[0x29] imageHeight + int numericColor; // @0xA8 this[0x2A] param_10 (numeric color) + int gridColor; // @0xAC this[0x2B] param_11 (grid blit color + numeric okColor) + int offsetX; // @0xB0 this[0x2C] = 500 (added to numericA) + int offsetY; // @0xB4 this[0x2D] = 500 (added to numericB) + int dirty; // @0xB8 this[0x2E] redraw flag (BecameActive=1, Execute clears) + NumericDisplay *numericA; // @0xBC this[0x2F] -Z sector readout + NumericDisplay *numericB; // @0xC0 this[0x30] X sector readout + // sizeof == 0xC4 +}; +``` + +**Locks** — use the **overflow lock only** (matching the sibling widgets: the 2007 `GraphicGauge` base is not byte-identical to the 1995 base, so `subject@0x90`/`sizeof==0xC4` byte-exact asserts would fail; every read here is via named members / the engine `Entity` type, so byte-exactness is not required): + +```cpp +// namespace scope (sizeof needs no friend); the class reads NO raw this-offsets, so this +// overflow lock against the Make alloc is the load-bearing guarantee (like Sensor/heat-leaf): +static_assert(sizeof(SectorDisplay) <= 0xC4, "SectorDisplay must fit its 0xC4 Make alloc"); +``` + +(If a future reader wants the offset asserts anyway, they require a `friend struct SectorDisplayLayoutCheck` and will only pass if the engine `GraphicGauge` happens to end at 0x90 — do **not** gate the build on that.) + +--- + +## 4. Full method bodies + +```cpp +//======================= btl4gau3.cpp (replace the prose-only SectorDisplay block) ======================= + +// @0x51a2b0 -- registered so the interpreter builds "sectorDisplay(K,ModeAlwaysActive,helv15.pcc,0,3)". +// CFG shape (L4GAUGE.CFG:5146, port=overlay, offset=(125,579)): +// sectorDisplay( K, ModeAlwaysActive, helv15.pcc, 0, 3 ) +// | | | | +-- p[4] color=3 -> gridColor / numeric okColor +// | | | +----- p[3] color=0 -> numericColor +// | | +----------------- p[2] string -> grid/font image +// | +----------------------------------- p[1] modeMask -> ModeAlwaysActive +// +-------------------------------------- p[0] rate -> 'K' +// (position (125,579) and the overlay port index arrive via Make's args, not config tokens.) +MethodDescription + SectorDisplay::methodDescription = + { + "sectorDisplay", + SectorDisplay::Make, + { + { ParameterDescription::typeRate, NULL }, // p[0] rate [binary row0 type=1 @0x51a2b8] + { ParameterDescription::typeModeMask, NULL }, // p[1] modeMask [row1 type=2 @0x51a2fc] + { ParameterDescription::typeString, NULL }, // p[2] image [row2 type=9 @0x51a340] + { ParameterDescription::typeColor, NULL }, // p[3] color [row3 type=4 @0x51a384] + { ParameterDescription::typeColor, NULL }, // p[4] okColor [row4 type=4 @0x51a3c8] + PARAMETER_DESCRIPTION_END // [row5 type=0 @0x51a40c] + } + }; + +// @0x4c9d44 -- Make. Alloc 0xc4 + construct; then verify the grid image exists +// (warn "SectorDisplay: Missing image "). Returns True iff the image is cached +// (binary-faithful: the object self-registers via the base ctor regardless of the return). +Logical + SectorDisplay::Make( + int display_port_index, + Vector2DOf position, + Entity * /*entity -- unused*/, + GaugeRenderer *gauge_renderer) +{ + ParameterDescription *p = methodDescription.parameterList; + + SectorDisplay *gauge = (SectorDisplay *)operator new(0xc4); // FUN_00402298(0xc4) + if (gauge != NULL) + new (gauge) SectorDisplay( + p[0].data.rate, p[1].data.modeMask, + (L4GaugeRenderer *)gauge_renderer, + display_port_index, // graphics_port_number (FIX: was 0) + position.x, position.y, // SetOrigin (FIX: was 0,0) + p[2].data.string, // grid/font image (helv15.pcc) + p[3].data.color, // numericColor + p[4].data.color, // gridColor / numeric okColor + "SectorDisplay"); + + BitMap *grid = ((L4Warehouse *)gauge_renderer->warehousePointer) // renderer+0x4c + ->bitMapBin.GetIfAlreadyExists(p[2].data.string); // FUN_00442aec (peek) + if (grid == NULL) + DebugStream << "SectorDisplay: Missing image " << p[2].data.string << "\n"; // FUN_004dbb24 x3 + return (grid != NULL); +} + +// @0x4c9e10 -- ctor (vtable 0x51beec). GraphicGauge base (owner=0); intern the image; +// cellWidth=imgW/14, gridLeft=cellWidth*12, gridRight=cellWidth*13-1, gridHeight=imgH; +// SetOrigin(x,y); build the two 3-digit NumericDisplays (unsignedFormat). +SectorDisplay::SectorDisplay( + GaugeRate rate, ModeMask mode_mask, L4GaugeRenderer *renderer_in, + int graphics_port_number, int x, int y, + const char *image, int color, int ok_color, const char *identification_string) + : GraphicGauge(rate, mode_mask, renderer_in, 0, // FUN_00444818, owner=0 + graphics_port_number, identification_string) +{ + gridImage = InternName(image); // FUN_004700ac (dtor FreeName's it) + numericColor = color; // this[0x2A] (param_10) + gridColor = ok_color; // this[0x2B] (param_11) + subject = NULL; // this[0x24] + offsetY = 500; // this[0x2D] (@0x4c9e6d 0x1f4) + offsetX = 500; // this[0x2C] (@0x4c9e77 0x1f4) + + L4Warehouse *wh = (L4Warehouse *)renderer_in->warehousePointer; // renderer+0x4c + BitMap *img = wh->bitMapBin.Get(gridImage); // FUN_00442aec (held; dtor Releases) + if (img == NULL) { + cellWidth = gridLeft = gridRight = gridHeight = 0; + } else { + cellWidth = img->Data.Size.x / 14; // img+0xc = width (@0x4c9ec1) + gridLeft = cellWidth * 12; // @0x4c9ed4 (shl 2, *3) + gridRight = cellWidth * 12 + cellWidth - 1; // @0x4c9ee6 + gridHeight = img->Data.Size.y; // img+0x10 = height (@0x4c9ef5) + } + localView.SetOrigin(x, y); // this+0x48 vtbl+0x10 (@0x4c9f0d) + + // NumericDisplay(warehouse, x, y, font, fieldWidth=3, format=unsignedFormat(0), color, okColor) + numericA = new NumericDisplay(wh, 0, 0, image, 3, + NumericDisplay::unsignedFormat, color, ok_color); // this[0x2F] + numericB = new NumericDisplay(wh, cellWidth * 4, 0, image, 3, // @0x4c9f6f shl 2 + NumericDisplay::unsignedFormat, color, ok_color); // this[0x30] + + dirty = 1; // binary leaves this[0x2E] uninit (BecameActive sets it before Execute); init for safety +} + +// @0x4c9f94 -- dtor. Release grid, free name, delete both numerics. The base +// GraphicGauge::~GraphicGauge (FUN_00444870) runs IMPLICITLY -- do NOT call it. +SectorDisplay::~SectorDisplay() +{ + ((L4Warehouse *)renderer->warehousePointer)->bitMapBin.Release(gridImage); // FUN_00442c12 + FreeName(gridImage); gridImage = NULL; // FUN_004022e8 + delete numericA; numericA = NULL; // FUN_0047018c + delete numericB; numericB = NULL; +} + +// @0x4ca020 -- TestInstance: out-of-line forward to the base (so it isn't /FORCE-stubbed). +Logical + SectorDisplay::TestInstance() const { return GraphicGauge::TestInstance(); } + +// @0x4ca068 -- LinkToEntity (slot 9): cache the renderer's linked entity as the subject. +void + SectorDisplay::LinkToEntity(Entity *entity) { subject = entity; } + +// @0x4ca038 -- BecameActive (slot 3): mark dirty + reset both numerics. NON-inactivating +// (does NOT call the base) -> satisfies the container-Execute rule. +void + SectorDisplay::BecameActive() +{ + dirty = 1; // this[0x2E] + numericB->ForceUpdate(); // FUN_004703f4 (order B then A, @0x4ca03e/0x4ca04f) + numericA->ForceUpdate(); +} + +// @0x4ca07c -- Execute (slot 16): draw the two sector numerics from the linked mech's +// world X/Z; on the first active frame blit the grid-cell background. +void + SectorDisplay::Execute() +{ + Entity *s = subject; + // PORT accommodation (marked): the LinkToEntity broadcast may be unwired on WinTesla -> + // fall back to the viewpoint mech (same pattern as btl4rdr ResolveOperatorEntity). + // The binary gates purely on `subject != 0` (@0x4ca08e). + if (s == NULL && application != NULL) + s = (Entity *)application->GetViewpointEntity(); + if (s == NULL) + return; + + const Point3D &pos = s->localOrigin.linearPosition; // s+0x100 (x@+0x100, z@+0x108) + int vA = (int)(-pos.z * 0.01f) + offsetX; // @0x4ca096 ftol(chop) + int vB = (int)( pos.x * 0.01f) + offsetY; // @0x4ca0ad + numericA->Draw(&localView, (Scalar)vA); // FUN_00470430 + numericB->Draw(&localView, (Scalar)vB); + + if (dirty) { // @0x4ca10f + dirty = 0; + BitMap *grid = ((L4Warehouse *)renderer->warehousePointer) + ->bitMapBin.GetIfAlreadyExists(gridImage); // FUN_00442aec + if (grid != NULL) { + localView.MoveToAbsolute(cellWidth * 3, 0); // vtbl+0x24 @0x4ca152 + localView.SetColor(gridColor); // vtbl+0x18 @0x4ca163 + localView.DrawBitMap(0 /*rotation*/, grid, // vtbl+0x54 @0x4ca187 + gridLeft, 0, gridRight, gridHeight); // source rect + } + } +} +``` + +**Registration** — `game/reconstructed/btl4grnd.cpp`, in `BTL4MethodDescription[]` immediately before `&BTL4ChainToPrevious` (`btl4grnd.cpp:149`): + +```cpp + &SectorDisplay::methodDescription, // "sectorDisplay" -- radar SECTOR X/Z read-out (Secondary overlay) +``` + +`SectorDisplay` is already reachable there (`btl4grnd.cpp:71` includes `btl4gau3.hpp`). + +--- + +## 5. Systemic-check verdicts + +- **Container-Execute override:** ✅ satisfied. `Execute` (slot 16) and `BecameActive` (slot 3, non-inactivating) are both overridden, so the base `Gauge::Execute` `Fail`→`abort()` is never reached. The two `NumericDisplay`s are **private sub-objects drawn directly** (not registered gauges), so there's no child-`Execute`/`GuardedExecute` recursion. +- **Shadow fields:** none vs the engine base — `subject@0x90` is the first subclass field (base `GraphicGauge` ends before 0x90). The failures found were **internal layout bugs in the current header** (`enabled`↔`subject`, missing `+0xA8`/`+0xB8`, `baseLine/dirty`↔`offsetX/offsetY`), fixed in §3. +- **Alias / phantom:** none. `numericColor@0xA8` is a real stored field (consumed only by the child ctors, never re-read — faithful, not phantom); `offsetX/offsetY` are two independent `500`s; all members lie within `sizeof 0xC4`. +- **Databinding NULL risks:** all guarded — `subject==NULL` early-returns (+viewpoint fallback); missing grid image → `GetIfAlreadyExists` NULL → blit skipped + Make warns; `renderer->warehousePointer` always set by the base. Add a `numericA/numericB != NULL` guard before `Draw` if you keep the binary's `new`-can-fail branch (`@0x4c9f20`). +- **Every-mech crash risk:** ✅ none. This is a **single cockpit gauge** built once for the local pod; it reads the **linked/viewpoint** entity's `localOrigin.linearPosition` through the **engine `Entity` type** (compiled-consistent), never a raw `*(T*)(entity+0xNN)`. It does not iterate mechs and is not per-mech. + +--- + +## 6. Confidence & unknowns + +**Confidence: HIGH.** Full function set disassembled (Execute/ctor/dtor/BecameActive/LinkToEntity/vtable), `methodDescription` PE-parsed exact (keyword + 5 typed rows), the `0.01`/`÷100` const decoded, the CFG shape confirmed, and the position binding (`localOrigin.linearPosition`) is the exact mapping the reconstructed radar already uses. + +**Unknowns / follow-ups (none blocking):** +1. Whether `GaugeRenderer::LinkToEntity` is broadcast with a real viewpoint in the port. The `application->GetViewpointEntity()` fallback makes the gauge LIVE either way; if you confirm the broadcast fires, the fallback is inert. +2. `InternName`/`FreeName` (`FUN_004700ac`/`FUN_004022e8`) exact engine symbols — if `NumericDisplay`'s ctor copies the font name internally (siblings pass `p[2].data.string` uncopied), you may store `p[2].data.string` directly and drop the intern/free pair. Cosmetic. +3. `bitMapBin.Get`(ctor, held) vs `GetIfAlreadyExists`(peek) ref-counting — both compile; the ctor `Get` is balanced by the dtor `Release` (binary-faithful). If `Get`/`Release` aren't symmetric on the WinTesla `L4Warehouse`, use `GetIfAlreadyExists` in the ctor and drop the dtor `Release`. +4. `FUN_004ca030` (empty `ret`) is an unreferenced `TestClass`/dead stub — not needed for function. +5. Visual semantics of the blitted cell-12 sub-rect of `helv15.pcc` (`gridLeft=cellWidth*12`) are replicated exactly but not eyeballed; verify against pod footage when the Secondary overlay is composited (`BT_DEV_GAUGES`). \ No newline at end of file diff --git a/scratchpad/wf_2_PrepEngr_decode.md b/scratchpad/wf_2_PrepEngr_decode.md new file mode 100644 index 0000000..da3e5e3 --- /dev/null +++ b/scratchpad/wf_2_PrepEngr_decode.md @@ -0,0 +1,390 @@ +I now have complete, definitive coverage. The `vtables.tsv` row `0051a040` shows PrepEngr's slots `…4c7d14 4173b8 417938 4c7e48…` — byte-identical in shape to BackgroundBitmap's `…471d7c 4173b8 417938 471dec…` (dtor, 2 inherited, **BecameActive**). This confirms `FUN_004c7e48` is the **BecameActive** slot and PrepEngrScreen is a `GraphicGaugeBackground`. Everything is traced. Here is the full spec. + +--- + +# PrepEngrScreen — decode & reconstruction spec (config keyword `prepEngr`) + +> **Bottom line up front:** the existing `btl4gau2.hpp` stub for `PrepEngrScreen` is **wrong in three ways** and there is **no `methodDescription`/`Make`**, so `prepEngr(...)` is parse-skipped (12 CFG calls never build). It is NOT an `Execute`-driven `Gauge` with a child chain — it is a **`GraphicGaugeBackground` painted on activation** (identical base/vtable shape to the engine's `BackgroundBitmap`). Corrections: (1) base = `GraphicGaugeBackground`, not `Gauge`; (2) the overridden slot is `BecameActive()`, not `Execute()`; (3) `screenNumber@0x6C` and `mech@0x70` are **swapped** in the stub. + +--- + +## 1. Identity + +| Field | Value | Citation | +|---|---|---| +| Class name | `PrepEngrScreen` | id-string `s_PrepEngr_00519a9d` = `"PrepEngr"`, part_014.c:1193 | +| Config keyword | `prepEngr` | L4GAUGE.CFG:4595…4759 (12×); it is the methodDescription's first string (distinct from the `"PrepEngr"` id-string) | +| Base class | **`GraphicGaugeBackground`** (`GaugeBase`→…→localView, **no** rate/Execute) | ctor calls base `FUN_004440d4` (part_014.c:1213); `FUN_004440d4` = GraphicGaugeBackground ctor `(mode,renderer,ownerID,port,idstr)` → localView(GraphicsViewRecord) at **+0x24 / index 9** (part_006.c @004440d4), identical to `BackgroundBitmap` (part_009.c @00471d00) | +| ctor | `@004c7bf0` (`FUN_004c7bf0`) | part_014.c:1204 | +| dtor | `@004c7d14` (`FUN_004c7d14`) | part_014.c:1246 | +| **BecameActive** (the paint) | `@004c7e48` (`FUN_004c7e48`) | part_014.c:1288 | +| Make (config factory) | `@004c7b30` (`FUN_004c7b30`) | part_014.c:1172 | +| methodDescription | in `.rdata` (**not exported** by the fn-only decompiler) — reconstruct from the CFG call shape | — | +| vtable | `PTR_FUN_0051a06c` | part_014.c:1214,1252 | +| sizeof | **0x90** (= `FUN_00402298(0x90)` in Make) | part_014.c:1189 | +| GUID / classID | none (GraphicGaugeBackground carries no distinct classID; it's not roster-registered) | — | + +**Vtable-slot proof** (`reference/decomp/vtables.tsv`, row `0051a040`): `… 4c7d14 4173b8 417938 4c7e48 …` — the exact same shape as BackgroundBitmap (row `004fb918`): `… 471d7c 4173b8 417938 471dec …`. i.e. `[dtor][inherited][inherited][BecameActive]`. Only **dtor + BecameActive** are overridden; everything else is inherited (`444xxx` base slots). `TestInstance` is non-virtual (GAUGE.h:46) → not a vtable override. + +--- + +## 2. What it displays & data binding + +**`prepEngr` = "PREPARE the engineering screen":** a **static per-screen label overlay** for one of the 12 MFD engineering screens (`ModeMFD{1,2,3}Eng{1..4}` → screen numbers 1..12; CFG:4595-4769). It is **not** the live bars/dials — those come from `vehicleSubSystems`/`SubsystemCluster`. `PrepEngrScreen` paints, **once each time its screen becomes active**, the labels appropriate to the **one subsystem assigned to that screen**. + +`BecameActive` (`@004c7e48`) walks the mech's subsystem roster, finds the **first** subsystem whose `auxScreenNumber == this->screenNumber`, and paints: + +| Element | Source | Where drawn | Live now? | +|---|---|---|---| +| screen-number numeric (2 digits) | `this->screenNumber` (own member) | (0xE9,0x176) | **LIVE** (own field) | +| linked heat-sink numeric (1 digit) | `ResolveLink(AttributePointerOf(sub,"HeatSink")) + 0x1D4` | (0x15E,5) | **DEFERRED** — raw offset on the resolved sink (databinding risk; guard NULL) | +| subsystem label bitmap | `sub + 0x224` (embedded char[] = a `.pcc` name) | (0x125,0x172) | **DEFERRED** — raw subsystem offset, not a byte-exact field; use the `BTGetSubsystemAuxScreen` label bridge instead | +| type-specific label cells | `this->statusImage[1..6]` dispatched by `sub->GetClassID()` | fixed cells via `DrawStatusCells` | **LIVE** (own members + classID accessor) | + +**ClassID → label dispatch** (`switch(sub+4)`, part_014.c:1330-1357; images are `this[0x1D..0x23]`, byte 0x74..0x8C): + +| ClassID | Subsystem | `DrawStatusCells(topBox, A, B, C)` | +extra | +|---|---|---|---| +| 0xBC3 | Sensor | `(1, –, –, –)` | draw `statusImage[6]`=`btesrnge.pcc` @(0xB8,0x8C) — part_014.c:1332-1334 | +| 0xBC6 | Myomers | `(0, –, img5=espeed, img3=bteslev)` | part_014.c:1339 | +| 0xBC8 / 0xBD4 | Emitter / PPC | `(0, img1=escnd, img2=edmg, img3=bteslev)` | part_014.c:1344 | +| 0xBCD / 0xBD0 | ProjectileWeapon / MissileLauncher | `(1, –, –, img4=bteunjm)` | part_014.c:1349 | +| 0xBCE | GaussRifle | warn *"…Gauss rifle not yet supported"* + `(1, –, –, img3=bteslev)` | part_014.c:1353-1354 | +| default | — | nothing (return) | part_014.c:1336 | + +**Databinding-safe roster access** (the trap: reconstructed `Mech` is 0x638 vs binary 0x854, so raw `mech+0x124/+0x128` read garbage). Use the same accessors the sibling `VehicleSubSystems::Make` uses (btl4gau2.cpp:1621-1636): `entity->GetSubsystemCount()`, `entity->GetSubsystem(i)`, and `BTGetSubsystemAuxScreen(sub,&auxScreen,&placement,label64)` (declared btl4gau2.cpp:151) — the bridge both applies the `FUN_0041a1a4(**(sub+0xc),0x50f4bc)` PoweredSubsystem type filter (part_014.c:1308) **and** returns `auxScreenNumber` (`sub+0x1DC`, part_014.c:1309), replacing the two raw reads. + +**Content** (from all 12 CFG calls, identical param set, CFG:4595-4605): font `helv42.pcc`; labels `escnd.pcc`(sensor) `edmg.pcc`(damage) `bteslev.pcc`(seek/energy level) `bteunjm.pcc`(unjam) `espeed.pcc`(speed) `btesrnge.pcc`(range). + +--- + +## 3. Class layout (byte-exact) + locks + +Binary layout (from ctor `FUN_004c7bf0` int-index writes = byte N×4, and the `FUN_00402298(0x90)` alloc): + +``` +GraphicGaugeBackground base .......... 0x00 .. 0x23 (GaugeBase fields incl. renderer@0x1C) + localView (GraphicsView) ........... 0x24 .. 0x6B (GraphicsViewRecord, init'd by FUN_0044ad78) + screenNumber int ................. 0x6C this[0x1B] (param_7; part_014.c:1216) ← NOT mech + mech Entity* ............. 0x70 this[0x1C] (param_6; part_014.c:1215) ← NOT screenNumber + statusImage[0] char* (font helv42) . 0x74 this[0x1D] (part_014.c:1218) + statusImage[1] char* (escnd) ....... 0x78 this[0x1E] (:1220) + statusImage[2] char* (edmg) ........ 0x7C this[0x1F] (:1222) + statusImage[3] char* (bteslev) ..... 0x80 this[0x20] (:1224) + statusImage[4] char* (bteunjm) ..... 0x84 this[0x21] (:1226) + statusImage[5] char* (espeed) ...... 0x88 this[0x22] (:1228) + statusImage[6] char* (btesrnge) .... 0x8C this[0x23] (:1230) +sizeof = 0x90 +``` + +> ⚠ The current `btl4gau2.hpp:318-320` stub has `mech@0x6C` / `screenNumber@0x70` **swapped** and base `Gauge`. Both must change. + +Because the reconstruction's `GraphicGaugeBackground`/`GraphicsView` are **not** byte-exact to the 1995 layout, do **not** emit `offsetof` locks against the binary offsets for the own fields (they'd fail like `Sensor`/heat-leaf). The only load-bearing size fact is the Make alloc; assert only that the compiled object **fits** the binary alloc: + +```cpp +static_assert(sizeof(PrepEngrScreen) <= 0x90, "PrepEngrScreen exceeds binary alloc 0x90"); +``` + +(If you `new PrepEngrScreen` normally rather than `operator new(0x90)`, even this is optional — no external code reads PrepEngrScreen at raw offsets.) + +--- + +## 4. Full bodies to write + +### 4a. Header (replace the stub at `btl4gau2.hpp:304-322`) + +```cpp + //####################################################################### + // PrepEngrScreen -- "prepEngr": the per-engineering-screen STATIC label + // overlay. @004c7b30 Make / @004c7bf0 ctor / @004c7d14 dtor / + // @004c7e48 BecameActive. vtable PTR_FUN_0051a06c. + // + // A GraphicGaugeBackground (paint-on-activation, NOT an Execute gauge -- + // same base/shape as the engine's BackgroundBitmap, FUN_00471d00). Interns + // 7 status .pcc's (font + 6 labels) and, when its MFD-Eng screen activates, + // paints the labels for the ONE subsystem whose auxScreenNumber == this + // screen (1..12), dispatched by the subsystem's ClassID. + //####################################################################### + class PrepEngrScreen : + public GraphicGaugeBackground + { + public: + static MethodDescription methodDescription; + static Logical Make(int, Vector2DOf, Entity *, GaugeRenderer *); // @004c7b30 + PrepEngrScreen( // @004c7bf0 + ModeMask, L4GaugeRenderer *, unsigned int owner_ID, + int graphics_port_number, Entity *mech, int screen_number, + const char *img0/*font*/, const char *img1, const char *img2, + const char *img3, const char *img4, const char *img5, + const char *img6, const char *identification_string = "PrepEngr"); + ~PrepEngrScreen(); // @004c7d14 + void BecameActive(); // @004c7e48 (the paint slot -- NOT Execute) + protected: + int screenNumber; // @0x6C this[0x1B] + Entity *mech; // @0x70 this[0x1C] + char *statusImage[7]; // @0x74 this[0x1D..0x23] (interned .pcc names) + }; +``` + +### 4b. Implementation (add to `btl4gau2.cpp`, replacing the prose block at 819-851) + +```cpp +//########################################################################### +// PrepEngrScreen -- "prepEngr" @004c7b30 Make / @004c7bf0 ctor / +// @004c7d14 dtor / @004c7e48 BecameActive. A GraphicGaugeBackground. +//########################################################################### + +// ---- FUN_004c79c8 : draw the 3 status-label cells (+ optional top erase box). +// Each cell either blits its label .pcc or blanks the cell. Coords are the +// binary's exact absolute cell rectangles (part_014.c:1127-1166). +static void + DrawStatusCells(GraphicsView *view, L4Warehouse *warehouse, + int topBox, const char *A, const char *B, const char *C) +{ + if (topBox) // part_014.c:1131-1135 + { + view->SetColor(0); + view->MoveToAbsolute(0x97, 0x80); + view->DrawFilledRectangleToAbsolute(0x17d, 0x13b); + } + if (A == NULL) { view->SetColor(0); view->MoveToAbsolute(0x15a,0x145); // :1136-1140 + view->DrawFilledRectangleToAbsolute(0x17f,0x159); } + else { view->SetColor(0xff); DrawPortBackground(view,warehouse,0x15a,0x145,A); } // FUN_004c2ec4 + if (B == NULL) { view->SetColor(0); view->MoveToAbsolute(0x85,0x58); // :1145-1149 + view->DrawFilledRectangleToAbsolute(0x17f,0x7c); } + else { view->SetColor(0xff); DrawPortBackground(view,warehouse,0x85,0x58,B); } + if (C == NULL) { view->SetColor(0); view->MoveToAbsolute(0x2a,0x34); // :1154-1160 + // NB: raw uses GraphicsView vtbl+0x4c(99,10) then MoveToAbsolute(10,0) + // then DrawFilledRectangleToAbsolute(0x9f,0x2d) -- a compound blank. + // vtbl+0x4c is an unresolved GraphicsView slot; a plain fill is close: + view->DrawFilledRectangleToAbsolute(0x9f,0x2d); } + else { view->SetColor(0xff); DrawPortBackground(view,warehouse,0x2a,0x34,C); } +} + +// CFG shape (L4GAUGE.CFG:4595): mode, int screen(1..12), then 7 .pcc names +// (font + 6 labels). 9 params. +MethodDescription + PrepEngrScreen::methodDescription = + { + "prepEngr", + PrepEngrScreen::Make, + { + { ParameterDescription::typeModeMask, NULL }, // p[0] mode (ModeMFD*Eng*) + { ParameterDescription::typeInteger, NULL }, // p[1] screen number 1..12 + { ParameterDescription::typeString, NULL }, // p[2] font helv42.pcc -> statusImage[0] + { ParameterDescription::typeString, NULL }, // p[3] escnd.pcc -> statusImage[1] + { ParameterDescription::typeString, NULL }, // p[4] edmg.pcc -> statusImage[2] + { ParameterDescription::typeString, NULL }, // p[5] bteslev.pcc -> statusImage[3] + { ParameterDescription::typeString, NULL }, // p[6] bteunjm.pcc -> statusImage[4] + { ParameterDescription::typeString, NULL }, // p[7] espeed.pcc -> statusImage[5] + { ParameterDescription::typeString, NULL }, // p[8] btesrnge.pcc -> statusImage[6] + PARAMETER_DESCRIPTION_END + } + }; + +// +// @004c7b30 -- Make. Validate the screen number (p[1], must be 1..12) then +// construct. The GraphicGaugeBackground base ctor self-registers with the +// renderer (GAUGE.cpp GaugeBase::GaugeBase -> renderer->Add(this)), so the +// gauge's BecameActive fires whenever its Eng screen is selected. +// +Logical + PrepEngrScreen::Make( + int display_port_index, + Vector2DOf /*position -- ignored; PrepEngr draws at absolute coords*/, + Entity *entity, + GaugeRenderer *gauge_renderer + ) +{ + ParameterDescription *p = methodDescription.parameterList; + + int screen = p[1].data.integer; + if (screen < 1 || screen > 12) // part_014.c:1182 + { + DebugStream << "PrepEngr: screen number out of range " << screen << "\n"; // :1183-1185 + return False; // raw returns 0 + } + + // operator new(0x90) + placement-new to mirror FUN_00402298(0x90) (:1189). + PrepEngrScreen *g = (PrepEngrScreen *)operator new(0x90); + if (g != NULL) + new (g) PrepEngrScreen( + p[0].data.modeMask, // mode (ModeMFD*Eng*) + (L4GaugeRenderer *)gauge_renderer, + 0, // owner_ID (raw hard-wires 0) + display_port_index, // graphics_port_number + entity, // mech (Make param_4) + screen, // screen number + p[2].data.string, p[3].data.string, p[4].data.string, + p[5].data.string, p[6].data.string, p[7].data.string, + p[8].data.string, + "PrepEngr"); + return True; // raw returns 1 +} + +// +// @004c7bf0 -- ctor. GraphicGaugeBackground base (mode/renderer/0/port/"PrepEngr"); +// store screen + mech; nameCopy the 7 images and pre-load (AddRef) each from the +// bitmap cache. (No SetOrigin -- localView keeps its default origin.) +// +PrepEngrScreen::PrepEngrScreen( + ModeMask mode_mask, L4GaugeRenderer *renderer_in, unsigned int owner_ID, + int graphics_port_number, Entity *mech_in, int screen_number, + const char *img0, const char *img1, const char *img2, const char *img3, + const char *img4, const char *img5, const char *img6, + const char *identification_string +): + GraphicGaugeBackground(mode_mask, renderer_in, owner_ID, // FUN_004440d4 + graphics_port_number, identification_string) +{ + screenNumber = screen_number; // @0x6C (param_7, :1216) + mech = mech_in; // @0x70 (param_6, :1215) + + const char *src[7] = { img0,img1,img2,img3,img4,img5,img6 }; + L4Warehouse *warehouse = (L4Warehouse *)renderer_in->warehousePointer; // renderer+0x4c + for (int i = 0; i < 7; i++) + { + statusImage[i] = nameCopy(src[i]); // FUN_004700ac (:1217-1230) + warehouse->bitMapBin.Get(statusImage[i]); // FUN_00442aec pre-load/AddRef (:1232-1238) + } +} + +// +// @004c7d14 -- dtor. Release the 7 pre-loaded images + free their name copies. +// (The localView + base dtor run implicitly via the C++ epilogue -- do NOT emit +// explicit FUN_0044ae0c/FUN_00443f7c calls; they are compiler glue, per the +// reconstruction destructor rule.) +// +PrepEngrScreen::~PrepEngrScreen() +{ + L4Warehouse *warehouse = (L4Warehouse *)renderer->warehousePointer; + for (int i = 0; i < 7; i++) + { + warehouse->bitMapBin.Release(statusImage[i]); // FUN_00442c12 (:1254-1260) + delete[] statusImage[i]; // FUN_004022e8 (:1261-1274) + statusImage[i] = NULL; + } +} + +// +// @004c7e48 -- BecameActive. Find the subsystem on this screen and paint its +// labels. (Roster/aux-screen read via the databinding-safe accessors + the +// PoweredSubsystem bridge, exactly like VehicleSubSystems::Make.) +// +void + PrepEngrScreen::BecameActive() +{ + if (mech == NULL) return; + L4Warehouse *warehouse = (L4Warehouse *)renderer->warehousePointer; // this[0x1C]->+0x4c + const char *font = statusImage[0]; // helv42.pcc + + int count = mech->GetSubsystemCount(); // mech+0x124 + for (int i = 1; i < count; i++) // skip slot 0 (the controls mapper) + { + Subsystem *sub = mech->GetSubsystem(i); // mech+0x128[i] + if (sub == NULL) continue; + + int auxScreen = 0, placement = -1; char label64[64]; + if (!BTGetSubsystemAuxScreen(sub, &auxScreen, &placement, label64)) // FUN_0041a1a4 filter + sub+0x1dc + continue; // not a PoweredSubsystem-derived weapon + if (auxScreen != screenNumber) // part_014.c:1309 + continue; + + // ---- numeric #1 : the screen number, 2 digits @(0xE9,0x176) (:1310-1313) + { + NumericDisplay num(warehouse, 0xe9, 0x176, font, 2, + NumericDisplay::unsignedFormat, 0, 0xff); // FUN_004700bc + num.Draw(&localView, (Scalar)screenNumber); // FUN_00470430 + } // ~NumericDisplay = FUN_0047018c + + // ---- numeric #2 : linked heat-sink number, 1 digit @(0x15E,5) (:1315-1321) + int hsNumber = 0; + void *hsLink = AttributePointerOf(sub, "HeatSink"); // FUN_0041bfc0 + Subsystem *hs = (Subsystem *)ResolveLink(hsLink); // FUN_00417ab4 + if (hs != NULL) + hsNumber = *(int *)((char *)hs + 0x1d4); // BEST-EFFORT raw (see §6) + { + NumericDisplay num(warehouse, 0x15e, 5, font, 1, + NumericDisplay::unsignedFormat, 0, 0xff); + num.Draw(&localView, (Scalar)hsNumber); + } + + // ---- subsystem label bitmap @(0x125,0x172) (:1322-1329) + // Raw draws the .pcc name at sub+0x224; use the aux-screen label bridge + // (label64) for a databinding-safe equivalent. (BEST-EFFORT; see §6.) + localView.SetColor(0xff); + if (label64[0] != '\0') + DrawPortBackground(&localView, warehouse, 0x125, 0x172, label64); + + // ---- type-specific label cells (switch on ClassID, :1330-1357) + switch (sub->GetClassID()) // sub+4 + { + case 0xBC3: // Sensor + DrawStatusCells(&localView, warehouse, 1, NULL, NULL, NULL); + localView.SetColor(0xff); + DrawPortBackground(&localView, warehouse, 0xb8, 0x8c, statusImage[6]); // btesrnge + return; + case 0xBC6: // Myomers + DrawStatusCells(&localView, warehouse, 0, NULL, statusImage[5], statusImage[3]); + return; + case 0xBC8: // Emitter + case 0xBD4: // PPC + DrawStatusCells(&localView, warehouse, 0, statusImage[1], statusImage[2], statusImage[3]); + return; + case 0xBCD: // ProjectileWeapon + case 0xBD0: // MissileLauncher + DrawStatusCells(&localView, warehouse, 1, NULL, NULL, statusImage[4]); + return; + case 0xBCE: // GaussRifle -- not yet supported + DebugStream << "PrepEngr: Gauss rifle not yet supported\n"; // :1353 + DrawStatusCells(&localView, warehouse, 1, NULL, NULL, statusImage[3]); + return; + default: + return; + } + } +} +``` + +> `DrawPortBackground(view, warehouse, x, y, tile)` (btl4gau2.cpp:923) **is** `FUN_004c2ec4`; `nameCopy`, `AttributePointerOf`, `ResolveLink`, `BTGetSubsystemAuxScreen`, `NumericDisplay`, `L4Warehouse` are already available in this TU. `DrawPortBackground` currently takes `(GraphicsView*, L4Warehouse*, int, int, const char*)` — matches the calls above. + +### 4c. Registration (`btl4grnd.cpp`, in `BTL4MethodDescription[]`, before `&BTL4ChainToPrevious`) + +```cpp + &GeneratorCluster::methodDescription, // (existing, line 149) + &PrepEngrScreen::methodDescription, // "prepEngr" -- per-Eng-screen static label overlay + &BTL4ChainToPrevious +``` + +(`#include ` is already present, btl4grnd.cpp:69.) + +--- + +## 5. Systemic-check verdicts + +- **Container-Execute override needed?** **NO.** `PrepEngrScreen` is a `GraphicGaugeBackground`, which has **no `Execute` virtual** (`Execute` first appears on `Gauge`, GAUGE.h:366). The `Gauge::Execute → Fail→abort` hazard does not apply. The overridden slot is **`BecameActive()`** (confirmed vtable-identical to `BackgroundBitmap`). The override body is a real paint (does not chain the inactivating base) — exactly like `BackgroundBitmap::BecameActive` (L4GAUGE.cpp:2510), so the "default BecameActive inactivates" hazard is also handled. +- **Shadow fields?** None. Own fields (`screenNumber`/`mech`/`statusImage`) are new; the base `GraphicGaugeBackground` owns `renderer`/`localView`, which are **used** (not re-declared). Do NOT re-declare `localView` or `renderer`. +- **Alias fields?** None. +- **Phantom fields?** None — all own fields are inside the 0x90 object; nothing past `sizeof`. +- **The stub's two bugs to fix:** base `Gauge`→`GraphicGaugeBackground`; `screenNumber`/`mech` offsets swapped; `Execute()`→`BecameActive()`. +- **Databinding NULL / every-mech crash risk:** + - `mech==NULL` → guarded (early return). + - roster via `GetSubsystemCount/GetSubsystem` (safe accessors) + slot-0 skip → safe. + - `ResolveLink("HeatSink")` may be NULL → **guarded** before the `+0x1D4` read. + - `sub+0x1D4` and `sub+0x224` are **raw subsystem offsets** on not-byte-exact objects → **fail-soft** (wrong digit / `bitMapBin.Get` returns NULL → draws nothing), not a crash. §6 gives the safe substitutes (label bridge; a "HeatSinkNumber" attribute if one is published). + - `NumericDisplay`/`DrawStatusCells`/`DrawPortBackground` operate on the gauge's own `localView` + `warehouse` (both valid post-ctor) → safe. No `GuardedExecute` needed (background paints aren't SEH-wrapped, but nothing here dereferences unresolved game state without a guard). +- **Registration / lifetime:** `GaugeBase::GaugeBase` self-registers (`renderer->Add(this)`, GAUGE.cpp), so `Make` needs no explicit `Register_Object` (that macro is only debug memory-tracking, MEMREG.h:24). Unlike `BackgroundBitmap`, `prepEngr` is **never** `ModeAlwaysActive` (always `ModeMFD*Eng*`), so there is **no run-once-then-delete** branch — the gauge persists and repaints on each activation. Correct. + +--- + +## 6. Confidence & unknowns + +**Confidence: HIGH** for identity, base class, the `BecameActive` slot, the Make/ctor/dtor bodies, the methodDescription shape, the layout, and the ClassID→label dispatch. The base class, vtable slot, and lifetime are triple-confirmed (base-ctor `FUN_004440d4` signature match + `BackgroundBitmap` structural twin + `vtables.tsv` row `0051a040`). The CFG call shape (9 params) and image→slot mapping are pinned to the exact ctor stores and the switch. + +**Unknowns / follow-ups (all cosmetic, none block registration):** +1. **`sub+0x224` (subsystem label .pcc name), part_014.c:1322** — a raw embedded `char[]` used as a bitmap name. It is **not** `Subsystem::subsystemName` (`GetName()`, at a much lower offset) and **not** the aux-screen label (`sub+0x1E4`, which `BTGetSubsystemAuxScreen` already returns). Spec substitutes the bridge's `label64`; confirming/bridging the true `+0x224` field (or verifying it equals the aux label) needs a `disas2.py`/field-map pass on the subsystem ctor. Low value (one label bitmap). +2. **`resolvedHeatSink+0x1D4`, part_014.c:1317** — a 1-digit readout (the linked sink's bank/index). Byte-exact `HeatSink` is only 0x1D0, so the resolved object must be a larger subclass for this to be in-bounds; raw read is best-effort. If a `HeatSinkNumber`/`BankNumber` attribute exists, prefer `AttributePointerOf`; otherwise keep the guarded raw read. +3. **`DrawStatusCells` empty-cell C-placeholder** (part_014.c:1156-1159) uses GraphicsView **vtbl+0x4c(99,10)** — an unresolved GraphicsView slot (between `DrawFilledRectangleToAbsolute@0x48` and `DrawBitMap@0x54`; likely a relative-size rectangle). The spec draws a plain fill at the same coords; resolving the exact call needs a GraphicsView vtable decode. Only affects the blanked-cell appearance when a label is NULL. +4. **The `FUN_0041a1a4(**(sub+0xc),0x50f4bc)` filter** (part_014.c:1308) is folded into `BTGetSubsystemAuxScreen` (same treatment as `VehicleSubSystems`); if that bridge's filter ever diverges from the exact `ClassDerivations` resolution it would change *which* subsystems qualify — but the ClassID `switch` is the effective filter anyway, so this is faithful. + +**Net:** registering `&PrepEngrScreen::methodDescription` + the bodies above stops the 12 `prepEngr(...)` lines from parse-skipping and paints the engineering-screen labels; the two raw subsystem reads (#1,#2) are guarded fail-soft best-efforts flagged for a later attribute/bridge pass. \ No newline at end of file diff --git a/scratchpad/wf_3_MessageBoard_verify.md b/scratchpad/wf_3_MessageBoard_verify.md new file mode 100644 index 0000000..5798868 --- /dev/null +++ b/scratchpad/wf_3_MessageBoard_verify.md @@ -0,0 +1,42 @@ +I have completed the adversarial verification against the raw decomp, the CFG, the sibling templates, and the data-binding source files. Every load-bearing claim in the spec was checked. Here is the corrected verdict. + +--- + +# ADVERSARIAL VERIFY — MessageBoard reconstruction spec + +**Bottom line:** the spec is **substantially CORRECT and ready-to-implement**. All addresses, `sizeof`, ctor offset writes, the base class, the methodDescription row set, the Make/dtor conventions, and the DEFERRED-data verdict are verified against the binary. The spec's **three header corrections are all genuinely correct**, and its **correction of the task hint** (source is BTPlayer status queue, *not* SubsystemMessageManager 0xBD3) is verified. I found **one wrong citation**, **one fidelity deviation to flag**, and **two small notes**. No blocking errors. + +## What I verified as CORRECT (accept as-is) + +- **Identity / addresses** (all confirmed `part_014.c`): Make `@004cb678:3825`, ctor `@004cb704:3849`, dtor `@004cb788:3872`, TestInstance `@004cb7e4:3892`→`FUN_004448ac`, no-op slot `@004cb7f4:3903`, BecameActive `@004cb7fc:3913`, SetSource `@004cb818:3925`, Execute `@004cb82c:3936`, vtable `PTR_FUN_0051bddc` (`:3858/:3876`). Base = `GraphicGauge` (`FUN_00444818`), ends at 0x90. +- **sizeof 0xA4 == Make alloc** `FUN_00402298(0xa4)` (`:3832`). ✓ +- **ctor offset writes** (`:3859-3864`): `[0x25]`=stripImage(0x94), `[0x26]`=color(0x98), `[0x24]`=trackedMech(0x90)=0; `SetOrigin(x,y)` via `localView` vtbl+0x10. ✓ +- **The three header fixes are all correct:** + - `enabled` → **`Entity *trackedMech`**: 0x90 is a pointer dereferenced at `+0x190` (`iVar1 = *(*(param_1+0x90)+400)`, `:3950`) and written only by `SetSource` (`:3928`). It is not a bool. ✓ + - **previousMessageId / previousNameId are SWAPPED** in the current header. Binary proof: BecameActive writes `0x9c=-1, 0xa0=-2` (`:3916-3917`); Execute compares **messageId vs 0xa0** (`:3960`) and **nameEntity(iVar5) vs 0x9c** (`:3983`). ⇒ `0x9c=previousNameId(-1)`, `0xa0=previousMessageId(-2)` — exactly the spec's relabel, and it matches the prose at `btl4gau3.cpp:784`. ✓ +- **methodDescription rows** match the CFG call `messageBoard(E, ModeAlwaysActive, btsmsgs.pcx, 0)` at `L4GAUGE.CFG:4913-4917` under the `offset=(113,607)` at `:4912` → 4 rows `typeRate/typeModeMask/typeString/typeColor`; position threaded from the `offset` directive; **entity param ignored** (binary Make never touches `param_4`, `:3825-3843`). This is exactly the PilotList template (`btl4gau3.cpp:218-239`), except MessageBoard *does* use `position` (SetOrigin). ✓ +- **Make presence-check + return** is byte-faithful *and* matches the codebase template `VertTwoPartBar::Make` (`btl4gaug.cpp:1099-1107`: `Get(string); if NULL return False; Release; return True`). `content/GAUGE/BTSMSGS.PCX` exists → returns True in practice. ✓ +- **dtor** correctly omits the base-dtor call (`FUN_00444870` is compiler epilogue glue, `:3880`) — avoids the double-dtor bug. `FUN_004700ac` is the string-dup helper used across widgets; freeing via `delete[]`/`FUN_004022e8` is consistent. ✓ +- **Data-binding blocker — CONFIRMED on both legs:** + - **SetSource (`FUN_004cb818`) has ZERO callers** anywhere in `reference/decomp/all/` (grep returns only its own definition) → `trackedMech` stays NULL. ✓ + - **`StatusMessagePool = 0`** — the NULL stub is real (`btstubs.cpp:62`), and the only writer of `BTPlayer+0x1dc` is gated `if (sender_owner && StatusMessagePool)` (`btplayer.cpp:508`) → no messages ever created. ✓ + - **Task-hint correction is right:** `SubsystemMessageManager` (`messmgr.cpp`) *is* reconstructed but is the per-mech damage/explosion hub (`ConsolidateAndSendDamage`/`weaponExplosions`), not a `{msgId,nameEntity}` source; MessageBoard never references it. `mech+0x190`=owningPlayer confirmed (`btplayer.cpp:68`, `MECH_OWNING_PLAYER`); `DAT_004efc94`==application (App+0xc8 name cache, `btplayer.cpp:53`). ✓ +- **Systemic checks:** leaf `GraphicGauge` (not a container) that overrides both Execute and a non-inactivating BecameActive → Container-Execute/Fail rule satisfied. No shadow/alias/phantom fields (all new slots 0x90–0xA3, ends exactly at 0xA4). Raw `mech+0x190`/`player+0x1dc`/`+0x1e0`/App+0xc8 reads kept out of the widget TU via the `BTResolveMessageBoard` bridge (databinding trap avoided). Every-mech crash risk: none (early return on NULL). `/FORCE` stub for the bridge required. ✓ + +## CORRECTIONS (the list of what I changed) + +1. **[Citation fix — §2, §5, §6] `StatusMessagePool`'s NULL definition is `btstubs.cpp:62`** (`MemoryBlock *StatusMessagePool = 0;`), **not** `btplayer.cpp:135/508`. Those btplayer lines are the `extern` decl and the guard site; the actual stub lives in `btstubs.cpp`. The conclusion (feed is dead) is unchanged — only name the correct file so the follow-up (wiring the pool) edits the right place. + +2. **[Fidelity deviation — §4.8, must be flagged, not fixed] The Execute name-cell path is a STRUCTURAL simplification, not byte-faithful.** The binary stores the *previous name ENTITY POINTER* at 0x9c and, when the sender changes to "none", looks up that previous entity's name bitmap via its `+0x1e0` key and **erases** it with `DrawBitMap` (vtbl+0x54, `:3992-3996`). The spec collapses 0x9c to a boolean `nameState` (0/1) and drops the erase-previous path. **While DEFERRED this is functionally identical** (nameEntity always 0, previousNameId init −1 → first Execute takes the `iVar5==0 && prev==-1` clear branch, `:3986-3990`, matching the binary), so it is safe for the landing. **But it changes `previousNameId`'s semantics from pointer→int**, so when the status feed goes live the entity-pointer tracking + erase branch must be restored for correct name repainting. Keep the spec's body for the deferred landing; add a code comment marking this as the restore point. (The spec does acknowledge the deviation; I am raising it to an explicit action item because it silently redefines a member.) + +3. **[Minor note — §1/§4.5] The no-op vtable slot `@004cb7f4` ("ShowInstance"):** the binary override is a bare `return`. The spec omits it and inherits (per the PilotList/PlayerStatus precedent). This is only byte-faithful **if** the `GraphicGauge` base slot is itself trivial for this call site; if strict fidelity is wanted, add an empty override. Low risk (leaf widget, slot rarely hit) — accept the omission but note it. + +4. **[No change, confirmation] Make's `bool` return on a missing bitmap** is binary-faithful and template-matched; because `BTSMSGS.PCX` is present it returns True, so registration/parse is unaffected. No action. + +Everything else in the spec — the layout table + `static_assert` locks, ctor/dtor/BecameActive/TestInstance/SetSource/Make bodies, the `BTResolveMessageBoard` bridge + returns-`False` stub in `btplayer.cpp`, the `methodDescription` literal, and the registration line inserted before `&BTL4ChainToPrevious` in `btl4grnd.cpp` (after `GeneratorCluster`) plus adding `static MethodDescription methodDescription;` to the class — is **verified and should be implemented as written**. + +## FINAL CONFIDENCE: **HIGH** + +- Layout/methods/registration/sizeof/offsets: **HIGH** — fully recovered and cross-checked against `part_014.c:3823-4013` and the `PilotList`/`VertTwoPartBar` templates. +- DEFERRED/empty verdict: **HIGH** — both blockers independently confirmed in-source (`btstubs.cpp:62` NULL pool; SetSource zero callers). +- Only residual **UNKNOWN** (non-blocking, for the *alive* path, not the landing): the exact `Player__StatusMessage` record layout (`+0xc` messageId, `+0x10` nameEntity) and the App+0xc8 name-bitmap cache shape needed inside `BTResolveMessageBoard` once `StatusMessagePool` is wired — decode `FUN_0042e580` (AddStatusMessage) + the message-record ctor `FUN_0042d990` to expose them as compiled accessors. The default landing (safe no-op) does not touch these. \ No newline at end of file diff --git a/scratchpad/wf_4_SectorDisplay_verify.md b/scratchpad/wf_4_SectorDisplay_verify.md new file mode 100644 index 0000000..5475d83 --- /dev/null +++ b/scratchpad/wf_4_SectorDisplay_verify.md @@ -0,0 +1,71 @@ +I now have everything verified against the raw decomp, the engine headers, the CFG, and the sibling reconstructions. Here is the adversarial verdict. + +--- + +# ADVERSARIAL VERIFY — SectorDisplay: verdict **APPROVE WITH CORRECTIONS** + +The spec is structurally sound and its layout corrections over the current (buggy) `btl4gau3.hpp` are **right**. I confirmed sizeof, every ctor offset, the base chain, the Make idiom, the methodDescription row set (against the live CFG), the dtor/BecameActive/Execute structure, and all five systemic-check verdicts. **One substantive error** (a wrong rounding claim with a fabricated justification) and **two confidence downgrades** (disassembly-only claims) must be fixed before implementing. + +## What I verified as CORRECT (keep as-is) + +- **Base = `GraphicGauge`, base ctor `FUN_00444818`, sizeof `0xC4`** — Make allocs `FUN_00402298(0xc4)` (part_014.c:2632). ✓ +- **Every ctor offset** vs the raw `param_1[N]` writes (part_014.c:2666–2704): `gridImage@0x94`, `cellWidth@0x98=width/14`, `gridLeft@0x9C=cw*12`, `gridRight@0xA0=cw*13-1`, `gridHeight@0xA4`, `numericColor@0xA8`, `gridColor@0xAC`, both `500`s @0xB0/@0xB4, `numericA@0xBC (x=0)`, `numericB@0xC0 (x=cw*4)`. ✓ +- **The header-layout fixes are real bugs in the current header** — it omits `@0xA8` and `@0xB8`, mislabels `@0x90` as `enabled` and `@0xB0/@0xB4` as `baseLine/dirty`, and wrongly gives the ctor **two** image strings (the raw has ONE, `param_9`, used for both grid + font). Spec fixes all of these. ✓ +- **`@0x90` = `subject` Entity\* set by `LinkToEntity` (slot 9), NOT `enabled`/`SetEnable`** — well-founded: `FUN_004ca068` is a bare `this[0x24]=param` setter, base slot9 is the empty `LinkToEntity`, and Execute gates on `+0x90 != 0` and reads a *position* from it. This is the correct reinterpretation of the current header. ✓ +- **methodDescription 5-row set** (`typeRate, typeModeMask, typeString, typeColor, typeColor`) — matches the Make's DAT_ reads AND the live CFG (`content/GAUGE/L4GAUGE.CFG:5146`): `sectorDisplay(K, ModeAlwaysActive, helv15.pcc, 0, 3)` with `offset=(125,579)` supplied separately. ✓ +- **Make/ctor base-chain idiom** — identical to the registered sibling `PilotList` (`btl4gau3.cpp:226–238, 253`): `ParameterDescription *p = methodDescription.parameterList; … GraphicGauge(rate,mode,renderer,0,port,id)`. ✓ +- **dtor** (implicit base, release grid, free name, delete numerics), **BecameActive** (dirty=1, ForceUpdate B-then-A, non-inactivating), **Execute** grid blit (`MoveToAbsolute(cw*3,0)`+`SetColor(gridColor@0xAC)`+`DrawBitMap(0,grid,gridLeft,0,gridRight,gridHeight)`) — all match the raw byte-for-byte. ✓ +- **Systemic checks all correct**: Execute (slot16) + non-inactivating BecameActive (slot3) both overridden → no `Gauge::Execute` `Fail`→`abort`; the two NumericDisplays are private members drawn directly, not registered children → no child-`GuardedExecute` recursion; no shadow/alias/phantom fields; `subject`-NULL guarded with the viewpoint fallback; single cockpit gauge, not per-mech. ✓ +- **`renderer->warehousePointer` is reachable in member methods/dtor** — confirmed by `PlayerStatus::Execute` (`btl4gau3.cpp:673`). Registration line goes before `&BTL4ChainToPrevious` (`btl4grnd.cpp:150`). ✓ + +## CHANGES I made (what was wrong) + +**① CRITICAL — `FUN_004dcd94` is `ROUND`, not truncate.** Confirmed at its definition (`part_015.c:3769`): `local_10 = (undefined4)(longlong)ROUND(in_ST0);` — round-to-nearest (x87 `frndint`, half-to-even). The codebase's own map agrees (`btl4gau3.cpp:36` "FUN_004dcd94 Round"; CLAUDE.md). The spec asserts the **opposite** ("truncate toward zero … RC=chop `or 0xc`, `fistp` … `(long)` not round-to-nearest") — that justification is **fabricated**; there is no `or 0xc`/`fistp` in the function. Fix: the two numerics must **round**, not C-truncate. Use `lrintf` (default FE_TONEAREST == `frndint`) or the engine `Round`, never `(int)(x)`. + +**② Downgrade the position data-binding to disassembly-sourced / MEDIUM confidence.** The pseudocode Execute (`FUN_004ca07c`, part_014.c:2789–2794) shows **only** `iVar2 = FUN_004dcd94(); iVar3 = FUN_004dcd94();` — the decompiler dropped the x87 operand loads. So the *entire* mapping (that `iVar2 = -Z·0.01`, `iVar3 = +X·0.01`, the `fchs`, and the `0.01` scale) is the reviewer's disassembly, which was **provably wrong on `FUN_004dcd94`**. The `subject != 0` gate + the two `+500` offsets + drawing two numerics are pseudocode-solid; the **which-axis / sign / scale** are not. Keep the mapping as the best structural reconstruction but mark it, and re-disassemble `@0x4ca089–0x4ca0b9` to lock the axis/sign/scale before claiming fidelity. (The read itself — `subject->localOrigin.linearPosition` via the engine `Entity` type — is confirmed as the established radar pattern: `btl4rdr.cpp:150` reads `entity->localOrigin.linearPosition`; `ENTITY.h:140 Origin localOrigin`; entity+0x100 == that per `btl4rdr.cpp:622`.) + +**③ Unify the `FUN_00442aec` naming to `GetIfAlreadyExists`** (the codebase's established name, `btl4gau3.cpp:128–129 "peek, no AddRef"`). The spec inconsistently modeled the identical call as `bitMapBin.Get` (held) in the ctor but `GetIfAlreadyExists` (peek) in Make/Execute. Use `GetIfAlreadyExists` in all three; keep the dtor `Release` (`FUN_00442c12`, part_014.c:2717) balancing the ctor's held reference and the Make existence-check Release (part_014.c:2640) — that is binary-faithful. + +**④ Minor:** remove the now-unused static `DAT_0051a2bc/0300/0344` placeholders (`btl4gau3.cpp:69–71`) — the rewired Make reads `methodDescription.parameterList` (same as the PlayerStatus rewire, line 72–73). Drop the redundant `(L4Warehouse*)` cast in Make (`warehousePointer` is already typed, per line 128). Confirm `NumericDisplay::unsignedFormat == 0` (raw format arg is literal `0`); if unsure use `(NumericDisplay::Format)0`. The `offsetX/offsetY` names are misleading (both `500`; A feeds the Z-numeric, B the X-numeric) — rename `sectorBaseA/sectorBaseB` or just comment "both = 500". + +## Corrected Execute (the only body that changes) + +```cpp +// @0x4ca07c -- Execute (slot 16). RAW: iVar2/iVar3 = FUN_004dcd94() = ROUND(ST0) +// (part_015.c:3769); the x87 operand loads were dropped by the decompiler, so the +// -Z / +X axis assignment, the fchs and the 0.01 scale are DISASSEMBLY-sourced +// (@0x4ca089-0x4ca0b9) and MEDIUM-confidence -- re-verify before claiming fidelity. +void SectorDisplay::Execute() +{ + Entity *s = subject; // this+0x90 + if (s == NULL && application != NULL) // PORT: LinkToEntity broadcast + s = (Entity *)application->GetViewpointEntity(); // may be unwired -> fall back + if (s == NULL) + return; // binary gates purely on subject!=0 + + const Point3D &pos = s->localOrigin.linearPosition; // engine type (NOT raw +0x100) + int vA = (int)lrintf(-pos.z * 0.01f) + sectorBaseA; // ROUND, not (int) truncate + int vB = (int)lrintf( pos.x * 0.01f) + sectorBaseB; + numericA->Draw(&localView, (Scalar)vA); // FUN_00470430 + numericB->Draw(&localView, (Scalar)vB); + + if (dirty) { // this+0xB8 + dirty = 0; + BitMap *grid = ((L4Warehouse *)renderer->warehousePointer) + ->bitMapBin.GetIfAlreadyExists(gridImage); // FUN_00442aec + if (grid != NULL) { + localView.MoveToAbsolute(cellWidth * 3, 0); // vtbl+0x24 + localView.SetColor(gridColor); // vtbl+0x18 (this+0xAC) + localView.DrawBitMap(0, grid, gridLeft, 0, gridRight, gridHeight); // vtbl+0x54 + } + } +} +``` + +Everything else in the spec (identity table, the `0xC4` overflow-lock, the methodDescription literal, the registration line, ctor/dtor/Make/BecameActive/TestInstance bodies) is **correct as written** — apply only ①–④. + +## FINAL CONFIDENCE + +**HIGH** on structure, layout, registration, and all systemic-check verdicts (pseudocode-verified). **MEDIUM** on the numeric data-binding specifics: the value is a *rounded* `±position·0.01 + 500`, but the exact axis→numeric assignment and the sign of Z are disassembly-only and the reviewer's disassembly was demonstrably unreliable (it inverted the rounding mode). Re-disassemble `@0x4ca089–0x4ca0b9` to lock the axis/sign/scale; nothing else blocks implementation. + +**Remaining UNKNOWNS (non-blocking):** exact axis/sign/scale of the position read (②); whether `GaugeRenderer::LinkToEntity` is broadcast in the port (the viewpoint fallback makes it LIVE either way); `NumericDisplay::unsignedFormat`'s enum value (raw = `0`). \ No newline at end of file diff --git a/scratchpad/wf_5_PrepEngr_verify.md b/scratchpad/wf_5_PrepEngr_verify.md new file mode 100644 index 0000000..19fa074 --- /dev/null +++ b/scratchpad/wf_5_PrepEngr_verify.md @@ -0,0 +1,47 @@ +I have now verified every load-bearing claim against the raw decomp, the vtable data, the BackgroundBitmap twin, and the established reconstruction templates. Here is my adversarial-verification verdict. + +--- + +# VERIFY VERDICT: PrepEngrScreen spec — **CONFIRMED CORRECT** (with 3 minor strengthenings) + +The colleague's spec is **sound and ready-to-implement**. Its three headline corrections to the existing stub are all independently verified. I found no incorrect claim; the changes below are hardening, not fixes. + +## Core claims — all VERIFIED against the raw + +**(a) Base class / sizeof / ctor offsets — CORRECT** +- Base = `GraphicGaugeBackground`, **confirmed**: PrepEngr's ctor `FUN_004c7bf0` calls base ctor `FUN_004440d4` (part_014.c:1213), and `FUN_004440d4` is the ctor called by `BackgroundBitmap` and its siblings (part_009.c:1633/1695/1758/1838/1956) — the L4GAUGE `GraphicGaugeBackground` leaves. 5-arg base ctor `(mode, renderer, owner, port, id)` matches `GraphicGaugeBackground(ModeMask, GaugeRenderer*, unsigned, int, const char*)` (GAUGE.h:117). The stub's `public Gauge` is **wrong** → change to `GraphicGaugeBackground`. +- sizeof **0x90** = `FUN_00402298(0x90)` (part_014.c:1189). ✓ +- ctor field writes: `param_1[0x1b]=param_7`(screen)@0x6C, `param_1[0x1c]=param_6`(mech)@0x70 (part_014.c:1215-1216). **Stub has these two swapped** (btl4gau2.hpp:318-319) → spec's fix is correct. +- ctor param order `(mode, renderer, owner, port, mech, screen, img0..6, id)` matches the Make→ctor call (part_014.c:1191). ✓ + +**(b) methodDescription rows — CORRECT.** CFG `prepEngr(...)` (L4GAUGE.CFG:4595) has exactly 9 args: `ModeMFD1Eng1, 1, helv42.pcc, escnd.pcc, edmg.pcc, bteslev.pcc, bteunjm.pcc, espeed.pcc, btesrnge.pcc` → `typeModeMask, typeInteger, 7×typeString`. Global-DAT spacing confirms the parameterList mapping: `sizeof(ParameterDescription)=0x44` (4 + `maxStringLength`=0x40, GAUGREND.h:242-262), and `DAT_0051936c`(screen)=`parameterList[1].data`, `DAT_005193b0`(img0)=`parameterList[2].data.string`, stride 0x44 — exactly the reconstruction's read `p[i].data.{integer,string,modeMask}`. ✓ + +**(c) Container-Execute rule — CORRECTLY N/A.** `Execute` first appears on `Gauge` (GAUGE.h:366, vtable slot ~14); a `GraphicGaugeBackground` vtable has only 13 slots and no `Execute`. **The overridden slot is BecameActive, not Execute** — proved three ways: + 1. PrepEngr vtable (vtables.tsv row `0051a040`, ptr `0051a06c`) = `[4c7d14(dtor), 4173b8, 417938, 4c7e48, 444004…]` — **byte-identical shape** to BackgroundBitmap (`004fb918`, ptr `471d7c`) = `[471d7c(dtor), 4173b8, 417938, 471dec, 444004…]`. + 2. `BackgroundBitmap` is *explicitly* a `GraphicGaugeBackground` (L4GAUGE.cpp:2443) whose **only non-dtor override is `BecameActive()`** (L4GAUGE.cpp:2511) → its single override slot (3) = BecameActive → PrepEngr's slot 3 (`4c7e48`) = BecameActive. + 3. Slots 1/2 are Node virtuals: `FUN_004173b8` = `return 0` = `Node::ReceiveNodeCommand` (node.h:10 inline `{return 0;}`); `FUN_00417938` = `ReleaseLinkHandler` — so slot 3 is the *first GaugeBase virtual* = `BecameActive` (GAUGE.h:52). + `FUN_004c7e48` is a paint-on-activation (walk roster → draw labels into `localView`), semantically a BecameActive, not a per-frame Execute. No container/child-chain exists (ctor builds none; dtor `FUN_004c7d14` only frees 7 images + implicit localView/base dtor) → the abort-on-unoverridden-Execute hazard does not apply. ✓ + +**(d) shadow/alias/phantom / databinding — CORRECTLY handled.** No shadow/alias/phantom fields. Roster read uses the databinding-safe `Entity::GetSubsystemCount()/GetSubsystem(i)` (ENTITY.h:167-177, reads the reconstructed `subsystemArray/subsystemCount`) + `BTGetSubsystemAuxScreen` — the exact `VehicleSubSystems::Make` pattern (btl4gau2.cpp:1621-1636). NumericDisplay/DrawPortBackground operate on the object's own `localView`/`warehouse`. The two raw-offset reads (`hs+0x1D4`, `sub+0x224`) are correctly guarded fail-soft and flagged (§6). + +**(e) every-mech / abort / NULL — no crash risk.** `mech` null-checked; `GetSubsystem(i)` bounded by `i