@gamepark/mythologies 0.2.0 → 0.3.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 (73) hide show
  1. package/dist/CustomMoveType.d.ts +2 -1
  2. package/dist/CustomMoveType.js +1 -0
  3. package/dist/Memory.d.ts +4 -1
  4. package/dist/Memory.js +3 -0
  5. package/dist/MythologiesRules.d.ts +17 -5
  6. package/dist/MythologiesRules.js +36 -33
  7. package/dist/material/Mythology.js +1 -1
  8. package/dist/material/Pantheon.d.ts +6 -1
  9. package/dist/material/Pantheon.js +61 -25
  10. package/dist/material/entity/Effect.d.ts +21 -8
  11. package/dist/material/entity/Effect.js +34 -3
  12. package/dist/material/entity/EntityDescription.d.ts +0 -2
  13. package/dist/material/entity/EntityDescription.js +1 -7
  14. package/dist/material/entity/MoveEffectRule.d.ts +2 -2
  15. package/dist/material/entity/MoveEffectRule.js +7 -3
  16. package/dist/material/entity/PlaceCardEffectRule.d.ts +2 -2
  17. package/dist/material/entity/PlaceCardEffectRule.js +29 -3
  18. package/dist/material/entity/SacrificeEffectRule.d.ts +1 -1
  19. package/dist/material/entity/SacrificeEffectRule.js +29 -2
  20. package/dist/material/entity/SimultaneousSacrificeEffectRule.d.ts +1 -1
  21. package/dist/material/entity/SimultaneousSacrificeEffectRule.js +29 -2
  22. package/dist/material/entity/chinese/ChangE.js +39 -1
  23. package/dist/material/entity/chinese/Fenghuang.js +8 -1
  24. package/dist/material/entity/chinese/Jiangshi.js +7 -1
  25. package/dist/material/entity/chinese/Mogwai.js +38 -1
  26. package/dist/material/entity/chinese/Nian.js +36 -1
  27. package/dist/material/entity/chinese/Nuwa.js +7 -1
  28. package/dist/material/entity/chinese/Qilin.js +7 -1
  29. package/dist/material/entity/chinese/SunWukong.js +36 -1
  30. package/dist/material/entity/chinese/Tianlong.js +7 -1
  31. package/dist/material/entity/chinese/YanluoWang.js +7 -1
  32. package/dist/material/entity/egyptian/Beetle.js +1 -1
  33. package/dist/material/entity/egyptian/Sphinx.js +1 -1
  34. package/dist/material/entity/greek/Chimera.js +1 -1
  35. package/dist/material/entity/greek/Poseidon.js +3 -3
  36. package/dist/material/entity/norse/Draugr.js +1 -1
  37. package/dist/material/entity/norse/Jotunn.js +3 -2
  38. package/dist/rules/PlaceCardsRule.d.ts +3 -1
  39. package/dist/rules/PlaceCardsRule.js +18 -8
  40. package/dist/rules/PlaceTokenRule.js +3 -1
  41. package/dist/rules/RuleId.d.ts +8 -1
  42. package/dist/rules/RuleId.js +7 -0
  43. package/dist/rules/effects/AlfEffectRule.js +1 -1
  44. package/dist/rules/effects/ChimeraEffectRule.d.ts +1 -0
  45. package/dist/rules/effects/ChimeraEffectRule.js +4 -0
  46. package/dist/rules/effects/CondorEffectRule.d.ts +2 -2
  47. package/dist/rules/effects/CondorEffectRule.js +3 -7
  48. package/dist/rules/effects/DraugrEffectRule.d.ts +2 -1
  49. package/dist/rules/effects/DraugrEffectRule.js +8 -1
  50. package/dist/rules/effects/FenghuangEffectRule.d.ts +8 -0
  51. package/dist/rules/effects/FenghuangEffectRule.js +48 -0
  52. package/dist/rules/effects/HadesEffectRule.js +2 -12
  53. package/dist/rules/effects/JiangshiEffectRule.d.ts +8 -0
  54. package/dist/rules/effects/JiangshiEffectRule.js +76 -0
  55. package/dist/rules/effects/KinnaraEffectRule.js +7 -2
  56. package/dist/rules/effects/NuwaEffectRule.d.ts +12 -0
  57. package/dist/rules/effects/NuwaEffectRule.js +97 -0
  58. package/dist/rules/effects/QilinEffectRule.d.ts +8 -0
  59. package/dist/rules/effects/QilinEffectRule.js +113 -0
  60. package/dist/rules/effects/RaEffectRule.js +2 -12
  61. package/dist/rules/effects/ResolveEffectsRule.d.ts +2 -0
  62. package/dist/rules/effects/ResolveEffectsRule.js +17 -14
  63. package/dist/rules/effects/ShivaEffectRule.d.ts +1 -1
  64. package/dist/rules/effects/ShivaEffectRule.js +5 -2
  65. package/dist/rules/effects/SphinxEffectRule.js +2 -6
  66. package/dist/rules/effects/ThorEffectRule.d.ts +1 -1
  67. package/dist/rules/effects/ThorEffectRule.js +3 -1
  68. package/dist/rules/effects/TianlongEffectRule.d.ts +17 -0
  69. package/dist/rules/effects/TianlongEffectRule.js +148 -0
  70. package/dist/rules/effects/TriggerEffectsRule.js +4 -5
  71. package/dist/rules/effects/YanluoWangEffectRule.d.ts +9 -0
  72. package/dist/rules/effects/YanluoWangEffectRule.js +104 -0
  73. package/package.json +2 -2
@@ -6,7 +6,8 @@ export declare enum CustomMoveType {
6
6
  EndEffect = 5,
7
7
  ChoosePlayer = 6,
8
8
  ChooseMythology = 7,
9
- ChooseLine = 8
9
+ ChooseLine = 8,
10
+ ChooseEntityCard = 9
10
11
  }
