paavohtl Claude Opus 4.6 (1M context) commited on
Commit
35a783f
·
1 Parent(s): cd4a89f

refactor: rename CTaskFireBall → CTaskGirder

Browse files

The 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 = 26,
 
 
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 CTaskFireBall (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,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 CTaskFireBall (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
- // CTaskFireBall::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_fireball_ctor(buffer, parent as *mut u8, fire_params, local_struct, rb(0x550890));
587
  }
588
 
589
- /// Bridge: CTaskFireBall::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_fireball_ctor(
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 ctor: 0x550890
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