@gamepark/mythologies 0.2.1 → 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 (68) hide show
  1. package/dist/CustomMoveType.d.ts +2 -1
  2. package/dist/CustomMoveType.js +1 -0
  3. package/dist/Memory.d.ts +3 -1
  4. package/dist/Memory.js +2 -0
  5. package/dist/MythologiesRules.d.ts +15 -5
  6. package/dist/MythologiesRules.js +34 -33
  7. package/dist/material/Mythology.js +1 -1
  8. package/dist/material/Pantheon.d.ts +6 -1
  9. package/dist/material/Pantheon.js +59 -24
  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/egyptian/Beetle.js +1 -1
  32. package/dist/material/entity/egyptian/Sphinx.js +1 -1
  33. package/dist/material/entity/greek/Chimera.js +1 -1
  34. package/dist/material/entity/greek/Poseidon.js +3 -3
  35. package/dist/material/entity/norse/Draugr.js +1 -1
  36. package/dist/material/entity/norse/Jotunn.js +3 -2
  37. package/dist/rules/PlaceCardsRule.d.ts +3 -1
  38. package/dist/rules/PlaceCardsRule.js +18 -8
  39. package/dist/rules/PlaceTokenRule.js +3 -1
  40. package/dist/rules/RuleId.d.ts +7 -1
  41. package/dist/rules/RuleId.js +6 -0
  42. package/dist/rules/effects/AlfEffectRule.js +1 -1
  43. package/dist/rules/effects/ChimeraEffectRule.d.ts +1 -0
  44. package/dist/rules/effects/ChimeraEffectRule.js +4 -0
  45. package/dist/rules/effects/CondorEffectRule.d.ts +2 -2
  46. package/dist/rules/effects/CondorEffectRule.js +3 -7
  47. package/dist/rules/effects/DraugrEffectRule.d.ts +2 -1
  48. package/dist/rules/effects/DraugrEffectRule.js +8 -1
  49. package/dist/rules/effects/FenghuangEffectRule.d.ts +8 -0
  50. package/dist/rules/effects/FenghuangEffectRule.js +48 -0
  51. package/dist/rules/effects/JiangshiEffectRule.d.ts +8 -0
  52. package/dist/rules/effects/JiangshiEffectRule.js +76 -0
  53. package/dist/rules/effects/KinnaraEffectRule.js +7 -2
  54. package/dist/rules/effects/NuwaEffectRule.d.ts +12 -0
  55. package/dist/rules/effects/NuwaEffectRule.js +97 -0
  56. package/dist/rules/effects/QilinEffectRule.d.ts +8 -0
  57. package/dist/rules/effects/QilinEffectRule.js +113 -0
  58. package/dist/rules/effects/ResolveEffectsRule.d.ts +2 -0
  59. package/dist/rules/effects/ResolveEffectsRule.js +17 -14
  60. package/dist/rules/effects/ShivaEffectRule.d.ts +1 -1
  61. package/dist/rules/effects/ShivaEffectRule.js +5 -2
  62. package/dist/rules/effects/SphinxEffectRule.js +2 -6
  63. package/dist/rules/effects/ThorEffectRule.d.ts +1 -1
  64. package/dist/rules/effects/ThorEffectRule.js +3 -1
  65. package/dist/rules/effects/TianlongEffectRule.d.ts +17 -0
  66. package/dist/rules/effects/TianlongEffectRule.js +148 -0
  67. package/dist/rules/effects/TriggerEffectsRule.js +4 -5
  68. 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
@@ -12,5 +12,7 @@ export declare enum Memory {
12
12
  GarudaSacrificeCount = 13,
13
13
  VetalaCount = 14,
14
14
  IllapaLine = 15,
15
- YanluoWangCount = 16
15
+ YanluoWangCount = 16,
16
+ NuwaPlayerCreatures = 17,
17
+ TianlongVector = 18
16
18
  }
package/dist/Memory.js CHANGED
@@ -17,4 +17,6 @@ var Memory;
17
17
  Memory[Memory["VetalaCount"] = 14] = "VetalaCount";
18
18
  Memory[Memory["IllapaLine"] = 15] = "IllapaLine";
19
19
  Memory[Memory["YanluoWangCount"] = 16] = "YanluoWangCount";
20
+ Memory[Memory["NuwaPlayerCreatures"] = 17] = "NuwaPlayerCreatures";
21
+ Memory[Memory["TianlongVector"] = 18] = "TianlongVector";
20
22
  })(Memory = exports.Memory || (exports.Memory = {}));