11
12
  export type TrialSuccessData = {
12
13
  trial: number;
@@ -11,4 +11,5 @@ var CustomMoveType;
11
11
  CustomMoveType[CustomMoveType["ChoosePlayer"] = 6] = "ChoosePlayer";
12
12
  CustomMoveType[CustomMoveType["ChooseMythology"] = 7] = "ChooseMythology";
13
13
  CustomMoveType[CustomMoveType["ChooseLine"] = 8] = "ChooseLine";
14
+ CustomMoveType[CustomMoveType["ChooseEntityCard"] = 9] = "ChooseEntityCard";
14
15
  })(CustomMoveType = exports.CustomMoveType || (exports.CustomMoveType = {}));
package/dist/Memory.d.ts CHANGED
@@ -11,5 +11,8 @@ export declare enum Memory {
11
11
  AnubisInvoke1 = 12,
12
12
  GarudaSacrificeCount = 13,
13
13
  VetalaCount = 14,
14
- IllapaLine = 15
14
+ IllapaLine = 15,
15
+ YanluoWangCount = 16,
16
+ NuwaPlayerCreatures = 17,
17
+ TianlongVector = 18
15
18
  }
package/dist/Memory.js CHANGED
@@ -16,4 +16,7 @@ var Memory;
16
16
  Memory[Memory["GarudaSacrificeCount"] = 13] = "GarudaSacrificeCount";
17
17
  Memory[Memory["VetalaCount"] = 14] = "VetalaCount";
18
18
  Memory[Memory["IllapaLine"] = 15] = "IllapaLine";
19
+ Memory[Memory["YanluoWangCount"] = 16] = "YanluoWangCount";
20
+ Memory[Memory["NuwaPlayerCreatures"] = 17] = "NuwaPlayerCreatures";
21
+ Memory[Memory["TianlongVector"] = 18] = "TianlongVector";
19
22
  })(Memory = exports.Memory || (exports.Memory = {}));
@@ -16,28 +16,33 @@ import { CobraEffectRule, CobraInvokeEffect } from './rules/effects/CobraEffectR
16
16
  import { CondorEffectRule } from './rules/effects/CondorEffectRule';
17
17
  import { CyclopsEffectRule } from './rules/effects/CyclopsEffectRule';
18
18
  import { DraugrEffectRule } from './rules/effects/DraugrEffectRule';
19
+ import { FenghuangEffectRule } from './rules/effects/FenghuangEffectRule';
19
20
  import { FenrirChoiceRule, FenrirEffectRule } from './rules/effects/FenrirEffectRule';
20
21
  import { GarudaEffectRule } from './rules/effects/GarudaEffectRule';
21
22
  import { GorgonEffectRule } from './rules/effects/GorgonEffectRule';
22
23
  import { GriffinEffectRule } from './rules/effects/GriffinEffectRule';
23
24
  import { HadesEffectRule } from './rules/effects/HadesEffectRule';
24
25
  import { IllapaEffectRule, IllapaSacrificeRule } from './rules/effects/IllapaEffectRule';
26
+ import { JiangshiEffectRule } from './rules/effects/JiangshiEffectRule';
25
27
  import { KinnaraEffectRule, KinnaraPlaceEffectRule } from './rules/effects/KinnaraEffectRule';
26
28
  import { MinotaurEffectRule } from './rules/effects/MinotaurEffectRule';
29
+ import { NuwaEffectRule } from './rules/effects/NuwaEffectRule';
27
30
  import { OdinEffectRule } from './rules/effects/OdinEffectRule';
31
+ import { QilinEffectRule } from './rules/effects/QilinEffectRule';
28
32
  import { RakshasaEffectRule } from './rules/effects/RakshasaEffectRule';
29
33
  import { ResolveEffectsRule } from './rules/effects/ResolveEffectsRule';
30
34
  import { ShivaEffectRule } from './rules/effects/ShivaEffectRule';
31
35
  import { SphinxEffectRule } from './rules/effects/SphinxEffectRule';
32
36
  import { SupayEffectRule } from './rules/effects/SupayEffectRule';
33
37
  import { ThorEffectRule } from './rules/effects/ThorEffectRule';
38
+ import { TianlongEffectRule, TianlongOpponentsEffectRule } from './rules/effects/TianlongEffectRule';
34
39
  import { UkukuEffectRule, UkukuPlaceEffectRule } from './rules/effects/UkukuEffectRule';
35
40
  import { VetalaEffectRule } from './rules/effects/VetalaEffectRule';
36
41
  import { ViracochaEffectRule } from './rules/effects/ViracochaEffectRule';
42
+ import { YanluoWangEffectRule } from './rules/effects/YanluoWangEffectRule';
37
43
  import { EndGameRule } from './rules/EndGameRule';
38
44
  import { PlaceCardsRule } from './rules/PlaceCardsRule';
39
45
  import { PlaceTokenRule } from './rules/PlaceTokenRule';
40
- import { RuleId } from './rules/RuleId';
41
46
  import { UpkeepRule } from './rules/UpkeepRule';
