manabrew_engine/ability/effects/name_card_effect.rs
1use super::EffectContext;
2
3/// `SP$ NameCard` — the activating player names a card.
4/// Stores the result in `source.named_cards` for subsequent effects.
5///
6/// Mirrors Java's `NameCardEffect.java`.
7/// - `ChooseFromList$` — comma-separated list of card names to choose from.
8/// - `ChooseFromDefinedCards$` — use remembered/defined cards as choices.
9///
10/// # Card script examples
11/// ```text
12/// A:SP$ NameCard
13/// A:SP$ NameCard | ChooseFromList$ Lightning Bolt,Counterspell,Dark Ritual
14/// ```
15/// Struct form of this effect so it can participate in the
16/// `SpellAbilityEffect` trait hierarchy — mirrors Java's
17/// `NameCardEffect` class extending `SpellAbilityEffect`.
18#[manabrew_engine_macros::spell_effect(NameCardEffect)]
19fn resolve(ctx: &mut EffectContext, sa: &crate::spellability::SpellAbility) {
20 let controller = sa.activating_player;
21
22 // Build the valid names list
23 let valid_names: Vec<String> = if let Some(list) = sa.ir.choose_from_list_text.as_deref() {
24 list.split(',').map(|s| s.trim().to_string()).collect()
25 } else if sa.param_is_true(crate::parsing::keys::CHOOSE_FROM_DEFINED_CARDS) {
26 // Use remembered cards from source
27 if let Some(source_id) = sa.source {
28 ctx.game
29 .card(source_id)
30 .remembered_cards
31 .iter()
32 .map(|&cid| ctx.game.card(cid).card_name.clone())
33 .collect()
34 } else {
35 vec![]
36 }
37 } else {
38 // Open naming — for now provide an empty list (frontend handles free text input)
39 vec![]
40 };
41
42 let chosen = ctx.agents[controller.index()].choose_card_name(controller, &valid_names);
43
44 if let Some(chosen_name) = chosen {
45 if let Some(source_id) = sa.source {
46 ctx.game.card_mut(source_id).add_named_card(&chosen_name);
47 }
48 }
49}