Skip to main content

manabrew_engine/ability/effects/
lose_perpetual_effect.rs

1//! LosePerpetual — remove perpetual effects (digital-only, Alchemy).
2//! Ported from Java's LosePerpetualEffect: removes a perpetual trait change
3//! identified by the triggering trigger's timestamp.
4
5use super::EffectContext;
6
7/// Struct form of this effect so it can participate in the
8/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
9/// `LosePerpetualEffect` class extending `SpellAbilityEffect`.
10#[manabrew_engine_macros::spell_effect(LosePerpetualEffect)]
11fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
12    let Some(host_id) = sa.source else {
13        return;
14    };
15
16    // Java parity: this effect currently removes perpetual changes that were
17    // associated with the trigger currently resolving.
18    if let Some(trigger_index) = sa.trigger_index {
19        let trigger_id = match ctx.game.card(host_id).triggers.get(trigger_index) {
20            Some(t) => t.id,
21            None => return,
22        };
23
24        let to_remove: Vec<(i64, i64)> = ctx
25            .game
26            .card(host_id)
27            .changed_card_traits
28            .iter()
29            .filter_map(|(key, layer)| {
30                if layer.triggers.iter().any(|t| t.id == trigger_id) {
31                    Some(*key)
32                } else {
33                    None
34                }
35            })
36            .collect();
37
38        for (timestamp, static_id) in to_remove {
39            ctx.game
40                .card_mut(host_id)
41                .remove_changed_card_traits(timestamp, static_id);
42            ctx.game.card_mut(host_id).remove_perpetual(timestamp);
43        }
44    }
45}