refactor: rename CTaskFireBall → CTaskGirder
Browse filesThe only creation site for this task type is FireWeapon__Girder (0x51E350).
The "FireBall" name was a legacy RE guess; it's actually a short-lived
terrain placement task for girder/bridge objects.
Rename in ClassType enum (26 = Girder), weapon.rs comments, task-hierarchy
docs, and Ghidra labels.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
crates/openwa-core/src/game/class_type.rs
CHANGED
|
@@ -33,7 +33,9 @@ pub enum ClassType {
|
|
| 33 |
Cloud = 23,
|
| 34 |
Fire = 24,
|
| 35 |
Gas = 25,
|
| 36 |
-
FireBall
|
|
|
|
|
|
|
| 37 |
SeaBubble = 27,
|
| 38 |
Land = 28,
|
| 39 |
ScoreBubble = 29,
|
|
|
|
| 33 |
Cloud = 23,
|
| 34 |
Fire = 24,
|
| 35 |
Gas = 25,
|
| 36 |
+
/// Girder placement task. Previously "FireBall" in RE sources — renamed
|
| 37 |
+
/// after confirming the only creation site is FireWeapon__Girder (0x51E350).
|
| 38 |
+
Girder = 26,
|
| 39 |
SeaBubble = 27,
|
| 40 |
Land = 28,
|
| 41 |
ScoreBubble = 29,
|
crates/openwa-wormkit/src/replacements/weapon.rs
CHANGED
|
@@ -557,7 +557,7 @@ unsafe fn fire_mail_mine_mole(worm: *mut CTaskWorm) {
|
|
| 557 |
|
| 558 |
/// Girder (type 4 subtype 3) — pure Rust port of 0x51E350.
|
| 559 |
///
|
| 560 |
-
/// Allocates a
|
| 561 |
/// as constructor arguments, and calls the constructor. The constructor handles
|
| 562 |
/// actually placing the girder on the landscape.
|
| 563 |
///
|
|
@@ -573,26 +573,26 @@ unsafe fn fire_girder(
|
|
| 573 |
let table = SharedDataTable::from_task((*worm).as_task_ptr());
|
| 574 |
let parent = table.lookup(0, 0x19);
|
| 575 |
|
| 576 |
-
// Allocate
|
| 577 |
let buffer = wa_malloc(0xA4);
|
| 578 |
if buffer.is_null() {
|
| 579 |
return;
|
| 580 |
}
|
| 581 |
core::ptr::write_bytes(buffer, 0, 0x84);
|
| 582 |
|
| 583 |
-
//
|
| 584 |
// stdcall(this, 7×fire_param DWORDs, local_struct), RET 0x24.
|
| 585 |
// Copy 7 DWORDs from fire_params onto the stack via the naked bridge.
|
| 586 |
-
|
| 587 |
}
|
| 588 |
|
| 589 |
-
/// Bridge:
|
| 590 |
/// stdcall(this, 7 DWORDs from fire_params, local_struct), RET 0x24.
|
| 591 |
///
|
| 592 |
/// The original copies 7 DWORDs from fire_params onto the stack via REP MOVSD.
|
| 593 |
/// We replicate this by pushing them individually in reverse order.
|
| 594 |
#[unsafe(naked)]
|
| 595 |
-
unsafe extern "C" fn
|
| 596 |
_this: *mut u8, _parent: *mut u8, _fire_params: *const WeaponFireParams,
|
| 597 |
_local_struct: *const u8, _addr: u32,
|
| 598 |
) {
|
|
|
|
| 557 |
|
| 558 |
/// Girder (type 4 subtype 3) — pure Rust port of 0x51E350.
|
| 559 |
///
|
| 560 |
+
/// Allocates a CTaskGirder (0xA4 bytes), copies 7 DWORDs from fire_params
|
| 561 |
/// as constructor arguments, and calls the constructor. The constructor handles
|
| 562 |
/// actually placing the girder on the landscape.
|
| 563 |
///
|
|
|
|
| 573 |
let table = SharedDataTable::from_task((*worm).as_task_ptr());
|
| 574 |
let parent = table.lookup(0, 0x19);
|
| 575 |
|
| 576 |
+
// Allocate CTaskGirder (0xA4 bytes), zero first 0x84
|
| 577 |
let buffer = wa_malloc(0xA4);
|
| 578 |
if buffer.is_null() {
|
| 579 |
return;
|
| 580 |
}
|
| 581 |
core::ptr::write_bytes(buffer, 0, 0x84);
|
| 582 |
|
| 583 |
+
// CTaskGirder::Constructor — usercall(EAX=parent) +
|
| 584 |
// stdcall(this, 7×fire_param DWORDs, local_struct), RET 0x24.
|
| 585 |
// Copy 7 DWORDs from fire_params onto the stack via the naked bridge.
|
| 586 |
+
call_girder_ctor(buffer, parent as *mut u8, fire_params, local_struct, rb(0x550890));
|
| 587 |
}
|
| 588 |
|
| 589 |
+
/// Bridge: CTaskGirder::Constructor — usercall(EAX=parent) +
|
| 590 |
/// stdcall(this, 7 DWORDs from fire_params, local_struct), RET 0x24.
|
| 591 |
///
|
| 592 |
/// The original copies 7 DWORDs from fire_params onto the stack via REP MOVSD.
|
| 593 |
/// We replicate this by pushing them individually in reverse order.
|
| 594 |
#[unsafe(naked)]
|
| 595 |
+
unsafe extern "C" fn call_girder_ctor(
|
| 596 |
_this: *mut u8, _parent: *mut u8, _fire_params: *const WeaponFireParams,
|
| 597 |
_local_struct: *const u8, _addr: u32,
|
| 598 |
) {
|
docs/re-notes/task-hierarchy.md
CHANGED
|
@@ -28,7 +28,7 @@ CTask (base) vtable: 0x669F8C ctor: 0x5625A0
|
|
| 28 |
├── CTaskDirt ctor: 0x54EDC0
|
| 29 |
├── CTaskFlame ctor: 0x54F0F0
|
| 30 |
├── CTaskFire ctor: 0x54F4C0
|
| 31 |
-
├── CTaskFireBall
|
| 32 |
├── CTaskGas ctor: 0x554750
|
| 33 |
├── CTaskSmoke ctor: 0x5551D0
|
| 34 |
├── CTaskCloud ctor: 0x5482E0
|
|
|
|
| 28 |
├── CTaskDirt ctor: 0x54EDC0
|
| 29 |
├── CTaskFlame ctor: 0x54F0F0
|
| 30 |
├── CTaskFire ctor: 0x54F4C0
|
| 31 |
+
├── CTaskGirder (was CTaskFireBall) ctor: 0x550890
|
| 32 |
├── CTaskGas ctor: 0x554750
|
| 33 |
├── CTaskSmoke ctor: 0x5551D0
|
| 34 |
├── CTaskCloud ctor: 0x5482E0
|