BT410 5.3.38: SegmentArc270 never applied its 270 degrees

The class computed segmentSpan = 0.75 in its ctor and nothing ever read it:
the engine SegmentArc base has no span member, and SegmentArc270 declared no
Execute, so the recharge dial lit all 20 segments at PercentDone 1.0 where
the shipped cockpit lights 15 and leaves the quarter gap.  That was the last
MFD delta -- four extra spokes at the upper-left of every weapon disc.

A derived Execute is the only place the 0.75 can reach the draw, which is the
same role SegmentArcRatio's Execute plays with its own copy.  It scales the
raw fraction, draws, then restores: the connection only rewrites currentValue
when its source changes, so scaling in place would compound frame after frame
and walk the dial to zero.

  head   missing        extra
  Mfd1    140 (=)       679 -> 7
  Mfd2     97 (=)       462 -> 14
  Mfd3     31 (=)       461 -> 13

Cockpit: 98.2% identical / 97% coverage.  The three MFD heads and the three
engineering heads are now within a few dozen pixels of the shipped binary.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-27 12:47:48 -05:00
co-authored by Claude Fable 5
parent 945812fef1
commit 44aa7a349c
2 changed files with 31 additions and 2 deletions
+21
View File
@@ -2789,6 +2789,27 @@ SegmentArc270::SegmentArc270(
Check_Fpu();
}
//
// Execute -- scale the raw fraction by the 270-degree span, draw, then
// put the raw value back. Restoring matters: the connection only
// rewrites currentValue when its source changes, so scaling in place
// would compound frame after frame and walk the dial to zero.
//
void
SegmentArc270::Execute()
{
Check(this);
Scalar
raw = currentValue;
currentValue = raw * segmentSpan;
SegmentArc::Execute();
currentValue = raw;
Check_Fpu();
}
SegmentArc270::~SegmentArc270() // @004c66b3 (base chain)
{
}
+10 -2
View File
@@ -566,8 +566,16 @@
const char *identification_string);
~SegmentArc270(); // dtor thunk @004c66b3
// No Execute override: inherits the engine SegmentArc::Execute
// (@00474300), which draws the lit segments up to currentValue.
//
// Execute applies the 270-degree SPAN. The engine base has no
// span member, so a derived Execute is the only place the 0.75
// can reach the draw -- the same role SegmentArcRatio's Execute
// plays with its own copy. Without it the dial lit all 20
// segments at PercentDone 1.0 where the shipped cockpit lights
// 15, leaving the quarter gap (the A/B rig's last MFD delta:
// four extra spokes at the upper-left of every weapon disc).
//
void Execute();
protected:
Scalar segmentSpan; // @0xC0 this[0x30]
};