Реплеи: запись ввода и воспроизведение ($.replay), тесты молчат
P2-хвост §12. Детерминизм в движке был (--seed, --fixed-dt, свои генераторы в $.random), но записать и проиграть сессию было нечем: к баг-репорту нельзя было приложить реплей, а регресс-тест «мир пришёл туда же» — поставить. * src/highlevel/replay.js: createReplay (чистое ядро) + installReplay ($.replay): start/record/stop для записи, play/tick/skip для воспроизведения, load/toText для файла, mode/length/position/dropped/header/frames/at для контроля, onEnd для конца; compareReplays находит первое расхождение двух записей; * заголовок хранит ЗЕРНО ЗАПУСКА и ШАГ ВРЕМЕНИ (engine.seed/engine.fixedDt) — без них воспроизведение не совпадёт; игра добавляет свои поля через start(); * пустой кадр СОХРАНЯЕТСЯ (пропуск сломал бы соответствие кадр записи↔ кадр проигрывания), несериализуемый объект становится пустым кадром, кадр больше 4096 байт не пишется, предел 36000 кадров с честным счётчиком dropped; * тесты: tests/js/replay_test.mjs (11) и tests/agent/highlevel_replay_test.py (в движке — номер кадра, зерно запуска, шаг времени, текст записи); * docs/highlevel/replay.md: методы, заголовок, «что записывать» и честные ограничения (реплей — ввод, а не снимок мира; нет сжатия; нумерация кадров не сверяется при проигрывании). ПРИМЕР В ДОКЕ ИСПРАВЛЕН ПО КОДУ: сначала я написал `$.input.state()` и `$.input.apply()`, которых в API НЕТ. Проверил grep'ом и переписал пример на честный (игра собирает снимок ввода сама) — иначе это было бы очередное врание в документации, ровно то, что вычищал в §11. ЗАОДНО ПО ПРОСЬБЕ: тесты больше не шумят. tools/agent_client.py подставляет SDL_AUDIODRIVER=dummy, если драйвер не задан явно; микшер при этом работает по-настоящему (44.1 кГц вместо 48 кГц — выбор dummy-драйвера), проверки звука не ломаются. Прогнать со звуком: R2D_TEST_AUDIO=real python3 tests/agent/<тест>.py. Проверка: полный набор qjs, агентские тесты (включая новый replay), модули, doc_coverage, doc_claims — зелёные.
src/highlevel/replay.js
0 → 100644
Пожалуйста, зарегистрируйтесь или войдите чтобы прокомментировать