use crate::ids::{CardId, PlayerId};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum TrackedEntity {
Player(PlayerId),
Card(CardId),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct DamageInstance {
pub amount: i32,
pub is_combat: bool,
pub source: Option<CardId>,
pub target: Option<TrackedEntity>,
}
#[derive(Debug, Clone, Default)]
pub struct CardDamageHistory {
pub attacks_this_game: i32,
pub creature_attacked_this_combat: i32,
pub creature_blocked_this_combat: bool,
pub creature_got_blocked_this_combat: bool,
pub attacked_this_turn: Vec<TrackedEntity>,
pub attacked_battle_this_turn: bool,
pub creature_attacked_last_turn_of: Vec<PlayerId>,
pub not_attacked_since_last_upkeep_of: Vec<PlayerId>,
pub not_blocked_since_last_upkeep_of: Vec<PlayerId>,
pub not_been_blocked_since_last_upkeep_of: Vec<PlayerId>,
pub damage_done_this_turn: Vec<DamageInstance>,
}
impl CardDamageHistory {
pub fn record_attack(&mut self, num_others: i32) {
self.attacks_this_game += 1;
self.creature_attacked_this_combat = 1 + num_others;
}
pub fn set_creature_attacked_this_combat(
&mut self,
defender: Option<TrackedEntity>,
num_other_attackers: i32,
defender_is_battle: bool,
) {
self.creature_attacked_this_combat = 1 + num_other_attackers;
if let Some(d) = defender {
self.attacks_this_game += 1;
self.attacked_this_turn.push(d);
if defender_is_battle {
self.attacked_battle_this_turn = true;
}
}
}
pub fn record_block(&mut self) {
self.creature_blocked_this_combat = true;
}
pub fn record_got_blocked(&mut self) {
self.creature_got_blocked_this_combat = true;
}
pub fn record_damage(&mut self, amount: i32, is_combat: bool) {
self.damage_done_this_turn.push(DamageInstance {
amount,
is_combat,
source: None,
target: None,
});
}
pub fn register_damage(
&mut self,
damage: i32,
is_combat: bool,
source_lki: Option<CardId>,
target: TrackedEntity,
) {
if damage <= 0 {
return;
}
self.damage_done_this_turn.push(DamageInstance {
amount: damage,
is_combat,
source: source_lki,
target: Some(target),
});
}
pub fn has_attacked_this_turn(&self, entity: TrackedEntity) -> bool {
self.attacked_this_turn.contains(&entity)
}
pub fn has_attacked_battle_this_turn(&self) -> bool {
self.attacked_battle_this_turn
}
pub fn set_not_attacked_since_last_upkeep_of(&mut self, player: PlayerId) {
self.not_attacked_since_last_upkeep_of.push(player);
}
pub fn clear_not_attacked_since_last_upkeep_of(&mut self) {
self.not_attacked_since_last_upkeep_of.clear();
}
pub fn has_attacked_since_last_upkeep_of(&self, player: PlayerId) -> bool {
!self.not_attacked_since_last_upkeep_of.contains(&player)
}
pub fn set_not_blocked_since_last_upkeep_of(&mut self, player: PlayerId) {
self.not_blocked_since_last_upkeep_of.push(player);
}
pub fn clear_not_blocked_since_last_upkeep_of(&mut self) {
self.not_blocked_since_last_upkeep_of.clear();
}
pub fn has_blocked_since_last_upkeep_of(&self, player: PlayerId) -> bool {
!self.not_blocked_since_last_upkeep_of.contains(&player)
}
pub fn set_not_been_blocked_since_last_upkeep_of(&mut self, player: PlayerId) {
self.not_been_blocked_since_last_upkeep_of.push(player);
}
pub fn clear_not_been_blocked_since_last_upkeep_of(&mut self) {
self.not_been_blocked_since_last_upkeep_of.clear();
}
pub fn has_been_blocked_since_last_upkeep_of(&self, player: PlayerId) -> bool {
!self.not_been_blocked_since_last_upkeep_of.contains(&player)
}
pub fn end_combat(&mut self) {
self.creature_attacked_this_combat = 0;
self.creature_blocked_this_combat = false;
self.creature_got_blocked_this_combat = false;
}
pub fn new_turn(&mut self) {
self.attacked_this_turn.clear();
self.attacked_battle_this_turn = false;
self.damage_done_this_turn.clear();
}
}
pub type DamageHistory = CardDamageHistory;