Skip to main content

manabrew_engine/ability/effects/
change_speed_effect.rs

1//! ChangeSpeed — modifies a player's speed.
2//! Ported from Java's ChangeSpeedEffect.
3
4use super::EffectContext;
5use crate::spellability::SpellAbilityMode;
6
7/// Struct form of this effect so it can participate in the
8/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
9/// `ChangeSpeedEffect` class extending `SpellAbilityEffect`.
10#[manabrew_engine_macros::spell_effect(ChangeSpeedEffect)]
11fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
12    let mode = sa.ir.mode.as_ref().unwrap_or(&SpellAbilityMode::Increase);
13    let players = if let Some(defined) = sa.defined() {
14        crate::ability::ability_utils::resolve_defined_players_with_sa(
15            defined,
16            sa,
17            sa.activating_player,
18            ctx.game,
19        )
20    } else if let Some(target) = sa.target_chosen.target_player {
21        vec![target]
22    } else {
23        vec![sa.activating_player]
24    };
25
26    for player in players {
27        if !ctx.game.player(player).is_alive() {
28            continue;
29        }
30        if matches!(mode, SpellAbilityMode::Decrease) {
31            ctx.game
32                .decrease_player_speed(player, Some(ctx.trigger_handler));
33        } else {
34            ctx.game
35                .increase_player_speed(player, Some(ctx.trigger_handler));
36        }
37    }
38}