wormz-a / docs /re-notes /engine-init.md
paavohtl's picture
Add DDGame engine architecture structs and subsystem types
ed63829
|
Raw History Blame
3.56 kB

Engine Initialization Chain

Overview

WA.exe initializes the engine through a chain of constructor calls that build the DDGame monolith and its subsystems. The top-level entry is ConstructDDGameWrapper which allocates DDGame and wires up all subsystems.

Call Chain

WinMain / CRT startup (0x5D8B6C)
  └─ ConstructDDGameWrapper (0x56DEF0)
       β”œβ”€ Allocates DDGameWrapper (vtable 0x66A30C)
       β”œβ”€ DDGame__Constructor (0x56E220)
       β”‚    β”œβ”€ Allocates 0x98B8 bytes for DDGame
       β”‚    β”œβ”€ DDDisplay__Init (0x569D00)
       β”‚    β”‚    └─ Sets display mode, dimensions, palette, HWND
       β”‚    β”œβ”€ GfxHandler x2 (vtable 0x66B280, 0x19C bytes each)
       β”‚    β”œβ”€ Task state machines x5 (vtable 0x664118)
       β”‚    └─ Game state pointer at DDGame+0x24
       β”œβ”€ PCLandscape__Constructor (0x57ACB0)
       β”‚    β”œβ”€ vtable 0x66B208, parent = DDGame
       β”‚    β”œβ”€ Allocates terrain buffer (0x60000 bytes) at +0x8E8
       β”‚    β”œβ”€ Creates WaterEffect object (vtable 0x66B268) at +0xC8
       β”‚    β”œβ”€ Creates LandscapeShader (vtable 0x66B1DC) at +0x93C
       β”‚    └─ Loads Water.dir, Level.dir from data\Gfx\
       β”œβ”€ DSSound__Constructor (0x573D50)
       β”‚    β”œβ”€ vtable 0x66AF20
       β”‚    β”œβ”€ Master volume = Fixed(0x10000) = 1.0 at +0x8A4
       β”‚    └─ 500 sound channel slots
       └─ OpenGLCPU__Constructor (0x5A0850) [conditional]
            β”œβ”€ vtable 0x6774C0, 0x48 bytes
            β”œβ”€ Width at +0x10, Height at +0x24
            └─ OpenGL__Init (0x59F000) stores HDC/HGLRC in DDDisplay

DDGameWrapper Layout

DDGameWrapper is a thin wrapper (~0x500 bytes) around DDGame:

Offset Field Notes
0x000 vtable 0x66A30C
0x488 DDGame ptr Allocated 0x98B8-byte object
0x48C DDGame secondary Optional 0x2C-byte struct
0x4C0 GfxHandler 0 0x19C bytes, vtable 0x66B280
0x4C4 GfxHandler 1 Optional
0x4C8 GfxMode Graphics mode flag
0x4CC PCLandscape Pointer to landscape subsystem

DDGame Key Offsets

DDGame is a ~39KB (0x98B8 bytes) monolithic object. Known landmark fields:

Offset Field Notes
0x0024 game_state Global game state pointer
0x0028 param Constructor parameter
0x11B0 task_ptrs[5] 5 task state machine pointers
0x3548 display_mode Display mode pointer
0x354C display_width Screen width
0x3560 display_center_x Screen center X
0x3564 display_center_y Screen center Y
0x3578 hwnd Window handle
0x358D palette 256-color palette (0x400 bytes)
0x3D98 gfx_objects[4] Graphics object pointers

Ghidra Offset Convention

Ghidra's decompiler shows DWORD-indexed offsets for struct access:

  • param_1[0x122] β†’ byte offset 0x122 * 4 = 0x488
  • param_1[0x133] β†’ byte offset 0x133 * 4 = 0x4CC
  • Always multiply DWORD index by 4 to get the true byte offset.