@@ -16,21 +16,26 @@ 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';
@@ -38,7 +43,6 @@ import { YanluoWangEffectRule } from './rules/effects/YanluoWangEffectRule';
38
43
  import { EndGameRule } from './rules/EndGameRule';
39
44
  import { PlaceCardsRule } from './rules/PlaceCardsRule';
40
45
  import { PlaceTokenRule } from './rules/PlaceTokenRule';
41
- import { RuleId } from './rules/RuleId';
42
46
  import { UpkeepRule } from './rules/UpkeepRule';
43
47
  export declare class MythologiesRules extends SecretMaterialRules<PlayerColor, MaterialType, LocationType> implements TimeLimit<MaterialGame<PlayerColor, MaterialType, LocationType>, MaterialMove<PlayerColor, MaterialType, LocationType>, PlayerColor>, CompetitiveScore {
44
48
  rules: {
@@ -85,6 +89,12 @@ export declare class MythologiesRules extends SecretMaterialRules<PlayerColor, M
85
89
  44: typeof UkukuEffectRule;
86
90
  45: typeof UkukuPlaceEffectRule;
87
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;
88
98
  };
89
99
  locationsStrategies: {
90
100
  2: {
@@ -118,10 +128,10 @@ export declare class MythologiesRules extends SecretMaterialRules<PlayerColor, M
118
128
  };
119
129
  };
120
130
  keepMoveSecret(move: MaterialMove): boolean;
121
- beforeItemMove(move: ItemMove): MaterialMove<number, number, number, number>[];
122
- 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>)[];
123
- getAutomaticMoves(): import("@gamepark/rules-api").StartPlayerTurn<PlayerColor, RuleId.ResolveEffects>[];
124
- 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>[];
125
135
  giveTime(): number;
126
136
  getScore(player: PlayerColor): number;
127
137
  getTieBreaker(tieBreaker: number, player: PlayerColor): number | undefined;
