@gamepark/skyrift 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/dist/CustomMoveType.d.ts +2 -1
  2. package/dist/CustomMoveType.js +1 -0
  3. package/dist/Deck.d.ts +1 -0
  4. package/dist/Deck.js +1 -0
  5. package/dist/SkyriftRules.d.ts +14 -6
  6. package/dist/SkyriftRules.js +10 -2
  7. package/dist/SkyriftSetup.js +2 -0
  8. package/dist/material/Card.d.ts +16 -0
  9. package/dist/material/Card.js +16 -0
  10. package/dist/material/CardProperties.js +32 -0
  11. package/dist/material/CardRule.d.ts +8 -4
  12. package/dist/material/CardRule.js +61 -20
  13. package/dist/material/Effect.d.ts +2 -0
  14. package/dist/material/EffectTraits.d.ts +7 -2
  15. package/dist/material/OngoingEffect.d.ts +9 -2
  16. package/dist/material/OngoingEffect.js +5 -1
  17. package/dist/material/decks/MoonDragon.d.ts +18 -0
  18. package/dist/material/decks/MoonDragon.js +19 -0
  19. package/dist/material/decks/blackhive/CarefulExcavation.d.ts +2 -1
  20. package/dist/material/decks/blackhive/CarefulExcavation.js +2 -2
  21. package/dist/material/decks/blackhive/CycleKeeperEffectRule.d.ts +3 -1
  22. package/dist/material/decks/gravehurt/CavernSkulkerEffectRule.js +1 -1
  23. package/dist/material/decks/gravehurt/Umbraboros.d.ts +1 -1
  24. package/dist/material/decks/gravehurt/Umbraboros.js +4 -3
  25. package/dist/material/decks/gravehurt/WitchingHour.d.ts +3 -3
  26. package/dist/material/decks/gravehurt/WitchingHour.js +3 -3
  27. package/dist/material/decks/heathblade/HedgeKnight.d.ts +1 -1
  28. package/dist/material/decks/heathblade/HedgeKnight.js +3 -4
  29. package/dist/material/decks/heathblade/PrincessLithaEffectRule.d.ts +2 -1
  30. package/dist/material/decks/moondragon/AkiraClearink.d.ts +13 -0
  31. package/dist/material/decks/moondragon/AkiraClearink.js +15 -0
  32. package/dist/material/decks/moondragon/AzureDragonsPeace.d.ts +13 -0
  33. package/dist/material/decks/moondragon/AzureDragonsPeace.js +18 -0
  34. package/dist/material/decks/moondragon/AzureDragonsPeaceEffectRule.d.ts +10 -0
  35. package/dist/material/decks/moondragon/AzureDragonsPeaceEffectRule.js +49 -0
  36. package/dist/material/decks/moondragon/CopyPlayEffectRule.d.ts +6 -0
  37. package/dist/material/decks/moondragon/CopyPlayEffectRule.js +33 -0
  38. package/dist/material/decks/moondragon/DartYusagi.d.ts +14 -0
  39. package/dist/material/decks/moondragon/DartYusagi.js +26 -0
  40. package/dist/material/decks/moondragon/DuelOfHonor.d.ts +19 -0
  41. package/dist/material/decks/moondragon/DuelOfHonor.js +35 -0
  42. package/dist/material/decks/moondragon/Embush.d.ts +17 -0
  43. package/dist/material/decks/moondragon/Embush.js +26 -0
  44. package/dist/material/decks/moondragon/EmbushEffectRule.d.ts +7 -0
  45. package/dist/material/decks/moondragon/EmbushEffectRule.js +26 -0
  46. package/dist/material/decks/moondragon/EmpressSama.d.ts +13 -0
  47. package/dist/material/decks/moondragon/EmpressSama.js +15 -0
  48. package/dist/material/decks/moondragon/EmpressSamaEffectRule.d.ts +7 -0
  49. package/dist/material/decks/moondragon/EmpressSamaEffectRule.js +29 -0
  50. package/dist/material/decks/moondragon/GardenProtector.d.ts +15 -0
  51. package/dist/material/decks/moondragon/GardenProtector.js +18 -0
  52. package/dist/material/decks/moondragon/ImperialBlade.d.ts +16 -0
  53. package/dist/material/decks/moondragon/ImperialBlade.js +19 -0
  54. package/dist/material/decks/moondragon/LotusMuse.d.ts +17 -0
  55. package/dist/material/decks/moondragon/LotusMuse.js +34 -0
  56. package/dist/material/decks/moondragon/LotusMuseEffectRule.d.ts +6 -0
  57. package/dist/material/decks/moondragon/LotusMuseEffectRule.js +24 -0
  58. package/dist/material/decks/moondragon/PortalOfTheAncestors.d.ts +16 -0
  59. package/dist/material/decks/moondragon/PortalOfTheAncestors.js +21 -0
  60. package/dist/material/decks/moondragon/RiteOfTastes.d.ts +15 -0
  61. package/dist/material/decks/moondragon/RiteOfTastes.js +18 -0
  62. package/dist/material/decks/moondragon/RoosterDance.d.ts +16 -0
  63. package/dist/material/decks/moondragon/RoosterDance.js +19 -0
  64. package/dist/material/decks/moondragon/ShardsAlchimist.d.ts +16 -0
  65. package/dist/material/decks/moondragon/ShardsAlchimist.js +22 -0
  66. package/dist/material/decks/moondragon/SpiritOracle.d.ts +16 -0
  67. package/dist/material/decks/moondragon/SpiritOracle.js +27 -0
  68. package/dist/material/decks/moondragon/SteppesColossus.d.ts +13 -0
  69. package/dist/material/decks/moondragon/SteppesColossus.js +15 -0
  70. package/dist/material/decks/moondragon/YoruNightink.d.ts +13 -0
  71. package/dist/material/decks/moondragon/YoruNightink.js +18 -0
  72. package/dist/material/decks/windsands/AbiSnakeCharmer.d.ts +4 -1
  73. package/dist/material/decks/windsands/AbiSnakeCharmer.js +14 -1
  74. package/dist/material/decks/windsands/DeathTrap.d.ts +2 -0
  75. package/dist/material/decks/windsands/DeathTrap.js +4 -0
  76. package/dist/material/decks/windsands/MalikShadowtracker.d.ts +3 -3
  77. package/dist/material/decks/windsands/MalikShadowtracker.js +4 -4
  78. package/dist/material/decks/windsands/OasisShaman.d.ts +3 -1
  79. package/dist/material/decks/windsands/OasisShaman.js +3 -0
  80. package/dist/rules/ChallengeEffectRule.d.ts +2 -1
  81. package/dist/rules/ChallengeResponseRule.d.ts +2 -1
  82. package/dist/rules/DiscardEffectRule.js +1 -1
  83. package/dist/rules/DrawEffectRule.js +1 -1
  84. package/dist/rules/EffectRule.js +6 -0
  85. package/dist/rules/EffectsHelper.d.ts +6 -0
  86. package/dist/rules/EffectsHelper.js +15 -0
  87. package/dist/rules/EndPlayerTurnRule.d.ts +2 -1
  88. package/dist/rules/EndRoundRule.d.ts +1 -1
  89. package/dist/rules/GainCrystalEffectRule.js +1 -1
  90. package/dist/rules/PlayCardEffectRule.d.ts +1 -0
  91. package/dist/rules/PlayCardEffectRule.js +9 -2
  92. package/dist/rules/PlayerHelper.d.ts +1 -1
  93. package/dist/rules/PlayerHelper.js +21 -19
  94. package/dist/rules/PrepareNextRoundRule.d.ts +5 -1
  95. package/dist/rules/PrepareNextRoundRule.js +6 -3
  96. package/dist/rules/RuleId.d.ts +5 -1
  97. package/dist/rules/RuleId.js +5 -1
  98. package/dist/rules/StartPlayerTurnRule.js +17 -2
  99. package/dist/rules/StashPowerTokensEffectRule.js +1 -1
  100. package/dist/rules/StealCrystalEffectRule.js +2 -2
  101. package/dist/rules/SwitchSideEffectRule.d.ts +3 -5
  102. package/dist/rules/SwitchSideEffectRule.js +2 -6
  103. package/package.json +3 -3
