aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-07-18 21:30:49 +0300
committerValentin Popov <valentin@popov.link>2026-07-18 21:30:49 +0300
commit9e2cc1a283b689079b930068d2041876d11b8a10 (patch)
treeff115865f39c37b540dae4ee186faca4d96afd66 /docs
parentbbefe65a6287fad5424e3a5d2b91664b555e90dc (diff)
downloadfparkan-9e2cc1a283b689079b930068d2041876d11b8a10.tar.xz
fparkan-9e2cc1a283b689079b930068d2041876d11b8a10.zip
docs(script): trace host callback
Diffstat (limited to 'docs')
-rw-r--r--docs/appendices/script-vm.md12
1 files changed, 12 insertions, 0 deletions
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md
index 7141582..107aa5a 100644
--- a/docs/appendices/script-vm.md
+++ b/docs/appendices/script-vm.md
@@ -240,6 +240,18 @@ defaults. Runtime exposes `resolve_loaded_handler30` for the exact opaque
command without invoking a guessed game-side consumer: the tenth
`CreateSuperAI` callback argument still needs its own recovery.
+The live GOG AutoDemo closes that consumer boundary: the read-only callback
+pointer at `ai.dll + 0x555e4` is `0x100611d0`, or `iron3d.dll + 0x611d0` at
+the observed load base. Its recovered `__cdecl` ABI is `(mode, command,
+payload)`, matching `Handler(30)` as `(0, first, second)`. In `mode == 0`,
+`command == 0` and `payload == 0` selects `VOICE_MISSION_FAIL`, records the
+failed status, and clears an IGame byte; `payload == 1` selects
+`VOICE_MISSION_COMPLETE`, records completion, and sets that byte. Commands
+1, 3, 4, and 5 have additional game-side paths; mode 2 is a separate IGame
+call. Those branches are not yet assigned Rust gameplay meanings. Reproduce
+the current evidence with `capture-ai-init.ps1` and
+`ExportIron3dAiCallback.java`.
+
### Handler(8): problem-record state write
`Handler(8)` is the ninth VM-table entry at GOG `ai.dll` VA `0x10009b0d`.