feat: #80 + #81 alliances & space program — 13th & 14th abilities (v0.45.0)
CI / build + unit + e2e (pull_request) Successful in 2m20s

#80: TurnResult.alliances — form/break durable mutual-defense pacts (GameState.alliances; pair relation → ally/neutral, an active war overrides).
#81: TurnResult.space — launch/deorbit satellites (GameState.satellites; +1 stability per active satellite per turn).
Both appended last to the ABILITIES registry (entries 13 & 14, after contested); durable in SQLite via the stateFields loop, mirrored to regionStats, stats re-derived. System + user prompt goldens updated; 738 unit tests passing.
This commit is contained in:
2026-10-17 16:54:28 +00:00
parent 0a6c5aef9c
commit 283f9e0306
26 changed files with 1493 additions and 49 deletions
+4
View File
@@ -528,6 +528,8 @@ export function buildUserPrompt(
Object.assign(payload, ABILITIES[4].payload(upCtx)); // industry → resources, industry
Object.assign(payload, ABILITIES[10].payload(upCtx)); // sea → seaZones (always emitted)
Object.assign(payload, ABILITIES[11].payload(upCtx)); // contested → contested (only when non-empty)
Object.assign(payload, ABILITIES[12].payload(upCtx)); // alliances → alliances (always emitted)
Object.assign(payload, ABILITIES[13].payload(upCtx)); // space → satellites (always emitted)
return JSON.stringify(payload, null, 2);
}
@@ -670,6 +672,8 @@ export function validateTurnResult(
migration: { ops: [] },
sea: { control: [] },
contested: { open: [], resolve: [] },
alliances: { form: [], break: [] },
space: { launch: [], deorbit: [] },
markers: { add: [], remove: [] },
};