@@ -6,5 +6,6 @@ export declare enum CustomMoveType {
6
6
  Pass = 5,
7
7
  Challenge = 6,
8
8
  ActivateCard = 7,
9
- ChooseSuit = 8
9
+ ChooseSuit = 8,
10
+ ChooseCard = 9
10
11
  }
@@ -8,4 +8,5 @@ export var CustomMoveType;
8
8
  CustomMoveType[CustomMoveType["Challenge"] = 6] = "Challenge";
9
9
  CustomMoveType[CustomMoveType["ActivateCard"] = 7] = "ActivateCard";
10
10
  CustomMoveType[CustomMoveType["ChooseSuit"] = 8] = "ChooseSuit";
11
+ CustomMoveType[CustomMoveType["ChooseCard"] = 9] = "ChooseCard";
11
12
  })(CustomMoveType || (CustomMoveType = {}));
package/dist/Deck.d.ts CHANGED
@@ -3,5 +3,6 @@ export declare enum Deck {
3
3
  WindSands = 2,
4
4
  GraveHurt = 3,
5
5
  BlackHive = 4,
6
+ MoonDragon = 5,
6
7
  HighWave = 6
7
8
  }
package/dist/Deck.js CHANGED
@@ -4,5 +4,6 @@ export var Deck;
4
4
  Deck[Deck["WindSands"] = 2] = "WindSands";
5
5
  Deck[Deck["GraveHurt"] = 3] = "GraveHurt";
6
6
  Deck[Deck["BlackHive"] = 4] = "BlackHive";
7
+ Deck[Deck["MoonDragon"] = 5] = "MoonDragon";
7
8
  Deck[Deck["HighWave"] = 6] = "HighWave";
8
9
  })(Deck || (Deck = {}));
@@ -7,7 +7,10 @@ import { BoardingPartyEffectRule } from './material/decks/highwave/BoardingParty
7
7
  import { EyeOfSkyEffectRule } from './material/decks/highwave/EyeOfSkyEffectRule';
8
8
  import { CaveInEffectRule } from './material/decks/blackhive/CaveInEffectRule';
9
9
  import { CycleKeeperEffectRule } from './material/decks/blackhive/CycleKeeperEffectRule';
10
- import { AbiSnakeCharmerEffectRule } from './material/decks/windsands/AbiSnakeCharmerEffectRule';
10
+ import { CopyPlayEffectRule } from './material/decks/moondragon/CopyPlayEffectRule';
11
+ import { EmpressSamaEffectRule } from './material/decks/moondragon/EmpressSamaEffectRule';
12
+ import { LotusMuseEffectRule } from './material/decks/moondragon/LotusMuseEffectRule';
13
+ import { AzureDragonsPeaceEffectRule } from './material/decks/moondragon/AzureDragonsPeaceEffectRule';
11
14
  import { WindWrathEffectRule } from './material/decks/windsands/WindWrathEffectRule';
12
15
  import { LocationType } from './material/LocationType';
13
16
  import { MaterialType } from './material/MaterialType';
@@ -30,6 +33,7 @@ import { StashPowerTokensEffectRule } from './rules/StashPowerTokensEffectRule';
30
33
  import { StealCrystalEffectRule } from './rules/StealCrystalEffectRule';
31
34
  import { MulliganEffectRule } from './rules/MulliganEffectRule';
32
35
  import { StunEffectRule } from './rules/StunEffectRule';
