1use 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 InternalTriggerTable,
145 SimultaneousETB,
146}
147
148const 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}