engine-kit (opsional)
Halaman ini opsional. Semua di sini adalah satu cara nyaman untuk menghasilkan run yang sesuai; kamu bisa mengabaikan kit sepenuhnya dan mengirim run telanjang yang kamu tulis dengan tangan. Jangkau @caputchin/engine-kit 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, jadi pengguna kit punya satu situs impor.
npm install @caputchin/engine-kitGagasannya: 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.
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 RunFnPrimitif deterministik
Kit memberimu dua hal yang paling sering merusak determinisme lintas-runtime, keduanya tersemai dan bisa-direproduksi:
cap.rng(seed)(dancap.rngFromState) - sebuah PRNG yang bisa-disemai. Pakai ia untuk setiap pilihan acak alih-alihMath.random().cap.math- transendental deterministik (sin,cos, ...) yang sepakat lintas runtime, alih-alihMathplatform 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:
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:
run/ seed / vonis yang dihasilkan kit ini. - Bangun game marketplace: game yang logikanya bisa didukung kit ini.
- Manifest caputchin.json: mengirim
runyang dihasilkan sebagai artefak.