#118: the eject slot graphic returns -- vtbl+0x58 is DrawBitMapOpaque [T0]

The proper RE the corruption arc demanded: counting GRAPH2D.h's declared
virtual order, GraphicsView vtbl+0x18 = SetColor and +0x24 = MoveToAbsolute
land exactly -- and +0x58 is NOT DrawBitMap (+0x54) but the NEXT virtual,
DrawBitMapOpaque(background, rotation, bmp, sx1, sy1, sx2, sy2).  The wipe
is a two-span OPAQUE draw with INVERTED fg/bg pairs -- the literal "inverse
wipe" -- and FUN_004c5fb8 transcribes byte-exactly with the real signature
(the ++level between spans is inclusive-bounds bookkeeping, no gap).  The
base ctor fields were already right (colors +0x94/+0x98, bitmap Size.x/y at
+0x9C/+0xA0, decomp @004c5e84).

BallisticWeaponCluster::ejectWipe re-wired (bteejtm.pcc <- PercentOfEject).
Stress-verified: 4 gens dead + autofire jams + leak warning, weapon pages
pristine end to end.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Joe DiPrima
2026-08-03 23:56:53 -05:00
co-authored by Claude Fable 5
parent 5cd1947b65
commit 5a4ee55e4e
2 changed files with 24 additions and 16 deletions
+7 -6
View File
@@ -2021,12 +2021,13 @@ BallisticWeaponCluster::BallisticWeaponCluster(
engPort, 0xc2, 0x85, "edestryd.pcc", 0, 0xff, (int *)&failedState, "TwoState"); // the destroyed X: bright when FAILED
// ejectWipe (BitMapInverseWipeScalar @004c61c8): the round-EJECT progress
// sweep -- bteejtm.pcc revealed column-by-column as the weapon's
// PercentOfEject (@0x3F8) runs 0..1. Binary call (part_014.c:2312):
// FUN_004c61c8(., rate, eng_mode, renderer, ownerID, engPort, 0xF, 0,
// "bteejtm.pcc", 0, 0xFF, weapon+0x3f8, name). Reconstructed 2026-08-03
// (#118 field report: the eject slot flashed EMPTY -- this was the
// tracked-NULL stub).
// sweep -- bteejtm.pcc as the weapon's PercentOfEject (@0x3F8) runs 0..1.
// Binary call (part_014.c:2312): FUN_004c61c8(., rate, eng_mode,
// renderer, ownerID, engPort, 0xF, 0, "bteejtm.pcc", 0, 0xFF,
// weapon+0x3f8, name). RE-WIRED 2026-08-03 after the draw op was
// properly settled: vtbl+0x58 = DrawBitMapOpaque, NOT DrawBitMap -- the
// mis-guess was the striped-MFD corruption (gotcha #27; the wipe's
// Execute in btl4gaug now carries the byte-exact two-span transcription).
{
extern Scalar *BTWeaponPercentOfEjectPtr(void *weapon);
Scalar *ejectPct = BTWeaponPercentOfEjectPtr(subsystem_in);