Skip to main content

manabrew_engine/player/
player_statistics.rs

1use serde::{Deserialize, Serialize};
2
3use crate::ids::CardId;
4use crate::player::{PlayerOutcome, PlayerState};
5
6#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
7pub struct PlayerStatistics {
8    pub opening_hand_size: i32,
9    pub times_mulliganed: i32,
10    pub turns_played: i32,
11    pub outcome: Option<PlayerOutcome>,
12    #[serde(default)]
13    pub cards_cast_this_turn: Vec<CardId>,
14}
15
16impl From<&PlayerState> for PlayerStatistics {
17    fn from(player: &PlayerState) -> Self {
18        Self {
19            opening_hand_size: player.starting_hand_size,
20            times_mulliganed: 0,
21            turns_played: 0,
22            outcome: player.outcome.clone(),
23            cards_cast_this_turn: player.cards_cast_this_turn.clone(),
24        }
25    }
26}
27
28impl PlayerStatistics {
29    pub fn notify_has_mulliganed(&mut self) {
30        self.times_mulliganed += 1;
31    }
32
33    pub fn notify_opening_hand_size(&mut self, size: i32) {
34        self.opening_hand_size = size;
35    }
36
37    pub fn set_outcome(&mut self, outcome: Option<PlayerOutcome>) {
38        self.outcome = outcome;
39    }
40
41    pub fn record_spell_cast(&mut self, card_id: CardId) {
42        self.cards_cast_this_turn.push(card_id);
43    }
44
45    pub fn clear_turn_cache(&mut self) {
46        self.cards_cast_this_turn.clear();
47    }
48
49    pub fn next_turn(&mut self) {
50        self.turns_played += 1;
51        self.clear_turn_cache();
52    }
53}