@gamepark/skyrift 0.3.0 → 0.4.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 (223) hide show
  1. package/dist/Deck.d.ts +2 -1
  2. package/dist/Deck.js +2 -1
  3. package/dist/Memory.d.ts +1 -1
  4. package/dist/Memory.js +1 -1
  5. package/dist/SkyriftRules.d.ts +32 -63
  6. package/dist/SkyriftRules.js +40 -71
  7. package/dist/SkyriftSetup.js +4 -2
  8. package/dist/material/Card.d.ts +16 -0
  9. package/dist/material/Card.js +16 -0
  10. package/dist/material/CardProperties.js +48 -16
  11. package/dist/material/CardRule.d.ts +24 -20
  12. package/dist/material/CardRule.js +48 -65
  13. package/dist/material/CardTag.d.ts +2 -1
  14. package/dist/material/CardTag.js +2 -1
  15. package/dist/material/Effect.d.ts +1 -1
  16. package/dist/material/EffectTraits.d.ts +51 -0
  17. package/dist/material/EffectTraits.js +1 -0
  18. package/dist/material/LocationType.d.ts +3 -1
  19. package/dist/material/LocationType.js +2 -0
  20. package/dist/material/MaterialType.d.ts +2 -1
  21. package/dist/material/MaterialType.js +1 -0
  22. package/dist/material/OngoingEffect.d.ts +2 -2
  23. package/dist/material/OngoingEffect.js +2 -2
  24. package/dist/material/SpecialTokenType.d.ts +3 -0
  25. package/dist/material/SpecialTokenType.js +4 -0
  26. package/dist/material/createCardRule.d.ts +3 -0
  27. package/dist/material/createCardRule.js +7 -0
  28. package/dist/material/decks/GraveHurt.d.ts +18 -0
  29. package/dist/material/decks/GraveHurt.js +19 -0
  30. package/dist/material/decks/WindSands.d.ts +18 -0
  31. package/dist/material/decks/WindSands.js +19 -0
  32. package/dist/material/decks/gravehurt/AstralHammer.d.ts +18 -0
  33. package/dist/material/decks/gravehurt/AstralHammer.js +25 -0
  34. package/dist/material/decks/gravehurt/AstralHammerEffectRule.d.ts +4 -0
  35. package/dist/material/decks/gravehurt/AstralHammerEffectRule.js +26 -0
  36. package/dist/material/decks/gravehurt/CallOfTheEclipse.d.ts +17 -0
  37. package/dist/material/decks/gravehurt/CallOfTheEclipse.js +28 -0
  38. package/dist/material/decks/gravehurt/CallOfTheEclipseEffectRule.d.ts +5 -0
  39. package/dist/material/decks/gravehurt/CallOfTheEclipseEffectRule.js +11 -0
  40. package/dist/material/decks/gravehurt/CavernSkulker.d.ts +16 -0
  41. package/dist/material/decks/gravehurt/CavernSkulker.js +26 -0
  42. package/dist/material/decks/gravehurt/CavernSkulkerEffectRule.d.ts +4 -0
  43. package/dist/material/decks/gravehurt/CavernSkulkerEffectRule.js +15 -0
  44. package/dist/material/decks/gravehurt/Doom.d.ts +18 -0
  45. package/dist/material/decks/gravehurt/Doom.js +29 -0
  46. package/dist/material/decks/gravehurt/DoomEffectRule.d.ts +8 -0
  47. package/dist/material/decks/gravehurt/DoomEffectRule.js +32 -0
  48. package/dist/material/decks/gravehurt/InsatiableUmbraphage.d.ts +19 -0
  49. package/dist/material/decks/gravehurt/InsatiableUmbraphage.js +28 -0
  50. package/dist/material/decks/gravehurt/InsatiableUmbraphageEffectRule.d.ts +5 -0
  51. package/dist/material/decks/gravehurt/InsatiableUmbraphageEffectRule.js +21 -0
  52. package/dist/material/decks/gravehurt/MacabreLegion.d.ts +17 -0
  53. package/dist/material/decks/gravehurt/MacabreLegion.js +20 -0
  54. package/dist/material/decks/gravehurt/MoonFang.d.ts +17 -0
  55. package/dist/material/decks/gravehurt/MoonFang.js +20 -0
  56. package/dist/material/decks/gravehurt/Nosferatis.d.ts +20 -0
  57. package/dist/material/decks/gravehurt/Nosferatis.js +29 -0
  58. package/dist/material/decks/gravehurt/OstraVoiceOfTheSoul.d.ts +12 -0
  59. package/dist/material/decks/gravehurt/OstraVoiceOfTheSoul.js +11 -0
  60. package/dist/material/decks/gravehurt/ReturnInTime.d.ts +15 -0
  61. package/dist/material/decks/gravehurt/ReturnInTime.js +18 -0
  62. package/dist/material/decks/gravehurt/ScrabDoombird.d.ts +18 -0
  63. package/dist/material/decks/gravehurt/ScrabDoombird.js +21 -0
  64. package/dist/material/decks/gravehurt/TerrifyingSummoning.d.ts +18 -0
  65. package/dist/material/decks/gravehurt/TerrifyingSummoning.js +26 -0
  66. package/dist/material/decks/gravehurt/TerrifyingSummoningEffectRule.d.ts +5 -0
  67. package/dist/material/decks/gravehurt/TerrifyingSummoningEffectRule.js +11 -0
  68. package/dist/material/decks/gravehurt/TheGreatToady.d.ts +19 -0
  69. package/dist/material/decks/gravehurt/TheGreatToady.js +42 -0
  70. package/dist/material/decks/gravehurt/Umbraboros.d.ts +22 -0
  71. package/dist/material/decks/gravehurt/Umbraboros.js +30 -0
  72. package/dist/material/decks/gravehurt/UndeadRule.d.ts +5 -0
  73. package/dist/material/decks/gravehurt/UndeadRule.js +11 -0
  74. package/dist/material/decks/gravehurt/Whisperers.d.ts +13 -0
  75. package/dist/material/decks/gravehurt/Whisperers.js +17 -0
  76. package/dist/material/decks/gravehurt/WitchingHour.d.ts +16 -0
  77. package/dist/material/decks/gravehurt/WitchingHour.js +19 -0
  78. package/dist/material/decks/heathblade/ArcherRule.js +2 -2
  79. package/dist/material/decks/heathblade/Armada.d.ts +4 -3
  80. package/dist/material/decks/heathblade/Armada.js +5 -3
  81. package/dist/material/decks/heathblade/ArmadaEffectRule.d.ts +2 -1
  82. package/dist/material/decks/heathblade/ArmadaEffectRule.js +8 -1
  83. package/dist/material/decks/heathblade/Confluence.d.ts +2 -3
  84. package/dist/material/decks/heathblade/Confluence.js +5 -3
  85. package/dist/material/decks/heathblade/CoverOfNight.d.ts +4 -2
  86. package/dist/material/decks/heathblade/CoverOfNight.js +7 -1
  87. package/dist/material/decks/heathblade/Harvest.d.ts +4 -2
  88. package/dist/material/decks/heathblade/Harvest.js +7 -1
  89. package/dist/material/decks/heathblade/LoyalSquire.d.ts +6 -3
  90. package/dist/material/decks/heathblade/LoyalSquire.js +11 -4
  91. package/dist/material/decks/heathblade/Nightguard.js +3 -9
  92. package/dist/material/decks/heathblade/OzmaTheMage.d.ts +6 -4
  93. package/dist/material/decks/heathblade/OzmaTheMage.js +9 -3
  94. package/dist/material/decks/heathblade/PrincessLitha.d.ts +1 -2
  95. package/dist/material/decks/heathblade/PrincessLitha.js +4 -11
  96. package/dist/material/decks/heathblade/RobbinsMasterOfArms.d.ts +6 -2
  97. package/dist/material/decks/heathblade/RobbinsMasterOfArms.js +10 -1
  98. package/dist/material/decks/heathblade/Sacrifice.d.ts +7 -2
  99. package/dist/material/decks/heathblade/Sacrifice.js +19 -1
  100. package/dist/material/decks/heathblade/SoulBlade.d.ts +5 -2
  101. package/dist/material/decks/heathblade/SoulBlade.js +8 -1
  102. package/dist/material/decks/heathblade/WatchTower.d.ts +5 -3
  103. package/dist/material/decks/heathblade/WatchTower.js +10 -3
  104. package/dist/material/decks/highwave/AeliaSteadyHand.d.ts +1 -1
  105. package/dist/material/decks/highwave/AeliaSteadyHand.js +4 -1
  106. package/dist/material/decks/highwave/BoardingParty.d.ts +1 -1
  107. package/dist/material/decks/highwave/BoardingParty.js +4 -1
  108. package/dist/material/decks/highwave/BoardingPartyEffectRule.d.ts +4 -3
  109. package/dist/material/decks/highwave/BoardingPartyEffectRule.js +18 -23
  110. package/dist/material/decks/highwave/BonnyTheGunner.d.ts +0 -2
  111. package/dist/material/decks/highwave/BonnyTheGunner.js +0 -2
  112. package/dist/material/decks/highwave/CannonCardRule.d.ts +3 -0
  113. package/dist/material/decks/highwave/CannonCardRule.js +11 -10
  114. package/dist/material/decks/highwave/DarkArmageddon.d.ts +4 -2
  115. package/dist/material/decks/highwave/DarkArmageddon.js +7 -1
  116. package/dist/material/decks/highwave/DawnsDoom.d.ts +4 -2
  117. package/dist/material/decks/highwave/DawnsDoom.js +9 -1
  118. package/dist/material/decks/highwave/EyeOfSky.d.ts +2 -4
  119. package/dist/material/decks/highwave/EyeOfSky.js +5 -7
  120. package/dist/material/decks/highwave/EyeOfSkyEffectRule.d.ts +4 -4
  121. package/dist/material/decks/highwave/EyeOfSkyEffectRule.js +1 -3
  122. package/dist/material/decks/highwave/FortunesCourse.d.ts +1 -2
  123. package/dist/material/decks/highwave/FortunesCourse.js +3 -3
  124. package/dist/material/decks/highwave/GoldenApocalypse.d.ts +1 -1
  125. package/dist/material/decks/highwave/GoldenApocalypse.js +4 -1
  126. package/dist/material/decks/highwave/LongJawsSilver.d.ts +2 -3
  127. package/dist/material/decks/highwave/LongJawsSilver.js +7 -5
  128. package/dist/material/decks/highwave/OscarScullion.d.ts +4 -2
  129. package/dist/material/decks/highwave/OscarScullion.js +7 -1
  130. package/dist/material/decks/highwave/OttoFactotum.d.ts +4 -2
  131. package/dist/material/decks/highwave/OttoFactotum.js +10 -1
  132. package/dist/material/decks/highwave/RiggingRaiders.d.ts +5 -2
  133. package/dist/material/decks/highwave/RiggingRaiders.js +9 -1
  134. package/dist/material/decks/highwave/SeaScorcher.d.ts +6 -3
  135. package/dist/material/decks/highwave/SeaScorcher.js +13 -2
  136. package/dist/material/decks/highwave/SurpriseLoot.d.ts +4 -2
  137. package/dist/material/decks/highwave/SurpriseLoot.js +7 -1
  138. package/dist/material/decks/highwave/TideRover.d.ts +6 -2
  139. package/dist/material/decks/highwave/TideRover.js +15 -1
  140. package/dist/material/decks/highwave/TropicalRuffian.d.ts +1 -1
  141. package/dist/material/decks/highwave/TropicalRuffian.js +4 -1
  142. package/dist/material/decks/windsands/AbiSnakeCharmer.d.ts +13 -0
  143. package/dist/material/decks/windsands/AbiSnakeCharmer.js +15 -0
  144. package/dist/material/decks/windsands/AbiSnakeCharmerEffectRule.d.ts +8 -0
  145. package/dist/material/decks/windsands/AbiSnakeCharmerEffectRule.js +35 -0
  146. package/dist/material/decks/windsands/AncientCurse.d.ts +17 -0
  147. package/dist/material/decks/windsands/AncientCurse.js +25 -0
  148. package/dist/material/decks/windsands/Catadjinn.d.ts +14 -0
  149. package/dist/material/decks/windsands/Catadjinn.js +20 -0
  150. package/dist/material/decks/windsands/DeathTrap.d.ts +20 -0
  151. package/dist/material/decks/windsands/DeathTrap.js +38 -0
  152. package/dist/material/decks/windsands/DesertRaider.d.ts +17 -0
  153. package/dist/material/decks/windsands/DesertRaider.js +21 -0
  154. package/dist/material/decks/windsands/DuneWardrums.d.ts +12 -0
  155. package/dist/material/decks/windsands/DuneWardrums.js +14 -0
  156. package/dist/material/decks/windsands/ErgDeathslayer.d.ts +13 -0
  157. package/dist/material/decks/windsands/ErgDeathslayer.js +15 -0
  158. package/dist/material/decks/windsands/MalikShadowtracker.d.ts +18 -0
  159. package/dist/material/decks/windsands/MalikShadowtracker.js +24 -0
  160. package/dist/material/decks/windsands/Metamorph.d.ts +14 -0
  161. package/dist/material/decks/windsands/Metamorph.js +18 -0
  162. package/dist/material/decks/windsands/MushaFakir.d.ts +14 -0
  163. package/dist/material/decks/windsands/MushaFakir.js +18 -0
  164. package/dist/material/decks/windsands/OasisShaman.d.ts +13 -0
  165. package/dist/material/decks/windsands/OasisShaman.js +15 -0
  166. package/dist/material/decks/windsands/SandWalkers.d.ts +21 -0
  167. package/dist/material/decks/windsands/SandWalkers.js +30 -0
  168. package/dist/material/decks/windsands/StarlightBazaar.d.ts +15 -0
  169. package/dist/material/decks/windsands/StarlightBazaar.js +18 -0
  170. package/dist/material/decks/windsands/Vandals.d.ts +18 -0
  171. package/dist/material/decks/windsands/Vandals.js +25 -0
  172. package/dist/material/decks/windsands/WindWrath.d.ts +13 -0
  173. package/dist/material/decks/windsands/WindWrath.js +15 -0
  174. package/dist/material/decks/windsands/WindWrathEffectRule.d.ts +5 -0
  175. package/dist/material/decks/windsands/WindWrathEffectRule.js +17 -0
  176. package/dist/material/decks/windsands/WishLamp.d.ts +16 -0
  177. package/dist/material/decks/windsands/WishLamp.js +22 -0
  178. package/dist/rules/ChallengeEffectRule.d.ts +6 -0
  179. package/dist/rules/ChallengeEffectRule.js +17 -0
  180. package/dist/rules/ChallengeResponseRule.d.ts +8 -0
  181. package/dist/rules/ChallengeResponseRule.js +31 -0
  182. package/dist/rules/ChooseStartPlayerEffectRule.d.ts +6 -0
  183. package/dist/rules/ChooseStartPlayerEffectRule.js +15 -0
  184. package/dist/rules/DestroyEffectRule.d.ts +5 -2
  185. package/dist/rules/DestroyEffectRule.js +26 -3
  186. package/dist/rules/DiscardEffectRule.d.ts +5 -3
  187. package/dist/rules/DiscardEffectRule.js +17 -4
  188. package/dist/rules/DrawEffectRule.d.ts +4 -2
  189. package/dist/rules/DrawEffectRule.js +9 -6
  190. package/dist/rules/EffectRule.d.ts +3 -2
  191. package/dist/rules/EffectRule.js +9 -3
  192. package/dist/rules/EndRoundRule.js +11 -17
  193. package/dist/rules/GainPowerTokensEffectRule.d.ts +8 -0
  194. package/dist/rules/GainPowerTokensEffectRule.js +25 -0
  195. package/dist/rules/MulliganEffectRule.d.ts +7 -0
  196. package/dist/rules/MulliganEffectRule.js +19 -0
  197. package/dist/rules/PlayCardEffectRule.d.ts +9 -0
  198. package/dist/rules/PlayCardEffectRule.js +37 -0
  199. package/dist/rules/PlayCardRule.js +12 -12
  200. package/dist/rules/PlayerHelper.d.ts +9 -5
  201. package/dist/rules/PlayerHelper.js +25 -23
  202. package/dist/rules/PrepareNextRoundRule.js +6 -3
  203. package/dist/rules/PutCardUnderEffectRule.d.ts +7 -0
  204. package/dist/rules/PutCardUnderEffectRule.js +22 -0
  205. package/dist/rules/PutPowerTokenEffectRule.d.ts +4 -2
  206. package/dist/rules/PutPowerTokenEffectRule.js +24 -4
  207. package/dist/rules/ReturnCardEffectRule.d.ts +9 -0
  208. package/dist/rules/ReturnCardEffectRule.js +36 -0
  209. package/dist/rules/ReturnCardRule.d.ts +5 -3
  210. package/dist/rules/ReturnCardRule.js +18 -8
  211. package/dist/rules/RuleId.d.ts +15 -34
  212. package/dist/rules/RuleId.js +14 -33
  213. package/dist/rules/StartPlayerTurnRule.js +5 -5
  214. package/dist/rules/StashPowerTokensEffectRule.d.ts +5 -0
  215. package/dist/rules/StashPowerTokensEffectRule.js +15 -0
  216. package/dist/rules/StealCrystalEffectRule.js +3 -3
  217. package/dist/rules/StunCardRule.d.ts +4 -2
  218. package/dist/rules/StunCardRule.js +24 -19
  219. package/dist/rules/StunEffectRule.d.ts +11 -0
  220. package/dist/rules/StunEffectRule.js +45 -0
  221. package/dist/rules/SwitchSideEffectRule.d.ts +11 -0
  222. package/dist/rules/SwitchSideEffectRule.js +33 -0
  223. package/package.json +3 -3
