feat(runtime): support class-9 and default Control budgets
Docs Deploy / Build and Deploy MkDocs (push) Successful in 35s

This commit is contained in:
Valentin Popov committed 2026-10-29 19:43:09 +04:00
1 parent d3a0f8c7ff
commit 1d20509b05
5 files changed
+986 -67

No files matched your search

+27 -9
View File
@@ -725,6 +725,14 @@ component ID и multiplier `2.5` при копировании новых коэ
и дополнительная строка `fx` возвращают cursor `record + 0xbf`.
Слово CTLD `+0x18 == -1` сохраняет фабричное `+0x50` и при INTO-замене.
Ветвь фабрики `0x2d4b0` направляет factory tags без отдельного случая в
конструктор `0x20800`; его vtable использует общий reader `0x21d50` в slot
`+0x1c`. Поэтому common-field override применяется и к этой default-семье,
включая tag `6`; Rust-тест проверяет его вместе с тегами `12` и `13`. Tags
`1`, `17`, `26` и `30` остаются явными границами: фабрика выбирает для них
отдельные классы, а проверки текущей реализации ещё не покрывают их полное
setter-поведение.
У tag `2` slot `+0x1c` указывает на обёртку `0x29650`. Она вызывает тот же
reader, затем сохраняет selector `1` в `+0x120`, округляет selector `0` через
x87 `FISTP` в `+0x124` и заново обнуляет массив `+0x12c` по накопленному числу
@@ -1061,15 +1069,25 @@ Rust переносит этот порядок, сохраняет native на
в массиве, его обновление перечитывает уже изменённую долю после обслуживания
категории tag 15. Этот явный вызов хранит также две выходные ставки `+0x5dc` и
`+0x5e0`, но сам по себе ещё не запускается игровыми часами.
Поддержаны factory callbacks `15/19` и текущие descriptor tags `15/19`
(категории `0/1`); неизвестное устройство,
недоступные данные provider или нулевой знаменатель останавливают весь шаг без
частичных изменений.
Другие категории и полный миссионный цикл пока не подтверждены. В лицензированном
`min_l_n1.dat` рядом с тегами `19` и `15` есть также factory tags `9`, `12`,
`13`, `21`, `25` и `26`; поэтому его полный проход пока явно отклоняется на
первой неподдержанной категории `9`. Проверка сохраняет всю таблицу без
изменений и не доказывает успешный бюджетный шаг на реальной миссии.
Помимо класса `15` и генератора `19` поддержан класс `9`: он считает ставку
через шесть собственных значений и при распределении обновляет их вместе с
накопленными изменениями. Например, для доли provider `0.4`, интервала `0.5`,
`B = 0.2`, коэффициентов `C0 = 0.75`, `C1 = 0.6`, `C2 = 2` и масштаба
`1.25` исходная ставка имеет биты `0xbeae147b`; после полного выделения
обновлённые шесть значений совпадают с native побитно.
Несколько фабричных классов используют общий callback: ставка равна
`-(dt * B)`, а обновление записывает долю выделения в множитель. К этому
семейству относятся фабричные теги `12`, `13`, `25` и `21`, а также другие
классы, которые исходный диспетчер направляет в фабрику по умолчанию. Текущая
категория читается из descriptor: её native map подтверждён только для тегов
`0..=34`. Неподдержанный специализированный callback, недоступный provider или
неподдержанное число останавливают шаг без частичных изменений. В
лицензированном `min_l_n1.dat` предварительная проверка распознаёт текущие
категории и выявляет неподдержанный factory tag `26`; она отклоняет бюджетный
вызов до расчёта ставок и обновлений, сохраняя таблицу целиком. Полный
бюджетный проход на реальной миссии и подключение к игровым часам пока не
подтверждены.
Отдельный путь объекта класса `4` умножает интервал на контактный коэффициент и
передаёт изменение строке. В проверенном примере коэффициент `1`, интервал `2`,