-
feat: port weapon fire sub-functions to Rust — Drill, Prod, vtable calls
paavohtl +1: Claude Opus 4.6 (1M context) Replace naked asm bridges with typed Rust implementations:
- fire_worm_vtable_0xe → (*worm).set_state() for 8 weapons (9 call sites)
- Teleport check (0x516930) → pure Rust can_teleport() helper
- Drill fire (0x51E3E0) → pure Rust fire_drill(), fixes latent ECX bug
where bridge didn't set ECX=local_struct
- Prod fire (0x51E480) → pure Rust fire_prod() with trig interpolation;
dy must be negated (original asm uses IMUL -0x66666667)
- Add typed SpecialImpact wrapper (stdcall, 13 params)
- Delete 3 naked asm bridges: fire_worm_vtable_0xe,
call_fire_usercall_ret, call_fire_usercall_stdcall1
Add 3 replay tests: drill_prod_rope (Drill×4, Prod×3),
kamikaze (Kamikaze, Suicide Bomber),
various_weapons_1 (Bat, Blowtorch, Scales×3, Dragon Ball×2, more)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>