@@ -1,9 +1,9 @@
1
1
  import { MaterialRulesPart } from '@gamepark/rules-api';
2
- import { CustomMoveType } from '../CustomMoveType';
3
2
  import { Memory } from '../Memory';
4
- import { RuleId } from '../rules/RuleId';
5
3
  import { cardProperties } from './CardProperties';
6
4
  import { CardSuit } from './CardSuit';
5
+ import { CardType } from './CardType';
6
+ import { createCardRule } from './createCardRule';
7
7
  import { LocationType } from './LocationType';
8
8
  import { MaterialType } from './MaterialType';
9
9
  import { OngoingEffectType } from './OngoingEffect';
@@ -13,40 +13,16 @@ export class CardRule extends MaterialRulesPart {
13
13
  super(game);
14
14
  this.index = index;
15
15
  }
16
- onEnters() {
17
- if (this.entersEffect || this.challenge) {
18
- this.memorize(Memory.PendingEffects, (effects) => [...effects, { cardIndex: this.index, challenge: this.challenge }]);
19
- }
20
- return [];
21
- }
22
- onPlayerTurnStart(_player) {
23
- return [];
24
- }
25
- onRoundEnd(win) {
26
- return win ? this.onWinRound() : this.onLoseRound();
27
- }
28
- onWinRound() {
29
- return [];
30
- }
31
- onLoseRound() {
32
- return [];
33
- }
34
- onCardEnters(_card, _side) {
35
- return [];
36
- }
37
- oncePerTurnEffect = false;
38
- entersEffect = false;
39
- challenge = false;
40
- onChallengeAccepted() {
41
- return [this.customMove(CustomMoveType.EndEffect)];
16
+ canActivate() {
17
+ if (!this.activate)
18
+ return false;
19
+ if (this.isStunned())
20
+ return false;
21
+ const activatedCards = this.remind(Memory.ActivatedCards);
22
+ return !activatedCards.includes(this.index);
42
23
  }
43
- onChallengeDeclined() {
44
- this.memorize(Memory.PendingEffects, []);
45
- this.memorize(Memory.ChallengeConceded, true);
46
- return [this.startPlayerTurn(RuleId.EndRound, this.opponent)];
47
- }
48
- onLeave() {
49
- return [...this.removePowerTokens(), ...this.removeStunTokens()];
24
+ onLeaves() {
25
+ return [...this.removePowerTokens(), ...this.removeStunTokens(), ...this.removeSpecialTokens()];
50
26
  }
51
27
  removePowerTokens() {
52
28
  const tokens = this.material(MaterialType.PowerToken).location(LocationType.CardPowerTokens).parent(this.index);
@@ -56,6 +32,10 @@ export class CardRule extends MaterialRulesPart {
56
32
  const tokens = this.material(MaterialType.StunToken).location(LocationType.CardStunTokens).parent(this.index);
57
33
  return tokens.getQuantity() > 0 ? [tokens.deleteItem(tokens.getQuantity())] : [];
58
34
  }
35
+ removeSpecialTokens() {
36
+ const tokens = this.material(MaterialType.SpecialToken).location(LocationType.CardSpecialTokens).parent(this.index);
37
+ return tokens.getQuantity() > 0 ? [tokens.deleteItem(tokens.getQuantity())] : [];
38
+ }
59
39
  get item() {
60
40
  return this.material(MaterialType.Card).getItem(this.index);
61
41
  }
@@ -65,6 +45,12 @@ export class CardRule extends MaterialRulesPart {
65
45
  get properties() {
66
46
  return cardProperties[this.card];
67
47
  }
48
+ get playArea() {
49
+ return this.material(MaterialType.Card).location(LocationType.PlayArea);
50
+ }
51
+ get creatures() {
52
+ return this.playArea.id((id) => cardProperties[id.front].type === CardType.Creature);
53
+ }
68
54
  isStunned() {
69
55
  return this.material(MaterialType.StunToken).location(LocationType.CardStunTokens).parent(this.index).getQuantity() > 0;
70
56
  }
@@ -73,7 +59,7 @@ export class CardRule extends MaterialRulesPart {
73
59
  return 0;
74
60
  }
75
61
  else {
76
- return this.getPowerIfNotStunned();
62
+ return Math.max(this.getPowerIfNotStunned(), 0);
77
63
  }
78
64
  }
79
65
  getPowerIfNotStunned() {
@@ -81,48 +67,45 @@ export class CardRule extends MaterialRulesPart {
81
67
  const powerTokensCount = this.material(MaterialType.PowerToken).location(LocationType.CardPowerTokens).parent(this.index).getQuantity();
82
68
  return basePower + powerTokensCount;
83
69
  }
84
- addPendingEffect() {
85
- this.memorize(Memory.PendingEffects, (effects) => [...effects, { cardIndex: this.index }]);
70
+ addPendingEffect(ruleId) {
71
+ this.memorize(Memory.PendingEffects, (effects) => [...effects, { cardIndex: this.index, ruleId }]);
86
72
  }
87
73
  addOngoingEffect(type) {
88
74
  this.memorize(Memory.OngoingEffects, (effects) => [...effects, { type, cardIndex: this.index }]);
89
75
  }
76
+ removeOngoingEffect(type) {
77
+ this.memorize(Memory.OngoingEffects, (effects) => effects.filter((e) => !(e.type === type && e.cardIndex === this.index)));
78
+ }
90
79
  get player() {
91
80
  return this.item.location.player;
92
81
  }
93
- get opponent() {
82
+ get foe() {
94
83
  return this.game.players.find((p) => p !== this.player);
95
84
  }
96
- startEffect() {
97
- const pendingEffects = this.remind(Memory.PendingEffects);
98
- if (!pendingEffects.length) {
99
- pendingEffects.push({ cardIndex: this.index });
100
- }
101
- const effect = pendingEffects[0];
102
- if (effect.challenge) {
103
- return [this.startPlayerTurn(RuleId.MayChallenge, this.player)];
104
- }
105
- else {
106
- return [this.startPlayerTurn(this.card, this.player)];
107
- }
85
+ startEffect(effect) {
86
+ return [this.startPlayerTurn(effect.ruleId, this.getEffectPlayer(effect))];
87
+ }
88
+ getEffectPlayer(_effect) {
89
+ return this.player;
108
90
  }
109
91
  canBePlayed() {
110
- const ongoingEffects = this.remind(Memory.OngoingEffects);
111
- const forcedSuit = ongoingEffects.find((e) => e.type === OngoingEffectType.ForcedSuit);
112
- if (forcedSuit) {
113
- const sourceCard = this.material(MaterialType.Card).getItem(forcedSuit.cardIndex);
114
- if (sourceCard.location.player !== this.player) {
115
- const forcedSuitValue = cardProperties[sourceCard.id.front].suit;
116
- if (this.properties.suit !== forcedSuitValue)
117
- return false;
118
- }
119
- }
92
+ return this.canSuitBePlayed() && !this.ongoingEffectPreventsPlayCard();
93
+ }
94
+ canSuitBePlayed() {
120
95
  const currentSuit = this.remind(Memory.Suit);
121
96
  const cardSuit = this.properties.suit;
122
- return !(cardSuit === CardSuit.Night && currentSuit === CardSuit.Day) && !(cardSuit === CardSuit.Day && currentSuit === CardSuit.Night);
97
+ return !currentSuit || cardSuit === CardSuit.Twilight || cardSuit === currentSuit;
123
98
  }
124
- permanentEffectTag = undefined;
125
- hasPermanentEffectOnTag(tag) {
126
- return this.permanentEffectTag === tag;
99
+ ongoingEffectPreventsPlayCard() {
100
+ const ongoingEffects = this.remind(Memory.OngoingEffects);
101
+ for (const effect of ongoingEffects) {
102
+ if (effect.type === OngoingEffectType.PreventPlayCard) {
103
+ const sourceCardRule = createCardRule(this.game, effect.cardIndex);
104
+ if (sourceCardRule.preventPlayCard(this.card, this.player)) {
105
+ return true;
106
+ }
107
+ }
108
+ }
109
+ return false;
127
110
  }
128
111
  }
@@ -1,5 +1,6 @@
1
1
  export declare enum CardTag {
2
2
  Knight = 1,
3
3
  Archer = 2,
4
- Cannon = 3
4
+ Undead = 3,
5
+ Cannon = 4
5
6
  }
@@ -2,5 +2,6 @@ export var CardTag;
2
2
  (function (CardTag) {
3
3
  CardTag[CardTag["Knight"] = 1] = "Knight";
4
4
  CardTag[CardTag["Archer"] = 2] = "Archer";
5
- CardTag[CardTag["Cannon"] = 3] = "Cannon";
5
+ CardTag[CardTag["Undead"] = 3] = "Undead";
6
+ CardTag[CardTag["Cannon"] = 4] = "Cannon";
6
7
  })(CardTag || (CardTag = {}));
@@ -1,4 +1,4 @@
1
1
  export type Effect = {
2
2
  cardIndex: number;
3
- challenge?: boolean;
3
+ ruleId: number;
4
4
  };
@@ -0,0 +1,51 @@
1
+ import { Material } from '@gamepark/rules-api';
2
+ import { Card } from './Card';
3
+ import { Deck } from '../Deck';
4
+ export interface DrawEffect {
5
+ getDrawCount?(): number;
6
+ getDrawPlayer?(): Deck;
7
+ }
8
+ export interface DiscardEffect {
9
+ getDiscardCount?(): number;
10
+ getDiscardTargets?(): Material;
11
+ isAutoDiscard?(): boolean;
12
+ }
13
+ export interface ReturnCardEffect {
14
+ getReturnTargets?(): Material;
15
+ isAutoReturn?(): boolean;
16
+ isReturnOptional?(): boolean;
17
+ }
18
+ export interface DestroyEffect {
19
+ getDestroyTargets(): Material;
20
+ getDestroyCount?(): number;
21
+ isDestroyOptional?(): boolean;
22
+ isAutoDestroy?(): boolean;
23
+ }
24
+ export interface PutPowerTokenEffect {
25
+ getPutPowerTokenTargets?(): Material;
26
+ getPutPowerTokenCount?(): number;
27
+ isAutoPutPowerToken?(): boolean;
28
+ }
29
+ export interface StashPowerTokenEffect {
30
+ getStashPowerTokenCount?(): number;
31
+ }
32
+ export interface PlayCardEffect {
33
+ getPlayCardTargets?(): Material;
34
+ isPlayCardOptional?(): boolean;
35
+ }
36
+ export interface ChallengeEffect {
37
+ onChallengeAccepted?(): void;
38
+ onChallengeDeclined?(): void;
39
+ }
40
+ export interface StunEffect {
41
+ getStunTargets?(): Material;
42
+ getStunCount?(): number;
43
+ getStunTargetsCount?(): number;
44
+ isAutoStun?(): boolean;
45
+ }
46
+ export interface PreventPlayCardEffect {
47
+ preventPlayCard(card: Card, player: Deck): boolean;
48
+ }
49
+ export interface PreventEffectsEffect {
50
+ preventEnterEffects(cardIndex: number): boolean;
51
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -10,5 +10,7 @@ export declare enum LocationType {
10
10
  PlayerCrystals = 9,
11
11
  CardPowerTokens = 10,
12
12
  CardStunTokens = 11,
13
- PlayerStash = 12
13
+ PlayerStash = 12,
14
+ CardSpecialTokens = 13,
15
+ UnderCard = 14
14
16
  }
@@ -12,4 +12,6 @@ export var LocationType;
12
12
  LocationType[LocationType["CardPowerTokens"] = 10] = "CardPowerTokens";
13
13
  LocationType[LocationType["CardStunTokens"] = 11] = "CardStunTokens";
14
14
  LocationType[LocationType["PlayerStash"] = 12] = "PlayerStash";
15
+ LocationType[LocationType["CardSpecialTokens"] = 13] = "CardSpecialTokens";
16
+ LocationType[LocationType["UnderCard"] = 14] = "UnderCard";
15
17
  })(LocationType || (LocationType = {}));
@@ -2,5 +2,6 @@ export declare enum MaterialType {
2
2
  Card = 1,
3
3
  Crystal = 2,
4
4
  PowerToken = 3,
5
- StunToken = 4
5
+ StunToken = 4,
6
+ SpecialToken = 5
6
7
  }
@@ -4,4 +4,5 @@ export var MaterialType;
4
4
  MaterialType[MaterialType["Crystal"] = 2] = "Crystal";
5
5
  MaterialType[MaterialType["PowerToken"] = 3] = "PowerToken";
6
6
  MaterialType[MaterialType["StunToken"] = 4] = "StunToken";
7
+ MaterialType[MaterialType["SpecialToken"] = 5] = "SpecialToken";
7
8
  })(MaterialType || (MaterialType = {}));
@@ -1,6 +1,6 @@
1
1
  export declare enum OngoingEffectType {
2
- ForcedSuit = 1,
3
- DeathTrap = 2
2
+ PreventPlayCard = 1,
3
+ PreventEffects = 2
4
4
  }
5
5
  export type OngoingEffect = {
6
6
  type: OngoingEffectType;
@@ -1,5 +1,5 @@
1
1
  export var OngoingEffectType;
2
2
  (function (OngoingEffectType) {
3
- OngoingEffectType[OngoingEffectType["ForcedSuit"] = 1] = "ForcedSuit";
4
- OngoingEffectType[OngoingEffectType["DeathTrap"] = 2] = "DeathTrap";
3
+ OngoingEffectType[OngoingEffectType["PreventPlayCard"] = 1] = "PreventPlayCard";
4
+ OngoingEffectType[OngoingEffectType["PreventEffects"] = 2] = "PreventEffects";
5
5
  })(OngoingEffectType || (OngoingEffectType = {}));
@@ -0,0 +1,3 @@
1
+ export declare enum SpecialTokenType {
2
+ Doom = 1
3
+ }
@@ -0,0 +1,4 @@
1
+ export var SpecialTokenType;
2
+ (function (SpecialTokenType) {
3
+ SpecialTokenType[SpecialTokenType["Doom"] = 1] = "Doom";
4
+ })(SpecialTokenType || (SpecialTokenType = {}));
@@ -0,0 +1,3 @@
1
+ import { MaterialGame } from '@gamepark/rules-api';
2
+ import { CardRule } from './CardRule';
3
+ export declare function createCardRule(game: MaterialGame, cardIndex: number): CardRule;
@@ -0,0 +1,7 @@
1
+ import { cardProperties } from './CardProperties';
2
+ import { MaterialType } from './MaterialType';
3
+ export function createCardRule(game, cardIndex) {
4
+ const card = game.items[MaterialType.Card][cardIndex].id.front;
5
+ const Rule = cardProperties[card].rule;
6
+ return new Rule(game, cardIndex);
7
+ }
@@ -0,0 +1,18 @@
1
+ export declare const GraveHurt: {
2
+ 301: number;
3
+ 302: number;
4
+ 303: number;
5
+ 304: number;
6
+ 305: number;
7
+ 306: number;
8
+ 307: number;
9
+ 308: number;
10
+ 309: number;
11
+ 310: number;
12
+ 311: number;
13
+ 312: number;
14
+ 313: number;
15
+ 314: number;
16
+ 315: number;
17
+ 316: number;
18
+ };
@@ -0,0 +1,19 @@
1
+ import { Card } from '../Card';
2
+ export const GraveHurt = {
3
+ [Card.MacabreLegion]: 2,
4
+ [Card.CavernSkulker]: 2,
5
+ [Card.TheGreatToady]: 1,
6
+ [Card.Umbraboros]: 1,
7
+ [Card.Nosferatis]: 2,
8
+ [Card.InsatiableUmbraphage]: 2,
9
+ [Card.ScrabDoombird]: 1,
10
+ [Card.MoonFang]: 2,
11
+ [Card.Whisperers]: 2,
12
+ [Card.OstraVoiceOfTheSoul]: 1,
13
+ [Card.TerrifyingSummoning]: 2,
14
+ [Card.ReturnInTime]: 1,
15
+ [Card.CallOfTheEclipse]: 1,
16
+ [Card.WitchingHour]: 2,
17
+ [Card.Doom]: 1,
18
+ [Card.AstralHammer]: 1
19
+ };
@@ -0,0 +1,18 @@
1
+ export declare const WindSands: {
2
+ 201: number;
3
+ 202: number;
4
+ 203: number;
5
+ 204: number;
6
+ 205: number;
7
+ 206: number;
8
+ 207: number;
9
+ 208: number;
10
+ 209: number;
11
+ 210: number;
12
+ 211: number;
13
+ 212: number;
14
+ 213: number;
15
+ 214: number;
16
+ 215: number;
17
+ 216: number;
18
+ };
@@ -0,0 +1,19 @@
1
+ import { Card } from '../Card';
2
+ export const WindSands = {
3
+ [Card.DesertRaider]: 2,
4
+ [Card.Metamorph]: 2,
5
+ [Card.ErgDeathslayer]: 1,
6
+ [Card.AbiSnakeCharmer]: 1,
7
+ [Card.Catadjinn]: 2,
8
+ [Card.Vandals]: 2,
9
+ [Card.MushaFakir]: 1,
10
+ [Card.OasisShaman]: 2,
11
+ [Card.MalikShadowtracker]: 1,
12
+ [Card.DuneWardrums]: 2,
13
+ [Card.SandWalkers]: 1,
14
+ [Card.WishLamp]: 2,
15
+ [Card.StarlightBazaar]: 1,
16
+ [Card.AncientCurse]: 1,
17
+ [Card.WindWrath]: 1,
18
+ [Card.DeathTrap]: 2
19
+ };
@@ -0,0 +1,18 @@
1
+ import { Material } from '@gamepark/rules-api';
2
+ import { CardRule } from '../../CardRule';
3
+ import { CardSuit } from '../../CardSuit';
4
+ import { CardType } from '../../CardType';
5
+ import { StunEffect } from '../../EffectTraits';
6
+ declare class AstralHammerRule extends CardRule implements StunEffect {
7
+ onEnters(): void;
8
+ getStunTargets(): Material;
9
+ getStunCount(): number;
10
+ isAutoStun(): boolean;
11
+ }
12
+ export declare const AstralHammer: {
13
+ power: number;
14
+ type: CardType;
15
+ suit: CardSuit;
16
+ rule: typeof AstralHammerRule;
17
+ };
18
+ export {};
@@ -0,0 +1,25 @@
1
+ import { RuleId } from '../../../rules/RuleId';
2
+ import { CardRule } from '../../CardRule';
3
+ import { createCardRule } from '../../createCardRule';
4
+ import { CardSuit } from '../../CardSuit';
5
+ import { CardType } from '../../CardType';
6
+ class AstralHammerRule extends CardRule {
7
+ onEnters() {
8
+ this.addPendingEffect(RuleId.StunEffect);
9
+ }
10
+ getStunTargets() {
11
+ return this.creatures.player(this.foe).index((index) => createCardRule(this.game, index).getPower() <= 3);
12
+ }
13
+ getStunCount() {
14
+ return 2;
15
+ }
16
+ isAutoStun() {
17
+ return true;
18
+ }
19
+ }
20
+ export const AstralHammer = {
21
+ power: 2,
22
+ type: CardType.Action,
23
+ suit: CardSuit.Twilight,
24
+ rule: AstralHammerRule
25
+ };
@@ -0,0 +1,4 @@
1
+ import { EffectRule } from '../../../rules/EffectRule';
2
+ export declare class AstralHammerEffectRule extends EffectRule {
3
+ onRuleStart(): import("@gamepark/rules-api").MaterialMove[];
4
+ }
@@ -0,0 +1,26 @@
1
+ import { PlayerHelper } from '../../../rules/PlayerHelper';
2
+ import { EffectRule } from '../../../rules/EffectRule';
3
+ import { cardProperties } from '../../CardProperties';
4
+ import { CardType } from '../../CardType';
5
+ import { LocationType } from '../../LocationType';
6
+ import { MaterialType } from '../../MaterialType';
7
+ export class AstralHammerEffectRule extends EffectRule {
8
+ onRuleStart() {
9
+ const targets = this.material(MaterialType.Card)
10
+ .location(LocationType.PlayArea)
11
+ .player(this.nextPlayer)
12
+ .id((id) => cardProperties[id.front].type === CardType.Creature)
13
+ .index((index) => new PlayerHelper(this.game).getCardRule(index).getPower() <= 3);
14
+ const moves = [];
15
+ for (const index of targets.getIndexes()) {
16
+ moves.push(this.material(MaterialType.StunToken).createItem({
17
+ location: {
18
+ type: LocationType.CardStunTokens,
19
+ parent: index
20
+ },
21
+ quantity: 2
22
+ }));
23
+ }
24
+ return [...moves, ...this.endEffect()];
25
+ }
26
+ }
@@ -0,0 +1,17 @@
1
+ import { Material } from '@gamepark/rules-api';
2
+ import { CardRule } from '../../CardRule';
3
+ import { CardSuit } from '../../CardSuit';
4
+ import { CardType } from '../../CardType';
5
+ import { PlayCardEffect } from '../../EffectTraits';
6
+ declare class CallOfTheEclipseRule extends CardRule implements PlayCardEffect {
7
+ onEnters(): void;
8
+ getPlayCardTargets(): Material;
9
+ isPlayCardOptional(): boolean;
10
+ }
11
+ export declare const CallOfTheEclipse: {
12
+ power: number;
13
+ type: CardType;
14
+ suit: CardSuit;
15
+ rule: typeof CallOfTheEclipseRule;
16
+ };
17
+ export {};
@@ -0,0 +1,28 @@
1
+ import { RuleId } from '../../../rules/RuleId';
2
+ import { cardProperties } from '../../CardProperties';
3
+ import { CardRule } from '../../CardRule';
4
+ import { CardSuit } from '../../CardSuit';
5
+ import { CardType } from '../../CardType';
6
+ import { LocationType } from '../../LocationType';
7
+ import { MaterialType } from '../../MaterialType';
8
+ class CallOfTheEclipseRule extends CardRule {
9
+ onEnters() {
10
+ this.addPendingEffect(RuleId.PlayCardEffect);
11
+ this.addPendingEffect(RuleId.ChallengeEffect);
12
+ }
13
+ getPlayCardTargets() {
14
+ return this.material(MaterialType.Card)
15
+ .location(LocationType.PlayerHand)
16
+ .player(this.player)
17
+ .id((id) => id.front !== undefined && cardProperties[id.front].suit === CardSuit.Night);
18
+ }
19
+ isPlayCardOptional() {
20
+ return true;
21
+ }
22
+ }
23
+ export const CallOfTheEclipse = {
24
+ power: 1,
25
+ type: CardType.Action,
26
+ suit: CardSuit.Day,
27
+ rule: CallOfTheEclipseRule
28
+ };
@@ -0,0 +1,5 @@
1
+ import { MaterialMove } from '@gamepark/rules-api';
2
+ import { EffectRule } from '../../../rules/EffectRule';
3
+ export declare class CallOfTheEclipseEffectRule extends EffectRule {
4
+ onRuleStart(): MaterialMove[];
5
+ }
@@ -0,0 +1,11 @@
1
+ import { CustomMoveType } from '../../../CustomMoveType';
2
+ import { EffectRule } from '../../../rules/EffectRule';
3
+ import { EffectType } from '../../Effect';
4
+ export class CallOfTheEclipseEffectRule extends EffectRule {
5
+ onRuleStart() {
6
+ this.cardRule.addPendingEffect(EffectType.ChallengeAccepted);
7
+ const moves = this.endEffect();
8
+ moves.unshift(this.customMove(CustomMoveType.Draw, { player: this.player, quantity: 1 }));
9
+ return moves;
10
+ }
11
+ }
@@ -0,0 +1,16 @@
1
+ import { CardSuit } from '../../CardSuit';
2
+ import { CardTag } from '../../CardTag';
3
+ import { CardType } from '../../CardType';
4
+ import { UndeadRule } from './UndeadRule';
5
+ declare class CavernSkulkerRule extends UndeadRule {
6
+ onEnters(): void;
7
+ onLeaves(): import("@gamepark/rules-api").MaterialMove[];
8
+ }
9
+ export declare const CavernSkulker: {
10
+ power: number;
11
+ type: CardType;
12
+ suit: CardSuit;
13
+ tag: CardTag;
14
+ rule: typeof CavernSkulkerRule;
15
+ };
16
+ export {};
@@ -0,0 +1,26 @@
1
+ import { RuleId } from '../../../rules/RuleId';
2
+ import { CardSuit } from '../../CardSuit';
3
+ import { CardTag } from '../../CardTag';
4
+ import { CardType } from '../../CardType';
5
+ import { LocationType } from '../../LocationType';
6
+ import { MaterialType } from '../../MaterialType';
7
+ import { UndeadRule } from './UndeadRule';
8
+ class CavernSkulkerRule extends UndeadRule {
9
+ onEnters() {
10
+ this.addPendingEffect(RuleId.CavernSkulkerEffect);
11
+ }
12
+ onLeaves() {
13
+ const underCards = this.material(MaterialType.Card).location(LocationType.UnderCard).parent(this.index);
14
+ return [
15
+ ...underCards.moveItems((item) => ({ type: LocationType.PlayerHand, player: item.id.back })),
16
+ ...super.onLeaves()
17
+ ];
18
+ }
19
+ }
20
+ export const CavernSkulker = {
21
+ power: 2,
22
+ type: CardType.Creature,
23
+ suit: CardSuit.Day,
24
+ tag: CardTag.Undead,
25
+ rule: CavernSkulkerRule
26
+ };
@@ -0,0 +1,4 @@
1
+ import { EffectRule } from '../../../rules/EffectRule';
2
+ export declare class CavernSkulkerEffectRule extends EffectRule {
3
+ onRuleStart(): import("@gamepark/rules-api").MaterialMove[];
4
+ }
@@ -0,0 +1,15 @@
1
+ import { sample } from 'es-toolkit';
2
+ import { EffectRule } from '../../../rules/EffectRule';
3
+ import { LocationType } from '../../LocationType';
4
+ import { MaterialType } from '../../MaterialType';
5
+ export class CavernSkulkerEffectRule extends EffectRule {
6
+ onRuleStart() {
7
+ const moves = this.endEffect();
8
+ const foeHand = this.material(MaterialType.Card).location(LocationType.PlayerHand).player(this.nextPlayer);
9
+ if (foeHand.length > 0) {
10
+ const randomIndex = sample(foeHand.getIndexes());
11
+ moves.unshift(foeHand.index(randomIndex).moveItem({ type: LocationType.UnderCard, parent: this.effectCardIndex }));
12
+ }
13
+ return moves;
14
+ }
15
+ }
@@ -0,0 +1,18 @@
1
+ import { Material } from '@gamepark/rules-api';
2
+ import { CardRule } from '../../CardRule';
3
+ import { CardSuit } from '../../CardSuit';
4
+ import { CardType } from '../../CardType';
5
+ import { DestroyEffect } from '../../EffectTraits';
6
+ declare class DoomRule extends CardRule implements DestroyEffect {
7
+ onEnters(): void;
8
+ onLeaves(): import("@gamepark/rules-api").MaterialMove[];
9
+ getDestroyTargets(): Material;
10
+ isAutoDestroy(): boolean;
11
+ }
12
+ export declare const Doom: {
13
+ power: number;
14
+ type: CardType;
15
+ suit: CardSuit;
16
+ rule: typeof DoomRule;
17
+ };
18
+ export {};