명령 기록 및 재생 (Command Record / Replay)
cmclient 명령 재생 이식 (다섯 번째 배치, 커밋 f113acce28). cmclient의 명령 객체 계층을 이식하지 않음 -- jrpm 자체의 명령 직렬화 인프라 (DynBaseCommandContainer)를 직접 사용하여 "명령 객체 계층"을 완전히 우회.
콘솔 명령
cmdrecord [start [file]] # 기록 시작 (기본 파일 cmdrecord.jrcm, 개인 디렉토리에 저장)
cmdrecord stop # 중지 (10 tick 지연 후 명령 큐가 비워지면 디스크에 기록)
cmdreplay <file> # 재생: 역직렬화 후 각 명령을 즉시 실행구현 포인트
- 기록 훅:
CommandRecordLog가DoCommandPInternal의 명령 실행 이후에 연결 -- 이것은 로컬, 네트워크, 재생 명령의 유일한 실제 실행 지점이므로 중복 기록되지 않음. - 직렬화:
cmd / tile / error_msg / payload / company를DynBaseCommandContainer::Serialise로 무손실 직렬화; 파일 형식JRCMmagic + version + count + 항목. - 지연 중지:
cmdrecord stop은 10 tick 지연 플래그 설정,StateGameLoop가 매 프레임 확인 (CommandRecordTick)하여 큐에 이미 들어간 명령도 캡처된 후에 flush되도록 보장. - 재생 실행: 각 명령이 서버 명령 경로 (
DCIF_NETWORK_COMMAND)로 즉시 실행, 재생 파일이 count 헤더를 업데이트하지 않았어도 실제 데이터를 기준으로 읽을 수 있음.
검증
전용 서버 E2E: pause 기록 → 26바이트 기록 파일 → 새 맵 재생 → Game paused (manual) + Replay finished: 1 executed, 0 failed.
일반적인 사용법
cmdrecord start build1 # 기록 시작
# ... 게임에서 철로 깔기, 역 건설 ...
cmdrecord stop # 중지 및 디스크 쓰기
# 맵 교체 또는 크래시 복구 후:
cmdreplay build1 # 원클릭으로 모든 작업 재건