Запись и воспроизведение команд (Command Record / Replay)
Портирование воспроизведения команд из cmclient (пятая партия, коммит f113acce28). Слой объектов команд cmclient не портируется — используется собственная инфраструктура сериализации команд jrpm (DynBaseCommandContainer), полностью обходящая «слой объектов команд».
Консольные команды
cmdrecord [start [file]] # Начать запись (файл по умолчанию cmdrecord.jrcm, сохраняется в личном каталоге)
cmdrecord stop # Остановить (задержка 10 тиков для опустошения очереди команд, затем запись на диск)
cmdreplay <file> # Воспроизвести: десериализовать и немедленно выполнить каждую командуКлючевые моменты реализации
- Хук записи:
CommandRecordLogподключается после выполнения команды вDoCommandPInternal— это единственная точка реального выполнения локальных, сетевых и воспроизводимых команд, без дублирования записи. - Сериализация:
cmd / tile / error_msg / payload / companyсериализуются без потерь черезDynBaseCommandContainer::Serialise; формат файла:JRCMmagic + version + count + записи. - Отложенная остановка:
cmdrecord stopустанавливает задержку 10 тиков,StateGameLoopпроверяет каждый кадр (CommandRecordTick), чтобы гарантировать захват уже поставленных в очередь команд перед сбросом. - Воспроизведение: каждая команда выполняется немедленно по пути серверной команды (
DCIF_NETWORK_COMMAND), файл воспроизведения читается по фактическим данным, даже если заголовок count не обновлён.
Проверка
E2E на выделенном сервере: запись pause → файл записи 26 байт → воспроизведение на новой карте → Game paused (manual) + Replay finished: 1 executed, 0 failed.
Типичное использование
cmdrecord start build1 # Начать запись
# ... строить пути, станции в игре ...
cmdrecord stop # Остановить и сохранить
# После смены карты или восстановления после сбоя:
cmdreplay build1 # Восстановить все операции одной командой