1use serde::{Deserialize, Serialize};
9use strum_macros::EnumString;
10
11use crate::trigger::trigger::{parse_trigger, Trigger};
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, Default, EnumString)]
14#[strum(ascii_case_insensitive)]
15pub enum TriggerType {
16 #[default]
17 ChangesZone,
18 Phase,
19 SpellCast,
20 Attacks,
21 DamageDone,
22 Fight,
24 FightOnce,
26 Discarded,
28 Countered,
30 Blocks,
33 AttackerBlocked,
35 AttackerUnblocked,
37 LifeGained,
39 LifeLost,
41 CounterAdded,
43 CounterRemoved,
45 Sacrificed,
47 Drawn,
49 Milled,
51 Taps,
53 Untaps,
55 Transformed,
57 Attached,
59 Unattached,
61 LandPlayed,
63 BecomesTarget,
65 TapsForMana,
67 AbilityActivated,
69 Explored,
71 BecomeMonstrous,
73 BecomeMonarch,
75 DamageDealtOnce,
77 Destroyed,
79 Exiled,
81 TokenCreated,
83 SpellCopied,
85 TakeInitiative,
87 PhasedOut,
89 PhasedIn,
91 AttackersDeclared,
94 BlockersDeclared,
96 ChangesZoneAll,
98 ChangesController,
100 #[strum(serialize = "TurnBegin", serialize = "newturn")]
102 TurnBegin,
103 DamageDoneOnce,
105 SpellCastAll,
107 AbilityCast,
109 SpellAbilityCast,
111 SpellAbilityCopy,
113 SpellCastOrCopy,
115 SpellCopy,
117 LifeLostAll,
119 CounterAddedOnce,
121 DiscardedAll,
123 SacrificedOnce,
125 #[strum(serialize = "Cycled", serialize = "cycling")]
127 Cycled,
128 PhaseIn,
130 PhaseOut,
132 Always,
134 Immediate,
136 Surveil,
138 Scry,
140 #[strum(serialize = "Foretell", serialize = "foretold")]
142 Foretell,
143 SearchedLibrary,
145 Shuffled,
147 ManaAdded,
149 TokenCreatedOnce,
151 TapAll,
153 UntapAll,
155 BecomesTargetOnce,
157 AttackerBlockedByCreature,
159 AttackerBlockedOnce,
161 AttackerUnblockedOnce,
163 SpellCastOnce,
165 SpellCastOfType,
167 DamageAll,
169 DamagePreventedOnce,
171 ExcessDamage,
173 CounterRemovedOnce,
175 Exerted,
177 Adapt,
179 BecomeRenowned,
181 Evolved,
183 Investigated,
185 Proliferate,
187 CompletedDungeon,
189 DungeonCompleted,
191 CommitCrime,
193 RingTemptsYou,
195 PayLife,
197 PayEcho,
199 NewGame,
201 DayTimeChanges,
203 ClassLevelGained,
205 BecomesPlotted,
207 LosesGame,
209 Discover,
211 Elementalbend,
213 #[strum(disabled)]
215 ElementalBend,
216 Airbend,
218 Earthbend,
220 Firebend,
222 Waterbend,
224 PhaseOutAll,
226 PlanarDice,
228 Vote,
230 GiveGift,
232 VisitAttraction,
234 EnteredRoom,
236 RoomEntered,
238 MilledAll,
240 MilledOnce,
242 Abandoned,
244 ManifestDread,
246 Specializes,
248 Trains,
250 Devoured,
252 ConjureAll,
254 SeekAll,
256 BecomesCrewed,
258 Championed,
260 Clashed,
262 Mentored,
264 FullyUnlock,
266 AbilityResolves,
268 AbilityTriggered,
270 UnlockDoor,
272 CounterAddedAll,
274 CounterPlayerAddedAll,
276 CounterTypeAddedAll,
278 Crewed,
280 Saddled,
282 Stationed,
284 DamageDoneOnceByController,
286 ExcessDamageAll,
288 CollectEvidence,
290 Forage,
292 Enlisted,
294 FlippedCoin,
296 RolledDie,
298 RolledDieOnce,
300 ManaExpend,
302 TurnFaceUp,
304 Explores,
306 Exploited,
308 PayCumulativeUpkeep,
310 ChaosEnsues,
313 Planeswalk,
315 PlaneswalkedFrom,
317 PlaneswalkedTo,
319 ClaimPrize,
321 CrankAdvanced,
323 CrankContraption,
325 CaseSolved,
327 BecomesSaddled,
329 SetInMotion,
331 Mutates,
333 Unattach,
335 TakesInitiative,
337 AttackersDeclaredOneTarget,
339}
340
341impl TriggerType {
342 pub fn name(&self) -> &'static str {
344 match self {
345 TriggerType::ChangesZone => "ChangesZone",
346 TriggerType::Phase => "Phase",
347 TriggerType::SpellCast => "SpellCast",
348 TriggerType::Attacks => "Attacks",
349 TriggerType::DamageDone => "DamageDone",
350 TriggerType::Fight => "Fight",
351 TriggerType::FightOnce => "FightOnce",
352 TriggerType::Discarded => "Discarded",
353 TriggerType::Countered => "Countered",
354 TriggerType::Blocks => "Blocks",
355 TriggerType::AttackerBlocked => "AttackerBlocked",
356 TriggerType::AttackerUnblocked => "AttackerUnblocked",
357 TriggerType::LifeGained => "LifeGained",
358 TriggerType::LifeLost => "LifeLost",
359 TriggerType::CounterAdded => "CounterAdded",
360 TriggerType::CounterRemoved => "CounterRemoved",
361 TriggerType::Sacrificed => "Sacrificed",
362 TriggerType::Drawn => "Drawn",
363 TriggerType::Milled => "Milled",
364 TriggerType::Taps => "Taps",
365 TriggerType::Untaps => "Untaps",
366 TriggerType::Transformed => "Transformed",
367 TriggerType::Attached => "Attached",
368 TriggerType::Unattached => "Unattached",
369 TriggerType::LandPlayed => "LandPlayed",
370 TriggerType::BecomesTarget => "BecomesTarget",
371 TriggerType::TapsForMana => "TapsForMana",
372 TriggerType::AbilityActivated => "AbilityActivated",
373 TriggerType::Explored => "Explored",
374 TriggerType::BecomeMonstrous => "BecomeMonstrous",
375 TriggerType::BecomeMonarch => "BecomeMonarch",
376 TriggerType::DamageDealtOnce => "DamageDealtOnce",
377 TriggerType::Destroyed => "Destroyed",
378 TriggerType::Exiled => "Exiled",
379 TriggerType::TokenCreated => "TokenCreated",
380 TriggerType::SpellCopied => "SpellCopied",
381 TriggerType::TakeInitiative => "TakeInitiative",
382 TriggerType::PhasedOut => "PhasedOut",
383 TriggerType::PhasedIn => "PhasedIn",
384 TriggerType::AttackersDeclared => "AttackersDeclared",
385 TriggerType::BlockersDeclared => "BlockersDeclared",
386 TriggerType::ChangesZoneAll => "ChangesZoneAll",
387 TriggerType::ChangesController => "ChangesController",
388 TriggerType::TurnBegin => "TurnBegin",
389 TriggerType::DamageDoneOnce => "DamageDoneOnce",
390 TriggerType::SpellCastAll => "SpellCastAll",
391 TriggerType::AbilityCast => "AbilityCast",
392 TriggerType::SpellAbilityCast => "SpellAbilityCast",
393 TriggerType::SpellAbilityCopy => "SpellAbilityCopy",
394 TriggerType::SpellCastOrCopy => "SpellCastOrCopy",
395 TriggerType::SpellCopy => "SpellCopy",
396 TriggerType::LifeLostAll => "LifeLostAll",
397 TriggerType::CounterAddedOnce => "CounterAddedOnce",
398 TriggerType::DiscardedAll => "DiscardedAll",
399 TriggerType::SacrificedOnce => "SacrificedOnce",
400 TriggerType::Cycled => "Cycled",
401 TriggerType::PhaseIn => "PhaseIn",
402 TriggerType::PhaseOut => "PhaseOut",
403 TriggerType::Always => "Always",
404 TriggerType::Immediate => "Immediate",
405 TriggerType::Surveil => "Surveil",
406 TriggerType::Scry => "Scry",
407 TriggerType::Foretell => "Foretell",
408 TriggerType::SearchedLibrary => "SearchedLibrary",
409 TriggerType::Shuffled => "Shuffled",
410 TriggerType::ManaAdded => "ManaAdded",
411 TriggerType::TokenCreatedOnce => "TokenCreatedOnce",
412 TriggerType::TapAll => "TapAll",
413 TriggerType::UntapAll => "UntapAll",
414 TriggerType::BecomesTargetOnce => "BecomesTargetOnce",
415 TriggerType::AttackerBlockedByCreature => "AttackerBlockedByCreature",
416 TriggerType::AttackerBlockedOnce => "AttackerBlockedOnce",
417 TriggerType::AttackerUnblockedOnce => "AttackerUnblockedOnce",
418 TriggerType::SpellCastOnce => "SpellCastOnce",
419 TriggerType::SpellCastOfType => "SpellCastOfType",
420 TriggerType::DamageAll => "DamageAll",
421 TriggerType::DamagePreventedOnce => "DamagePreventedOnce",
422 TriggerType::ExcessDamage => "ExcessDamage",
423 TriggerType::CounterRemovedOnce => "CounterRemovedOnce",
424 TriggerType::Exerted => "Exerted",
425 TriggerType::Adapt => "Adapt",
426 TriggerType::BecomeRenowned => "BecomeRenowned",
427 TriggerType::Evolved => "Evolved",
428 TriggerType::Investigated => "Investigated",
429 TriggerType::Proliferate => "Proliferate",
430 TriggerType::CompletedDungeon => "CompletedDungeon",
431 TriggerType::DungeonCompleted => "DungeonCompleted",
432 TriggerType::CommitCrime => "CommitCrime",
433 TriggerType::RingTemptsYou => "RingTemptsYou",
434 TriggerType::PayLife => "PayLife",
435 TriggerType::PayEcho => "PayEcho",
436 TriggerType::NewGame => "NewGame",
437 TriggerType::DayTimeChanges => "DayTimeChanges",
438 TriggerType::ClassLevelGained => "ClassLevelGained",
439 TriggerType::BecomesPlotted => "BecomesPlotted",
440 TriggerType::LosesGame => "LosesGame",
441 TriggerType::Discover => "Discover",
442 TriggerType::Elementalbend => "Elementalbend",
443 TriggerType::ElementalBend => "ElementalBend",
444 TriggerType::Airbend => "Airbend",
445 TriggerType::Earthbend => "Earthbend",
446 TriggerType::Firebend => "Firebend",
447 TriggerType::Waterbend => "Waterbend",
448 TriggerType::PhaseOutAll => "PhaseOutAll",
449 TriggerType::PlanarDice => "PlanarDice",
450 TriggerType::Vote => "Vote",
451 TriggerType::GiveGift => "GiveGift",
452 TriggerType::VisitAttraction => "VisitAttraction",
453 TriggerType::EnteredRoom => "EnteredRoom",
454 TriggerType::RoomEntered => "RoomEntered",
455 TriggerType::MilledAll => "MilledAll",
456 TriggerType::MilledOnce => "MilledOnce",
457 TriggerType::Abandoned => "Abandoned",
458 TriggerType::ManifestDread => "ManifestDread",
459 TriggerType::Specializes => "Specializes",
460 TriggerType::Trains => "Trains",
461 TriggerType::Devoured => "Devoured",
462 TriggerType::ConjureAll => "ConjureAll",
463 TriggerType::SeekAll => "SeekAll",
464 TriggerType::BecomesCrewed => "BecomesCrewed",
465 TriggerType::Championed => "Championed",
466 TriggerType::Clashed => "Clashed",
467 TriggerType::Mentored => "Mentored",
468 TriggerType::FullyUnlock => "FullyUnlock",
469 TriggerType::AbilityResolves => "AbilityResolves",
470 TriggerType::AbilityTriggered => "AbilityTriggered",
471 TriggerType::UnlockDoor => "UnlockDoor",
472 TriggerType::CounterAddedAll => "CounterAddedAll",
473 TriggerType::CounterPlayerAddedAll => "CounterPlayerAddedAll",
474 TriggerType::CounterTypeAddedAll => "CounterTypeAddedAll",
475 TriggerType::Crewed => "Crewed",
476 TriggerType::Saddled => "Saddled",
477 TriggerType::Stationed => "Stationed",
478 TriggerType::DamageDoneOnceByController => "DamageDoneOnceByController",
479 TriggerType::ExcessDamageAll => "ExcessDamageAll",
480 TriggerType::CollectEvidence => "CollectEvidence",
481 TriggerType::Forage => "Forage",
482 TriggerType::Enlisted => "Enlisted",
483 TriggerType::FlippedCoin => "FlippedCoin",
484 TriggerType::RolledDie => "RolledDie",
485 TriggerType::RolledDieOnce => "RolledDieOnce",
486 TriggerType::ManaExpend => "ManaExpend",
487 TriggerType::TurnFaceUp => "TurnFaceUp",
488 TriggerType::Explores => "Explores",
489 TriggerType::Exploited => "Exploited",
490 TriggerType::PayCumulativeUpkeep => "PayCumulativeUpkeep",
491 TriggerType::ChaosEnsues => "ChaosEnsues",
492 TriggerType::Planeswalk => "Planeswalk",
493 TriggerType::PlaneswalkedFrom => "PlaneswalkedFrom",
494 TriggerType::PlaneswalkedTo => "PlaneswalkedTo",
495 TriggerType::ClaimPrize => "ClaimPrize",
496 TriggerType::CrankAdvanced => "CrankAdvanced",
497 TriggerType::CrankContraption => "CrankContraption",
498 TriggerType::CaseSolved => "CaseSolved",
499 TriggerType::BecomesSaddled => "BecomesSaddled",
500 TriggerType::SetInMotion => "SetInMotion",
501 TriggerType::Mutates => "Mutates",
502 TriggerType::Unattach => "Unattach",
503 TriggerType::TakesInitiative => "TakesInitiative",
504 TriggerType::AttackersDeclaredOneTarget => "AttackersDeclaredOneTarget",
505 }
506 }
507}
508pub fn smart_value_of(value: &str) -> Option<TriggerType> {
514 value.trim().parse().ok()
515}
516
517pub fn create_trigger(raw_trigger: &str, next_id: &mut u32) -> Option<Trigger> {
519 parse_trigger(raw_trigger, next_id)
520}