docs(runtime): correct Control and collision interface contracts
Docs Deploy / Build and Deploy MkDocs (push) Successful in 41s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 41s
This commit is contained in:
2 files changed
+47
-17
No files matched your search
@@ -778,16 +778,19 @@ resource-device значения во время игры.
|
|||||||
`0x5780/0x57c0` участвуют в векторе; Rust воспроизводит его raw output bits и
|
`0x5780/0x57c0` участвуют в векторе; Rust воспроизводит его raw output bits и
|
||||||
отдельные cache, order, clamp и signed-zero случаи.
|
отдельные cache, order, clamp и signed-zero случаи.
|
||||||
|
|
||||||
Для обычной начальной загрузки scale-input тоже закрыт. AniMesh constructor
|
Для обычной начальной загрузки входной масштаб единичный. Конструктор модели
|
||||||
оставляет `+0x158/+0x15c/+0x160` равными `1.0`; перед Control event `4` World3D
|
AniMesh RVA `0x68a0` задаёт `Model+0x158/+0x15c/+0x160 = 1.0`;
|
||||||
проходит Agent event `0`, AniMesh RVA `0x1a80` вызывает базовый return `0x17df0`
|
`Agent+0x158` хранит указатель на отдельный Control. Перед Control event `4`
|
||||||
и передаёт event `4/null` модели, FX, CollManager и CollObject. Их проверенные
|
World3D проходит Agent event `0`: AniMesh RVA `0x1a80` вызывает базовый return
|
||||||
ветви `0x75b0/0x6fc0`, Effect RVA `0x3d30`, Control RVA `0x1ce00` и `0x1fe00`
|
`0x17df0` и передаёт event `4/null` модели, FX, CollManager и CollObject.
|
||||||
не вызывают AniMesh setter `0x14770` и не меняют outer scale. Поэтому FAC0 в
|
Проверенные ветви модели `0x75b0/0x6fc0`, Effect `0x3d30` и CollManager
|
||||||
стандартном `LoadAgent` получает `[1, 1, 1]`. Другой маршрут
|
`0x1ce00` не меняют масштаб. CollObject получает событие через основной
|
||||||
`AddNewObjectToGame`/mirror к setter и последующие placement/tick остаются
|
интерфейс `0x3c2fc`, slot `+0x08 -> 0x1f530`: он кэширует host-интерфейсы,
|
||||||
отдельными границами. В synthetic x86-векторе по-прежнему явно заданы `[2,3,5]`;
|
а необязательный вызов CollManager `0x1c330` сохраняет только указатель
|
||||||
он не является источником scale для полного load.
|
`CollObject+0x20` в `CollManager+0x3c`. Поэтому FAC0 получает `[1, 1, 1]`.
|
||||||
|
Отдельные пути `AddNewObjectToGame`/mirror и последующие placement/tick остаются
|
||||||
|
за этой границей. В synthetic x86-векторе scales `[2,3,5]` заданы отдельно.
|
||||||
|
Подробная привязка интерфейсов приведена в [разборе Script VM](script-vm.md).
|
||||||
|
|
||||||
Смысл `Slot68 +0x30/+0x34`, tag-27 cache DWORD, owner accumulators `+0x530`,
|
Смысл `Slot68 +0x30/+0x34`, tag-27 cache DWORD, owner accumulators `+0x530`,
|
||||||
`+0x534`, `+0x538` и результата mutable word `26` не имеет доказанных единиц
|
`+0x534`, `+0x538` и результата mutable word `26` не имеет доказанных единиц
|
||||||
|
|||||||
@@ -1410,18 +1410,36 @@ payload. Позже та же функция `World3D+0x7cb0` повторяет
|
|||||||
времени из `DATWorld+0x32a38` (`0x7e6e`); `World3D+0x7ea0` передаёт туда же
|
времени из `DATWorld+0x32a38` (`0x7e6e`); `World3D+0x7ea0` передаёт туда же
|
||||||
время в `0x80a9`. Setter `World3D+0x5140` записывает входной DWORD в эту ячейку.
|
время в `0x80a9`. Setter `World3D+0x5140` записывает входной DWORD в эту ячейку.
|
||||||
Нулевой вызов связывает интерфейсы, а ненулевой `NumericTime` запускает отдельную
|
Нулевой вызов связывает интерфейсы, а ненулевой `NumericTime` запускает отдельную
|
||||||
ветвь активации. Конструктор AniMesh задаёт `+0x158/+0x15c/+0x160` равными `1.0`.
|
ветвь активации. Модель занимает отдельный объект в памяти: её конструктор
|
||||||
Обработчик модели `0x75b0/0x6fc0` привязывает интерфейсы и матрицу, Effect RVA
|
AniMesh RVA `0x68a0` задаёт `Model+0x158/+0x15c/+0x160 = 1.0`.
|
||||||
`0x3d30` и Control RVA `0x1ce00` сохраняют host/service указатели, а Control
|
Поле `Agent+0x158` хранит указатель на Control. Проверенные ветви модели
|
||||||
`0x1fe00` меняет только локальный collision-флаг. Эти ветви не вызывают AniMesh
|
`0x75b0/0x6fc0`, Effect RVA `0x3d30` и CollManager RVA `0x1ce00` сохраняют
|
||||||
scale setter `0x14770` и не пишут поля масштаба. При загрузке AniMesh получает
|
матрицу и служебные указатели, оставляя масштаб модели неизменным.
|
||||||
Control secondary owner с QI selector `0xa` и сохраняет возвращённый base owner
|
|
||||||
|
Фабрика CollObject возвращает вторичный интерфейс `object+4`. QI `0x28`
|
||||||
|
вычитает `4` и сохраняет в `Agent+0x170` основной объект с vtable `0x3c2fc`.
|
||||||
|
Его event slot `+0x08` ведёт в Control RVA `0x1f530`. При event `4/null`
|
||||||
|
обработчик кэширует семь host-интерфейсов; при наличии QI `0x203` вызывает
|
||||||
|
CollManager slot `+0x10` таблицы `0x3c178`. Этот метод, RVA `0x1c330`,
|
||||||
|
сохраняет только указатель `CollObject+0x20` в `CollManager+0x3c`.
|
||||||
|
Для свежего BULL Agent без внешнего host QI `6` при привязке даёт основной Agent
|
||||||
|
с vtable `0x201d4`. Ненулевой event `4` вызывает его slot `+0x24`, AniMesh
|
||||||
|
RVA `0x17d60`, который читает `[Agent+0x120]`; вызывающий код сохраняет
|
||||||
|
результат в `CollObject+0x24`.
|
||||||
|
Затем CollObject slot `+0x0c`, Control RVA `0x1fe00`, сбрасывает бит `0`
|
||||||
|
поля `CollObject+0x30`. Event `0x15` с первым DWORD payload `9` завершается
|
||||||
|
без вызовов и записей. Поле Control `owner+0x34` хранит указатель на CollObject;
|
||||||
|
его slot `+0x14`, RVA `0x1f670`, меняет флаги `CollObject+0x30`.
|
||||||
|
Перечисленные ветви не вызывают AniMesh setter `0x14770`.
|
||||||
|
|
||||||
|
При загрузке AniMesh получает Control secondary owner с QI selector `0xa`
|
||||||
|
и сохраняет возвращённый base owner
|
||||||
в `Agent+0x158`: `AniMesh.dll+0x2ff0` делает этот вызов в RVA `0x32ee..0x3300`,
|
в `Agent+0x158`: `AniMesh.dll+0x2ff0` делает этот вызов в RVA `0x32ee..0x3300`,
|
||||||
а `Control.dll+0x76f0` для selector `0xa` вычитает `0x14` из `ECX` и возвращает
|
а `Control.dll+0x76f0` для selector `0xa` вычитает `0x14` из `ECX` и возвращает
|
||||||
указатель. Диспетчер AniMesh RVA `0x1afb..0x1b0d` посылает через `Agent+0x158`
|
указатель. Диспетчер AniMesh RVA `0x1afb..0x1b0d` посылает через `Agent+0x158`
|
||||||
событие `4` в slot `+0x08`. Его base-owner vtable — Control RVA `0x3d298`, и
|
событие `4` в slot `+0x08`. Его base-owner vtable — Control RVA `0x3d298`, и
|
||||||
slot ведёт прямо в `0x314f0`; при нулевом payload исходный обработчик проходит
|
slot ведёт прямо в `0x314f0`; при нулевом payload исходный обработчик проходит
|
||||||
`0x7830 -> 0xf940`, поэтому FAC0 входит с constructor scales `[1, 1, 1]`.
|
`0x7830 -> 0xf940`, поэтому FAC0 получает Model scale `[1, 1, 1]`.
|
||||||
Встречающиеся рядом переходники относятся к другим интерфейсам: Control owner
|
Встречающиеся рядом переходники относятся к другим интерфейсам: Control owner
|
||||||
`+4` с таблицей `0x3d254` проходит через `0x31ae0` (adjust `-4`), а owner `+8`
|
`+4` с таблицей `0x3d254` проходит через `0x31ae0` (adjust `-4`), а owner `+8`
|
||||||
с таблицей `0x3d1fc` — через `0x31b00` (adjust `-8`). Последний путь не является
|
с таблицей `0x3d1fc` — через `0x31b00` (adjust `-8`). Последний путь не является
|
||||||
@@ -1477,6 +1495,15 @@ descriptor word `8`. Текущий tag `26` тем же общим reader-ом
|
|||||||
умножает на `M`. Это правило не меняет отдельные callbacks бюджета или запись
|
умножает на `M`. Это правило не меняет отдельные callbacks бюджета или запись
|
||||||
factory-26 selector `0x500`.
|
factory-26 selector `0x500`.
|
||||||
|
|
||||||
|
Сырой selector `6` в `FUN_1002bb40` выбирает устройство по ordinal через
|
||||||
|
интерфейс `owner+0x0c`: таблица `this+0x5b0` соответствует `owner+0x5bc`.
|
||||||
|
RVA `0x2bb91` проверяет тег текущего descriptor на равенство `2`. При совпадении
|
||||||
|
RVA `0x2bb9a` загружает `device+0x174` как `f32`, сохраняет значение в выходной
|
||||||
|
буфер и возвращает `AL=1`/`RET 8`; другие текущие теги возвращают false.
|
||||||
|
Наличие поля `+0x174` подтверждено для экземпляра фабрики `2`. INTO сохраняет
|
||||||
|
исходный тип экземпляра, поэтому проверка тега descriptor отдельно не доказывает
|
||||||
|
наличие этого поля у другой фабрики. В Rust selector `6` пока не поддержан.
|
||||||
|
|
||||||
FCA0 передаёт в owner query порядковый номер `i`; query `0x2bb40` находит
|
FCA0 передаёт в owner query порядковый номер `i`; query `0x2bb40` находит
|
||||||
устройство `i` и вызывает его reader. Уже reader `FUN_10021d00` получает provider
|
устройство `i` и вызывает его reader. Уже reader `FUN_10021d00` получает provider
|
||||||
key из поля устройства `+0x04`. Provider getter `FUN_1000dc40` (RVA `0x0dc40`)
|
key из поля устройства `+0x04`. Provider getter `FUN_1000dc40` (RVA `0x0dc40`)
|
||||||
|
|||||||
Reference in new issue
Block a user