fix(runtime): model distributor share normalization
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s

This commit is contained in:
Valentin Popov committed 2026-10-20 09:06:17 +04:00
1 parent caef8f8e6c
commit 374db10daf
5 files changed
+516 -42

No files matched your search

+11 -7
View File
@@ -157,13 +157,17 @@ Behavior (`Behavior.dll`, RVA `0x3600`) вызывает `World3D!stdGetGameMode
подтверждает только состав списков, не точную эквивалентность всей загрузки или
регулярного шага Behavior.
Нативный `Behavior.dll!Add` (RVA `0x1aac0`) создаёт для каждого участника запись
размером `0x1c` с начальной долей `1 / count`, а `normalize` (RVA `0x1ac90`)
перенормирует прежние доли после добавления. Rust пока хранит только членство:
поля записи, доли и их изменение ещё не исполняются. Не восстановлено и
соединение с реальными интерфейсами ArealMap, необходимыми для регулярного
вызова `FUN_10019e80`; остальной Behavior tick flow и общий dispatcher событий
также остаются открытыми.
Нативный `Behavior.dll!Add` (RVA `0x1aac0`) и `normalize` (RVA `0x1ac90`)
проверены прямыми x86-вызовами на синтетических записях при x87 control word
`0x007f`, измеренном также у игры на входах обоих методов. Rust повторяет
начальные доли и нормализацию отдельными операциями `f32`, а повторную запись
сопоставляет по `ObjectHandle`, меняя только долю существующего участника.
Пять DWORD после доли хранятся сырыми; ненулевое первое слово закрепляет вес,
смысл четырёх следующих не установлен. Лицензированный AutoDemo-тест проверяет
список TMA-объектов и получившиеся начальные доли по кланам, но это не сравнение
живых весов миссии с полями исходных runtime-записей. Не восстановлено соединение
с реальными интерфейсами ArealMap, нужными `FUN_10019e80`; полный Behavior tick
flow и общий dispatcher событий также остаются открытыми.
Для `Handler(30)` отдельно подтверждены обратный вызов `iron3d.dll` RVA
`0x611d0` (SHA-256 `d1dc4ea8535e2069b0a05c9e8be2724dd438ba44cca7a83007d8b2e50f9e35fa`),