feat(missions): mission board — schema, deterministic generation, top-up + v6 backfill

New missions table (schema + DDL). Pure model in lib/game/missions.ts:
DELIVER / EXPLORE / FIND contracts generated from missionRng(seed, turn),
board always topped up to >=3 AVAILABLE after every action. save.ts wires
SCHEMA_VERSION 5 -> 6 with a v6 backfill step and completion hooks inside
jumpToSystem/explorePlanet (one atomic persist). Unit tests cover generation
determinism, top-up idempotency, backfill, accept validation and per-type
completion incl. reward accumulation.
This commit is contained in:
2026-09-29 01:55:34 +00:00
parent 5657e8938a
commit f356ffbe93
5 changed files with 539 additions and 3 deletions
+14
View File
@@ -94,6 +94,20 @@ CREATE TABLE IF NOT EXISTS tech (
UNIQUE (save_id, slug)
);
CREATE TABLE IF NOT EXISTS missions (
id INTEGER PRIMARY KEY AUTOINCREMENT,
save_id INTEGER NOT NULL REFERENCES saves(id),
type TEXT NOT NULL, -- 'DELIVER' | 'EXPLORE' | 'FIND'
description TEXT NOT NULL, -- human-readable objective, e.g. "Jump to Kepler Drift"
target_system_id INTEGER, -- DELIVER only — destination system (NULL otherwise)
condition_kind TEXT, -- FIND only — 'resource' | 'part' (NULL otherwise)
progress_target INTEGER NOT NULL DEFAULT 1, -- EXPLORE: scans required; 1 for the others
progress INTEGER NOT NULL DEFAULT 0, -- scans counted since acceptance; 0/1 for DELIVER/FIND
reward_kind TEXT NOT NULL, -- 'resource' | 'part'
reward_qty INTEGER NOT NULL DEFAULT 1,
state TEXT NOT NULL DEFAULT 'AVAILABLE' -- 'AVAILABLE' | 'ACTIVE' | 'DONE'
);
CREATE TABLE IF NOT EXISTS events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
save_id INTEGER NOT NULL REFERENCES saves(id),