feat(#54): non-military takeovers — automatic regime rename (TurnResult.takeovers)

This commit is contained in:
2026-10-15 10:58:23 +00:00
parent 8eea17148b
commit 3c187c6901
4 changed files with 398 additions and 20 deletions
+30
View File
@@ -68,6 +68,25 @@ export interface TerritoryChange {
* engine's `resolveNationRef`).
*/
/**
* (v0.32.0, #54) A **non-military regime change** — a coup or revolution that
* renames a nation to the name of the new regime. Unlike a {@link RenameOp}
* (a player-confirmed diplomatic/political name change), a takeover is
* **automatic and in-world**: `applyTurnResult` applies it directly (no
* pending queue, no player confirm). Only `Nation.name` changes — the stable
* `id`, territory, relations (keyed by id), stats, and `playerNationId`
* (which references the id) all stay intact, so the player keeps leading the
* nation under its new regime. `nationRef` is resolved exactly like the
* `nationRef` of a NationOp (id first, then a case-insensitive unique name
* match — see `resolveNationRef`).
*/
export interface Takeover {
/** The target nation's id or current name (resolved by `resolveNationRef`). */
nationRef: string;
/** The name of the new regime to set as the nation's display name. */
newRegimeName: string;
}
/**
* A **rename** proposal: change a nation's human-readable `name`. Only the
* `name` changes — the stable `id`, its territory keys, its relations (keyed
@@ -267,6 +286,17 @@ export interface TurnResult {
* survivor. Empty on turns where the model proposes none.
*/
nationOps: NationOp[];
/**
* (v0.32.0, #54) Non-military regime changes (coups / revolutions) that take
* effect **this turn** — each renames the target nation to `newRegimeName`.
* Unlike `nationOps` (player-confirmed proposals), a takeover is **automatic
* and in-world**: it is applied directly by `applyTurnResult` (like territory
* / state changes), not queued to `pendingNationOps`. Only the nation's
* `name` changes; the id, territory, relations, stats, and `playerNationId`
* are all preserved. Empty on turns where no takeover occurs. Required
* (default `[]`).
*/
takeovers: Takeover[];
/**
* (v0.27, #44) Map-marker ops this turn. `add` places new named markers
* (the engine positions each at its region's centroid + a small