diff options
| author | Valentin Popov <valentin@popov.link> | 2026-10-23 11:32:49 +0300 |
|---|---|---|
| committer | Valentin Popov <valentin@popov.link> | 2026-10-23 11:32:49 +0300 |
| commit | ce8e65c8ae585098c0c74507bb2b05f14f44e6d4 (patch) | |
| tree | 26e062050704b9b0f163678786a5c5e9577434c3 /docs/appendices/script-vm.md | |
| parent | 7c909ea67ba7f27e11d5b33b8df9f6569da7eb7b (diff) | |
| download | fparkan-ce8e65c8ae585098c0c74507bb2b05f14f44e6d4.tar.xz fparkan-ce8e65c8ae585098c0c74507bb2b05f14f44e6d4.zip | |
test(runtime): verify native Control provider updates
Diffstat (limited to 'docs/appendices/script-vm.md')
| -rw-r--r-- | docs/appendices/script-vm.md | 58 |
1 files changed, 53 insertions, 5 deletions
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md index 99c448f..a95c031 100644 --- a/docs/appendices/script-vm.md +++ b/docs/appendices/script-vm.md @@ -541,11 +541,14 @@ if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } exit $LASTEXITCODE ``` -Native oracle Add, normalize и distributor tick компилируется и запускается -так: +Изолированный x86 oracle оригинальных Behavior, ArealMap и Control +компилируется и запускается так: ```powershell $env:FPARKAN_ORIGINAL_BEHAVIOR_DLL = 'C:\GOG Games\Parkan - Iron Strategy\Behavior.dll' +$env:FPARKAN_ORIGINAL_CONTROL_DLL = 'C:\GOG Games\Parkan - Iron Strategy\Control.dll' +$env:FPARKAN_ORIGINAL_AREALMAP_DLL = 'C:\GOG Games\Parkan - Iron Strategy\ArealMap.dll' +$env:FPARKAN_ORIGINAL_BEHAVIOR_PROFILE_RES = 'C:\GOG Games\Parkan - Iron Strategy\behpsp.res' New-Item -ItemType Directory -Force -Path target\behavior-distributor-native-oracle | Out-Null & "$env:WINDIR\Microsoft.NET\Framework\v4.0.30319\csc.exe" /nologo /platform:x86 /out:target\behavior-distributor-native-oracle\BehaviorDistributorTickOracle.exe crates\fparkan-runtime\tests\behavior_distributor_tick_native_oracle.cs if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } @@ -567,9 +570,15 @@ IAT-слоты `GetQueue` и `GetSystemArealMap`, а synthetic vtables задаÑ Tick-векторы проверяют нулевой шаг, обе ветви селекторов скорости, пропуск состояния `0xfffe`, отсутствующий объект, повторное чтение `0x1002`, ограниченный запас руды, порог `0.01`, ветви дефицита/частичного/избыточного предложения и -равенство спросу, разные веса и достаточную/недостаточную мощность. Это -синтетические ArealMap объекты: oracle исполняет оригинальные scheduler и tick, -но не сравнивает паритет Rust и не заменяет проверку полной миссии в игре. +равенство спросу, разные веса и достаточную/недостаточную мощность. Тот же +harness проверяет в оригинальном Control пропорциональное и последовательное +распределение provider amount, коэффициент класса `4` с интервалом `2`, а также +неактивную временную ветвь с входами `0.5`, `1` и `2`. Вызовы Control используют +синтетические строки и хостовые callbacks; ArealMap тоже получает синтетические +объекты. Harness сверяет SHA-256 всех трёх DLL; ArealMap загружается из +изолированной временной рабочей папки, которую процесс затем удаляет. Эти тесты +проверяют отдельные native-пути, но не полный Control update и не паритет Rust с +игрой. Caller oracle проверяет AutoDemo пару `(500.2857, 751.8217)`, четыре режима x87 на tie-векторах, границу `10000` и младший DWORD. AI oracle отдельно @@ -596,6 +605,45 @@ tie-векторов подтверждает реакцию `FISTP`, но не форме инструкции. Всё остальное содержимое `.scr` сохраняется reader-ом, но остаётся вне этого исполнения. +### Изменение provider-состояния Control + +Для `Control.dll` (SHA-256 +`bcb86318089028548a178b03a21accdce15df0cc85ddd91674cf3c2f55012c6e`) native +oracle вызывает оригинальные `FUN_10010ba0` (RVA `0x10ba0`), `FUN_10010f30` +(RVA `0x10f30`) и selector-3 provider getter через vtable `0x3d254`, RVA +`0xdc40`. Пропорциональный режим проверен на максимумах `[30, 60, 50]`, текущих +значениях `[10, 20, 0]` и добавке `22`, результат `[14, 28, 10]`; отдельный +вектор подтверждает последовательное заполнение вперёд и вычитание с конца. +Проверены ограничение строк, снятие признака истощения при пополнении и порядок +обратных вызовов. При x87 control word `0x007f` для `[2^24, 2]` с запросом `-1` +получены значения `[16777214, 1.99999976]` и итог `16777216`: округление +вычисленного изменения даёт `-2`. Oracle задаёт внешнюю публикацию результата +обратным вызовом; provider строки не имеют родительских узлов и не проходят +отдельный жизненный цикл истощения корневого объекта. + +Для `FUN_10012a40` (RVA `0x12a40`) нативный вектор задаёт класс `4`, интервал +`2`, коэффициент `+0x1a4` равный `1` и текущее значение `10.000001`; результат +равен `8.000001`, вспомогательное поле — `-2`, нормализованное поле имеет биты +`0x3da3d70c`. Происхождение коэффициента подтверждено только статическим +трассированием: `FUN_1001a450` (RVA `0x1a450`) запрашивает интерфейс IID `0x0d`, +вызывает его slot `+0x24`, читает DWORD по смещению `+0x0c` в полученной записи +и сохраняет его в поле объекта `+0x1a4`. Поэтому нативный вектор проверяет +арифметику `FUN_10012a40` с заданным коэффициентом, а не исполнение контактного +пути или его игровой источник. + +`FUN_1000bcf0` (RVA `0xbcf0`) получает абсолютное значение времени. Oracle +исполняет только безопасную начальную ветвь при `+0xe0 = 0`: вход `0.5` +обновляет `+0xe8`, а входы `1` и `2` синхронизируют `+0xe4`, `+0xec`, `+0xd8` и +`+0xdc` без callbacks. Активную ветвь этот тест не запускал. Статический код +показывает gate по `+0xe0`; при условии `randomized_deadline < +0xe4` или +`+0xd4 != 0` вычисляет `dt = (+0xe4 - +0xec) * 0.001`. x87 выполняет `FSUB`, +затем `FMUL` с binary32-константой `0.001` (`0x3a83126f`), после чего результат +сохраняется в `f32`. Код вызывает `FUN_10012a40`, затем `FUN_1002d340` и +присваивает `+0xec = +0xe4`. В соседней ветви update packet queue обрабатывается +через `FUN_10012ce0`. Источник абсолютного времени извне и полный порядок +вызовов в игре не установлены; эти связи остаются статическим выводом. Rust +продолжает читать начальные provider snapshots и не моделирует эти изменения. + ### Аргументы и обратный вызов Handler(30) `resolve_handler30_with_values` сохраняет восстановленное ABI типов объявлений, |
