@gamepark/skyrift 0.4.2 → 0.5.0

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 (89) 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/Memory.d.ts +10 -9
  6. package/dist/Memory.js +10 -9
  7. package/dist/SkyriftRules.d.ts +6 -2
  8. package/dist/SkyriftRules.js +6 -2
  9. package/dist/SkyriftSetup.js +2 -0
  10. package/dist/material/Card.d.ts +16 -0
  11. package/dist/material/Card.js +16 -0
  12. package/dist/material/CardProperties.js +32 -0
  13. package/dist/material/CardRule.d.ts +2 -1
  14. package/dist/material/CardRule.js +10 -3
  15. package/dist/material/OngoingEffect.d.ts +3 -1
  16. package/dist/material/OngoingEffect.js +2 -0
  17. package/dist/material/decks/BlackHive.d.ts +18 -0
  18. package/dist/material/decks/BlackHive.js +19 -0
  19. package/dist/material/decks/blackhive/CarefulExcavation.d.ts +20 -0
  20. package/dist/material/decks/blackhive/CarefulExcavation.js +31 -0
  21. package/dist/material/decks/blackhive/CaveIn.d.ts +14 -0
  22. package/dist/material/decks/blackhive/CaveIn.js +18 -0
  23. package/dist/material/decks/blackhive/CaveInEffectRule.d.ts +10 -0
  24. package/dist/material/decks/blackhive/CaveInEffectRule.js +55 -0
  25. package/dist/material/decks/blackhive/CrystalMining.d.ts +15 -0
  26. package/dist/material/decks/blackhive/CrystalMining.js +22 -0
  27. package/dist/material/decks/blackhive/CrystalMiningBonusEffectRule.d.ts +4 -0
  28. package/dist/material/decks/blackhive/CrystalMiningBonusEffectRule.js +10 -0
  29. package/dist/material/decks/blackhive/CrystalShaft.d.ts +15 -0
  30. package/dist/material/decks/blackhive/CrystalShaft.js +18 -0
  31. package/dist/material/decks/blackhive/CycleKeeper.d.ts +13 -0
  32. package/dist/material/decks/blackhive/CycleKeeper.js +15 -0
  33. package/dist/material/decks/blackhive/CycleKeeperEffectRule.d.ts +6 -0
  34. package/dist/material/decks/blackhive/CycleKeeperEffectRule.js +21 -0
  35. package/dist/material/decks/blackhive/DariusAstraSmith.d.ts +13 -0
  36. package/dist/material/decks/blackhive/DariusAstraSmith.js +15 -0
  37. package/dist/material/decks/blackhive/DarkSwarm.d.ts +13 -0
  38. package/dist/material/decks/blackhive/DarkSwarm.js +15 -0
  39. package/dist/material/decks/blackhive/DarkSwarmEffectRule.d.ts +6 -0
  40. package/dist/material/decks/blackhive/DarkSwarmEffectRule.js +18 -0
  41. package/dist/material/decks/blackhive/ElevatorOfTheAbyss.d.ts +15 -0
  42. package/dist/material/decks/blackhive/ElevatorOfTheAbyss.js +19 -0
  43. package/dist/material/decks/blackhive/ExplosiveKitty.d.ts +16 -0
  44. package/dist/material/decks/blackhive/ExplosiveKitty.js +19 -0
  45. package/dist/material/decks/blackhive/GromIronspike.d.ts +13 -0
  46. package/dist/material/decks/blackhive/GromIronspike.js +18 -0
  47. package/dist/material/decks/blackhive/GuntarRustypike.d.ts +20 -0
  48. package/dist/material/decks/blackhive/GuntarRustypike.js +28 -0
  49. package/dist/material/decks/blackhive/HiveMother.d.ts +13 -0
  50. package/dist/material/decks/blackhive/HiveMother.js +18 -0
  51. package/dist/material/decks/blackhive/LotharBlackclaw.d.ts +13 -0
  52. package/dist/material/decks/blackhive/LotharBlackclaw.js +22 -0
  53. package/dist/material/decks/blackhive/LotharBlackclawEffectRule.d.ts +4 -0
  54. package/dist/material/decks/blackhive/LotharBlackclawEffectRule.js +20 -0
  55. package/dist/material/decks/blackhive/OlgaStonecrusher.d.ts +13 -0
  56. package/dist/material/decks/blackhive/OlgaStonecrusher.js +15 -0
  57. package/dist/material/decks/blackhive/ShadowDealer.d.ts +15 -0
  58. package/dist/material/decks/blackhive/ShadowDealer.js +22 -0
  59. package/dist/material/decks/blackhive/UndergroundScourge.d.ts +13 -0
  60. package/dist/material/decks/blackhive/UndergroundScourge.js +15 -0
  61. package/dist/material/decks/gravehurt/CavernSkulker.d.ts +4 -1
  62. package/dist/material/decks/gravehurt/CavernSkulker.js +18 -5
  63. package/dist/material/decks/gravehurt/Doom.d.ts +5 -1
  64. package/dist/material/decks/gravehurt/Doom.js +16 -2
  65. package/dist/material/decks/gravehurt/Nosferatis.d.ts +2 -2
  66. package/dist/material/decks/gravehurt/Nosferatis.js +2 -2
  67. package/dist/material/decks/gravehurt/TheGreatToady.d.ts +2 -2
  68. package/dist/material/decks/gravehurt/TheGreatToady.js +2 -2
  69. package/dist/material/decks/heathblade/Armada.js +1 -1
  70. package/dist/material/decks/highwave/BoardingPartyEffectRule.d.ts +0 -1
  71. package/dist/material/decks/highwave/BoardingPartyEffectRule.js +0 -6
  72. package/dist/material/decks/highwave/EyeOfSky.d.ts +1 -1
  73. package/dist/material/decks/highwave/EyeOfSky.js +2 -2
  74. package/dist/rules/DestroyEffectRule.d.ts +1 -1
  75. package/dist/rules/DestroyEffectRule.js +8 -3
  76. package/dist/rules/EffectRule.js +1 -1
  77. package/dist/rules/EndPlayerTurnRule.js +3 -0
  78. package/dist/rules/MulliganEffectRule.d.ts +2 -1
  79. package/dist/rules/MulliganEffectRule.js +15 -4
  80. package/dist/rules/PlayCardRule.d.ts +0 -1
  81. package/dist/rules/PlayCardRule.js +1 -4
  82. package/dist/rules/PlayerHelper.d.ts +1 -0
  83. package/dist/rules/PlayerHelper.js +6 -1
  84. package/dist/rules/RuleId.d.ts +3 -1
  85. package/dist/rules/RuleId.js +3 -1
  86. package/dist/rules/SimultaneousEffectRule.d.ts +5 -0
  87. package/dist/rules/SimultaneousEffectRule.js +14 -0
  88. package/dist/rules/StartPlayerTurnRule.js +4 -1
  89. package/package.json +2 -2
