The missing half of Advanced Damage, found by call-scanning Explosion::SplashDamage @0042fad0: TWO callers, not one -- Missile::Perform (the known #62 path) and 0x4a0bda, the UN-EXPORTED tail of Mech::TakeDamageMessageHandler itself. Raw disasm @0x4a07b8-0x4a0bda: when the victim ENTERS dead(9)/eject(10) during the applications, the binary sets the wreck burning (id 0x17, deferred -- handler not yet reconstructed), spawns the death Explosion (model 0x31 -- our death-list visuals stand in), and SPLASHES: gates : owning player's advancedDamageOn (+0x264) AND NOT suppressConsole (+0x258 -- eject sets it: PUNCH-OUTS NEVER BLAST, the authentic anti-suicide-bomb rule) damage: type 2 Explosive, amount = deathSplashDamage (mech+0x520), bursts = round(0.001 * moverMass * 15.0) -- scales with tonnage radius: deathSplashRadius (mech+0x524); per-victim falloff bursts/dist^1.25 in the shared core Draco's collision-divert suspicion is settled: the blast is TYPE 2, the divert never touched it -- the tail was simply never reconstructed. Port: deathSplashDamage/Radius PROMOTED from the Wword scratch bank to named Mech members (the bank is one GLOBAL array -- authored per-chassis values were clobbered to the last-loaded mech); BTSplashCore split out of the #62 weapon splash and shared; BTApplyDeathSplash + the death-edge arm in the handler tail; BTPlayerConsoleSuppressed bridge (friend). Bench (2-node, B parked 8.9u from a self-destructing A): blast fired with authored madcat data (radius=50, amount=5, mass=75000 -> 1125 base bursts), B took 73 bursts (falloff exact: 1125/8.91^1.25), cross-pod delivery + cylinder spray verified on B's own log ([dmghit] type=2 burst=73 across zones). ~365 damage at 9u -- Draco's 'double kills on drops' economy restored. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
40 lines
1.4 KiB
Bash
40 lines
1.4 KiB
Bash
#!/usr/bin/env bash
|
|
# #89 DEATH-BLAST verify: B walks to ~12u of A and stands; A self-destructs
|
|
# (fast self-damage); A's death blast must splash B (Explosive, burst-scaled,
|
|
# radius-gated). PASS: A log [splash] DEATH BLAST + SPLASH matchlog to B;
|
|
# B log [dmghit] type=2 from A after A's death. advancedDamage=1 rides the
|
|
# expert egg already.
|
|
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
|
|
rm -f db2_a.log db2_b.log
|
|
bt_expert_egg MP.EGG DB2.EGG
|
|
sed -i "s/^map=.*/map=grass/; s/^time=.*/time=day/; s/^vehicle=.*/vehicle=madcat/" DB2.EGG
|
|
|
|
(
|
|
export BT_SELF_DAMAGE=5 BT_SPLASH_LOG=1
|
|
export BT_DMG_LOG=1 BT_DEATH_LOG=1 BT_MP_LOG=1 BT_MATCHLOG=1
|
|
bt_launch db2_a.log DB2.EGG 0x0C -net 1601
|
|
)
|
|
sleep 2
|
|
(
|
|
export BT_GOTO=enemy BT_GOTO_STOP=12 BT_KEY_NOFOCUS=1 BT_SPLASH_LOG=1
|
|
export BT_DMG_LOG=1 BT_DEATH_LOG=1 BT_MP_LOG=1 BT_MATCHLOG=1
|
|
bt_launch db2_b.log DB2.EGG 0x03 -net 1501
|
|
)
|
|
sleep 5
|
|
python ../tools/btconsole.py DB2.EGG 127.0.0.1:1501 127.0.0.1:1601 > db2_relay.log 2>&1 &
|
|
RELAY=$!
|
|
sleep 190
|
|
kill $RELAY 2>/dev/null
|
|
taskkill //F //IM btl4.exe > /dev/null 2>&1
|
|
sleep 3
|
|
echo "=== A death + blast:"
|
|
grep -aE "death cycle START|DEATH BLAST|\[splash\]" db2_a.log | head -8
|
|
echo "=== B splash received (type=2 from A):"
|
|
grep -a "dmghit" db2_b.log | grep "type=2" | head -6
|
|
echo "=== SPLASH matchlog on A:"
|
|
grep -a "SPLASH" db2_a.log | head -3
|