Skip to main content

manabrew_engine/ability/effects/
class_level_up_effect.rs

1//! ClassLevelUp effect — increase a Class enchantment's level.
2//!
3//! Ported 1:1 from Java's `ClassLevelUpEffect.java`.
4//! Level up: Increment the Class enchantment's level, activating the
5//! next tier of static abilities and triggers.
6
7use super::EffectContext;
8use crate::event::RunParams;
9use crate::staticability::layer::apply_continuous_effects;
10use crate::trigger::TriggerType;
11
12/// Struct form of this effect so it can participate in the
13/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
14/// `ClassLevelUpEffect` class extending `SpellAbilityEffect`.
15#[manabrew_engine_macros::spell_effect(ClassLevelUpEffect)]
16fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
17    let Some(host_id) = sa.source else { return };
18
19    let current_level = ctx.game.card(host_id).class_level;
20    if let Some(required) = sa
21        .restriction
22        .variables
23        .class_level_operator()
24        .zip(sa.restriction.variables.class_level())
25    {
26        let (operator, operand) = required;
27        let expr = format!("{operator}{operand}");
28        if !crate::parsing::compare::compare_expr(current_level, &expr) {
29            return;
30        }
31    }
32    let new_level = current_level + 1;
33
34    ctx.game.card_mut(host_id).set_class_level(new_level);
35
36    // Class level gates are implemented as continuous/static text changes.
37    // Rebuild those before re-registering triggers so newly unlocked
38    // ClassLevelGained / end-step abilities actually exist on the card.
39    apply_continuous_effects(ctx.game);
40    ctx.trigger_handler.unregister_active_triggers(host_id);
41    ctx.trigger_handler
42        .register_active_trigger(ctx.game, host_id);
43    ctx.trigger_handler.run_trigger(
44        TriggerType::ClassLevelGained,
45        RunParams {
46            card: Some(host_id),
47            class_level: Some(new_level),
48            ..Default::default()
49        },
50        false,
51    );
52}