# QuakeCraft / PlatPhorm Arena Full Context ## Purpose QuakeCraft is the canonical PlatPhormNews voxel browser FPS arena. It owns human play, Blocklands, bot practice, host-authoritative active rooms, synchronized destructible cover, match previews, local settings, real/degraded game stats, game event streams, signed webhook intake, and game-specific MCP/API operations. Quake is not Trace, MCP, Docs, Claws, Evals, BrowserOps, Sandbox, WebhookLab, AgentUI, Base, Monitor, Atlas, Sheets, or Decks. Those services are integrations. ## Current Counts - Active players: 2 - Live rooms: 1 - Visible servers: 4 - Recorded matches: 0 - Total frags from records: 0 - Bot profiles: 10 - Map catalog entries: 11 - Playable maps: 11 - Degraded maps: 0 - Game modes: 6 - Active weapons: 11 - Persistence mode: durable - Database: configured - Multiplayer session store: cloudflare-durable-objects - Multiplayer backend: cloudflare-durable-object - Redis fallback status: degraded - Cloudflare Web Analytics RUM: enabled - Cloudflare Speed Brain: enabled Counts are exact for the current backend state. Empty state is valid and not replaced with synthetic activity. ## Game UX - Preflight is normal DOM UI before game load. It configures player/bots/performance/audio, multiplayer room metadata plus LAN/web pacing, and flat/Quest VR/Quest AR mode before Canvas, room traffic, WebXR, or pointer lock begins. An active room resolves its host-owned arena, match type, bot count, name, region, and capacity before launch and locks those fields for guests while champion, camera, input, comfort, and graphics remain player-owned. - Input-ready is emitted only after the first rendered player frame, collision core, and selected pointer/touch/XR input path are ready. Startup marks emit browser measures; optimized builds enforce landing, dynamic-engine, total-startup, and per-map collision/navigation size budgets. Local practice does not require a multiplayer provider. - Enter Arena creates a browser session. - Practice With Bots starts local AI practice. - Browse Servers shows active browser sessions, D1-stewarded zero-human waiting rooms, or protected registered servers, refreshes from /api/v1/servers so copied invite rooms can appear without a hard reload, and fetches public-safe roster plus authoritative map, mode, capacity, and configured-bot details from /api/v1/servers/{id}. Player counts are never fabricated. Pending human alliance requests are retained in room snapshots until accepted, and the HUD exposes persistent sent/waiting plus Y/N response controls. - Settings persist non-sensitive local preferences: desktop sensitivity, ADS sensitivity multiplier shared by mouse/touch/gamepad, mobile aim sensitivity/response, standard-gamepad aim sensitivity/deadzone/vibration, left-handed touch mirroring, touch control size/visibility/haptics, volume, sound, crosshair, FOV, FPS visibility, particle density, graphics quality, render scale, advanced effects, view bob, weapon bob, screen shake, recoil camera influence, reduced motion, player name, bot count, multiplayer enablement, room/region/capacity, network profile, and XR launch choice. Continuous synthesized background hum is disabled; combat and world cues remain positional. - XR comfort mode is a local setting. It lowers headset render pressure and suppresses screen shake while an immersive WebXR session is active. - Game-feel loop is active: deterministic frag momentum rewards, physical head/torso/leg damage zones, exact recovered Machine Gun shots, centered visible/physical human profiles including crouch, swept projectile collision, confirmed-hit bounded organic impact particles, explicit headshot and near-miss feedback, persistent bounded browser-local bot learning, team-aware bot-vs-bot combat, reactive crosshair, one distance-aware HRTF world mix for remote fire/explosions/destruction/construction after browser audio unlock, hit/kill/combo feedback, damage-only bot health bars, streak medals, and real post-match stats. - Player and bot spawn graphs are normalized against actual static collision before the match starts. Selection is deterministic, spawn protection lasts 3.5 seconds, and a grounded player who actively requests movement without progress during the first five seconds is moved to the next safe marker. Idle players never trigger recovery. - Practice bots respawn at 60 HP and use a slightly wider shoulder-readable target capsule. Persistent local learning remains real but is capped to a gentler accuracy, reaction, movement, strafe, and aggression range so repeated sessions do not silently become punitive. - Quick Play starts with Gauntlet, Machine Gun, and Arc Grenade so melee/breaching, readable hitscan/reload, and explosive destruction are understandable immediately. Advanced weapons remain earned map pickups; Custom Match keeps the broader starter selection. - Bot fire resolves an actual spatial ray against the same vertical capsule family used by combat physics instead of converting an accuracy probability directly into damage. Aim error can produce visible near misses, recent damage can trigger a bounded counter-strafe beat, and earned contract heat applies bounded movement/reaction pressure. Automated tests cover the pure aim and hit-zone rules; fun and perceived fairness remain human-play questions. - The living-arena layer uses player position to name five spatial districts per arena family, rotates real traversal and frag contracts every 45 seconds, marks world objectives, grants actual bounded health/armor/ammo rewards, and publishes combat heat to bot tactics. Its cinematic chapter/progress language is inspired by Platphorm Decks while all geometry, names, mechanics, and assets remain original to QuakeCraft. - Bot perception synchronizes one moving spatial index per bounded simulation step and queries only nearby candidates. Tactical decisions run at near/mid/far distance intervals while steering velocity persists between decisions; development telemetry separates perception, decision, and pathfinding time. - Mobile/tablet uses broad independent adaptive move/aim ghost zones that appear beneath the active thumb and fade on release, continuous held turning, a compact multi-touch fire/jump/crouch fan, and a reduced build/weapon/reload utility rail. Portrait remains playable, the layout can mirror for left-handed use, and control size, visibility, response, sensitivity, and haptics persist locally. Room timing/detail, invite/alliance actions, camera/scope, direct arsenal selection, minimap, and combat log remain available in an on-demand tactical drawer instead of permanently covering the arena. Forward movement remains active while crouching. Grounding, acceleration, friction, crouch/slide, jump buffering, head impacts, and automatic fire execute in the fixed 60 Hz pre-physics callback rather than render cadence; camera, recoil presentation, audio-listener updates, and network publication remain render/time-gated presentation work. These are implementation and automated/emulated outcomes, not physical-device comfort certification. - QuakeCraft's shared break-to-build loop runs across every arena: destructible bricks fund cover, ramp, and short bridge pieces with preview, cancellation, costs, protected spawn/topology checks, overlap rejection, durability, weapon damage, an eight-matter inventory, a six-piece cap, 45-second battlefield persistence, pointer-lock-safe B/X/fire controls, compact touch actions, spatial construction audio, ordered room events, and room-scoped Durable Object snapshots for late join and reconnect. Sustained human-play convergence remains a multiplayer-alpha validation gap. - Cloudflare Durable Objects are the production multiplayer coordinator. Each room has one strongly consistent coordinator for presence leases, atomic capacity admission, ordered events, synchronized broken-block, pickup-respawn, and Combat Matter state, match score/timing, rematch state, alliances, and late-join snapshots. A hibernatable same-origin WebSocket carries immediate gameplay deltas at approximately 30 Hz while bounded HTTP snapshots repair missed state. A separate directory object exposes only active public-safe summaries for the server browser. Session snapshots include server time; clients smooth RTT, jitter, and midpoint clock offset and back off bursty links. Failed joins retry with capped backoff, and expired player leases rejoin with stable identity plus the last published movement state. A stable action-only React context keeps movement, weapons, pickups, and destructible-world broadcasters isolated from network-status rerenders. - Cloudflare D1 stores official match results, leaderboard aggregates, protected server registrations, and hashed-reporter chat moderation records. Arena chat messages remain inside the bounded room event log so they survive host-authoritative arena switching without entering the physics or movement hot path. - A five-minute Cloudflare Cron publishes strict versioned persistent-match stewardship messages to a low-volume Queue. Its single consumer idempotently refreshes three zero-human waiting rooms in D1 and sends failures to a dedicated DLQ after three retries. Queue never carries movement, shots, pickups, score, clocks, chat, or arena state. - Cloudflare Web Analytics RUM observes real navigation and Core Web Vitals through the same-origin /cdn-cgi/rum path. Speed Brain emits Cloudflare Speculation-Rules for faster page-to-page navigation; neither feature changes game simulation, map quality, WebSocket ordering, or active-match asset residency. - The protected post-match coach uses Cloudflare Workers AI through a private service binding. It receives only caller-supplied bounded statistics, is absent from Durable Objects and the realtime loop, and cannot alter match, score, timing, inventory, hit, or movement state. - Content-Signal uses Cloudflare's defined ai-train=yes value to permit public-content training. It does not claim a private model training pipeline, and player chat, room tokens, raw identity, and detailed movement are excluded. - Visible selected-map textures, scenery, presentation art, and PK3 content are fetched and decoded behind the boot overlay. Scene-ready is withheld until each required asset is resident or has entered an explicit procedural fallback, preventing delayed mid-match materialization. Original bounded ASCII assets render locally and require no runtime asset fetch. - Static platform and repeated-scenic rendering compact visible instance matrices through active-neighbor retention, render-tier maximum distance, vertical-sector/portal policy, camera frustum, and detail/coarse LOD. Collision remains complete and independent of visual submission. Bot and remote-player core silhouettes remain present while distant decorative meshes, lights, health bars, and nameplates use hysteresis-backed tier distances. - Nine maps use theme-specific ambient, hemisphere, and key-light presets with minimum 0.78 ambient, 0.88 hemisphere, 1.14 key, and 1.28 ACES exposure floors. Brighter fog palettes and eight instanced route beacons per map improve navigation without unbounded lights; restored compatibility arenas remain Custom/Labs choices until the serialized browser matrix verifies their actual canvas settings. - Player hitscan compares static collision, destructible cover, humans, and bots by nearest physical distance. Deterministic weapon spread is sampled in the camera plane; recovered Machine Gun first shots are exact; capsule intersections return physical impact points plus head, torso, or leg zones for bounded weapon-specific damage. Remote-human visuals and hit tests use the same smoothed center-origin presentation position and crouch offset instead of a hidden packet position. Schema-safe shot ids and per-pellet/target hit ids suppress duplicate remote delivery without collapsing legitimate shotgun pellets. Bots use a wider visible-shoulder capsule and respawn at 60 HP, while remote humans keep the physics-matched body profile. Exact 3D grid traversal limits each pellet to ray-adjacent candidates, and swept projectile segments prevent fast shots tunnelling between fixed updates. - Nine arenas receive four deterministic original combat sigils and eight route beacons each; Blocklands adds twelve faction crests. The 48 sigils/crests and 72 beacons use bounded instanced batches plus existing chunk visibility; they add no external downloads, rigid bodies, or collision cost. - Remote movement is interpolated client-side with teleport snap. Stable foreground WebSocket play publishes at approximately 30 Hz; adaptive recovery snapshots remain slower and background-aware. - Blocklands includes 1,162 bounded breakable surface cells across most fortress architecture, including every step in its four approach runs, finer battlement cells, 144 small breach-wall bricks, and a 54-cell demolition wall at the default spawn. Melee, head impacts from below, hitscan, projectiles, and Arc Grenade radial damage alter real chunk-rebuilt trimesh collision state; earth, brick, stone, and ore damage use distinct color/audio/debris feedback, local Rapier debris is capped at 48 pieces, and lethal poses reuse each compiled champion tree so kills and respawns do not remount a shader-heavy actor or blank the arena. - The 11-weapon arsenal includes normal-slot Gauntlet melee, aimed Citadel Sniper, and a generated Arc Grenade launcher. Magazine weapons expose truthful ammo/reload state on desktop and touch; every weapon can fire while airborne. - Pickups use a single instanced generated voxel-glyph batch with short labels and accessible names so their purpose remains recognizable without external art downloads. Room pickup collection and respawn deadlines are serialized by the room coordinator and included in recovery snapshots. Before map registration, deterministic placement checks platform/breakable support, headroom, teleporters, jump pads, and nearby pickup clearance. - The shared ten-weapon arsenal includes three melee starters and an aimed Citadel Sniper; players may fire while airborne and switch between collision-aware first- and third-person views. - Battle Royale is the default Quick Play and room-creation mode; FFA, Duel, TDM, CTF, and Battle Royale CTF remain selectable. The room creator is the host. A host arena or mode change clears transient world/combat state, advances the room round, and remounts every human and local bot roster into the same new match; bot-fill changes and personal settings apply without a match restart. The HUD names the host and displays the active win condition. BR includes three respawn tokens, collision-safe spectator cycling across living humans and bots after tokens are exhausted, positional audio from the watched camera, sudden death until one contender remains, and an eight-second same-room automatic rematch-ready handoff. BR CTF adds capture-earned respawns and a three-capture deathmatch finale. Temporary alliances remain capped at half the roster; bots accept immediately and defend allies. Keyboard users can cycle spectators with Q/E, brackets, arrows, or the mouse wheel, ally with L, target scoreboard rows with Tab+1–9 and then letters, and accept or decline with Y/N. - Every playable map passes one arena-experience contract for spawn depth, navigation, mobility, health, armor, weapon choice, contested powerups, and offline visual identity while preserving its own product identity. - Bot learning records only bounded combat counters in local browser storage. It does not claim federated training, server persistence, or cross-device learning. - FPS is local/browser-measured only: No global FPS value is advertised as live; users see their measured local FPS in-game. ## Game Catalog Playable status: - Public play: active - Local bot matches: active - Multiplayer: active for shared browser sessions when REDIS_URL or the Upstash Redis/KV session store is configured; local memory is suitable for one-process development only - LAN/WebRTC: DataChannels unavailable; mDNS degraded through scripts/lan-server.mjs, not browser-published Bonjour - WebXR: client-runtime-detected for immersive-ar and immersive-vr; server discovery never claims headset support for a visitor - XR session startup: active when browser runtime supports WebXR and the user launches VR or AR from preflight before game load - XR controller gameplay: active for WebXR gamepad trigger fire, thumbstick locomotion, grip or stick-click jump, weapon cycle, reload, and comfort snap-turn - Durable persistence: degraded unless DATABASE_URL, REDIS_URL, or Redis/KV platform storage is configured Frozen Crossing: - Status: active - Visuals: procedural WebGL 2 friendly ice, snow, lamp, frozen river, and weather effects from map metadata - Content pack: procedural/local; external pk3 and glTF content packaging remains a documented follow-up Maps: - nomarch: NOMARCH / Labyrinth Pyramid; status=active; playable=true; spawns=11; pickups=19; botWaypoints=31 - q3dm17: Q3DM17 / The Longest Yard; status=active; playable=true; spawns=9; pickups=19; botWaypoints=28 - forge: The Forge; status=active; playable=true; spawns=11; pickups=19; botWaypoints=30 - iceworld: ICEWORLD / Frozen Crossing; status=active; playable=true; spawns=12; pickups=21; botWaypoints=36 - riftworks: Riftworks Carnival; status=active; playable=true; spawns=11; pickups=19; botWaypoints=30 - blocklands: Blocklands Citadel; status=active; playable=true; spawns=24; pickups=28; botWaypoints=83 - sunset: Sunset Mile; status=active; playable=true; spawns=14; pickups=22; botWaypoints=35 - q3dm6: Q3DM6 / The Camping Grounds; status=active; playable=true; spawns=12; pickups=20; botWaypoints=30 - q3tourney2: Q3TOURNEY2 / The Proving Grounds; status=active; playable=true; spawns=10; pickups=20; botWaypoints=28 - overworld: OVERWORLD / Overworld Wasteland; status=active; playable=true; spawns=24; pickups=18; botWaypoints=41 - mansion: Blackglass Manor; status=active; playable=true; spawns=12; pickups=20; botWaypoints=39 Modes: - ffa: Free For All; status=active; playable=true; playerModel=session - duel: Duel; status=local; playable=true; playerModel=session; degradedReason=Server-authoritative duel ranking is not enabled until protected match recording is backed by durable persistence. - tdm: Team Deathmatch; status=degraded; playable=false; playerModel=future-server-authoritative; degradedReason=Team spawn, team score, and server-authoritative team validation are not complete in Phase 2. - ctf: Capture The Flag; status=local; playable=true; playerModel=session; degradedReason=Shared-room CTF synchronization is still browser-local until server-authoritative objective state ships. - br: Battle Royale; status=active; playable=true; playerModel=session; degradedReason=Competitive ranking remains degraded until movement, damage, and elimination are server-authoritative. - brctf: Battle Royale CTF; status=active; playable=true; playerModel=session; degradedReason=Objective and alliance event sync is active, while durable ranked outcomes still require server authority. Weapons: - gauntlet: Gauntlet; behavior=melee; damage=50; fireRateMs=400; ammo=none; status=active - khopesh: Khopesh Blade; behavior=melee; damage=62; fireRateMs=520; ammo=none; status=active - sunstaff: Sun Staff; behavior=melee; damage=44; fireRateMs=360; ammo=none; status=active - machinegun: Machine Gun; behavior=hitscan; damage=9; fireRateMs=100; ammo=bullets; status=active - shotgun: Shotgun; behavior=hitscan; damage=10; fireRateMs=1000; ammo=shells; status=active - rocketlauncher: Rocket Launcher; behavior=projectile; damage=100; fireRateMs=800; ammo=rockets; status=active - railgun: Railgun; behavior=hitscan; damage=80; fireRateMs=1500; ammo=slugs; status=active - sniperrifle: Citadel Sniper; behavior=hitscan; damage=105; fireRateMs=1250; ammo=slugs; status=active - grenadelauncher: Arc Grenade; behavior=projectile; damage=92; fireRateMs=850; ammo=grenades; status=active - lightning: Lightning Gun; behavior=beam; damage=8; fireRateMs=50; ammo=cells; status=active - plasmagun: Plasma Gun; behavior=projectile; damage=20; fireRateMs=100; ammo=plasma; status=active ## Public API Public reads include health, server list, recorded match list, live match host/rules/duration/roster/leaderboard data, leaderboard, stats, maps, modes, weapons, game manifest/config, local player schema, performance status, LAN status, post-match AI coach metadata, bots, events, API docs, discovery files, and MCP metadata/introspection. Protected mutations require PLATPHORM_API_KEY via Authorization Bearer or X-PlatPhorm-API-Key. Protected actions include server registration, heartbeats, deregistration, official/local-degraded match recording, Workers AI coaching generation, protected event operations, and report generation. ## MCP Tools - list_servers: List real active Quake browser sessions and protected registered servers. Returns empty/degraded state when no live rooms exist. - get_server: Get one server or session by id with real roster when available. - register_server: Protected server registration. Requires PLATPHORM_API_KEY via MCP request headers in production clients. - update_server: Protected server status or heartbeat update. - deregister_server: Protected server deregistration. - list_matches: List protected recorded match history. Does not synthesize fake matches. - list_active_matches: List current human-backed multiplayer matches with host, arena, match rules, elapsed time, bot configuration, kills, deaths, and live leaderboard. - get_active_match: Get one current multiplayer match and its public-safe live roster and rules. - get_match: Get one match record by id. - create_match: Create a protected match draft with a browser play URL. - join_match: Return the browser join URL for a match. - record_match: Protected match result recording. Results are official only when durable persistence is configured. - get_leaderboard: Get leaderboard entries derived from real recorded matches. - get_global_stats: Get global Quake stats derived from active sessions and recorded matches. - list_maps: List playable and honestly degraded Quake map catalog entries. - get_map: Get one map catalog entry, including playable/degraded state. - list_modes: List Quake modes with playable/local/degraded truth labels. - list_weapons: List shipped weapon behavior, ammo, damage, and telemetry metadata. - get_game_manifest: Return the public Quake game manifest and exact capability counts. - get_performance_status: Return public performance capability state and client-measured FPS policy. - get_lan_status: Return LAN launcher and WebRTC DataChannel capability state without claiming authoritative LAN matchmaking. - validate_game_routes: Return the public route inventory used for sitemap/dead-link validation. - validate_playable_arena: Report playable maps, local bot support, restoration state, and honest mode capability truth. - get_health: Return the public Quake health summary payload. - get_info: Return public Quake service identity, auth policy, and discovery links. - list_bots: List local AI bot profiles available for browser practice. - start_bot_practice: Start a local bot practice session and return the play URL. - record_practice_result: Record local-only practice result state. - list_game_events: List public-safe Quake event outbox entries. - receive_game_webhook: Receive a game webhook event into protected event state. - get_route_compliance: Return Quake route compliance and degraded capability summary. - get_discovery_compliance: Return discovery file and sitemap compliance state. - create_docs_report: Return a docs report payload for docs.platphormnews.com. External publishing is degraded unless invoked by a protected platform job. - create_sheet_report: Return a Sheets-ready structured report payload. External sheet creation is degraded unless invoked by a protected platform job. - create_deck_summary: Return a Decks-ready executive summary payload. External deck creation is degraded unless invoked by a protected platform job. ## MCP Resources - quake://servers - quake://server/{id} - quake://matches - quake://active-matches - quake://match/{id} - quake://leaderboard - quake://stats - quake://maps - quake://map/{id} - quake://modes - quake://weapons - quake://game-manifest - quake://performance - quake://lan-status - quake://faq - quake://bots - quake://events - quake://settings - quake://openapi - quake://llms - quake://trust-policy ## MCP Prompts - recommend_quake_server: Quake prompt: recommend quake server - explain_quake_mode: Quake prompt: explain quake mode - explain_quake_weapon: Quake prompt: explain quake weapon - summarize_match: Quake prompt: summarize match - generate_bot_tuning_notes: Quake prompt: generate bot tuning notes - create_game_testing_plan: Quake prompt: create game testing plan - create_quake_report: Quake prompt: create quake report - human_machine_quake_handoff: Quake prompt: human machine quake handoff ## Discovery - OpenAPI JSON: /api/docs - OpenAPI YAML: /openapi.yaml - OpenAPI JSON route: /openapi.json - LLM summary: /llms.txt - LLM index: /llms-index.json - RSS: /rss.xml - Atom: /feed.xml - Sitemap: /sitemap.xml - Main sitemap: /sitemap-main.xml - Sitemap index: /sitemap-index.xml - Trust: /.well-known/trust.json - Agents: /.well-known/agents.json - MCP: /.well-known/mcp.json - Games directory: https://games.platphormnews.com ## Degraded Persistence Policy When canonical database persistence is unavailable, Quake still plays locally and supports browser sessions and bot practice. Official server registry, match history, and leaderboard records are marked local/degraded or empty. PLATPHORM_API_KEY is never stored in browser persistence, traces, discovery files, screenshots, RSS, sitemap, or public UI.