manabrew_engine/
game_snapshot.rs1use 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 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 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}