refactor: distribute task class addresses to their home modules
Browse filesMove 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 +34 -167
- crates/openwa-core/src/task/base.rs +85 -0
- crates/openwa-core/src/task/cloud.rs +8 -0
- crates/openwa-core/src/task/filter.rs +8 -0
- crates/openwa-core/src/task/fire.rs +8 -0
- crates/openwa-core/src/task/game_task.rs +17 -0
- crates/openwa-core/src/task/mine_oil_drum.rs +14 -0
- crates/openwa-core/src/task/missile.rs +8 -0
- crates/openwa-core/src/task/mod.rs +9 -9
- crates/openwa-core/src/task/supply_crate.rs +8 -0
- crates/openwa-core/src/task/team.rs +8 -0
- crates/openwa-core/src/task/turn_game.rs +15 -0
- crates/openwa-core/src/task/worm.rs +9 -0
crates/openwa-core/src/address.rs
CHANGED
|
@@ -27,43 +27,41 @@ pub mod va {
|
|
| 27 |
// Class definitions (vtable + constructor + vtable methods)
|
| 28 |
// =========================================================================
|
| 29 |
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
| 33 |
-
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
| 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;
|