manabrew_engine/ability/effects/
mutate_effect.rs1use forge_foundation::ZoneType;
6
7use super::EffectContext;
8use crate::ability::ability_ir::DefinedRef;
9use crate::event::RunParams;
10use crate::trigger::TriggerType;
11
12#[manabrew_engine_macros::spell_effect(MutateEffect)]
16fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
17 let source = match sa.source {
18 Some(s) => s,
19 None => return,
20 };
21
22 let target = if let Some(target) = sa.target_chosen.target_card {
24 target
25 } else if let Some(def) = sa.defined_ref() {
26 if matches!(def, DefinedRef::SelfCard) {
27 return; }
29 match ctx.game.card(source).remembered_cards.first() {
30 Some(&id) => id,
31 None => return,
32 }
33 } else {
34 return;
35 };
36
37 if ctx.game.card(target).zone != ZoneType::Battlefield {
38 return;
39 }
40
41 let controller = sa.activating_player;
42
43 let put_on_top = true;
46
47 if put_on_top {
48 let host_name = ctx.game.card(source).card_name.clone();
51 let host_power = ctx.game.card(source).base_power;
52 let host_toughness = ctx.game.card(source).base_toughness;
53 let host_types = ctx.game.card(source).type_line.clone();
54
55 ctx.game.card_mut(target).set_card_name(host_name);
56 ctx.game.card_mut(target).set_base_power(host_power);
57 ctx.game.card_mut(target).set_base_toughness(host_toughness);
58 ctx.game.card_mut(target).set_type_line(host_types);
59 }
60
61 let host_keywords = ctx.game.card(source).keywords.as_string_list();
63 for kw in host_keywords {
64 ctx.game.card_mut(target).add_intrinsic_keyword(&kw);
65 }
66
67 ctx.game
69 .card_mut(source)
70 .set_s_var("MergedTo", format!("{}", target.0));
71 ctx.game.card_mut(source).set_controller(controller);
72
73 let times_mutated = ctx
75 .game
76 .card(target)
77 .svars
78 .get("TimesMutated")
79 .and_then(|s| s.parse::<i32>().ok())
80 .unwrap_or(0);
81 ctx.game
82 .card_mut(target)
83 .set_s_var("TimesMutated", (times_mutated + 1).to_string());
84
85 let old_zone = ctx.game.card(source).zone;
87 ctx.move_card(source, ZoneType::Command, controller);
88
89 ctx.trigger_handler.run_trigger(
91 TriggerType::Mutates,
92 RunParams {
93 card: Some(target),
94 player: Some(controller),
95 ..Default::default()
96 },
97 false,
98 );
99
100 let _ = old_zone;
101}