6.8 KiB
6.8 KiB
Changelog
v0.4.0 — 2026-09-28 22:17
- LOCAL SYSTEM tab — planet list + exploration to find things (issue #6): the first in-system game loop on top of issue #5's save/world foundation. Single-player, no auth, by design.
- New tables (
lib/db/schema.ts+ DDL inlib/db/client.ts):planets(id/system_id/parent_id/name/type/hazard/explored — planets have parent_id NULL, moons point at their planet) andinventory_items(id/save_id/kind[name]/qty — the dumb-simple cargo hold SHIP SYSTEMS (#8) will spend from later). - Planet generation hooks into world gen (
lib/game/world.ts, pure + seeded): each system gets 2–5 planets, some with 1–3 moons, generated when the system is inserted viabodyRng(seed, systemId)— so a given system always has the same bodies regardless of order. Bodies are stored in display order (a moon follows its parent row). - Exploration (
lib/game/save.ts):explorePlanetrolls a deterministic haul fromexplorationRng(seed, planetId)— a resource and/or a part (qty), or nothing (~21% of scans) — marks the body explored (each once), costs a turn, accumulates finds into inventory (same kind+name bumps qty) and writes an explore event. - New endpoints:
GET /api/system→{ systemId, systemName, planets[{id,name,type,hazard,explored,parent}], inventory, turn };POST /api/explore {planetId}→ fresh system state +outcome(400 malformed body, 404 unknown planet, 409 already explored). OpenAPI spec in code (lib/openapi.ts) updated for both. - LOCAL SYSTEM tab now renders REAL data: fetches
/api/systemon mount, draws the staggered body list (planets base level, moons indented + dimmed with their parent's name), badges reflect real state (UNEXPLORED / SCANNED / HAZARD) and an EXPLORE button per unexplored row; explore responses apply directly (no polling). A CARGO HOLD panel shows the live inventory. Placeholder constants removed for this tab only — other tabs keep theirs until their issues land.
v0.3.0 — 2026-09-28 21:35
- World generation + jump between solar systems (issue #5): the game save, DB schema, turn counter and event writing that all later tabs build on. Single-player by design — one save row, no auth/accounts.
- New tables (
lib/db/schema.ts+ DDL inlib/db/client.ts):saves(id/seed/turn/created_at),solar_systems(name, x/y chart position, discovered, is_current),jump_routes(directed pairs, both directions stored for single-row adjacency lookups),events(append-only log: new-game + jump events so far). - Seeded world generation (
lib/game/world.ts, pure functions): a save's seed deterministically generates the starting system plus a ring of six undiscovered neighbours with jump routes; jumping into an undiscovered system grows the chart with four more neighbours around it, so there is always somewhere to jump and a route back. - Save lifecycle (
lib/game/save.ts): auto-initializes on first API hit when no save exists, exposes world state, validates jumps (adjacency required — non-adjacent/unknown rejected), sets current, increments the turn counter, writes events, persists durably. - New endpoints:
GET /api/world→{ systems, edges, turn };POST /api/jump { systemId }→ fresh world state (400 malformed body, 404 unknown system, 409 not adjacent). OpenAPI spec in code (lib/openapi.ts) updated for both. - WORLD MAP tab now renders REAL data: fetches
/api/worldon mount, draws the live NodeGraph (current = ACTIVE/CURRENT, discovered = NEUTRAL/DISCOVERED, unknown = OFFLINE/UNKNOWN) with a jump button per adjacent system; placeholder map constants removed for this tab only — other tabs keep their placeholders until their own issues land.
v0.2.2 — 2026-09-28 21:02
- LOCAL SYSTEM tab: explorable-worlds list now staggers moons under their parent planet (indented rows) — ASHFALL attached under BRIMSTONE, new PALEMOON moon under AURELLE; badges unchanged.
v0.2.1 — 2026-09-28 20:22
- LOCAL SYSTEM tab: removed the system node graph (star/planets/moons) — the tab now shows only the explorable-worlds list at full panel width. WORLD MAP keeps its node graph;
components/ui/node-graph.tsxunchanged and still in use there.
v0.2.0 — 2026-09-28 19:19
- Game interface template (visual only, zero game logic): the operations panel in
components/mission-control.tsxis now seven tabs — WORLD MAP (NodeGraph of 10 placeholder solar systems linked by jump routes), LOCAL SYSTEM (NodeGraph of star + planets/moons plus an explorable-worlds list), CREW (crew cards with name/role and good/bad trait placeholders), SHIP SYSTEMS (system cards with inert EXPAND / UPGRADE / BUILD NEW affordances), SKILL TREE (tech cards unlocking new system builds/upgrades), MISSIONS (previous NEXT MISSION content), EVENT LOG (ship log terminal). All data is local placeholder constants. - Left column: VESSEL METRICS progress rings replaced with scificn Progress bracket bars; SHIP SYSTEMS status panel, header stat cards and right column unchanged.
- New scificn-ui components copied into
components/ui/: NodeGraph, Progress (+@radix-ui/react-progressdependency).
v0.1.0 — 2026-09-28 15:47
- Initial scaffold (stack proof): base stack copied/adapted from Flight-Ops (
../flight) — Next.js 16 App Router + React 19 + TypeScript strict, bun package manager, Node 22 in CI/Docker. - Single-player only by design: NO auth/accounts/multiplayer anywhere (Flight-Ops's users/sessions/admin/leaderboard patterns deliberately not copied).
- Frontend component layer: scificn-ui v0.1.0 integrated copy-paste (Radix + Tailwind v4, SCI-FI theme) — Button, Panel, Badge, Card, Alert in
components/ui/; theme tokens inapp/globals.csswith a brightened--text-mutedoverride (#4A4A40→#6B6B5C). - Interface base: the scificn-ui Mission Control showcase (https://www.scificn.dev/showcase/mission-control) rebuilt as the app's main UI —
app/page.tsxrenderscomponents/mission-control.tsx(client dashboard: sticky header, stat-card row, 3-column grid of Panel/Tabs/StatusGrid/ProgressRing/BarChart/LineChart/Terminal panels, sticky footer), placeholder ship content only, no game logic; additional upstream components copied intocomponents/ui/(Tabs, StatCard, Terminal, StatusGrid, ProgressRing, BarChart, LineChart) +@radix-ui/react-tabsdependency. - DB plumbing: SQLite via Drizzle ORM + sql.js (WASM) at
db/space-wanderer.db, volume-mounted; empty schema placeholder — game tables land with the first game systems. - API pattern established:
/api/version+ OpenAPI 3.x spec generated in code (lib/openapi.ts) served at/api/openapi. - CI/e2e/docker pipeline: single "build + unit + e2e" job on the dind runner, isolated stack
space-wanderer-ciwith static IP 172.39.0.10 (fresh DB volume per run), Playwright e2e (smoke.spec.ts,state.spec.ts) CI-only against that stack; prod compose behind Traefik athttps://space-wanderer.dev.kkhost.pl(not deployed yet).