Skip to content

Запись и воспроизведение команд (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; формат файла: JRCM magic + 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           # Восстановить все операции одной командой