Caputchin
Pengembangan game marketplace

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-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.

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:

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

Di halaman ini