|
Download docs/re-notes/engine-init.md from nmarshall/wormz-a: direct link, hf CLI and curl.
- Browser
- Download file 3.56 kB
-
https://huggingface.co/nmarshall/wormz-a/resolve/main/docs/re-notes/engine-init.md
- Command line
-
hf download hf://nmarshall/wormz-a/docs/re-notes/engine-init.md
-
curl -L -o engine-init.md https://huggingface.co/nmarshall/wormz-a/resolve/main/docs/re-notes/engine-init.md
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 = 0x488param_1[0x133]β byte offset 0x133 * 4 = 0x4CC- Always multiply DWORD index by 4 to get the true byte offset.