use forge_foundation::ZoneType;
use super::EffectContext;
use crate::ability::ability_ir::DefinedRef;
use crate::ids::CardId;
use crate::parsing::keys;
#[manabrew_engine_macros::spell_effect(ControlExchangeEffect)]
fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
let mut object1: Option<CardId> = None;
let mut object2: Option<CardId> = None;
if sa.uses_targeting() {
object1 = sa.target_chosen.target_card;
}
if let Some(defined) = sa.defined() {
if matches!(sa.defined_ref(), Some(DefinedRef::SelfCard)) {
object2 = sa.source;
} else if let Some(uid_str) = defined.strip_prefix("CardUID_") {
object2 = uid_str.parse::<u32>().ok().map(crate::ids::CardId);
}
} else if object1.is_some() {
object2 = sa.source;
}
let (Some(card1), Some(card2)) = (object1, object2) else {
return;
};
let c1 = ctx.game.card(card1);
let c2 = ctx.game.card(card2);
if c1.zone != ZoneType::Battlefield || c2.zone != ZoneType::Battlefield {
return;
}
if c1.phased_out || c2.phased_out {
return;
}
if sa.is_optional() {
let controller = sa.activating_player;
let name1 = c1.card_name.clone();
let name2 = c2.card_name.clone();
ctx.agents[controller.index()].snapshot_state(ctx.game, ctx.mana_pools);
let confirm = ctx.agents[controller.index()].confirm_action(
controller,
Some("ControlExchange"),
&format!("Exchange control of {name1} and {name2}?"),
&[],
None,
None,
);
if !confirm {
return;
}
}
let player1 = ctx.game.card(card1).controller;
let player2 = ctx.game.card(card2).controller;
ctx.game.card_mut(card1).set_controller(player2);
ctx.game.card_mut(card2).set_controller(player1);
if sa.param_is_true(keys::REMEMBER_EXCHANGED) {
if let Some(sid) = sa.source {
ctx.game.card_mut(sid).add_remembered_card(card1);
ctx.game.card_mut(sid).add_remembered_card(card2);
}
}
}