42
47
  export declare class MythologiesRules extends SecretMaterialRules<PlayerColor, MaterialType, LocationType> implements TimeLimit<MaterialGame<PlayerColor, MaterialType, LocationType>, MaterialMove<PlayerColor, MaterialType, LocationType>, PlayerColor>, CompetitiveScore {
43
48
  rules: {
@@ -83,6 +88,13 @@ export declare class MythologiesRules extends SecretMaterialRules<PlayerColor, M
83
88
  43: typeof SupayEffectRule;
84
89
  44: typeof UkukuEffectRule;
85
90
  45: typeof UkukuPlaceEffectRule;
91
+ 46: typeof YanluoWangEffectRule;
92
+ 47: typeof NuwaEffectRule;
93
+ 48: typeof TianlongEffectRule;
94
+ 49: typeof TianlongOpponentsEffectRule;
95
+ 50: typeof QilinEffectRule;
96
+ 51: typeof FenghuangEffectRule;
97
+ 52: typeof JiangshiEffectRule;
86
98
  };
87
99
  locationsStrategies: {
88
100
  2: {
@@ -116,10 +128,10 @@ export declare class MythologiesRules extends SecretMaterialRules<PlayerColor, M
116
128
  };
117
129
  };
118
130
  keepMoveSecret(move: MaterialMove): boolean;
119
- beforeItemMove(move: ItemMove): MaterialMove<number, number, number, number>[];
120
- protected onCustomMove(move: CustomMove): import("@gamepark/rules-api").EndGame[] | import("@gamepark/rules-api").StartPlayerTurn<PlayerColor, RuleId.ResolveEffects>[] | (import("@gamepark/rules-api").StartPlayerTurn<number, RuleId.PlaceCards> | import("@gamepark/rules-api").StartRule<RuleId.PlaceCards>)[];
121
- getAutomaticMoves(): import("@gamepark/rules-api").StartPlayerTurn<PlayerColor, RuleId.ResolveEffects>[];
122
- startEffectsResolution(): import("@gamepark/rules-api").StartPlayerTurn<PlayerColor, RuleId.ResolveEffects>[];
131
+ beforeItemMove(move: ItemMove): never[];
132
+ protected onCustomMove(move: CustomMove): MaterialMove<number, number, number, number>[];
133
+ getAutomaticMoves(): MaterialMove<number, number, number, number>[];
134
+ startEffectsResolution(): MaterialMove<number, number, number, number>[];
123
135
  giveTime(): number;
124
136
  getScore(player: PlayerColor): number;
125
137
  getTieBreaker(tieBreaker: number, player: PlayerColor): number | undefined;
@@ -38,25 +38,31 @@ var CobraEffectRule_1 = require("./rules/effects/CobraEffectRule");
38
38
  var CondorEffectRule_1 = require("./rules/effects/CondorEffectRule");
39
39
  var CyclopsEffectRule_1 = require("./rules/effects/CyclopsEffectRule");
40
40
  var DraugrEffectRule_1 = require("./rules/effects/DraugrEffectRule");
41
+ var FenghuangEffectRule_1 = require("./rules/effects/FenghuangEffectRule");
41
42
  var FenrirEffectRule_1 = require("./rules/effects/FenrirEffectRule");
42
43
  var GarudaEffectRule_1 = require("./rules/effects/GarudaEffectRule");
43
44
  var GorgonEffectRule_1 = require("./rules/effects/GorgonEffectRule");
44
45
  var GriffinEffectRule_1 = require("./rules/effects/GriffinEffectRule");
45
46
  var HadesEffectRule_1 = require("./rules/effects/HadesEffectRule");
46
47
  var IllapaEffectRule_1 = require("./rules/effects/IllapaEffectRule");
48
+ var JiangshiEffectRule_1 = require("./rules/effects/JiangshiEffectRule");
47
49
  var KinnaraEffectRule_1 = require("./rules/effects/KinnaraEffectRule");
48
50
  var MinotaurEffectRule_1 = require("./rules/effects/MinotaurEffectRule");
51
+ var NuwaEffectRule_1 = require("./rules/effects/NuwaEffectRule");
49
52
  var OdinEffectRule_1 = require("./rules/effects/OdinEffectRule");
53
+ var QilinEffectRule_1 = require("./rules/effects/QilinEffectRule");
50
54
  var RakshasaEffectRule_1 = require("./rules/effects/RakshasaEffectRule");
51
55
  var ResolveEffectsRule_1 = require("./rules/effects/ResolveEffectsRule");
52
56
  var ShivaEffectRule_1 = require("./rules/effects/ShivaEffectRule");
53
57
  var SphinxEffectRule_1 = require("./rules/effects/SphinxEffectRule");
54
58
  var SupayEffectRule_1 = require("./rules/effects/SupayEffectRule");
55
59
  var ThorEffectRule_1 = require("./rules/effects/ThorEffectRule");
60
+ var TianlongEffectRule_1 = require("./rules/effects/TianlongEffectRule");
56
61
  var TriggerEffectsRule_1 = require("./rules/effects/TriggerEffectsRule");
57
62
  var UkukuEffectRule_1 = require("./rules/effects/UkukuEffectRule");
58
63
  var VetalaEffectRule_1 = require("./rules/effects/VetalaEffectRule");
59
64
  var ViracochaEffectRule_1 = require("./rules/effects/ViracochaEffectRule");
65
+ var YanluoWangEffectRule_1 = require("./rules/effects/YanluoWangEffectRule");
60
66
  var EndGameRule_1 = require("./rules/EndGameRule");
61
67
  var PlaceCardsRule_1 = require("./rules/PlaceCardsRule");
62
68
  var PlaceTokenRule_1 = require("./rules/PlaceTokenRule");
@@ -110,6 +116,13 @@ var MythologiesRules = (function (_super) {
110
116
  _a[RuleId_1.RuleId.SupayEffect] = SupayEffectRule_1.SupayEffectRule,
111
117
  _a[RuleId_1.RuleId.UkukuEffect] = UkukuEffectRule_1.UkukuEffectRule,
112
118
  _a[RuleId_1.RuleId.UkukuPlaceEffect] = UkukuEffectRule_1.UkukuPlaceEffectRule,
119
+ _a[RuleId_1.RuleId.YanluoWangEffect] = YanluoWangEffectRule_1.YanluoWangEffectRule,
120
+ _a[RuleId_1.RuleId.NuwaEffect] = NuwaEffectRule_1.NuwaEffectRule,
121
+ _a[RuleId_1.RuleId.TianlongEffect] = TianlongEffectRule_1.TianlongEffectRule,
122
+ _a[RuleId_1.RuleId.TianlongOpponentsEffect] = TianlongEffectRule_1.TianlongOpponentsEffectRule,
123
+ _a[RuleId_1.RuleId.QilinEffect] = QilinEffectRule_1.QilinEffectRule,
124
+ _a[RuleId_1.RuleId.FenghuangEffect] = FenghuangEffectRule_1.FenghuangEffectRule,
125
+ _a[RuleId_1.RuleId.JiangshiEffect] = JiangshiEffectRule_1.JiangshiEffectRule,
113
126
  _a);
114
127
  _this.locationsStrategies = (_b = {},
115
128
  _b[MaterialType_1.MaterialType.EntityCard] = (_c = {},
@@ -146,34 +159,12 @@ var MythologiesRules = (function (_super) {
146
159
  }
147
160
  MythologiesRules.prototype.keepMoveSecret = function (move) {
148
161
  return ((0, rules_api_1.isMoveItemType)(MaterialType_1.MaterialType.DraftToken)(move) &&
162
+ move.location.type === LocationType_1.LocationType.OnEntityCard &&
149
163
  this.remind(Memory_1.Memory.KeepTokenPlaceSecret, this.material(MaterialType_1.MaterialType.DraftToken).getItem(move.itemIndex).id.back) === true);
150
164
  };
151
165
  MythologiesRules.prototype.beforeItemMove = function (move) {
152
- var _a;
153
- if ((0, rules_api_1.isMoveItemType)(MaterialType_1.MaterialType.EntityCard)(move)) {
154
- if (move.location.type === LocationType_1.LocationType.Pantheon) {
155
- var location = this.material(MaterialType_1.MaterialType.EntityCard).getItem(move.itemIndex).location;
156
- if (location.type !== LocationType_1.LocationType.Pantheon && location.type !== LocationType_1.LocationType.PlayerBufferArea) {
157
- return new Pantheon_1.Pantheon(this.game, move.location.player).onCardPlaced(move);
158
- }
159
- }
160
- else if (move.location.type === LocationType_1.LocationType.PlayerDiscard) {
161
- var card = this.material(MaterialType_1.MaterialType.EntityCard).index(move.itemIndex);
162
- var location = card.getItem().location;
163
- if (location.type === LocationType_1.LocationType.Pantheon) {
164
- return new Pantheon_1.Pantheon(this.game, location.player).onEntitySacrificed(card);
165
- }
166
- }
167
- }
168
- if ((0, rules_api_1.isMoveItemTypeAtOnce)(MaterialType_1.MaterialType.EntityCard)(move)) {
169
- if (move.location.type === LocationType_1.LocationType.PlayerDiscard) {
170
- var pile = this.material(MaterialType_1.MaterialType.EntityCard).index(move.indexes);
171
- if (((_a = pile.getItem()) === null || _a === void 0 ? void 0 : _a.location.type) === LocationType_1.LocationType.Pantheon) {
172
- var topCard = pile.maxBy(function (item) { return item.location.z; });
173
- return new Pantheon_1.Pantheon(this.game, topCard.getItem().location.player).onEntitySacrificed(topCard);
174
- }
175
- }
176
- }
166
+ if (!this.game.rule)
167
+ return [];
177
168
  if ((0, rules_api_1.isMoveItemType)(MaterialType_1.MaterialType.GemToken)(move) && move.location.type === LocationType_1.LocationType.PlayerGems) {
178
169
  var gem = this.material(MaterialType_1.MaterialType.GemToken).getItem(move.itemIndex).location;
179
170
  var player = gem.player;
@@ -198,13 +189,16 @@ var MythologiesRules = (function (_super) {
198
189
  return this.startEffectsResolution();
199
190
  }
200
191
  else {
201
- var _b = this.remind(Memory_1.Memory.PendingRule), id = _b.id, player = _b.player;
202
- this.forget(Memory_1.Memory.PendingRule);
203
- switch (id) {
204
- case RuleId_1.RuleId.EndGame:
205
- return [this.endGame()];
206
- default:
207
- return [player === ((_a = this.game.rule) === null || _a === void 0 ? void 0 : _a.player) ? this.startRule(RuleId_1.RuleId.PlaceCards) : this.startPlayerTurn(RuleId_1.RuleId.PlaceCards, player)];
192
+ var pendingRule = this.remind(Memory_1.Memory.PendingRule);
193
+ if (pendingRule) {
194
+ var id = pendingRule.id, player = pendingRule.player;
195
+ this.forget(Memory_1.Memory.PendingRule);
196
+ switch (id) {
197
+ case RuleId_1.RuleId.EndGame:
198
+ return [this.endGame()];
199
+ default:
200
+ return [player === ((_a = this.game.rule) === null || _a === void 0 ? void 0 : _a.player) ? this.startRule(RuleId_1.RuleId.PlaceCards) : this.startPlayerTurn(RuleId_1.RuleId.PlaceCards, player)];
201
+ }
208
202
  }
209
203
  }
210
204
  }
@@ -218,7 +212,16 @@ var MythologiesRules = (function (_super) {
218
212
  return [];
219
213
  };
220
214
  MythologiesRules.prototype.startEffectsResolution = function () {
221
- var cardIndex = this.remind(Memory_1.Memory.PendingEffects)[0][0].cardIndex;
215
+ var pendingEffects = this.remind(Memory_1.Memory.PendingEffects)[0];
216
+ var autoEffectIndex = pendingEffects.findIndex(function (effect) { return effect.auto; });
217
+ if (autoEffectIndex !== -1) {
218
+ var autoEffect = pendingEffects.splice(autoEffectIndex, 1)[0];
219
+ if (pendingEffects.length === 0) {
220
+ this.remind(Memory_1.Memory.PendingEffects).shift();
221
+ }
222
+ return new ResolveEffectsRule_1.ResolveEffectsRule(this.game).playEffect(autoEffect);
223
+ }
224
+ var cardIndex = pendingEffects[0].cardIndex;
222
225
  var player = this.material(MaterialType_1.MaterialType.EntityCard).getItem(cardIndex).location.player;
223
226
  return [this.startPlayerTurn(RuleId_1.RuleId.ResolveEffects, player)];
224
227
  };
@@ -13,7 +13,7 @@ var Mythology;
13
13
  Mythology[Mythology["Zulu"] = 6] = "Zulu";
14
14
  Mythology[Mythology["Celtic"] = 7] = "Celtic";
15
15
  })(Mythology = exports.Mythology || (exports.Mythology = {}));
16
- exports.availableMythologies = (0, rules_api_1.getEnumValues)(Mythology).filter(function (mythology) { return mythology < 5; });
16
+ exports.availableMythologies = (0, rules_api_1.getEnumValues)(Mythology).filter(function (mythology) { return mythology < 6; });
17
17
  var SanctuarySide;
18
18
  (function (SanctuarySide) {
19
19
  SanctuarySide[SanctuarySide["Left"] = 0] = "Left";
@@ -8,6 +8,7 @@ export declare class Pantheon extends MaterialRulesPart {
8
8
  get visibleEntities(): Material<number, number, number>;
9
9
  get coveredEntities(): Material<number, number, number>;
10
10
  get grid(): (Entity | undefined)[][];
11
+ private get indexGrid();
11
12
  get legalSpacesToInvoke(): XYCoordinates[];
12
13
  isLegalSpaceToInvoke(space: XYCoordinates): boolean;
13
14
  getOpponentsWithTrollAt({ x, y }: XYCoordinates): PlayerColor[];
@@ -23,8 +24,11 @@ export declare class Pantheon extends MaterialRulesPart {
23
24
  loseFavor(quantity?: number): import("@gamepark/rules-api").DeleteItem<number>;
24
25
  onCardPlaced(move: MoveItem): MaterialMove<number, number, number, number>[];
25
26
  get isInvoke(): boolean;
26
- updateGrid(grid?: (Entity | undefined)[][]): MaterialMove<number, number, number, number>[];
27
+ updateGrid(gridAfter?: (number | null)[][]): MaterialMove<number, number, number, number>[];
28
+ private entityMoved;
27
29
  private gainBonus;
30
+ gainLineBonus(y: number): MoveItem<number, number, number>[];
31
+ gainColumnBonus(x: number): MoveItem<number, number, number>[];
28
32
  getBonusGem(y: number): Material<number, number, number>;
29
33
  getBonusFavor(x: number): Material<number, number, number>;
30
34
  onInvoke(move: MoveItem): MaterialMove<number, number, number, number>[];
@@ -35,4 +39,5 @@ export declare class Pantheon extends MaterialRulesPart {
35
39
  get mythologies(): import("./Mythology").Mythology[];
36
40
  get missingMythologies(): import("./Mythology").Mythology[];
37
41
  onEntitySacrificed(card: Material): MaterialMove<number, number, number, number>[];
42
+ hasCrushed(card: MaterialItem): boolean;
38
43
  }
@@ -106,6 +106,19 @@ var Pantheon = (function (_super) {
106
106
  enumerable: false,
107
107
  configurable: true
108
108
  });
109
+ Object.defineProperty(Pantheon.prototype, "indexGrid", {
110
+ get: function () {
111
+ var visibleEntities = this.visibleEntities;
112
+ return (0, lodash_1.range)(0, 3).map(function (y) {
113
+ return (0, lodash_1.range)(0, 3).map(function (x) {
114
+ var entity = visibleEntities.location(function (l) { return l.x === x && l.y === y; });
115
+ return entity.length > 0 ? entity.getIndex() : null;
116
+ });
117
+ });
118
+ },
119
+ enumerable: false,
120
+ configurable: true
121
+ });
109
122
  Object.defineProperty(Pantheon.prototype, "legalSpacesToInvoke", {
110
123
  get: function () {
111
124
  var _this = this;
@@ -182,27 +195,28 @@ var Pantheon = (function (_super) {
182
195
  return this.material(MaterialType_1.MaterialType.FavorToken).location(LocationType_1.LocationType.PlayerFavor).player(this.player).deleteItem(quantity);
183
196
  };
184
197
  Pantheon.prototype.onCardPlaced = function (move) {
198
+ var _a, _b;
185
199
  var moves = [];
186
200
  var location = move.location;
187
201
  var card = this.material(MaterialType_1.MaterialType.EntityCard).index(move.itemIndex);
188
202
  var cardItem = card.getItem();
189
- var entity = cardItem.id.front;
203
+ var entity = (_a = cardItem.id.front) !== null && _a !== void 0 ? _a : ((_b = move.reveal) === null || _b === void 0 ? void 0 : _b.id).front;
190
204
  if ((0, Entity_1.isGod)(entity)) {
191
205
  moves.push(this.spendGems(4));
192
206
  }
193
- var grid = this.grid;
194
- grid[move.location.y][move.location.x] = entity;
207
+ var grid = this.indexGrid;
208
+ grid[move.location.y][move.location.x] = move.itemIndex;
195
209
  moves.push.apply(moves, __spreadArray([], __read(this.updateGrid(grid)), false));
196
210
  var triggerEffectsRule = new TriggerEffectsRule_1.TriggerEffectsRule(this.game);
197
211
  var crushed = this.allCards.location(function (l) { return l.x === move.location.x && l.y === move.location.y; }).maxBy(function (item) { return item.location.z; });
198
- triggerEffectsRule.triggerCardEffect(card, { type: Effect_1.TriggerEventType.SelfPlaced, location: location, crush: crushed.length > 0 });
212
+ triggerEffectsRule.triggerCardEffect(card, { type: Effect_1.TriggerEventType.SelfPlaced, location: location });
199
213
  var invoke = this.isInvoke;
200
214
  if (invoke) {
201
215
  moves.push.apply(moves, __spreadArray([], __read(this.onInvoke(move)), false));
202
216
  }
203
217
  var triggerEvents = [];
204
218
  if (invoke) {
205
- triggerEvents.push({ type: Effect_1.TriggerEventType.EntityInvoked, card: cardItem, cardIndex: move.itemIndex });
219
+ triggerEvents.push({ type: Effect_1.TriggerEventType.EntityInvoked, cardIndex: move.itemIndex, entity: entity, cardLocation: location });
206
220
  }
207
221
  if (crushed.length) {
208
222
  triggerEvents.push({ type: Effect_1.TriggerEventType.EntityCrushed, card: crushed.getItem(), cardIndex: crushed.getIndex() });
@@ -219,12 +233,14 @@ var Pantheon = (function (_super) {
219
233
  enumerable: false,
220
234
  configurable: true
221
235
  });
222
- Pantheon.prototype.updateGrid = function (grid) {
236
+ Pantheon.prototype.updateGrid = function (gridAfter) {
223
237
  var _a;
224
- if (grid === void 0) { grid = this.grid; }
225
- var gridBefore = (_a = this.remind(Memory_1.Memory.PlayerGrid, this.player)) !== null && _a !== void 0 ? _a : this.grid.map(function (line) { return line.map(function () { return null; }); });
226
- var gridAfter = grid.map(function (line) { return line.map(function (item) { return item !== null && item !== void 0 ? item : null; }); });
238
+ if (gridAfter === void 0) { gridAfter = this.indexGrid; }
239
+ var gridBefore = (_a = this.remind(Memory_1.Memory.PlayerGrid, this.player)) !== null && _a !== void 0 ? _a : this.indexGrid;
227
240
  this.memorize(Memory_1.Memory.PlayerGrid, gridAfter, this.player);
241
+ if (this.entityMoved(gridBefore, gridAfter)) {
242
+ new TriggerEffectsRule_1.TriggerEffectsRule(this.game).triggerEffects({ type: Effect_1.TriggerEventType.EntityMoved, player: this.player });
243
+ }
228
244
  for (var y = 0; y < 3; y++) {
229
245
  if (gridBefore[y].some(function (item) { return item === null; }) && gridAfter[y].every(function (item) { return item !== null; })) {
230
246
  new TriggerEffectsRule_1.TriggerEffectsRule(this.game).triggerEffects({ type: Effect_1.TriggerEventType.LineEvent, eventType: Effect_1.LineEventType.Completed, player: this.player, y: y });
@@ -239,20 +255,32 @@ var Pantheon = (function (_super) {
239
255
  for (var x = 0; x < 3; x++) {
240
256
  _loop_1(x);
241
257
  }
242
- return this.gainBonus(grid);
258
+ return this.gainBonus(gridAfter);
259
+ };
260
+ Pantheon.prototype.entityMoved = function (before, after) {
261
+ for (var y = 0; y < 3; y++) {
262
+ var _loop_2 = function (x) {
263
+ var cardIndex = before[y][x];
264
+ if (cardIndex !== null && cardIndex !== after[y][x] && after.some(function (line) { return line.includes(cardIndex); })) {
265
+ return { value: true };
266
+ }
267
+ };
268
+ for (var x = 0; x < 3; x++) {
269
+ var state_1 = _loop_2(x);
270
+ if (typeof state_1 === "object")
271
+ return state_1.value;
272
+ }
273
+ }
274
+ return false;
243
275
  };
244
276
  Pantheon.prototype.gainBonus = function (grid) {
245
277
  var e_1, _a, e_2, _b;
246
- if (grid === void 0) { grid = this.grid; }
247
278
  var moves = [];
248
- var fullLines = (0, lodash_1.range)(0, 3).filter(function (y) { return !grid[y].includes(undefined); });
279
+ var fullLines = (0, lodash_1.range)(0, 3).filter(function (y) { return !grid[y].includes(null); });
249
280
  try {
250
281
  for (var fullLines_1 = __values(fullLines), fullLines_1_1 = fullLines_1.next(); !fullLines_1_1.done; fullLines_1_1 = fullLines_1.next()) {
251
282
  var y = fullLines_1_1.value;
252
- var bonusGem = this.getBonusGem(y);
253
- if (bonusGem.length) {
254
- moves.push(bonusGem.moveItem({ type: LocationType_1.LocationType.PlayerGems, player: this.player }));
255
- }
283
+ moves.push.apply(moves, __spreadArray([], __read(this.gainLineBonus(y)), false));
256
284
  }
257
285
  }
258
286
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -262,14 +290,11 @@ var Pantheon = (function (_super) {
262
290
  }
263
291
  finally { if (e_1) throw e_1.error; }
264
292
  }
265
- var fullColumns = (0, lodash_1.range)(0, 3).filter(function (x) { return grid.every(function (line) { return line[x] !== undefined; }); });
293
+ var fullColumns = (0, lodash_1.range)(0, 3).filter(function (x) { return grid.every(function (line) { return line[x] !== null; }); });
266
294
  try {
267
295
  for (var fullColumns_1 = __values(fullColumns), fullColumns_1_1 = fullColumns_1.next(); !fullColumns_1_1.done; fullColumns_1_1 = fullColumns_1.next()) {
268
296
  var x = fullColumns_1_1.value;
269
- var bonusFavor = this.getBonusFavor(x);
270
- if (bonusFavor.length) {
271
- moves.push(bonusFavor.moveItem({ type: LocationType_1.LocationType.PlayerFavor, player: this.player }));
272
- }
297
+ moves.push.apply(moves, __spreadArray([], __read(this.gainColumnBonus(x)), false));
273
298
  }
274
299
  }
275
300
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
@@ -281,6 +306,14 @@ var Pantheon = (function (_super) {
281
306
  }
282
307
  return moves;
283
308
  };
309
+ Pantheon.prototype.gainLineBonus = function (y) {
310
+ var bonusGem = this.getBonusGem(y);
311
+ return bonusGem.length ? [bonusGem.moveItem({ type: LocationType_1.LocationType.PlayerGems, player: this.player })] : [];
312
+ };
313
+ Pantheon.prototype.gainColumnBonus = function (x) {
314
+ var bonusFavor = this.getBonusFavor(x);
315
+ return bonusFavor.length ? [bonusFavor.moveItem({ type: LocationType_1.LocationType.PlayerFavor, player: this.player })] : [];
316
+ };
284
317
  Pantheon.prototype.getBonusGem = function (y) {
285
318
  return this.material(MaterialType_1.MaterialType.GemToken)
286
319
  .location(LocationType_1.LocationType.PantheonLineBonus)
@@ -337,8 +370,8 @@ var Pantheon = (function (_super) {
337
370
  var piles = [];
338
371
  var myEntities = this.material(MaterialType_1.MaterialType.EntityCard).player(this.player);
339
372
  var fullPantheon = myEntities.location(LocationType_1.LocationType.Pantheon);
340
- var _loop_2 = function (x) {
341
- var _loop_3 = function (y) {
373
+ var _loop_3 = function (x) {
374
+ var _loop_4 = function (y) {
342
375
  if (predicate({ x: x, y: y })) {
343
376
  var pile = fullPantheon.location(function (l) { return l.x === x && l.y === y; }).sort(function (item) { return item.location.z; });
344
377
  if (pile.length > 0) {
@@ -347,11 +380,11 @@ var Pantheon = (function (_super) {
347
380
  }
348
381
  };
349
382
  for (var y = 0; y < 3; y++) {
350
- _loop_3(y);
383
+ _loop_4(y);
351
384
  }
352
385
  };
353
386
  for (var x = 0; x < 3; x++) {
354
- _loop_2(x);
387
+ _loop_3(x);
355
388
  }
356
389
  return piles;
357
390
  };
@@ -379,6 +412,9 @@ var Pantheon = (function (_super) {
379
412
  new TriggerEffectsRule_1.TriggerEffectsRule(this.game).triggerEffects({ type: Effect_1.TriggerEventType.EntitySacrificed, card: card.getItem(), cardIndex: card.getIndex() });
380
413
  return this.updateGrid();
381
414
  };
415
+ Pantheon.prototype.hasCrushed = function (card) {
416
+ return this.allCards.location(function (l) { return l.x === card.location.x && l.y === card.location.y && l.z < card.location.z; }).length > 0;
417
+ };
382
418
  return Pantheon;
383
419
  }(rules_api_1.MaterialRulesPart));
384
420
  exports.Pantheon = Pantheon;
@@ -1,12 +1,13 @@
1
- import { Location, Material, MaterialGame, MaterialItem, MaterialMove, PlayerTurnRule, SimultaneousRule } from '@gamepark/rules-api';
1
+ import { Location, Material, MaterialGame, MaterialItem, MaterialMove, MaterialRulesPart, PlayerTurnRule, SimultaneousRule } from '@gamepark/rules-api';
2
2
  import { PlayerColor } from '../../PlayerColor';
3
3
  import { RuleId } from '../../rules/RuleId';
4
- import { EntityId } from '../Entity';
4
+ import { Entity, EntityId } from '../Entity';
5
5
  import { LocationType } from '../LocationType';
6
6
  import { MaterialType } from '../MaterialType';
7
7
  export type Effect = {
8
8
  trigger: (event: TriggerEvent, card: Material, game: MaterialGame) => boolean;
9
9
  rule: new (game: MaterialGame) => EffectRule;
10
+ auto?: boolean;
10
11
  };
11
12
  interface EffectRule {
12
13
  canPlayEffect(cardIndex: number): boolean;
@@ -31,6 +32,13 @@ export declare abstract class SimultaneousEffectRule extends SimultaneousRule im
31
32
  getEffect<Event extends TriggerEvent>(): PendingEffect<Event>;
32
33
  getMovesAfterPlayersDone(): MaterialMove[];
33
34
  }
35
+ export declare abstract class AutoEffectRule extends MaterialRulesPart implements EffectRule {
36
+ canPlayEffect: () => boolean;
37
+ abstract playEffect(): MaterialMove[];
38
+ getEffect<Event extends TriggerEvent>(): PendingEffect<Event>;
39
+ get card(): MaterialItem<number, number, EntityId>;
40
+ get player(): PlayerColor;
41
+ }
34
42
  export declare enum TriggerEventType {
35
43
  EndOfGame = 1,
36
44
  SelfPlaced = 2,
@@ -39,12 +47,12 @@ export declare enum TriggerEventType {
39
47
  ColumnEvent = 5,
40
48
  Infinite = 6,
41
49
  EntityCrushed = 7,
42
- EntitySacrificed = 8
50
+ EntitySacrificed = 8,
51
+ EntityMoved = 9
43
52
  }
44
53
  export type SelfPlaced = {
45
54
  type: TriggerEventType.SelfPlaced;
46
55
  location: Location;
47
- crush: boolean;
48
56
  };
49
57
  export declare const isPlaced: (event: TriggerEvent) => event is SelfPlaced;
50
58
  export type EndOfGameEvent = {
@@ -53,8 +61,9 @@ export type EndOfGameEvent = {
53
61
  export declare const isEndOfGame: (event: TriggerEvent) => event is EndOfGameEvent;
54
62
  export type EntityInvoked = {
55
63
  type: TriggerEventType.EntityInvoked;
56
- card: MaterialItem<MaterialType, LocationType, EntityId>;
57
64
  cardIndex: number;
65
+ entity: Entity;
66
+ cardLocation: Location;
58
67
  };
59
68
  export declare enum LineEventType {
60
69
  BonusGain = 1,
@@ -76,7 +85,6 @@ export type Infinite = {
76
85
  type: TriggerEventType.Infinite;
77
86
  };
78
87
  export declare const oncePerTurn: (event: TriggerEvent) => event is Infinite;
79
- export declare const isPlacedCrush: (event: TriggerEvent) => event is SelfPlaced;
80
88
  export type EntityCrushed = {
81
89
  type: TriggerEventType.EntityCrushed;
82
90
  card: MaterialItem<MaterialType, LocationType, EntityId>;
@@ -88,10 +96,15 @@ export type EntitySacrificed = {
88
96
  card: MaterialItem<MaterialType, LocationType, EntityId>;
89
97
  cardIndex: number;
90
98
  };
91
- export type TriggerEvent = EndOfGameEvent | SelfPlaced | EntityInvoked | LineEvent | ColumnEvent | Infinite | EntityCrushed | EntitySacrificed;
99
+ export declare const isSacrificed: (event: TriggerEvent, card: Material) => event is EntityCrushed;
100
+ export type EntityMoved = {
101
+ type: TriggerEventType.EntityMoved;
102
+ player: PlayerColor;
103
+ };
104
+ export type TriggerEvent = EndOfGameEvent | SelfPlaced | EntityInvoked | LineEvent | ColumnEvent | Infinite | EntityCrushed | EntitySacrificed | EntityMoved;
92
105
  export type PendingEffect<Event extends TriggerEvent = TriggerEvent> = {
93
106
  cardIndex: number;
94
- effectIndex: number;
95
107
  triggerEvent: Event;
108
+ auto: boolean;
96
109
  };
97
110
  export {};
@@ -15,7 +15,7 @@ var __extends = (this && this.__extends) || (function () {
15
15
  };
16
16
  })();
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.isCrushed = exports.isPlacedCrush = exports.oncePerTurn = exports.LineEventType = exports.isEndOfGame = exports.isPlaced = exports.TriggerEventType = exports.SimultaneousEffectRule = exports.PlayerEffectRule = void 0;
18
+ exports.isSacrificed = exports.isCrushed = exports.oncePerTurn = exports.LineEventType = exports.isEndOfGame = exports.isPlaced = exports.TriggerEventType = exports.AutoEffectRule = exports.SimultaneousEffectRule = exports.PlayerEffectRule = void 0;
19
19
  var rules_api_1 = require("@gamepark/rules-api");
20
20
  var CustomMoveType_1 = require("../../CustomMoveType");
21
21
  var Memory_1 = require("../../Memory");
@@ -90,6 +90,34 @@ var SimultaneousEffectRule = (function (_super) {
90
90
  return SimultaneousEffectRule;
91
91
  }(rules_api_1.SimultaneousRule));
92
92
  exports.SimultaneousEffectRule = SimultaneousEffectRule;
93
+ var AutoEffectRule = (function (_super) {
94
+ __extends(AutoEffectRule, _super);
95
+ function AutoEffectRule() {
96
+ var _this = _super !== null && _super.apply(this, arguments) || this;
97
+ _this.canPlayEffect = function () { return true; };
98
+ return _this;
99
+ }
100
+ AutoEffectRule.prototype.getEffect = function () {
101
+ return this.remind(Memory_1.Memory.OngoingEffect);
102
+ };
103
+ Object.defineProperty(AutoEffectRule.prototype, "card", {
104
+ get: function () {
105
+ var index = this.getEffect().cardIndex;
106
+ return this.material(MaterialType_1.MaterialType.EntityCard).getItem(index);
107
+ },
108
+ enumerable: false,
109
+ configurable: true
110
+ });
111
+ Object.defineProperty(AutoEffectRule.prototype, "player", {
112
+ get: function () {
113
+ return this.card.location.player;
114
+ },
115
+ enumerable: false,
116
+ configurable: true
117
+ });
118
+ return AutoEffectRule;
119
+ }(rules_api_1.MaterialRulesPart));
120
+ exports.AutoEffectRule = AutoEffectRule;
93
121
  var TriggerEventType;
94
122
  (function (TriggerEventType) {
95
123
  TriggerEventType[TriggerEventType["EndOfGame"] = 1] = "EndOfGame";
@@ -100,6 +128,7 @@ var TriggerEventType;
100
128
  TriggerEventType[TriggerEventType["Infinite"] = 6] = "Infinite";
101
129
  TriggerEventType[TriggerEventType["EntityCrushed"] = 7] = "EntityCrushed";
102
130
  TriggerEventType[TriggerEventType["EntitySacrificed"] = 8] = "EntitySacrificed";
131
+ TriggerEventType[TriggerEventType["EntityMoved"] = 9] = "EntityMoved";
103
132
  })(TriggerEventType = exports.TriggerEventType || (exports.TriggerEventType = {}));
104
133
  var isPlaced = function (event) { return event.type === TriggerEventType.SelfPlaced; };
105
134
  exports.isPlaced = isPlaced;
@@ -112,9 +141,11 @@ var LineEventType;
112
141
  })(LineEventType = exports.LineEventType || (exports.LineEventType = {}));
113
142
  var oncePerTurn = function (event) { return event.type === TriggerEventType.Infinite; };
114
143
  exports.oncePerTurn = oncePerTurn;
115
- var isPlacedCrush = function (event) { return (0, exports.isPlaced)(event) && event.crush; };
116
- exports.isPlacedCrush = isPlacedCrush;
117
144
  var isCrushed = function (event, card) {
118
145
  return event.type === TriggerEventType.EntityCrushed && event.cardIndex === card.getIndex();
119
146
  };
120
147
  exports.isCrushed = isCrushed;
148
+ var isSacrificed = function (event, card) {
149
+ return event.type === TriggerEventType.EntitySacrificed && event.cardIndex === card.getIndex();
150
+ };
151
+ exports.isSacrificed = isSacrificed;
@@ -3,11 +3,9 @@ import { Effect } from './Effect';
3
3
  export type EntityDescription = {
4
4
  invoke: [InvokeGain, InvokeGain, InvokeGain];
5
5
  effect?: Effect;
6
- effects?: Effect[];
7
6
  };
8
7
  export type InvokeGain = {
9
8
  gem?: number;
10
9
  favor?: number;
11
10
  };
12
- export declare function getEffects(entity: Entity): Effect[];
13
11
  export declare const entities: Record<Entity, EntityDescription>;
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  var _a;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.entities = exports.getEffects = void 0;
4
+ exports.entities = void 0;
5
5
  var Entity_1 = require("../Entity");
6
6
  var Banshee_1 = require("./celtic/Banshee");
7
7
  var Brigid_1 = require("./celtic/Brigid");
@@ -83,12 +83,6 @@ var Umvelinqangi_1 = require("./zulu/Umvelinqangi");
83
83
  var Unkulunkulu_1 = require("./zulu/Unkulunkulu");
84
84
  var Unwabu_1 = require("./zulu/Unwabu");
85
85
  var Werehyena_1 = require("./zulu/Werehyena");
86
- function getEffects(entity) {
87
- var _a;
88
- var description = exports.entities[entity];
89
- return (_a = description.effects) !== null && _a !== void 0 ? _a : (description.effect ? [description.effect] : []);
90
- }
91
- exports.getEffects = getEffects;
92
86
  exports.entities = (_a = {},
93
87
  _a[Entity_1.Entity.Zeus] = Zeus_1.Zeus,
94
88
  _a[Entity_1.Entity.Poseidon] = Poseidon_1.Poseidon,
@@ -1,4 +1,4 @@
1
- import { ItemMove, Location, Material, MaterialItem, MaterialMove, MoveItem, XYCoordinates } from '@gamepark/rules-api';
1
+ import { CustomMove, ItemMove, Location, Material, MaterialItem, MaterialMove, MoveItem, XYCoordinates } from '@gamepark/rules-api';
2
2
  import { PlayerEffectRule } from './Effect';
3
3
  export declare abstract class MoveEffectRule extends PlayerEffectRule {
4
4
  canPlayEffect(cardIndex: number): boolean;
@@ -11,5 +11,5 @@ export declare abstract class MoveEffectRule extends PlayerEffectRule {
11
11
  isLegalDestination(_space: XYCoordinates, _cardLocation: Location): boolean;
12
12
  afterItemMove(move: ItemMove): MaterialMove<number, number, number, number>[];
13
13
  onCardMoved(_move: MoveItem): MaterialMove[];
14
- endEffect(): MaterialMove[];
14
+ onCustomMove(move: CustomMove): MaterialMove<number, number, number, number>[];
15
15
  }