1v1 Jev
Three.js quickscope arena where Jev decides movement, aiming, ADS, firing, and jumping at roughly 9 Hz.
# 1v1 Jev — Quickscope Arena Server-authoritative browser FPS: queue up, fight **Jev** (TypeSafe System One) in a Rust-like industrial yard, first to 5 kills. Spectators watch and chat from the sidelines. Final kill gets a killcam before the next challenger. ## Stack - **Client:** Vite + Three.js + TypeScript - **Server:** Node.js + `ws`, 60 Hz sim, 20 Hz snapshots - **AI:** `@typesafe-ai/sdk` (`jev-latest`) with heuristic fallback ## Setup ```bash npm install cp .env.example .env # Put your key in .env: # TYPESAFE_API_KEY=... npm run dev ``` - Game UI: http://localhost:5173 - WebSocket (proxied): `/ws` → `localhost:3001` Production-style (single Node host serves API + built client): ```bash npm run build npm start ``` Serves the built client from the Node server on `PORT` (default `3001`). ## Controls | Action | Input | | --- | --- | | Move | WASD | | Look | Mouse (pointer lock) | | ADS | Right mouse | | Fire | Left mouse | | Jump | Space | | Chat | T | ## Game rules - One human vs Jev at a time; others queue / spectate - First to **5** kills - Bolt-action sniper: inaccurate hipfire, accurate once ADS settles (~65% into ADS) — classic MW2 quickscope timing - Shared radar (no fog of war) - Safe respawns with brief spawn protection - Final kill → killcam (full motion replay) → next queued player countdown - Solo players are re-queued automatically after each match ## Jev The server builds structured JSON state each decision tick (~9 Hz) and fans out Choice/Noul questions (move, yaw, pitch, ADS, fire, jump). API key stays on the server. Calls run only while a match is in `playing` and both fighters are alive. If TypeSafe is unreachable, a deterministic heuristic uses the same action interface so matches never stall. ## Deploy (Railway) **Recommended:** on