manabrew_engine/ability/effects/
haunt_effect.rs1use forge_foundation::ZoneType;
8
9use super::{emit_zone_trigger, EffectContext};
10use crate::ids::CardId;
11
12#[manabrew_engine_macros::spell_effect(HauntEffect)]
16fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
17 let Some(source_id) = sa.source else { return };
18 let controller = sa.activating_player;
19
20 let haunt_target: Option<CardId> = if sa.uses_targeting() {
22 sa.target_chosen.target_card
23 } else {
24 let creatures: Vec<CardId> = ctx
26 .game
27 .cards
28 .iter()
29 .filter(|c| {
30 c.zone == ZoneType::Battlefield
31 && c.type_line
32 .core_types
33 .iter()
34 .any(|ct| matches!(ct, forge_foundation::CoreType::Creature))
35 })
36 .map(|c| c.id)
37 .collect();
38 if creatures.is_empty() {
39 None
40 } else {
41 ctx.agents[controller.index()].snapshot_state(ctx.game, ctx.mana_pools);
42 ctx.agents[controller.index()].choose_single_card_for_zone_change(
43 ctx.game,
44 controller,
45 &creatures,
46 "Choose a creature to haunt",
47 false,
48 )
49 }
50 };
51
52 let Some(target_id) = haunt_target else {
53 return;
54 };
55
56 if ctx.game.card(target_id).zone != ZoneType::Battlefield {
58 return;
59 }
60
61 let old_zone = ctx.game.card(source_id).zone;
63 if old_zone != ZoneType::Exile {
64 ctx.game
65 .move_card(source_id, ZoneType::Exile, ctx.game.card(source_id).owner);
66 emit_zone_trigger(ctx.trigger_handler, source_id, old_zone, ZoneType::Exile);
67 }
68
69 ctx.game.card_mut(source_id).set_exiled_by(Some(target_id));
72
73 ctx.game.card_mut(source_id).add_remembered_card(target_id);
75}