Skip to main content

manabrew_engine/ability/effects/
choose_number_effect.rs

1use super::{resolve_numeric_svar, EffectContext};
2
3/// `SP$ ChooseNumber` — the activating player chooses a number.
4/// Stores the result in `source.chosen_number` for subsequent effects.
5///
6/// Mirrors Java's `ChooseNumberEffect.java`.
7/// - `Min$` — minimum value (default 0).
8/// - `Max$` — maximum value (default 10).
9/// - `Random` — if true, choose randomly instead of asking.
10///
11/// # Card script examples
12/// ```text
13/// A:SP$ ChooseNumber | Min$ 0 | Max$ 5
14/// A:SP$ ChooseNumber | Min$ 1 | Max$ X
15/// ```
16/// Struct form of this effect so it can participate in the
17/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
18/// `ChooseNumberEffect` class extending `SpellAbilityEffect`.
19#[manabrew_engine_macros::spell_effect(ChooseNumberEffect)]
20fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
21    let controller = sa.activating_player;
22    let min = resolve_numeric_svar(ctx.game, sa, "Min", 0);
23    let max = resolve_numeric_svar(ctx.game, sa, "Max", 10);
24
25    let is_random = sa.ir.random;
26    let chosen = if is_random {
27        let range = max - min + 1;
28        Some(ctx.rng.next_int(range) + min)
29    } else {
30        ctx.agents[controller.index()].choose_number(
31            controller,
32            sa.source,
33            "Choose a number",
34            None,
35            min,
36            max,
37        )
38    };
39
40    if let Some(num) = chosen {
41        if let Some(source_id) = sa.source {
42            ctx.game.card_mut(source_id).set_chosen_number(Some(num));
43        }
44    }
45}