aboutsummaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2026-10-29 15:05:38 +0300
committerValentin Popov <valentin@popov.link>2026-10-29 15:05:38 +0300
commit888a331a6dfae8568ea4389e937cf09f2760d490 (patch)
tree5a484a77812d084f850cfb8c850734afa56b466b /docs
parente29e3c6bb90444ec852df9ac42426f30415105dd (diff)
downloadfparkan-888a331a6dfae8568ea4389e937cf09f2760d490.tar.xz
fparkan-888a331a6dfae8568ea4389e937cf09f2760d490.zip
test(runtime): verify native generator budget consumption
Diffstat (limited to 'docs')
-rw-r--r--docs/appendices/knowledge-boundaries.md5
-rw-r--r--docs/appendices/script-vm.md28
2 files changed, 32 insertions, 1 deletions
diff --git a/docs/appendices/knowledge-boundaries.md b/docs/appendices/knowledge-boundaries.md
index 00b261c..d7e02e5 100644
--- a/docs/appendices/knowledge-boundaries.md
+++ b/docs/appendices/knowledge-boundaries.md
@@ -348,7 +348,10 @@ visibility transition `0x11920` с исходными AniMesh callbacks. ОтдÐ
бюджетный вектор исполняет `0x2d340` → `0x2dca0` → tag 15 `0x22bb0` →
`0x10ba0`: подтверждены коэффициенты `0.5` и `1`, точные amount/ratio и
приоритет категории перед порядком устройств. Положительный вклад генератора
-в этом векторе подставлен mock-ом; его собственная генерация не проверена. Эти сценарии
+в этом векторе подставлен mock-ом. Отдельный вектор с исходным генератором
+tag `19` (`0x22980`, `0x229a0`, `0x22a60`) проверяет полную и ограниченную
+rate, изменение provider и собственного множителя генератора; отрицательные
+параметры и нулевой знаменатель не проверены. Эти сценарии
используют синтетические NDP/Node38-строки; они подтверждают локальные переходы
и порядок вызовов, но не полную загрузку или выполнение Control на миссии. Вызовы
`0x11220` используют `updateEffects = false`, что исключает ветвь Control FX и
diff --git a/docs/appendices/script-vm.md b/docs/appendices/script-vm.md
index dc42959..173721b 100644
--- a/docs/appendices/script-vm.md
+++ b/docs/appendices/script-vm.md
@@ -686,6 +686,34 @@ provider getter и изменение количества не подменен
категории и выполнение миссии этим не проверены.
Rust пока не переносит этот изменяемый бюджетный цикл.
+#### Генератор tag 19 в том же бюджетном проходе
+
+Отдельный вектор заменяет mock-генератор исходным устройством tag `19`:
+конструктор `Control.dll` RVA `0x22980`, rate `0x229a0`, update `0x22a60`,
+vtable `0x3c608`. Конструктор выставляет слово включения `0x20`; descriptor
+с `+0x18 = -1` сохраняет его. Оба устройства проходят через исходные
+`0x2d340` и `0x2dca0`, их provider и изменение количества тоже исходные.
+
+При положительных параметрах проверенного вектора выработка зависит от поля
+descriptor `+0x20`, текущего множителя `+0x4c`, доли provider и `dt`. Если
+коэффициент selector `0` положителен, rate ограничивается значением selector
+`0x200`, умноженным на долю provider. Поэтому один и тот же источник может
+вернуть полную выработку или её ограниченный запас.
+
+| Коэффициент | Поле `+0x20` | Исходная rate | Amount после прохода | Доля provider | Множитель генератора после прохода |
+|---|---|---|---|---|---|
+| `1` | `0.5` | `0.1` | `0x42206666` | `0x3ecd4fdf` | `0x3f400000` (`0.75`) |
+| `0.125` | `0.5` | `0.05` | `0x42203333` | `0x3ecd0e56` | `0` |
+
+В обоих случаях исходные amount, максимум, доля и интервал равны `40`, `100`,
+`0.4` и `0.5`, а исходный множитель генератора — `1`. Его update читает
+provider уже после потребителя tag `15`, повторно вычисляет rate и уменьшает
+собственный множитель. Это не запись коэффициента выделения в `+0x4c`, как у
+tag `15`: смысл изменения этого поля зависит от фабричного класса.
+Векторы проверяют конечные положительные значения при x87 CW `0x007f`;
+нулевой знаменатель, отрицательные параметры и другие классы устройств ими
+не покрыты. Перенос общего бюджетного цикла в Rust ещё не завершён.
+
#### Активация и начальные часы
Для Control класса `4` oracle вызывает исходный конструктор RVA `0x31490`