|
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 = **0x488** | |
| - `param_1[0x133]` β byte offset 0x133 * 4 = **0x4CC** | |
| - Always multiply DWORD index by 4 to get the true byte offset. | |