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