paavohtl Claude Opus 4.6 (1M context) commited on
Commit
94ea94e
·
1 Parent(s): cdeebef

refactor: distribute task class addresses to their home modules

Browse files

Move all CTask* class blocks from address.rs into their respective
task/ module files. address.rs re-exports via pub use so all existing
va::* call sites are unchanged.

Moved to task/base.rs: CTask, CTaskLand, CTaskDirt, CTaskSpriteAnim,
CTaskCPU, CTaskSeaBubble, + 10 ctor-only entities
Moved to task/game_task.rs: CGameTask
Moved to task/worm.rs: CTaskWorm
Moved to task/turn_game.rs: CTaskTurnGame
Moved to task/missile.rs: CTaskMissile
Moved to task/mine_oil_drum.rs: CTaskMine, CTaskOilDrum
Moved to task/supply_crate.rs: CTaskCrate
Moved to task/cloud.rs: CTaskCloud
Moved to task/filter.rs: CTaskFilter
Moved to task/fire.rs: CTaskFire
Moved to task/team.rs: CTaskTeam

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

crates/openwa-core/src/address.rs CHANGED
@@ -27,43 +27,41 @@ pub mod va {
27
  // Class definitions (vtable + constructor + vtable methods)
28
  // =========================================================================
29
 
30
- crate::define_addresses! {
31
- class "CTask" {
32
- /// CTask vtable - 7 virtual method pointers
33
- vtable CTASK_VTABLE = 0x0066_9F8C;
34
- /// CTask constructor - initializes base task fields and children list
35
- ctor/Stdcall CTASK_CONSTRUCTOR = 0x0056_25A0;
36
- /// CTask::vtable0 - initialization/unknown
37
- vmethod CTASK_VT0_INIT = 0x0056_2710;
38
- /// CTask::Free - destructor/deallocation
39
- vmethod CTASK_VT1_FREE = 0x0056_2620;
40
- /// CTask::HandleMessage - message dispatch
41
- vmethod CTASK_VT2_HANDLE_MESSAGE = 0x0056_2F30;
42
- /// CTask::vtable3 - unknown
43
- vmethod CTASK_VT3 = 0x0056_13D0;
44
- /// CTask::vtable5 - unknown
45
- vmethod CTASK_VT5 = 0x0056_2FA0;
46
- /// CTask::vtable6 - unknown
47
- vmethod CTASK_VT6 = 0x0056_3000;
48
- /// CTask::ProcessFrame
49
- vmethod CTASK_VT7_PROCESS_FRAME = 0x0056_3210;
50
- }
51
-
52
- class "CGameTask" {
53
- /// CGameTask vtable - extends CTask vtable with 12 more methods
54
- vtable CGAMETASK_VTABLE = 0x0066_41F8;
55
- /// CGameTask sound emitter vtable (embedded sub-object at offset 0xE8)
56
- vtable CGAMETASK_SOUND_EMITTER_VT = 0x0066_9CF8;
57
- /// CGameTask constructor - calls CTask ctor, sets physics defaults
58
- ctor/Stdcall CGAMETASK_CONSTRUCTOR = 0x004F_ED50;
59
- /// CGameTask::vtable0 override
60
- vmethod CGAMETASK_VT0 = 0x004F_F1C0;
61
- /// CGameTask::Free override
62
- vmethod CGAMETASK_VT1_FREE = 0x004F_EF10;
63
- /// CGameTask::HandleMessage override
64
- vmethod CGAMETASK_VT2_HANDLE_MESSAGE = 0x004F_F280;
65
- }
66
 
 
67
  class "DDGameWrapper" {
68
  /// DDGameWrapper vtable
69
  vtable DDGAME_WRAPPER_VTABLE = 0x0066_A30C;
@@ -232,137 +230,6 @@ pub mod va {
232
  fn/Stdcall DISPLAY_GFX_INIT_TEAM_PALETTE_DISPLAY = 0x0057_03E0;
233
  }
234
 
235
- // === CTask entity classes ===
236
-
237
- class "CTaskWorm" {
238
- /// CTaskWorm vtable
239
- vtable CTASK_WORM_VTABLE = 0x0066_44C8;
240
- /// CTaskWorm constructor
241
- ctor CTASK_WORM_CONSTRUCTOR = 0x0050_BFB0;
242
- }
243
-
244
- class "CTaskTurnGame" {
245
- /// CTaskTurnGame vtable - global turn flow manager (1 per game)
246
- vtable CTASK_TURN_GAME_VTABLE = 0x0066_9F70;
247
- /// CTaskTurnGame constructor
248
- ctor/Stdcall CTASK_TURNGAME_CTOR = 0x0055_B280;
249
- /// TurnGame message dispatcher
250
- fn/Thiscall TURNGAME_HANDLE_MESSAGE = 0x0055_DC00;
251
- /// TurnGame hurry handler
252
- fn/Usercall TURNGAME_HURRY_HANDLER = 0x0055_E5F0;
253
- /// TurnGame auto select teams
254
- fn TURNGAME_AUTO_SELECT_TEAMS = 0x0056_11E0;
255
- }
256
-
257
- class "CTaskTeam" {
258
- /// CTaskTeam vtable - per-team task
259
- vtable CTASK_TEAM_VTABLE = 0x0066_9EE4;
260
- ctor CTASK_TEAM_CTOR = 0x0055_5BB0;
261
- }
262
-
263
- class "CTaskLand" {
264
- /// CTaskLand vtable - landscape/terrain task
265
- vtable CTASK_LAND_VTABLE = 0x0066_4388;
266
- ctor CTASK_LAND_CTOR = 0x0050_5440;
267
- }
268
-
269
- class "CTaskMissile" {
270
- /// CTaskMissile vtable - projectile entity
271
- vtable CTASK_MISSILE_VTABLE = 0x0066_4438;
272
- ctor CTASK_MISSILE_CTOR = 0x0050_7D10;
273
- }
274
-
275
- class "CTaskMine" {
276
- /// CTaskMine vtable - mine entity
277
- vtable CTASK_MINE_VTABLE = 0x0066_43E8;
278
- ctor CTASK_MINE_CTOR = 0x0050_6660;
279
- }
280
-
281
- class "CTaskOilDrum" {
282
- /// CTaskOilDrum vtable - oil drum entity
283
- vtable CTASK_OILDRUM_VTABLE = 0x0066_4338;
284
- ctor CTASK_OILDRUM_CTOR = 0x0050_4AF0;
285
- }
286
-
287
- class "CTaskCrate" {
288
- /// CTaskCrate vtable - weapon/health/utility crate
289
- vtable CTASK_CRATE_VTABLE = 0x0066_4298;
290
- ctor CTASK_CRATE_CTOR = 0x0050_2490;
291
- }
292
-
293
- class "CTaskCloud" {
294
- /// CTaskCloud vtable - cloud/airstrike entity
295
- vtable CTASK_CLOUD_VTABLE = 0x0066_9D38;
296
- ctor CTASK_CLOUD_CTOR = 0x0054_82E0;
297
- }
298
-
299
- class "CTaskFilter" {
300
- /// CTaskFilter vtable - role unclear; 4 instances in a 2-team 3-worm game
301
- vtable CTASK_FILTER_VTABLE = 0x0066_9DAC;
302
- ctor CTASK_FILTER_CTOR = 0x0054_F3D0;
303
- }
304
-
305
- class "CTaskDirt" {
306
- /// CTaskDirt vtable - dirt/particle system (1 per game)
307
- vtable CTASK_DIRT_VTABLE = 0x0066_9D74;
308
- ctor CTASK_DIRT_CTOR = 0x0054_EDC0;
309
- }
310
-
311
- class "CTaskSpriteAnim" {
312
- /// CTaskSpriteAnim vtable - sprite animation manager (1 per game)
313
- vtable CTASK_SPRITE_ANIM_VTABLE = 0x0066_9D00;
314
- ctor CTASK_SPRITE_ANIM_CTOR = 0x0054_66C0;
315
- }
316
-
317
- class "CTaskCPU" {
318
- /// CTaskCPU vtable - AI/CPU bot controller
319
- vtable CTASK_CPU_VTABLE = 0x0066_9D54;
320
- ctor CTASK_CPU_CTOR = 0x0054_85D0;
321
- }
322
-
323
- class "CTaskSeaBubble" {
324
- /// CTaskSeaBubble vtable - water bubble particle
325
- vtable CTASK_SEA_BUBBLE_VTABLE = 0x0066_9E88;
326
- ctor CTASK_SEABUBBLE_CTOR = 0x0055_4FE0;
327
- }
328
-
329
- class "CTaskFire" {
330
- /// CTaskFire vtable - fire/flame entity (0xD8 bytes)
331
- vtable CTASK_FIRE_VTABLE = 0x0066_9DD8;
332
- ctor CTASK_FIRE_CTOR = 0x0054_F4C0;
333
- }
334
-
335
- // Entity constructors without known vtables
336
- class "CTaskAirstrike" {
337
- ctor CTASK_AIRSTRIKE_CTOR = 0x0055_53C0;
338
- }
339
- class "CTaskArrow" {
340
- ctor CTASK_ARROW_CTOR = 0x004F_E130;
341
- }
342
- class "CTaskCanister" {
343
- ctor CTASK_CANISTER_CTOR = 0x0050_1A80;
344
- }
345
- class "CTaskCross" {
346
- ctor CTASK_CROSS_CTOR = 0x0050_45C0;
347
- }
348
- class "CTaskFireball" {
349
- ctor CTASK_FIREBALL_CTOR = 0x0055_0890;
350
- }
351
- class "CTaskFlame" {
352
- ctor CTASK_FLAME_CTOR = 0x0054_F0F0;
353
- }
354
- class "CTaskGas" {
355
- ctor CTASK_GAS_CTOR = 0x0055_4750;
356
- }
357
- class "CTaskOldWorm" {
358
- ctor CTASK_OLDWORM_CTOR = 0x0051_FEB0;
359
- }
360
- class "CTaskScoreBubble" {
361
- ctor CTASK_SCOREBUBBLE_CTOR = 0x0055_4CA0;
362
- }
363
- class "CTaskSmoke" {
364
- ctor CTASK_SMOKE_CTOR = 0x0055_51D0;
365
- }
366
  }
367
 
368
  // Backward-compat aliases (not registered separately — same address)
 
27
  // Class definitions (vtable + constructor + vtable methods)
28
  // =========================================================================
29
 
30
+ // Re-exported from task modules
31
+ pub use crate::task::base::{
32
+ CTASK_VTABLE, CTASK_CONSTRUCTOR, CTASK_VT0_INIT, CTASK_VT1_FREE,
33
+ CTASK_VT2_HANDLE_MESSAGE, CTASK_VT3, CTASK_VT5, CTASK_VT6,
34
+ CTASK_VT7_PROCESS_FRAME,
35
+ CTASK_LAND_VTABLE, CTASK_LAND_CTOR,
36
+ CTASK_DIRT_VTABLE, CTASK_DIRT_CTOR,
37
+ CTASK_SPRITE_ANIM_VTABLE, CTASK_SPRITE_ANIM_CTOR,
38
+ CTASK_CPU_VTABLE, CTASK_CPU_CTOR,
39
+ CTASK_SEA_BUBBLE_VTABLE, CTASK_SEABUBBLE_CTOR,
40
+ CTASK_AIRSTRIKE_CTOR, CTASK_ARROW_CTOR, CTASK_CANISTER_CTOR,
41
+ CTASK_CROSS_CTOR, CTASK_FIREBALL_CTOR, CTASK_FLAME_CTOR,
42
+ CTASK_GAS_CTOR, CTASK_OLDWORM_CTOR, CTASK_SCOREBUBBLE_CTOR,
43
+ CTASK_SMOKE_CTOR,
44
+ };
45
+ pub use crate::task::game_task::{
46
+ CGAMETASK_VTABLE, CGAMETASK_SOUND_EMITTER_VT, CGAMETASK_CONSTRUCTOR,
47
+ CGAMETASK_VT0, CGAMETASK_VT1_FREE, CGAMETASK_VT2_HANDLE_MESSAGE,
48
+ };
49
+ pub use crate::task::worm::{CTASK_WORM_VTABLE, CTASK_WORM_CONSTRUCTOR};
50
+ pub use crate::task::turn_game::{
51
+ CTASK_TURN_GAME_VTABLE, CTASK_TURNGAME_CTOR,
52
+ TURNGAME_HANDLE_MESSAGE, TURNGAME_HURRY_HANDLER, TURNGAME_AUTO_SELECT_TEAMS,
53
+ };
54
+ pub use crate::task::team::{CTASK_TEAM_VTABLE, CTASK_TEAM_CTOR};
55
+ pub use crate::task::missile::{CTASK_MISSILE_VTABLE, CTASK_MISSILE_CTOR};
56
+ pub use crate::task::mine_oil_drum::{
57
+ CTASK_MINE_VTABLE, CTASK_MINE_CTOR, CTASK_OILDRUM_VTABLE, CTASK_OILDRUM_CTOR,
58
+ };
59
+ pub use crate::task::supply_crate::{CTASK_CRATE_VTABLE, CTASK_CRATE_CTOR};
60
+ pub use crate::task::cloud::{CTASK_CLOUD_VTABLE, CTASK_CLOUD_CTOR};
61
+ pub use crate::task::filter::{CTASK_FILTER_VTABLE, CTASK_FILTER_CTOR};
62
+ pub use crate::task::fire::{CTASK_FIRE_VTABLE, CTASK_FIRE_CTOR};
 
 
 
63
 
64
+ crate::define_addresses! {
65
  class "DDGameWrapper" {
66
  /// DDGameWrapper vtable
67
  vtable DDGAME_WRAPPER_VTABLE = 0x0066_A30C;
 
230
  fn/Stdcall DISPLAY_GFX_INIT_TEAM_PALETTE_DISPLAY = 0x0057_03E0;
231
  }
232
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
233
  }
234
 
235
  // Backward-compat aliases (not registered separately — same address)
crates/openwa-core/src/task/base.rs CHANGED
@@ -2,6 +2,91 @@ use crate::engine::ddgame::DDGame;
2
  use crate::game::class_type::ClassType;
3
  use crate::FieldRegistry;
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  /// Base task class in WA's entity hierarchy.
6
  ///
7
  /// All game objects inherit from CTask. Tasks form a tree via parent/children
 
2
  use crate::game::class_type::ClassType;
3
  use crate::FieldRegistry;
4
 
5
+ crate::define_addresses! {
6
+ class "CTask" {
7
+ /// CTask vtable - 7 virtual method pointers
8
+ vtable CTASK_VTABLE = 0x0066_9F8C;
9
+ /// CTask constructor - initializes base task fields and children list
10
+ ctor/Stdcall CTASK_CONSTRUCTOR = 0x0056_25A0;
11
+ /// CTask::vtable0 - initialization/unknown
12
+ vmethod CTASK_VT0_INIT = 0x0056_2710;
13
+ /// CTask::Free - destructor/deallocation
14
+ vmethod CTASK_VT1_FREE = 0x0056_2620;
15
+ /// CTask::HandleMessage - message dispatch
16
+ vmethod CTASK_VT2_HANDLE_MESSAGE = 0x0056_2F30;
17
+ /// CTask::vtable3 - unknown
18
+ vmethod CTASK_VT3 = 0x0056_13D0;
19
+ /// CTask::vtable5 - unknown
20
+ vmethod CTASK_VT5 = 0x0056_2FA0;
21
+ /// CTask::vtable6 - unknown
22
+ vmethod CTASK_VT6 = 0x0056_3000;
23
+ /// CTask::ProcessFrame
24
+ vmethod CTASK_VT7_PROCESS_FRAME = 0x0056_3210;
25
+ }
26
+
27
+ class "CTaskLand" {
28
+ /// CTaskLand vtable - landscape/terrain task
29
+ vtable CTASK_LAND_VTABLE = 0x0066_4388;
30
+ ctor CTASK_LAND_CTOR = 0x0050_5440;
31
+ }
32
+
33
+ class "CTaskDirt" {
34
+ /// CTaskDirt vtable - dirt/particle system (1 per game)
35
+ vtable CTASK_DIRT_VTABLE = 0x0066_9D74;
36
+ ctor CTASK_DIRT_CTOR = 0x0054_EDC0;
37
+ }
38
+
39
+ class "CTaskSpriteAnim" {
40
+ /// CTaskSpriteAnim vtable - sprite animation manager (1 per game)
41
+ vtable CTASK_SPRITE_ANIM_VTABLE = 0x0066_9D00;
42
+ ctor CTASK_SPRITE_ANIM_CTOR = 0x0054_66C0;
43
+ }
44
+
45
+ class "CTaskCPU" {
46
+ /// CTaskCPU vtable - AI/CPU bot controller
47
+ vtable CTASK_CPU_VTABLE = 0x0066_9D54;
48
+ ctor CTASK_CPU_CTOR = 0x0054_85D0;
49
+ }
50
+
51
+ class "CTaskSeaBubble" {
52
+ /// CTaskSeaBubble vtable - water bubble particle
53
+ vtable CTASK_SEA_BUBBLE_VTABLE = 0x0066_9E88;
54
+ ctor CTASK_SEABUBBLE_CTOR = 0x0055_4FE0;
55
+ }
56
+
57
+ // Entity constructors without known vtables
58
+ class "CTaskAirstrike" {
59
+ ctor CTASK_AIRSTRIKE_CTOR = 0x0055_53C0;
60
+ }
61
+ class "CTaskArrow" {
62
+ ctor CTASK_ARROW_CTOR = 0x004F_E130;
63
+ }
64
+ class "CTaskCanister" {
65
+ ctor CTASK_CANISTER_CTOR = 0x0050_1A80;
66
+ }
67
+ class "CTaskCross" {
68
+ ctor CTASK_CROSS_CTOR = 0x0050_45C0;
69
+ }
70
+ class "CTaskFireball" {
71
+ ctor CTASK_FIREBALL_CTOR = 0x0055_0890;
72
+ }
73
+ class "CTaskFlame" {
74
+ ctor CTASK_FLAME_CTOR = 0x0054_F0F0;
75
+ }
76
+ class "CTaskGas" {
77
+ ctor CTASK_GAS_CTOR = 0x0055_4750;
78
+ }
79
+ class "CTaskOldWorm" {
80
+ ctor CTASK_OLDWORM_CTOR = 0x0051_FEB0;
81
+ }
82
+ class "CTaskScoreBubble" {
83
+ ctor CTASK_SCOREBUBBLE_CTOR = 0x0055_4CA0;
84
+ }
85
+ class "CTaskSmoke" {
86
+ ctor CTASK_SMOKE_CTOR = 0x0055_51D0;
87
+ }
88
+ }
89
+
90
  /// Base task class in WA's entity hierarchy.
91
  ///
92
  /// All game objects inherit from CTask. Tasks form a tree via parent/children
crates/openwa-core/src/task/cloud.rs CHANGED
@@ -2,6 +2,14 @@ use super::base::CTask;
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
 
 
 
 
 
 
 
 
5
  /// Airstrike / weather cloud task.
6
  ///
7
  /// Extends CTask directly (not CGameTask). Clouds drift horizontally with wind,
 
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
5
+ crate::define_addresses! {
6
+ class "CTaskCloud" {
7
+ /// CTaskCloud vtable - cloud/airstrike entity
8
+ vtable CTASK_CLOUD_VTABLE = 0x0066_9D38;
9
+ ctor CTASK_CLOUD_CTOR = 0x0054_82E0;
10
+ }
11
+ }
12
+
13
  /// Airstrike / weather cloud task.
14
  ///
15
  /// Extends CTask directly (not CGameTask). Clouds drift horizontally with wind,
crates/openwa-core/src/task/filter.rs CHANGED
@@ -1,6 +1,14 @@
1
  use super::base::CTask;
2
  use crate::FieldRegistry;
3
 
 
 
 
 
 
 
 
 
4
  /// Message-subscription filter task — routes messages selectively to child tasks.
5
  ///
6
  /// CTaskFilter is a CTask subclass that overrides HandleMessage to only forward
 
1
  use super::base::CTask;
2
  use crate::FieldRegistry;
3
 
4
+ crate::define_addresses! {
5
+ class "CTaskFilter" {
6
+ /// CTaskFilter vtable - role unclear; 4 instances in a 2-team 3-worm game
7
+ vtable CTASK_FILTER_VTABLE = 0x0066_9DAC;
8
+ ctor CTASK_FILTER_CTOR = 0x0054_F3D0;
9
+ }
10
+ }
11
+
12
  /// Message-subscription filter task — routes messages selectively to child tasks.
13
  ///
14
  /// CTaskFilter is a CTask subclass that overrides HandleMessage to only forward
crates/openwa-core/src/task/fire.rs CHANGED
@@ -1,6 +1,14 @@
1
  use super::base::CTask;
2
  use crate::FieldRegistry;
3
 
 
 
 
 
 
 
 
 
4
  /// Fire/flame entity task.
5
  ///
6
  /// Extends CTask (not CGameTask) — no physics body.
 
1
  use super::base::CTask;
2
  use crate::FieldRegistry;
3
 
4
+ crate::define_addresses! {
5
+ class "CTaskFire" {
6
+ /// CTaskFire vtable - fire/flame entity (0xD8 bytes)
7
+ vtable CTASK_FIRE_VTABLE = 0x0066_9DD8;
8
+ ctor CTASK_FIRE_CTOR = 0x0054_F4C0;
9
+ }
10
+ }
11
+
12
  /// Fire/flame entity task.
13
  ///
14
  /// Extends CTask (not CGameTask) — no physics body.
crates/openwa-core/src/task/game_task.rs CHANGED
@@ -2,6 +2,23 @@ use super::base::CTask;
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  /// Game task - extends CTask with physics and gameplay data.
6
  ///
7
  /// PARTIAL: Most fields between 0x30-0x83 and 0x98-0xE7 are unknown.
 
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
5
+ crate::define_addresses! {
6
+ class "CGameTask" {
7
+ /// CGameTask vtable - extends CTask vtable with 12 more methods
8
+ vtable CGAMETASK_VTABLE = 0x0066_41F8;
9
+ /// CGameTask sound emitter vtable (embedded sub-object at offset 0xE8)
10
+ vtable CGAMETASK_SOUND_EMITTER_VT = 0x0066_9CF8;
11
+ /// CGameTask constructor - calls CTask ctor, sets physics defaults
12
+ ctor/Stdcall CGAMETASK_CONSTRUCTOR = 0x004F_ED50;
13
+ /// CGameTask::vtable0 override
14
+ vmethod CGAMETASK_VT0 = 0x004F_F1C0;
15
+ /// CGameTask::Free override
16
+ vmethod CGAMETASK_VT1_FREE = 0x004F_EF10;
17
+ /// CGameTask::HandleMessage override
18
+ vmethod CGAMETASK_VT2_HANDLE_MESSAGE = 0x004F_F280;
19
+ }
20
+ }
21
+
22
  /// Game task - extends CTask with physics and gameplay data.
23
  ///
24
  /// PARTIAL: Most fields between 0x30-0x83 and 0x98-0xE7 are unknown.
crates/openwa-core/src/task/mine_oil_drum.rs CHANGED
@@ -1,6 +1,20 @@
1
  use super::game_task::CGameTask;
2
  use crate::FieldRegistry;
3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  /// Land mine entity task.
5
  ///
6
  /// Extends CGameTask (0xFC bytes). Mines sit on the terrain and arm after
 
1
  use super::game_task::CGameTask;
2
  use crate::FieldRegistry;
3
 
4
+ crate::define_addresses! {
5
+ class "CTaskMine" {
6
+ /// CTaskMine vtable - mine entity
7
+ vtable CTASK_MINE_VTABLE = 0x0066_43E8;
8
+ ctor CTASK_MINE_CTOR = 0x0050_6660;
9
+ }
10
+
11
+ class "CTaskOilDrum" {
12
+ /// CTaskOilDrum vtable - oil drum entity
13
+ vtable CTASK_OILDRUM_VTABLE = 0x0066_4338;
14
+ ctor CTASK_OILDRUM_CTOR = 0x0050_4AF0;
15
+ }
16
+ }
17
+
18
  /// Land mine entity task.
19
  ///
20
  /// Extends CGameTask (0xFC bytes). Mines sit on the terrain and arm after
crates/openwa-core/src/task/missile.rs CHANGED
@@ -2,6 +2,14 @@ use super::game_task::CGameTask;
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
 
 
 
 
 
 
 
 
5
  /// Projectile / missile entity task.
6
  ///
7
  /// Extends CGameTask (0xFC bytes). One instance per airborne projectile
 
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
5
+ crate::define_addresses! {
6
+ class "CTaskMissile" {
7
+ /// CTaskMissile vtable - projectile entity
8
+ vtable CTASK_MISSILE_VTABLE = 0x0066_4438;
9
+ ctor CTASK_MISSILE_CTOR = 0x0050_7D10;
10
+ }
11
+ }
12
+
13
  /// Projectile / missile entity task.
14
  ///
15
  /// Extends CGameTask (0xFC bytes). One instance per airborne projectile
crates/openwa-core/src/task/mod.rs CHANGED
@@ -1,15 +1,15 @@
1
- mod base;
2
  pub mod bit_grid;
3
- mod cloud;
4
- mod filter;
5
- mod fire;
6
  pub mod game_task;
7
- mod mine_oil_drum;
8
- mod missile;
9
  mod overlays;
10
- mod supply_crate;
11
- mod team;
12
- mod turn_game;
13
  pub mod worm;
14
 
15
  pub use base::{CTask, CTaskBfsIter, SharedDataIter, SharedDataNode, SharedDataTable};
 
1
+ pub mod base;
2
  pub mod bit_grid;
3
+ pub mod cloud;
4
+ pub mod filter;
5
+ pub mod fire;
6
  pub mod game_task;
7
+ pub mod mine_oil_drum;
8
+ pub mod missile;
9
  mod overlays;
10
+ pub mod supply_crate;
11
+ pub mod team;
12
+ pub mod turn_game;
13
  pub mod worm;
14
 
15
  pub use base::{CTask, CTaskBfsIter, SharedDataIter, SharedDataNode, SharedDataTable};
crates/openwa-core/src/task/supply_crate.rs CHANGED
@@ -1,6 +1,14 @@
1
  use super::game_task::CGameTask;
2
  use crate::FieldRegistry;
3
 
 
 
 
 
 
 
 
 
4
  /// Weapon/health/utility crate entity task.
5
  ///
6
  /// Extends CGameTask (0xFC bytes). Crates fall from the sky with a parachute,
 
1
  use super::game_task::CGameTask;
2
  use crate::FieldRegistry;
3
 
4
+ crate::define_addresses! {
5
+ class "CTaskCrate" {
6
+ /// CTaskCrate vtable - weapon/health/utility crate
7
+ vtable CTASK_CRATE_VTABLE = 0x0066_4298;
8
+ ctor CTASK_CRATE_CTOR = 0x0050_2490;
9
+ }
10
+ }
11
+
12
  /// Weapon/health/utility crate entity task.
13
  ///
14
  /// Extends CGameTask (0xFC bytes). Crates fall from the sky with a parachute,
crates/openwa-core/src/task/team.rs CHANGED
@@ -2,6 +2,14 @@ use super::base::CTask;
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
 
 
 
 
 
 
 
 
5
  /// Per-team state-tracker task — one instance per team, child of CTaskTurnGame.
6
  ///
7
  /// Tracks per-team data: which team number it represents, how many worms were
 
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
5
+ crate::define_addresses! {
6
+ class "CTaskTeam" {
7
+ /// CTaskTeam vtable - per-team task
8
+ vtable CTASK_TEAM_VTABLE = 0x0066_9EE4;
9
+ ctor CTASK_TEAM_CTOR = 0x0055_5BB0;
10
+ }
11
+ }
12
+
13
  /// Per-team state-tracker task — one instance per team, child of CTaskTurnGame.
14
  ///
15
  /// Tracks per-team data: which team number it represents, how many worms were
crates/openwa-core/src/task/turn_game.rs CHANGED
@@ -2,6 +2,21 @@ use super::base::CTask;
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  /// Embedded intermediate game-context sub-object within `CTaskTurnGame`.
6
  ///
7
  /// This is the memory region at `CTaskTurnGame+0x30..+0xDB` (0xAC bytes).
 
2
  use crate::fixed::Fixed;
3
  use crate::FieldRegistry;
4
 
5
+ crate::define_addresses! {
6
+ class "CTaskTurnGame" {
7
+ /// CTaskTurnGame vtable - global turn flow manager (1 per game)
8
+ vtable CTASK_TURN_GAME_VTABLE = 0x0066_9F70;
9
+ /// CTaskTurnGame constructor
10
+ ctor/Stdcall CTASK_TURNGAME_CTOR = 0x0055_B280;
11
+ /// TurnGame message dispatcher
12
+ fn/Thiscall TURNGAME_HANDLE_MESSAGE = 0x0055_DC00;
13
+ /// TurnGame hurry handler
14
+ fn/Usercall TURNGAME_HURRY_HANDLER = 0x0055_E5F0;
15
+ /// TurnGame auto select teams
16
+ fn TURNGAME_AUTO_SELECT_TEAMS = 0x0056_11E0;
17
+ }
18
+ }
19
+
20
  /// Embedded intermediate game-context sub-object within `CTaskTurnGame`.
21
  ///
22
  /// This is the memory region at `CTaskTurnGame+0x30..+0xDB` (0xAC bytes).
crates/openwa-core/src/task/worm.rs CHANGED
@@ -3,6 +3,15 @@ use super::game_task::CGameTask;
3
  use crate::game::weapon::WeaponEntry;
4
  use crate::FieldRegistry;
5
 
 
 
 
 
 
 
 
 
 
6
  /// Virtual method table for CTaskWorm (vtable at 0x6644C8, 20 slots).
7
  ///
8
  /// CTaskWorm overrides 14 of the 20 inherited CTask/CGameTask slots;
 
3
  use crate::game::weapon::WeaponEntry;
4
  use crate::FieldRegistry;
5
 
6
+ crate::define_addresses! {
7
+ class "CTaskWorm" {
8
+ /// CTaskWorm vtable
9
+ vtable CTASK_WORM_VTABLE = 0x0066_44C8;
10
+ /// CTaskWorm constructor
11
+ ctor CTASK_WORM_CONSTRUCTOR = 0x0050_BFB0;
12
+ }
13
+ }
14
+
15
  /// Virtual method table for CTaskWorm (vtable at 0x6644C8, 20 slots).
16
  ///
17
  /// CTaskWorm overrides 14 of the 20 inherited CTask/CGameTask slots;