handoff: score report tail reconstruction

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Joe DiPrima
2026-08-05 18:38:48 -05:00
co-authored by Claude Fable 5
parent 91bd28669e
commit b31c6c4527
3 changed files with 71 additions and 0 deletions
+33
View File
@@ -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).
+7
View File
@@ -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])
+31
View File
@@ -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=<own> 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')