use crate::card::Card;
use crate::game::GameState;
use crate::ids::CardId;
use super::replacement_effect::ReplacementEffect;
use super::replacement_handler::ReplacementEvent;
use super::replacement_result::ReplacementResult;
use super::replacement_type::ReplacementType;
use crate::card_trait_base::CardTrait;
pub fn has_any_in_counter_map(effect: &ReplacementEffect, counter_type: Option<&str>) -> bool {
match effect.ir.valid_counter_type_text.as_deref() {
None => true, Some(valid) => match counter_type {
None => false, Some(ct) => valid.split(',').any(|v| v.trim().eq_ignore_ascii_case(ct)),
},
}
}
pub fn mode_check(effect: &ReplacementEffect, event: &ReplacementType) -> bool {
match event {
ReplacementType::AddCounter => true,
ReplacementType::Moved => effect.ir.counter_map,
_ => false,
}
}
pub fn can_replace(
effect: &ReplacementEffect,
event: &ReplacementEvent,
game: &GameState,
source_card: &Card,
) -> bool {
if effect.event != ReplacementType::AddCounter {
return false;
}
let (target, is_effect) = match event {
ReplacementEvent::AddCounter {
target, is_effect, ..
} => (*target, *is_effect),
_ => return false,
};
if effect.ir.effect_only && !is_effect {
return false;
}
let target_card = &game.cards[target.index()];
if let Some(valid) = effect.ir.valid_card_selector.as_ref() {
if !effect.matches_compiled_valid_card(valid, target_card, source_card) {
return false;
}
}
if let Some(valid_ct) = effect.ir.valid_counter_type_text.as_deref() {
let counter_type = match event {
ReplacementEvent::AddCounter { counter_type, .. } => counter_type,
_ => return false,
};
let expected = crate::ability::effects::parse_counter_type(valid_ct);
if *counter_type != expected {
return false;
}
}
true
}
pub fn execute(
effect: &ReplacementEffect,
event: &mut ReplacementEvent,
_game: &GameState,
_source_card_id: CardId,
) -> ReplacementResult {
let count = match event {
ReplacementEvent::AddCounter { count, .. } => count,
_ => return ReplacementResult::NotReplaced,
};
if let Some(replace) = effect.replace_with() {
match replace {
"AddOneMoreCounter" | "AddOneMoreCounters" => {
*count += 1;
return ReplacementResult::Updated;
}
"AddTwiceCounters" | "DoubleCounters" => {
*count *= 2;
return ReplacementResult::Updated;
}
_ => {
if let Some(result) =
super::replacement_handler::execute_replace_with_numeric_update(
effect,
event,
_game,
_source_card_id,
"CounterNum",
)
{
return result;
}
eprintln!(
"[WARN] Unknown replacement mode in AddCounter event: {:?}",
replace
);
}
}
}
ReplacementResult::Replaced
}