sec-surface phantoms: #48 wrap lit idx-254 art in live armor colors
Playtester report: (1) the CONTROL MODE stack showed filled boxes around the
inactive MID/ADV entries, (2) a phantom block between the HEADING dial and the
ARMOR rosette. Root-caused [T1]:
The #48 translation-table cycle-fill (6bb03ae, 2026-07-25) mapped
out-of-range art indices in-plane as (index mod 2^bits) -- so art index 254
landed on plane slot 62 = the LIVE colorMapperMultiArmor right-armor damage
slot. And idx-254 art EXISTS: every SMODE.PCC frame fills the INACTIVE
mode-box interiors with 254, and BTSEC1.PCX carries a stray 52x13 idx-254
bar at port (199-250,101-113) between the heading dial and the rosette (a
scratch duplicate of the rosette quadrant bars). Both lit up in the
current right-armor color (adpal ramp green/orange/red) on EVERY render
path. On the shipped machine those regions rendered BLACK (the garbage
entry's low plane bits were 0), which is why the 2026-07-19 smode audit --
run before the cycle-fill landed -- verified CORRECT.
FIX (BuildSecondaryTranslation): map [2^bits..255] to translationTable[0]
(plane BACKGROUND) -- the authentic on-screen result, same no-leak
guarantee. Verified on both desktop paths: MID/ADV back to authored
borders+text (idx 5/9), no interior fills; the phantom bar gone; the BAS
badge and the live armor rosette (in-range slots 60-63) untouched.
KB: gauges-hud #48 REFINED addendum; GAUGE_COMPOSITE audit row 33 corrected
(binding is ControlsMapper/ControlMode, not DisplayMode) + re-verification
note.
(The companion glass-token palette-generation fix lives on glass-panel-perf --
it depends on the dirty-skip code there. The two branches touch disjoint
hunks and merge in either order.)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -7557,17 +7557,28 @@ void
|
||||
// LEFT AS HEAP GARBAGE and any pixmap pixel >= that count wrote the
|
||||
// garbage's high bits into other displays' planes (the #48 stray
|
||||
// blocks; convicted live by BT_PLANE_AUDIT -- the 480x640 radar
|
||||
// background carries index 217). Cycle the in-plane pattern across
|
||||
// the remainder: high-index art degrades to its (index mod 2^bits)
|
||||
// colour IN-PLANE, and can never leak. (The 1995 binary shipped the
|
||||
// same 64-entry fill and relied on art discipline; garbage is not a
|
||||
// preservable behaviour, so this is a guarded PORT deviation.)
|
||||
// background carries index 217). Map the remainder to the plane
|
||||
// BACKGROUND (translationTable[0]): high-index art renders as the
|
||||
// port's background colour in-plane, and can never leak.
|
||||
//
|
||||
// REFINED 2026-08-10 (the sec-surface phantoms): the first #48 fill
|
||||
// cycled the remainder IN-PLANE (index mod 2^bits), which mapped art
|
||||
// index 254 onto plane slot 62 -- a LIVE colorMapperMultiArmor damage
|
||||
// slot. SMODE.PCC's inactive control-mode box interiors and a stray
|
||||
// 52x13 idx-254 bar baked into BTSEC1.PCX (between the heading dial
|
||||
// and the armor rosette) lit up in the current right-armor damage
|
||||
// colour on every render path. On the shipped machine those regions
|
||||
// rendered BLACK (the heap garbage's low plane bits were 0 ->
|
||||
// in-plane index 0), so background IS the authentic on-screen result.
|
||||
// (The 1995 binary shipped the same 64-entry fill and relied on art
|
||||
// discipline; garbage is not a preservable behaviour, so this stays a
|
||||
// guarded PORT deviation.)
|
||||
{
|
||||
int filled = 1;
|
||||
for (int b = bitMask & 0xFF; b != 0; b &= (b - 1))
|
||||
filled <<= 1;
|
||||
for (int i = filled; i < 256; ++i)
|
||||
translationTable[i] = translationTable[i & (filled - 1)];
|
||||
translationTable[i] = translationTable[0];
|
||||
}
|
||||
Check_Fpu();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user