use super::{resolve_defined_player, resolve_numeric_svar, EffectContext};
use crate::ability::ability_ir::EffectIr;
use crate::spellability::SpellAbility;
#[manabrew_engine_macros::spell_effect(PoisonEffect)]
fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
let amount = resolve_poison_amount(ctx, sa);
if amount == 0 {
return;
}
let controller = sa.activating_player;
if let Some(target_player) = sa.target_chosen.target_player {
if ctx.game.player(target_player).is_alive()
&& !crate::staticability::static_ability_cant_put_counter::any_cant_put_counter_on_player(
&ctx.game.cards,
target_player,
&crate::card::CounterType::Poison,
) {
if amount > 0 {
ctx.game.player_add_poison(target_player, amount);
} else {
ctx.game.player_remove_poison(target_player, -amount);
}
}
return;
}
let defined = sa.defined().unwrap_or("Opponent");
if defined == "Player" {
let alive: Vec<_> = ctx.game.alive_players().into_iter().collect();
for pid in alive {
if !crate::staticability::static_ability_cant_put_counter::any_cant_put_counter_on_player(
&ctx.game.cards,
pid,
&crate::card::CounterType::Poison,
) {
if amount > 0 {
ctx.game.player_add_poison(pid, amount);
} else {
ctx.game.player_remove_poison(pid, -amount);
}
}
}
return;
}
if let Some(pid) = resolve_defined_player(defined, controller, ctx.game) {
if ctx.game.player(pid).is_alive()
&& !crate::staticability::static_ability_cant_put_counter::any_cant_put_counter_on_player(
&ctx.game.cards,
pid,
&crate::card::CounterType::Poison,
) {
if amount > 0 {
ctx.game.player_add_poison(pid, amount);
} else {
ctx.game.player_remove_poison(pid, -amount);
}
}
}
}
fn resolve_poison_amount(ctx: &EffectContext, sa: &SpellAbility) -> i32 {
if let Some(EffectIr::Poison(ir)) = &sa.ir.effect {
if let Some(amount) = &ir.amount {
let resolved = amount.resolve_for_spell_ability(ctx.game, sa, 1);
#[cfg(debug_assertions)]
debug_assert_eq!(
resolved,
resolve_numeric_svar(ctx.game, sa, "Num", 1),
"compiled Poison amount diverged from string params"
);
return resolved;
}
}
resolve_numeric_svar(ctx.game, sa, "Num", 1)
}