From b31c6c4527d0322c013b7941737f7daf9a22a770 Mon Sep 17 00:00:00 2001 From: Joe DiPrima Date: Wed, 5 Aug 2026 18:38:48 -0500 Subject: [PATCH] handoff: score report tail reconstruction Co-Authored-By: Claude Fable 5 --- scratchpad/SESSION_HANDOFF_20260803.md | 33 ++++++++++++++++++++++++++ scratchpad/night12/score_receipts.py | 7 ++++++ scratchpad/night12/score_receipts2.py | 31 ++++++++++++++++++++++++ 3 files changed, 71 insertions(+) create mode 100644 scratchpad/night12/score_receipts.py create mode 100644 scratchpad/night12/score_receipts2.py diff --git a/scratchpad/SESSION_HANDOFF_20260803.md b/scratchpad/SESSION_HANDOFF_20260803.md index 40f5878..4a08ec9 100644 --- a/scratchpad/SESSION_HANDOFF_20260803.md +++ b/scratchpad/SESSION_HANDOFF_20260803.md @@ -366,3 +366,36 @@ 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). diff --git a/scratchpad/night12/score_receipts.py b/scratchpad/night12/score_receipts.py new file mode 100644 index 0000000..7d2995b --- /dev/null +++ b/scratchpad/night12/score_receipts.py @@ -0,0 +1,7 @@ +import sys +sys.path.insert(0, r'C:\git\bt411\scratchpad\night7') +import gitea + +for n in (45, 134, 89): + d = gitea.call(f'/issues/{n}') + print(n, d['state'], d['title'][:60]) diff --git a/scratchpad/night12/score_receipts2.py b/scratchpad/night12/score_receipts2.py new file mode 100644 index 0000000..762eceb --- /dev/null +++ b/scratchpad/night12/score_receipts2.py @@ -0,0 +1,31 @@ +import sys +sys.path.insert(0, r'C:\git\bt411\scratchpad\night7') +import gitea + +# 134: the fix landed -- close with receipts + awaiting-verification +gitea.call('/issues/134/labels', method='POST', payload={'labels': [8]}) +gitea.close(134, +"""FIXED at 91bd286 -- the panic/self-kill penalty is live. + +Root cause chain (from the night-12 scan): the eject charge kills you with inflictor=SELF, and the old kill-credit stand-in (BTPostKillScore) FILTERED killer==victim, so the score path never engaged for a self-kill. + +The fix is the authentic reconstruction, not a patch: the dark-gap report tail of Mech::TakeDamageMessageHandler (@0x4a04da-0x4a0890, raw disasm) now dispatches the binary's kill report even when killer==victim, and the score handler @0x4c02e4 does what 1995 did: negates the whole kill award (raw disasm @0x4c03ab fchs) and skips killCount++. + +Bench receipt (scoreself.sh, self-destruct with inflictor=SELF): +``` +[score] *** KILL report *** -> shooterPlayer= tally=39 +SCORE player=3:1 type=2 award=-39.00 total=0.00 kills=0 +SCORE player=3:1 type=1 award=0.00 total=-39.00 kills=0 <- penalty LANDED +``` +kills stays 0, score drops by the (negated) kill award. With authored roles the magnitude scales by killBonus/damageInflictedModifier/tonnage ratio exactly as a real kill would. + +Field verify tonight: panic-eject and watch the SCORE column drop with no kill credited.""") + +# 45 (closed): append the plumbing-completion note +gitea.comment(45, +"""Follow-up at 91bd286: the deferred id-0x16 report plumbing this issue's fix worked AROUND is now reconstructed outright -- the victim's TakeDamage handler dispatches the binary's three score reports (@0x4a04da/@0x4a05d9/@0x4a06c0) and the BT-extended VehicleDead {killed-by player, kill zone}. The kill-credit reroute shape verified here (victim node -> replicant-player Dispatch -> killer's master) is unchanged and re-benched cross-node (scorekill.sh: kills=1, award=4.88, killedBy=2:1 zone=3). BTPostKillScore/BTPostDamageScore are retired; per-hit inflicted credit is gone (never existed in 1995 -- @0x4c0200 is bound in no handler-table entry).""") + +# 89: correct the deferred-sibling note +gitea.comment(89, +"""Correction to the deferred-siblings note above (found while reconstructing the report tail at 91bd286): the id-0x17 0x38-byte message in the death tail is NOT a mech-table SetBurningState dispatch -- it is Player::VehicleDeadMessage (the BTPlayer handler table binds 0x17 -> @0x4c05c4), i.e. the respawn trigger, in a BT extension carrying the killed-by player + kill zone. Now reconstructed + benched. The burning-state question moves to open-questions (the mech-table 0x17 name row mismatches its handler body @0x49f674 -- likely a shifted label). Death blast re-verified un-regressed after the tail reorder (deathblast2: 72 bursts at ~9u).""") +print('receipts posted')