diff options
Diffstat (limited to 'docs/appendices/knowledge-boundaries.md')
| -rw-r--r-- | docs/appendices/knowledge-boundaries.md | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index 8d6eaa9..53244c7 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -478,20 +478,35 @@ Control выставлен flag `0x102`, слово флагов ANI `+0x14` и пересчитывается при каждом принятом активном вызове. Проверены также точное равенство с ненулевым RNG, расход RNG при принудительном `+0xd4` и сохранение RNG/счётчика в неактивной ветви. Движение и очереди исключены условиями этих -векторов; активация `+0xe0` задана явно. Отдельный вектор -класса `4` исполняет событие `4` через `0x31ae0` → `0x314f0`, проверяя -активность, начальные часы `time - 100`, округление DWORD в `f32` и одну -начальную команду. Геометрические callbacks подставлены явно, таблицы -устройств и shapes пусты; полный загрузочный путь не проверен. Источник времени -и доставка прослежены статически: +векторов; активация `+0xe0` задавалась явно. Отдельный native-вектор класса `4` +вызывает `0x314f0` через синтетический owner `+4` и переходник `0x31ae0`. +Он сравнивает raw `f32` слова абсолютных часов и baseline, вычисленный до +округления `u32` в `f32`: для `16777217` это `0x4b800000/0x4b7fff9d`, для +`16777219` — `0x4b800002/0x4b7fff9f`. Последовательность `100`, `101` оставляет +`+0xe4` нулём после первого вызова, поэтому старое условие `+0xe4 == 0` добавляет +начальную команду повторно: счётчик `+0x370` переходит с `1` на `2`. Это путь +тестового интерфейса owner `+4`; статическая цепочка AniMesh `Agent+0x158` +ведёт к primary Control owner slot `+0x08` напрямую в `0x314f0`. Геометрические +callbacks подставлены явно, матрица identity и масштаб единичный, таблицы +устройств и shapes пусты. Вектор подтверждает ABI/арифметику часов, но не +реальную матрицу и callbacks из миссии или полный Unit DAT loader. + +Источник времени и доставка прослежены статически: World3D RVA `0x6bf0` вычисляет часы из `timeGetTime()` с игровым смещением и поправкой на паузу, затем выполняет первый обход `6/1`, шаг мировой физики и -второй обход `6/0x1c`. AniMesh RVA `0x1370` передаёт часы Control; общий -обработчик Control RVA `0x7830` численно преобразует unsigned DWORD в `f32` -перед primary slot `+0x58`. Фабрика выбирает RVA `0xcbb0` для класса `9` и -RVA `0xbcf0` для остальных. Это подтверждает статическую цепочку вызовов, но не -её исполнение на миссии: связывание интерфейсов, активация устройств и shapes, -остальные ветви `0xbcf0` и +второй обход `6/0x1c`. При создании объекта World3D RVA `0x7cb0` вызывает slot +`+0x38` с literal-null payload в `0x7d1a`, а затем передаёт в тот же slot DWORD +из `DATWorld+0x32a38` в `0x7e6e`; RVA `0x7ea0` повторяет передачу часов в +`0x80a9`. Setter RVA `0x5140` записывает этот DWORD в `DATWorld+0x32a38`. +AniMesh RVA `0x2ff0` получает для `Agent+0x158` Control base owner по QI selector +`0xa`, после чего `Agent` RVA `0x1a80` dispatch-ит событие `4` через его primary +slot `+0x08` прямо в `Control.dll+0x314f0`. Это и отдельный синтетический вызов +через owner `+4` — подтверждённые интерфейсные пути, но пока не единая трасса +игрового старта. Control RVA `0x7830` численно преобразует unsigned DWORD в +`f32` перед primary slot `+0x58`; фабрика выбирает RVA `0xcbb0` для класса `9` и +RVA `0xbcf0` для остальных. Статические вызовы не подтверждают их исполнение на +миссии: связывание реальных интерфейсов, активация устройств и shapes, остальные +ветви `0xbcf0` и автоматическое изменение provider через clock и бюджет Rust остаются открытыми. Источник контактного коэффициента прослежен статически, но не исполнен. Подробные векторы и статические границы приведены в [техническом подразделе о provider-состоянии Control](script-vm.md#изменение-provider-состояния-control). @@ -629,14 +644,19 @@ Native interoperability подтверждается только успешны Граница shell подтверждена exports `createShell/getIShell`, `IGUIServer`, верхнеуровневым UI-pass и файлами `ui/*.cfg`, `DATA/TextRes.cfg`, -`gamefont.rlb` и `sprites.lib`. RsLi framing библиотек закрыт, но widget tree, -layout rules, glyph metrics, sprite command semantics, focus/navigation и HUD -state machine пока не восстановлены до field-level спецификации. - -Закрывающий эксперимент: трассировать загрузку `shell_ctrls.cfg`, -`menu_resources.cfg`, `cursor.cfg`, `game_resources.cfg` и `hq.cfg`, сопоставить -GUI object factories и снять command/event captures для меню, HUD, briefing и -диалогов. +`gamefont.rlb` и `sprites.lib`. Для полной GOG-сборки подтверждены раздельные +форматы: `gamefont.rlb` читается общим RsLi reader, но его native consumer этим +не установлен; для меню подтверждена цепочка `menu_resources.cfg` → NRes +`font.lib` → native lookup `MENU_FONT` с получением реального font-объекта. +`menu_resources.cfg` и шесть вариантов `MENU_FONT`/`GAME_FONT` сопоставлены с +NRes-записями в [разборе shell и шрифтов](ui-shell.md). Остаются неизвестными +glyph metrics и drawing, выбор dimension на фактическом дисплее `1280x1024`, +widget tree, layout rules, sprite command semantics, focus/navigation и HUD +state machine. + +Закрывающий эксперимент: сопоставить оставшиеся детали `shell_ctrls.cfg`, +`cursor.cfg`, `game_resources.cfg` и `hq.cfg` с GUI object factories и снять +command/event captures для меню, HUD, briefing и диалогов. ## Research, economy and properties |
