Files
BT411/scratchpad/night8/leaklamp_pixel.sh
T
Joe DiPrimaandClaude Opus 5 56f15b569a #98: prove the lamp fix -- table pinned to the image, three condensers verified live
Follows the request to prove the whole fix rather than the one case I had.

1. TABLE, all indices: scratchpad/night8/lamptable_check.py asserts the
   reconstructed arrays against BTL4OPT.EXE and exits nonzero on drift.
       kBTCondenserLamp @0051d058  MATCH  07 2F 2E 2D 2B 2A 29
       kBTPlacementLamp @0051d070  MATCH  29 1A 1B 1C 1D
       kFixed (FUN_004cc148 switch) MATCH  2F 2E 2D 2C 2B 2A
   This covers condensers 2/3/5 without hunting zones for them: there is no
   per-index code path, only the array contents, and those are now pinned.

2. LOOKUP PATH, live: condensers 1, 4 and 6 resolve 0x2F, 0x2B and 0x29 --
   exactly the table.  Condenser 4 is the meaningful control: my reverted "fix"
   would have given 0x2C.  Myomers (eng-page path, 0x25/0x21) and SRM6_1 (quad
   button, 0xd) still annunciate, so other subsystem classes are unregressed.

3. GUARD: condenserNumber is parsed from the name's trailing digit
   (NameTrailingNumber, mirroring the binary's atoi), and every condenser in
   BTL4.RES is Condenser1..Condenser6 -- no Condenser0, no bare name.  So the
   1..6 guard covers every shipped case and slot 0 (0x7) is unreachable.  This
   was the real risk in changing `n >= 0` to `n >= 1`; it is closed.

4. PIXELS: leaklamp_pixel.{sh,py} capture a leaking run and an undamaged control
   run from the cockpit and difference their per-pixel temporal variance.  The
   leak is visibly real -- the COOLANT reservoir drains on screen (S 331->330
   while the control sits at 329).

⚠ WHAT THE PIXELS DID NOT SETTLE, and it is not a testing gap.  Lamp 0x29 is
ALSO kBTPlacementLamp[0]: DAT_0051d058[6] and DAT_0051d070[0] are the SAME int32
-- the two tables abut.  So condenser 6's lamp may not be its own loop button at
all, and slot 6 may be an overrun in the BINARY too (its read is unchecked).
Reproducing it is the faithful choice either way, and we now do exactly what the
binary computes -- but whether a pilot sees loop 6's own button light is a
question only someone who played the original can answer.  Asked on the issue.

CORRECTION: 0b98370 claimed @0051d058 "holds gauge-type name strings, so the
provenance is questionable".  That was MY bug -- a PE section-header field-order
mistake (unpacking VirtualSize/VirtualAddress/SizeOfRawData/PointerToRawData
then destructuring in a different order).  The original reconstruction's
provenance was accurate.  The checker in (1) uses the corrected reader.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 12:26:47 -05:00

46 lines
1.7 KiB
Bash

#!/usr/bin/env bash
# #98 PIXEL PROOF: does a leaking condenser's cooling-loop button visibly FLASH?
#
# The log proves the lamp RESOLVES and SetAlertState(True) is called. It does
# not prove a pilot sees anything. A flash is a lamp alternating between two
# appearances, so it shows up as TEMPORAL VARIANCE in that button's pixels --
# and nowhere else on a static cockpit.
#
# Two legs, identical except for the damage:
# leak -- condenser 6 leaking (dz_rarm)
# ctl -- no self-damage at all
# Frames are captured from the cockpit view (the player's actual view) and
# compared by per-pixel variance across frames in leaklamp_pixel.py.
#
# PASS = a variance hotspot in the coolant panel on the leak leg that is absent
# on the control leg.
set -x
. /c/git/bt411/scratchpad/night6/bench_common.sh
cd /c/git/bt411/content || exit 1
taskkill //F //IM btl4.exe > /dev/null 2>&1
sleep 2
sed "s/^map=.*/map=grass/; s/^time=.*/time=day/" MP.EGG > LEAK.EGG
LEG="${1:-leak}"
rm -f lamp_${LEG}_*.png "leakpix_${LEG}.log"
# (bt_launch is a shell FUNCTION -- export into the environment, do not `env`.)
if [ "$LEG" = "leak" ]; then
export BT_SELF_DAMAGE=4 BT_SELF_DAMAGE_ZONE=dz_rarm
else
unset BT_SELF_DAMAGE BT_SELF_DAMAGE_ZONE
fi
# Stand still and do nothing but leak: no autofire, no enemy, no motion, so the
# ONLY thing changing in the cockpit is the lamp we are testing.
export BT_LAMP_LOG=1
export BT_SHOT_EVERY=12 BT_SHOT_PREFIX=lamp_${LEG}
bt_launch "leakpix_${LEG}.log" LEAK.EGG 0x03
sleep 100
taskkill //F //IM btl4.exe > /dev/null 2>&1
sleep 2
echo "=== lamp resolution ==="
grep -E "^\[galarm\] condition 2" "leakpix_${LEG}.log" | sort -u
echo "=== frames ==="
ls lamp_${LEG}_*.png 2>/dev/null | wc -l