---
type: tutorial
title: engine-kit
summary: Kit penulisan opsional yang menghasilkan run putar-ulang yang sesuai dari reducer biasa, menangani determinisme, loop langkah-tetap, pengkodean trace, dan pemeriksaan-diri lokal untukmu.
---

`@caputchin/engine-kit` adalah kit penulisan opsional yang mengubah reducer game biasa menjadi [`run`](/docs/marketplace-game-development/replay-contract) yang sesuai, menangani determinisme, loop langkah-tetap, dan pengkodean trace untukmu. Ia satu cara nyaman untuk menghasilkan artefak itu, bukan keharusan: kamu bisa mengabaikan kit sepenuhnya dan mengirim `run` telanjang yang kamu tulis dengan tangan. Jangkau ia saat kamu lebih suka menulis logika game biasa dan punya determinisme, loop putar-ulang, dan pengkodean trace ditangani untukmu.

Kit mengekspor-ulang seluruh permukaan [kontrak putar-ulang](/docs/marketplace-game-development/replay-contract), jadi pengguna kit punya satu situs impor.

```bash
npm install @caputchin/engine-kit
```

## Gagasannya: tulis sebuah reducer, dapatkan sebuah run

Langkah inti kit adalah membiarkanmu mengekspresikan game-mu sebagai **reducer murni**: sebuah fungsi yang menerima state saat ini dan input satu tick dan mengembalikan state berikutnya. Dari reducer itu plus primitif deterministik, adapter `toRun` kit menghasilkan sebuah `run(seed, config, trace)` yang sesuai kontrak secara konstruksi.

```js
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
```

## Primitif deterministik

Kit memberimu dua hal yang paling sering merusak determinisme lintas-runtime, keduanya tersemai dan bisa-direproduksi:

- `cap.rng(seed)` (dan `cap.rngFromState`) - sebuah PRNG yang bisa-disemai. Pakai ia untuk setiap pilihan acak alih-alih `Math.random()`.
- `cap.math` - transendental deterministik (`sin`, `cos`, ...) yang sepakat lintas runtime, alih-alih `Math` platform yang mungkin tidak.

## Shim opsional

- `applyShim()` - menetralkan global non-deterministik (jam dinding, `Math.random`) agar panggilan tak sengaja gagal keras di pengembangan alih-alih diam-diam menyimpang saat putar-ulang.
- `applyDomShim()` - DOM headless minimal untuk jalur framework, agar sebuah reducer yang menyentuh permukaan DOM mungil tetap memutar-ulang di isolate tanpa-DOM.

## Jalankan ia secara lokal sebelum menerbitkan

Harness `replay` kit menjalankan sebuah trace lewat engine-mu dengan cara yang sama yang akan dilakukan server, dan `selfCheck` menjalankan sederet kasus dan melaporkan non-determinisme apa pun **sebelum** kamu menerbitkan:

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

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

`selfCheck` lokal yang bersih adalah peramal terbaik bahwa pemeriksaan-diri terbit marketplace akan lolos (ia adalah standar determinisme yang sama). Kit juga mengirim sebuah CLI untuk menjalankan ini dari skrip `package.json` atau CI.

## Pengkodean trace

`encodeTrace` / `decodeTrace` memberimu format trace ringkas, berversi agar aliran input yang dipancarkan game live-mu persis apa yang didekode `run`-mu saat putar-ulang. Memakainya di kedua sisi menjaga keduanya selangkah.

## Kapan melewati kit

Lewati ia saat kamu sudah punya logika deterministik (simulasi titik-tetap, modul WASM yang dikompilasi untuk spec-float) atau saat game-mu cukup sederhana sehingga menulis-tangan `run` itu sepele. Platform tak pernah tahu atau peduli apakah kit menghasilkan `run`-mu; ia hanya memuat dan memutar-ulang kontrak.

## Lihat juga

- [Kontrak putar-ulang](/docs/marketplace-game-development/replay-contract): `run` / seed / vonis yang dihasilkan kit ini.
- [Bangun game marketplace](/docs/marketplace-game-development/build-a-marketplace-game): game yang logikanya bisa didukung kit ini.
- [Manifest caputchin.json](/docs/marketplace-game-development/the-caputchin-json-manifest#the-run-artifact): mengirim `run` yang dihasilkan sebagai artefak.
