Skip to main content

manabrew_engine/
game_snapshot.rs

1use crate::combat::CombatState;
2use crate::game::GameState;
3use crate::mana::ManaPool;
4use crate::spellability::MagicStack;
5use crate::trigger::handler::TriggerHandler;
6
7#[derive(Debug, Clone)]
8pub struct GameSnapshot {
9    game: GameState,
10    mana_pools: Vec<ManaPool>,
11    combat: CombatState,
12    trigger_handler: TriggerHandler,
13}
14
15impl GameSnapshot {
16    pub fn capture(
17        game: &GameState,
18        mana_pools: &[ManaPool],
19        combat: &CombatState,
20        trigger_handler: &TriggerHandler,
21        include_stack: bool,
22    ) -> Self {
23        let mut game_copy = game.clone();
24        if !include_stack {
25            game_copy.stack = MagicStack::new();
26        }
27        Self {
28            game: game_copy,
29            mana_pools: mana_pools.to_vec(),
30            combat: combat.clone(),
31            trigger_handler: trigger_handler.clone(),
32        }
33    }
34
35    /// Restore this snapshot into mutable game + loop runtime state.
36    pub fn restore_game_state(
37        &self,
38        game: &mut GameState,
39        mana_pools: &mut Vec<ManaPool>,
40        combat: &mut CombatState,
41        trigger_handler: &mut TriggerHandler,
42    ) {
43        *game = self.game.clone();
44        *mana_pools = self.mana_pools.clone();
45        *combat = self.combat.clone();
46        *trigger_handler = self.trigger_handler.clone();
47    }
48
49    /// Restore this snapshot while preserving the caller-owned mana-pool
50    /// allocation. Used by payment loops that hold a mutable slice into
51    /// `GameLoop::mana_pools`; replacing the Vec there would invalidate the
52    /// active slice.
53    pub fn restore_game_state_with_mana_slice(
54        &self,
55        game: &mut GameState,
56        mana_pools: &mut [ManaPool],
57        combat: &mut CombatState,
58        trigger_handler: &mut TriggerHandler,
59    ) {
60        *game = self.game.clone();
61        assert_eq!(
62            mana_pools.len(),
63            self.mana_pools.len(),
64            "snapshot mana pool count must match active game"
65        );
66        mana_pools.clone_from_slice(&self.mana_pools);
67        *combat = self.combat.clone();
68        *trigger_handler = self.trigger_handler.clone();
69    }
70}