Files
BT411/scratchpad/SESSION_HANDOFF_20260803.md
T
2026-08-05 19:46:09 -05:00

427 lines
28 KiB
Markdown

# Session handoff — 2026-08-03 (armor visibility + eject arm chain)
## Committed this session (all on master, exe deployed to content/)
- `fe48acc` **#87 root cause**: zone-level replication send was missing — the binary's
effect watcher (FUN_0042aa2c) ForceUpdates on BAND-THRESHOLD crossings (master-gated);
the port only had the gstate branch. Observers saw 0.0 forever. Fixed + 2-node verified
(replicant peaks == master finals to 4 decimals).
- `440cee1` #87 dig closure: host response is LINEAR (raw re-read @004573e4/@00457784,
0.1 literal at call site); the pixel curve was i860 DIV-CARD firmware (flush_material
@0048d4d4 just marshals) — logged in open-questions. Field claim reconciled: one 25-pt
hit snaps a 77-pt arm 0→0.325 (measured; snap is visible, 2-pt ERS creep is not).
Bench: BT_WALK_ZONES filter (legwalk.sh), BindArmourDamage ORPHAN inventory (0 orphans).
- `8165cee` **#118 eject alive**: the evaluator's per-frame caller found by E8-scan —
FUN_004a9b5c (Mech MASTER PERF, export hole)+0x10 calls @0049fa1c every frame. Restored
at top of Mech::PerformAndWatch (master-gated). Mislabel swept: mech+0x414 =
ejectPermitted (NOT missionReviewMode; real review mode = GLOBAL DAT_004fd550).
Verified: gen-kill → panic-arm mode ON → miniconsole Panic button LIGHTS (pixel proof
panicbtn.png) → punch-out → respawn disarms. BT_EJECT_LOG=1 logs edges.
Also: msg id 0x1a = DuckRequest@0049fa00 latches mech+0x398 — NO reader in image (vestigial).
- `0089b32` **G = Flush binding** (was: action existed, NO key bound — desktop players
could never flush!) + BT_FLUSH_HOLD=<frames> scalpel.
## IN FLIGHT — the user's firsthand eject test (they asked, then had to shut down)
Dry run result (content/fl.log): full flush drains the TANK to 0/14 in ~30 s but does
NOT arm eject — InjectCoolant moves tank coolant INTO the loops (bank RISES); idle heat
draw won't burn the loops below the 5% arm threshold in minutes.
**Firsthand recipe to give the user next session** (needs build with 0089b32 — exe in
content/ is current, but the DIST zip is not):
1. Solo (play_solo), get in.
2. HOLD **G** until the COOLANT RES gauge hits 0 (~30 s; flush cloud + audio confirm).
3. Then run HOT: hold fire (lasers) continuously / keep moving. With the tank dry the
loops burn coolant with no refill. Watch coolant bars fall.
4. When the bank crosses 5%: **the Panic button (bottom-left panel) lights bright**
press it (or Backspace = key Back action Eject) → punch-out.
Faster alternates that also arm: lose all 4 generators; or (novice sim) leg-gimp.
OPEN: how long step 3 takes firsthand (not yet measured — the 3-min idle bench never
armed; sustained fire should be much faster). If it's tediously long, consider whether
weapon heat actually draws LOOP coolant in our reconstruction (#100/#120 territory —
check ConsumeCoolant path under fire before telling testers "minutes").
## Next-session queue
1. Give the user the firsthand recipe above (they explicitly asked to test it).
2. Time-to-arm under sustained fire — bench it (fire scalpel + BT_COOL_LOG) BEFORE
promising the recipe works in reasonable time.
3. Cut dist 717: carries score fix, 28 Hz, eject core+arm chain, #119, #124 triangle
pick, #87 replication send, G-flush binding. Testers verify: missile snap darkening
visible in MP now; eject lamp + punch-out.
4. Gitea: #87 and #118 both commented + awaiting-verification (labels set). #118 note
says flash-vs-solid lamp is answerable if pod veterans remember blinking (GaugeAlarm
SetAlertState overlay — not authored for panic in shipped streams as far as checked).
5. Carried: #55, #100 (reservoir drain — RELATED to step 2 above), #120 (flush floor —
note: our tank DID reach 0/14, so the floor report may be the LOOP levels, not the
tank), #121-#123, #125-#130; mover-gravity dt-less lead in open-questions.
## Bench inventory added today
- scratchpad/night10/zonewalk.sh (A now has BT_ARMOR_LOG + BT_SHOT_EVERY=zwA) — the
standing zone-replication receipt bench; digest_walk.py reads it.
- scratchpad/night10/legwalk.sh — leg/foot concentrated audit (BT_WALK_ZONES=leg,foot).
- scratchpad/night10/armorpx.sh — BT_ARMOR_FORCE 0/1 pixel A/B.
- BT_EJECT_LOG, BT_FLUSH_HOLD, BT_WALK_ZONES, armor ORPHAN dump (BT_ARMOR_LOG).
- Proof artifacts in content/: panicbtn.png, forceladder.png, snapdiff.png, legdiff.png,
dollcrop_*.png (all disposable).
## KB updated (all committed)
combat-damage §Zone-LEVEL replication + snap-vs-creep fidelity boundary;
decomp-reference §4 (effect watcher cluster) + EJECT ARM CHAIN entry;
multiplayer (band-granularity observer model); test-harness (zone-walk armor receipts);
open-questions (i860 DIV-CARD firmware ask).
---
## EVENING SESSION ADDENDUM (the eject sprint + the MFD corruption arc)
### Eject system — COMPLETE and firsthand-verified (commits 8165cee..7872254)
- Arm chain per-frame (FUN_004a9b5c+0x10, E8-scan) [T1]; mislabel swept (mech+0x414
= ejectPermitted; review mode = GLOBAL DAT_004fd550).
- EjectPilot @0049f854 confirmed via the image message table ('EjectPilot' id 0x19);
DuckRequest = id 0x1a @0049fa00 (mech+0x398 latch, NO reader — vestigial).
- ⚠ CORRECTED (same night): an earlier "eject was UNFINISHED/dead code in 4.10"
claim was WRONG — the absolute-pointer scan missed the E8-relative call; the
master perf (FUN_004a9b5c+0x10) evaluates per frame, so the ARCADE's eject was
LIVE. Only the PORT was missing the call (our PerformAndWatch recon predated
knowing the export-hole fn's contents). Swept from code comments same night.
- THE PRESS MODEL [settled]: pilot eject = the PILOT KEYPAD bank while armed
(+ the PANIC key, which reports through that matrix). The MFD soft keys NEVER
pilot-eject in the binary — every page routes them to authored functions
(weapon eng: EjectAmmo; myomer eng: seek toggle) — the flashing engEject cell
is the INVITE LAMP. Our page-gated eng-key eject is a MARKED PORT CONVENIENCE
(deviation), operator-requested; drop it if strictness wins.
- Inputs, all live: Panic button (0x3D→pilot-keypad wire), NUMPAD = pilot keypad
(CONTROLS.MAP `keypad pilot` bindings), Backspace/pad action, and the eng-page
EJECT key (0x0B/0x23/0x03) page-gated in the RIO drain [T3 intent-completion].
MFD soft keys otherwise keep authored functions (streamed .CTL: no 0x200000
records — the 109-record dump is the proof).
- Generator destruction → stateAlarm 4 (GeneratorOut, renamed from placeholder)
[T3 inferred link] → the AUTHORED invite trail flashes (gotoEngineering 0x80 +
engEject 0x85, alarm conditions 4/5).
- KeypressMessageID pinned to binary 0x19 (chain arithmetic gave 0x17 — the armed
press was silently swallowed; two mapper ids 0x17/0x18 remain unreconstructed).
### The MFD corruption arc (gotcha #27) — RESOLVED
Root cause = MY two new draws, not eject logic: (1) the eject-wipe gauge scribbling
a shared ENG/weapon composite plane during eject cycles (re-stubbed, class kept in
btl4gaug for a proper FUN_004c5fb8 draw-op RE); (2) the full-face flash overlays
(L4VB16 + L4GLASSWIN, both REMOVED — the side buttons are big under-surface rects;
the protruding edge IS the lamp; DrawDevSurface's bound texture turned un-reset
fills into gauge-atlas stripes). Pixel-verified clean under full stress; edge lamp
0x27 square-waves 34.0↔28.9 across captures = the flash works at authentic scale.
### Next-session queue (no release went out tonight)
1. Cut dist 717 after a fresh operator pass on 0535a7a-era build.
2. Eject-wipe draw-op RE (FUN_004c5fb8 view vtbl+0x58 arg roles) → un-stub the slot
graphic.
3. The eng-page label-vs-lamp position question: operator saw the flash beside
GEN-MODE, not EJECT, on one page — cross-check the DRAWN eng-page layout
(streamed gauge pages) against kBTEngBankTop math per bank.
4. Authentic generator death (combat crits / overload, not the scalpel) reaching
state 4/5 — then the [T3] MarkGeneratorOut bridge can be checked against the
real transition site (MechSubsystem::TakeDamage/OnAlarmChanged cluster RE).
5. Flash presentation: the edge-lamp scale is the design; if the operator wants
more presence it is a DELIBERATE glass-layer decision (discuss, don't impose).
---
## DAY-2 ADDENDUM (2026-08-04): eject epilogue + the stale-tracker sweep + #108/K-D
### Settled today (all committed, tip 0bd9bb6+)
- Eject FINAL: strict binary model shipped (soft keys never eject; Panic/numpad/
Backspace do; invite lamps decoded -- conds 4/5 = WEAPON ammo/jam purge invite,
cond 6 = bus invite via !HasVoltage; hysteresis tried+REMOVED, flap is authentic;
MarkGeneratorOut bridge removed -- state 4 = the thermal breaker, destruction
touches nothing electrical @0049c9a8). TechStatus bit table in decomp-reference.
- #119 leak-voice stutter: AUTHENTIC (wooHoo latch authored all-zeros + no armer
in the image; the hunt at drained tanks clips the phrase-sequenced voice; our
only real bug was 2x cadence, already fixed). Deterministic leak scalpel added:
BT_KILL_SUBSYS partial form "Condenser4=0.5".
- Tracker STALE sweep: #80 (crits -- landed a5fb96a 07-29, re-verified live:
[critroll] chance=0.01+0.7*lvl^2 byte-extracted) CLOSED; #2 (experience --
wired 07-20, [exp] sentinel live) CLOSED; #22 marked awaiting-verification
(respawn ammo-refill receipts in tonight's logs).
### IN FLIGHT: #108 ghost recurrence + the K/D accuracy report (SAME ACTION)
- #108 hypothesis: per-entity replication dropout on one node (miss death mode +
wreck gstate + respawn teleport together -> frozen ghost at the old spot while
hits register elsewhere). Lead mechanic: the wreck SINK (-8u underground) may
make the entity interest-culled for distant nodes; if re-interest never fires
after the respawn teleport, that node's replicant freezes forever. UNPROVEN --
693 field logs lack entity ids and every discriminating marker is env-gated.
- K/D inaccuracy (night-11 report, build 716): the tally/credit receipts
(PLAYER_DEAD matchlog rows, [score] panel DRAW probe) are ALL env-gated off in
field builds -- logs show only roster rebuilds. Cannot confirm or deny from
the field data. NOTE: K/D columns are replicated state; a #108-style stream
dropout would corrupt both ghosts AND tallies on the same node -- one cause.
- THE ACTION (next block, before cutting 717): make field logs self-diagnosing:
1. players/play_steam.bat (+join*.bat): set BT_MATCHLOG=1 (or a curated
death/score subset if per-shot DMG volume is too hot -- check matchlog.hpp
categories) + BT_SCORE_LOG=1.
2. Entity IDs on the ungated render lines (wreck swap / MakeMechRenderables /
RemakeEntity -- btl4vid).
3. NEW ungated [ghost] staleness detector: a replicant whose last-applied
update record is > N s old while not buried -> one line with entity id +
age + last-known position (the #108 indictment line).
4. Un-gate (or default-on) the respawn un-wreck line.
Then 717's night-11 logs convict #108's mechanism and settle the K/D claim.
### Next-session queue (post-717-cut)
1. The instrumentation block above -> cut 717 -> field night.
2. #35 Owens laser crash; #126 invisible peer fire; #89 splash; #92 Loki feet;
#73 (check against the #124 triangle-pick fix -- likely closable).
3. #118 last tail: MP console notice delivery audit.
### #108 CONFOUND (operator recall, 2026-08-04): Conn Man ran a WRONG BUILD for
much of night 9 -- raw-struct replication + version skew can desync one
connection's stream (one node loses one entity: the exact ghost signature), and
same-build benches can't reproduce (59 clean cycles again today). K/D bookkeeping
verified EXACT both columns (4-node deaths + 2-node cross-player kills,
matchcheck-reconciled). NEW 717 item: BUILD HANDSHAKE at join/relay (version
already in matchlog HDR) -- refuse mismatched builds loudly. Instrumentation
block unchanged (it discriminates skew vs real bug).
### BUILD HANDSHAKE: SHIPPED for Steam (2026-08-04, 22f732f + d050db5)
The #108 build-gate item above is DONE for the Steam path (game/glass/
btl4lobby.cpp, ~60 lines, in the 717 cut):
- Host lobby stamped btl4ver=BT_VERSION_STRING (unique per zip -- btversion
is an always-run custom target, re-stamps from git every build; verified
build/btversion.h ticked 749->754 across today's commits).
- Joiner search filters on exact btl4ver match; the no-lobby log names the
local build so field reports self-diagnose (#68 lesson). Post-join
GetLobbyData verify covers invites/unstamped hosts: loud log + LeaveLobby.
- HOST HALF (the part that catches OLD exes, i.e. the actual Conn Man case):
PublishSelf adds per-member bv=build; the GO mint SKIPS any non-self
member with absent/mismatched bv -> no token in btl4map -> the stale
client's own pre-existing "the host's map is missing us" bail fires (that
code ships in every old build already). Room screen marks such members
[WRONG BUILD -- WILL NOT LAUNCH] so the host sees it BEFORE pressing GO.
- Old-build member experience: sits in room, GO fires, their exe fails the
join back to the FE. They get no in-client message (impossible to add
text to an exe they already have) -- the host-side room marker + REJECT
LobbyLog line are the operator's tools.
- Verified: link clean vs the documented 20-stub /FORCE baseline
(build-and-run.md:28), gate strings confirmed in the deployed exe
(ascii + utf16 scans), content/btl4.exe = committed tree (4.11.754).
NOT yet field-tested (needs two Steam machines; single-account can't
exercise join-vs-host). First 717 Steam night proves it.
- NOT COVERED: LAN/relay (join.bat / btconsole relay) -- a stale zip can
still join a LAN session. Relay-side version check = separate item if
wanted (version already rides the matchlog HDR for post-hoc detection).
- ADDENDUM (648f6b1): join-side rejections now MESSAGE-BOX the player
(LobbyNotice = day-log line + MessageBox): BUILD MISMATCH (probe
re-search without the version filter names the host's build vs ours,
read from list-cached lobby data without joining), NO LOBBY FOUND,
STEAM UNAVAILABLE, LEFT BEHIND (no token in btl4map). Old exes still
quit silently on rejection (unfixable in the field); host roster
marker is the operator's view. content/btl4.exe = 4.11.756 (648f6b1).
### #91 thor "black rectangle": ROOT-CAUSED + FIXED (2026-08-04)
Ronin's report (3rd sighting) pinned it: the rectangle = the thor's OWN
thx_msl missile-pod mount plate. The inside view is a per-mech AUTHORED
type-A set (KB "exactly one mesh" claim corrected in cockpit-view.md):
thor = cop+tor+MSL, owens = cop+BOTH LEGS+tshd, sunder/loki/avatar =
cop+tor. Pilot-facing surfaces are <pfx>skin:blakskn_dz_* -- the same
interior-structure material as the canopy frame -- but the unlit frame
constant keyed on the _cop FILENAME, so pod/legs rendered void (0,0,0)
instead of (0.13,0.12,0.15). bgfload now keys on the material family
(mechfx shadow quads excluded). Verified by walking captures (zero
pure-black lower-band px; plate blends with the frame bar at rest).
Diags: BT_MAT_LOG, BT_HIDE_INSIDE_SEG, [view] roster names; bench
scratchpad/night11/thorrect.sh. #91 labeled awaiting-verification --
Ronin should re-fly the thor on 717.
### #92 loki feet: ALREADY FIXED -- bench-verified 2026-08-04
Zone-walk rig vs a LOKI target (scratchpad/night11/zonewalk_loki.sh):
both feet take aimed direct fire (lfoot zone 4 / rfoot zone 15, pick
resolves correctly, 7 dmg applications each, all 21 zones alive).
Oracle's night-7 report was build 659 = pre-#124 pick fix; collateral,
cured. Labeled awaiting-verification -- Oracle re-flies on 717.
### #124 twist-sign verify: DONE -- sign CORRECT (2026-08-04)
The last inferred half of the frame adapter is now runtime-verified:
torso pinned 0/+140/-140 (new BT_FORCE_TWIST sim-level diag; the input-
level pin was dead -- CONTROLS.MAP device push owns live input, Basic
auto-centers), LRM salvos, new [slice] log (twist, thetaIn/Adj, wedge).
Picks track the physically-facing flank both directions; wrong sign
excluded (slice 7 vs observed slice 1). No game-code change. Remaining
on #124: only the 717 field re-run of Oracle's audit rows.
### RESPAWN-RESET AUDIT (2026-08-04, operator request): COMPLETE
Full matrix in docs/RESPAWN_REARM_PLAN.md addendum. Fixed: coolant VALVES
(Condenser @004ae534 raw-disasm'd -- missing from export; detent->1 +
massScale restore + Mech::Reset's @0049f788 recompute tail; bench receipt
"detent 5 -> 1") and #129 SPAWN SMOKE (replicant un-wreck edge now runs
the @004d0c14 effect cleanup; peers-only symptom explained). AUTHENTIC
(no fix): weapon->gen taps + MFD display/control modes persist (mapper
vtables = root bodies, read from exe). #55/#129 commented, labeled.
Bench: scratchpad/night11/respawnreset.sh.
### CUT: BT411_4.11.767.zip (2026-08-04) -- the "717" field build
dist/BT411_4.11.767.zip, stamp 4.11.767 (81dda84), STEAM=ON EXPIRE=ON.
Carries the whole two-day ledger PLUS today: Steam build gate (both
halves + player-visible rejections), #91 pod-plate fix, #92 receipts,
#124 twist-sign verify, respawn-reset audit (valves + #129 smoke), and
the #108 forensics block (ghost detector verified both ways, render IDs,
field envs in the bats). Zip contents verified by direct inspection
(gate strings, ghost string, bat envs, clean stamp).
FIELD NIGHT CHECKLIST: #87 snap darkening, eject flow, #91 (Ronin re-fly
thor), #92 (Oracle re-fly loki feet), #129 spawn smoke, valve reset,
#22/#35/#55 awaiting-verification items, and #108 -- gate guarantees
same-build, so any ghost now leaves a [ghost]/GHOST record.
### RE-CUT: BT411_4.11.771.zip supersedes 767 (never distributed)
Merged Cyd's glass-lamp-latency (per-frame lamp STATE sweep, glass only,
BT_GLASS_LAMP_SWEEP=0 restores; #45 citation in his comment fixed to
"field reports"). Smoke-tested: cockpit + all MFD panels un-regressed,
no compositor artifacts. SCOPE NOTE for testers: this fixes BUTTON/lamp
responsiveness under load in all glass layouts INCLUDING separate
windows; instrument-SURFACE refresh (needles/pages) still rides the
throttled background gauge sweep and can lag on heavy missions -- the
background-sweep starvation dig is the follow-up. 767 zip deleted.
### #124 CORRECTION: per-PANEL hull zones (2026-08-04, field pushback)
The "aimed torso = always center" claim was WRONG -- players' era memory
was right. Proof: MAD_TOR patch tags (9 hull zones in the art), dpl
GEOGROUP-granularity hit block, @49db20 has no runtime caller. Pick now
resolves the struck patch's dz_* zone via the #87 dmgBinds (segment
dzone fallback); ZoneAimPoint aims patch centroids. Bench: every hull
panel resolves individually (utorso 11/12; pre-fix 102/102 -> dtorso),
victim applied across all panel families. KB + release notes corrected;
#124 tracker comment posted. Oracle's audit re-run on the new build is
the acceptance test.
### NIGHT 12 FIELD RESULTS (2026-08-04, build 4.11.774) -- "mostly a win"
TEN issues field-verified + CLOSED with receipts: #124 (per-panel
targeting ACCEPTED, all 8 chassis perfect incl. searchlight), #16, #73,
#87 (darkening + per-panel smoke "working very well"), #129, #92, #91
("thor bowtie worked"), #55 (valves/loops reset, assignments persist),
#68 (wrong-build join rejected VISIBLY -- gate held in the field), #118
(panic arms on all 3 authored conditions; dunce-cap notice works).
NO ghost report all night; skating returned instead (#52 commented: 3
sightings with times). NEW ISSUES #131-#138: reticle false-lock/no-reg
(BLACKHAWK-correlated -- the operator's headline; sphere-fallback +
NO-TRIS leads flagged in the issue), Conn Man's yellow HUD line, gen
X-out era question, panic score penalty missing, Rajel's non-glass leak
lamps, leak/component-toggle interaction (repro pending), Oracle's
maxed-myomer respawn, glass unfocused-window flash throttle (Cyd
root-caused + fixing, plus red panic button + vPlasma noframe).
Field logs staged UNSCANNED: scratchpad/night12/steam_20260804_{a,b,c}
.log (gitignore-verified). Probable mapping from chat headers:
MS-FIREFLY/santo=Conn Man (Steam DOWN -- winsock fallback, note!),
GAMERSLAB/rajel=RajelAran, SCREECH-PC/Dave=Oracle -- confirm from
session headers at scan time. NEXT: log scan (crash @8:45PM ET Oracle
lobby launch; [ghost] lines vs skating windows; #131 forensics).
### #131 FALSE LOCK: FIXED -- miss-means-miss (2026-08-05)
Root cause: sphere + AABB fallbacks answered where the 1995 card would
MISS; exposed by LEVEL boresight over the SHORT blackhawk (ray clears the
mesh, threads the spheres -- ring lit above its head; operator watched it
live). Fix: pick returns hit/TRUE-MISS/no-tree; spheres only for
unreadable meshes (none exist); AABB only pre-tree. Receipts: level
sweep 0 locks (was 168 sphere answers); down-pitch 100% tri-sourced;
walk matrix tri=18874/sphereFB=0, 156 hits across 16 zones on bhk1.
New instruments: BT_LOCK_SWEEP / BT_LOCK_ENVELOPE / [picksrc] counters.
BUILD RITUAL (stale-link flake, bit 3x today): rm build/Release/btl4.exe
before the build, string-verify the new exe before deploying.
FIELD NOTE: locking strictly tighter now; if era testers want linger,
that becomes a sourced investigation (Draco's memory, #131 comment).
### NIGHT-12 LOG SCAN (2026-08-05): 3 staged players, ~49 sessions, all 774
- SKATING DISCRIMINATED: zero [ghost] lines anywhere -> records flowed ->
#52/#130 is the GAIT/LEG-STATE replication path, NOT starvation. Next:
2-node gait-state bench.
- #134 CONFIRMED from data: 3 punch-outs -> 3 DWH notices -> deaths, ZERO
score awards any sign (SCORE_LOG forced on). Mechanism: eject = self-
damage killBonus; kill-scoring never engages for self-kill; authentic
debit likely rides the DEFERRED id-0x16 kill-report block -- that
reconstruction is the fix.
- Oracle's 8:45PM "crash": 7-line session dying between "lobby up" and
the room screen, no exception -- filed with fingerprint (new issue).
- Conn Man winsock header: ONE failed boot (Steam not ready), relaunched
46s later on Steam -- benign, no mixed transport.
- #135/#137: field logs lack lamp/heat instrumentation -- RECOMMEND
adding BT_LAMP_LOG=1 to players/*.bat next cut; both need local repro.
### #52 SKATE detector: negative-verified, awaiting field or gimp bench
[skate]/SKATE forensic on master (channel-agnostic -- first build keyed
legCycleSpeed alone and false-fired; peers pose from the BODY channel).
2-node bench: 7 respawn-while-moving cycles, zero hits, zero false
fires. Field logs already ruled out starvation. NEXT provocations:
leg-gimped walker (#82 family), 6-player load. The detector rides the
next cut regardless -- one field SKATE record names the failing case.
### #52 LAB CAMPAIGN CLOSED (2026-08-05): matrix passes, field instrument rides
Healthy walk / 7x respawn-while-moving / gimp-onset at speed / 21s
SUSTAINED GIMPED WALKING (BT_SELF_DAMAGE_ZONE=dz_ldleg -- the recipe) /
leg-death (authentic at 1.0) / respawn: ZERO skate, and the peer's gimp
view verified live (gl=3, gimp bodyStates cycling => #82 holds). Field
skating needs field scale -- [skate]/SKATE detector ships next cut.
BT_LAMP_LOG=1 added to the three player bats (#135 forensics).
Bench recipe archive: scratchpad/night12/skatebench7.sh (clean-room;
sed-derived script chains dropped envs twice -- write benches fresh).
READY TO CUT: everything since 774 incl. #131 fix + both detectors.
### #89 DEATH BLAST: reconstructed + verified (2026-08-05, pre-cut)
Second SplashDamage caller found in the TakeDamage tail (raw disasm
@0x4a07b8-0x4a0bda). Gates: advancedDamageOn && !suppressConsole
(ejects never blast). Damage: Explosive, authored DeathSplashDamage/
Radius (PROMOTED from the global Wword bank -- was clobbered per-mech),
bursts = 0.015 x moverMass, falloff dist^1.25 in the shared core.
Bench: madcat radius=50 amt=5 mass=75000 -> neighbor at 8.9u took 73
bursts cross-pod, SPLASH/DMG reconciled. Deferred: burning dispatch
(0x17 handler), score post (id-0x16, #134). #89 awaiting-verification.
## 2026-08-05 (later): #45/#134 -- the authentic score/death report tail (91bd286)
User said "see it through" on the deferred id-0x16 block. Full reconstruction from raw disasm of
the dark-gap tail (@0x4a02f4-0x4a0890):
- THE BIG DECODES: BTPlayer handler table byte-scanned (file 0x112dxx): 6 entries, 0x16 Score ->
@0x4c02e4 (the type-switch handler; our port's transcription was already faithful), 0x17
VehicleDead -> @0x4c05c4, 0x1a ScoreUpdate; @0x4c0200 ("ScoreInflicted") IN NO ENTRY = dead
1995 code. The death tail's id-0x17 message = Player::VehicleDeadMessage (NOT SetBurningState
-- #89 banner corrected; mech-table 0x17 label/body mismatch logged in open-questions).
1995 SCORING MODEL [T1]: kills + received-damage penalties + death costs. NO per-hit credit
(type-0 lands in a Verify arm that folds an UNINIT stack float -- real 1995 bug; port banks 0).
Kill award = (victimKillBonus + tally) x inflictedMod x (victimAvgDmg@0x354 x damageBias + 1)
x tonnage ratio; teamkill = -ffPenalty; SELF-KILL NEGATED (fchs @0x4c03ab) = the #134 penalty.
- CODE: BTMechPostCombatReports + BTMechPostVehicleDead (btplayer.cpp bridges); mech.cpp handler
restructured (death latch at ENTRY, collision divert falls through to the tail per @0x4a0375
jmp -- wall deaths now respawn+blast); BT VehicleDeadMessage 0x38 ext {killed-by player, kill
zone}; ScoreMessage fields renamed (vitalHit/zoneIndex/subsysID) + wire static_asserts;
VTVDamaged points_transfered corrected (Round(award), not Now() -- ST0-arg __ftol misread).
RETIRED: BTPostDamageScore/BTPostKillScore + 3 call sites + the mech4 VehicleDead dispatch
(the [T3 sender-undecoded] flag is resolved -- this IS the sender).
- BENCHES (all PASS): scorekill.sh cross-node kill (killer kills=1 award=4.88; victim log
killedBy=2:1 zone=3; death #1 single cycle); scoreself.sh #134 (type=2 award=-39.00 kills=0,
total drops); deathblast2.sh regression (72 bursts ~9u). Collision-tail = inspection [T3].
Bench gotchas hit: spinner target splits leg damage across legs (drop BT_SPIN_SELF);
BT_ZONE_WALK=60 paces pulses too slow (use =8 + BT_WALK_ZONES=dz_ldleg for a ~2min kill).
- TRACKER: #134 CLOSED (awaiting-verification) w/ bench receipts; #45 + #89 follow-up comments.
- KB: combat-damage (new report-tail section), decomp-reference (BTPlayer table + role offsets +
msg layouts + mech+0x354), open-questions (0x17 mislabel, @0x4c05c4 ext-field consumption,
collision bench, uninit-award curiosity), multiplayer, KD_SCOREBOARD addendum. checkctx CLEAN.
- FIELD-VISIBLE CHANGE FOR RELEASE NOTES: score column now behaves like 1995 (kills pay,
taking damage costs, panic eject costs, per-hit credit gone). KILLS/DEATHS columns unchanged.
- NOT DONE: burning-state (mech-0x17 mislabel blocks it); @0x4c05c4 killed-by consumption
(sender carries the fields); DIV firmware intersection routine (unchanged).
## 2026-08-05 (evening): SEARCHLIGHT reconstructed (412053d + KB commit)
User picked searchlight over crouch (crouch's +0x398 consumer is un-located in the export = an
open-ended dig; parked). Findings + state:
- SUBSYSTEM was already DONE (searchlight.cpp); input already bound (F5 -> streamed 0x14).
The GAP was visuals, decoded from @004cef28 case 0xbd8 [T1]:
COCKPIT = FOG SWAP (fog= lit set vs nosearchlightfog= dark set, authored per BTDPL.INI page;
arena_night 40/400 vs 5/400!) via SetFogStyle 2/3 -- the engine kept ALL of it by name;
completed the stubbed plane application + transcribed the @456778/@456814 watcher into
TickSearchlight (inverted-cache first-tick sync = authentic DARK night start).
EXTERNAL = spot.bgf cone on the searchlight SITE joint, LightOn-driven (@45612c watcher);
site segments now get geometry-less DCS children (were skipped entirely).
- FIDELITY BUG FIXED: all prior builds rendered the LIT fog permanently (nothing ever called
SetFogStyle(3)). Tonight night is AUTHENTICALLY DARK -- release notes MUST say "press the
searchlight (F5)" or expect "game too dark / broken" reports.
- mountSegment @0x1DC identified (was "commandedOn, role unidentified") = resource segmentIndex.
- BENCHED: searchfog.sh (solo: first-tick dark sync, press->SetFogStyle(2), red-fog probe proves
the fog pipeline end-to-end), spotcone.sh (2-node: B press -> replication -> A "[spot] cone
SHOWN (seg 20)"). Bench traps hit: BT_BTNTEST too early (2-node spawn ~poll 900), the
renderer-level LoadObject wrapper is a btstubs NO-OP (marker case dormant! open-questions) --
cone loads via d3d_OBJECT::LoadObject direct.
- OPEN: cone size/aim eyeball pass (user launch); des_night pages have subtle deltas (arena =
the drama); LoadObject wrapper + dormant marker.
- NOT DONE tonight: crouch (0x1a DuckRequest latch is 4 lines; the CONSUMER needs a byte-scan
dig for [reg+0x398] readers -- a good quiet-day project).