36
+ import { SwitchSideEffectRule } from './rules/SwitchSideEffectRule';
33
37
  export declare class SkyriftRules extends SecretMaterialRules<Deck, MaterialType, LocationType> implements TimeLimit<MaterialGame<Deck, MaterialType, LocationType>, MaterialMove<Deck, MaterialType, LocationType>, Deck> {
34
38
  rules: {
35
39
  1: typeof StartRoundRule;
@@ -49,15 +53,19 @@ export declare class SkyriftRules extends SecretMaterialRules<Deck, MaterialType
49
53
  28: typeof StashPowerTokensEffectRule;
50
54
  29: typeof GainCrystalEffectRule;
51
55
  30: typeof StealCrystalEffectRule;
52
- 204: typeof AbiSnakeCharmerEffectRule;
53
56
  31: typeof PlayCardEffectRule;
54
57
  32: typeof MulliganEffectRule;
58
+ 33: typeof SwitchSideEffectRule;
55
59
  103: typeof PrincessLithaEffectRule;
56
60
  215: typeof WindWrathEffectRule;
57
61
  302: typeof CavernSkulkerEffectRule;
58
62
  315: typeof DoomEffectRule;
59
63
  409: typeof CycleKeeperEffectRule;
60
64
  413: typeof CaveInEffectRule;
65
+ 503: typeof CopyPlayEffectRule;
66
+ 509: typeof EmpressSamaEffectRule;
67
+ 510: typeof LotusMuseEffectRule;
68
+ 513: typeof AzureDragonsPeaceEffectRule;
61
69
  603: typeof EyeOfSkyEffectRule;
62
70
  614: typeof BoardingPartyEffectRule;
63
71
  };
@@ -77,10 +85,10 @@ export declare class SkyriftRules extends SecretMaterialRules<Deck, MaterialType
77
85
  14: import("@gamepark/rules-api").HidingStrategy<number, number>;
78
86
  };
79
87
  };
80
- play(move: MaterialMoveRandomized<Deck, MaterialType, LocationType> | MaterialMoveView<Deck, MaterialType, LocationType>, context?: PlayMoveContext): MaterialMove<Deck, MaterialType, LocationType, number>[];
81
- protected beforeItemMove(move: ItemMove): MaterialMove<Deck, MaterialType, LocationType, number>[];
82
- protected afterItemMove(move: ItemMove, context?: PlayMoveContext): MaterialMove<Deck, MaterialType, LocationType, number>[];
83
- protected onCustomMove(move: CustomMove, context?: PlayMoveContext): MaterialMove<Deck, MaterialType, LocationType, number>[];
88
+ play(move: MaterialMoveRandomized<Deck, MaterialType, LocationType> | MaterialMoveView<Deck, MaterialType, LocationType>, context?: PlayMoveContext): MaterialMove<Deck, MaterialType, LocationType, number, number>[];
89
+ protected beforeItemMove(move: ItemMove): MaterialMove<Deck, MaterialType, LocationType, number, number>[];
90
+ protected afterItemMove(move: ItemMove, context?: PlayMoveContext): MaterialMove<Deck, MaterialType, LocationType, number, number>[];
91
+ protected onCustomMove(move: CustomMove, context?: PlayMoveContext): MaterialMove<Deck, MaterialType, LocationType, number, number>[];
84
92
  isUnpredictableMove(move: MaterialMove<Deck, MaterialType, LocationType>, player: Deck): boolean;
85
93
  giveTime(): number;
86
94
  }
@@ -8,7 +8,10 @@ import { BoardingPartyEffectRule } from './material/decks/highwave/BoardingParty
8
8
  import { EyeOfSkyEffectRule } from './material/decks/highwave/EyeOfSkyEffectRule';
9
9
  import { CaveInEffectRule } from './material/decks/blackhive/CaveInEffectRule';
10
10
  import { CycleKeeperEffectRule } from './material/decks/blackhive/CycleKeeperEffectRule';
11
- import { AbiSnakeCharmerEffectRule } from './material/decks/windsands/AbiSnakeCharmerEffectRule';
11
+ import { CopyPlayEffectRule } from './material/decks/moondragon/CopyPlayEffectRule';
12
+ import { EmpressSamaEffectRule } from './material/decks/moondragon/EmpressSamaEffectRule';
13
+ import { LotusMuseEffectRule } from './material/decks/moondragon/LotusMuseEffectRule';
14
+ import { AzureDragonsPeaceEffectRule } from './material/decks/moondragon/AzureDragonsPeaceEffectRule';
12
15
  import { WindWrathEffectRule } from './material/decks/windsands/WindWrathEffectRule';
13
16
  import { LocationType } from './material/LocationType';
14
17
  import { MaterialType } from './material/MaterialType';
@@ -33,6 +36,7 @@ import { StashPowerTokensEffectRule } from './rules/StashPowerTokensEffectRule';
33
36
  import { StealCrystalEffectRule } from './rules/StealCrystalEffectRule';
34
37
  import { MulliganEffectRule } from './rules/MulliganEffectRule';
35
38
  import { StunEffectRule } from './rules/StunEffectRule';
