use forge_foundation::ZoneType;
use crate::game::GameState;
use crate::ids::{CardId, PlayerId};
use super::player_zone::PlayerZone;
#[derive(Debug, Clone)]
pub struct PlayerZoneBattlefield {
pub zone: PlayerZone,
melded_cards: Vec<CardId>,
trigger: bool,
}
impl PlayerZoneBattlefield {
pub fn new(player: PlayerId) -> Self {
PlayerZoneBattlefield {
zone: PlayerZone::new(ZoneType::Battlefield, player),
melded_cards: Vec::new(),
trigger: true,
}
}
pub fn add(&mut self, card: CardId) {
self.zone.zone.add(card);
}
pub fn add_to_melded(&mut self, card: CardId) {
self.melded_cards.push(card);
}
pub fn remove_from_melded(&mut self, card: CardId) {
if let Some(pos) = self.melded_cards.iter().position(|&c| c == card) {
self.melded_cards.remove(pos);
}
}
pub fn get_melded_cards(&self) -> &[CardId] {
&self.melded_cards
}
pub fn set_triggers(&mut self, enabled: bool) {
self.trigger = enabled;
}
pub fn triggers_enabled(&self) -> bool {
self.trigger
}
pub fn get_cards(&self, filter: bool, game: &GameState) -> Vec<CardId> {
let cards = &self.zone.zone.cards;
if !filter {
return cards.clone();
}
let has_phased = cards.iter().any(|&c| game.card(c).phased_out);
if !has_phased {
return cards.clone();
}
cards
.iter()
.copied()
.filter(|&c| !game.card(c).phased_out)
.collect()
}
}
impl std::ops::Deref for PlayerZoneBattlefield {
type Target = PlayerZone;
fn deref(&self) -> &PlayerZone {
&self.zone
}
}
impl std::ops::DerefMut for PlayerZoneBattlefield {
fn deref_mut(&mut self) -> &mut PlayerZone {
&mut self.zone
}
}