diff options
| author | Valentin Popov <valentin@popov.link> | 2026-07-18 19:40:17 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-07-18 19:40:17 +0300 |
| commit | d31d1f8eab7a2c79e349748939de01895af5de7e (patch) | |
| tree | 89546aab24629deebaf88c3694e49ef2a547a3e2 /docs/appendices | |
| parent | a7b434aeb2e1c79131e4919f6b0cbf66cdc06599 (diff) | |
| download | fparkan-d31d1f8eab7a2c79e349748939de01895af5de7e.tar.xz fparkan-d31d1f8eab7a2c79e349748939de01895af5de7e.zip | |
feat(script): decode compiled package framing
Diffstat (limited to 'docs/appendices')
| -rw-r--r-- | docs/appendices/script-vm.md | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md index 5e6adb8..128acd9 100644 --- a/docs/appendices/script-vm.md +++ b/docs/appendices/script-vm.md @@ -10,9 +10,16 @@ messages, teleports, задачи, research и campaign transitions. Точки и `briefing.cfg`. `.scr` — binary package с version checks, symbol/event sections и offsets; -полная opcode grammar не доказана. `.fml` — текстовый symbol/formula oracle; -`varset.var` задаёт `VAR(...)`/`STRING(...)` defaults; `.trf` — NRes tables, -чей framing подтверждён, а field semantics местами лишь consumer-inferred. +полная opcode grammar не доказана. Его внешний framing теперь читает +`fparkan-script`: первый little-endian `u32` является числом required opcode +handlers, второй — числом event records. Каждый event хранит `name_len`, +`name_len + 1` raw bytes с обязательным NUL, opaque event word и count вложенных +records. Вложенный record сохраняет семь `u32` header words (в disk order), +список `u32` references после шестого header word и trailing seventh word. +Никакой из этих words ещё не получает semantic name. `.fml` — текстовый +symbol/formula oracle; `varset.var` задаёт `VAR(...)`/`STRING(...)` defaults; +`.trf` — NRes tables, чей framing подтверждён, а field semantics местами лишь +consumer-inferred. ## Безопасная модель исполнения @@ -32,6 +39,20 @@ instruction dispatcher или jump table `.scr`: bytecode opcode table всё е byte: это ломает синхронизацию. Для каждого доказанного opcode фиксируются number, size, operands, control flow, effects, errors и минимальный test. +GOG `ai.dll` доказывает этот framing двумя consumer-ами: loader по +`0x10001000` открывает `<bundle>.scr`, `varset.var`, `<bundle>.fml`, затем +собирает ровно 73 pointers handlers; `0x10011b20` читает описанную count-driven +структуру. Команда + +```powershell +cargo run -p fparkan-cli -- script inspect ` + 'C:\GOG Games\Parkan - Iron Strategy\MISSIONS\SCRIPTS\c1m2p.scr' --format json +``` + +на исходном пакете возвращает `opcode_handler_count=73`, 9 events, 17 nested +records, 20 references и 0 trailing bytes. Это corpus evidence для reader-а, +но не разрешение на исполнение неизвестных 73 opcodes. + TMA properties остаются four raw `u32` words плюс имя, пока consumer/schema не задаст тип (integer/float bits/ObjectId/enum/fixed-point/index). В том числе сохраняются `NOT USED`; corpus подтверждает `Invulnerability`, life state, |
