From 7c909ea67ba7f27e11d5b33b8df9f6569da7eb7b Mon Sep 17 00:00:00 2001 From: Valentin Popov Date: Fri, 23 Oct 2026 12:02:27 +0400 Subject: feat(runtime): advance loaded mission resources --- docs/tomes/06-behavior.md | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'docs/tomes/06-behavior.md') diff --git a/docs/tomes/06-behavior.md b/docs/tomes/06-behavior.md index bcb7320..b3dd8d0 100644 --- a/docs/tomes/06-behavior.md +++ b/docs/tomes/06-behavior.md @@ -326,8 +326,48 @@ Resource Distributor работает со списком зарегистрир записях при игровом x87 control word `0x007f`: проверены добавление, повторный ключ, закреплённая запись, нулевая сумма и округление. Это позволяет Rust сохранять начальный список, но пока не подтверждает веса реальных объектов в -живой миссии. Для регулярного шага по-прежнему не хватает интерфейсов ArealMap. -Остальные ограничения собраны в [границах знания](../appendices/knowledge-boundaries.md). +живой миссии. + +Узкая часть регулярного шага уже связана с загруженным состоянием движка. +`advance_loaded_mission_resources(engine, queue_time_ms)` принимает явную +метку времени общей 32-битной очереди. Для каждого видимого Behavior clan он +проверяет срок запуска, выполняет два прохода по списку и сохраняет пять +итогов: доступную энергию и руду, буфер руды, потребление энергии и потребление +руды. В обоих проходах объекты разрешаются заново по исходному TMA ID. Первый +проход измеряет поставки и потребность, второй повторно читает представленные +профильные и Control-значения перед применением выделения. Нативный код также +запрашивает интерфейсы во втором проходе, но динамические getter-callbacks в +этом снимке Rust не воспроизводятся. + +Планировщик использует беззнаковое сравнение времени: равенство ненулевому +сроку ещё не запускает шаг, а нулевой срок не задерживает его. Переполнение +вычитания даёт 32-битную длительность. Затем +длительность переводится в секунды с округлением, подтверждённым x87-путём +оригинальной DLL. Нативный oracle проверяет его на длинных интервалах, включая +значения около границы точного целого `f32`, а также на равенстве и строгом +проходе срока. Формула запуска, native vectors и команда воспроизведения +описаны в технической главе [script VM](../appendices/script-vm.md). + +Шаг работает только с уже созданными полными объектами миссии и снимками тех +профилей и Control-таблиц, чьи запросы и setters представлены в runtime. Он +обновляет загруженные `CurrentOre`, поля строк распределителя и поддержанный +Control selector `1`; неподдержанное свойство, запрос Control или невозможное +арифметическое значение возвращает ошибку. Обновления нескольких кланов, их +расписания и RNG фиксируются одной транзакцией: если обязательный запрос +позднего клана не разрешён, ранее подготовленные изменения остаются +неприменёнными. Приложение пока не вызывает +этот API из игрового цикла, а динамические callbacks, которые переносят +количество между Control provider-строками, ещё не моделируются. Поэтому это +исполняемый загруженный resource step, а не полный симулятор миссии. + +Для настоящих ресурсов AutoDemo тест проходит несколько временных точек: +генераторы `ObjectId 6` и `ObjectId 7` читают `Transfer_Power_Out = 10` из +`prof_generator.var`; после шага в 500 мс каждый сообщает 5 единиц доступной +энергии. Это подтверждает связь загруженного профиля с runtime-расчётом, но не +сравнение полной миссии с оригинальной игрой. Native oracle сверяет исходные +планировщик и распределитель GOG `Behavior.dll`; техническая процедура и +проверяемые векторы описаны в [script VM](../appendices/script-vm.md). Остальные ограничения собраны в +[границах знания](../appendices/knowledge-boundaries.md). Первый часто встречающийся table entry с side effect — `Handler(2)` (176 records в corpus). Он берёт active instruction, разрешает семь slots через -- cgit v1.2.3