Skip to main content

manabrew_engine/ability/
ability_key.rs

1//! AbilityKey — enum of ability parameter keys used in run-params maps.
2//!
3//! Mirrors Java's `AbilityKey.java`.
4//! These keys are used for trigger run-parameter maps and ability context passing.
5use serde::Deserialize;
6use serde::Serialize;
7use std::str::FromStr;
8use strum_macros::{Display, EnumString};
9
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Deserialize, Serialize, EnumString, Display)]
11pub enum AbilityKey {
12    AbilityMana,
13    Activator,
14    Affected,
15    AllVotes,
16    Amount,
17    AttachSource,
18    AttachTarget,
19    Attacked,
20    Attacker,
21    Attackers,
22    AttackingPlayer,
23    AttackedTarget,
24    Blocker,
25    Blockers,
26    CanReveal,
27    Card,
28    CardState,
29    Cards,
30    CardsFiltered,
31    CardLKI,
32    Cause,
33    Causer,
34    Championed,
35    ClassLevel,
36    CostStack,
37    CounterAmount,
38    CounteredSA,
39    CounterNum,
40    CounterMap,
41    CounterTable,
42    CounterType,
43    Crew,
44    CumulativeUpkeepPaid,
45    CurrentCastSpells,
46    CurrentStormCount,
47    Cycling,
48    DamageAmount,
49    DamageMap,
50    DamageSource,
51    DamageSources,
52    DamageTarget,
53    DamageTargets,
54    Defender,
55    Defenders,
56    DefendingPlayer,
57    Destination,
58    Devoured,
59    DicePTExchanges,
60    Discard,
61    DiscardedBefore,
62    DividedShieldAmount,
63    EchoPaid,
64    EffectOnly,
65    Enlisted,
66    Exploited,
67    Explored,
68    Explorer,
69    ExtraTurn,
70    ETB,
71    Fighter,
72    Fighters,
73    FirstTime,
74    Fizzle,
75    FoundSearchingLibrary,
76    Ignore,
77    IgnoreChosen,
78    IsCombat,
79    IsCombatDamage,
80    IsDamage,
81    IndividualCostPaymentInstance,
82    LastStateBattlefield,
83    LastStateGraveyard,
84    LifeAmount,
85    LifeGained,
86    LoseReason,
87    Map,
88    Mana,
89    MergedCards,
90    Mode,
91    MonstrosityAmount,
92    NaturalResult,
93    NewCard,
94    NewCounterAmount,
95    NoPreventDamage,
96    Num,
97    Number,
98    Object,
99    Objects,
100    OpponentVotedDiff,
101    OpponentVotedSame,
102    OtherAttackers,
103    Origin,
104    OriginalController,
105    OriginalDefender,
106    OriginalParams,
107    PayingMana,
108    Phase,
109    Player,
110    PreventedAmount,
111    Produced,
112    ReplacedCard,
113    Regeneration,
114    RememberedLKI,
115    ReplacementEffect,
116    ReplacementResult,
117    ReplacementResultMap,
118    Result,
119    RolledToVisitAttractions,
120    RoomName,
121    Scheme,
122    ScryBottom,
123    ScryNum,
124    Sides,
125    Source,
126    Sources,
127    SourceSA,
128    SpellAbility,
129    SpellAbilityTargets,
130    StackSa,
131    SurveilNum,
132    Target,
133    TargetCard,
134    TargetPlayer,
135    Targets,
136    Token,
137    TokenNum,
138    TriggeredCardPower,
139    TriggeredCardToughness,
140    TriggeredPlayer,
141    Valiant,
142    Won,
143    // Internal keys shared across different replacements
144    InternalTriggerTable,
145    SimultaneousETB,
146}
147
148/// All variants for iteration.
149const ALL_ABILITY_KEYS: &[AbilityKey] = &[
150    AbilityKey::AbilityMana,
151    AbilityKey::Activator,
152    AbilityKey::Affected,
153    AbilityKey::AllVotes,
154    AbilityKey::Amount,
155    AbilityKey::AttachSource,
156    AbilityKey::AttachTarget,
157    AbilityKey::Attacked,
158    AbilityKey::Attacker,
159    AbilityKey::Attackers,
160    AbilityKey::AttackingPlayer,
161    AbilityKey::AttackedTarget,
162    AbilityKey::Blocker,
163    AbilityKey::Blockers,
164    AbilityKey::CanReveal,
165    AbilityKey::Card,
166    AbilityKey::CardState,
167    AbilityKey::Cards,
168    AbilityKey::CardsFiltered,
169    AbilityKey::CardLKI,
170    AbilityKey::Cause,
171    AbilityKey::Causer,
172    AbilityKey::Championed,
173    AbilityKey::ClassLevel,
174    AbilityKey::CostStack,
175    AbilityKey::CounterAmount,
176    AbilityKey::CounteredSA,
177    AbilityKey::CounterNum,
178    AbilityKey::CounterMap,
179    AbilityKey::CounterTable,
180    AbilityKey::CounterType,
181    AbilityKey::Crew,
182    AbilityKey::CumulativeUpkeepPaid,
183    AbilityKey::CurrentCastSpells,
184    AbilityKey::CurrentStormCount,
185    AbilityKey::Cycling,
186    AbilityKey::DamageAmount,
187    AbilityKey::DamageMap,
188    AbilityKey::DamageSource,
189    AbilityKey::DamageSources,
190    AbilityKey::DamageTarget,
191    AbilityKey::DamageTargets,
192    AbilityKey::Defender,
193    AbilityKey::Defenders,
194    AbilityKey::DefendingPlayer,
195    AbilityKey::Destination,
196    AbilityKey::Devoured,
197    AbilityKey::DicePTExchanges,
198    AbilityKey::Discard,
199    AbilityKey::DiscardedBefore,
200    AbilityKey::DividedShieldAmount,
201    AbilityKey::EchoPaid,
202    AbilityKey::EffectOnly,
203    AbilityKey::Enlisted,
204    AbilityKey::Exploited,
205    AbilityKey::Explored,
206    AbilityKey::Explorer,
207    AbilityKey::ExtraTurn,
208    AbilityKey::ETB,
209    AbilityKey::Fighter,
210    AbilityKey::Fighters,
211    AbilityKey::FirstTime,
212    AbilityKey::Fizzle,
213    AbilityKey::FoundSearchingLibrary,
214    AbilityKey::Ignore,
215    AbilityKey::IgnoreChosen,
216    AbilityKey::IsCombat,
217    AbilityKey::IsCombatDamage,
218    AbilityKey::IsDamage,
219    AbilityKey::IndividualCostPaymentInstance,
220    AbilityKey::LastStateBattlefield,
221    AbilityKey::LastStateGraveyard,
222    AbilityKey::LifeAmount,
223    AbilityKey::LifeGained,
224    AbilityKey::LoseReason,
225    AbilityKey::Map,
226    AbilityKey::Mana,
227    AbilityKey::MergedCards,
228    AbilityKey::Mode,
229    AbilityKey::MonstrosityAmount,
230    AbilityKey::NaturalResult,
231    AbilityKey::NewCard,
232    AbilityKey::NewCounterAmount,
233    AbilityKey::NoPreventDamage,
234    AbilityKey::Num,
235    AbilityKey::Number,
236    AbilityKey::Object,
237    AbilityKey::Objects,
238    AbilityKey::OpponentVotedDiff,
239    AbilityKey::OpponentVotedSame,
240    AbilityKey::OtherAttackers,
241    AbilityKey::Origin,
242    AbilityKey::OriginalController,
243    AbilityKey::OriginalDefender,
244    AbilityKey::OriginalParams,
245    AbilityKey::PayingMana,
246    AbilityKey::Phase,
247    AbilityKey::Player,
248    AbilityKey::PreventedAmount,
249    AbilityKey::Produced,
250    AbilityKey::ReplacedCard,
251    AbilityKey::Regeneration,
252    AbilityKey::RememberedLKI,
253    AbilityKey::ReplacementEffect,
254    AbilityKey::ReplacementResult,
255    AbilityKey::ReplacementResultMap,
256    AbilityKey::Result,
257    AbilityKey::RolledToVisitAttractions,
258    AbilityKey::RoomName,
259    AbilityKey::Scheme,
260    AbilityKey::ScryBottom,
261    AbilityKey::ScryNum,
262    AbilityKey::Sides,
263    AbilityKey::Source,
264    AbilityKey::Sources,
265    AbilityKey::SourceSA,
266    AbilityKey::SpellAbility,
267    AbilityKey::SpellAbilityTargets,
268    AbilityKey::StackSa,
269    AbilityKey::SurveilNum,
270    AbilityKey::Target,
271    AbilityKey::TargetCard,
272    AbilityKey::TargetPlayer,
273    AbilityKey::Targets,
274    AbilityKey::Token,
275    AbilityKey::TokenNum,
276    AbilityKey::TriggeredCardPower,
277    AbilityKey::TriggeredCardToughness,
278    AbilityKey::TriggeredPlayer,
279    AbilityKey::Valiant,
280    AbilityKey::Won,
281    AbilityKey::InternalTriggerTable,
282    AbilityKey::SimultaneousETB,
283];
284
285pub fn all_ability_keys() -> &'static [AbilityKey] {
286    ALL_ABILITY_KEYS
287}
288
289pub fn from_string(s: &str) -> Option<AbilityKey> {
290    AbilityKey::from_str(s).ok()
291}
292
293pub fn add_card_zone_table_params(
294    trigger_params: &mut std::collections::HashMap<String, String>,
295    change_zone_table: &crate::card::card_zone_table::CardZoneTable,
296) {
297    trigger_params.insert(
298        AbilityKey::InternalTriggerTable.to_string(),
299        "Present".to_string(),
300    );
301
302    trigger_params.insert(
303        "ChangeZoneTable".to_string(),
304        format!("{:?}", change_zone_table),
305    );
306}