use forge_foundation::ZoneType;
use crate::card::Card;
use crate::game::GameState;
use crate::ids::{CardId, PlayerId};
use super::creature_evaluator;
const MOVE_EQUIPMENT_CREATURE_EVAL_THRESHOLD: i32 = 40;
pub fn should_skip_equip(game: &GameState, equipment_id: CardId, player: PlayerId) -> bool {
let equipment = game.card(equipment_id);
let equipped_to = match equipment.attached_to {
Some(id) => id,
None => return false,
};
let equipped_creature = game.card(equipped_to);
if equipped_creature.zone != ZoneType::Battlefield {
return false;
}
if equipped_creature.controller != player {
return false;
}
if equipment.attached_this_turn {
return true;
}
let current_eval = creature_evaluator::evaluate_creature(equipped_creature);
let current_is_useless = creature_evaluator::is_useless_creature(equipped_creature);
if current_is_useless {
return false;
}
let battlefield = game.cards_in_zone(ZoneType::Battlefield, player);
let has_better_target = battlefield.iter().any(|&cid| {
if cid == equipped_to {
return false; }
let candidate = game.card(cid);
if !candidate.is_creature() {
return false;
}
if candidate.zone != ZoneType::Battlefield {
return false;
}
let candidate_eval = creature_evaluator::evaluate_creature(candidate);
candidate_eval - current_eval >= MOVE_EQUIPMENT_CREATURE_EVAL_THRESHOLD
});
!has_better_target
}
pub fn is_equip_ability(card: &Card, ability_text: &str) -> bool {
if !card.type_line.has_subtype("Equipment") {
return false;
}
ability_text.contains("AB$ Attach")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn threshold_is_positive() {
assert!(MOVE_EQUIPMENT_CREATURE_EVAL_THRESHOLD > 0);
}
}