diff options
Diffstat (limited to 'docs')
| -rw-r--r-- | docs/appendices/knowledge-boundaries.md | 26 | ||||
| -rw-r--r-- | docs/appendices/script-vm.md | 69 | ||||
| -rw-r--r-- | docs/tomes/06-behavior.md | 31 |
3 files changed, 96 insertions, 30 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md index 626469f..2f93502 100644 --- a/docs/appendices/knowledge-boundaries.md +++ b/docs/appendices/knowledge-boundaries.md @@ -361,7 +361,7 @@ API `distribute_loaded_mission_control_provider_amount` переносит Три API работают только с CPU-проекцией и не подключены к GPU/window path или игровому Control clock. Отдельный `advance_loaded_mission_control_budget` переносит `0x2d340` для фабричных -callbacks `9`, `15`, `19` и общей default-пары; category lookup использует +callbacks `9`, `15`, `19`, `26` и общей default-пары; category lookup использует текущий descriptor tag из подтверждённого префикса `0..=34`. Ставки сохраняются в `+0x5dc/+0x5e0`. Шаг выполняется транзакционно, а неподдержанный специализированный callback, provider или диапазон числа возвращает ошибку без частичного @@ -417,20 +417,30 @@ visibility transition `0x11920` с исходными AniMesh callbacks. ОтдÐ в этом векторе подставлен mock-ом. Отдельный вектор с исходным генератором tag `19` (`0x22980`, `0x229a0`, `0x22a60`) проверяет полную и ограниченную rate, изменение provider и собственного множителя генератора; отрицательные -параметры и нулевой знаменатель не проверены. Native-векторы бюджетного шага +параметры и нулевой знаменатель не проверены. Новый оригинальный вектор +`0x2d340` смешивает tag `19` и tag `26`: supply `0.125` покрывает половину +demand `0.25`, итоговые множители равны `0.6875` и `0.5`, а выходы — +`0x80000000` и `0x3e800000`. Тот же oracle подтверждает tag-26 selector `0x500`, +общий reader `0x21d50` и сохранение поля `+0xa4` при `INTO`. Rust-тест +повторяет бюджетную пару и разрешает tag `26` в projection INTO guard, оставляя +теги `1`, `17` и `30` явными границами. Native-векторы бюджетного шага подтверждают текущие ставки `+0x5dc/+0x5e0`, включая значения `0.2`/`0.4` у потребителя tag 15, пустой результат `-0.0` и невырожденную пару исходных устройств tag 19/tag 15 при `dt = 0.375`; Rust-тест повторяет поля этой пары на синтетической таблице. Rust переносит class-9 rate/update и шестизначную -adjustment `0x25a90`, общую default callback-пару `0x21860/0x21890`, а также -category map только для current descriptor tags `0..=34`. Специализированные -factory callbacks вне этого набора остаются явными ошибками. +adjustment `0x25a90`, tag-26 rate/update и setter selector `0x500`, общую +default callback-пару `0x21860/0x21890`, а также category map только для current +descriptor tags `0..=34`. Остальные ещё не описанные специализированные +callbacks остаются явными ошибками. Лицензированный `min_l_n1.dat` содержит исходные factory/current tags `[19, 19, 9, 15, 12, 12, 13, 13, 26, 25, 21]`. Публичный API оставляет всю таблицу без изменений при не конечном интервале. Для конечного интервала -предварительная проверка распознаёт категории, но находит неподдержанный -factory tag `26` и отклоняет вызов до вычисления ставок и обновлений; полный -бюджетный проход для этой реальной таблицы поэтому не проверен. Успешные бюджетные native-векторы используют синтетические +ignored Rust-тест проходит budget по всем 11 строкам без фильтра. При `dt = 0.5` +обе output rates равны `0x3c23d70a`, первые два множителя tag `19` равны +`0x3f7fd70a`, остальные множители остаются `1.0`, а добавка tag `26` остаётся +нулевой. Эта проверка подтверждает только CPU-проекцию реальной таблицы; она +не запускает native полный mission tick и не подключает Control clock. +Успешные бюджетные native-векторы используют синтетические NDP/Node38-строки и подтверждают локальные переходы и порядок вызовов, а не полный Control tick на миссии. Прямые oracle-вызовы `0x11220` для одиночной строки используют `updateEffects = false`, что исключает ветвь Control FX и diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md index 5fb0cd0..84bb4b9 100644 --- a/docs/appendices/script-vm.md +++ b/docs/appendices/script-vm.md @@ -792,23 +792,19 @@ provider getter и изменение количества не подменен Rust предоставляет явный CPU-вызов `advance_loaded_mission_control_budget(engine, handle, dt)`. Он переносит -исходные callbacks factory tags `9`, `15`, `19` и общий default callback, а -категории выбирает по текущему descriptor tag. Native map подтверждён только -для префикса тегов `0..=34`; неизвестная категория, специализированный -callback, provider или численный диапазон возвращает ошибку без публикации -частичных изменений. Ставки `+0x5dc/+0x5e0` сохраняются отдельно, а сам вызов -ещё не включён в Control clock. +исходные callbacks factory tags `9`, `15`, `19`, `26` и общий default callback, +а категории выбирает по текущему descriptor tag. Native map подтверждён только +для префикса тегов `0..=34`; неизвестная категория, неподдержанный +специализированный callback, provider или численный диапазон возвращает ошибку +без публикации частичных изменений. Ставки `+0x5dc/+0x5e0` сохраняются отдельно, +а сам вызов ещё не включён в Control clock. Нативный oracle проверяет пустую таблицу с отрицательным нулём в обеих выходных ставках, невырожденную пару исходных устройств tag 19/tag 15 при `dt = 0.375` и tag 9 с шестью значениями и шестью накопителями изменений. Rust-тесты повторяют их по битам, включая положительное и отрицательное обновления tag 9. -В лицензированном `min_l_n1.dat` предварительная проверка распознаёт категории, -но находит неподдержанный factory tag `26` и отклоняет бюджет до расчёта ставок -или вызова устройств; транзакционный тест подтверждает, что исходная таблица -не меняется. Полный бюджетный проход на реальной миссии пока не выполнен. Rust также отклоняет нулевой знаменатель -обновления tag 19; тест вызывает эту ошибку после изменения provider -потребителем и подтверждает откат всей таблицы. +Rust также отклоняет нулевой знаменатель обновления tag 19; тест вызывает эту +ошибку после изменения provider потребителем и подтверждает откат всей таблицы. #### Генератор tag 19 в том же бюджетном проходе @@ -911,10 +907,51 @@ Descriptor category lookup `0x2c3a0` возвращает следующие зÐ Именно текущий descriptor выбирает категорию; callback остаётся у исходного factory-класса. В Rust неизвестный текущий тег за концом префикса и -специализированный factory callback не подменяются общей формулой. На -лицензированном Unit DAT полный проход доходит до factory `26` и возвращает -ошибку без частичного изменения таблицы. Ни этот CPU-вызов, ни локальные -векторы не означают включения бюджетного шага в Control clock. +неподдержанный специализированный factory callback не подменяются общей +формулой. Tag `26` поддержан отдельной парой callbacks, описанной ниже. Ни этот +CPU-вызов, ни локальные векторы не означают включения бюджетного шага в Control +clock. + +#### Фабричный tag 26: изменяемая добавка + +В этой сборке `Control.dll` SHA-256 +`bcb86318089028548a178b03a21accdce15df0cc85ddd91674cf3c2f55012c6e` фабричный +tag `26` обрабатывается в функции-фабрике RVA `0x2d4b0`: её ветка вызывает общий +конструктор `0x20800`, обнуляет поле устройства `+0xa4` и устанавливает vtable +`0x3ce38`. Rate +callback RVA `0x2e540` сначала проходит проверку доступности provider, затем +считает `-((descriptor[+0x20] + device[+0xa4]) * dt)`; прибавление до умножения +важно для битового результата. Update slot `+0x18` ведёт на RVA `0x21890` и +сохраняет выделенную долю как обычный multiplier `+0x4c`, не трогая `+0xa4`. + +Vtable slot `+0x1c` ведёт на общий reader `0x21d50`. Native override RVA +`0x2d890` через этот reader заменяет descriptor и коэффициенты, сохраняя +изменяемую добавку. Oracle проверяет сам slot и повторный rate после `INTO`. +Rust теперь включает factory tag `26` в projection guard для `INTO` по этой +проверке; границы для фабричных тегов `1`, `17` и `30` остаются закрытыми. + +Отдельный Control setter RVA `0x2c2b0` поддерживает selector `0x500`: только +при текущем descriptor tag `26` он записывает переданные биты в `+0xa4` и +возвращает успех. Behavior.dll с SHA-256 +`ddfbdbde07832358fe6e35e01c8dba9b58e7313789498b6049ed51d4ed9baf99` вызывает +его через RVA `0x19880`. Callers `0x29910` и `0x2f400` передают ноль, а +`0x29ba0` передаёт поле `+0x64` рядом с кодом `NewfOreCost`; смысл последнего +значения не установлен, поэтому Rust пока не запускает этот Behavior путь. + +При `B = 0.2`, добавке `0.3` и `dt = 0.7` исходная rate имеет биты +`0xbeb33333`. Смешанная проверка использует оригинальный tag-19 генератор +(`B = 0.625`, `C0 = 1`, provider `0.4`) и tag-26 потребитель (`B = 0.2`, +добавка `0.3`) при `dt = 0.5`: первый даёт `0.125`, второй запрашивает `0.25`. +Native dispatcher выделяет tag `26` половину, сохраняет множители +`0x3f300000`/`0x3f000000`, а ставки `+0x5dc/+0x5e0` получают +`0x80000000`/`0x3e800000`. Постоянный x86 oracle вызывает исходные callbacks и +Rust-тест повторяет этот вектор. + +Ignored Rust-тест также проходит полный неотфильтрованный Control budget по +одиннадцати исходным устройствам `min_l_n1.dat` при `dt = 0.5`; выходы равны +`0x3c23d70a`/`0x3c23d70a`, первые два множителя tag `19` — `0x3f7fd70a`. +Это проверка CPU-проекции реальной таблицы, а не сравнение целой миссии с +оригиналом. #### Активация и начальные часы diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md index 4e71ed9..d3af8f7 100644 --- a/docs/tomes/06-behavior.md +++ b/docs/tomes/06-behavior.md @@ -1082,12 +1082,31 @@ Rust переносит этот порядок, сохраняет native наÐ классы, которые исходный диспетчер направляет в фабрику по умолчанию. Текущая категория читается из descriptor: её native map подтверждён только для тегов `0..=34`. Неподдержанный специализированный callback, недоступный provider или -неподдержанное число останавливают шаг без частичных изменений. В -лицензированном `min_l_n1.dat` предварительная проверка распознаёт текущие -категории и выявляет неподдержанный factory tag `26`; она отклоняет бюджетный -вызов до расчёта ставок и обновлений, сохраняя таблицу целиком. Полный -бюджетный проход на реальной миссии и подключение к игровым часам пока не -подтверждены. +неподдержанное число останавливают шаг без частичных изменений. + +У фабричного tag `26` ставка складывается из базового значения устройства и +изменяемой добавки. Затем сумма умножается на прошедшее время: + +```text +rate = -((B + extra) * dt) +``` + +Например, при `B = 0.2`, `extra = 0.3` и `dt = 0.5` устройство запрашивает +`0.25`. Если доступный бюджет равен `0.125`, оно получает половину запроса; +устройство сохраняет долю распределения, а сама добавка переживает замену +descriptor через `INTO`. Так разные части Control могут менять базовую запись и +текущее состояние независимо. + +Эту добавку записывает исходный selector `0x500`, когда текущий descriptor +тоже относится к tag `26`. Мы восстановили его точку вызова в Behavior, но +смысл передаваемого там значения пока не установлен, поэтому этот Behavior путь +ещё не исполняется. Подтверждённые callbacks tag `26`, их native адреса и +точные проверочные векторы приведены в [техническом приложении](../appendices/script-vm.md#фабричный-tag-26-изменяемая-добавка). + +Полный явный CPU-проход по исходной таблице из одиннадцати устройств +`min_l_n1.dat` тоже завершился. Этот результат проверяет вычисление для одной +загруженной таблицы; обновление пока не подключено к игровым часам и не +заменяет полный Control tick. Отдельный путь объекта класса `4` умножает интервал на контактный коэффициент и передаёт изменение строке. В проверенном примере коэффициент `1`, интервал `2`, |