@@ -7,5 +7,4 @@ export declare class BoardingPartyEffectRule extends DestroyEffectRule {
7
7
  getTargets(): import("@gamepark/rules-api").Material<number, number, number>;
8
8
  onCardDestroyed(): import("@gamepark/rules-api").MaterialMove[];
9
9
  onCustomMove(move: CustomMove): import("@gamepark/rules-api").MaterialMove[];
10
- onRuleEnd(): never[];
11
10
  }
@@ -45,10 +45,4 @@ export class BoardingPartyEffectRule extends DestroyEffectRule {
45
45
  }
46
46
  return super.onCustomMove(move);
47
47
  }
48
- onRuleEnd() {
49
- if (!this.isBoardingPlayer) {
50
- this.forget(Memory.EffectCount);
51
- }
52
- return [];
53
- }
54
48
  }
@@ -3,7 +3,7 @@ import { CardSuit } from '../../CardSuit';
3
3
  import { CardType } from '../../CardType';
4
4
  declare class EyeOfSkyRule extends CardRule {
5
5
  onFoeTurnStart(): void;
6
- getEffectPlayer(): number;
6
+ getEffectPlayers(): number[];
7
7
  }
8
8
  export declare const EyeOfSky: {
9
9
  power: number;
@@ -6,8 +6,8 @@ class EyeOfSkyRule extends CardRule {
6
6
  onFoeTurnStart() {
7
7
  this.addPendingEffect(RuleId.EyeOfSkyEffect);
8
8
  }
9
- getEffectPlayer() {
10
- return this.foe;
9
+ getEffectPlayers() {
10
+ return [this.foe];
11
11
  }
12
12
  }
13
13
  export const EyeOfSky = {
@@ -7,5 +7,5 @@ export declare class DestroyEffectRule extends EffectRule<DestroyEffect> {
7
7
  getTargets(): Material;
8
8
  afterItemMove(move: ItemMove): MaterialMove[];
9
9
  onCardDestroyed(): MaterialMove[];
10
- onRuleEnd(): never[];
10
+ onEndEffect(): MaterialMove[];
11
11
  }
@@ -35,10 +35,15 @@ export class DestroyEffectRule extends EffectRule {
35
35
  }
36
36
  onCardDestroyed() {
37
37
  const remaining = this.memorize(Memory.EffectCount, (c) => c - 1);
38
- return remaining <= 0 || !this.getTargets().length ? this.endEffect() : [];
38
+ if (remaining <= 0 || !this.getTargets().length) {
39
+ return this.endEffect();
40
+ }
41
+ else {
42
+ return [];
43
+ }
39
44
  }
40
- onRuleEnd() {
45
+ onEndEffect() {
41
46
  this.forget(Memory.EffectCount);
42
- return [];
47
+ return super.onEndEffect();
43
48
  }
44
49
  }
@@ -39,7 +39,7 @@ export class EffectRule extends PlayerTurnRule {
39
39
  }
40
40
  const currentPlayer = this.remind(Memory.CurrentPlayer);
41
41
  const playerHelper = new PlayerHelper(this.game, currentPlayer);
42
- if (this.remind(Memory.CardsPlayed, currentPlayer).length && playerHelper.hasMorePower()) {
42
+ if (playerHelper.mustPassTurn()) {
43
43
  return [this.startPlayerTurn(RuleId.EndPlayerTurn, currentPlayer)];
44
44
  }
45
45
  else {
@@ -1,5 +1,7 @@
1
1
  import { PlayerTurnRule } from '@gamepark/rules-api';
2
2
  import { CustomMoveType } from '../CustomMoveType';
3
+ import { OngoingEffectType } from '../material/OngoingEffect';
4
+ import { Memory } from '../Memory';
3
5
  import { RuleId } from './RuleId';
4
6
  export class EndPlayerTurnRule extends PlayerTurnRule {
5
7
  getPlayerMoves() {
@@ -7,6 +9,7 @@ export class EndPlayerTurnRule extends PlayerTurnRule {
7
9
  }
8
10
  onCustomMove(move) {
9
11
  if (move.type === CustomMoveType.Pass) {
12
+ this.memorize(Memory.OngoingEffects, (effects) => effects.filter((e) => e.type !== OngoingEffectType.PassTurn));
10
13
  return [this.startPlayerTurn(RuleId.StartPlayerTurn, this.nextPlayer)];
11
14
  }
12
15
  return [];
@@ -1,7 +1,8 @@
1
1
  import { CustomMove } from '@gamepark/rules-api';
2
2
  import { DiscardEffectRule } from './DiscardEffectRule';
3
3
  export declare class MulliganEffectRule extends DiscardEffectRule {
4
- get discardCount(): number;
5
4
  getPlayerMoves(): import("@gamepark/rules-api").MaterialMove[];
5
+ onRuleStart(): never[];
6
+ onDiscard(): never[];
6
7
  onCustomMove(move: CustomMove): import("@gamepark/rules-api").MaterialMove[];
7
8
  }
@@ -2,17 +2,28 @@ import { CustomMoveType } from '../CustomMoveType';
2
2
  import { Memory } from '../Memory';
3
3
  import { DiscardEffectRule } from './DiscardEffectRule';
4
4
  export class MulliganEffectRule extends DiscardEffectRule {
5
- get discardCount() {
6
- return Infinity;
7
- }
8
5
  getPlayerMoves() {
9
6
  const moves = super.getPlayerMoves();
10
7
  moves.push(this.customMove(CustomMoveType.Pass));
11
8
  return moves;
12
9
  }
10
+ onRuleStart() {
11
+ this.memorize(Memory.EffectCount, 0);
12
+ return [];
13
+ }
14
+ onDiscard() {
15
+ this.memorize(Memory.EffectCount, (count) => count + 1);
16
+ return [];
17
+ }
13
18
  onCustomMove(move) {
14
19
  if (move.type === CustomMoveType.Pass) {
15
- return [this.customMove(CustomMoveType.Draw, { player: this.player, quantity: this.remind(Memory.EffectCount) }), ...this.endEffect()];
20
+ const discarded = this.remind(Memory.EffectCount);
21
+ if (discarded > 0) {
22
+ return [this.customMove(CustomMoveType.Draw, { player: this.player, quantity: discarded }), ...this.endEffect()];
23
+ }
24
+ else {
25
+ return this.endEffect();
26
+ }
16
27
  }
17
28
  return super.onCustomMove(move);
18
29
  }
@@ -5,5 +5,4 @@ export declare class PlayCardRule extends PlayerTurnRule {
5
5
  get cardsICanPlay(): import("@gamepark/rules-api").Material<number, number, number>;
6
6
  afterItemMove(move: ItemMove): MaterialMove[];
7
7
  onCustomMove(move: CustomMove): MaterialMove[];
8
- private hasMorePower;
9
8
  }
@@ -49,7 +49,7 @@ export class PlayCardRule extends PlayerTurnRule {
49
49
  }
50
50
  }
51
51
  if (isMoveItemType(MaterialType.Card)(move) || isMoveItemType(MaterialType.PowerToken)(move)) {
52
- if (this.remind(Memory.CardsPlayed, this.player).length > 0 && this.hasMorePower()) {
52
+ if (new PlayerHelper(this.game, this.player).mustPassTurn()) {
53
53
  return [this.startRule(RuleId.EndPlayerTurn)];
54
54
  }
55
55
  }
@@ -70,7 +70,4 @@ export class PlayCardRule extends PlayerTurnRule {
70
70
  }
71
71
  return [];
72
72
  }
73
- hasMorePower() {
74
- return new PlayerHelper(this.game, this.player).getPower() > new PlayerHelper(this.game, this.nextPlayer).getPower();
75
- }
76
73
  }
@@ -14,5 +14,6 @@ export declare class PlayerHelper extends MaterialRulesPart {
14
14
  getPower(): number;
15
15
  get foe(): number;
16
16
  hasMorePower(): boolean;
17
+ mustPassTurn(): boolean;
17
18
  onCardPlayed(cardIndex: number): void;
18
19
  }
@@ -30,7 +30,8 @@ export class PlayerHelper extends MaterialRulesPart {
30
30
  return this.cardsInPlay.id((id) => id.front === card).length > 0;
31
31
  }
32
32
  getPower() {
33
- return sumBy(this.cardRules, (rule) => rule.getPower());
33
+ const foeHelper = new PlayerHelper(this.game, this.foe);
34
+ return sumBy(this.cardRules, (rule) => rule.getPower()) + sumBy(foeHelper.cardRules, (rule) => rule.getFoePowerModifier());
34
35
  }
35
36
  get foe() {
36
37
  return this.game.players.find((p) => p !== this.player);
@@ -38,6 +39,10 @@ export class PlayerHelper extends MaterialRulesPart {
38
39
  hasMorePower() {
39
40
  return this.getPower() > new PlayerHelper(this.game, this.foe).getPower();
40
41
  }
42
+ mustPassTurn() {
43
+ const passTurn = this.remind(Memory.OngoingEffects).some(e => e.type === OngoingEffectType.PassTurn);
44
+ return passTurn || (this.remind(Memory.CardsPlayed, this.player).length > 0 && this.hasMorePower());
45
+ }
41
46
  onCardPlayed(cardIndex) {
42
47
  this.memorize(Memory.CardsPlayed, (cards) => [...cards, cardIndex], this.player);
43
48
  const cardRule = createCardRule(this.game, cardIndex);
@@ -17,12 +17,14 @@ export declare enum RuleId {
17
17
  GainCrystalEffect = 29,
18
18
  StealCrystalEffect = 30,
19
19
  PlayCardEffect = 31,
20
+ MulliganEffect = 32,
20
21
  PrincessLithaEffect = 103,
21
- ArmadaEffect = 110,
22
22
  AbiSnakeCharmerEffect = 204,
23
23
  WindWrathEffect = 215,
24
24
  CavernSkulkerEffect = 302,
25
25
  DoomEffect = 315,
26
+ CycleKeeperEffect = 409,
27
+ CaveInEffect = 413,
26
28
  EyeOfSkyEffect = 603,
27
29
  BoardingPartyEffect = 614
28
30
  }
@@ -19,12 +19,14 @@ export var RuleId;
19
19
  RuleId[RuleId["GainCrystalEffect"] = 29] = "GainCrystalEffect";
20
20
  RuleId[RuleId["StealCrystalEffect"] = 30] = "StealCrystalEffect";
21
21
  RuleId[RuleId["PlayCardEffect"] = 31] = "PlayCardEffect";
22
+ RuleId[RuleId["MulliganEffect"] = 32] = "MulliganEffect";
22
23
  RuleId[RuleId["PrincessLithaEffect"] = 103] = "PrincessLithaEffect";
23
- RuleId[RuleId["ArmadaEffect"] = 110] = "ArmadaEffect";
24
24
  RuleId[RuleId["AbiSnakeCharmerEffect"] = 204] = "AbiSnakeCharmerEffect";
25
25
  RuleId[RuleId["WindWrathEffect"] = 215] = "WindWrathEffect";
26
26
  RuleId[RuleId["CavernSkulkerEffect"] = 302] = "CavernSkulkerEffect";
27
27
  RuleId[RuleId["DoomEffect"] = 315] = "DoomEffect";
28
+ RuleId[RuleId["CycleKeeperEffect"] = 409] = "CycleKeeperEffect";
29
+ RuleId[RuleId["CaveInEffect"] = 413] = "CaveInEffect";
28
30
  RuleId[RuleId["EyeOfSkyEffect"] = 603] = "EyeOfSkyEffect";
29
31
  RuleId[RuleId["BoardingPartyEffect"] = 614] = "BoardingPartyEffect";
30
32
  })(RuleId || (RuleId = {}));
@@ -0,0 +1,5 @@
1
+ import { CustomMove, MaterialMove, SimultaneousRule } from '@gamepark/rules-api';
2
+ export declare abstract class SimultaneousEffectRule extends SimultaneousRule {
3
+ getMovesAfterPlayersDone(): MaterialMove[];
4
+ onCustomMove(move: CustomMove): MaterialMove[];
5
+ }
@@ -0,0 +1,14 @@
1
+ import { SimultaneousRule } from '@gamepark/rules-api';
2
+ import { CustomMoveType } from '../CustomMoveType';
3
+ import { EffectRule } from './EffectRule';
4
+ export class SimultaneousEffectRule extends SimultaneousRule {
5
+ getMovesAfterPlayersDone() {
6
+ return [this.customMove(CustomMoveType.EndEffect)];
7
+ }
8
+ onCustomMove(move) {
9
+ if (move.type === CustomMoveType.EndEffect) {
10
+ return new EffectRule(this.game).onEndEffect();
11
+ }
12
+ return [];
13
+ }
14
+ }
@@ -3,6 +3,7 @@ import { cardProperties } from '../material/CardProperties';
3
3
  import { CardType } from '../material/CardType';
4
4
  import { LocationType } from '../material/LocationType';
5
5
  import { MaterialType } from '../material/MaterialType';
6
+ import { OngoingEffectType } from '../material/OngoingEffect';
6
7
  import { Memory } from '../Memory';
7
8
  import { PlayerHelper } from './PlayerHelper';
8
9
  import { RuleId } from './RuleId';
@@ -12,7 +13,9 @@ export class StartPlayerTurnRule extends PlayerTurnRule {
12
13
  this.memorize(Memory.CurrentPlayer, this.player);
13
14
  this.memorize(Memory.CardsPlayed, [], this.player);
14
15
  this.memorize(Memory.ActivatedCards, []);
15
- this.forget(Memory.Suit);
16
+ if (!this.remind(Memory.OngoingEffects).some(e => e.type === OngoingEffectType.LockSuit)) {
17
+ this.forget(Memory.Suit);
18
+ }
16
19
  const actionCards = this.material(MaterialType.Card)
17
20
  .location(LocationType.PlayArea)
18
21
  .player(this.player)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gamepark/skyrift",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "The rules of SkyRift adapted for Game Park",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -30,5 +30,5 @@
30
30
  "es-toolkit": "^1.43.0",
31
31
  "vitest": "^4.0.15"
32
32
  },
33
- "gitHead": "0db12bff770ff3816b402b8eb7151a34c32947f7"
33
+ "gitHead": "78e16066c5404fd72217e96816b3d8e9396e9993"
34
34
  }