vehicleSubSystems Phase 2: authentic aux-screen assignment -> panels build
The engineering-screen cluster panels now build for each subsystem on its real aux-screen position. Two pieces: 1. Aux-screen bridge (powersub.cpp BTGetSubsystemAuxScreen): the assignment lives on PoweredSubsystem (auxScreenNumber/Placement/Label, resource +0x104/108/10C) which our ctor already populates -- but the reconstructed heat-leaf branch is NOT byte-exact, so the Make's raw sub[0x1dc]/[0x1e0]/[0x1e4] reads were garbage (0xCDCDCDCD). The bridge casts through the real PoweredSubsystem type + returns the NAMED fields (and is the FUN_0041a1a4/0x50f4bc type filter). Make + Subsystem Cluster now read via the bridge. 2. Reconstruct the 4 child gauges the clusters build that were declared-but-undefined (only VertTwoPartBar/OneOfSeveral/PixInt existed): HorizTwoPartBar (full, mirrors Vert), OneOfSeveralInt (ctor), OneOfSeveralStates (ctor + BecameActive + State Connection @004c3324), BitMapInverseWipe/LeakGauge (full) + SeekVoltageGraph's Execute/BecameActive/dtor -- their /FORCE-stubbed ctors were segfaulting when a cluster built them. VERIFIED (BT_DEV_GAUGES + BT_VSS_LOG): 7 authentic panels build -- Sensor(scr5, qsensors) HeatSinkCluster, Myomers(scr6,qmyomers) MyomerCluster, PPC(scr1,10) + Emitter(scr4,8,7) Energy/Ballistic clusters -- with real labels + placements, 0 crashes, combat un-regressed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
a02339112a
commit
6fceb58439
@@ -1258,3 +1258,26 @@ Subsystem *CreatePoweredSubsystem(Mech *owner, int id, void *seg)
|
||||
return (Subsystem *) new (Memory::Allocate(0x31c))
|
||||
PoweredSubsystem(owner, id, (PoweredSubsystem::SubsystemResource *)seg, PoweredSubsystem::DefaultData);
|
||||
}
|
||||
|
||||
//
|
||||
// Bridge for the vehicleSubSystems gauge factory (btl4gau2.cpp). The engineering-
|
||||
// screen assignment lives on PoweredSubsystem (auxScreenNumber / auxScreenPlacement
|
||||
// / auxScreenLabel, resource +0x104/+0x108/+0x10C). Reading it from btl4gau2.cpp
|
||||
// via a raw offset (sub+0x1dc) is wrong because the reconstructed heat-leaf branch
|
||||
// is not byte-exact -- so the gauge factory calls this bridge, which casts through
|
||||
// the real PoweredSubsystem type and returns the NAMED fields. Returns False for
|
||||
// non-PoweredSubsystem-derived subsystems (== the FUN_0041a1a4 / 0x50f4bc type
|
||||
// filter the vehicleSubSystems Make applies before dispatch).
|
||||
//
|
||||
bool BTGetSubsystemAuxScreen(Subsystem *sub, int *screen, int *placement, char *label64)
|
||||
{
|
||||
if (sub == NULL)
|
||||
return false;
|
||||
if (!sub->IsDerivedFrom(*PoweredSubsystem::GetClassDerivations())) // FUN_0041a1a4(...,0x50f4bc)
|
||||
return false;
|
||||
PoweredSubsystem *ps = (PoweredSubsystem *)sub;
|
||||
if (screen != NULL) *screen = ps->auxScreenNumber; // +0x104
|
||||
if (placement != NULL) *placement = ps->auxScreenPlacement; // +0x108
|
||||
if (label64 != NULL) strcpy(label64, ps->auxScreenLabel); // +0x10C
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user