@firestone-hs/simulate-bgs-battle 1.1.722 → 1.1.724

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 (58) hide show
  1. package/dist/cards/card.interface.d.ts +4 -0
  2. package/dist/cards/card.interface.js +4 -2
  3. package/dist/cards/card.interface.js.map +1 -1
  4. package/dist/cards/impl/_card-mappings.js +2 -0
  5. package/dist/cards/impl/_card-mappings.js.map +1 -1
  6. package/dist/cards/impl/hero-power/lightning-invocation.js +4 -1
  7. package/dist/cards/impl/hero-power/lightning-invocation.js.map +1 -1
  8. package/dist/cards/impl/minion/sneeds-new-shredder.js +1 -1
  9. package/dist/cards/impl/minion/sneeds-new-shredder.js.map +1 -1
  10. package/dist/cards/impl/minion/timewarped-embalmer.d.ts +2 -2
  11. package/dist/cards/impl/minion/timewarped-embalmer.js +5 -1
  12. package/dist/cards/impl/minion/timewarped-embalmer.js.map +1 -1
  13. package/dist/cards/impl/minion/timewarped-pagle.d.ts +2 -0
  14. package/dist/cards/impl/minion/timewarped-pagle.js +15 -0
  15. package/dist/cards/impl/minion/timewarped-pagle.js.map +1 -0
  16. package/dist/input-clone.d.ts +1 -0
  17. package/dist/input-clone.js +13 -1
  18. package/dist/input-clone.js.map +1 -1
  19. package/dist/mechanics/rally.js +14 -12
  20. package/dist/mechanics/rally.js.map +1 -1
  21. package/dist/mechanics/tavern-spell-repeat.js +3 -4
  22. package/dist/mechanics/tavern-spell-repeat.js.map +1 -1
  23. package/dist/simulate-bgs-battle.d.ts +1 -1
  24. package/dist/simulate-bgs-battle.js +80 -77
  25. package/dist/simulate-bgs-battle.js.map +1 -1
  26. package/dist/simulation/add-minion-to-board.d.ts +1 -1
  27. package/dist/simulation/add-minion-to-board.js +5 -2
  28. package/dist/simulation/add-minion-to-board.js.map +1 -1
  29. package/dist/simulation/attack.js +3 -3
  30. package/dist/simulation/attack.js.map +1 -1
  31. package/dist/simulation/avenge.js +2 -2
  32. package/dist/simulation/avenge.js.map +1 -1
  33. package/dist/simulation/deathrattle-effects.js +48 -14
  34. package/dist/simulation/deathrattle-effects.js.map +1 -1
  35. package/dist/simulation/deathrattle-spawns.js +19 -12
  36. package/dist/simulation/deathrattle-spawns.js.map +1 -1
  37. package/dist/simulation/deathrattle-utils.d.ts +1 -0
  38. package/dist/simulation/deathrattle-utils.js +45 -5
  39. package/dist/simulation/deathrattle-utils.js.map +1 -1
  40. package/dist/simulation/on-attack.js +13 -14
  41. package/dist/simulation/on-attack.js.map +1 -1
  42. package/dist/simulation/reborn.js +11 -0
  43. package/dist/simulation/reborn.js.map +1 -1
  44. package/dist/simulation/simulator.d.ts +1 -0
  45. package/dist/simulation/simulator.js +39 -74
  46. package/dist/simulation/simulator.js.map +1 -1
  47. package/dist/simulation/spectator/resolve-trinket-hero-power.js +11 -2
  48. package/dist/simulation/spectator/resolve-trinket-hero-power.js.map +1 -1
  49. package/dist/simulation/spectator/spectator.d.ts +4 -0
  50. package/dist/simulation/spectator/spectator.js +39 -19
  51. package/dist/simulation/spectator/spectator.js.map +1 -1
  52. package/dist/simulation/stats.js +95 -66
  53. package/dist/simulation/stats.js.map +1 -1
  54. package/dist/simulation/summon-when-space.js +24 -21
  55. package/dist/simulation/summon-when-space.js.map +1 -1
  56. package/dist/utils.js +89 -48
  57. package/dist/utils.js.map +1 -1
  58. package/package.json +3 -2
