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
+24
View File
@@ -26,6 +26,8 @@ import { disasters } from './disasters';
import { migration } from './migration';
import { sea } from './sea';
import { contested } from './contested';
import { alliances } from './alliances';
import { space } from './space';
import type { Ability, AbilityField } from './types';
/**
@@ -49,6 +51,8 @@ export const ABILITIES: readonly Ability<AbilityField>[] = [
migration,
sea,
contested,
alliances,
space,
];
// ── type re-exports ────────────────────────────────────────────────────────────
@@ -185,3 +189,23 @@ export {
CONTESTED_STROKE,
contestedTooltipLabel,
} from './contested';
// ── alliances (mutual-defense treaties) ──────────────────────────────────────
export {
validateAlliancesOps,
applyAlliances,
freshAllianceId,
} from './alliances';
// ── space (satellites) ───────────────────────────────────────────────────────
export {
validateSpaceOps,
applySpaceControl,
applySatelliteBonuses,
SATELLITE_STABILITY_BONUS,
SATELLITE_TYPES,
isSatelliteType,
freshSatelliteId,
} from './space';