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}