39
+ import { SwitchSideEffectRule } from './rules/SwitchSideEffectRule';
36
40
  export class SkyriftRules extends SecretMaterialRules {
37
41
  rules = {
38
42
  [RuleId.StartRound]: StartRoundRule,
@@ -52,15 +56,19 @@ export class SkyriftRules extends SecretMaterialRules {
52
56
  [RuleId.StashPowerTokensEffect]: StashPowerTokensEffectRule,
53
57
  [RuleId.GainCrystalEffect]: GainCrystalEffectRule,
54
58
  [RuleId.StealCrystalEffect]: StealCrystalEffectRule,
55
- [RuleId.AbiSnakeCharmerEffect]: AbiSnakeCharmerEffectRule,
56
59
  [RuleId.PlayCardEffect]: PlayCardEffectRule,
57
60
  [RuleId.MulliganEffect]: MulliganEffectRule,
61
+ [RuleId.SwitchSideEffect]: SwitchSideEffectRule,
58
62
  [RuleId.PrincessLithaEffect]: PrincessLithaEffectRule,
59
63
  [RuleId.WindWrathEffect]: WindWrathEffectRule,
60
64
  [RuleId.CavernSkulkerEffect]: CavernSkulkerEffectRule,
61
65
  [RuleId.DoomEffect]: DoomEffectRule,
62
66
  [RuleId.CycleKeeperEffect]: CycleKeeperEffectRule,
63
67
  [RuleId.CaveInEffect]: CaveInEffectRule,
68
+ [RuleId.CopyPlayEffect]: CopyPlayEffectRule,
69
+ [RuleId.EmpressSamaEffect]: EmpressSamaEffectRule,
70
+ [RuleId.LotusMuseEffect]: LotusMuseEffectRule,
71
+ [RuleId.AzureDragonsPeaceEffect]: AzureDragonsPeaceEffectRule,
64
72
  [RuleId.EyeOfSkyEffect]: EyeOfSkyEffectRule,
65
73
  [RuleId.BoardingPartyEffect]: BoardingPartyEffectRule
66
74
  };
@@ -4,6 +4,7 @@ import { Deck } from './Deck';
4
4
  import { BlackHive } from './material/decks/BlackHive';
5
5
  import { GraveHurt } from './material/decks/GraveHurt';
6
6
  import { HearthBlade } from './material/decks/HearthBlade';
7
+ import { MoonDragon } from './material/decks/MoonDragon';
7
8
  import { HighWave } from './material/decks/HighWave';
8
9
  import { WindSands } from './material/decks/WindSands';
9
10
  import { LocationType } from './material/LocationType';
@@ -16,6 +17,7 @@ const deckConfigurations = {
16
17
  [Deck.WindSands]: WindSands,
17
18
  [Deck.GraveHurt]: GraveHurt,
18
19
  [Deck.BlackHive]: BlackHive,
20
+ [Deck.MoonDragon]: MoonDragon,
19
21
  [Deck.HighWave]: HighWave
20
22
  };
21
23
  export class SkyriftSetup extends MaterialGameSetup {
@@ -64,6 +64,22 @@ export declare enum Card {
64
64
  CrystalShaft = 414,
65
65
  ExplosiveKitty = 415,
66
66
  CarefulExcavation = 416,
67
+ GardenProtector = 501,
68
+ ImperialBlade = 502,
69
+ AkiraClearink = 503,
70
+ DartYusagi = 504,
71
+ SteppesColossus = 505,
72
+ ShardsAlchimist = 506,
73
+ SpiritOracle = 507,
74
+ YoruNightink = 508,
75
+ EmpressSama = 509,
76
+ LotusMuse = 510,
77
+ RoosterDance = 511,
78
+ RiteOfTastes = 512,
79
+ AzureDragonsPeace = 513,
80
+ Embush = 514,
81
+ DuelOfHonor = 515,
82
+ PortalOfTheAncestors = 516,
67
83
  SeaScorcher = 601,
68
84
  AeliaSteadyHand = 602,
69
85
  EyeOfSky = 603,
@@ -64,6 +64,22 @@ export var Card;
64
64
  Card[Card["CrystalShaft"] = 414] = "CrystalShaft";
65
65
  Card[Card["ExplosiveKitty"] = 415] = "ExplosiveKitty";
66
66
  Card[Card["CarefulExcavation"] = 416] = "CarefulExcavation";
67
+ Card[Card["GardenProtector"] = 501] = "GardenProtector";
68
+ Card[Card["ImperialBlade"] = 502] = "ImperialBlade";
69
+ Card[Card["AkiraClearink"] = 503] = "AkiraClearink";
70
+ Card[Card["DartYusagi"] = 504] = "DartYusagi";
71
+ Card[Card["SteppesColossus"] = 505] = "SteppesColossus";
72
+ Card[Card["ShardsAlchimist"] = 506] = "ShardsAlchimist";
73
+ Card[Card["SpiritOracle"] = 507] = "SpiritOracle";
74
+ Card[Card["YoruNightink"] = 508] = "YoruNightink";
75
+ Card[Card["EmpressSama"] = 509] = "EmpressSama";
76
+ Card[Card["LotusMuse"] = 510] = "LotusMuse";
77
+ Card[Card["RoosterDance"] = 511] = "RoosterDance";
78
+ Card[Card["RiteOfTastes"] = 512] = "RiteOfTastes";
79
+ Card[Card["AzureDragonsPeace"] = 513] = "AzureDragonsPeace";
80
+ Card[Card["Embush"] = 514] = "Embush";
81
+ Card[Card["DuelOfHonor"] = 515] = "DuelOfHonor";
82
+ Card[Card["PortalOfTheAncestors"] = 516] = "PortalOfTheAncestors";
67
83
  Card[Card["SeaScorcher"] = 601] = "SeaScorcher";
68
84
  Card[Card["AeliaSteadyHand"] = 602] = "AeliaSteadyHand";
69
85
  Card[Card["EyeOfSky"] = 603] = "EyeOfSky";
@@ -63,6 +63,22 @@ import { Shadowbolt } from './decks/heathblade/Shadowbolt';
63
63
  import { SoulBlade } from './decks/heathblade/SoulBlade';
64
64
  import { WatchTower } from './decks/heathblade/WatchTower';
65
65
  import { WoodSlinger } from './decks/heathblade/WoodSlinger';
66
+ import { GardenProtector } from './decks/moondragon/GardenProtector';
67
+ import { ImperialBlade } from './decks/moondragon/ImperialBlade';
68
+ import { AkiraClearink } from './decks/moondragon/AkiraClearink';
69
+ import { DartYusagi } from './decks/moondragon/DartYusagi';
70
+ import { SteppesColossus } from './decks/moondragon/SteppesColossus';
71
+ import { ShardsAlchimist } from './decks/moondragon/ShardsAlchimist';
72
+ import { SpiritOracle } from './decks/moondragon/SpiritOracle';
73
+ import { YoruNightink } from './decks/moondragon/YoruNightink';
74
+ import { EmpressSama } from './decks/moondragon/EmpressSama';
75
+ import { LotusMuse } from './decks/moondragon/LotusMuse';
76
+ import { RoosterDance } from './decks/moondragon/RoosterDance';
77
+ import { RiteOfTastes } from './decks/moondragon/RiteOfTastes';
78
+ import { AzureDragonsPeace } from './decks/moondragon/AzureDragonsPeace';
79
+ import { Embush } from './decks/moondragon/Embush';
80
+ import { DuelOfHonor } from './decks/moondragon/DuelOfHonor';
81
+ import { PortalOfTheAncestors } from './decks/moondragon/PortalOfTheAncestors';
66
82
  import { UndergroundScourge } from './decks/blackhive/UndergroundScourge';
67
83
  import { ShadowDealer } from './decks/blackhive/ShadowDealer';
68
84
  import { DariusAstraSmith } from './decks/blackhive/DariusAstraSmith';
@@ -144,6 +160,22 @@ export const cardProperties = {
144
160
  [Card.CrystalShaft]: CrystalShaft,
145
161
  [Card.ExplosiveKitty]: ExplosiveKitty,
146
162
  [Card.CarefulExcavation]: CarefulExcavation,
163
+ [Card.GardenProtector]: GardenProtector,
164
+ [Card.ImperialBlade]: ImperialBlade,
165
+ [Card.AkiraClearink]: AkiraClearink,
166
+ [Card.DartYusagi]: DartYusagi,
167
+ [Card.SteppesColossus]: SteppesColossus,
168
+ [Card.ShardsAlchimist]: ShardsAlchimist,
169
+ [Card.SpiritOracle]: SpiritOracle,
170
+ [Card.YoruNightink]: YoruNightink,
171
+ [Card.EmpressSama]: EmpressSama,
172
+ [Card.LotusMuse]: LotusMuse,
173
+ [Card.RoosterDance]: RoosterDance,
174
+ [Card.RiteOfTastes]: RiteOfTastes,
175
+ [Card.AzureDragonsPeace]: AzureDragonsPeace,
176
+ [Card.Embush]: Embush,
177
+ [Card.DuelOfHonor]: DuelOfHonor,
178
+ [Card.PortalOfTheAncestors]: PortalOfTheAncestors,
147
179
  [Card.SeaScorcher]: SeaScorcher,
148
180
  [Card.AeliaSteadyHand]: AeliaSteadyHand,
149
181
  [Card.EyeOfSky]: EyeOfSky,
@@ -2,7 +2,7 @@ import { MaterialGame, MaterialMove, MaterialRulesPart } from '@gamepark/rules-a
2
2
  import { Deck } from '../Deck';
3
3
  import { Card, CardId } from './Card';
4
4
  import { Effect } from './Effect';
5
- import { OngoingEffectType } from './OngoingEffect';
5
+ import { OngoingEffect, OngoingEffectType } from './OngoingEffect';
6
6
  export declare class CardRule extends MaterialRulesPart {
7
7
  index: number;
8
8
  constructor(game: MaterialGame, index: number);
@@ -14,7 +14,7 @@ export declare class CardRule extends MaterialRulesPart {
14
14
  onSkirmishEnd?(): void;
15
15
  onSkirmishWin?(): void;
16
16
  onSkirmishLost?(): void;
17
- survivesSkirmish?(): boolean;
17
+ isNeutralized(): boolean;
18
18
  canActivate(): boolean;
19
19
  onLeaves(): MaterialMove[];
20
20
  removePowerTokens(): MaterialMove[];
@@ -23,18 +23,22 @@ export declare class CardRule extends MaterialRulesPart {
23
23
  get item(): import("@gamepark/rules-api").MaterialItem<number, number, CardId>;
24
24
  get card(): Card;
25
25
  get properties(): import("./CardProperties").CardProperties;
26
+ get powerTokens(): import("@gamepark/rules-api").Material<number, number, number>;
27
+ get stunTokens(): import("@gamepark/rules-api").Material<number, number, number>;
28
+ get specialTokens(): import("@gamepark/rules-api").Material<number, number, number>;
26
29
  get playArea(): import("@gamepark/rules-api").Material<number, number, number>;
27
30
  get creatures(): import("@gamepark/rules-api").Material<number, number, number>;
28
31
  isStunned(): boolean;
29
32
  getPower(): number;
30
33
  getPowerIfNotStunned(): number;
31
- getFoePowerModifier(): number;
34
+ getPlayerPowerModifier(_player: Deck): number;
32
35
  addPendingEffect(ruleId: number): void;
33
- addOngoingEffect(type: OngoingEffectType): void;
36
+ addOngoingEffect(type: OngoingEffectType, options?: Omit<OngoingEffect, 'type' | 'cardIndex'>): void;
34
37
  removeOngoingEffect(type: OngoingEffectType): void;
35
38
  get player(): number;
36
39
  get foe(): number;
37
40
  startEffect(effect: Effect): MaterialMove[];
41
+ isAutomaticEffect(effect: Effect): boolean;
38
42
  getEffectPlayers(_effect: Effect): number[];
39
43
  canBePlayed(): boolean;
40
44
  canSuitBePlayed(): boolean;
@@ -1,5 +1,7 @@
1
1
  import { MaterialRulesPart } from '@gamepark/rules-api';
2
2
  import { Memory } from '../Memory';
3
+ import { EffectsHelper } from '../rules/EffectsHelper';
4
+ import { RuleId } from '../rules/RuleId';
3
5
  import { cardProperties } from './CardProperties';
4
6
  import { CardSuit } from './CardSuit';
5
7
  import { CardType } from './CardType';
@@ -13,11 +15,16 @@ export class CardRule extends MaterialRulesPart {
13
15
  super(game);
14
16
  this.index = index;
15
17
  }
18
+ isNeutralized() {
19
+ return this.remind(Memory.OngoingEffects).some((e) => e.type === OngoingEffectType.Neutralized && e.targets?.includes(this.index));
20
+ }
16
21
  canActivate() {
17
22
  if (!this.activate)
18
23
  return false;
19
24
  if (this.isStunned())
20
25
  return false;
26
+ if (this.isNeutralized())
27
+ return false;
21
28
  const activatedCards = this.remind(Memory.ActivatedCards);
22
29
  return !activatedCards.includes(this.index);
23
30
  }
@@ -25,16 +32,13 @@ export class CardRule extends MaterialRulesPart {
25
32
  return [...this.removePowerTokens(), ...this.removeStunTokens(), ...this.removeSpecialTokens()];
26
33
  }
27
34
  removePowerTokens() {
28
- const tokens = this.material(MaterialType.PowerToken).location(LocationType.CardPowerTokens).parent(this.index);
29
- return tokens.getQuantity() > 0 ? [tokens.deleteItem(tokens.getQuantity())] : [];
35
+ return this.powerTokens.getQuantity() > 0 ? [this.powerTokens.deleteItem(this.powerTokens.getQuantity())] : [];
30
36
  }
31
37
  removeStunTokens() {
32
- const tokens = this.material(MaterialType.StunToken).location(LocationType.CardStunTokens).parent(this.index);
33
- return tokens.getQuantity() > 0 ? [tokens.deleteItem(tokens.getQuantity())] : [];
38
+ return this.stunTokens.getQuantity() > 0 ? [this.stunTokens.deleteItem(this.stunTokens.getQuantity())] : [];
34
39
  }
35
40
  removeSpecialTokens() {
36
- const tokens = this.material(MaterialType.SpecialToken).location(LocationType.CardSpecialTokens).parent(this.index);
37
- return tokens.getQuantity() > 0 ? [tokens.deleteItem(tokens.getQuantity())] : [];
41
+ return this.specialTokens.getQuantity() > 0 ? [this.specialTokens.deleteItem(this.specialTokens.getQuantity())] : [];
38
42
  }
39
43
  get item() {
40
44
  return this.material(MaterialType.Card).getItem(this.index);
@@ -45,6 +49,15 @@ export class CardRule extends MaterialRulesPart {
45
49
  get properties() {
46
50
  return cardProperties[this.card];
47
51
  }
52
+ get powerTokens() {
53
+ return this.material(MaterialType.PowerToken).location(LocationType.CardPowerTokens).parent(this.index);
54
+ }
55
+ get stunTokens() {
56
+ return this.material(MaterialType.StunToken).location(LocationType.CardStunTokens).parent(this.index);
57
+ }
58
+ get specialTokens() {
59
+ return this.material(MaterialType.SpecialToken).location(LocationType.CardSpecialTokens).parent(this.index);
60
+ }
48
61
  get playArea() {
49
62
  return this.material(MaterialType.Card).location(LocationType.PlayArea);
50
63
  }
@@ -52,10 +65,10 @@ export class CardRule extends MaterialRulesPart {
52
65
  return this.playArea.id((id) => cardProperties[id.front].type === CardType.Creature);
53
66
  }
54
67
  isStunned() {
55
- return this.material(MaterialType.StunToken).location(LocationType.CardStunTokens).parent(this.index).getQuantity() > 0;
68
+ return this.stunTokens.getQuantity() > 0;
56
69
  }
57
70
  getPower() {
58
- if (this.isStunned()) {
71
+ if (this.isStunned() || this.isNeutralized()) {
59
72
  return 0;
60
73
  }
61
74
  else {
@@ -64,17 +77,21 @@ export class CardRule extends MaterialRulesPart {
64
77
  }
65
78
  getPowerIfNotStunned() {
66
79
  const basePower = this.properties.power;
67
- const powerTokensCount = this.material(MaterialType.PowerToken).location(LocationType.CardPowerTokens).parent(this.index).getQuantity();
68
- return basePower + powerTokensCount;
80
+ const powerModifier = this.remind(Memory.OngoingEffects)
81
+ .filter((e) => e.type === OngoingEffectType.PowerModifier && e.cardIndex === this.index)
82
+ .reduce((sum, e) => sum + (e.value ?? 0), 0);
83
+ return basePower + this.powerTokens.getQuantity() + powerModifier;
69
84
  }
70
- getFoePowerModifier() {
85
+ getPlayerPowerModifier(_player) {
71
86
  return 0;
72
87
  }
73
88
  addPendingEffect(ruleId) {
89
+ if (this.isNeutralized())
90
+ return;
74
91
  this.memorize(Memory.PendingEffects, (effects) => [...effects, { cardIndex: this.index, ruleId }]);
75
92
  }
76
- addOngoingEffect(type) {
77
- this.memorize(Memory.OngoingEffects, (effects) => [...effects, { type, cardIndex: this.index }]);
93
+ addOngoingEffect(type, options) {
94
+ this.memorize(Memory.OngoingEffects, (effects) => [...effects, { type, cardIndex: this.index, ...options }]);
78
95
  }
79
96
  removeOngoingEffect(type) {
80
97
  this.memorize(Memory.OngoingEffects, (effects) => effects.filter((e) => !(e.type === type && e.cardIndex === this.index)));
@@ -86,12 +103,38 @@ export class CardRule extends MaterialRulesPart {
86
103
  return this.game.players.find((p) => p !== this.player);
87
104
  }
88
105
  startEffect(effect) {
106
+ if (this.isAutomaticEffect(effect)) {
107
+ return [this.startRule(effect.ruleId)];
108
+ }
89
109
  const players = this.getEffectPlayers(effect);
90
110
  if (players.length > 1) {
91
111
  return [this.startSimultaneousRule(effect.ruleId, players)];
92
112
  }
93
113
  return [this.startPlayerTurn(effect.ruleId, players[0])];
94
114
  }
115
+ isAutomaticEffect(effect) {
116
+ switch (effect.ruleId) {
117
+ case RuleId.DrawEffect:
118
+ case RuleId.GainCrystalEffect:
119
+ case RuleId.StashPowerTokensEffect:
120
+ case RuleId.StealCrystalEffect:
121
+ case RuleId.WindWrathEffect:
122
+ case RuleId.CavernSkulkerEffect:
123
+ return true;
124
+ case RuleId.StunEffect:
125
+ return !!this.isAutoStun?.();
126
+ case RuleId.DestroyEffect:
127
+ return !!this.isAutoDestroy?.();
128
+ case RuleId.DiscardEffect:
129
+ return !!this.isAutoDiscard?.();
130
+ case RuleId.ReturnCardEffect:
131
+ return !!this.isAutoReturn?.();
132
+ case RuleId.PutPowerTokensEffect:
133
+ return !!this.isAutoPutPowerToken?.();
134
+ default:
135
+ return false;
136
+ }
137
+ }
95
138
  getEffectPlayers(_effect) {
96
139
  return [this.player];
97
140
  }
@@ -104,13 +147,11 @@ export class CardRule extends MaterialRulesPart {
104
147
  return !currentSuit || cardSuit === CardSuit.Twilight || cardSuit === currentSuit;
105
148
  }
106
149
  ongoingEffectPreventsPlayCard() {
107
- const ongoingEffects = this.remind(Memory.OngoingEffects);
108
- for (const effect of ongoingEffects) {
109
- if (effect.type === OngoingEffectType.PreventPlayCard) {
110
- const sourceCardRule = createCardRule(this.game, effect.cardIndex);
111
- if (sourceCardRule.preventPlayCard(this.card, this.player)) {
112
- return true;
113
- }
150
+ const effectsHelper = new EffectsHelper(this.game);
151
+ for (const effect of effectsHelper.getActiveOngoingEffects(OngoingEffectType.PlayCardCondition)) {
152
+ const sourceCardRule = createCardRule(this.game, effect.cardIndex);
153
+ if (!sourceCardRule.canPlayCard(this.card, this.player)) {
154
+ return true;
114
155
  }
115
156
  }
116
157
  return false;
@@ -1,4 +1,6 @@
1
+ import { Card } from './Card';
1
2
  export type Effect = {
2
3
  cardIndex: number;
3
4
  ruleId: number;
5
+ sourceCard?: Card;
4
6
  };
@@ -32,6 +32,7 @@ export interface StashPowerTokenEffect {
32
32
  export interface PlayCardEffect {
33
33
  getPlayCardTargets?(): Material;
34
34
  isPlayCardOptional?(): boolean;
35
+ ignorePlayCardConditions?(): boolean;
35
36
  }
36
37
  export interface ChallengeEffect {
37
38
  onChallengeAccepted?(): void;
@@ -43,8 +44,12 @@ export interface StunEffect {
43
44
  getStunTargetsCount?(): number;
44
45
  isAutoStun?(): boolean;
45
46
  }
46
- export interface PreventPlayCardEffect {
47
- preventPlayCard(card: Card, player: Deck): boolean;
47
+ export interface PlayCardConditionEffect {
48
+ canPlayCard(card: Card, player: Deck): boolean;
49
+ onPlayCardCondition?(card: Card, player: Deck): void;
50
+ }
51
+ export interface SwitchSideEffect {
52
+ getSwitchSideTargets?(): Material;
48
53
  }
49
54
  export interface PreventEffectsEffect {
50
55
  preventEnterEffects(cardIndex: number): boolean;
@@ -1,10 +1,17 @@
1
1
  export declare enum OngoingEffectType {
2
- PreventPlayCard = 1,
2
+ PlayCardCondition = 1,
3
3
  PreventEffects = 2,
4
4
  LockSuit = 3,
5
- PassTurn = 4
5
+ PassTurn = 4,
6
+ SurvivesSkirmish = 5,
7
+ KeepActionCard = 6,
8
+ Neutralized = 7,
9
+ PowerModifier = 8
6
10
  }
7
11
  export type OngoingEffect = {
8
12
  type: OngoingEffectType;
9
13
  cardIndex: number;
14
+ targets?: number[];
15
+ value?: number;
16
+ turnsLeft?: number;
10
17
  };
@@ -1,7 +1,11 @@
1
1
  export var OngoingEffectType;
2
2
  (function (OngoingEffectType) {
3
- OngoingEffectType[OngoingEffectType["PreventPlayCard"] = 1] = "PreventPlayCard";
3
+ OngoingEffectType[OngoingEffectType["PlayCardCondition"] = 1] = "PlayCardCondition";
4
4
  OngoingEffectType[OngoingEffectType["PreventEffects"] = 2] = "PreventEffects";
5
5
  OngoingEffectType[OngoingEffectType["LockSuit"] = 3] = "LockSuit";
6
6
  OngoingEffectType[OngoingEffectType["PassTurn"] = 4] = "PassTurn";
7
+ OngoingEffectType[OngoingEffectType["SurvivesSkirmish"] = 5] = "SurvivesSkirmish";
8
+ OngoingEffectType[OngoingEffectType["KeepActionCard"] = 6] = "KeepActionCard";
9
+ OngoingEffectType[OngoingEffectType["Neutralized"] = 7] = "Neutralized";
10
+ OngoingEffectType[OngoingEffectType["PowerModifier"] = 8] = "PowerModifier";
7
11
  })(OngoingEffectType || (OngoingEffectType = {}));
@@ -0,0 +1,18 @@
1
+ export declare const MoonDragon: {
2
+ 501: number;
3
+ 502: number;
4
+ 503: number;
5
+ 504: number;
6
+ 505: number;
7
+ 506: number;
8
+ 507: number;
9
+ 508: number;
10
+ 509: number;
11
+ 510: number;
12
+ 511: number;
13
+ 512: number;
14
+ 513: number;
15
+ 514: number;
16
+ 515: number;
17
+ 516: number;
18
+ };
@@ -0,0 +1,19 @@
1
+ import { Card } from '../Card';
2
+ export const MoonDragon = {
3
+ [Card.GardenProtector]: 2,
4
+ [Card.ImperialBlade]: 2,
5
+ [Card.AkiraClearink]: 1,
6
+ [Card.DartYusagi]: 1,
7
+ [Card.SteppesColossus]: 2,
8
+ [Card.ShardsAlchimist]: 2,
9
+ [Card.SpiritOracle]: 2,
10
+ [Card.YoruNightink]: 1,
11
+ [Card.EmpressSama]: 1,
12
+ [Card.LotusMuse]: 1,
13
+ [Card.RoosterDance]: 2,
14
+ [Card.RiteOfTastes]: 1,
15
+ [Card.AzureDragonsPeace]: 1,
16
+ [Card.Embush]: 1,
17
+ [Card.DuelOfHonor]: 2,
18
+ [Card.PortalOfTheAncestors]: 2
19
+ };
@@ -1,4 +1,5 @@
1
1
  import { Material } from '@gamepark/rules-api';
2
+ import { Deck } from '../../../Deck';
2
3
  import { CardRule } from '../../CardRule';
3
4
  import { CardSuit } from '../../CardSuit';
4
5
  import { CardType } from '../../CardType';
@@ -6,7 +7,7 @@ import { DestroyEffect, DrawEffect } from '../../EffectTraits';
6
7
  declare class CarefulExcavationRule extends CardRule implements DrawEffect, DestroyEffect {
7
8
  onEnters(): void;
8
9
  getDrawCount(): number;
9
- getFoePowerModifier(): number;
10
+ getPlayerPowerModifier(player: Deck): 4 | 0;
10
11
  onFoeTurnStart(): void;
11
12
  getDestroyTargets(): Material;
12
13
  isAutoDestroy(): boolean;
@@ -10,8 +10,8 @@ class CarefulExcavationRule extends CardRule {
10
10
  getDrawCount() {
11
11
  return 2;
12
12
  }
13
- getFoePowerModifier() {
14
- return 4;
13
+ getPlayerPowerModifier(player) {
14
+ return player === this.foe ? 4 : 0;
15
15
  }
16
16
  onFoeTurnStart() {
17
17
  this.addPendingEffect(RuleId.DestroyEffect);
@@ -1,6 +1,8 @@
1
1
  import { CustomMove } from '@gamepark/rules-api';
2
+ import { CustomMoveType } from '../../../CustomMoveType';
3
+ import { CardSuit } from '../../CardSuit';
2
4
  import { EffectRule } from '../../../rules/EffectRule';
3
5
  export declare class CycleKeeperEffectRule extends EffectRule {
4
- getPlayerMoves(): CustomMove[];
6
+ getPlayerMoves(): CustomMove<CustomMoveType.ChooseSuit, CardSuit>[];
5
7
  onCustomMove(move: CustomMove): import("@gamepark/rules-api").MaterialMove[];
6
8
  }
@@ -5,7 +5,7 @@ import { MaterialType } from '../../MaterialType';
5
5
  export class CavernSkulkerEffectRule extends EffectRule {
6
6
  onRuleStart() {
7
7
  const moves = this.endEffect();
8
- const foeHand = this.material(MaterialType.Card).location(LocationType.PlayerHand).player(this.nextPlayer);
8
+ const foeHand = this.material(MaterialType.Card).location(LocationType.PlayerHand).player(this.cardRule.foe);
9
9
  if (foeHand.length > 0) {
10
10
  const randomIndex = sample(foeHand.getIndexes());
11
11
  moves.unshift(foeHand.index(randomIndex).moveItem({ type: LocationType.UnderCard, parent: this.effectCardIndex }));
@@ -7,10 +7,10 @@ import { CardType } from '../../CardType';
7
7
  import { DestroyEffect } from '../../EffectTraits';
8
8
  import { UndeadRule } from './UndeadRule';
9
9
  declare class UmbraborosRule extends UndeadRule implements DestroyEffect {
10
+ onEnters(): void;
10
11
  onCardEnters(card: Card, side: Deck): void;
11
12
  getDestroyTargets(): Material;
12
13
  isAutoDestroy(): boolean;
13
- survivesSkirmish(): boolean;
14
14
  }
15
15
  export declare const Umbraboros: {
16
16
  power: number;
@@ -4,8 +4,12 @@ import { CardSuit } from '../../CardSuit';
4
4
  import { CardTag } from '../../CardTag';
5
5
  import { CardType } from '../../CardType';
6
6
  import { MaterialType } from '../../MaterialType';
7
+ import { OngoingEffectType } from '../../OngoingEffect';
7
8
  import { UndeadRule } from './UndeadRule';
8
9
  class UmbraborosRule extends UndeadRule {
10
+ onEnters() {
11
+ this.addOngoingEffect(OngoingEffectType.SurvivesSkirmish);
12
+ }
9
13
  onCardEnters(card, side) {
10
14
  if (side === this.player && cardProperties[card].suit === CardSuit.Day) {
11
15
  this.addPendingEffect(RuleId.DestroyEffect);
@@ -17,9 +21,6 @@ class UmbraborosRule extends UndeadRule {
17
21
  isAutoDestroy() {
18
22
  return true;
19
23
  }
20
- survivesSkirmish() {
21
- return true;
22
- }
23
24
  }
24
25
  export const Umbraboros = {
25
26
  power: 3,
@@ -2,10 +2,10 @@ import { Card } from '../../Card';
2
2
  import { CardRule } from '../../CardRule';
3
3
  import { CardSuit } from '../../CardSuit';
4
4
  import { CardType } from '../../CardType';
5
- import { PreventPlayCardEffect } from '../../EffectTraits';
6
- declare class WitchingHourRule extends CardRule implements PreventPlayCardEffect {
5
+ import { PlayCardConditionEffect } from '../../EffectTraits';
6
+ declare class WitchingHourRule extends CardRule implements PlayCardConditionEffect {
7
7
  onEnters(): void;
8
- preventPlayCard(card: Card): boolean;
8
+ canPlayCard(card: Card): boolean;
9
9
  }
10
10
  export declare const WitchingHour: {
11
11
  power: number;