feat(@projects/@magic-civilization): ✨ update siege mode status to partial
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
This commit is contained in:
parent
1ea509c660
commit
00a6f8a1dc
6 changed files with 99 additions and 24 deletions
|
|
@ -271,7 +271,7 @@
|
|||
| [p2-43](p2-43-culture-research-completion-event.md) | 🟡 partial | P2 | Culture research live-game pipeline — per-turn GDExt bridge + `culture_researched` emit | — | 🟢 |
|
||||
| [p2-43a](p2-43a-rust-port-culture-pick.md) | 🔴 stub | P3 | Rail-1 port — `_pick_culture_tradition` → mc-ai::tactical::culture_pick | — | 🟢 |
|
||||
| [p2-44](p2-44-ai-promotion-selection.md) | 🟡 partial | P2 | AI promotion selection — auto-pick + emit unit_promoted for AI units | — | 🟢 |
|
||||
| [p2-44a](p2-44a-dataloader-promotion-trees-path.md) | 🔴 stub | P2 | DataLoader path mismatch — `get_promotion("trees")` returns empty | [unassigned](../team-leads/unassigned.md) | 🟢 |
|
||||
| [p2-44a](p2-44a-dataloader-promotion-trees-path.md) | 🟡 partial | P2 | DataLoader path mismatch — `get_promotion(\"trees\")` returns empty | [unassigned](../team-leads/unassigned.md) | 🟢 |
|
||||
| [p2-45](p2-45-elimination-reconciliation.md) | ✅ done | P2 | Player elimination reconciliation — emit `player_eliminated` on every transition | — | 🟢 |
|
||||
| [p2-46](p2-46-past-games-archive-replay-viewer.md) | 🟡 partial | P2 | Past-games archive & replay viewer — `mc-replay` crate, on-disk archive, projection-based playback | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
| [p2-47](p2-47-in-game-statistics-screens.md) | 🟡 partial | P2 | In-game statistics screens — Civ-style 5-tab modal (Demographics / Graphs / Rankings / Replay / Histories) | [shipwright](../team-leads/shipwright.md) | 🟢 |
|
||||
|
|
@ -326,7 +326,7 @@
|
|||
| [p3-07a](p3-07a-cv-wealth-and-authority-amplifier.md) | 🔴 stub | P3 | CV-of-wealth + Authority amplifier → inequality stat | [unassigned](../team-leads/unassigned.md) | 🔒 p3-05b |
|
||||
| [p3-07b](p3-07b-four-damage-channels.md) | 🔴 stub | P3 | Four damage channels — Land/Water/Magic/Air emission from inequality | [unassigned](../team-leads/unassigned.md) | 🔒 p3-07a |
|
||||
| [p3-10a](p3-10a-lair-assault-mode.md) | 🟡 partial | P3 | Lair assault mode — enter-and-clear | [unassigned](../team-leads/unassigned.md) | 🟢 |
|
||||
| [p3-10b](p3-10b-lair-siege-mode.md) | 🔴 stub | P3 | Lair siege mode — multi-turn pressure from adjacent | [unassigned](../team-leads/unassigned.md) | 🔒 p3-10a |
|
||||
| [p3-10b](p3-10b-lair-siege-mode.md) | 🟡 partial | P3 | Lair siege mode — multi-turn pressure from adjacent | [unassigned](../team-leads/unassigned.md) | 🔒 p3-10a |
|
||||
| [p3-10c](p3-10c-lair-raid-mode.md) | 🔴 stub | P3 | Lair raid mode — grab-and-exit | [unassigned](../team-leads/unassigned.md) | 🔒 p3-10a |
|
||||
| [p3-11](p3-11-pioneer-engineer-action-points.md) | 🟡 partial | P3 | Pioneer & Engineer action-point pool | [unassigned](../team-leads/unassigned.md) | 🟢 |
|
||||
| [p3-12](p3-12-fauna-stat-derivation-from-traits.md) | ✅ done | P3 | Fauna combat stat derivation — regenerate from traits | [terraformer](../team-leads/terraformer.md) | 🟢 |
|
||||
|
|
|
|||
|
|
@ -16,9 +16,9 @@
|
|||
|---|---|---|---|---|---|---|---|
|
||||
| **P0** | 0 | 0 | 0 | 0 | 0 | 44 | 44 |
|
||||
| **P1** | 1 | 13 | 1 | 6 | 1 | 51 | 73 |
|
||||
| **P2** | 0 | 12 | 12 | 0 | 6 | 58 | 88 |
|
||||
| **P3 (oos)** | 0 | 7 | 10 | 0 | 21 | 5 | 43 |
|
||||
| **total** | **1** | **32** | **23** | **6** | **28** | **158** | **248** |
|
||||
| **P2** | 0 | 13 | 11 | 0 | 6 | 58 | 88 |
|
||||
| **P3 (oos)** | 0 | 8 | 9 | 0 | 21 | 5 | 43 |
|
||||
| **total** | **1** | **34** | **21** | **6** | **28** | **158** | **248** |
|
||||
|
||||
</td><td valign='top' style='padding-left:2em'>
|
||||
|
||||
|
|
@ -80,6 +80,7 @@
|
|||
| [p2-18](p2-18-guide-public-deployment.md) | 🟡 partial | Guide web app — public hosting + deploy pipeline | — | — | 2026-04-17 | 🟢 unblocked |
|
||||
| [p2-43](p2-43-culture-research-completion-event.md) | 🟡 partial | Culture research live-game pipeline — per-turn GDExt bridge + `culture_researched` emit | — | — | 2026-05-05 | 🟢 unblocked |
|
||||
| [p2-44](p2-44-ai-promotion-selection.md) | 🟡 partial | AI promotion selection — auto-pick + emit unit_promoted for AI units | — | — | 2026-05-05 | 🟢 unblocked |
|
||||
| [p2-44a](p2-44a-dataloader-promotion-trees-path.md) | 🟡 partial | DataLoader path mismatch — `get_promotion(\"trees\")` returns empty | — | [unassigned](../team-leads/unassigned.md) | 2026-05-05 | 🟢 unblocked |
|
||||
| [p2-46](p2-46-past-games-archive-replay-viewer.md) | 🟡 partial | Past-games archive & replay viewer — `mc-replay` crate, on-disk archive, projection-based playback | — | [shipwright](../team-leads/shipwright.md) | 2026-05-05 | 🟢 unblocked |
|
||||
| [p2-47](p2-47-in-game-statistics-screens.md) | 🟡 partial | In-game statistics screens — Civ-style 5-tab modal (Demographics / Graphs / Rankings / Replay / Histories) | — | [shipwright](../team-leads/shipwright.md) | 2026-05-03 | 🟢 unblocked |
|
||||
| [p2-48](p2-48-end-of-game-summary-screen.md) | 🟡 partial | End-of-game summary screen — outcome banner, standings, score graph, awards, timeline, footer actions | — | [shipwright](../team-leads/shipwright.md) | 2026-05-03 | 🟢 unblocked |
|
||||
|
|
@ -90,7 +91,6 @@
|
|||
| [p2-64](p2-64-apricot-async-batch-protocol.md) | 🟡 partial | Apricot async batch protocol — launch / status / fetch decoupling | — | [simulator-infra](../team-leads/simulator-infra.md) | 2026-05-05 | 🟢 unblocked |
|
||||
| [p2-10k](p2-10k-gdlint-cleanup.md) | 🔴 stub | CI: fix 51 gdlint violations so Stage 3 is hard-green | — | [testwright](../team-leads/testwright.md) | 2026-05-04 | 🟢 unblocked |
|
||||
| [p2-10l](p2-10l-gut-regression-triage.md) | 🔴 stub | CI: fix 15 GUT regressions so Stage 5 is hard-green | — | [testwright](../team-leads/testwright.md) | 2026-05-04 | 🟢 unblocked |
|
||||
| [p2-44a](p2-44a-dataloader-promotion-trees-path.md) | 🔴 stub | DataLoader path mismatch — `get_promotion("trees")` returns empty | — | [unassigned](../team-leads/unassigned.md) | 2026-05-05 | 🟢 unblocked |
|
||||
| [p2-55d](p2-55d-ai-ransom-decision-hook.md) | 🔴 stub | AI ransom accept/refuse hook in mc-turn start-of-turn | — | — | 2026-05-03 | 🟢 unblocked |
|
||||
| [p2-55e](p2-55e-richer-ransom-events.md) | 🔴 stub | UnitRansomAccepted / UnitRansomExpired events on TurnResult | — | — | 2026-05-03 | 🟢 unblocked |
|
||||
| [p2-56](p2-56-worker-categories-and-expertise-tiers.md) | 🔴 stub | Worker categories (Sustenance/Construction/Wealth) + 5-tier expertise + Master/Grandmaster auras + idle decay | — | [unassigned](../team-leads/unassigned.md) | 2026-05-03 | 🟢 unblocked |
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"generated_at": "2026-05-05T19:11:09Z",
|
||||
"generated_at": "2026-05-05T19:33:01Z",
|
||||
"totals": {
|
||||
"done": 158,
|
||||
"in_progress": 1,
|
||||
"partial": 32,
|
||||
"stub": 23,
|
||||
"partial": 34,
|
||||
"stub": 21,
|
||||
"missing": 6,
|
||||
"oos": 28,
|
||||
"total": 248
|
||||
|
|
@ -1776,9 +1776,9 @@
|
|||
},
|
||||
{
|
||||
"id": "p2-44a",
|
||||
"title": "DataLoader path mismatch — `get_promotion(\"trees\")` returns empty",
|
||||
"title": "DataLoader path mismatch — `get_promotion(\\\"trees\\\")` returns empty",
|
||||
"priority": "p2",
|
||||
"status": "stub",
|
||||
"status": "partial",
|
||||
"scope": "game1",
|
||||
"owner": "unassigned",
|
||||
"updated_at": "2026-05-05",
|
||||
|
|
@ -2641,10 +2641,10 @@
|
|||
"id": "p3-10b",
|
||||
"title": "Lair siege mode — multi-turn pressure from adjacent",
|
||||
"priority": "p3",
|
||||
"status": "stub",
|
||||
"status": "partial",
|
||||
"scope": "game1",
|
||||
"owner": "unassigned",
|
||||
"updated_at": "2026-05-03",
|
||||
"updated_at": "2026-05-05",
|
||||
"blocked_by": [
|
||||
"p3-10a"
|
||||
],
|
||||
|
|
|
|||
|
|
@ -1,16 +1,20 @@
|
|||
---
|
||||
id: p2-44a
|
||||
title: DataLoader path mismatch — `get_promotion("trees")` returns empty
|
||||
title: "DataLoader path mismatch — `get_promotion(\"trees\")` returns empty"
|
||||
priority: p2
|
||||
status: stub
|
||||
status: partial
|
||||
scope: game1
|
||||
category: ai
|
||||
owner: unassigned
|
||||
created: 2026-05-05
|
||||
updated_at: 2026-05-05
|
||||
evidence:
|
||||
- "src/game/engine/src/autoloads/data_loader.gd:345 get_promotion_trees()"
|
||||
- "src/game/engine/src/modules/ai/ai_turn_bridge_state.gd:418 uses helper"
|
||||
- validation batch NOT yet run — SSL error killed specialist
|
||||
blocked_by: []
|
||||
follow_ups: []
|
||||
---
|
||||
## p2-44a close-out (2026-05-05)
|
||||
|
||||
DataLoader gained a `get_promotion_trees()` helper (commit `99f1049ed` "add dataloader promotion path entry"). `_eligible_promotion_ids` in `ai_turn_bridge_state.gd:418` now uses the new helper. Apricot batch validation NOT yet run — specialist died from API SSL error before the launch/status/fetch validation pass. Status: partial. Next step: run a 1-seed apricot smoke via p2-64 protocol and confirm `unit_promoted` events fire; if yes, flip both p2-44a and p2-44 to done.
|
||||
|
||||
## Context
|
||||
|
||||
|
|
|
|||
|
|
@ -1,16 +1,19 @@
|
|||
---
|
||||
id: p3-10b
|
||||
title: "Lair siege mode — multi-turn pressure from adjacent"
|
||||
title: Lair siege mode — multi-turn pressure from adjacent
|
||||
priority: p3
|
||||
status: stub
|
||||
status: partial
|
||||
scope: game1
|
||||
category: combat
|
||||
owner: unassigned
|
||||
created: 2026-05-03
|
||||
updated_at: 2026-05-03
|
||||
updated_at: 2026-05-05
|
||||
evidence:
|
||||
- src/simulator/crates/mc-core/src/lair.rs (SiegeState/SiegeOutcome)
|
||||
- "src/simulator/crates/mc-combat/src/lair.rs:225 apply_siege_pressure + decay_siege"
|
||||
blocked_by: [p3-10a]
|
||||
follow_ups: []
|
||||
---
|
||||
## p3-10b close-out (2026-05-05)
|
||||
|
||||
`mc_core::lair::SiegeState` + `SiegeOutcome` typed enums shipped. `mc_combat::lair::apply_siege_pressure` and `decay_siege` functions implement multi-turn pressure-from-adjacent semantics. Outcomes include `Continuing | Surrender | AlreadySurrendered`. Status: partial — Rust mechanic implemented; mc-turn integration into the per-turn dispatch (call site for besieging units) and end-to-end batch validation are not yet in place. ACS pushed `2de4ae5ac "add siege pressure state tracking"`.
|
||||
|
||||
## Context
|
||||
|
||||
|
|
|
|||
|
|
@ -204,6 +204,74 @@ pub enum SiegeOutcome {
|
|||
AlreadySurrendered,
|
||||
}
|
||||
|
||||
// ── p3-10c: Raid mode primitives ──────────────────────────────────────
|
||||
//
|
||||
// Raid mode (Layer 3 of `ecology-gameplay.md`, `lair_combat_modes.json::raid`)
|
||||
// is a single-turn opportunistic strike: attacker enters the lair tile,
|
||||
// grabs a fraction of the full clear loot, takes scaled damage, and
|
||||
// (on success) escapes back to an adjacent tile. The lair is NOT cleared.
|
||||
// On `Caught`, the attacker fails to escape and the lair gains a
|
||||
// short-lived `pursuing` flag captured by `RaidAftermath`.
|
||||
|
||||
/// Single-turn raid result returned by `mc_combat::lair::resolve_raid`.
|
||||
///
|
||||
/// The bridge layer is responsible for actually moving the attacker stack
|
||||
/// off the lair tile (`escaped == true`) or leaving it stranded
|
||||
/// (`Caught`). This enum just reports the math — no world-state mutation.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "snake_case")]
|
||||
pub enum RaidOutcome {
|
||||
/// Raid succeeded: attacker grabbed `amount` total loot units (sum
|
||||
/// across all `LootDrop`s — for at-a-glance UI summary; the actual
|
||||
/// per-resource drop list is returned alongside this enum) and
|
||||
/// successfully retreated when `escaped == true`. `escaped` is
|
||||
/// false when the raid landed loot but the retreat roll failed and
|
||||
/// the attacker is still on the lair tile (rare edge — caller
|
||||
/// treats like Caught for movement purposes but loot still drops).
|
||||
LootGrabbed { amount: u32, escaped: bool },
|
||||
/// Raid failed mid-strike: attacker took `losses` HP across the
|
||||
/// stack and gained no loot. Lair fauna pursue (see
|
||||
/// `RaidAftermath`).
|
||||
Caught { losses: u32 },
|
||||
/// Aborted before contact (empty stack, empty defender list, or
|
||||
/// unmet preconditions). No loot, no losses, no aftermath.
|
||||
Aborted,
|
||||
}
|
||||
|
||||
/// Persistent per-lair-tile aftermath of a failed raid: the lair
|
||||
/// fauna pursue for a short window, increasing aggression / encounter
|
||||
/// rate for stacks crossing the territory zone.
|
||||
///
|
||||
/// Lives on `mc_turn::GameState::raid_aftermath` keyed by `(col, row)`
|
||||
/// of the lair tile, mirroring `siege_pressure`. The bridge ticks
|
||||
/// `pursuing_until_turn` against the current turn counter and drops
|
||||
/// expired entries.
|
||||
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
||||
pub struct RaidAftermath {
|
||||
/// Lair content id (for chronicle / UI events).
|
||||
pub lair_id: LairId,
|
||||
/// Absolute turn number at and after which the pursuit flag is
|
||||
/// considered expired. The bridge drops the entry when
|
||||
/// `current_turn >= pursuing_until_turn`.
|
||||
pub pursuing_until_turn: u32,
|
||||
}
|
||||
|
||||
impl RaidAftermath {
|
||||
pub fn new(lair_id: LairId, pursuing_until_turn: u32) -> Self {
|
||||
Self {
|
||||
lair_id,
|
||||
pursuing_until_turn,
|
||||
}
|
||||
}
|
||||
|
||||
/// True when the pursuit window has not yet expired relative to
|
||||
/// `current_turn`.
|
||||
#[must_use]
|
||||
pub fn is_active(&self, current_turn: u32) -> bool {
|
||||
current_turn < self.pursuing_until_turn
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue