BT410: the MFD wave landing report (5.3.33-38)

Where the cockpit stands per head, the five defects the rig found and the
order they fell, and the measurement lesson: a large overlapping error makes
a small one measure as already-optimal, which is exactly what I recorded for
the title banner before the strip art was fixed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Cyd
2026-07-27 12:48:34 -05:00
co-authored by Claude Fable 5
parent 44aa7a349c
commit 377aec92b0
@@ -778,3 +778,85 @@ Everything in this list came from the per-head instrument in one sitting;
none of it was visible in the whole-frame score, which moved less than a
point across the entire session even as Eng1/2/3 went to exact. Score the
heads, not the frame.
================================================================================
5.3.33-38 -- THE MFD WAVE: the weapon panels close to a few dozen pixels
================================================================================
Where the cockpit stands against the shipped 4.10 binary (planes.py):
head shipped ours missing extra
Eng1 17981 17981 0 0
Eng2 17981 17981 0 0
Eng3 17981 17981 0 0
Mfd1 41784 41651 140 7
Mfd2 40799 40716 97 14
Mfd3 32146 32128 31 13
Heat 21374 20971 483 80
Comm 15656 13557 2099 0
overlay 3283 3325 55 97
sec 35423 36137 325 1039 <- the 3-D scene (btl4vid)
Whole frame: 98.2% pixel-identical / 97% coverage, from 89.7% / 92% at the
start of the session. Six of the ten heads are exact or within ~150px.
FIVE DEFECTS, ALL FOUND BY THE RIG, IN THE ORDER THEY FELL:
1. MissileLauncher::DefaultData carried Subsystem's shared-data tables where
every sibling weapon carries MechWeapon's -- so EVERY weapon attribute on
a launcher resolved to nothing and the gauge read the unbound zero cell.
The tell was a fire-ready disc the shipped STREAK 6 panel draws and ours
never did, while [proj-state] showed the launcher itself at state=Loaded
recoil=0 level=1 bin=24. A healthy weapon behind a dead binding. ~7.6K
pixels. This one reaches well past the cockpit: PercentDone,
TriggerState, WeaponState, DistanceToTarget and RearFiring were all dead
on both SRM6 launchers.
2. The strip art (image_names[auxScreenPlacement], qblh0..qblh6 -- the mech
diagram with this subsystem's segment lit) drew at the panel ORIGIN
instead of the quadrant's middle. Solved rather than guessed: our extra
pixels clustered at panel x 0..70 against shipped's missing at x 140..230,
and a cross-correlation of the two sets peaked at dx=+144 dy=-54
independently on all three panels. +144 is 0x90 exactly. ~10.9K missing
and ~6.7K extra pixels.
3. The ammo readout was inert (ammoBinLink protected, no accessor).
ProjectileWeapon now publishes GetAmmoCount() and the cluster copies it
into a live cell each Execute -- the pattern it already used for jammed
and reloadSeconds. The STREAK 6 panel reads 0024 against shipped's 0024.
4. CoolingLoopConnection::Update wrote a constant 0, so every panel's state
box read "OFF" where shipped shows the loop digit. heat.hpp now publishes
GetCoolantAvailable() / ResolveCoolingMaster() / GetCondenserNumber() and
the connection follows the binary. The box reads 4 / A against shipped's
4 / A, pixel for pixel.
5. SegmentArc270 computed segmentSpan = 0.75 in its ctor and NOTHING read it
-- the engine base has no span member and the class declared no Execute,
so the dial lit all 20 segments where shipped lights 15. A derived
Execute now scales the fraction, draws, and restores it (the connection
only rewrites currentValue on change, so scaling in place would compound
and walk the dial to zero). Extra: 679/462/461 -> 7/14/13.
--------------------------------------------------------------------------------
THE MEASUREMENT LESSON, WHICH IS THE REUSABLE PART
--------------------------------------------------------------------------------
Mid-session I measured the title banner at y+0xb3 as the OPTIMUM and wrote in
this file that it was at most 1-2px off: +3 and -3 both scored worse, and the
correlation peaked at only 30%. That reading was CONFOUNDED. The strip-art
error (defect 2) was ten times larger and lived in the same bands, so it
dominated the metric and hid a clean one-row error underneath. Once the
strip art was right, the title fringe isolated at exactly 553/553
missing/extra per head and +1 collapsed it to nothing.
So: fix the LARGEST error on a head first, then re-measure the small ones. A
big overlapping defect makes a small one measure as noise -- or worse, as
already-optimal, which is what I recorded.
WHAT IS LEFT, LARGEST FIRST:
* sec (325 missing / 1039 extra) -- the 3-D scene head. This is btl4vid,
the world renderer, and the next big climb; the gauge work cannot move it.
* Comm (2099 missing / 0 extra) -- content the shipped Comm page draws that
we never build at all. Zero extra means nothing we draw there is wrong,
so this is a build-it wave, not a fix-it one.
* Heat (483 / 80) and the MFD remainders (~270 / ~34) -- fine detail.