Skip to main content

manabrew_engine/ability/effects/
text_box_exchange_effect.rs

1//! TextBoxExchange effect — swap text boxes of two cards.
2//!
3//! Ported from Java's `TextBoxExchangeEffect.java`.
4
5use super::EffectContext;
6use forge_foundation::ZoneType;
7
8/// End-of-turn revert for text box exchange. Mirrors the `GameCommand.run()`
9/// in Java `TextBoxExchangeEffect` that restores the original abilities text
10/// on both cards when the effect duration expires.
11///
12/// Takes two card IDs and their original abilities lists to restore.
13pub fn run(
14    ctx: &mut EffectContext,
15    card1: crate::ids::CardId,
16    card2: crate::ids::CardId,
17    abilities1: Vec<String>,
18    abilities2: Vec<String>,
19) {
20    // Restore original abilities
21    if ctx.game.card(card1).zone == ZoneType::Battlefield {
22        ctx.game.card_mut(card1).set_abilities(abilities1);
23        ctx.trigger_handler.register_active_trigger(ctx.game, card1);
24    }
25    if ctx.game.card(card2).zone == ZoneType::Battlefield {
26        ctx.game.card_mut(card2).set_abilities(abilities2);
27        ctx.trigger_handler.register_active_trigger(ctx.game, card2);
28    }
29}
30
31/// Struct form of this effect so it can participate in the
32/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
33/// `TextBoxExchangeEffect` class extending `SpellAbilityEffect`.
34#[manabrew_engine_macros::spell_effect(TextBoxExchangeEffect)]
35fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
36    let source = sa.source;
37    let target = sa.target_chosen.target_card;
38
39    let (Some(card1), Some(card2)) = (source, target) else {
40        return;
41    };
42    if ctx.game.card(card1).zone != ZoneType::Battlefield {
43        return;
44    }
45    if ctx.game.card(card2).zone != ZoneType::Battlefield {
46        return;
47    }
48
49    // Swap abilities text
50    let abilities1 = ctx.game.card(card1).abilities.clone();
51    let abilities2 = ctx.game.card(card2).abilities.clone();
52    ctx.game.card_mut(card1).set_abilities(abilities2);
53    ctx.game.card_mut(card2).set_abilities(abilities1);
54
55    // Re-register triggers
56    ctx.trigger_handler.register_active_trigger(ctx.game, card1);
57    ctx.trigger_handler.register_active_trigger(ctx.game, card2);
58}