@@ -38,21 +38,26 @@ 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");
@@ -112,6 +117,12 @@ var MythologiesRules = (function (_super) {
112
117
  _a[RuleId_1.RuleId.UkukuEffect] = UkukuEffectRule_1.UkukuEffectRule,
113
118
  _a[RuleId_1.RuleId.UkukuPlaceEffect] = UkukuEffectRule_1.UkukuPlaceEffectRule,
114
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,
115
126
  _a);
116
127
  _this.locationsStrategies = (_b = {},
117
128
  _b[MaterialType_1.MaterialType.EntityCard] = (_c = {},
@@ -148,34 +159,12 @@ var MythologiesRules = (function (_super) {
148
159
  }
149
160
  MythologiesRules.prototype.keepMoveSecret = function (move) {
150
161
  return ((0, rules_api_1.isMoveItemType)(MaterialType_1.MaterialType.DraftToken)(move) &&
162
+ move.location.type === LocationType_1.LocationType.OnEntityCard &&
151
163
  this.remind(Memory_1.Memory.KeepTokenPlaceSecret, this.material(MaterialType_1.MaterialType.DraftToken).getItem(move.itemIndex).id.back) === true);
152
164
  };
153
165
  MythologiesRules.prototype.beforeItemMove = function (move) {
154
- var _a;
155
- if ((0, rules_api_1.isMoveItemType)(MaterialType_1.MaterialType.EntityCard)(move)) {
156
- if (move.location.type === LocationType_1.LocationType.Pantheon) {
157
- var location = this.material(MaterialType_1.MaterialType.EntityCard).getItem(move.itemIndex).location;
158
- if (location.type !== LocationType_1.LocationType.Pantheon && location.type !== LocationType_1.LocationType.PlayerBufferArea) {
159
- return new Pantheon_1.Pantheon(this.game, move.location.player).onCardPlaced(move);
160
- }
161
- }
162
- else if (move.location.type === LocationType_1.LocationType.PlayerDiscard) {
163
- var card = this.material(MaterialType_1.MaterialType.EntityCard).index(move.itemIndex);
164
- var location = card.getItem().location;
165
- if (location.type === LocationType_1.LocationType.Pantheon) {
166
- return new Pantheon_1.Pantheon(this.game, location.player).onEntitySacrificed(card);
167
- }
168
- }
169
- }
170
- if ((0, rules_api_1.isMoveItemTypeAtOnce)(MaterialType_1.MaterialType.EntityCard)(move)) {
171
- if (move.location.type === LocationType_1.LocationType.PlayerDiscard) {
172
- var pile = this.material(MaterialType_1.MaterialType.EntityCard).index(move.indexes);
173
- if (((_a = pile.getItem()) === null || _a === void 0 ? void 0 : _a.location.type) === LocationType_1.LocationType.Pantheon) {
174
- var topCard = pile.maxBy(function (item) { return item.location.z; });
175
- return new Pantheon_1.Pantheon(this.game, topCard.getItem().location.player).onEntitySacrificed(topCard);
176
- }
177
- }
178
- }
166
+ if (!this.game.rule)
167
+ return [];
179
168
  if ((0, rules_api_1.isMoveItemType)(MaterialType_1.MaterialType.GemToken)(move) && move.location.type === LocationType_1.LocationType.PlayerGems) {
180
169
  var gem = this.material(MaterialType_1.MaterialType.GemToken).getItem(move.itemIndex).location;
181
170
  var player = gem.player;
@@ -200,13 +189,16 @@ var MythologiesRules = (function (_super) {
200
189
  return this.startEffectsResolution();
201
190
  }
202
191
  else {
203
- var _b = this.remind(Memory_1.Memory.PendingRule), id = _b.id, player = _b.player;
204
- this.forget(Memory_1.Memory.PendingRule);
205
- switch (id) {
206
- case RuleId_1.RuleId.EndGame:
207
- return [this.endGame()];
208
- default:
209
- 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
+ }
210
202
  }
211
203
  }
212
204
  }
@@ -220,7 +212,16 @@ var MythologiesRules = (function (_super) {
220
212
  return [];
221
213
  };
222
214
  MythologiesRules.prototype.startEffectsResolution = function () {
223
- 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;
224
225
  var player = this.material(MaterialType_1.MaterialType.EntityCard).getItem(cardIndex).location.player;
225
226
  return [this.startPlayerTurn(RuleId_1.RuleId.ResolveEffects, player)];
226
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;
@@ -191,19 +204,19 @@ var Pantheon = (function (_super) {
191
204
  if ((0, Entity_1.isGod)(entity)) {
192
205
  moves.push(this.spendGems(4));
193
206
  }
194
- var grid = this.grid;
195
- grid[move.location.y][move.location.x] = entity;
207
+ var grid = this.indexGrid;
208
+ grid[move.location.y][move.location.x] = move.itemIndex;
196
209
  moves.push.apply(moves, __spreadArray([], __read(this.updateGrid(grid)), false));
197
210
  var triggerEffectsRule = new TriggerEffectsRule_1.TriggerEffectsRule(this.game);
198
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; });
199
- 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 });
200
213
  var invoke = this.isInvoke;
201
214
  if (invoke) {
202
215
  moves.push.apply(moves, __spreadArray([], __read(this.onInvoke(move)), false));
203
216
  }
204
217
  var triggerEvents = [];
205
218
  if (invoke) {
206
- 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 });
207
220
  }
208
221
  if (crushed.length) {
209
222
  triggerEvents.push({ type: Effect_1.TriggerEventType.EntityCrushed, card: crushed.getItem(), cardIndex: crushed.getIndex() });
@@ -220,12 +233,14 @@ var Pantheon = (function (_super) {
220
233
  enumerable: false,
221
234
  configurable: true
222
235
  });
223
- Pantheon.prototype.updateGrid = function (grid) {
236
+ Pantheon.prototype.updateGrid = function (gridAfter) {
224
237
  var _a;
225
- if (grid === void 0) { grid = this.grid; }
226
- 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; }); });
227
- 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;
228
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
+ }
229
244
  for (var y = 0; y < 3; y++) {
230
245
  if (gridBefore[y].some(function (item) { return item === null; }) && gridAfter[y].every(function (item) { return item !== null; })) {
231
246
  new TriggerEffectsRule_1.TriggerEffectsRule(this.game).triggerEffects({ type: Effect_1.TriggerEventType.LineEvent, eventType: Effect_1.LineEventType.Completed, player: this.player, y: y });
@@ -240,20 +255,32 @@ var Pantheon = (function (_super) {
240
255
  for (var x = 0; x < 3; x++) {
241
256
  _loop_1(x);
242
257
  }
243
- 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;
244
275
  };
245
276
  Pantheon.prototype.gainBonus = function (grid) {
246
277
  var e_1, _a, e_2, _b;
247
- if (grid === void 0) { grid = this.grid; }
248
278
  var moves = [];
249
- 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); });
250
280
  try {
251
281
  for (var fullLines_1 = __values(fullLines), fullLines_1_1 = fullLines_1.next(); !fullLines_1_1.done; fullLines_1_1 = fullLines_1.next()) {
252
282
  var y = fullLines_1_1.value;
253
- var bonusGem = this.getBonusGem(y);
254
- if (bonusGem.length) {
255
- moves.push(bonusGem.moveItem({ type: LocationType_1.LocationType.PlayerGems, player: this.player }));
256
- }
283
+ moves.push.apply(moves, __spreadArray([], __read(this.gainLineBonus(y)), false));
257
284
  }
258
285
  }
259
286
  catch (e_1_1) { e_1 = { error: e_1_1 }; }
@@ -263,14 +290,11 @@ var Pantheon = (function (_super) {
263
290
  }
264
291
  finally { if (e_1) throw e_1.error; }
265
292
  }
266
- 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; }); });
267
294
  try {
268
295
  for (var fullColumns_1 = __values(fullColumns), fullColumns_1_1 = fullColumns_1.next(); !fullColumns_1_1.done; fullColumns_1_1 = fullColumns_1.next()) {
269
296
  var x = fullColumns_1_1.value;
270
- var bonusFavor = this.getBonusFavor(x);
271
- if (bonusFavor.length) {
272
- moves.push(bonusFavor.moveItem({ type: LocationType_1.LocationType.PlayerFavor, player: this.player }));
273
- }
297
+ moves.push.apply(moves, __spreadArray([], __read(this.gainColumnBonus(x)), false));
274
298
  }
275
299
  }