@@ -6,11 +6,31 @@ const MAX_SAMPLES = 1;
6
6
  class Spectator {
7
7
  constructor(enabled) {
8
8
  this.enabled = enabled;
9
+ this.recording = false;
9
10
  this.actionsForCurrentBattle = [];
10
11
  this.wonBattles = [];
11
12
  this.tiedBattles = [];
12
13
  this.lostBattles = [];
13
14
  }
15
+ startRecording() {
16
+ if (this.enabled) {
17
+ this.recording = true;
18
+ }
19
+ }
20
+ stopRecording() {
21
+ this.recording = false;
22
+ this.actionsForCurrentBattle = [];
23
+ }
24
+ hasSampleFor(result) {
25
+ switch (result) {
26
+ case 'won':
27
+ return this.wonBattles.length >= MAX_SAMPLES;
28
+ case 'lost':
29
+ return this.lostBattles.length >= MAX_SAMPLES;
30
+ case 'tied':
31
+ return this.tiedBattles.length >= MAX_SAMPLES;
32
+ }
33
+ }
14
34
  prune() {
15
35
  this.wonBattles = this.wonBattles.slice(0, MAX_SAMPLES);
16
36
  this.lostBattles = this.lostBattles.slice(0, MAX_SAMPLES);
@@ -41,13 +61,7 @@ class Spectator {
41
61
  return result;
42
62
  }
43
63
  commitBattleResult(result) {
44
- if (!this.enabled) {
45
- this.actionsForCurrentBattle = [];
46
- return;
47
- }
48
- if (this.wonBattles.length >= MAX_SAMPLES &&
49
- this.lostBattles.length >= MAX_SAMPLES &&
50
- this.tiedBattles.length >= MAX_SAMPLES) {
64
+ if (!this.recording) {
51
65
  this.actionsForCurrentBattle = [];
52
66
  return;
53
67
  }
@@ -59,18 +73,24 @@ class Spectator {
59
73
  };
60
74
  switch (result) {
61
75
  case 'won':
62
- this.wonBattles.push(battle);
76
+ if (this.wonBattles.length < MAX_SAMPLES) {
77
+ this.wonBattles.push(battle);
78
+ }
63
79
  break;
64
80
  case 'lost':
65
- this.lostBattles.push(battle);
81
+ if (this.lostBattles.length < MAX_SAMPLES) {
82
+ this.lostBattles.push(battle);
83
+ }
66
84
  break;
67
85
  case 'tied':
68
- this.tiedBattles.push(battle);
86
+ if (this.tiedBattles.length < MAX_SAMPLES) {
87
+ this.tiedBattles.push(battle);
88
+ }
69
89
  break;
70
90
  }
71
91
  }
72
92
  registerAttack(attackingEntity, defendingEntity, attackingBoard, defendingBoard, attackingBoardHero, defendingBoardHero) {
73
- if (!this.enabled) {
93
+ if (!this.recording) {
74
94
  return;
75
95
  }
76
96
  const isAttackerFriendly = attackingBoard.every((entity) => entity.friendly);
@@ -90,7 +110,7 @@ class Spectator {
90
110
  this.addAction(action);
91
111
  }
92
112
  registerStartOfCombat(friendlyBoard, opponentBoard, friendlyHero, opponentHero) {
93
- if (!this.enabled) {
113
+ if (!this.recording) {
94
114
  return;
95
115
  }
96
116
  const action = (0, game_action_1.buildGameAction)(friendlyHero, opponentHero, {
@@ -103,7 +123,7 @@ class Spectator {
103
123
  this.addAction(action);
104
124
  }
105
125
  registerPlayerAttack(friendlyBoard, opponentBoard, damage) {
106
- if (!this.enabled) {
126
+ if (!this.recording) {
107
127
  return;
108
128
  }
109
129
  const action = (0, game_action_1.buildGameAction)(null, null, {
@@ -121,7 +141,7 @@ class Spectator {
121
141
  this.addAction(action);
122
142
  }
123
143
  registerOpponentAttack(friendlyBoard, opponentBoard, damage) {
124
- if (!this.enabled) {
144
+ if (!this.recording) {
125
145
  return;
126
146
  }
127
147
  const action = (0, game_action_1.buildGameAction)(null, null, {
@@ -139,7 +159,7 @@ class Spectator {
139
159
  this.addAction(action);
140
160
  }
141
161
  registerDamageDealt(damagingEntity, damagedEntity, damageTaken, damagedEntityBoard) {
142
- if (!this.enabled) {
162
+ if (!this.recording) {
143
163
  return;
144
164
  }
145
165
  if (!damagingEntity.entityId) {
@@ -163,7 +183,7 @@ class Spectator {
163
183
  this.addAction(action);
164
184
  }
165
185
  registerPowerTarget(sourceEntity, targetEntity, targetBoard, hero1, hero2) {
166
- if (!this.enabled) {
186
+ if (!this.recording) {
167
187
  return;
168
188
  }
169
189
  if (!targetEntity) {
@@ -185,7 +205,7 @@ class Spectator {
185
205
  this.addAction(action);
186
206
  }
187
207
  registerPowerTargets(sourceEntity, targetEntities, targetBoard, hero1, hero2) {
188
- if (!this.enabled) {
208
+ if (!this.recording) {
189
209
  return;
190
210
  }
191
211
  if (!(targetEntities === null || targetEntities === void 0 ? void 0 : targetEntities.length)) {
@@ -207,7 +227,7 @@ class Spectator {
207
227
  this.addAction(action);
208
228
  }
209
229
  registerMinionsSpawn(sourceEntity, boardOnWhichToSpawn, spawnedEntities) {
210
- if (!this.enabled) {
230
+ if (!this.recording) {
211
231
  return;
212
232
  }
213
233
  if (!spawnedEntities || spawnedEntities.length === 0) {
@@ -229,7 +249,7 @@ class Spectator {
229
249
  this.addAction(action);
230
250
  }
231
251
  registerDeadEntities(deadMinionIndexes1, deadEntities1, board1, deadMinionIndexes2, deadEntities2, board2) {
232
- if (!this.enabled) {
252
+ if (!this.recording) {
233
253
  return;
234
254
  }
235
255
  const deaths = [...(deadEntities1 || []), ...(deadEntities2 || [])];
@@ -1 +1 @@
1
- {"version":3,"file":"spectator.js","sourceRoot":"","sources":["../../../src/simulation/spectator/spectator.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsGameState } from '../../bgs-battle-info';\r\nimport { BgsPlayerEntity, BoardTrinket } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { BoardSecret } from '../../board-secret';\r\nimport { GameAction, buildGameAction } from './game-action';\r\nimport { GameSample } from './game-sample';\r\n\r\nconst MAX_SAMPLES = 1;\r\n\r\nexport class Spectator {\r\n\tprivate actionsForCurrentBattle: GameAction[];\r\n\tprivate wonBattles: GameSample[];\r\n\tprivate tiedBattles: GameSample[];\r\n\tprivate lostBattles: GameSample[];\r\n\r\n\tconstructor(private readonly enabled: boolean) {\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\t\tthis.wonBattles = [];\r\n\t\tthis.tiedBattles = [];\r\n\t\tthis.lostBattles = [];\r\n\t}\r\n\r\n\tpublic prune(): void {\r\n\t\tthis.wonBattles = this.wonBattles.slice(0, MAX_SAMPLES);\r\n\t\tthis.lostBattles = this.lostBattles.slice(0, MAX_SAMPLES);\r\n\t\tthis.tiedBattles = this.tiedBattles.slice(0, MAX_SAMPLES);\r\n\t}\r\n\r\n\tpublic buildOutcomeSamples(gameState: BgsGameState): {\r\n\t\twon: readonly GameSample[];\r\n\t\tlost: readonly GameSample[];\r\n\t\ttied: readonly GameSample[];\r\n\t} {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn {\r\n\t\t\t\twon: [],\r\n\t\t\t\tlost: [],\r\n\t\t\t\ttied: [],\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn {\r\n\t\t\twon: this.wonBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t\tlost: this.lostBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t\ttied: this.tiedBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t};\r\n\t}\r\n\r\n\tprivate cleanUpActions(battle: GameSample, gameState: BgsGameState): GameSample {\r\n\t\tconst collapsed = this.collapseActions(battle.actions);\r\n\t\tconst result: GameSample = {\r\n\t\t\t...battle,\r\n\t\t\tactions: collapsed,\r\n\t\t\tanomalies: gameState.anomalies,\r\n\t\t};\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic commitBattleResult(result: 'won' | 'lost' | 'tied'): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\tthis.actionsForCurrentBattle = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (\r\n\t\t\tthis.wonBattles.length >= MAX_SAMPLES &&\r\n\t\t\tthis.lostBattles.length >= MAX_SAMPLES &&\r\n\t\t\tthis.tiedBattles.length >= MAX_SAMPLES\r\n\t\t) {\r\n\t\t\tthis.actionsForCurrentBattle = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// const actionsForBattle = this.collapseActions(this.actionsForCurrentBattle);\r\n\t\tconst actionsForBattle = this.actionsForCurrentBattle;\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\r\n\t\tconst battle: GameSample = {\r\n\t\t\tactions: actionsForBattle,\r\n\t\t\tanomalies: [],\r\n\t\t};\r\n\t\tswitch (result) {\r\n\t\t\tcase 'won':\r\n\t\t\t\tthis.wonBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'lost':\r\n\t\t\t\tthis.lostBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'tied':\r\n\t\t\t\tthis.tiedBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic registerAttack(\r\n\t\tattackingEntity: BoardEntity,\r\n\t\tdefendingEntity: BoardEntity,\r\n\t\tattackingBoard: readonly BoardEntity[],\r\n\t\tdefendingBoard: readonly BoardEntity[],\r\n\t\tattackingBoardHero: BgsPlayerEntity,\r\n\t\tdefendingBoardHero: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.debug(\r\n\t\t// \t'\\n register attack',\r\n\t\t// \tstringifySimple(attackingBoard),\r\n\t\t// \t'\\n',\r\n\t\t// \tstringifySimple(defendingBoard),\r\n\t\t// \t'\\n',\r\n\t\t// \tattackingBoard.find((e) => e.entityId === 2441),\r\n\t\t// \t'\\n',\r\n\t\t// \tattackingBoard.find((e) => e.entityId === 2442),\r\n\t\t// );\r\n\t\tconst isAttackerFriendly = attackingBoard.every((entity) => entity.friendly);\r\n\t\tconst playerHero = isAttackerFriendly ? attackingBoardHero : defendingBoardHero;\r\n\t\tconst opponentHero = isAttackerFriendly ? defendingBoardHero : attackingBoardHero;\r\n\t\tconst friendlyBoard = isAttackerFriendly ? attackingBoard : defendingBoard;\r\n\t\tconst opponentBoard = isAttackerFriendly ? defendingBoard : attackingBoard;\r\n\t\tconst action: GameAction = buildGameAction(playerHero, opponentHero, {\r\n\t\t\ttype: 'attack',\r\n\t\t\tsourceEntityId: attackingEntity.entityId,\r\n\t\t\ttargetEntityId: defendingEntity.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\tplayerHand: this.sanitize(playerHero.hand),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\topponentHand: this.sanitize(opponentHero.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerStartOfCombat(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tfriendlyHero: BgsPlayerEntity,\r\n\t\topponentHero: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'start-of-combat',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPlayerAttack(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tdamage: number,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'player-attack',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerOpponentAttack(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tdamage: number,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'opponent-attack',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerDamageDealt(\r\n\t\tdamagingEntity: BoardEntity,\r\n\t\tdamagedEntity: BoardEntity,\r\n\t\tdamageTaken: number,\r\n\t\tdamagedEntityBoard: BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!damagingEntity.entityId) {\r\n\t\t\t// console.error('missing damaging entity id', damagingEntity.cardId);\r\n\t\t}\r\n\t\tconst friendlyBoard = damagedEntityBoard.every((entity) => entity.friendly) ? damagedEntityBoard : null;\r\n\t\tconst opponentBoard = damagedEntityBoard.every((entity) => !entity.friendly) ? damagedEntityBoard : null;\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'damage',\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tsourceEntityId: damagingEntity.entityId,\r\n\t\t\t\t\ttargetEntityId: damagedEntity.entityId,\r\n\t\t\t\t\tdamage: damageTaken,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPowerTarget(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket,\r\n\t\ttargetEntity: BoardEntity | BgsPlayerEntity,\r\n\t\ttargetBoard: BoardEntity[],\r\n\t\thero1: BgsPlayerEntity,\r\n\t\thero2: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!targetEntity) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.log('registerPowerTarget', stringifySimpleCard(sourceEntity), stringifySimpleCard(targetEntity), new Error().stack);\r\n\t\tconst friendlyBoard = targetBoard?.every((entity) => entity.friendly) ? targetBoard : null;\r\n\t\tconst opponentBoard = targetBoard?.every((entity) => !entity.friendly) ? targetBoard : null;\r\n\t\tconst friendlyHero = hero1?.friendly ? hero1 : hero2?.friendly ? hero2 : null;\r\n\t\tconst opponentHero = hero1?.friendly ? hero2 : hero2?.friendly ? hero1 : null;\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'power-target',\r\n\t\t\tsourceEntityId: sourceEntity.entityId,\r\n\t\t\ttargetEntityId: targetEntity.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero?.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero?.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPowerTargets(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket,\r\n\t\ttargetEntities: (BoardEntity | BgsPlayerEntity)[],\r\n\t\ttargetBoard: BoardEntity[],\r\n\t\thero1: BgsPlayerEntity,\r\n\t\thero2: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!targetEntities?.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.log('registerPowerTarget', stringifySimpleCard(sourceEntity), stringifySimpleCard(targetEntity), new Error().stack);\r\n\t\tconst friendlyBoard = targetBoard?.every((entity) => entity.friendly) ? targetBoard : null;\r\n\t\tconst opponentBoard = targetBoard?.every((entity) => !entity.friendly) ? targetBoard : null;\r\n\t\tconst friendlyHero = hero1?.friendly ? hero1 : hero2?.friendly ? hero2 : null;\r\n\t\tconst opponentHero = hero1?.friendly ? hero2 : hero2?.friendly ? hero1 : null;\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'power-target',\r\n\t\t\tsourceEntityId: sourceEntity.entityId,\r\n\t\t\ttargetEntityIds: targetEntities.map((entity) => entity.entityId),\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero?.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero?.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerMinionsSpawn(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardTrinket,\r\n\t\tboardOnWhichToSpawn: BoardEntity[],\r\n\t\tspawnedEntities: readonly BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!spawnedEntities || spawnedEntities.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!sourceEntity?.entityId) {\r\n\t\t\t// console.error('missing spawn source entity id', sourceEntity);\r\n\t\t}\r\n\t\tconst friendlyBoard = boardOnWhichToSpawn.every((entity) => entity.friendly) ? boardOnWhichToSpawn : null;\r\n\t\tconst opponentBoard = boardOnWhichToSpawn.every((entity) => !entity.friendly) ? boardOnWhichToSpawn : null;\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'spawn',\r\n\t\t\tspawns: this.sanitize(spawnedEntities),\r\n\t\t\tsourceEntityId: sourceEntity?.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerDeadEntities(\r\n\t\tdeadMinionIndexes1: number[],\r\n\t\tdeadEntities1: BoardEntity[],\r\n\t\tboard1: BoardEntity[],\r\n\t\tdeadMinionIndexes2: number[],\r\n\t\tdeadEntities2: BoardEntity[],\r\n\t\tboard2: BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst deaths = [...(deadEntities1 || []), ...(deadEntities2 || [])];\r\n\t\tif (!deaths || deaths.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'minion-death',\r\n\t\t\tdeaths: this.sanitize(deaths),\r\n\t\t\tdeadMinionsPositionsOnBoard: [\r\n\t\t\t\t...(deadMinionIndexes1 || []).map((i) => board1.length - i),\r\n\t\t\t\t...(deadMinionIndexes2 || []).map((i) => board2.length - i),\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tprivate addAction(action: GameAction) {\r\n\t\tthis.actionsForCurrentBattle.push(action);\r\n\t}\r\n\r\n\tprivate collapseActions(actions: readonly GameAction[]): readonly GameAction[] {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tif (!actions || actions.length === 0) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tconst result: GameAction[] = [];\r\n\t\tfor (let i = 0; i < actions.length; i++) {\r\n\t\t\tconst action: GameAction = {\r\n\t\t\t\t...actions[i],\r\n\t\t\t\tplayerBoard: this.sanitize(actions[i].playerBoard),\r\n\t\t\t\topponentBoard: this.sanitize(actions[i].opponentBoard),\r\n\t\t\t\tplayerHand: this.sanitize(actions[i].playerHand),\r\n\t\t\t\topponentHand: this.sanitize(actions[i].opponentHand),\r\n\t\t\t\t// spawns: this.sanitize(actions[i].spawns),\r\n\t\t\t\tdeaths: this.sanitize(actions[i].deaths),\r\n\t\t\t\tplayerTrinkets: this.sanitizeTrinkets(actions[i].playerTrinkets),\r\n\t\t\t\topponentTrinkets: this.sanitizeTrinkets(actions[i].opponentTrinkets),\r\n\t\t\t};\r\n\t\t\t// action.playerBoard && console.debug('\\naction playerboard', stringifySimple(action.playerBoard));\r\n\t\t\tconst lastAction = result.length > 0 ? result[result.length - 1] : null;\r\n\r\n\t\t\tif (lastAction) {\r\n\t\t\t\taction.playerBoard = action.playerBoard ?? lastAction.playerBoard;\r\n\t\t\t\taction.opponentBoard = action.opponentBoard ?? lastAction.opponentBoard;\r\n\t\t\t\taction.playerHand = action.playerHand ?? lastAction.playerHand;\r\n\t\t\t\taction.opponentHand = action.opponentHand ?? lastAction.opponentHand;\r\n\t\t\t\taction.playerSecrets = action.playerSecrets ?? lastAction.playerSecrets;\r\n\t\t\t\taction.opponentSecrets = action.opponentSecrets ?? lastAction.opponentSecrets;\r\n\t\t\t\taction.playerRewardCardId = action.playerRewardCardId ?? lastAction.playerRewardCardId;\r\n\t\t\t\taction.playerRewardEntityId = action.playerRewardEntityId ?? lastAction.playerRewardEntityId;\r\n\t\t\t\taction.playerRewardData = action.playerRewardData ?? lastAction.playerRewardData;\r\n\t\t\t\taction.opponentRewardCardId = action.opponentRewardCardId ?? lastAction.opponentRewardCardId;\r\n\t\t\t\taction.opponentRewardEntityId = action.opponentRewardEntityId ?? lastAction.opponentRewardEntityId;\r\n\t\t\t\taction.opponentRewardData = action.opponentRewardData ?? lastAction.opponentRewardData;\r\n\t\t\t\taction.playerCardId = action.playerCardId ?? lastAction.playerCardId;\r\n\t\t\t\taction.playerEntityId = action.playerEntityId ?? lastAction.playerEntityId;\r\n\t\t\t\taction.playerHeroPowerCardId = action.playerHeroPowerCardId ?? lastAction.playerHeroPowerCardId;\r\n\t\t\t\taction.playerHeroPowerEntityId = action.playerHeroPowerEntityId ?? lastAction.playerHeroPowerEntityId;\r\n\t\t\t\taction.playerHeroPowerUsed = action.playerHeroPowerUsed ?? lastAction.playerHeroPowerUsed;\r\n\t\t\t\taction.opponentCardId = action.opponentCardId ?? lastAction.opponentCardId;\r\n\t\t\t\taction.opponentEntityId = action.opponentEntityId ?? lastAction.opponentEntityId;\r\n\t\t\t\taction.opponentHeroPowerCardId = action.opponentHeroPowerCardId ?? lastAction.opponentHeroPowerCardId;\r\n\t\t\t\taction.opponentHeroPowerEntityId =\r\n\t\t\t\t\taction.opponentHeroPowerEntityId ?? lastAction.opponentHeroPowerEntityId;\r\n\t\t\t\taction.opponentHeroPowerUsed = action.opponentHeroPowerUsed ?? lastAction.opponentHeroPowerUsed;\r\n\t\t\t\taction.playerTrinkets = action.playerTrinkets ?? lastAction.playerTrinkets;\r\n\t\t\t\taction.opponentTrinkets = action.opponentTrinkets ?? lastAction.opponentTrinkets;\r\n\t\t\t}\r\n\r\n\t\t\tif (lastAction && action.type === 'damage' && lastAction.type === 'attack') {\r\n\t\t\t\tlastAction.damages = lastAction.damages || [];\r\n\t\t\t\tlastAction.damages.push({\r\n\t\t\t\t\tdamage: action.damages[0].damage,\r\n\t\t\t\t\tsourceEntityId: action.damages[0].sourceEntityId,\r\n\t\t\t\t\ttargetEntityId: action.damages[0].targetEntityId,\r\n\t\t\t\t});\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else if (lastAction && action.type === 'damage' && lastAction.type === 'damage') {\r\n\t\t\t\tlastAction.damages = lastAction.damages || [];\r\n\t\t\t\tlastAction.damages.push({\r\n\t\t\t\t\tdamage: action.damages[0].damage,\r\n\t\t\t\t\tsourceEntityId: action.damages[0].sourceEntityId,\r\n\t\t\t\t\ttargetEntityId: action.damages[0].targetEntityId,\r\n\t\t\t\t});\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else if (\r\n\t\t\t\tlastAction &&\r\n\t\t\t\taction.type === 'power-target' &&\r\n\t\t\t\tlastAction.type === 'power-target' &&\r\n\t\t\t\taction.sourceEntityId === lastAction.sourceEntityId\r\n\t\t\t) {\r\n\t\t\t\tlastAction.targetEntityIds =\r\n\t\t\t\t\tlastAction.targetEntityIds ?? (lastAction.targetEntityId ? [lastAction.targetEntityId] : []);\r\n\t\t\t\taction.targetEntityIds =\r\n\t\t\t\t\taction.targetEntityIds ?? (action.targetEntityId ? [action.targetEntityId] : []);\r\n\t\t\t\tlastAction.targetEntityIds.push(...action.targetEntityIds);\r\n\t\t\t\t// So that when multiple Leapfroggers enchantments target the same minion,\r\n\t\t\t\t// we can count them in the replay viewer's text\r\n\t\t\t\t// lastAction.targetEntityIds = [...new Set(lastAction.targetEntityIds)];\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// Calling sanitize every time before we add an action to the list is mandatory, since\r\n\t// the entities and boards are mutable\r\n\tprivate sanitize(board: readonly BoardEntity[]): readonly BoardEntity[] {\r\n\t\tif (!board) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\treturn board.map(\r\n\t\t\t(entity) =>\r\n\t\t\t\t({\r\n\t\t\t\t\tentityId: entity.entityId,\r\n\t\t\t\t\tcardId: entity.cardId,\r\n\t\t\t\t\tfriendly: entity.friendly,\r\n\t\t\t\t\tattack: entity.attack,\r\n\t\t\t\t\thealth: entity.health,\r\n\t\t\t\t\tmaxHealth: entity.maxHealth,\r\n\t\t\t\t\ttaunt: entity.taunt,\r\n\t\t\t\t\tdivineShield: entity.divineShield,\r\n\t\t\t\t\tpoisonous: entity.poisonous,\r\n\t\t\t\t\tvenomous: entity.venomous,\r\n\t\t\t\t\treborn: entity.reborn,\r\n\t\t\t\t\twindfury: entity.windfury,\r\n\t\t\t\t\tstealth: entity.stealth,\r\n\t\t\t\t} as BoardEntity),\r\n\t\t);\r\n\t}\r\n\r\n\tprivate sanitizeTrinkets(trinkets: readonly BoardTrinket[]): readonly BoardTrinket[] {\r\n\t\tif (!trinkets?.length) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst result = trinkets.map(\r\n\t\t\t(t) =>\r\n\t\t\t\t({\r\n\t\t\t\t\tcardId: t.cardId,\r\n\t\t\t\t\tentityId: t.entityId,\r\n\t\t\t\t\tscriptDataNum1: t.scriptDataNum1,\r\n\t\t\t\t\tscriptDataNum6: t.scriptDataNum6,\r\n\t\t\t\t\ttags: t.tags,\r\n\t\t\t\t} as BoardTrinket),\r\n\t\t);\r\n\t\treturn result;\r\n\t}\r\n}\r\n"]}
1
+ {"version":3,"file":"spectator.js","sourceRoot":"","sources":["../../../src/simulation/spectator/spectator.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsGameState } from '../../bgs-battle-info';\r\nimport { BgsPlayerEntity, BoardTrinket } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { BoardSecret } from '../../board-secret';\r\nimport { GameAction, buildGameAction } from './game-action';\r\nimport { GameSample } from './game-sample';\r\n\r\nconst MAX_SAMPLES = 1;\r\n\r\nexport class Spectator {\r\n\tprivate actionsForCurrentBattle: GameAction[];\r\n\tprivate wonBattles: GameSample[];\r\n\tprivate tiedBattles: GameSample[];\r\n\tprivate lostBattles: GameSample[];\r\n\t// Recording every action is a significant part of the total simulation cost, so the\r\n\t// main simulation loop runs with recording off. Outcome samples are captured post-hoc:\r\n\t// once the outcome distribution is known, a few battles are re-run with recording\r\n\t// explicitly turned on until each outcome bucket that occurred has a sample.\r\n\tprivate recording = false;\r\n\r\n\tconstructor(private readonly enabled: boolean) {\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\t\tthis.wonBattles = [];\r\n\t\tthis.tiedBattles = [];\r\n\t\tthis.lostBattles = [];\r\n\t}\r\n\r\n\tpublic startRecording(): void {\r\n\t\tif (this.enabled) {\r\n\t\t\tthis.recording = true;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic stopRecording(): void {\r\n\t\tthis.recording = false;\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\t}\r\n\r\n\tpublic hasSampleFor(result: 'won' | 'lost' | 'tied'): boolean {\r\n\t\tswitch (result) {\r\n\t\t\tcase 'won':\r\n\t\t\t\treturn this.wonBattles.length >= MAX_SAMPLES;\r\n\t\t\tcase 'lost':\r\n\t\t\t\treturn this.lostBattles.length >= MAX_SAMPLES;\r\n\t\t\tcase 'tied':\r\n\t\t\t\treturn this.tiedBattles.length >= MAX_SAMPLES;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic prune(): void {\r\n\t\tthis.wonBattles = this.wonBattles.slice(0, MAX_SAMPLES);\r\n\t\tthis.lostBattles = this.lostBattles.slice(0, MAX_SAMPLES);\r\n\t\tthis.tiedBattles = this.tiedBattles.slice(0, MAX_SAMPLES);\r\n\t}\r\n\r\n\tpublic buildOutcomeSamples(gameState: BgsGameState): {\r\n\t\twon: readonly GameSample[];\r\n\t\tlost: readonly GameSample[];\r\n\t\ttied: readonly GameSample[];\r\n\t} {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn {\r\n\t\t\t\twon: [],\r\n\t\t\t\tlost: [],\r\n\t\t\t\ttied: [],\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn {\r\n\t\t\twon: this.wonBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t\tlost: this.lostBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t\ttied: this.tiedBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t};\r\n\t}\r\n\r\n\tprivate cleanUpActions(battle: GameSample, gameState: BgsGameState): GameSample {\r\n\t\tconst collapsed = this.collapseActions(battle.actions);\r\n\t\tconst result: GameSample = {\r\n\t\t\t...battle,\r\n\t\t\tactions: collapsed,\r\n\t\t\tanomalies: gameState.anomalies,\r\n\t\t};\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic commitBattleResult(result: 'won' | 'lost' | 'tied'): void {\r\n\t\tif (!this.recording) {\r\n\t\t\tthis.actionsForCurrentBattle = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst actionsForBattle = this.actionsForCurrentBattle;\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\r\n\t\tconst battle: GameSample = {\r\n\t\t\tactions: actionsForBattle,\r\n\t\t\tanomalies: [],\r\n\t\t};\r\n\t\t// Only keep the sample if this bucket still needs one (prune() would discard the\r\n\t\t// extras anyway, and holding on to them wastes memory)\r\n\t\tswitch (result) {\r\n\t\t\tcase 'won':\r\n\t\t\t\tif (this.wonBattles.length < MAX_SAMPLES) {\r\n\t\t\t\t\tthis.wonBattles.push(battle);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'lost':\r\n\t\t\t\tif (this.lostBattles.length < MAX_SAMPLES) {\r\n\t\t\t\t\tthis.lostBattles.push(battle);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'tied':\r\n\t\t\t\tif (this.tiedBattles.length < MAX_SAMPLES) {\r\n\t\t\t\t\tthis.tiedBattles.push(battle);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic registerAttack(\r\n\t\tattackingEntity: BoardEntity,\r\n\t\tdefendingEntity: BoardEntity,\r\n\t\tattackingBoard: readonly BoardEntity[],\r\n\t\tdefendingBoard: readonly BoardEntity[],\r\n\t\tattackingBoardHero: BgsPlayerEntity,\r\n\t\tdefendingBoardHero: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.debug(\r\n\t\t// \t'\\n register attack',\r\n\t\t// \tstringifySimple(attackingBoard),\r\n\t\t// \t'\\n',\r\n\t\t// \tstringifySimple(defendingBoard),\r\n\t\t// \t'\\n',\r\n\t\t// \tattackingBoard.find((e) => e.entityId === 2441),\r\n\t\t// \t'\\n',\r\n\t\t// \tattackingBoard.find((e) => e.entityId === 2442),\r\n\t\t// );\r\n\t\tconst isAttackerFriendly = attackingBoard.every((entity) => entity.friendly);\r\n\t\tconst playerHero = isAttackerFriendly ? attackingBoardHero : defendingBoardHero;\r\n\t\tconst opponentHero = isAttackerFriendly ? defendingBoardHero : attackingBoardHero;\r\n\t\tconst friendlyBoard = isAttackerFriendly ? attackingBoard : defendingBoard;\r\n\t\tconst opponentBoard = isAttackerFriendly ? defendingBoard : attackingBoard;\r\n\t\tconst action: GameAction = buildGameAction(playerHero, opponentHero, {\r\n\t\t\ttype: 'attack',\r\n\t\t\tsourceEntityId: attackingEntity.entityId,\r\n\t\t\ttargetEntityId: defendingEntity.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\tplayerHand: this.sanitize(playerHero.hand),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\topponentHand: this.sanitize(opponentHero.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerStartOfCombat(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tfriendlyHero: BgsPlayerEntity,\r\n\t\topponentHero: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'start-of-combat',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPlayerAttack(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tdamage: number,\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'player-attack',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerOpponentAttack(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tdamage: number,\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'opponent-attack',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerDamageDealt(\r\n\t\tdamagingEntity: BoardEntity,\r\n\t\tdamagedEntity: BoardEntity,\r\n\t\tdamageTaken: number,\r\n\t\tdamagedEntityBoard: BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!damagingEntity.entityId) {\r\n\t\t\t// console.error('missing damaging entity id', damagingEntity.cardId);\r\n\t\t}\r\n\t\tconst friendlyBoard = damagedEntityBoard.every((entity) => entity.friendly) ? damagedEntityBoard : null;\r\n\t\tconst opponentBoard = damagedEntityBoard.every((entity) => !entity.friendly) ? damagedEntityBoard : null;\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'damage',\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tsourceEntityId: damagingEntity.entityId,\r\n\t\t\t\t\ttargetEntityId: damagedEntity.entityId,\r\n\t\t\t\t\tdamage: damageTaken,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPowerTarget(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket,\r\n\t\ttargetEntity: BoardEntity | BgsPlayerEntity,\r\n\t\ttargetBoard: BoardEntity[],\r\n\t\thero1: BgsPlayerEntity,\r\n\t\thero2: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!targetEntity) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.log('registerPowerTarget', stringifySimpleCard(sourceEntity), stringifySimpleCard(targetEntity), new Error().stack);\r\n\t\tconst friendlyBoard = targetBoard?.every((entity) => entity.friendly) ? targetBoard : null;\r\n\t\tconst opponentBoard = targetBoard?.every((entity) => !entity.friendly) ? targetBoard : null;\r\n\t\tconst friendlyHero = hero1?.friendly ? hero1 : hero2?.friendly ? hero2 : null;\r\n\t\tconst opponentHero = hero1?.friendly ? hero2 : hero2?.friendly ? hero1 : null;\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'power-target',\r\n\t\t\tsourceEntityId: sourceEntity.entityId,\r\n\t\t\ttargetEntityId: targetEntity.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero?.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero?.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPowerTargets(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket,\r\n\t\ttargetEntities: (BoardEntity | BgsPlayerEntity)[],\r\n\t\ttargetBoard: BoardEntity[],\r\n\t\thero1: BgsPlayerEntity,\r\n\t\thero2: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!targetEntities?.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.log('registerPowerTarget', stringifySimpleCard(sourceEntity), stringifySimpleCard(targetEntity), new Error().stack);\r\n\t\tconst friendlyBoard = targetBoard?.every((entity) => entity.friendly) ? targetBoard : null;\r\n\t\tconst opponentBoard = targetBoard?.every((entity) => !entity.friendly) ? targetBoard : null;\r\n\t\tconst friendlyHero = hero1?.friendly ? hero1 : hero2?.friendly ? hero2 : null;\r\n\t\tconst opponentHero = hero1?.friendly ? hero2 : hero2?.friendly ? hero1 : null;\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'power-target',\r\n\t\t\tsourceEntityId: sourceEntity.entityId,\r\n\t\t\ttargetEntityIds: targetEntities.map((entity) => entity.entityId),\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero?.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero?.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerMinionsSpawn(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardTrinket,\r\n\t\tboardOnWhichToSpawn: BoardEntity[],\r\n\t\tspawnedEntities: readonly BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!spawnedEntities || spawnedEntities.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!sourceEntity?.entityId) {\r\n\t\t\t// console.error('missing spawn source entity id', sourceEntity);\r\n\t\t}\r\n\t\tconst friendlyBoard = boardOnWhichToSpawn.every((entity) => entity.friendly) ? boardOnWhichToSpawn : null;\r\n\t\tconst opponentBoard = boardOnWhichToSpawn.every((entity) => !entity.friendly) ? boardOnWhichToSpawn : null;\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'spawn',\r\n\t\t\tspawns: this.sanitize(spawnedEntities),\r\n\t\t\tsourceEntityId: sourceEntity?.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerDeadEntities(\r\n\t\tdeadMinionIndexes1: number[],\r\n\t\tdeadEntities1: BoardEntity[],\r\n\t\tboard1: BoardEntity[],\r\n\t\tdeadMinionIndexes2: number[],\r\n\t\tdeadEntities2: BoardEntity[],\r\n\t\tboard2: BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.recording) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst deaths = [...(deadEntities1 || []), ...(deadEntities2 || [])];\r\n\t\tif (!deaths || deaths.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'minion-death',\r\n\t\t\tdeaths: this.sanitize(deaths),\r\n\t\t\tdeadMinionsPositionsOnBoard: [\r\n\t\t\t\t...(deadMinionIndexes1 || []).map((i) => board1.length - i),\r\n\t\t\t\t...(deadMinionIndexes2 || []).map((i) => board2.length - i),\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tprivate addAction(action: GameAction) {\r\n\t\tthis.actionsForCurrentBattle.push(action);\r\n\t}\r\n\r\n\tprivate collapseActions(actions: readonly GameAction[]): readonly GameAction[] {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tif (!actions || actions.length === 0) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tconst result: GameAction[] = [];\r\n\t\tfor (let i = 0; i < actions.length; i++) {\r\n\t\t\tconst action: GameAction = {\r\n\t\t\t\t...actions[i],\r\n\t\t\t\tplayerBoard: this.sanitize(actions[i].playerBoard),\r\n\t\t\t\topponentBoard: this.sanitize(actions[i].opponentBoard),\r\n\t\t\t\tplayerHand: this.sanitize(actions[i].playerHand),\r\n\t\t\t\topponentHand: this.sanitize(actions[i].opponentHand),\r\n\t\t\t\t// spawns: this.sanitize(actions[i].spawns),\r\n\t\t\t\tdeaths: this.sanitize(actions[i].deaths),\r\n\t\t\t\tplayerTrinkets: this.sanitizeTrinkets(actions[i].playerTrinkets),\r\n\t\t\t\topponentTrinkets: this.sanitizeTrinkets(actions[i].opponentTrinkets),\r\n\t\t\t};\r\n\t\t\t// action.playerBoard && console.debug('\\naction playerboard', stringifySimple(action.playerBoard));\r\n\t\t\tconst lastAction = result.length > 0 ? result[result.length - 1] : null;\r\n\r\n\t\t\tif (lastAction) {\r\n\t\t\t\taction.playerBoard = action.playerBoard ?? lastAction.playerBoard;\r\n\t\t\t\taction.opponentBoard = action.opponentBoard ?? lastAction.opponentBoard;\r\n\t\t\t\taction.playerHand = action.playerHand ?? lastAction.playerHand;\r\n\t\t\t\taction.opponentHand = action.opponentHand ?? lastAction.opponentHand;\r\n\t\t\t\taction.playerSecrets = action.playerSecrets ?? lastAction.playerSecrets;\r\n\t\t\t\taction.opponentSecrets = action.opponentSecrets ?? lastAction.opponentSecrets;\r\n\t\t\t\taction.playerRewardCardId = action.playerRewardCardId ?? lastAction.playerRewardCardId;\r\n\t\t\t\taction.playerRewardEntityId = action.playerRewardEntityId ?? lastAction.playerRewardEntityId;\r\n\t\t\t\taction.playerRewardData = action.playerRewardData ?? lastAction.playerRewardData;\r\n\t\t\t\taction.opponentRewardCardId = action.opponentRewardCardId ?? lastAction.opponentRewardCardId;\r\n\t\t\t\taction.opponentRewardEntityId = action.opponentRewardEntityId ?? lastAction.opponentRewardEntityId;\r\n\t\t\t\taction.opponentRewardData = action.opponentRewardData ?? lastAction.opponentRewardData;\r\n\t\t\t\taction.playerCardId = action.playerCardId ?? lastAction.playerCardId;\r\n\t\t\t\taction.playerEntityId = action.playerEntityId ?? lastAction.playerEntityId;\r\n\t\t\t\taction.playerHeroPowerCardId = action.playerHeroPowerCardId ?? lastAction.playerHeroPowerCardId;\r\n\t\t\t\taction.playerHeroPowerEntityId = action.playerHeroPowerEntityId ?? lastAction.playerHeroPowerEntityId;\r\n\t\t\t\taction.playerHeroPowerUsed = action.playerHeroPowerUsed ?? lastAction.playerHeroPowerUsed;\r\n\t\t\t\taction.opponentCardId = action.opponentCardId ?? lastAction.opponentCardId;\r\n\t\t\t\taction.opponentEntityId = action.opponentEntityId ?? lastAction.opponentEntityId;\r\n\t\t\t\taction.opponentHeroPowerCardId = action.opponentHeroPowerCardId ?? lastAction.opponentHeroPowerCardId;\r\n\t\t\t\taction.opponentHeroPowerEntityId =\r\n\t\t\t\t\taction.opponentHeroPowerEntityId ?? lastAction.opponentHeroPowerEntityId;\r\n\t\t\t\taction.opponentHeroPowerUsed = action.opponentHeroPowerUsed ?? lastAction.opponentHeroPowerUsed;\r\n\t\t\t\taction.playerTrinkets = action.playerTrinkets ?? lastAction.playerTrinkets;\r\n\t\t\t\taction.opponentTrinkets = action.opponentTrinkets ?? lastAction.opponentTrinkets;\r\n\t\t\t}\r\n\r\n\t\t\tif (lastAction && action.type === 'damage' && lastAction.type === 'attack') {\r\n\t\t\t\tlastAction.damages = lastAction.damages || [];\r\n\t\t\t\tlastAction.damages.push({\r\n\t\t\t\t\tdamage: action.damages[0].damage,\r\n\t\t\t\t\tsourceEntityId: action.damages[0].sourceEntityId,\r\n\t\t\t\t\ttargetEntityId: action.damages[0].targetEntityId,\r\n\t\t\t\t});\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else if (lastAction && action.type === 'damage' && lastAction.type === 'damage') {\r\n\t\t\t\tlastAction.damages = lastAction.damages || [];\r\n\t\t\t\tlastAction.damages.push({\r\n\t\t\t\t\tdamage: action.damages[0].damage,\r\n\t\t\t\t\tsourceEntityId: action.damages[0].sourceEntityId,\r\n\t\t\t\t\ttargetEntityId: action.damages[0].targetEntityId,\r\n\t\t\t\t});\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else if (\r\n\t\t\t\tlastAction &&\r\n\t\t\t\taction.type === 'power-target' &&\r\n\t\t\t\tlastAction.type === 'power-target' &&\r\n\t\t\t\taction.sourceEntityId === lastAction.sourceEntityId\r\n\t\t\t) {\r\n\t\t\t\tlastAction.targetEntityIds =\r\n\t\t\t\t\tlastAction.targetEntityIds ?? (lastAction.targetEntityId ? [lastAction.targetEntityId] : []);\r\n\t\t\t\taction.targetEntityIds =\r\n\t\t\t\t\taction.targetEntityIds ?? (action.targetEntityId ? [action.targetEntityId] : []);\r\n\t\t\t\tlastAction.targetEntityIds.push(...action.targetEntityIds);\r\n\t\t\t\t// So that when multiple Leapfroggers enchantments target the same minion,\r\n\t\t\t\t// we can count them in the replay viewer's text\r\n\t\t\t\t// lastAction.targetEntityIds = [...new Set(lastAction.targetEntityIds)];\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// Calling sanitize every time before we add an action to the list is mandatory, since\r\n\t// the entities and boards are mutable\r\n\tprivate sanitize(board: readonly BoardEntity[]): readonly BoardEntity[] {\r\n\t\tif (!board) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\treturn board.map(\r\n\t\t\t(entity) =>\r\n\t\t\t\t({\r\n\t\t\t\t\tentityId: entity.entityId,\r\n\t\t\t\t\tcardId: entity.cardId,\r\n\t\t\t\t\tfriendly: entity.friendly,\r\n\t\t\t\t\tattack: entity.attack,\r\n\t\t\t\t\thealth: entity.health,\r\n\t\t\t\t\tmaxHealth: entity.maxHealth,\r\n\t\t\t\t\ttaunt: entity.taunt,\r\n\t\t\t\t\tdivineShield: entity.divineShield,\r\n\t\t\t\t\tpoisonous: entity.poisonous,\r\n\t\t\t\t\tvenomous: entity.venomous,\r\n\t\t\t\t\treborn: entity.reborn,\r\n\t\t\t\t\twindfury: entity.windfury,\r\n\t\t\t\t\tstealth: entity.stealth,\r\n\t\t\t\t} as BoardEntity),\r\n\t\t);\r\n\t}\r\n\r\n\tprivate sanitizeTrinkets(trinkets: readonly BoardTrinket[]): readonly BoardTrinket[] {\r\n\t\tif (!trinkets?.length) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst result = trinkets.map(\r\n\t\t\t(t) =>\r\n\t\t\t\t({\r\n\t\t\t\t\tcardId: t.cardId,\r\n\t\t\t\t\tentityId: t.entityId,\r\n\t\t\t\t\tscriptDataNum1: t.scriptDataNum1,\r\n\t\t\t\t\tscriptDataNum6: t.scriptDataNum6,\r\n\t\t\t\t\ttags: t.tags,\r\n\t\t\t\t} as BoardTrinket),\r\n\t\t);\r\n\t\treturn result;\r\n\t}\r\n}\r\n"]}
@@ -6,7 +6,6 @@ const card_interface_1 = require("../cards/card.interface");
6
6
  const _card_mappings_1 = require("../cards/impl/_card-mappings");
7
7
  const utils_1 = require("../utils");
8
8
  const add_minion_to_board_1 = require("./add-minion-to-board");
9
- const attack_1 = require("./attack");
10
9
  const quest_1 = require("./quest");
11
10
  const setEntityStats = (entity, attack, health, board, boardHero, gameState, applyAttackAuras = true, applyHealthAuras = true) => {
12
11
  (0, add_minion_to_board_1.removeAurasFromSelf)(entity, board, boardHero, gameState, applyAttackAuras, applyHealthAuras);
@@ -27,6 +26,7 @@ const multiplyStats = (entity, multiplier, board, hero, gameState) => {
27
26
  };
28
27
  exports.multiplyStats = multiplyStats;
29
28
  const modifyStats = (entity, source, attackAmount, healthAmount, friendlyBoard, friendlyBoardHero, gameState, registerSpectator = true, isEnchantment = true, countsAsStatsGain = true) => {
29
+ var _a, _b;
30
30
  if (!(entity === null || entity === void 0 ? void 0 : entity.maxHealth)) {
31
31
  return;
32
32
  }
@@ -38,29 +38,55 @@ const modifyStats = (entity, source, attackAmount, healthAmount, friendlyBoard,
38
38
  attackAmount += 2 * buff;
39
39
  healthAmount += 1 * buff;
40
40
  }
41
- if ((entity === null || entity === void 0 ? void 0 : entity.entityId) !== (source === null || source === void 0 ? void 0 : source.entityId) &&
42
- (0, utils_1.hasCorrectTribe)(source, friendlyBoardHero, reference_data_1.Race.ELEMENTAL, gameState.anomalies, gameState.allCards) &&
41
+ const sourceEntity = source;
42
+ const globalInfo = friendlyBoardHero.globalInfo;
43
+ if (entity.entityId !== (source === null || source === void 0 ? void 0 : source.entityId) &&
44
+ (sourceEntity === null || sourceEntity === void 0 ? void 0 : sourceEntity.maxHealth) &&
43
45
  attackAmount >= 0 &&
44
- healthAmount >= 0) {
45
- attackAmount += friendlyBoardHero.globalInfo.ElementalAttackBuff;
46
- healthAmount += friendlyBoardHero.globalInfo.ElementalHealthBuff;
47
- }
48
- if ((entity === null || entity === void 0 ? void 0 : entity.entityId) !== (source === null || source === void 0 ? void 0 : source.entityId) &&
49
- (0, utils_1.hasCorrectTribe)(source, friendlyBoardHero, reference_data_1.Race.PIRATE, gameState.anomalies, gameState.allCards) &&
50
- attackAmount >= 0 &&
51
- healthAmount >= 0) {
52
- attackAmount += friendlyBoardHero.globalInfo.PirateAttackBuff;
53
- healthAmount += friendlyBoardHero.globalInfo.PirateHealthBuff;
46
+ healthAmount >= 0 &&
47
+ (globalInfo.ElementalAttackBuff ||
48
+ globalInfo.ElementalHealthBuff ||
49
+ globalInfo.PirateAttackBuff ||
50
+ globalInfo.PirateHealthBuff)) {
51
+ const sourceTribes = (0, utils_1.getEffectiveTribesForEntity)(sourceEntity, friendlyBoardHero, gameState.anomalies, gameState.allCards);
52
+ const sourceIsAllTribes = sourceTribes.includes(reference_data_1.Race.ALL);
53
+ if (sourceIsAllTribes || sourceTribes.includes(reference_data_1.Race.ELEMENTAL)) {
54
+ attackAmount += globalInfo.ElementalAttackBuff;
55
+ healthAmount += globalInfo.ElementalHealthBuff;
56
+ }
57
+ if (sourceIsAllTribes || sourceTribes.includes(reference_data_1.Race.PIRATE)) {
58
+ attackAmount += globalInfo.PirateAttackBuff;
59
+ healthAmount += globalInfo.PirateHealthBuff;
60
+ }
54
61
  }
55
62
  const otherBoardHero = gameState.gameState.player.player === friendlyBoardHero
56
63
  ? gameState.gameState.opponent.player
57
64
  : gameState.gameState.player.player;
58
- const neighbours = (0, attack_1.getNeighbours)(friendlyBoard, entity);
59
- const poetMultipliers = isEnchantment &&
60
- (0, utils_1.hasCorrectTribe)(entity, friendlyBoardHero, reference_data_1.Race.DRAGON, gameState.anomalies, gameState.allCards)
61
- ? neighbours.filter((e) => e.cardId === "BG29_813_G").length * 2 +
62
- friendlyBoard.filter((e) => e.cardId === "BG34_Giant_314_G").length * 2 || 1
63
- : 1;
65
+ const effectiveTribes = (0, utils_1.getEffectiveTribesForEntity)(entity, friendlyBoardHero, gameState.anomalies, gameState.allCards);
66
+ const isAllTribes = effectiveTribes.includes(reference_data_1.Race.ALL);
67
+ const isDragon = isAllTribes || effectiveTribes.includes(reference_data_1.Race.DRAGON);
68
+ const isElemental = isAllTribes || effectiveTribes.includes(reference_data_1.Race.ELEMENTAL);
69
+ let poetMultipliers = 1;
70
+ if (isEnchantment && isDragon) {
71
+ let entityIndex = -1;
72
+ let timewarpedPoetCount = 0;
73
+ for (let i = 0; i < friendlyBoard.length; i++) {
74
+ if (friendlyBoard[i].entityId === entity.entityId) {
75
+ entityIndex = i;
76
+ }
77
+ if (friendlyBoard[i].cardId === "BG34_Giant_314_G") {
78
+ timewarpedPoetCount++;
79
+ }
80
+ }
81
+ let poetCount = 0;
82
+ if (((_a = friendlyBoard[entityIndex - 1]) === null || _a === void 0 ? void 0 : _a.cardId) === "BG29_813_G") {
83
+ poetCount++;
84
+ }
85
+ if (((_b = friendlyBoard[entityIndex + 1]) === null || _b === void 0 ? void 0 : _b.cardId) === "BG29_813_G") {
86
+ poetCount++;
87
+ }
88
+ poetMultipliers = poetCount * 2 + timewarpedPoetCount * 2 || 1;
89
+ }
64
90
  const tarecgosaMultiplier = isEnchantment && entity.cardId === "BG21_015_G" ? 2 : 1;
65
91
  const realAttackAmount = attackAmount * poetMultipliers * tarecgosaMultiplier;
66
92
  const realHealthAmount = healthAmount * poetMultipliers * tarecgosaMultiplier;
@@ -71,49 +97,52 @@ const modifyStats = (entity, source, attackAmount, healthAmount, friendlyBoard,
71
97
  entity.health += realHealthAmount;
72
98
  if (realAttackAmount > 0) {
73
99
  entity.maxAttack += realAttackAmount;
74
- if ((0, utils_1.hasCorrectTribe)(entity, friendlyBoardHero, reference_data_1.Race.DRAGON, gameState.anomalies, gameState.allCards)) {
75
- if (entity.cardId !== "BG26_966" && entity.cardId !== "BG26_966_G") {
76
- const stormbringers = friendlyBoard.filter((e) => e.cardId === "BG26_966" || e.cardId === "BG26_966_G");
77
- stormbringers.forEach((stormbringer) => {
78
- const multiplier = stormbringer.cardId === "BG26_966_G" ? 2 : 1;
79
- stormbringer.attack += multiplier * realAttackAmount;
80
- gameState.spectator.registerPowerTarget(stormbringer, stormbringer, friendlyBoard, friendlyBoardHero, otherBoardHero);
81
- });
82
- }
83
- }
84
- friendlyBoard
85
- .filter((e) => e.cardId === "TB_BaconShop_HERO_52_Buddy" ||
86
- e.cardId === "TB_BaconShop_HERO_52_Buddy_G")
87
- .forEach((sinestra) => {
88
- const buff = sinestra.cardId === "TB_BaconShop_HERO_52_Buddy_G" ? 2 : 1;
89
- entity.health += buff;
90
- gameState.spectator.registerPowerTarget(sinestra, entity, friendlyBoard, friendlyBoardHero, otherBoardHero);
91
- });
92
100
  }
93
101
  if (realHealthAmount > 0) {
94
102
  entity.maxHealth += realHealthAmount;
95
- const titanicGuardians = friendlyBoard
96
- .filter((e) => e.entityId !== entity.entityId)
97
- .filter((e) => e.cardId === "TB_BaconShop_HERO_39_Buddy" ||
98
- e.cardId === "TB_BaconShop_HERO_39_Buddy_G");
99
- titanicGuardians.forEach((guardian) => {
100
- const buff = (guardian.cardId === "TB_BaconShop_HERO_39_Buddy_G" ? 2 : 1) * realHealthAmount;
101
- if (buff > 0) {
102
- guardian.health += buff;
103
- guardian.maxHealth += buff;
103
+ }
104
+ if (realAttackAmount > 0 || realHealthAmount > 0) {
105
+ const checkStormbringer = realAttackAmount > 0 &&
106
+ isDragon &&
107
+ entity.cardId !== "BG26_966" &&
108
+ entity.cardId !== "BG26_966_G";
109
+ for (const other of friendlyBoard) {
110
+ const otherCardId = other.cardId;
111
+ if (realAttackAmount > 0) {
112
+ if (checkStormbringer &&
113
+ (otherCardId === "BG26_966" ||
114
+ otherCardId === "BG26_966_G")) {
115
+ const multiplier = otherCardId === "BG26_966_G" ? 2 : 1;
116
+ other.attack += multiplier * realAttackAmount;
117
+ gameState.spectator.registerPowerTarget(other, other, friendlyBoard, friendlyBoardHero, otherBoardHero);
118
+ }
119
+ if (otherCardId === "TB_BaconShop_HERO_52_Buddy" ||
120
+ otherCardId === "TB_BaconShop_HERO_52_Buddy_G") {
121
+ const buff = otherCardId === "TB_BaconShop_HERO_52_Buddy_G" ? 2 : 1;
122
+ entity.health += buff;
123
+ gameState.spectator.registerPowerTarget(other, entity, friendlyBoard, friendlyBoardHero, otherBoardHero);
124
+ }
104
125
  }
105
- });
126
+ if (realHealthAmount > 0 &&
127
+ other.entityId !== entity.entityId &&
128
+ (otherCardId === "TB_BaconShop_HERO_39_Buddy" ||
129
+ otherCardId === "TB_BaconShop_HERO_39_Buddy_G")) {
130
+ const buff = (otherCardId === "TB_BaconShop_HERO_39_Buddy_G" ? 2 : 1) * realHealthAmount;
131
+ other.health += buff;
132
+ other.maxHealth += buff;
133
+ }
134
+ }
106
135
  }
107
136
  if (registerSpectator && !!source) {
108
137
  gameState.spectator.registerPowerTarget(source, entity, friendlyBoard, friendlyBoardHero, otherBoardHero);
109
138
  }
110
139
  if (countsAsStatsGain) {
111
- onStatsUpdate(entity, source, realAttackAmount, realHealthAmount, friendlyBoard, friendlyBoardHero, otherBoardHero, gameState);
140
+ onStatsUpdate(entity, source, realAttackAmount, realHealthAmount, friendlyBoard, friendlyBoardHero, otherBoardHero, gameState, isElemental);
112
141
  }
113
142
  };
114
143
  exports.modifyStats = modifyStats;
115
- const onStatsUpdate = (entity, source, realAttackAmount, realHealthAmount, friendlyBoard, friendlyHero, otherHero, gameState) => {
116
- onStatUpdateMinions(entity, source, realAttackAmount, realHealthAmount, friendlyBoard, friendlyHero, otherHero, gameState);
144
+ const onStatsUpdate = (entity, source, realAttackAmount, realHealthAmount, friendlyBoard, friendlyHero, otherHero, gameState, isElemental) => {
145
+ onStatUpdateMinions(entity, source, realAttackAmount, realHealthAmount, friendlyBoard, friendlyHero, otherHero, gameState, isElemental);
117
146
  onStatUpdateQuests(entity, friendlyBoard, friendlyHero, gameState);
118
147
  };
119
148
  const applyAfterStatsUpdate = (gameState) => {
@@ -148,7 +177,7 @@ const onStatUpdateQuests = (entity, board, hero, gameState) => {
148
177
  }
149
178
  }
150
179
  };
151
- const onStatUpdateMinions = (entity, source, attackAmount, healthAmount, friendlyBoard, friendlyBoardHero, otherHero, gameState) => {
180
+ const onStatUpdateMinions = (entity, source, attackAmount, healthAmount, friendlyBoard, friendlyBoardHero, otherHero, gameState, isElemental) => {
152
181
  if (attackAmount > 0 || healthAmount > 0) {
153
182
  for (const boardEntity of friendlyBoard) {
154
183
  const onStatsChangedImpl = _card_mappings_1.cardMappings[boardEntity.cardId];
@@ -166,21 +195,21 @@ const onStatUpdateMinions = (entity, source, attackAmount, healthAmount, friendl
166
195
  }
167
196
  }
168
197
  }
169
- if ((0, utils_1.hasCorrectTribe)(entity, friendlyBoardHero, reference_data_1.Race.ELEMENTAL, gameState.anomalies, gameState.allCards)) {
170
- const masterOfRealities = friendlyBoard.filter((e) => e.cardId === "BG21_036" || e.cardId === "BG21_036_G");
171
- masterOfRealities.forEach((master) => {
198
+ for (const other of friendlyBoard) {
199
+ if (isElemental &&
200
+ (other.cardId === "BG21_036" ||
201
+ other.cardId === "BG21_036_G")) {
172
202
  const baseBuff = 2;
173
- const mult = master.cardId === "BG21_036_G" ? 2 : 1;
174
- (0, exports.modifyStats)(master, master, baseBuff * mult, baseBuff * mult, friendlyBoard, friendlyBoardHero, gameState);
175
- });
176
- }
177
- const tentaclesOfCthun = friendlyBoard
178
- .filter((e) => e.entityId !== entity.entityId)
179
- .filter((e) => e.cardId === "TB_BaconShop_HERO_29_Buddy" ||
180
- e.cardId === "TB_BaconShop_HERO_29_Buddy_G");
181
- tentaclesOfCthun.forEach((tentacle) => {
182
- tentacle.attack += tentacle.cardId === "TB_BaconShop_HERO_29_Buddy_G" ? 2 : 1;
183
- tentacle.health += tentacle.cardId === "TB_BaconShop_HERO_29_Buddy_G" ? 2 : 1;
184
- });
203
+ const mult = other.cardId === "BG21_036_G" ? 2 : 1;
204
+ (0, exports.modifyStats)(other, other, baseBuff * mult, baseBuff * mult, friendlyBoard, friendlyBoardHero, gameState);
205
+ }
206
+ if (other.entityId !== entity.entityId &&
207
+ (other.cardId === "TB_BaconShop_HERO_29_Buddy" ||
208
+ other.cardId === "TB_BaconShop_HERO_29_Buddy_G")) {
209
+ const buff = other.cardId === "TB_BaconShop_HERO_29_Buddy_G" ? 2 : 1;
210
+ other.attack += buff;
211
+ other.health += buff;
212
+ }
213
+ }
185
214
  };
186
215
  //# sourceMappingURL=stats.js.map