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
69 lines
2.0 KiB
Markdown
69 lines
2.0 KiB
Markdown
# 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`](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:
|
|
|
|
```bash
|
|
cd web
|
|
npm ci
|
|
npm run dev
|
|
```
|
|
|
|
Build the same static bundle used by a host:
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
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
|
|
|
|
```bash
|
|
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:
|
|
|
|
```bash
|
|
uv run python scripts/generate_web_parity_fixture.py
|
|
```
|