use forge_foundation::ZoneType;
use super::manifest_base_effect::parse_manifest_params;
use super::{emit_zone_trigger, EffectContext};
use crate::ids::{CardId, PlayerId};
use crate::spellability::SpellAbility;
#[manabrew_engine_macros::spell_effect(ManifestEffect)]
fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
let manifest_params = parse_manifest_params(ctx, sa);
let amount = manifest_params.amount;
let controller = sa.activating_player;
let players = if let Some(def) = sa.defined_player() {
crate::ability::ability_utils::resolve_defined_players_with_sa(
def, sa, controller, ctx.game,
)
} else {
vec![controller]
};
for pid in players {
manifest_for_player(ctx, sa, pid, amount);
}
}
fn manifest_for_player(
ctx: &mut EffectContext,
sa: &SpellAbility,
player: PlayerId,
amount: usize,
) {
let defined = sa.defined().unwrap_or("TopOfLibrary");
let cards_to_manifest: Vec<CardId> = if defined == "TopOfLibrary" || defined.is_empty() {
let lib = ctx.game.cards_in_zone(ZoneType::Library, player).to_vec();
lib.into_iter().rev().take(amount).collect()
} else if let Some(zone) = sa.ir.choice_zone {
let zone_cards = ctx.game.cards_in_zone(zone, player).to_vec();
if zone_cards.is_empty() {
return;
}
ctx.agents[player.index()].snapshot_state(ctx.game, ctx.mana_pools);
ctx.agents[player.index()].choose_cards_for_zone_change(
ctx.game,
player,
&zone_cards,
amount.min(zone_cards.len()),
amount.min(zone_cards.len()),
"Choose cards to manifest",
)
} else {
sa.target_chosen.target_card.into_iter().collect()
};
for card_id in cards_to_manifest {
manifest_single_card(ctx, sa, card_id, player);
}
}
fn manifest_single_card(
ctx: &mut EffectContext,
sa: &SpellAbility,
card_id: CardId,
player: PlayerId,
) {
let old_zone = ctx.game.card(card_id).zone;
ctx.game.card_mut(card_id).set_face_down(true);
ctx.game.card_mut(card_id).set_manifested(true);
ctx.game.card_mut(card_id).set_base_pt(Some(2), Some(2));
ctx.game.card_mut(card_id).set_controller(player);
ctx.move_card(card_id, ZoneType::Battlefield, player);
ctx.trigger_handler
.register_active_trigger(ctx.game, card_id);
if sa.ir.remember_manifested {
if let Some(source_id) = sa.source {
ctx.game.card_mut(source_id).add_remembered_card(card_id);
}
}
emit_zone_trigger(
ctx.trigger_handler,
card_id,
old_zone,
ZoneType::Battlefield,
);
}