Three root causes, all fixed: 1. kDamageScale was 1.0 -- _DAT_004bafbc is an x87 float80 = 1e-7, cancelling the ctor's x1e7: damagePortion = authored DamageAmount x (charge/seekV)^2 (closed form at fire time; madcat AC=25/LRM=50/ERLL=6, bhk1 PPC=12/SRM=35). The observed "0.25" was the degenerate EC=1 fallback, never authored data. 2. CheckFireEdge NaN latch: TriggerState carries ControlsButton INTS; the release value (-65) is a negative NaN. The binary's x87 unordered compare read it as "released"; IEEE-correct float compares latched the edge detector shut after the first release -- the reason the emitter discharge chain NEVER fired in-game. Fixed with bit-pattern sign compares. 3. The weapon-side submission LIVE: Emitter::FireWeapon fills damageData (amount + damageForce=target-muzzle [the gyro directional-bounce feed] + impact) -> MechWeapon::SendDamageMessage (@004b9728 real body) -> messmgr consolidation with per-weapon records + explosion bundling. The mech4 bring-up damage block + flat kShotDamage retired to diag hooks. Bonus: LODReuseHysteresis 0.82 -> 0.33 (double misread). Zone model verified byte-exact (no change). Solo end-to-end: 5-record volleys (2 PPC + 3 ERML with authored amounts), per-weapon zone granularity, explosions, kill. Heat stays bring-up scale pending the heat-calibration audit [T3]. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
14 lines
569 B
Python
14 lines
569 B
Python
import capstone, struct, sys
|
|
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
|
|
data=open(r"C:/git/bt411/content/BTL4OPT.EXE","rb").read()
|
|
CODE_VA=0x401000; CODE_RA=0xE00
|
|
md=capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32)
|
|
def dump(start,end,lo,hi):
|
|
code=data[CODE_RA+(start-CODE_VA):CODE_RA+(end-CODE_VA)]
|
|
for ins in md.disasm(code,start):
|
|
if lo <= ins.address <= hi:
|
|
print(f"{ins.address:08x}: {ins.mnemonic} {ins.op_str}")
|
|
print("---")
|
|
dump(0x4baa88,0x4bad10,0x4bac90,0x4bacf5)
|
|
dump(0x4bace8,0x4baf20,0x4bae70,0x4baef5)
|