Caputchin
마켓플레이스 게임 개발

엔진 키트 engine-kit (선택)

이 페이지는 선택입니다. 여기 모든 것은 적합한 run내는 한 편리한 방법입니다; 당신은 키트를 통째로 무시하고 손으로 쓴 맨 run을 낼 수 있습니다. 평범한 게임 로직을 쓰고 결정론, 리플레이 루프, 트레이스 인코딩을 당신을 위해 처리받고 싶을 때 @caputchin/engine-kit으로 손을 뻗으세요.

키트는 전체 리플레이 계약 표면을 다시 export하니, 키트 사용자는 단일 임포트 자리를 가집니다.

npm install @caputchin/engine-kit

아이디어: 리듀서를 쓰면, run을 얻는다

키트의 핵심 수는 당신의 게임을 순수 리듀서로 표현하게 하는 것입니다: 현재 상태와 한 틱의 입력을 받아 다음 상태를 반환하는 함수. 그 리듀서에 결정론적 프리미티브를 더해, 키트의 toRun 어댑터가 구성상 계약에 부합하는 run(seed, config, trace)를 냅니다.

import { defineEngine, toRun, cap } from "@caputchin/engine-kit";

const engine = defineEngine({
  setup(seed) {
    const rng = cap.rng(seed);          // deterministic, seeded RNG
    return { score: 0, targets: spawn(rng), rng };
  },
  tick(state, input) {
    // pure: same (state, input) always yields the same next state
    return applyInput(state, input);
  },
  result(state) {
    return { passed: state.score >= 3, score: state.score, durationMs: state.elapsed };
  },
});

export const run = toRun(engine);       // a conforming RunFn

결정론적 프리미티브

키트는 교차 런타임 결정론을 가장 자주 깨는 두 가지를, 둘 다 시드되고 재현 가능하게 줍니다:

  • cap.rng(seed)(그리고 cap.rngFromState) - 시드 가능한 PRNG. Math.random() 대신 모든 무작위 선택에 그것을 쓰세요.
  • cap.math - 런타임에 걸쳐 일치하는 결정론적 초월 함수(sin, cos, ...), 그러지 않을 수 있는 플랫폼 Math의 것 대신.

선택적 심

  • applyShim() - 비결정론적 글로벌(벽시계, Math.random)을 중립화하니, 우연한 호출이 리플레이에서 조용히 갈라지는 대신 개발에서 시끄럽게 실패합니다.
  • applyDomShim() - 프레임워크 경로를 위한 최소 헤드리스 DOM이니, 작은 DOM 표면을 건드리는 리듀서가 DOM 없는 아이솔레이트에서도 여전히 리플레이됩니다.

공개 전에 로컬에서 돌리기

키트의 replay 하니스는 서버가 할 것과 같은 방식으로 트레이스를 당신의 엔진에 통과시키고, selfCheck는 일련의 케이스를 돌려 어떤 비결정성이든 당신이 공개하기 전에 보고합니다:

import { selfCheck } from "@caputchin/engine-kit";

const report = selfCheck(engine, { cases: myCases });
if (!report.ok) console.error(report.violations);

깨끗한 로컬 selfCheck는 마켓플레이스의 공개 자체 확인이 통과할 것이라는 최고의 예측자입니다(그것은 같은 결정론 기준입니다). 키트는 또한 package.json 스크립트나 CI에서 이것을 돌리는 CLI를 냅니다.

트레이스 인코딩

encodeTrace / decodeTrace는 컴팩트하고 버전 지정된 트레이스 형식을 주니, 당신의 라이브 게임이 내는 입력 스트림이 정확히 당신의 run이 리플레이에서 디코드하는 것입니다. 양쪽에서 그것들을 쓰면 둘이 록스텝으로 유지됩니다.

키트를 건너뛸 때

이미 결정론적 로직이 있거나(고정소수점 시뮬레이션, 스펙 부동소수점용으로 컴파일된 WASM 모듈) 게임이 충분히 단순해 run을 손으로 쓰는 게 사소할 때 그것을 건너뛰세요. 플랫폼은 키트가 당신의 run을 냈는지 결코 알거나 신경 쓰지 않습니다; 그것은 계약을 로드하고 리플레이만 합니다.

함께 보기

이 페이지에서