276
300
  catch (e_2_1) { e_2 = { error: e_2_1 }; }
@@ -282,6 +306,14 @@ var Pantheon = (function (_super) {
282
306
  }
283
307
  return moves;
284
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
+ };
285
317
  Pantheon.prototype.getBonusGem = function (y) {
286
318
  return this.material(MaterialType_1.MaterialType.GemToken)
287
319
  .location(LocationType_1.LocationType.PantheonLineBonus)
@@ -338,8 +370,8 @@ var Pantheon = (function (_super) {
338
370
  var piles = [];
339
371
  var myEntities = this.material(MaterialType_1.MaterialType.EntityCard).player(this.player);
340
372
  var fullPantheon = myEntities.location(LocationType_1.LocationType.Pantheon);
341
- var _loop_2 = function (x) {
342
- var _loop_3 = function (y) {
373
+ var _loop_3 = function (x) {
374
+ var _loop_4 = function (y) {
343
375
  if (predicate({ x: x, y: y })) {
344
376
  var pile = fullPantheon.location(function (l) { return l.x === x && l.y === y; }).sort(function (item) { return item.location.z; });
345
377
  if (pile.length > 0) {
@@ -348,11 +380,11 @@ var Pantheon = (function (_super) {
348
380
  }
349
381
  };
350
382
  for (var y = 0; y < 3; y++) {
351
- _loop_3(y);
383
+ _loop_4(y);
352
384
  }
353
385
  };
354
386
  for (var x = 0; x < 3; x++) {
355
- _loop_2(x);
387
+ _loop_3(x);
356
388
  }
357
389
  return piles;
358
390
  };
@@ -380,6 +412,9 @@ var Pantheon = (function (_super) {
380
412
  new TriggerEffectsRule_1.TriggerEffectsRule(this.game).triggerEffects({ type: Effect_1.TriggerEventType.EntitySacrificed, card: card.getItem(), cardIndex: card.getIndex() });
381
413
  return this.updateGrid();
382
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
+ };
383
418
  return Pantheon;
384
419
  }(rules_api_1.MaterialRulesPart));
385
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
  }
@@ -17,6 +17,7 @@ var __extends = (this && this.__extends) || (function () {
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
18
  exports.MoveEffectRule = void 0;
19
19
  var rules_api_1 = require("@gamepark/rules-api");
20
+ var CustomMoveType_1 = require("../../CustomMoveType");
20
21
  var LocationType_1 = require("../LocationType");
21
22
  var MaterialType_1 = require("../MaterialType");
22
23
  var Pantheon_1 = require("../Pantheon");
@@ -73,9 +74,12 @@ var MoveEffectRule = (function (_super) {
73
74
  MoveEffectRule.prototype.onCardMoved = function (_move) {
74
75
  return this.endEffect();
75
76
  };
76
- MoveEffectRule.prototype.endEffect = function () {
77
- var pantheon = new Pantheon_1.Pantheon(this.game, this.player);
78
- return pantheon.updateGrid().concat(_super.prototype.endEffect.call(this));
77
+ MoveEffectRule.prototype.onCustomMove = function (move) {
78
+ if (move.type === CustomMoveType_1.CustomMoveType.EndEffect) {
79
+ var pantheon = new Pantheon_1.Pantheon(this.game, this.player);
80
+ return pantheon.updateGrid();
81
+ }
82
+ return [];
79
83
  };
80
84
  return MoveEffectRule;
81
85
  }(Effect_1.PlayerEffectRule));