Files
coorl-lost-cities/web
coolguyandClaude Opus 4.8 be5226bd3b Add seeded deals and card movement animations
Every game is now dealt from a seed carried in the URL as `?seed=`, shown in
the menu, and re-dealable by typing it in, so a deal can be shared or replayed.
Seeds are hashed into a mulberry32 stream, independent of the Python shuffle
bank.

Cards previously teleported between zones: the only motion in the client was
the hover lift and the legal-target pulse. Cards are keyed by card id, so a
card that just moved into a zone mounts there and now animates in, with the
motion disabled under prefers-reduced-motion.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LmyprzuzanXRhpomc3Ga1i
2026-07-14 21:10:14 +09:00
..
2026-07-14 20:09:03 +09:00
2026-07-14 19:49:03 +09:00
2026-07-14 19:49:03 +09:00
2026-07-14 19:49:03 +09:00
2026-07-14 19:49:03 +09:00
2026-07-14 19:49:03 +09:00
2026-07-14 19:49:03 +09:00
2026-07-14 19:49:03 +09:00

COOLRL Lost Cities Web

Browser-only Lost Cities client. The rules engine, observation builder, and PPO inference all run on the device; there is no application server.

The verified final JAX PPO policy is committed at public/models/jax-ppo.onnx (3.1 MB). Vite copies it to the static build, and the app resolves the asset relative to the deployed site so it works on GitHub Pages, GitLab Pages, or a normal web root. Its size and SHA-256 are recorded in public/models/jax-ppo.json.

Pushes to main build and publish the client through the repository's GitHub Pages and GitLab Pages workflows. Each workflow supplies the correct base URL for its host.

Seeded deals

Every game is dealt from a seed, shown in the menu and kept in the URL as ?seed=<seed>. Loading that URL — or typing the seed into the menu — replays the exact same deal, so a game can be shared, replayed, or reported with a bug. Seeds are arbitrary text; the deal is derived from a deterministic PRNG in src/game/random.ts and is independent of the Python shuffle bank.

Setup

Install and run the checked-in final policy:

cd web
npm ci
npm run dev

Build the same static bundle used by a host:

npm run build
npm run preview

To replace the shipped policy, export a verified Orbax checkpoint from the repository root. The exporter writes both the ONNX file and its public metadata manifest:

uv run --with onnx scripts/export_jax_ppo_onnx.py \
  --checkpoint /path/to/checkpoint \
  --output web/public/models/jax-ppo.onnx

The policy tries WebGPU first and falls back to ONNX Runtime WebAssembly. If the model asset is absent, the UI remains playable using a simple local heuristic and reports that fallback in the header.

Checks

cd web
npm test
npm run build

The TypeScript engine follows src/lost_cities_jax/engine.py and its 96-action atomic action space. Cross-runtime fixtures can be regenerated with:

uv run python scripts/generate_web_parity_fixture.py