pub(super) mod helpers;
mod hidden;
mod known;
pub(super) mod move_cards;
pub(super) mod search;
mod stack;
use forge_foundation::ZoneType;
use super::EffectContext;
use crate::spellability::SpellAbility;
#[manabrew_engine_macros::spell_effect(ChangeZoneEffect)]
fn resolve(ctx: &mut EffectContext, sa: &SpellAbility) {
resolve(ctx, sa);
}
pub fn build_spell_ability(sa: &mut SpellAbility) {
if let Some(zone) = sa.origin_zone() {
if let Some(ref mut tr) = sa.target_restrictions {
if !tr.can_tgt_player() {
tr.tgt_zone = vec![zone];
}
}
}
}
pub fn resolve(ctx: &mut EffectContext, sa: &SpellAbility) {
let dest_zone = match sa.destination_zone() {
Some(z) => z,
None => return,
};
let origins: Vec<ZoneType> = sa.origin_zones();
if origins.is_empty() {
let is_origin_all = sa.origin().is_some_and(|o| o.eq_ignore_ascii_case("All"));
if !is_origin_all {
return;
}
let defined_cards =
crate::ability::spell_ability_effect::get_defined_cards_or_targeted(ctx.game, sa);
if defined_cards.is_empty() {
return;
}
let mut zones: Vec<ZoneType> = Vec::new();
for cid in &defined_cards {
let zone = ctx.game.card(*cid).zone;
if !zones.contains(&zone) {
zones.push(zone);
}
}
let mut sa_no_shuffle = sa.clone();
sa_no_shuffle.ir.no_shuffle = true;
for zone in zones {
known::resolve_known_origin(ctx, &sa_no_shuffle, zone, dest_zone);
}
return;
}
let primary_origin = origins[0];
if (primary_origin.is_hidden() || sa.is_hidden()) && !sa.ir.ninjutsu {
hidden::resolve_hidden_origin(ctx, sa, primary_origin, dest_zone);
} else {
known::resolve_known_origin(ctx, sa, primary_origin, dest_zone);
}
}