window.GDD = window.GDD || {}; function RoadmapPage() { const eras = [ { id: 'solo', title: 'Era 1 — Single-Player Proof of Concept', subtitle: 'Validate core loops locally. SpacetimeDB runs on the local machine from Phase 0 — there is no localStorage. One browser window, one player, one simulated galaxy.', accent: 'var(--accent)', phases: [ { num: '0', title: 'Local Skeleton', goal: 'Vite app with local SpacetimeDB instance, game state manager, tick loop, and a single rendered star system.', doneWhen: 'App boots, connects to local SpacetimeDB instance. Shows a star system with a station and 3 asteroids. Game state updates on a local tick (60fps render, 1Hz sim tick). All persistence through SpacetimeDB — no localStorage.', status: 'current', }, { num: '1', title: 'Movement & Commands', goal: 'Click-to-move autopilot with local path resolution. Ship accelerates, cruises, decelerates.', doneWhen: 'Click an asteroid or station. Ship plots a course and moves there with smooth interpolation. ETA display updates. Warp-to for distant objects works.', status: 'upcoming', }, { num: '2', title: 'Mining & Inventory', goal: 'Asteroid mining cycle, ore extraction, cargo hold, and jettison.', doneWhen: 'Approach asteroid, start mining. Mining cycle shows progress. Ore appears in cargo. Cargo full warning. Can jettison into a can.', status: 'upcoming', }, { num: '3', title: 'Combat — FTL Power Allocation', goal: 'Auto-engage combat with reactor power management between weapons / shields / engines.', doneWhen: 'Target a hostile NPC. Ship auto-engages. Player shifts reactor power between 3 subsystems (FTL-style). Power allocation visibly changes combat outcome. Ship can be destroyed.', status: 'upcoming', }, { num: '4', title: 'Ship Fitting', goal: 'CPU / Power Grid slot system. High / Med / Low racks with modules that change ship behavior.', doneWhen: 'Dock at station. Open fitting screen. Equip weapons in high slots, shield booster in mid, cargo expander in low. Fitting affects combat and mining stats. Invalid fits rejected (insufficient CPU/PG). AI module slot type added to fitting schema.', status: 'upcoming', }, { num: '5', title: 'Refining & Manufacturing', goal: 'Refine ore into minerals at a station. Use minerals to manufacture modules and ammo.', doneWhen: 'Dock with ore. Refine at station facility (with yield efficiency). Minerals stored locally. Open manufacturing tab, select a blueprint, queue a job. Job completes after sim time. Product appears in hangar.', status: 'upcoming', }, { num: '6', title: 'NPC Economy Sim', goal: 'Simulated NPC market with supply/demand. Prices react to player trades. Regional price differences.', doneWhen: 'Sell ore at a station. Price adjusts (supply increases, price drops). Fly to another system, price is different. Buy low / sell high works. Market history table shows price movement.', status: 'upcoming', }, { num: '7', title: 'Single-Player Polish', goal: 'Complete HUD, notifications, empty states, tutorial hints, and save/load.', doneWhen: 'Full game loop is playable solo: mine → refine → manufacture → fit → fight → trade. HUD shows all relevant info. SpacetimeDB persists all state (ships, inventory, market, skills) — no localStorage. No dead-end states. Tier 0 Zora: status readouts, basic shield warnings, bare-bones soul state vector in SpacetimeDB. Lightweight exploration events spawn in visited systems.', status: 'future', }, ], }, { id: 'multi', title: 'Era 2 — Multiplayer Environment', subtitle: 'Promote local SpacetimeDB to a shared server. Add multiplayer networking, social systems, and the full living galaxy simulation. Multiple players, one persistent world.', accent: 'var(--cyan)', phases: [ { num: '8', title: 'SpacetimeDB Skeleton', goal: 'Replace local game state with SpacetimeDB tables and reducers. Client subscribes to state.', doneWhen: 'Two browser windows connect to the same SpacetimeDB instance. Both see the same star system state. One client issues a move command, the other sees it. Connection status indicator works.', status: 'future', }, { num: '9', title: 'Presence & Movement Sync', goal: 'Players see each other in real time. Movement is server-authoritative with client-side interpolation.', doneWhen: 'Two players in the same system. Each sees the other\'s ship. Click-to-move sends reducer, server validates, all clients interpolate movement. No desync under normal latency.', status: 'future', }, { num: '10', title: 'Shared Economy', goal: 'Player-to-player market. Buy/sell orders, contracts, and real price discovery.', doneWhen: 'Player A places a sell order. Player B sees it in the market table and buys. ISK and items transfer atomically. Order book shows depth. Market history is shared.', status: 'future', }, { num: '11', title: 'Social — Chat & Bounty', goal: 'Local chat (system-range), delayed PMs, and player-posted bounty system.', doneWhen: 'Players in the same system see local chat in real time. PMs arrive with configurable delay (light-speed). Any player can post a bounty on another. Bounty board is visible galaxy-wide.', status: 'future', }, { num: '12', title: 'Living Galaxy — World Agents + Ship AI Tier 1', goal: 'Background agent scheduler (BitCraft model). NPC trade convoys, faction skirmishes, anomaly spawns, migration routes. Ship AI promoted to LLM-assisted dialogue.', doneWhen: 'Server spawns world events without player input. Events appear in the galaxy story log. Faction borders shift over time. Anomalies appear and expire. A returning player sees the galaxy has changed. Tier 1 Zora: soul.md as real system prompt, LLM-generated dialogue, comms module enables natural language responses.', status: 'future', }, { num: '13', title: 'Multiplayer Combat', goal: 'PvP combat with FTL power allocation. Multiple ships in an engagement. Target calling, range bands.', doneWhen: 'Two players engage each other. Both manage power allocation. Server resolves combat ticks authoritatively. Both clients see damage applied. Loser\'s ship drops loot (or wreck). Kill log records the event.', status: 'future', }, { num: '14', title: 'Corporations & Territory', goal: 'Player corps, structure anchoring, system sovereignty claims.', doneWhen: 'Players form a corp. Corp can anchor a structure in a system. Structure provides bonuses (refining yield, market tax). Sovereignty map shows corp-held systems. Rival corps can contest.', status: 'future', }, { num: '15', title: 'Full MVP — Launch Candidate', goal: 'Polish pass on all systems. Error handling, reconnection, scaling tests, and onboarding flow.', doneWhen: 'Fresh player can create account, complete a guided tutorial, mine their first ore, fit their first ship, survive a PvE encounter, make their first trade, and join a corp — all without hitting a dead-end or a crash. Server handles 50 concurrent players.', status: 'future', }, ], }, ]; function PhaseItem({ phase, isLast }) { const statusStyle = phase.status === 'current' ? { background: 'var(--accent-bg)', color: 'var(--accent)', border: '1px solid var(--accent-border)' } : phase.status === 'upcoming' ? { background: 'var(--cyan-bg)', color: 'var(--cyan)', border: '1px solid rgba(34,211,238,0.25)' } : { background: 'var(--surface-raised)', color: 'var(--muted)', border: '1px solid var(--border)' }; return (
{!isLast &&
}
PHASE {phase.num}

{phase.title}

{phase.status === 'current' && IN PROGRESS}

{phase.goal}

DONE WHEN: {phase.doneWhen}
); } return (

Development Roadmap

Two eras, sixteen phases. Era 1 proves the game is fun as a single-player simulation with a local SpacetimeDB instance — the same persistence architecture as multiplayer, just one player. Era 2 promotes that local SpacetimeDB to a shared server and adds social systems, the living galaxy, and multiplayer combat. Each phase has a verifiable done-when condition. Integration gates between phase groups ensure every system works together before advancing.

Why single-player first with local SpacetimeDB? Networking is the biggest source of bugs and complexity. By validating that mining, combat, fitting, and the economy are fun locally — using the same SpacetimeDB persistence that will serve multiplayer — we de-risk the entire project. There is no localStorage; SpacetimeDB is the persistence layer from day 1. When Era 2 begins, the question is only "how do we share this server?" — not "is this game fun?" or "will the persistence migration work?"
IG

Integration Gates

Between phase groups, an integration gate ensures all systems work together before new ones are added. A gate is a focused playtest that exercises every previously-built feature end-to-end.

Gate 1 — Core Loop (after Phase 2)

Navigate to asteroid → mine → fill cargo → dock → sell ore. The complete economic loop runs in a single session without errors. SpacetimeDB persists the session — closing the browser and reopening restores state.

Phases covered: 0, 1, 2

Gate 2 — Combat + Fitting (after Phase 4)

Fit a ship at station → undock → encounter NPC pirate → manage power allocation → destroy or be destroyed → insurance payout (if destroyed) → refit at station. Combat and fitting form a closed loop with economic consequences.

Phases covered: 0–4

Gate 3 — Full Economy (after Phase 6)

Mine ore → refine → manufacture a module → fit it → use it in combat → sell excess minerals across systems at different prices. The complete production chain and NPC market work as an integrated system. Price differences between stations are discoverable.

Phases covered: 0–6

Gate 4 — Era 1 Complete (after Phase 7)

Full solo game loop with all systems integrated: mine → refine → manufacture → fit → fight → trade → repeat. HUD, notifications, Zora Tier 0, exploration events, and missions all work without dead ends. A new player can learn the game in one session. SpacetimeDB state survives restart.

Phases covered: 0–7 (all Era 1)

Gate 5 — Multiplayer Core (after Phase 10)

Two players in the same galaxy. Both see each other. Both can trade on the shared market. ISK and items transfer atomically. Movement is synced. Connection loss and reconnection work. No desync under normal latency.

Phases covered: 8–10

Gate 6 — Launch Ready (after Phase 15)

Fresh player can: create account, complete tutorial, mine ore, fit ship, survive PvE, make a trade, join a corp, participate in a world event — all without crashes or dead ends. Server handles 50 concurrent. Full game loop validated.

Phases covered: 0–15 (all)
{eras.map((era, ei) => (
{/* Era header */}
ERA {ei + 1}

{era.title}

{era.subtitle}

{/* Phase list */} {era.phases.map((phase, pi) => ( ))}
))}
); } window.GDD.RoadmapPage = RoadmapPage;