# PSX Adventure Engine Browser-first reference engine and project template for **PSX-era third-person adventure** — fixed cameras, inventory puzzles, low-poly atmosphere, and true peer-to-peer co-op. Inspired by classic survival-horror and investigation games of the late ’90s (not affiliated with any of those franchises). | Layer | Stack | | --- | --- | | Client | Three.js · Solid · Vite · Box3D (`box3d-wasm`) | | Server | Hono · WebSocket signalling · optional Neon | | Shared | Strict TypeScript types & save schemas | | Tools | Code-drawn character creator · procedural clips · optional Grok textures | **Status:** Milestone 3 — playable multi-room demo, co-op, character harness. --- ## Quick start **Requirements:** Node 20+, [pnpm](https://pnpm.io) 10+ ```bash pnpm install pnpm dev # client → http://localhost:5173 pnpm dev:server # API / signalling → http://localhost:8787 ``` ```bash pnpm typecheck pnpm test pnpm build ``` Copy [`.env.example`](./.env.example) if you need custom ports or a session secret. Defaults work for local solo play without any env file. --- ## Controls | Key | Action | | --- | --- | | `W` `A` `S` `D` / arrows | Move (tank: `A`/`D` turn, `W`/`S` walk) | | `Shift` | Run | | `E` | Interact / talk / examine | | `Space` | Quick turn (180°) | | `C` | Toggle tank ↔ camera-relative | | `Tab` | Inventory | | `M` | Co-op lobby | | `` ` `` | Debug overlay | | `Shift`+`F5` | Save to local storage | --- ## Demo campaign — Ashgrove Precinct (Level 1) Investigation loop in a fixed-camera building: walk the precinct, **question NPCs**, gather evidence, and open locked wings with inventory puzzles. ``` Lobby (Ellis) ── Witness Lounge (Kane) │ Squad Hall ── Detective Office (Det. Reyes) │ ── Interview Room (Nora Voss) │ Corridor ── Records (Dr. Hale) [repaired crank → valve] │ Break Room ── Evidence Vault (Marrow) [brass key → vault key] ``` **Progression** 1. Talk to people in Lobby, Lounge, Office, Interview 2. Squad Hall — crank handle + broken shaft → combine into repaired crank 3. Corridor valve → Records (Hale, brass key, notes) 4. Break Room (brass key) → vault key 5. Evidence Vault — journal, badge case, case payoff Cast GLBs live in `assets/characters/` and are rebuilt with `pnpm cast`. See [`GDD.md`](./GDD.md) for full design, networking model, and implementation notes. --- ## Character creator Two base bodies (**male** / **female**) on a Mixamo-compatible canonical skeleton, plus swappable hair / clothing / footwear. Recipes in `tools/src/creator/presets.ts` export Idle / Walk / Run / QuickTurn / **Slumped** clips. ```bash pnpm creator -- --list pnpm cast # all presets → assets/characters/ pnpm creator -- --id survivor pnpm creator -- --id survivor --uv-guide pnpm creator -- --id survivor --texture # needs Grok CLI for albedo paint pnpm creator:ui # http://localhost:5174 ``` Optional photo path (silhouette measure → code-drawn mesh): ```bash pnpm harness -- --image tools/fixtures/survivor-reference.jpg --name Survivor ``` --- ## Co-op ```bash pnpm dev:server # terminal 1 pnpm dev # terminal 2 ``` Press `M`, create an account, host, share the five-character room code. Host is authoritative; guests send movement intent and reconcile 15 Hz snapshots. --- ## Layout ``` client/ Runtime — engine, systems, PSX post, rooms, Solid UI server/ Hono API + WebSocket signalling (in-memory store by default) shared/ Types, skeleton, save / net schemas tools/ Character harness + local creator UI assets/ Shipped cast GLBs (+ recipes); generated/ is gitignored ``` --- ## Implementation notes A few design-doc features are unavailable in `box3d-wasm@0.2.0`: | Design doc | Reality | Workaround | | --- | --- | --- | | Character mover | Not bound | Capsule collide-and-slide via ray probes | | Triangle-mesh rooms | No trimesh | Box + convex-hull compounds | | Capsule sweeps | No shape cast | Multi-height `castRayClosest` fan | The client sets COOP/COEP headers so the threaded physics build can load; the debug overlay reports which build you got. --- ## License [MIT](./LICENSE) Not affiliated with Capcom, Konami, Square, or any television franchise. The demo setting and cast are original fiction.