#83: the COLLISION DIVERT -- type-0 damage prices as internal rattle, never armor
The crash self-damage reconstruction (9c83a46) exposed its missing second
half: the binary's TakeDamage hub DIVERTS damageType 0 (@0x4a0368) into
FUN_0049ffcc -- an export-gap distributor recovered by raw disasm -- so
collision damage NEVER reaches the zone/armor loop. Without the divert the
mover's raw kinetic-energy figure (60-ton mech: ~1000+ per wall tap, 90k+ on
a hard slam) fell into the WEAPON loop: 'tapped a wall and died instantly'.
The distributor, byte-anchored: gate on the owning player's advancedDamage
copy (+0x268 -- the manual's 'splash/collision damage' technician setting);
scale = (2000/moverMass) / (100 km/h in u/s)^2 / (1 - elasticity^2)
(tbyte 1/3.6 @0x4a0148; mass @+0x20c; elasticity @+0x244); scaled < 0.5 is
FREE; else Round(2x) sub-hits of 0.5 land on random INTERNAL subsystems
(HeatSink family / Gyroscope / Torso, drawn by collisionCriticalHitWeight
@0x10C) via ApplyDamageAndMeasure (@0x4ac07c). Bridges: family derivations
(heat/gyro/torso.cpp), BTPlayerAdvancedDamageOn (btplayer.cpp).
Verified: bhk1 wall test -- 94k slam = 4.2 rattle pts in 8 sub-hits, taps
free (0.049 < 0.5), armor untouched. A/B: arena wall-grind now 0 deaths,
27 rattle events, the limper STAYS GIMPED and peers' replicants re-enter the
gimp cycle between bounded staggers; grass circling unchanged (198 replicant
gimp entries). [crashdmg]/[colldmg] probes document the pricing.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
9c83a468db
commit
14ff3519ac
@@ -6871,6 +6871,15 @@ void
|
||||
fallScalar = -(fallDirection.x * impactVel.x
|
||||
+ fallDirection.y * impactVel.y
|
||||
+ fallDirection.z * impactVel.z);
|
||||
// ALWAYS-log the crash pricing (rare event; the arbiter for the
|
||||
// wall-damage economy -- run 14 field report: "tapped a wall and
|
||||
// died instantly", so the forwarded amount is suspect vs binary).
|
||||
DEBUG_STREAM << "[crashdmg] amount=" << dmg.damageAmount
|
||||
<< " mass=" << moverMass
|
||||
<< " |v|=" << (float)Sqrt(impactVel.x * impactVel.x
|
||||
+ impactVel.y * impactVel.y + impactVel.z * impactVel.z)
|
||||
<< " force=(" << dmg.damageForce.x << "," << dmg.damageForce.y
|
||||
<< "," << dmg.damageForce.z << ")\n" << std::flush;
|
||||
Entity::TakeDamageMessage td(
|
||||
Entity::TakeDamageMessageID,
|
||||
sizeof(Entity::TakeDamageMessage),
|
||||
|
||||
Reference in New Issue
Block a user