@firestone-hs/simulate-bgs-battle 1.1.671 → 1.1.673

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.
@@ -6,7 +6,7 @@ exports.HardyOrca = {
6
6
  cardIds: ["BG34_312", "BG34_312_G"],
7
7
  onDamaged: (minion, input) => {
8
8
  const mult = minion.cardId === "BG34_312_G" ? 2 : 1;
9
- const targets = input.board.filter((e) => e !== minion);
9
+ const targets = input.board.filter((e) => e !== minion && e.health > 0 && !e.definitelyDead);
10
10
  for (const target of targets) {
11
11
  (0, stats_1.modifyStats)(target, minion, 1 * mult, 1 * mult, input.board, input.hero, input.gameState);
12
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"hardy-orca.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/hardy-orca.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AAG3C,QAAA,SAAS,GAAkB;IACvC,OAAO,EAAE,0BAA0D;IACnE,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;QACxD,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1F;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnDamagedCard, OnDamagedInput } from '../../card.interface';\r\n\r\nexport const HardyOrca: OnDamagedCard = {\r\n\tcardIds: [CardIds.HardyOrca_BG34_312, CardIds.HardyOrca_BG34_312_G],\r\n\tonDamaged: (minion: BoardEntity, input: OnDamagedInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.HardyOrca_BG34_312_G ? 2 : 1;\r\n\t\tconst targets = input.board.filter((e) => e !== minion);\r\n\t\tfor (const target of targets) {\r\n\t\t\tmodifyStats(target, minion, 1 * mult, 1 * mult, input.board, input.hero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"hardy-orca.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/hardy-orca.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AAG3C,QAAA,SAAS,GAAkB;IACvC,OAAO,EAAE,0BAA0D;IACnE,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC7F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1F;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnDamagedCard, OnDamagedInput } from '../../card.interface';\r\n\r\nexport const HardyOrca: OnDamagedCard = {\r\n\tcardIds: [CardIds.HardyOrca_BG34_312, CardIds.HardyOrca_BG34_312_G],\r\n\tonDamaged: (minion: BoardEntity, input: OnDamagedInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.HardyOrca_BG34_312_G ? 2 : 1;\r\n\t\tconst targets = input.board.filter((e) => e !== minion && e.health > 0 && !e.definitelyDead);\r\n\t\tfor (const target of targets) {\r\n\t\t\tmodifyStats(target, minion, 1 * mult, 1 * mult, input.board, input.hero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -219,7 +219,8 @@ const applyAurasToSelf = (spawned, board, boardHero, gameState) => {
219
219
  gameState.spectator.registerPowerTarget(boardHero, spawned, board, null, null);
220
220
  }
221
221
  }
222
- if ((0, utils_2.isVolumizer)(spawned.cardId, boardHero, gameState.anomalies, gameState.allCards)) {
222
+ if ((0, utils_2.isVolumizer)(spawned.cardId, boardHero, gameState.anomalies, gameState.allCards) &&
223
+ !(0, utils_2.alreadyHasVolumizerBuff)(spawned, boardHero, gameState)) {
223
224
  if (boardHero.globalInfo.VolumizerAttackBuff > 0 || boardHero.globalInfo.VolumizerHealthBuff > 0) {
224
225
  (0, stats_1.modifyStats)(spawned, spawned, (_c = boardHero.globalInfo.VolumizerAttackBuff) !== null && _c !== void 0 ? _c : 0, (_d = boardHero.globalInfo.VolumizerHealthBuff) !== null && _d !== void 0 ? _d : 0, board, boardHero, gameState, false);
225
226
  gameState.spectator.registerPowerTarget(boardHero, spawned, board, null, null);
@@ -1 +1 @@
1
- {"version":3,"file":"add-minion-to-board.js","sourceRoot":"","sources":["../../src/simulation/add-minion-to-board.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,4DAMiC;AACjC,oDAAqD;AACrD,iEAA4D;AAC5D,6EAAkG;AAClG,6DAA+D;AAC/D,6CAAgD;AAEhD,6CAA+C;AAC/C,oCAAoE;AAEpE,mCAAiD;AACjD,mCAAsD;AAE/C,MAAM,iBAAiB,GAAG,CAChC,KAAoB,EACpB,SAA0B,EAC1B,UAAyB,EACzB,SAA0B,EAC1B,KAAa,EACb,YAAoC,EACpC,SAAwB,EACjB,EAAE;IAET,KAAK,MAAM,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE;QACtD,IAAA,wBAAgB,EAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;KAChG;IACD,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAC3F,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B;AAEK,MAAM,gBAAgB,GAAG,CAC/B,KAAoB,EACpB,SAA0B,EAC1B,UAAyB,EACzB,SAA0B,EAC1B,KAAa,EACb,WAAwB,EACxB,SAAwB,EACxB,wBAAwB,GAAG,IAAI,EAC/B,cAAc,GAAG,IAAI,EACd,EAAE;IACT,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IAGpC,IAAA,mCAA2B,EAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAE7G,IAAA,wBAAgB,EAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9C,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACnG,IAAI,wBAAwB,EAAE;QAC7B,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;KAC3F;AACF,CAAC,CAAC;AArBW,QAAA,gBAAgB,oBAqB3B;AAEF,MAAM,iBAAiB,GAAG,CACzB,KAAoB,EACpB,SAA0B,EAC1B,UAAyB,EACzB,SAA0B,EAC1B,OAAoB,EACpB,SAAwB,EACxB,cAAc,GAAG,IAAI,EACd,EAAE;;IACT,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,MAAA,OAAO,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,CAAC;IAGrE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,2BAAc,CAAC,QAAQ,CAAC,MAAiB,CAAC,CAAC,EAAE;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,0BAA2C,CAAC,CAAC;QACtG,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,4BAA6C,CAAC,CAAC;QAC9G,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;KACH;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;QAE3B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;YACzC,SAAS;SACT;QAED,MAAM,kBAAkB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,IAAA,kCAAiB,EAAC,kBAAkB,CAAC,EAAE;YAC1C,kBAAkB,CAAC,cAAc,CAAC,MAAM,EAAE;gBACzC,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,UAAU;gBACtB,SAAS,EAAE,SAAS;gBACpB,cAAc;gBACd,SAAS;aACT,CAAC,CAAC;SACH;QAED,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB;gBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAC5F,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;wBACzB,IAAA,kCAAkB,EAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;qBACzE;oBACD,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBAC/D,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;iBACrF;gBACD,MAAM;YASP,eAA8B;YAC9B;gBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAC7F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,sBAAqC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/E,IAAA,mBAAW,EAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBAClF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;iBACrF;gBACD,MAAM;YASP,eAAgC;YAChC;gBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAC7F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,sBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChF,IAAA,mBAAW,EAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBACzE,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;iBACrF;gBACD,MAAM;SACP;KACD;AACF,CAAC,CAAC;AACK,MAAM,2BAA2B,GAAG,CAC1C,KAAoB,EACpB,SAA0B,EAC1B,UAAyB,EACzB,SAA0B,EAC1B,OAAoB,EACpB,SAAwB,EACxB,cAAc,GAAG,IAAI,EACrB,iBAAiB,GAAG,IAAI,EACjB,EAAE;;IACT,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE;QAC7C,QAAQ,SAAS,CAAC,MAAM,EAAE;YACzB;gBACC,IAAI,iBAAiB,EAAE;oBACtB,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBACnE,IAAA,mBAAW,EAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;iBACnE;gBACD,MAAM;SACP;KACD;IAED,IAAI,MAAA,SAAS,CAAC,YAAY,0CAAE,QAAQ,mBAA0C,EAAE;QAC/E,MAAM,qBAAqB,GAC1B,CAAA,MAAA,MAAA,SAAS,CAAC,mBAAmB,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,sBAA6C,CAAC,0CAC9F,cAAc,KAAI,CAAC,CAAC;QACxB,IAAA,mBAAW,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;KAC3G;IAED,IAAI,iBAAiB,EAAE;QACtB,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE;YACzC,QAAQ,OAAO,CAAC,MAAM,EAAE;gBACvB;oBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;wBAC5F,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;wBAChE,IAAI,CAAC,CAAC,MAAM,EAAE;4BACb,IAAA,kCAAkB,EAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;yBACzE;qBACD;oBACD,MAAM;gBACP,0BAAgD;gBAChD;oBACC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;wBAC9B,OAAO,CAAC,gBAAgB,GAAG,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;qBAC/C;oBACD,MAAM;gBACP;oBACC,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;wBACxD,IAAA,kCAAkB,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;wBAC1E,OAAO,CAAC,cAAc,EAAE,CAAC;qBACzB;oBACD,MAAM;aACP;SACD;KACD;IAGD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,MAAA,OAAO,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,aAAa,IAAI,OAAO,EAAE;QACpC,2BAA2B,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;KACpG;IAGD,IAAI,cAAc,EAAE;QAKnB,IAAA,wBAAgB,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;KACvD;IAED,IAAI,iBAAiB,EAAE;QACtB,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;YAC7F,SAAS,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC;YAChD,SAAS,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC;SAC9C;QACD,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;YAC9F,SAAS,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC;SAC/C;KACD;AACF,CAAC,CAAC;AA/EW,QAAA,2BAA2B,+BA+EtC;AAEK,MAAM,gBAAgB,GAAG,CAC/B,OAAoB,EACpB,KAAoB,EACpB,SAA0B,EAC1B,SAAwB,EACjB,EAAE;;IACT,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAExD,IAAI,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,YAAY,0CAAE,MAAM,CAAA,EAAE;QACrC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,YAAY,EAAE;YAC3C,QAAQ,KAAK,EAAE;gBACd;oBACC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;wBACzB,MAAM,oBAA2C;wBACjD,cAAc,EAAE,SAAS;wBACzB,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE;qBAC/C,CAAC,CAAC;oBACH,MAAM;gBACP;oBACC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,MAAM;aACP;SACD;KACD;IAED,IAAI,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,QAAQ,0CAAE,MAAM,CAAA,EAAE;QACjC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE;YACzC,QAAQ,OAAO,CAAC,MAAM,EAAE;gBACvB;oBACC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,MAAM;gBACP;oBACC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,MAAM;gBACP;oBACC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;oBAC9C,MAAM;gBACP;oBACC,IAAI,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;wBAC5D,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;wBACpB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;qBACpB;oBACD,MAAM;gBACP;oBACC,IACC,OAAO,CAAC,MAAM,eAA8C;wBAC5D,OAAO,CAAC,MAAM,uBAAsD,EACnE;wBACD,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;qBACpB;oBACD,MAAM;aACP;SACD;KACD;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,0BAA0B,GAAG,CAAC,EAAE;QACxD,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,SAAS,CAAC,UAAU,CAAC,0BAA0B,EAC/C,CAAC,EACD,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;KACF;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,0BAA0B,GAAG,CAAC,EAAE;QACxD,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,CAAC,EACD,SAAS,CAAC,UAAU,CAAC,0BAA0B,EAC/C,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;KACF;IACD,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC9F,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,EAAE;YAC/C,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,SAAS,CAAC,UAAU,CAAC,iBAAiB,EACtC,CAAC,EACD,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;SACF;KACD;IACD,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC9F,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,EAAE;YAC/C,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,SAAS,CAAC,UAAU,CAAC,iBAAiB,EACtC,CAAC,EACD,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;SACF;KACD;IACD,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC7F,IAAI,SAAS,CAAC,UAAU,CAAC,eAAe,GAAG,CAAC,EAAE;YAC7C,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,SAAS,CAAC,UAAU,CAAC,eAAe,EACpC,SAAS,CAAC,UAAU,CAAC,kBAAkB,EACvC,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SAC/E;KACD;IACD,IAAI,IAAA,mBAAW,EAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QACpF,IAAI,SAAS,CAAC,UAAU,CAAC,mBAAmB,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,mBAAmB,GAAG,CAAC,EAAE;YACjG,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,MAAA,SAAS,CAAC,UAAU,CAAC,mBAAmB,mCAAI,CAAC,EAC7C,MAAA,SAAS,CAAC,UAAU,CAAC,mBAAmB,mCAAI,CAAC,EAC7C,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SAC/E;KACD;IAQD,IAAI,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACjE,MAAM,OAAO,GAAG,MAAA,SAAS,CAAC,UAAU,CAAC,uBAAuB,mCAAI,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAA,SAAS,CAAC,UAAU,CAAC,uBAAuB,mCAAI,CAAC,CAAC;QACrE,IAAA,mBAAW,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;KACvF;IACD,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;QAC3B,MAAM,kBAAkB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,IAAA,sCAAqB,EAAC,kBAAkB,CAAC,EAAE;YAC9C,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,EAAE;gBAC7C,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,KAAK;gBACZ,SAAS;aACT,CAAC,CAAC;SACH;QACD,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB,kBAA8C;YAC9C;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACzF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1F;gBACD,MAAM;YACP,mBAA+C;YAC/C;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACzF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1F,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1F;gBACD,MAAM;YAUP,gBAAkC;YAClC;gBACC,IAAI,OAAO,CAAC,YAAY,EAAE;oBACzB,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC5E;gBACD,MAAM;YACP,gBAAgC;YAChC;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACzF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC;iBAClG;gBACD,MAAM;SACP;KACD;IAED,MAAM,aAAa,GAAG,6BAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,IAAA,6BAAY,EAAC,aAAa,CAAC,EAAE;QAChC,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE;YAChC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,SAAS;SACpB,CAAC,CAAC;KACH;IACD,QAAQ,OAAO,CAAC,MAAM,EAAE;QACvB,gBAAoC;QACpC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,iBAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,0BAA0B,CAAC;YAC5F,IAAA,mBAAW,EACV,OAAO,EACP,IAAI,EACJ,sCAAmB,GAAG,gBAAgB,EACtC,sCAAmB,GAAG,gBAAgB,EACtC,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,MAAM;QACP,gBAAwC;QACxC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,wBAAwB,CAAC;YAC1F,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACvG,MAAM;QACP,gBAA2C;QAC3C;YACC,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC;YACtF,IAAA,mBAAW,EACV,OAAO,EACP,IAAI,EACJ,CAAC,GAAG,mBAAmB,EACvB,mBAAmB,EACnB,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,MAAM;QACP,eAAiC;QACjC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,sBAAwC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,uBAAuB,CAAC;YACzF,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAC3G,MAAM;QACP,kBAAwC;QACxC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,mBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,gCAAgC,GAAG,CAAC,CAAC,CAAC;YACxG,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAC3G,MAAM;QACP,gBAAmC;QACnC;YACC,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,MAAM,eAAe,GACpB,eAAe,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YACtG,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACnF,MAAM;KACP;AACF,CAAC,CAAC;AApRW,QAAA,gBAAgB,oBAoR3B;AAIK,MAAM,mBAAmB,GAAG,CAClC,MAAmB,EACnB,KAAoB,EACpB,SAA0B,EAC1B,SAAwB,EACjB,EAAE;;IACT,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAEpE,MAAM,eAAe,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,IAAA,+BAAc,EAAC,eAAe,CAAC,EAAE;QACpC,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE;YACnC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,KAAK;YACZ,SAAS;SACT,CAAC,CAAC;KACH;IAED,IAAI,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,YAAY,0CAAE,MAAM,CAAA,EAAE;QACrC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,YAAY,EAAE;YAC3C,QAAQ,KAAK,EAAE;gBACd;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,uBAA8C,CAC7D,CAAC;oBACF,MAAM;gBACP;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM;gBACP;oBACC,IACC,MAAM,CAAC,MAAM,eAAyC;wBACtD,MAAM,CAAC,MAAM,iBAA2C,EACvD;wBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;qBAC/C;oBACD,MAAM;aACP;SACD;KACD;IAED,IAAI,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,QAAQ,0CAAE,MAAM,CAAA,EAAE;QACjC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE;YACzC,QAAQ,OAAO,CAAC,MAAM,EAAE;gBACvB;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM;gBACP;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM;gBACP;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC3E,MAAM;gBACP;oBACC,IAAI,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;wBAC3D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;qBAC/C;oBACD,MAAM;aACP;SACD;KACD;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,0BAA0B,GAAG,CAAC,EAAE;QACxD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;KAC7F;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,0BAA0B,GAAG,CAAC,EAAE;QACxD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;KAC7F;IACD,IAAI,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC7F,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,EAAE;YAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;SACpF;KACD;IACD,IAAI,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC5F,IAAI,SAAS,CAAC,UAAU,CAAC,eAAe,GAAG,CAAC,EAAE;YAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YAClF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;SACrF;KACD;IAED,KAAK,MAAM,WAAW,IAAI,KAAK,EAAE;QAChC,QAAQ,WAAW,CAAC,MAAM,EAAE;YAC3B,kBAA8C;YAC9C;gBACC,IACC,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACxF,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EACvC;oBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9F,CAAC;iBACF;gBACD,MAAM;YACP,mBAA+C;YAC/C;gBACC,IACC,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACxF,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EACvC;oBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9F,CAAC;oBACF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9F,CAAC;iBACF;gBACD,MAAM;YAaP,gBAAkC;YAClC;gBACC,IAAI,MAAM,CAAC,YAAY,EAAE;oBACxB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAChF,CAAC;iBACF;gBACD,MAAM;YACP,gBAAgC;YAChC;gBACC,IACC,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACxF,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EACvC;oBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM;wBACZ,CAAC,WAAW,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CACrF,CAAC;iBACF;gBACD,MAAM;SACP;KACD;IAED,QAAQ,MAAM,CAAC,MAAM,EAAE;QACtB,gBAAoC;QACpC;YACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,iBAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,0BAA0B,CAAC;YAC5F,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,sCAAmB,GAAG,gBAAgB,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,sCAAmB,GAAG,gBAAgB,CAAC,CAAC;YACpF,MAAM;QACP,gBAAwC;QACxC;YACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,wBAAwB,CAAC;YAC1F,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAClE,MAAM;QACP,gBAA2C;QAC3C;YACC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9F,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC;YACtF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC;YACjE,MAAM;QACP,kBAAwC;QACxC;YACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,mBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAGxF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,gCAAgC,GAAG,CAAC,CAAC,CAAC;YACxG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAClE,MAAM;QACP,gBAAmC;QACnC;YACC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,MAAM,eAAe,GACpB,eAAe,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YACrG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;YAC7D,MAAM;KACP;IAED,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE;QAC9C,QAAQ,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,EAAE;YAC5B;gBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;gBAC3E,MAAM;SACP;KACD;AACF,CAAC,CAAC;AAtMW,QAAA,mBAAmB,uBAsM9B;AAEF,MAAM,2BAA2B,GAAG,CACnC,aAAqB,EACrB,OAAoB,EACpB,KAAoB,EACpB,SAA0B,EAC1B,SAAwB,EACxB,iBAAiB,GAAG,IAAI,EACjB,EAAE;IACT,QAAQ,aAAa,EAAE;QACtB,mBAA+C;QAC/C;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAe,EAAC,CAAC,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;iBAElG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;iBAC9C,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrF,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,CAAC,CAAC,CAAC;YACJ,MAAM;QACP,kBAA8C;QAC9C;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAe,EAAC,CAAC,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;iBAClG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;iBAC9C,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,CAAC,CAAC,CAAC;YACJ,MAAM;QAUP,gBAAkC;QAClC;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;iBAC7B,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YACJ,MAAM;QAEP,gBAAgC;QAChC;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAe,EAAC,CAAC,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;iBAClG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;iBAC9C,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC;YAC9F,CAAC,CAAC,CAAC;YACJ,MAAM;QACP,kBAAwC;QACxC;YAEC,IAAI,iBAAiB,EAAE;gBACtB,SAAS,CAAC,UAAU,CAAC,gCAAgC,EAAE,CAAC;aACxD;YACD,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;iBAC9C,MAAM,CACN,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,MAAM,iBAAuC;gBAC/C,CAAC,CAAC,MAAM,mBAAyC,CAClD;iBACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,mBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,IAAA,mBAAW,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACnG,CAAC,CAAC,CAAC;YACJ,MAAM;QACP,gBAAqC;QACrC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,kBAAkB,GAAG,gBAAgB,EAC9D,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,kBAAkB,GAAG,gBAAgB,EAC9D,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,MAAM;KACP;AACF,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC/B,KAAoB,EACpB,IAAqB,EACrB,UAAyB,EACzB,SAA0B,EAC1B,UAAkC,EAClC,SAAwB,EACjB,EAAE;IACT,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE;QACjC,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;KAC/E;AACF,CAAC,CAAC;AAEK,MAAM,gBAAgB,GAAG,CAAC,IAAqB,EAAE,KAAoB,EAAE,SAAwB,EAAQ,EAAE;;IAC/G,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,aAAa,mCAAI,EAAE,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QACnB,OAAO;KACP;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC3B,QAAQ,KAAK,CAAC,MAAM,EAAE;YACrB;gBACC,IAAA,8BAAsB,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBACtD,MAAM;SACP;KACD;AACF,CAAC,CAAC;AAbW,QAAA,gBAAgB,oBAa3B;AAEF,MAAM,sBAAsB,GAAG,CAC9B,KAAoB,EACpB,IAAqB,EACrB,UAAyB,EACzB,SAA0B,EAC1B,OAAoB,EACpB,SAAwB,EACjB,EAAE;;IAET,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,MAAA,IAAI,CAAC,QAAQ,mCAAI,EAAE,EAAE;QAC1C,MAAM,kBAAkB,GAAG,6BAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,IAAA,qCAAoB,EAAC,kBAAkB,CAAC,EAAE;YAC7C,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,EAAE;gBAC7C,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;gBACZ,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,UAAU;gBACtB,SAAS;gBACT,cAAc,EAAE,KAAK;aACrB,CAAC,CAAC;SACH;KACD;IAED,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE;QAClC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;YACzC,SAAS;SACT;QAED,MAAM,kBAAkB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,IAAA,qCAAoB,EAAC,kBAAkB,CAAC,EAAE;YAC7C,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,EAAE;gBAC5C,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;gBACZ,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,UAAU;gBACtB,SAAS;gBACT,cAAc,EAAE,KAAK;aACrB,CAAC,CAAC;SACH;QAED,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB,gBAAgC;YAChC;gBACC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;oBACzC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7E,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBACtE,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC3E;gBACD,MAAM;YACP,gBAAsC;YACtC;gBACC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;oBACzC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/E,MAAM,CAAC,cAAc,GAAG,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,CAAC,CAAC,GAAG,SAAS,CAAC;iBACjE;gBACD,MAAM;YACP,gBAAmC;YACnC;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACnF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjF,IAAA,sBAAc,EACb,OAAO,EACP,OAAO,CAAC,MAAM,GAAG,cAAc,EAC/B,OAAO,CAAC,MAAM,GAAG,cAAc,EAC/B,KAAK,EACL,IAAI,EACJ,SAAS,CACT,CAAC;oBACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC5E;gBACD,MAAM;YAQP,kCAA6D;YAC7D;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,IAAI,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACpF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,MAAM,aAAa,GAClB,MAAM,CAAC,MAAM,mCAA8D,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrF,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBAClF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC5E;gBACD,MAAM;YAGP;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,IAAI,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACpF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,IAAA,mBAAW,EAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;oBACnE,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC3E;gBACD,MAAM;SACP;KACD;IAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE;QACpC,QAAQ,OAAO,CAAC,MAAM,EAAE;YACvB;gBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;oBACxF,IAAA,sBAAc,EAAC,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBACxF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC1E;gBACD,MAAM;SACP;KACD;AACF,CAAC,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport {\r\n\thasAfterOtherSpawned,\r\n\thasOnDespawned,\r\n\thasOnOtherSpawned,\r\n\thasOnOtherAuraSpawned as hasOnOtherSpawnedAura,\r\n\thasOnSpawned,\r\n} from '../cards/card.interface';\r\nimport { WHELP_CARD_IDS } from '../cards/cards-data';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { eternalKnightAttack, eternalKnightHealth } from '../cards/impl/trinket/eternal-portrait';\r\nimport { updateDivineShield } from '../keywords/divine-shield';\r\nimport { updateTaunt } from '../keywords/taunt';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { pickRandom } from '../services/utils';\r\nimport { copyEntity, hasCorrectTribe, isVolumizer } from '../utils';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { modifyStats, setEntityStats } from './stats';\r\n\r\nexport const addMinionsToBoard = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tindex: number,\r\n\tminionsToAdd: readonly BoardEntity[],\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// board.splice(index, 0, ...minionsToAdd);\r\n\tfor (const minionToAdd of [...minionsToAdd].reverse()) {\r\n\t\taddMinionToBoard(board, boardHero, otherBoard, otherHero, index, minionToAdd, gameState, false);\r\n\t}\r\n\thandleAfterSpawnEffects(board, boardHero, otherBoard, otherHero, minionsToAdd, gameState);\r\n};\r\n\r\nexport const addMinionToBoard = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tindex: number,\r\n\tminionToAdd: BoardEntity,\r\n\tgameState: FullGameState,\r\n\tperformAfterSpawnEffects = true,\r\n\tapplySelfAuras = true,\r\n): void => {\r\n\tboard.splice(index, 0, minionToAdd);\r\n\t// Minion has already been removed from the board in the previous step\r\n\t// Update the global \"SummonedThisGame/Combat\" info here\r\n\thandleAddedMinionAuraEffect(board, boardHero, otherBoard, otherHero, minionToAdd, gameState, applySelfAuras);\r\n\t// Important to do this here, so that \"attack immediately\" minions can be taken into account by the quests\r\n\tonMinionSummoned(boardHero, board, gameState);\r\n\thandleSpawnEffect(board, boardHero, otherBoard, otherHero, minionToAdd, gameState, applySelfAuras);\r\n\tif (performAfterSpawnEffects) {\r\n\t\thandleAfterSpawnEffects(board, boardHero, otherBoard, otherHero, [minionToAdd], gameState);\r\n\t}\r\n};\r\n\r\nconst handleSpawnEffect = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tspawned: BoardEntity,\r\n\tgameState: FullGameState,\r\n\tapplySelfAuras = true,\r\n): void => {\r\n\tconst cardIds = [spawned.cardId, ...(spawned.additionalCards ?? [])];\r\n\r\n\t// https://twitter.com/LoewenMitchell/status/1491879869457879040\r\n\tif (cardIds.some((cardId) => WHELP_CARD_IDS.includes(cardId as CardIds))) {\r\n\t\tconst manyWhelps = board.filter((entity) => entity.cardId === CardIds.ManyWhelps_BG22_HERO_305_Buddy);\r\n\t\tconst goldenManyWhelps = board.filter((entity) => entity.cardId === CardIds.ManyWhelps_BG22_HERO_305_Buddy_G);\r\n\t\tmanyWhelps.forEach((entity) => {\r\n\t\t\tmodifyStats(entity, entity, 2, 2, board, boardHero, gameState);\r\n\t\t});\r\n\t\tgoldenManyWhelps.forEach((entity) => {\r\n\t\t\tmodifyStats(entity, entity, 4, 4, board, boardHero, gameState);\r\n\t\t});\r\n\t}\r\n\r\n\tfor (const entity of board) {\r\n\t\t// The case for Reborns, and these shouldn't proc on themselves\r\n\t\tif (entity.entityId === spawned.entityId) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst onOtherSpawnedImpl = cardMappings[entity.cardId];\r\n\t\tif (hasOnOtherSpawned(onOtherSpawnedImpl)) {\r\n\t\t\tonOtherSpawnedImpl.onOtherSpawned(entity, {\r\n\t\t\t\tspawned: spawned,\r\n\t\t\t\thero: boardHero,\r\n\t\t\t\tboard: board,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\totherHero: otherHero,\r\n\t\t\t\tapplySelfAuras,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tswitch (entity.cardId) {\r\n\t\t\tcase CardIds.CobaltGuardian:\r\n\t\t\t\tif (hasCorrectTribe(spawned, boardHero, Race.MECH, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\tif (!entity.divineShield) {\r\n\t\t\t\t\t\tupdateDivineShield(entity, board, boardHero, otherHero, true, gameState);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmodifyStats(entity, entity, 2, 0, board, boardHero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.Bigfernal_BGS_204:\r\n\t\t\t// case CardIds.Bigfernal_TB_BaconUps_304:\r\n\t\t\t// \tif (hasCorrectTribe(spawned, boardHero, Race.DEMON, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t// \t\tconst statsBonus = entity.cardId === CardIds.Bigfernal_TB_BaconUps_304 ? 2 : 1;\r\n\t\t\t// \t\tmodifyStats(entity, entity, statsBonus, statsBonus, board, boardHero, gameState);\r\n\t\t\t// \t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.MamaBear_BGS_021:\r\n\t\t\tcase CardIds.MamaBear_TB_BaconUps_090:\r\n\t\t\t\tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\tconst statsBonus = entity.cardId === CardIds.MamaBear_TB_BaconUps_090 ? 12 : 6;\r\n\t\t\t\t\tmodifyStats(spawned, entity, statsBonus, statsBonus, board, boardHero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.PapaBear_BG27_509:\r\n\t\t\t// case CardIds.PapaBear_BG27_509_G:\r\n\t\t\t// \tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t// \t\tconst statsBonus = entity.cardId === CardIds.PapaBear_BG27_509_G ? 16 : 8;\r\n\t\t\t// \t\tmodifyStats(spawned, entity, statsBonus, statsBonus, board, boardHero, gameState);\r\n\t\t\t// \t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.PackLeader_BGS_017:\r\n\t\t\tcase CardIds.PackLeader_TB_BaconUps_086:\r\n\t\t\t\tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\tconst statsBonus = entity.cardId === CardIds.PackLeader_TB_BaconUps_086 ? 4 : 2;\r\n\t\t\t\t\tmodifyStats(spawned, entity, statsBonus, 0, board, boardHero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\nexport const handleAddedMinionAuraEffect = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tspawned: BoardEntity,\r\n\tgameState: FullGameState,\r\n\tapplySelfAuras = true,\r\n\tisActuallySpawned = true,\r\n): void => {\r\n\tfor (const heroPower of boardHero.heroPowers) {\r\n\t\tswitch (heroPower.cardId) {\r\n\t\t\tcase CardIds.SproutItOut:\r\n\t\t\t\tif (isActuallySpawned) {\r\n\t\t\t\t\tupdateTaunt(spawned, true, board, boardHero, otherHero, gameState);\r\n\t\t\t\t\tmodifyStats(spawned, boardHero, 1, 2, board, boardHero, gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (boardHero.questRewards?.includes(CardIds.TumblingDisaster_BG28_Reward_505)) {\r\n\t\tconst tumblingDisasterBonus =\r\n\t\t\tboardHero.questRewardEntities?.find((e) => e.cardId === CardIds.TumblingDisaster_BG28_Reward_505)\r\n\t\t\t\t?.scriptDataNum1 || 1;\r\n\t\tmodifyStats(spawned, boardHero, tumblingDisasterBonus, tumblingDisasterBonus, board, boardHero, gameState);\r\n\t}\r\n\r\n\tif (isActuallySpawned) {\r\n\t\tfor (const trinket of boardHero.trinkets) {\r\n\t\t\tswitch (trinket.cardId) {\r\n\t\t\t\tcase CardIds.BlingtronsSunglasses_BG30_MagicItem_978:\r\n\t\t\t\t\tif (hasCorrectTribe(spawned, boardHero, Race.MECH, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\t\tconst target = pickRandom(board.filter((e) => !e.divineShield));\r\n\t\t\t\t\t\tif (!!target) {\r\n\t\t\t\t\t\t\tupdateDivineShield(target, board, boardHero, otherHero, true, gameState);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.TwinSkyLanterns_BG30_MagicItem_822:\r\n\t\t\t\tcase CardIds.TwinSkyLanterns_TwinSkyLanternsToken_BG30_MagicItem_822t2:\r\n\t\t\t\t\tif (!trinket.rememberedMinion) {\r\n\t\t\t\t\t\ttrinket.rememberedMinion = copyEntity(spawned);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.ReinforcedShield_BG30_MagicItem_886:\r\n\t\t\t\t\tif (trinket.scriptDataNum1 > 0 && !spawned.divineShield) {\r\n\t\t\t\t\t\tupdateDivineShield(spawned, board, boardHero, otherHero, true, gameState);\r\n\t\t\t\t\t\ttrinket.scriptDataNum1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Apply auras to board\r\n\tconst cardIds = [spawned.cardId, ...(spawned.additionalCards ?? [])];\r\n\tfor (const spawnedCardId of cardIds) {\r\n\t\thandleMinionAddedAuraEffect(spawnedCardId, spawned, board, boardHero, gameState, isActuallySpawned);\r\n\t}\r\n\r\n\t// When we want to summon an \"exact copy\", we need to make sure we don't apply the aura twice\r\n\tif (applySelfAuras) {\r\n\t\t// The board here already contains the new minion\r\n\t\t// TODO: what if the additional part is a potential target for the aura effect?\r\n\t\t// 2024-08-27: changing the order to first handleMinionAddedAuraEffect so that the automatons get boosted,\r\n\t\t// then apply the aura\r\n\t\tapplyAurasToSelf(spawned, board, boardHero, gameState);\r\n\t}\r\n\r\n\tif (isActuallySpawned) {\r\n\t\tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\tboardHero.globalInfo.BeastsSummonedThisCombat++;\r\n\t\t\tboardHero.globalInfo.BeastsSummonedThisGame++;\r\n\t\t}\r\n\t\tif (hasCorrectTribe(spawned, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards)) {\r\n\t\t\tboardHero.globalInfo.PiratesSummonedThisGame++;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const applyAurasToSelf = (\r\n\tspawned: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tspawned.attack += boardHero.globalInfo.AdditionalAttack;\r\n\r\n\tif (!!boardHero.questRewards?.length) {\r\n\t\tfor (const quest of boardHero.questRewards) {\r\n\t\t\tswitch (quest) {\r\n\t\t\t\tcase CardIds.VolatileVenom:\r\n\t\t\t\t\tspawned.attack += 7;\r\n\t\t\t\t\tspawned.health += 7;\r\n\t\t\t\t\tspawned.enchantments.push({\r\n\t\t\t\t\t\tcardId: CardIds.VolatileVenom_VolatileEnchantment,\r\n\t\t\t\t\t\toriginEntityId: undefined,\r\n\t\t\t\t\t\ttiming: gameState.sharedState.currentEntityId++,\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.TheSmokingGun:\r\n\t\t\t\t\tspawned.attack += 4;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (!!boardHero.trinkets?.length) {\r\n\t\tfor (const trinket of boardHero.trinkets) {\r\n\t\t\tswitch (trinket.cardId) {\r\n\t\t\t\tcase CardIds.FeralTalisman_BG30_MagicItem_880:\r\n\t\t\t\t\tspawned.attack += 2;\r\n\t\t\t\t\tspawned.health += 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.FeralTalisman_FeralTalismanToken_BG30_MagicItem_880t:\r\n\t\t\t\t\tspawned.attack += 8;\r\n\t\t\t\t\tspawned.health += 5;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.DazzlingDagger_BG32_MagicItem_934:\r\n\t\t\t\t\tspawned.attack += trinket.scriptDataNum1 || 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.HordeKeychainToken_BG30_MagicItem_843t:\r\n\t\t\t\t\tif (gameState.cardsData.getTavernLevel(spawned.cardId) <= 3) {\r\n\t\t\t\t\t\tspawned.attack += 7;\r\n\t\t\t\t\t\tspawned.health += 5;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.FlagbearerPortrait_BG30_MagicItem_921:\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tspawned.cardId === CardIds.Scallywag_SkyPirateToken_BGS_061t ||\r\n\t\t\t\t\t\tspawned.cardId === CardIds.Scallywag_SkyPirateToken_TB_BaconUps_141t\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tspawned.attack += 6;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (boardHero.globalInfo.HauntedCarapaceAttackBonus > 0) {\r\n\t\tmodifyStats(\r\n\t\t\tspawned,\r\n\t\t\tspawned,\r\n\t\t\tboardHero.globalInfo.HauntedCarapaceAttackBonus,\r\n\t\t\t0,\r\n\t\t\tboard,\r\n\t\t\tboardHero,\r\n\t\t\tgameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t}\r\n\tif (boardHero.globalInfo.HauntedCarapaceHealthBonus > 0) {\r\n\t\tmodifyStats(\r\n\t\t\tspawned,\r\n\t\t\tspawned,\r\n\t\t\t0,\r\n\t\t\tboardHero.globalInfo.HauntedCarapaceHealthBonus,\r\n\t\t\tboard,\r\n\t\t\tboardHero,\r\n\t\t\tgameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t}\r\n\tif (hasCorrectTribe(spawned, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.UndeadAttackBonus > 0) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\tboardHero.globalInfo.UndeadAttackBonus,\r\n\t\t\t\t0,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\tif (hasCorrectTribe(spawned, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.PirateAttackBonus > 0) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\tboardHero.globalInfo.PirateAttackBonus,\r\n\t\t\t\t0,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.GoldrinnBuffAtk > 0) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\tboardHero.globalInfo.GoldrinnBuffAtk,\r\n\t\t\t\tboardHero.globalInfo.GoldrinnBuffHealth,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tgameState.spectator.registerPowerTarget(boardHero, spawned, board, null, null);\r\n\t\t}\r\n\t}\r\n\tif (isVolumizer(spawned.cardId, boardHero, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.VolumizerAttackBuff > 0 || boardHero.globalInfo.VolumizerHealthBuff > 0) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\tboardHero.globalInfo.VolumizerAttackBuff ?? 0,\r\n\t\t\t\tboardHero.globalInfo.VolumizerHealthBuff ?? 0,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tgameState.spectator.registerPowerTarget(boardHero, spawned, board, null, null);\r\n\t\t}\r\n\t}\r\n\r\n\t// In case Putricide spawns a stictched minion whose stitched part creates an aura effect\r\n\t// const potentialAuraSources: { cardId: string; entityId: number }[] = [\r\n\t// \t{ cardId: spawned.cardId, entityId: spawned.entityId },\r\n\t// \t...(spawned.additionalCards ?? []).map((cardId) => ({ cardId, entityId: spawned.entityId })),\r\n\t// ];\r\n\r\n\tif (gameState.cardsData.getTavernLevel(spawned.cardId) % 2 === 1) {\r\n\t\tconst atkBuff = boardHero.globalInfo.MutatedLasherAttackBuff ?? 0;\r\n\t\tconst healthBuff = boardHero.globalInfo.MutatedLasherHealthBuff ?? 0;\r\n\t\tmodifyStats(spawned, spawned, atkBuff, healthBuff, board, boardHero, gameState, false);\r\n\t}\r\n\tfor (const entity of board) {\r\n\t\tconst onOtherSpawnedImpl = cardMappings[entity.cardId];\r\n\t\tif (hasOnOtherSpawnedAura(onOtherSpawnedImpl)) {\r\n\t\t\tonOtherSpawnedImpl.onOtherSpawnedAura(entity, {\r\n\t\t\t\tspawned: spawned,\r\n\t\t\t\thero: boardHero,\r\n\t\t\t\tboard: board,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\t\tswitch (entity.cardId) {\r\n\t\t\tcase CardIds.MurlocWarleaderLegacy_BG_EX1_507:\r\n\t\t\tcase CardIds.MurlocWarleaderLegacy_TB_BaconUps_008:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, boardHero, Race.MURLOC, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tspawned.attack += entity.cardId === CardIds.MurlocWarleaderLegacy_TB_BaconUps_008 ? 4 : 2;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SouthseaCaptainLegacy_BG_NEW1_027:\r\n\t\t\tcase CardIds.SouthseaCaptainLegacy_TB_BaconUps_136:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tspawned.attack += entity.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t\tspawned.health += entity.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.Kathranatir_BG21_039:\r\n\t\t\t// case CardIds.Kathranatir_BG21_039_G:\r\n\t\t\t// \tif (\r\n\t\t\t// \t\thasCorrectTribe(spawned, boardHero, Race.DEMON, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t// \t\tentity.entityId !== spawned.entityId\r\n\t\t\t// \t) {\r\n\t\t\t// \t\tspawned.attack += entity.cardId === CardIds.Kathranatir_BG21_039_G ? 2 : 1;\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.CyborgDrake_BG25_043:\r\n\t\t\tcase CardIds.CyborgDrake_BG25_043_G:\r\n\t\t\t\tif (spawned.divineShield) {\r\n\t\t\t\t\tspawned.attack += entity.cardId === CardIds.CyborgDrake_BG25_043_G ? 12 : 6;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SoreLoser_BG27_030:\r\n\t\t\tcase CardIds.SoreLoser_BG27_030_G:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tspawned.attack += (entity.cardId === CardIds.SoreLoser_BG27_030_G ? 2 : 1) * boardHero.tavernTier;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tconst onSpawnedImpl = cardMappings[spawned.cardId];\r\n\tif (hasOnSpawned(onSpawnedImpl)) {\r\n\t\tonSpawnedImpl.onSpawned(spawned, {\r\n\t\t\thero: boardHero,\r\n\t\t\tboard: board,\r\n\t\t\tgameState: gameState,\r\n\t\t});\r\n\t}\r\n\tswitch (spawned.cardId) {\r\n\t\tcase CardIds.EternalKnight_BG25_008:\r\n\t\tcase CardIds.EternalKnight_BG25_008_G:\r\n\t\t\tconst multiplierKnight = spawned.cardId === CardIds.EternalKnight_BG25_008_G ? 2 : 1;\r\n\t\t\tconst statsBonusKnight = multiplierKnight * boardHero.globalInfo.EternalKnightsDeadThisGame;\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tnull,\r\n\t\t\t\teternalKnightAttack * statsBonusKnight,\r\n\t\t\t\teternalKnightHealth * statsBonusKnight,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.EnsorcelledFungus_BG28_555:\r\n\t\tcase CardIds.EnsorcelledFungus_BG28_555_G:\r\n\t\t\tconst multiplierFungus = spawned.cardId === CardIds.EnsorcelledFungus_BG28_555_G ? 2 : 1;\r\n\t\t\tconst statsBonusFungus = multiplierFungus * boardHero.globalInfo.TavernSpellsCastThisGame;\r\n\t\t\tmodifyStats(spawned, null, statsBonusFungus, 2 * statsBonusFungus, board, boardHero, gameState, false);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.FlourishingFrostling_BG26_537:\r\n\t\tcase CardIds.FlourishingFrostling_BG26_537_G:\r\n\t\t\tconst multiplierFrostling = spawned.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\t\tconst statsBonusFrostling = multiplierFrostling * boardHero.globalInfo.FrostlingBonus;\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tnull,\r\n\t\t\t\t2 * statsBonusFrostling,\r\n\t\t\t\tstatsBonusFrostling,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SaltyLooter_BGS_081:\r\n\t\tcase CardIds.SaltyLooter_TB_BaconUps_143:\r\n\t\t\tconst multiplierLooter = spawned.cardId === CardIds.SaltyLooter_TB_BaconUps_143 ? 2 : 1;\r\n\t\t\tconst statsBonusLooter = multiplierLooter * boardHero.globalInfo.PiratesSummonedThisGame;\r\n\t\t\tmodifyStats(spawned, null, 2 * statsBonusLooter, 2 * multiplierLooter, board, boardHero, gameState, false);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401:\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401_G:\r\n\t\t\tconst multiplierAstral = spawned.cardId === CardIds.AstralAutomaton_BG_TTN_401_G ? 2 : 1;\r\n\t\t\t// Don't count the yourself\r\n\t\t\tconst statsBonusAstral = multiplierAstral * (boardHero.globalInfo.AstralAutomatonsSummonedThisGame - 1);\r\n\t\t\tmodifyStats(spawned, null, 3 * statsBonusAstral, 2 * statsBonusAstral, board, boardHero, gameState, false);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.RotHideGnoll_BG25_013:\r\n\t\tcase CardIds.RotHideGnoll_BG25_013_G:\r\n\t\t\tconst multiplierGnoll = spawned.cardId === CardIds.RotHideGnoll_BG25_013_G ? 2 : 1;\r\n\t\t\tconst statsBonusGnoll =\r\n\t\t\t\tmultiplierGnoll * gameState.sharedState.deaths.filter((e) => e.friendly === spawned.friendly).length;\r\n\t\t\tmodifyStats(spawned, null, statsBonusGnoll, 0, board, boardHero, gameState, false);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n\r\n// Introduced for Rapid Reanimation: since we will \"addMinionToBoard\" the minion afterwards, the auras will\r\n// be re-applied then, so we need to remove them first\r\nexport const removeAurasFromSelf = (\r\n\tentity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tentity.attack -= Math.max(0, boardHero.globalInfo.AdditionalAttack);\r\n\r\n\tconst onDespawnedImpl = cardMappings[entity.cardId];\r\n\tif (hasOnDespawned(onDespawnedImpl)) {\r\n\t\tonDespawnedImpl.onDespawned(entity, {\r\n\t\t\thero: boardHero,\r\n\t\t\tboard: board,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t}\r\n\r\n\tif (!!boardHero.questRewards?.length) {\r\n\t\tfor (const quest of boardHero.questRewards) {\r\n\t\t\tswitch (quest) {\r\n\t\t\t\tcase CardIds.VolatileVenom:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 7);\r\n\t\t\t\t\tentity.health = Math.max(1, entity.health - 7);\r\n\t\t\t\t\tentity.enchantments = entity.enchantments.filter(\r\n\t\t\t\t\t\t(e) => e.cardId !== CardIds.VolatileVenom_VolatileEnchantment,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.TheSmokingGun:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 7);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.FlagbearerPortrait_BG30_MagicItem_921:\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tentity.cardId === CardIds.SkyPirateFlagbearer_BG30_119 ||\r\n\t\t\t\t\t\tentity.cardId === CardIds.SkyPirateFlagbearer_BG30_119_G\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 8);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (!!boardHero.trinkets?.length) {\r\n\t\tfor (const trinket of boardHero.trinkets) {\r\n\t\t\tswitch (trinket.cardId) {\r\n\t\t\t\tcase CardIds.FeralTalisman_BG30_MagicItem_880:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 2);\r\n\t\t\t\t\tentity.health = Math.max(1, entity.health - 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.FeralTalisman_FeralTalismanToken_BG30_MagicItem_880t:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 8);\r\n\t\t\t\t\tentity.health = Math.max(1, entity.health - 5);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.DazzlingDagger_BG32_MagicItem_934:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - (trinket.scriptDataNum1 || 1));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.HordeKeychainToken_BG30_MagicItem_843t:\r\n\t\t\t\t\tif (gameState.cardsData.getTavernLevel(entity.cardId) <= 3) {\r\n\t\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 7);\r\n\t\t\t\t\t\tentity.health = Math.max(1, entity.health - 5);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (boardHero.globalInfo.HauntedCarapaceAttackBonus > 0) {\r\n\t\tentity.attack = Math.max(0, entity.attack - boardHero.globalInfo.HauntedCarapaceAttackBonus);\r\n\t}\r\n\tif (boardHero.globalInfo.HauntedCarapaceHealthBonus > 0) {\r\n\t\tentity.health = Math.max(1, entity.health - boardHero.globalInfo.HauntedCarapaceHealthBonus);\r\n\t}\r\n\tif (hasCorrectTribe(entity, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.UndeadAttackBonus > 0) {\r\n\t\t\tentity.attack = Math.max(0, entity.attack - boardHero.globalInfo.UndeadAttackBonus);\r\n\t\t}\r\n\t}\r\n\tif (hasCorrectTribe(entity, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.GoldrinnBuffAtk > 0) {\r\n\t\t\tentity.attack = Math.max(0, entity.attack - boardHero.globalInfo.GoldrinnBuffAtk);\r\n\t\t\tentity.health = Math.max(1, entity.health - boardHero.globalInfo.GoldrinnBuffHealth);\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const boardEntity of board) {\r\n\t\tswitch (boardEntity.cardId) {\r\n\t\t\tcase CardIds.MurlocWarleaderLegacy_BG_EX1_507:\r\n\t\t\tcase CardIds.MurlocWarleaderLegacy_TB_BaconUps_008:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(entity, boardHero, Race.MURLOC, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== boardEntity.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tentity.attack = Math.max(\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tentity.attack - (boardEntity.cardId === CardIds.MurlocWarleaderLegacy_TB_BaconUps_008 ? 4 : 2),\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SouthseaCaptainLegacy_BG_NEW1_027:\r\n\t\t\tcase CardIds.SouthseaCaptainLegacy_TB_BaconUps_136:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(entity, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== boardEntity.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tentity.attack = Math.max(\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tentity.attack - (boardEntity.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1),\r\n\t\t\t\t\t);\r\n\t\t\t\t\tentity.health = Math.max(\r\n\t\t\t\t\t\t1,\r\n\t\t\t\t\t\tentity.health - (boardEntity.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1),\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.Kathranatir_BG21_039:\r\n\t\t\t// case CardIds.Kathranatir_BG21_039_G:\r\n\t\t\t// \tif (\r\n\t\t\t// \t\thasCorrectTribe(entity, boardHero, Race.DEMON, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t// \t\tentity.entityId !== boardEntity.entityId\r\n\t\t\t// \t) {\r\n\t\t\t// \t\tentity.attack = Math.max(\r\n\t\t\t// \t\t\t0,\r\n\t\t\t// \t\t\tentity.attack - (boardEntity.cardId === CardIds.Kathranatir_BG21_039_G ? 2 : 1),\r\n\t\t\t// \t\t);\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.CyborgDrake_BG25_043:\r\n\t\t\tcase CardIds.CyborgDrake_BG25_043_G:\r\n\t\t\t\tif (entity.divineShield) {\r\n\t\t\t\t\tentity.attack = Math.max(\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tentity.attack - (boardEntity.cardId === CardIds.CyborgDrake_BG25_043_G ? 12 : 6),\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SoreLoser_BG27_030:\r\n\t\t\tcase CardIds.SoreLoser_BG27_030_G:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(entity, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== boardEntity.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tentity.attack = Math.max(\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tentity.attack -\r\n\t\t\t\t\t\t\t(boardEntity.cardId === CardIds.SoreLoser_BG27_030_G ? 2 : 1) * boardHero.tavernTier,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.EternalKnight_BG25_008:\r\n\t\tcase CardIds.EternalKnight_BG25_008_G:\r\n\t\t\tconst multiplierKnight = entity.cardId === CardIds.EternalKnight_BG25_008_G ? 2 : 1;\r\n\t\t\tconst statsBonusKnight = multiplierKnight * boardHero.globalInfo.EternalKnightsDeadThisGame;\r\n\t\t\tentity.attack = Math.max(0, entity.attack - eternalKnightAttack * statsBonusKnight);\r\n\t\t\tentity.health = Math.max(1, entity.health - eternalKnightHealth * statsBonusKnight);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.EnsorcelledFungus_BG28_555:\r\n\t\tcase CardIds.EnsorcelledFungus_BG28_555_G:\r\n\t\t\tconst multiplierFungus = entity.cardId === CardIds.EnsorcelledFungus_BG28_555_G ? 2 : 1;\r\n\t\t\tconst statsBonusFungus = multiplierFungus * boardHero.globalInfo.TavernSpellsCastThisGame;\r\n\t\t\tentity.attack = Math.max(0, entity.attack - statsBonusFungus);\r\n\t\t\tentity.health = Math.max(1, entity.health - 2 * statsBonusFungus);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.FlourishingFrostling_BG26_537:\r\n\t\tcase CardIds.FlourishingFrostling_BG26_537_G:\r\n\t\t\tconst multiplierFrostling = entity.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\t\tconst statsBonusFrostling = multiplierFrostling * boardHero.globalInfo.FrostlingBonus;\r\n\t\t\tentity.attack = Math.max(0, entity.attack - statsBonusFrostling);\r\n\t\t\tentity.health = Math.max(1, entity.health - statsBonusFrostling);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401:\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401_G:\r\n\t\t\tconst multiplierAstral = entity.cardId === CardIds.AstralAutomaton_BG_TTN_401_G ? 2 : 1;\r\n\t\t\t// We remove 1 because the AstralAutomatonsSummonedThisGame also includes the current one\r\n\t\t\t// and ancestral automaton only counts \"other\" automatons\r\n\t\t\tconst statsBonusAstral = multiplierAstral * (boardHero.globalInfo.AstralAutomatonsSummonedThisGame - 1);\r\n\t\t\tentity.attack = Math.max(0, entity.attack - 3 * statsBonusAstral);\r\n\t\t\tentity.health = Math.max(1, entity.health - 2 * statsBonusAstral);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.RotHideGnoll_BG25_013:\r\n\t\tcase CardIds.RotHideGnoll_BG25_013_G:\r\n\t\t\tconst multiplierGnoll = entity.cardId === CardIds.RotHideGnoll_BG25_013_G ? 2 : 1;\r\n\t\t\tconst statsBonusGnoll =\r\n\t\t\t\tmultiplierGnoll * gameState.sharedState.deaths.filter((e) => e.friendly === entity.friendly).length;\r\n\t\t\tentity.attack = Math.max(0, entity.attack - statsBonusGnoll);\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tfor (const enchantment of entity.enchantments) {\r\n\t\tswitch (enchantment?.cardId) {\r\n\t\t\tcase CardIds.TavernLighting_TavernLightsEnchantment:\r\n\t\t\t\tentity.attack = Math.max(0, entity.attack - enchantment.tagScriptDataNum1);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleMinionAddedAuraEffect = (\r\n\tspawnedCardId: string,\r\n\tspawned: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tisActuallySpawned = true,\r\n): void => {\r\n\tswitch (spawnedCardId) {\r\n\t\tcase CardIds.SouthseaCaptainLegacy_BG_NEW1_027:\r\n\t\tcase CardIds.SouthseaCaptainLegacy_TB_BaconUps_136:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards))\r\n\t\t\t\t// Other\r\n\t\t\t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\te.attack += spawned.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t\te.health += spawned.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.MurlocWarleaderLegacy_BG_EX1_507:\r\n\t\tcase CardIds.MurlocWarleaderLegacy_TB_BaconUps_008:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.MURLOC, gameState.anomalies, gameState.allCards))\r\n\t\t\t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\te.attack += spawned.cardId === CardIds.MurlocWarleaderLegacy_TB_BaconUps_008 ? 4 : 2;\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\t// case CardIds.Kathranatir_BG21_039:\r\n\t\t// case CardIds.Kathranatir_BG21_039_G:\r\n\t\t// \tboard\r\n\t\t// \t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.DEMON, gameState.anomalies, gameState.allCards))\r\n\t\t// \t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t// \t\t.forEach((e) => {\r\n\t\t// \t\t\te.attack += spawned.cardId === CardIds.Kathranatir_BG21_039_G ? 4 : 2;\r\n\t\t// \t\t});\r\n\t\t// \tbreak;\r\n\t\tcase CardIds.CyborgDrake_BG25_043:\r\n\t\tcase CardIds.CyborgDrake_BG25_043_G:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => e.divineShield)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\te.attack += spawned.cardId === CardIds.CyborgDrake_BG25_043_G ? 12 : 6;\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\r\n\t\tcase CardIds.SoreLoser_BG27_030:\r\n\t\tcase CardIds.SoreLoser_BG27_030_G:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards))\r\n\t\t\t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\te.attack += (spawned.cardId === CardIds.SoreLoser_BG27_030_G ? 2 : 1) * boardHero.tavernTier;\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401:\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401_G:\r\n\t\t\t// TODO: move this somewhere else\r\n\t\t\tif (isActuallySpawned) {\r\n\t\t\t\tboardHero.globalInfo.AstralAutomatonsSummonedThisGame++;\r\n\t\t\t}\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t\t\t.filter(\r\n\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\te.cardId === CardIds.AstralAutomaton_BG_TTN_401 ||\r\n\t\t\t\t\t\te.cardId === CardIds.AstralAutomaton_BG_TTN_401_G,\r\n\t\t\t\t)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tconst multiplierAstral = e.cardId === CardIds.AstralAutomaton_BG_TTN_401_G ? 2 : 1;\r\n\t\t\t\t\tmodifyStats(e, e, 3 * multiplierAstral, 2 * multiplierAstral, board, boardHero, gameState, false);\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.DrBoomsMonster_BG31_176:\r\n\t\tcase CardIds.DrBoomsMonster_BG31_176_G:\r\n\t\t\tconst multiplierDrBoom = spawned.cardId === CardIds.DrBoomsMonster_BG31_176_G ? 2 : 1;\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\t2 * boardHero.globalInfo.MagnetizedThisGame * multiplierDrBoom,\r\n\t\t\t\t2 * boardHero.globalInfo.MagnetizedThisGame * multiplierDrBoom,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n\r\nconst handleAfterSpawnEffects = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tallSpawned: readonly BoardEntity[],\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tfor (const spawned of allSpawned) {\r\n\t\thandleAfterSpawnEffect(board, hero, otherBoard, otherHero, spawned, gameState);\r\n\t}\r\n};\r\n\r\nexport const onMinionSummoned = (hero: BgsPlayerEntity, board: BoardEntity[], gameState: FullGameState): void => {\r\n\tconst quests = hero.questEntities ?? [];\r\n\tif (!quests.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.AssembleALineup:\r\n\t\t\t\tonQuestProgressUpdated(hero, quest, board, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleAfterSpawnEffect = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tspawned: BoardEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// So that spawns don't mess up the loop\r\n\tconst initialBoard = [...board];\r\n\r\n\tfor (const trinket of hero.trinkets ?? []) {\r\n\t\tconst onAfterSpawnedImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasAfterOtherSpawned(onAfterSpawnedImpl)) {\r\n\t\t\tonAfterSpawnedImpl.afterOtherSpawned(trinket, {\r\n\t\t\t\tspawned: spawned,\r\n\t\t\t\thero: hero,\r\n\t\t\t\tboard: board,\r\n\t\t\t\totherHero: otherHero,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tapplySelfAuras: false,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const entity of initialBoard) {\r\n\t\tif (entity.entityId === spawned.entityId) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst onAfterSpawnedImpl = cardMappings[entity.cardId];\r\n\t\tif (hasAfterOtherSpawned(onAfterSpawnedImpl)) {\r\n\t\t\tonAfterSpawnedImpl.afterOtherSpawned(entity, {\r\n\t\t\t\tspawned: spawned,\r\n\t\t\t\thero: hero,\r\n\t\t\t\tboard: board,\r\n\t\t\t\totherHero: otherHero,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tapplySelfAuras: false,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tswitch (entity.cardId) {\r\n\t\t\tcase CardIds.XyloBones_BG26_172:\r\n\t\t\tcase CardIds.XyloBones_BG26_172_G:\r\n\t\t\t\tif (entity.entityId !== spawned.entityId) {\r\n\t\t\t\t\tconst xylobonesBuff = entity.cardId === CardIds.XyloBones_BG26_172_G ? 4 : 2;\r\n\t\t\t\t\tmodifyStats(entity, entity, 0, xylobonesBuff, board, hero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.OctosariWrapGod_BG26_804:\r\n\t\t\tcase CardIds.OctosariWrapGod_BG26_804_G:\r\n\t\t\t\tif (entity.entityId !== spawned.entityId) {\r\n\t\t\t\t\tconst octoStats = entity.cardId === CardIds.OctosariWrapGod_BG26_804_G ? 4 : 2;\r\n\t\t\t\t\tentity.scriptDataNum1 = (entity.scriptDataNum1 ?? 0) + octoStats;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.BananaSlamma_BG26_802:\r\n\t\t\tcase CardIds.BananaSlamma_BG26_802_G:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, hero, Race.BEAST, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tconst bananaStatBuff = entity.cardId === CardIds.BananaSlamma_BG26_802_G ? 3 : 2;\r\n\t\t\t\t\tsetEntityStats(\r\n\t\t\t\t\t\tspawned,\r\n\t\t\t\t\t\tspawned.attack * bananaStatBuff,\r\n\t\t\t\t\t\tspawned.health * bananaStatBuff,\r\n\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\thero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, spawned, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.ObserverOfMyths_BG_TTN_078:\r\n\t\t\t// case CardIds.ObserverOfMyths_BG_TTN_078_G:\r\n\t\t\t// \tif (spawned.attack > entity.attack) {\r\n\t\t\t// \t\tconst observerBuff = entity.cardId === CardIds.ObserverOfMyths_BG_TTN_078_G ? 2 : 1;\r\n\t\t\t// \t\taddStatsToBoard(entity, board, hero, observerBuff, 0, gameState);\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.ValithriaDreamwalker_TB_BaconShop_HERO_53_Buddy:\r\n\t\t\tcase CardIds.ValithriaDreamwalker_TB_BaconShop_HERO_53_Buddy_G:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, hero, Race.DRAGON, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tconst valithriaBuff =\r\n\t\t\t\t\t\tentity.cardId === CardIds.ValithriaDreamwalker_TB_BaconShop_HERO_53_Buddy_G ? 3 : 2;\r\n\t\t\t\t\tmodifyStats(entity, entity, valithriaBuff, valithriaBuff, board, hero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, spawned, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t// Putricide-only\r\n\t\t\tcase CardIds.ArmsDealer_BG26_RLK_824:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, hero, Race.UNDEAD, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tmodifyStats(spawned, spawned, 1, 0, board, hero, gameState, false);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const trinket of hero.trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.SlammaSticker_BG30_MagicItem_540:\r\n\t\t\t\tif (hasCorrectTribe(spawned, hero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\tsetEntityStats(spawned, spawned.attack * 2, spawned.health * 2, board, hero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(hero, spawned, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport interface OnSpawnInput {\r\n\thero: BgsPlayerEntity;\r\n\tboard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n}\r\nexport interface OnOtherSpawnInput {\r\n\tspawned: BoardEntity;\r\n\thero: BgsPlayerEntity;\r\n\tboard: BoardEntity[];\r\n\totherHero: BgsPlayerEntity;\r\n\totherBoard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n\tapplySelfAuras: boolean;\r\n}\r\nexport interface OnOtherSpawnAuraInput {\r\n\tspawned: BoardEntity;\r\n\thero: BgsPlayerEntity;\r\n\tboard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n}\r\nexport interface OnDespawnInput {\r\n\thero: BgsPlayerEntity;\r\n\tboard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n}\r\n"]}
1
+ {"version":3,"file":"add-minion-to-board.js","sourceRoot":"","sources":["../../src/simulation/add-minion-to-board.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,4DAMiC;AACjC,oDAAqD;AACrD,iEAA4D;AAC5D,6EAAkG;AAClG,6DAA+D;AAC/D,6CAAgD;AAEhD,6CAA+C;AAC/C,oCAA6F;AAE7F,mCAAiD;AACjD,mCAAsD;AAE/C,MAAM,iBAAiB,GAAG,CAChC,KAAoB,EACpB,SAA0B,EAC1B,UAAyB,EACzB,SAA0B,EAC1B,KAAa,EACb,YAAoC,EACpC,SAAwB,EACjB,EAAE;IAET,KAAK,MAAM,WAAW,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE;QACtD,IAAA,wBAAgB,EAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;KAChG;IACD,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;AAC3F,CAAC,CAAC;AAdW,QAAA,iBAAiB,qBAc5B;AAEK,MAAM,gBAAgB,GAAG,CAC/B,KAAoB,EACpB,SAA0B,EAC1B,UAAyB,EACzB,SAA0B,EAC1B,KAAa,EACb,WAAwB,EACxB,SAAwB,EACxB,wBAAwB,GAAG,IAAI,EAC/B,cAAc,GAAG,IAAI,EACd,EAAE;IACT,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IAGpC,IAAA,mCAA2B,EAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IAE7G,IAAA,wBAAgB,EAAC,SAAS,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9C,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;IACnG,IAAI,wBAAwB,EAAE;QAC7B,uBAAuB,CAAC,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,WAAW,CAAC,EAAE,SAAS,CAAC,CAAC;KAC3F;AACF,CAAC,CAAC;AArBW,QAAA,gBAAgB,oBAqB3B;AAEF,MAAM,iBAAiB,GAAG,CACzB,KAAoB,EACpB,SAA0B,EAC1B,UAAyB,EACzB,SAA0B,EAC1B,OAAoB,EACpB,SAAwB,EACxB,cAAc,GAAG,IAAI,EACd,EAAE;;IACT,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,MAAA,OAAO,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,CAAC;IAGrE,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,2BAAc,CAAC,QAAQ,CAAC,MAAiB,CAAC,CAAC,EAAE;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,0BAA2C,CAAC,CAAC;QACtG,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,4BAA6C,CAAC,CAAC;QAC9G,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;QACH,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;KACH;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;QAE3B,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;YACzC,SAAS;SACT;QAED,MAAM,kBAAkB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,IAAA,kCAAiB,EAAC,kBAAkB,CAAC,EAAE;YAC1C,kBAAkB,CAAC,cAAc,CAAC,MAAM,EAAE;gBACzC,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,KAAK;gBACZ,UAAU,EAAE,UAAU;gBACtB,SAAS,EAAE,SAAS;gBACpB,cAAc;gBACd,SAAS;aACT,CAAC,CAAC;SACH;QAED,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB;gBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAC5F,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;wBACzB,IAAA,kCAAkB,EAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;qBACzE;oBACD,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBAC/D,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;iBACrF;gBACD,MAAM;YASP,eAA8B;YAC9B;gBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAC7F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,sBAAqC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/E,IAAA,mBAAW,EAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBAClF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;iBACrF;gBACD,MAAM;YASP,eAAgC;YAChC;gBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;oBAC7F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,sBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAChF,IAAA,mBAAW,EAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBACzE,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;iBACrF;gBACD,MAAM;SACP;KACD;AACF,CAAC,CAAC;AACK,MAAM,2BAA2B,GAAG,CAC1C,KAAoB,EACpB,SAA0B,EAC1B,UAAyB,EACzB,SAA0B,EAC1B,OAAoB,EACpB,SAAwB,EACxB,cAAc,GAAG,IAAI,EACrB,iBAAiB,GAAG,IAAI,EACjB,EAAE;;IACT,KAAK,MAAM,SAAS,IAAI,SAAS,CAAC,UAAU,EAAE;QAC7C,QAAQ,SAAS,CAAC,MAAM,EAAE;YACzB;gBACC,IAAI,iBAAiB,EAAE;oBACtB,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;oBACnE,IAAA,mBAAW,EAAC,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;iBACnE;gBACD,MAAM;SACP;KACD;IAED,IAAI,MAAA,SAAS,CAAC,YAAY,0CAAE,QAAQ,mBAA0C,EAAE;QAC/E,MAAM,qBAAqB,GAC1B,CAAA,MAAA,MAAA,SAAS,CAAC,mBAAmB,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,sBAA6C,CAAC,0CAC9F,cAAc,KAAI,CAAC,CAAC;QACxB,IAAA,mBAAW,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;KAC3G;IAED,IAAI,iBAAiB,EAAE;QACtB,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE;YACzC,QAAQ,OAAO,CAAC,MAAM,EAAE;gBACvB;oBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;wBAC5F,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;wBAChE,IAAI,CAAC,CAAC,MAAM,EAAE;4BACb,IAAA,kCAAkB,EAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;yBACzE;qBACD;oBACD,MAAM;gBACP,0BAAgD;gBAChD;oBACC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;wBAC9B,OAAO,CAAC,gBAAgB,GAAG,IAAA,kBAAU,EAAC,OAAO,CAAC,CAAC;qBAC/C;oBACD,MAAM;gBACP;oBACC,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;wBACxD,IAAA,kCAAkB,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;wBAC1E,OAAO,CAAC,cAAc,EAAE,CAAC;qBACzB;oBACD,MAAM;aACP;SACD;KACD;IAGD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,MAAA,OAAO,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,aAAa,IAAI,OAAO,EAAE;QACpC,2BAA2B,CAAC,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;KACpG;IAGD,IAAI,cAAc,EAAE;QAKnB,IAAA,wBAAgB,EAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;KACvD;IAED,IAAI,iBAAiB,EAAE;QACtB,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;YAC7F,SAAS,CAAC,UAAU,CAAC,wBAAwB,EAAE,CAAC;YAChD,SAAS,CAAC,UAAU,CAAC,sBAAsB,EAAE,CAAC;SAC9C;QACD,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;YAC9F,SAAS,CAAC,UAAU,CAAC,uBAAuB,EAAE,CAAC;SAC/C;KACD;AACF,CAAC,CAAC;AA/EW,QAAA,2BAA2B,+BA+EtC;AAEK,MAAM,gBAAgB,GAAG,CAC/B,OAAoB,EACpB,KAAoB,EACpB,SAA0B,EAC1B,SAAwB,EACjB,EAAE;;IACT,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC;IAExD,IAAI,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,YAAY,0CAAE,MAAM,CAAA,EAAE;QACrC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,YAAY,EAAE;YAC3C,QAAQ,KAAK,EAAE;gBACd;oBACC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;wBACzB,MAAM,oBAA2C;wBACjD,cAAc,EAAE,SAAS;wBACzB,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE;qBAC/C,CAAC,CAAC;oBACH,MAAM;gBACP;oBACC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,MAAM;aACP;SACD;KACD;IAED,IAAI,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,QAAQ,0CAAE,MAAM,CAAA,EAAE;QACjC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE;YACzC,QAAQ,OAAO,CAAC,MAAM,EAAE;gBACvB;oBACC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,MAAM;gBACP;oBACC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;oBACpB,MAAM;gBACP;oBACC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;oBAC9C,MAAM;gBACP;oBACC,IAAI,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;wBAC5D,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;wBACpB,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;qBACpB;oBACD,MAAM;gBACP;oBACC,IACC,OAAO,CAAC,MAAM,eAA8C;wBAC5D,OAAO,CAAC,MAAM,uBAAsD,EACnE;wBACD,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC;qBACpB;oBACD,MAAM;aACP;SACD;KACD;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,0BAA0B,GAAG,CAAC,EAAE;QACxD,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,SAAS,CAAC,UAAU,CAAC,0BAA0B,EAC/C,CAAC,EACD,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;KACF;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,0BAA0B,GAAG,CAAC,EAAE;QACxD,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,CAAC,EACD,SAAS,CAAC,UAAU,CAAC,0BAA0B,EAC/C,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;KACF;IACD,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC9F,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,EAAE;YAC/C,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,SAAS,CAAC,UAAU,CAAC,iBAAiB,EACtC,CAAC,EACD,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;SACF;KACD;IACD,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC9F,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,EAAE;YAC/C,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,SAAS,CAAC,UAAU,CAAC,iBAAiB,EACtC,CAAC,EACD,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;SACF;KACD;IACD,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC7F,IAAI,SAAS,CAAC,UAAU,CAAC,eAAe,GAAG,CAAC,EAAE;YAC7C,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,SAAS,CAAC,UAAU,CAAC,eAAe,EACpC,SAAS,CAAC,UAAU,CAAC,kBAAkB,EACvC,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SAC/E;KACD;IACD,IACC,IAAA,mBAAW,EAAC,OAAO,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;QAE/E,CAAC,IAAA,+BAAuB,EAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,EACtD;QACD,IAAI,SAAS,CAAC,UAAU,CAAC,mBAAmB,GAAG,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,mBAAmB,GAAG,CAAC,EAAE;YACjG,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,MAAA,SAAS,CAAC,UAAU,CAAC,mBAAmB,mCAAI,CAAC,EAC7C,MAAA,SAAS,CAAC,UAAU,CAAC,mBAAmB,mCAAI,CAAC,EAC7C,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;SAC/E;KACD;IAQD,IAAI,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;QACjE,MAAM,OAAO,GAAG,MAAA,SAAS,CAAC,UAAU,CAAC,uBAAuB,mCAAI,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAA,SAAS,CAAC,UAAU,CAAC,uBAAuB,mCAAI,CAAC,CAAC;QACrE,IAAA,mBAAW,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;KACvF;IACD,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;QAC3B,MAAM,kBAAkB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,IAAA,sCAAqB,EAAC,kBAAkB,CAAC,EAAE;YAC9C,kBAAkB,CAAC,kBAAkB,CAAC,MAAM,EAAE;gBAC7C,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,KAAK;gBACZ,SAAS;aACT,CAAC,CAAC;SACH;QACD,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB,kBAA8C;YAC9C;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACzF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1F;gBACD,MAAM;YACP,mBAA+C;YAC/C;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACzF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1F,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC1F;gBACD,MAAM;YAUP,gBAAkC;YAClC;gBACC,IAAI,OAAO,CAAC,YAAY,EAAE;oBACzB,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC5E;gBACD,MAAM;YACP,gBAAgC;YAChC;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACzF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC;iBAClG;gBACD,MAAM;SACP;KACD;IAED,MAAM,aAAa,GAAG,6BAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,IAAA,6BAAY,EAAC,aAAa,CAAC,EAAE;QAChC,aAAa,CAAC,SAAS,CAAC,OAAO,EAAE;YAChC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,KAAK;YACZ,SAAS,EAAE,SAAS;SACpB,CAAC,CAAC;KACH;IACD,QAAQ,OAAO,CAAC,MAAM,EAAE;QACvB,gBAAoC;QACpC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,iBAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,0BAA0B,CAAC;YAC5F,IAAA,mBAAW,EACV,OAAO,EACP,IAAI,EACJ,sCAAmB,GAAG,gBAAgB,EACtC,sCAAmB,GAAG,gBAAgB,EACtC,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,MAAM;QACP,gBAAwC;QACxC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACzF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,wBAAwB,CAAC;YAC1F,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACvG,MAAM;QACP,gBAA2C;QAC3C;YACC,MAAM,mBAAmB,GAAG,OAAO,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/F,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC;YACtF,IAAA,mBAAW,EACV,OAAO,EACP,IAAI,EACJ,CAAC,GAAG,mBAAmB,EACvB,mBAAmB,EACnB,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,MAAM;QACP,eAAiC;QACjC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,sBAAwC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,uBAAuB,CAAC;YACzF,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAC3G,MAAM;QACP,kBAAwC;QACxC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,mBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAEzF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,gCAAgC,GAAG,CAAC,CAAC,CAAC;YACxG,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YAC3G,MAAM;QACP,gBAAmC;QACnC;YACC,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,MAAM,eAAe,GACpB,eAAe,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YACtG,IAAA,mBAAW,EAAC,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACnF,MAAM;KACP;AACF,CAAC,CAAC;AAxRW,QAAA,gBAAgB,oBAwR3B;AAIK,MAAM,mBAAmB,GAAG,CAClC,MAAmB,EACnB,KAAoB,EACpB,SAA0B,EAC1B,SAAwB,EACjB,EAAE;;IACT,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAEpE,MAAM,eAAe,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,IAAA,+BAAc,EAAC,eAAe,CAAC,EAAE;QACpC,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE;YACnC,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,KAAK;YACZ,SAAS;SACT,CAAC,CAAC;KACH;IAED,IAAI,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,YAAY,0CAAE,MAAM,CAAA,EAAE;QACrC,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,YAAY,EAAE;YAC3C,QAAQ,KAAK,EAAE;gBACd;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,uBAA8C,CAC7D,CAAC;oBACF,MAAM;gBACP;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM;gBACP;oBACC,IACC,MAAM,CAAC,MAAM,eAAyC;wBACtD,MAAM,CAAC,MAAM,iBAA2C,EACvD;wBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;qBAC/C;oBACD,MAAM;aACP;SACD;KACD;IAED,IAAI,CAAC,CAAC,CAAA,MAAA,SAAS,CAAC,QAAQ,0CAAE,MAAM,CAAA,EAAE;QACjC,KAAK,MAAM,OAAO,IAAI,SAAS,CAAC,QAAQ,EAAE;YACzC,QAAQ,OAAO,CAAC,MAAM,EAAE;gBACvB;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM;gBACP;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;oBAC/C,MAAM;gBACP;oBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,CAAC;oBAC3E,MAAM;gBACP;oBACC,IAAI,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;wBAC3D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;qBAC/C;oBACD,MAAM;aACP;SACD;KACD;IAED,IAAI,SAAS,CAAC,UAAU,CAAC,0BAA0B,GAAG,CAAC,EAAE;QACxD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;KAC7F;IACD,IAAI,SAAS,CAAC,UAAU,CAAC,0BAA0B,GAAG,CAAC,EAAE;QACxD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,0BAA0B,CAAC,CAAC;KAC7F;IACD,IAAI,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC7F,IAAI,SAAS,CAAC,UAAU,CAAC,iBAAiB,GAAG,CAAC,EAAE;YAC/C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;SACpF;KACD;IACD,IAAI,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QAC5F,IAAI,SAAS,CAAC,UAAU,CAAC,eAAe,GAAG,CAAC,EAAE;YAC7C,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;YAClF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;SACrF;KACD;IAED,KAAK,MAAM,WAAW,IAAI,KAAK,EAAE;QAChC,QAAQ,WAAW,CAAC,MAAM,EAAE;YAC3B,kBAA8C;YAC9C;gBACC,IACC,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACxF,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EACvC;oBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9F,CAAC;iBACF;gBACD,MAAM;YACP,mBAA+C;YAC/C;gBACC,IACC,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACxF,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EACvC;oBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9F,CAAC;oBACF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC9F,CAAC;iBACF;gBACD,MAAM;YAaP,gBAAkC;YAClC;gBACC,IAAI,MAAM,CAAC,YAAY,EAAE;oBACxB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAChF,CAAC;iBACF;gBACD,MAAM;YACP,gBAAgC;YAChC;gBACC,IACC,IAAA,uBAAe,EAAC,MAAM,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACxF,MAAM,CAAC,QAAQ,KAAK,WAAW,CAAC,QAAQ,EACvC;oBACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM;wBACZ,CAAC,WAAW,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CACrF,CAAC;iBACF;gBACD,MAAM;SACP;KACD;IAED,QAAQ,MAAM,CAAC,MAAM,EAAE;QACtB,gBAAoC;QACpC;YACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,iBAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,0BAA0B,CAAC;YAC5F,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,sCAAmB,GAAG,gBAAgB,CAAC,CAAC;YACpF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,sCAAmB,GAAG,gBAAgB,CAAC,CAAC;YACpF,MAAM;QACP,gBAAwC;QACxC;YACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,SAAS,CAAC,UAAU,CAAC,wBAAwB,CAAC;YAC1F,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC;YAC9D,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAClE,MAAM;QACP,gBAA2C;QAC3C;YACC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9F,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC;YACtF,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC;YACjE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,mBAAmB,CAAC,CAAC;YACjE,MAAM;QACP,kBAAwC;QACxC;YACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,mBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAGxF,MAAM,gBAAgB,GAAG,gBAAgB,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,gCAAgC,GAAG,CAAC,CAAC,CAAC;YACxG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,gBAAgB,CAAC,CAAC;YAClE,MAAM;QACP,gBAAmC;QACnC;YACC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,MAAM,eAAe,GACpB,eAAe,GAAG,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;YACrG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;YAC7D,MAAM;KACP;IAED,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,YAAY,EAAE;QAC9C,QAAQ,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,EAAE;YAC5B;gBACC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAC;gBAC3E,MAAM;SACP;KACD;AACF,CAAC,CAAC;AAtMW,QAAA,mBAAmB,uBAsM9B;AAEF,MAAM,2BAA2B,GAAG,CACnC,aAAqB,EACrB,OAAoB,EACpB,KAAoB,EACpB,SAA0B,EAC1B,SAAwB,EACxB,iBAAiB,GAAG,IAAI,EACjB,EAAE;IACT,QAAQ,aAAa,EAAE;QACtB,mBAA+C;QAC/C;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAe,EAAC,CAAC,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;iBAElG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;iBAC9C,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrF,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,CAAC,CAAC,CAAC;YACJ,MAAM;QACP,kBAA8C;QAC9C;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAe,EAAC,CAAC,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;iBAClG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;iBAC9C,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,CAAC,CAAC,CAAC;YACJ,MAAM;QAUP,gBAAkC;QAClC;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;iBAC7B,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,CAAC,CAAC,CAAC;YACJ,MAAM;QAEP,gBAAgC;QAChC;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAe,EAAC,CAAC,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;iBAClG,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;iBAC9C,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,CAAC,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC;YAC9F,CAAC,CAAC,CAAC;YACJ,MAAM;QACP,kBAAwC;QACxC;YAEC,IAAI,iBAAiB,EAAE;gBACtB,SAAS,CAAC,UAAU,CAAC,gCAAgC,EAAE,CAAC;aACxD;YACD,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,CAAC;iBAC9C,MAAM,CACN,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,MAAM,iBAAuC;gBAC/C,CAAC,CAAC,MAAM,mBAAyC,CAClD;iBACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,mBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,IAAA,mBAAW,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,gBAAgB,EAAE,CAAC,GAAG,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACnG,CAAC,CAAC,CAAC;YACJ,MAAM;QACP,gBAAqC;QACrC;YACC,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtF,IAAA,mBAAW,EACV,OAAO,EACP,OAAO,EACP,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,kBAAkB,GAAG,gBAAgB,EAC9D,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,kBAAkB,GAAG,gBAAgB,EAC9D,KAAK,EACL,SAAS,EACT,SAAS,EACT,KAAK,CACL,CAAC;YACF,MAAM;KACP;AACF,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAC/B,KAAoB,EACpB,IAAqB,EACrB,UAAyB,EACzB,SAA0B,EAC1B,UAAkC,EAClC,SAAwB,EACjB,EAAE;IACT,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE;QACjC,sBAAsB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;KAC/E;AACF,CAAC,CAAC;AAEK,MAAM,gBAAgB,GAAG,CAAC,IAAqB,EAAE,KAAoB,EAAE,SAAwB,EAAQ,EAAE;;IAC/G,MAAM,MAAM,GAAG,MAAA,IAAI,CAAC,aAAa,mCAAI,EAAE,CAAC;IACxC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;QACnB,OAAO;KACP;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC3B,QAAQ,KAAK,CAAC,MAAM,EAAE;YACrB;gBACC,IAAA,8BAAsB,EAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC;gBACtD,MAAM;SACP;KACD;AACF,CAAC,CAAC;AAbW,QAAA,gBAAgB,oBAa3B;AAEF,MAAM,sBAAsB,GAAG,CAC9B,KAAoB,EACpB,IAAqB,EACrB,UAAyB,EACzB,SAA0B,EAC1B,OAAoB,EACpB,SAAwB,EACjB,EAAE;;IAET,MAAM,YAAY,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAEhC,KAAK,MAAM,OAAO,IAAI,MAAA,IAAI,CAAC,QAAQ,mCAAI,EAAE,EAAE;QAC1C,MAAM,kBAAkB,GAAG,6BAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,IAAI,IAAA,qCAAoB,EAAC,kBAAkB,CAAC,EAAE;YAC7C,kBAAkB,CAAC,iBAAiB,CAAC,OAAO,EAAE;gBAC7C,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;gBACZ,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,UAAU;gBACtB,SAAS;gBACT,cAAc,EAAE,KAAK;aACrB,CAAC,CAAC;SACH;KACD;IAED,KAAK,MAAM,MAAM,IAAI,YAAY,EAAE;QAClC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;YACzC,SAAS;SACT;QAED,MAAM,kBAAkB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,IAAA,qCAAoB,EAAC,kBAAkB,CAAC,EAAE;YAC7C,kBAAkB,CAAC,iBAAiB,CAAC,MAAM,EAAE;gBAC5C,OAAO,EAAE,OAAO;gBAChB,IAAI,EAAE,IAAI;gBACV,KAAK,EAAE,KAAK;gBACZ,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,UAAU;gBACtB,SAAS;gBACT,cAAc,EAAE,KAAK;aACrB,CAAC,CAAC;SACH;QAED,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB,gBAAgC;YAChC;gBACC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;oBACzC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC7E,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBACtE,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC3E;gBACD,MAAM;YACP,gBAAsC;YACtC;gBACC,IAAI,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EAAE;oBACzC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC/E,MAAM,CAAC,cAAc,GAAG,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,CAAC,CAAC,GAAG,SAAS,CAAC;iBACjE;gBACD,MAAM;YACP,gBAAmC;YACnC;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACnF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACjF,IAAA,sBAAc,EACb,OAAO,EACP,OAAO,CAAC,MAAM,GAAG,cAAc,EAC/B,OAAO,CAAC,MAAM,GAAG,cAAc,EAC/B,KAAK,EACL,IAAI,EACJ,SAAS,CACT,CAAC;oBACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC5E;gBACD,MAAM;YAQP,kCAA6D;YAC7D;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,IAAI,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACpF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,MAAM,aAAa,GAClB,MAAM,CAAC,MAAM,mCAA8D,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACrF,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBAClF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC5E;gBACD,MAAM;YAGP;gBACC,IACC,IAAA,uBAAe,EAAC,OAAO,EAAE,IAAI,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC;oBACpF,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,EACnC;oBACD,IAAA,mBAAW,EAAC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;oBACnE,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC3E;gBACD,MAAM;SACP;KACD;IAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE;QACpC,QAAQ,OAAO,CAAC,MAAM,EAAE;YACvB;gBACC,IAAI,IAAA,uBAAe,EAAC,OAAO,EAAE,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;oBACxF,IAAA,sBAAc,EAAC,OAAO,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;oBACxF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBAC1E;gBACD,MAAM;SACP;KACD;AACF,CAAC,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport {\r\n\thasAfterOtherSpawned,\r\n\thasOnDespawned,\r\n\thasOnOtherSpawned,\r\n\thasOnOtherAuraSpawned as hasOnOtherSpawnedAura,\r\n\thasOnSpawned,\r\n} from '../cards/card.interface';\r\nimport { WHELP_CARD_IDS } from '../cards/cards-data';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { eternalKnightAttack, eternalKnightHealth } from '../cards/impl/trinket/eternal-portrait';\r\nimport { updateDivineShield } from '../keywords/divine-shield';\r\nimport { updateTaunt } from '../keywords/taunt';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { pickRandom } from '../services/utils';\r\nimport { alreadyHasVolumizerBuff, copyEntity, hasCorrectTribe, isVolumizer } from '../utils';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { modifyStats, setEntityStats } from './stats';\r\n\r\nexport const addMinionsToBoard = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tindex: number,\r\n\tminionsToAdd: readonly BoardEntity[],\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// board.splice(index, 0, ...minionsToAdd);\r\n\tfor (const minionToAdd of [...minionsToAdd].reverse()) {\r\n\t\taddMinionToBoard(board, boardHero, otherBoard, otherHero, index, minionToAdd, gameState, false);\r\n\t}\r\n\thandleAfterSpawnEffects(board, boardHero, otherBoard, otherHero, minionsToAdd, gameState);\r\n};\r\n\r\nexport const addMinionToBoard = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tindex: number,\r\n\tminionToAdd: BoardEntity,\r\n\tgameState: FullGameState,\r\n\tperformAfterSpawnEffects = true,\r\n\tapplySelfAuras = true,\r\n): void => {\r\n\tboard.splice(index, 0, minionToAdd);\r\n\t// Minion has already been removed from the board in the previous step\r\n\t// Update the global \"SummonedThisGame/Combat\" info here\r\n\thandleAddedMinionAuraEffect(board, boardHero, otherBoard, otherHero, minionToAdd, gameState, applySelfAuras);\r\n\t// Important to do this here, so that \"attack immediately\" minions can be taken into account by the quests\r\n\tonMinionSummoned(boardHero, board, gameState);\r\n\thandleSpawnEffect(board, boardHero, otherBoard, otherHero, minionToAdd, gameState, applySelfAuras);\r\n\tif (performAfterSpawnEffects) {\r\n\t\thandleAfterSpawnEffects(board, boardHero, otherBoard, otherHero, [minionToAdd], gameState);\r\n\t}\r\n};\r\n\r\nconst handleSpawnEffect = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tspawned: BoardEntity,\r\n\tgameState: FullGameState,\r\n\tapplySelfAuras = true,\r\n): void => {\r\n\tconst cardIds = [spawned.cardId, ...(spawned.additionalCards ?? [])];\r\n\r\n\t// https://twitter.com/LoewenMitchell/status/1491879869457879040\r\n\tif (cardIds.some((cardId) => WHELP_CARD_IDS.includes(cardId as CardIds))) {\r\n\t\tconst manyWhelps = board.filter((entity) => entity.cardId === CardIds.ManyWhelps_BG22_HERO_305_Buddy);\r\n\t\tconst goldenManyWhelps = board.filter((entity) => entity.cardId === CardIds.ManyWhelps_BG22_HERO_305_Buddy_G);\r\n\t\tmanyWhelps.forEach((entity) => {\r\n\t\t\tmodifyStats(entity, entity, 2, 2, board, boardHero, gameState);\r\n\t\t});\r\n\t\tgoldenManyWhelps.forEach((entity) => {\r\n\t\t\tmodifyStats(entity, entity, 4, 4, board, boardHero, gameState);\r\n\t\t});\r\n\t}\r\n\r\n\tfor (const entity of board) {\r\n\t\t// The case for Reborns, and these shouldn't proc on themselves\r\n\t\tif (entity.entityId === spawned.entityId) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst onOtherSpawnedImpl = cardMappings[entity.cardId];\r\n\t\tif (hasOnOtherSpawned(onOtherSpawnedImpl)) {\r\n\t\t\tonOtherSpawnedImpl.onOtherSpawned(entity, {\r\n\t\t\t\tspawned: spawned,\r\n\t\t\t\thero: boardHero,\r\n\t\t\t\tboard: board,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\totherHero: otherHero,\r\n\t\t\t\tapplySelfAuras,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tswitch (entity.cardId) {\r\n\t\t\tcase CardIds.CobaltGuardian:\r\n\t\t\t\tif (hasCorrectTribe(spawned, boardHero, Race.MECH, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\tif (!entity.divineShield) {\r\n\t\t\t\t\t\tupdateDivineShield(entity, board, boardHero, otherHero, true, gameState);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tmodifyStats(entity, entity, 2, 0, board, boardHero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.Bigfernal_BGS_204:\r\n\t\t\t// case CardIds.Bigfernal_TB_BaconUps_304:\r\n\t\t\t// \tif (hasCorrectTribe(spawned, boardHero, Race.DEMON, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t// \t\tconst statsBonus = entity.cardId === CardIds.Bigfernal_TB_BaconUps_304 ? 2 : 1;\r\n\t\t\t// \t\tmodifyStats(entity, entity, statsBonus, statsBonus, board, boardHero, gameState);\r\n\t\t\t// \t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.MamaBear_BGS_021:\r\n\t\t\tcase CardIds.MamaBear_TB_BaconUps_090:\r\n\t\t\t\tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\tconst statsBonus = entity.cardId === CardIds.MamaBear_TB_BaconUps_090 ? 12 : 6;\r\n\t\t\t\t\tmodifyStats(spawned, entity, statsBonus, statsBonus, board, boardHero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.PapaBear_BG27_509:\r\n\t\t\t// case CardIds.PapaBear_BG27_509_G:\r\n\t\t\t// \tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t// \t\tconst statsBonus = entity.cardId === CardIds.PapaBear_BG27_509_G ? 16 : 8;\r\n\t\t\t// \t\tmodifyStats(spawned, entity, statsBonus, statsBonus, board, boardHero, gameState);\r\n\t\t\t// \t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.PackLeader_BGS_017:\r\n\t\t\tcase CardIds.PackLeader_TB_BaconUps_086:\r\n\t\t\t\tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\tconst statsBonus = entity.cardId === CardIds.PackLeader_TB_BaconUps_086 ? 4 : 2;\r\n\t\t\t\t\tmodifyStats(spawned, entity, statsBonus, 0, board, boardHero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, boardHero, otherHero);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\nexport const handleAddedMinionAuraEffect = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tspawned: BoardEntity,\r\n\tgameState: FullGameState,\r\n\tapplySelfAuras = true,\r\n\tisActuallySpawned = true,\r\n): void => {\r\n\tfor (const heroPower of boardHero.heroPowers) {\r\n\t\tswitch (heroPower.cardId) {\r\n\t\t\tcase CardIds.SproutItOut:\r\n\t\t\t\tif (isActuallySpawned) {\r\n\t\t\t\t\tupdateTaunt(spawned, true, board, boardHero, otherHero, gameState);\r\n\t\t\t\t\tmodifyStats(spawned, boardHero, 1, 2, board, boardHero, gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tif (boardHero.questRewards?.includes(CardIds.TumblingDisaster_BG28_Reward_505)) {\r\n\t\tconst tumblingDisasterBonus =\r\n\t\t\tboardHero.questRewardEntities?.find((e) => e.cardId === CardIds.TumblingDisaster_BG28_Reward_505)\r\n\t\t\t\t?.scriptDataNum1 || 1;\r\n\t\tmodifyStats(spawned, boardHero, tumblingDisasterBonus, tumblingDisasterBonus, board, boardHero, gameState);\r\n\t}\r\n\r\n\tif (isActuallySpawned) {\r\n\t\tfor (const trinket of boardHero.trinkets) {\r\n\t\t\tswitch (trinket.cardId) {\r\n\t\t\t\tcase CardIds.BlingtronsSunglasses_BG30_MagicItem_978:\r\n\t\t\t\t\tif (hasCorrectTribe(spawned, boardHero, Race.MECH, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\t\tconst target = pickRandom(board.filter((e) => !e.divineShield));\r\n\t\t\t\t\t\tif (!!target) {\r\n\t\t\t\t\t\t\tupdateDivineShield(target, board, boardHero, otherHero, true, gameState);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.TwinSkyLanterns_BG30_MagicItem_822:\r\n\t\t\t\tcase CardIds.TwinSkyLanterns_TwinSkyLanternsToken_BG30_MagicItem_822t2:\r\n\t\t\t\t\tif (!trinket.rememberedMinion) {\r\n\t\t\t\t\t\ttrinket.rememberedMinion = copyEntity(spawned);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.ReinforcedShield_BG30_MagicItem_886:\r\n\t\t\t\t\tif (trinket.scriptDataNum1 > 0 && !spawned.divineShield) {\r\n\t\t\t\t\t\tupdateDivineShield(spawned, board, boardHero, otherHero, true, gameState);\r\n\t\t\t\t\t\ttrinket.scriptDataNum1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Apply auras to board\r\n\tconst cardIds = [spawned.cardId, ...(spawned.additionalCards ?? [])];\r\n\tfor (const spawnedCardId of cardIds) {\r\n\t\thandleMinionAddedAuraEffect(spawnedCardId, spawned, board, boardHero, gameState, isActuallySpawned);\r\n\t}\r\n\r\n\t// When we want to summon an \"exact copy\", we need to make sure we don't apply the aura twice\r\n\tif (applySelfAuras) {\r\n\t\t// The board here already contains the new minion\r\n\t\t// TODO: what if the additional part is a potential target for the aura effect?\r\n\t\t// 2024-08-27: changing the order to first handleMinionAddedAuraEffect so that the automatons get boosted,\r\n\t\t// then apply the aura\r\n\t\tapplyAurasToSelf(spawned, board, boardHero, gameState);\r\n\t}\r\n\r\n\tif (isActuallySpawned) {\r\n\t\tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\tboardHero.globalInfo.BeastsSummonedThisCombat++;\r\n\t\t\tboardHero.globalInfo.BeastsSummonedThisGame++;\r\n\t\t}\r\n\t\tif (hasCorrectTribe(spawned, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards)) {\r\n\t\t\tboardHero.globalInfo.PiratesSummonedThisGame++;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const applyAurasToSelf = (\r\n\tspawned: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tspawned.attack += boardHero.globalInfo.AdditionalAttack;\r\n\r\n\tif (!!boardHero.questRewards?.length) {\r\n\t\tfor (const quest of boardHero.questRewards) {\r\n\t\t\tswitch (quest) {\r\n\t\t\t\tcase CardIds.VolatileVenom:\r\n\t\t\t\t\tspawned.attack += 7;\r\n\t\t\t\t\tspawned.health += 7;\r\n\t\t\t\t\tspawned.enchantments.push({\r\n\t\t\t\t\t\tcardId: CardIds.VolatileVenom_VolatileEnchantment,\r\n\t\t\t\t\t\toriginEntityId: undefined,\r\n\t\t\t\t\t\ttiming: gameState.sharedState.currentEntityId++,\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.TheSmokingGun:\r\n\t\t\t\t\tspawned.attack += 4;\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (!!boardHero.trinkets?.length) {\r\n\t\tfor (const trinket of boardHero.trinkets) {\r\n\t\t\tswitch (trinket.cardId) {\r\n\t\t\t\tcase CardIds.FeralTalisman_BG30_MagicItem_880:\r\n\t\t\t\t\tspawned.attack += 2;\r\n\t\t\t\t\tspawned.health += 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.FeralTalisman_FeralTalismanToken_BG30_MagicItem_880t:\r\n\t\t\t\t\tspawned.attack += 8;\r\n\t\t\t\t\tspawned.health += 5;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.DazzlingDagger_BG32_MagicItem_934:\r\n\t\t\t\t\tspawned.attack += trinket.scriptDataNum1 || 1;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.HordeKeychainToken_BG30_MagicItem_843t:\r\n\t\t\t\t\tif (gameState.cardsData.getTavernLevel(spawned.cardId) <= 3) {\r\n\t\t\t\t\t\tspawned.attack += 7;\r\n\t\t\t\t\t\tspawned.health += 5;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.FlagbearerPortrait_BG30_MagicItem_921:\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tspawned.cardId === CardIds.Scallywag_SkyPirateToken_BGS_061t ||\r\n\t\t\t\t\t\tspawned.cardId === CardIds.Scallywag_SkyPirateToken_TB_BaconUps_141t\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tspawned.attack += 6;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (boardHero.globalInfo.HauntedCarapaceAttackBonus > 0) {\r\n\t\tmodifyStats(\r\n\t\t\tspawned,\r\n\t\t\tspawned,\r\n\t\t\tboardHero.globalInfo.HauntedCarapaceAttackBonus,\r\n\t\t\t0,\r\n\t\t\tboard,\r\n\t\t\tboardHero,\r\n\t\t\tgameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t}\r\n\tif (boardHero.globalInfo.HauntedCarapaceHealthBonus > 0) {\r\n\t\tmodifyStats(\r\n\t\t\tspawned,\r\n\t\t\tspawned,\r\n\t\t\t0,\r\n\t\t\tboardHero.globalInfo.HauntedCarapaceHealthBonus,\r\n\t\t\tboard,\r\n\t\t\tboardHero,\r\n\t\t\tgameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t}\r\n\tif (hasCorrectTribe(spawned, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.UndeadAttackBonus > 0) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\tboardHero.globalInfo.UndeadAttackBonus,\r\n\t\t\t\t0,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\tif (hasCorrectTribe(spawned, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.PirateAttackBonus > 0) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\tboardHero.globalInfo.PirateAttackBonus,\r\n\t\t\t\t0,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\tif (hasCorrectTribe(spawned, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.GoldrinnBuffAtk > 0) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\tboardHero.globalInfo.GoldrinnBuffAtk,\r\n\t\t\t\tboardHero.globalInfo.GoldrinnBuffHealth,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tgameState.spectator.registerPowerTarget(boardHero, spawned, board, null, null);\r\n\t\t}\r\n\t}\r\n\tif (\r\n\t\tisVolumizer(spawned.cardId, boardHero, gameState.anomalies, gameState.allCards) &&\r\n\t\t// https://replays.firestoneapp.com/?reviewId=75e82ef1-3442-4307-a3c8-4a3b72fcf6af&turn=11&action=2\r\n\t\t!alreadyHasVolumizerBuff(spawned, boardHero, gameState)\r\n\t) {\r\n\t\tif (boardHero.globalInfo.VolumizerAttackBuff > 0 || boardHero.globalInfo.VolumizerHealthBuff > 0) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\tboardHero.globalInfo.VolumizerAttackBuff ?? 0,\r\n\t\t\t\tboardHero.globalInfo.VolumizerHealthBuff ?? 0,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tgameState.spectator.registerPowerTarget(boardHero, spawned, board, null, null);\r\n\t\t}\r\n\t}\r\n\r\n\t// In case Putricide spawns a stictched minion whose stitched part creates an aura effect\r\n\t// const potentialAuraSources: { cardId: string; entityId: number }[] = [\r\n\t// \t{ cardId: spawned.cardId, entityId: spawned.entityId },\r\n\t// \t...(spawned.additionalCards ?? []).map((cardId) => ({ cardId, entityId: spawned.entityId })),\r\n\t// ];\r\n\r\n\tif (gameState.cardsData.getTavernLevel(spawned.cardId) % 2 === 1) {\r\n\t\tconst atkBuff = boardHero.globalInfo.MutatedLasherAttackBuff ?? 0;\r\n\t\tconst healthBuff = boardHero.globalInfo.MutatedLasherHealthBuff ?? 0;\r\n\t\tmodifyStats(spawned, spawned, atkBuff, healthBuff, board, boardHero, gameState, false);\r\n\t}\r\n\tfor (const entity of board) {\r\n\t\tconst onOtherSpawnedImpl = cardMappings[entity.cardId];\r\n\t\tif (hasOnOtherSpawnedAura(onOtherSpawnedImpl)) {\r\n\t\t\tonOtherSpawnedImpl.onOtherSpawnedAura(entity, {\r\n\t\t\t\tspawned: spawned,\r\n\t\t\t\thero: boardHero,\r\n\t\t\t\tboard: board,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\t\tswitch (entity.cardId) {\r\n\t\t\tcase CardIds.MurlocWarleaderLegacy_BG_EX1_507:\r\n\t\t\tcase CardIds.MurlocWarleaderLegacy_TB_BaconUps_008:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, boardHero, Race.MURLOC, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tspawned.attack += entity.cardId === CardIds.MurlocWarleaderLegacy_TB_BaconUps_008 ? 4 : 2;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SouthseaCaptainLegacy_BG_NEW1_027:\r\n\t\t\tcase CardIds.SouthseaCaptainLegacy_TB_BaconUps_136:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tspawned.attack += entity.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t\tspawned.health += entity.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.Kathranatir_BG21_039:\r\n\t\t\t// case CardIds.Kathranatir_BG21_039_G:\r\n\t\t\t// \tif (\r\n\t\t\t// \t\thasCorrectTribe(spawned, boardHero, Race.DEMON, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t// \t\tentity.entityId !== spawned.entityId\r\n\t\t\t// \t) {\r\n\t\t\t// \t\tspawned.attack += entity.cardId === CardIds.Kathranatir_BG21_039_G ? 2 : 1;\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.CyborgDrake_BG25_043:\r\n\t\t\tcase CardIds.CyborgDrake_BG25_043_G:\r\n\t\t\t\tif (spawned.divineShield) {\r\n\t\t\t\t\tspawned.attack += entity.cardId === CardIds.CyborgDrake_BG25_043_G ? 12 : 6;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SoreLoser_BG27_030:\r\n\t\t\tcase CardIds.SoreLoser_BG27_030_G:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tspawned.attack += (entity.cardId === CardIds.SoreLoser_BG27_030_G ? 2 : 1) * boardHero.tavernTier;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tconst onSpawnedImpl = cardMappings[spawned.cardId];\r\n\tif (hasOnSpawned(onSpawnedImpl)) {\r\n\t\tonSpawnedImpl.onSpawned(spawned, {\r\n\t\t\thero: boardHero,\r\n\t\t\tboard: board,\r\n\t\t\tgameState: gameState,\r\n\t\t});\r\n\t}\r\n\tswitch (spawned.cardId) {\r\n\t\tcase CardIds.EternalKnight_BG25_008:\r\n\t\tcase CardIds.EternalKnight_BG25_008_G:\r\n\t\t\tconst multiplierKnight = spawned.cardId === CardIds.EternalKnight_BG25_008_G ? 2 : 1;\r\n\t\t\tconst statsBonusKnight = multiplierKnight * boardHero.globalInfo.EternalKnightsDeadThisGame;\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tnull,\r\n\t\t\t\teternalKnightAttack * statsBonusKnight,\r\n\t\t\t\teternalKnightHealth * statsBonusKnight,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.EnsorcelledFungus_BG28_555:\r\n\t\tcase CardIds.EnsorcelledFungus_BG28_555_G:\r\n\t\t\tconst multiplierFungus = spawned.cardId === CardIds.EnsorcelledFungus_BG28_555_G ? 2 : 1;\r\n\t\t\tconst statsBonusFungus = multiplierFungus * boardHero.globalInfo.TavernSpellsCastThisGame;\r\n\t\t\tmodifyStats(spawned, null, statsBonusFungus, 2 * statsBonusFungus, board, boardHero, gameState, false);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.FlourishingFrostling_BG26_537:\r\n\t\tcase CardIds.FlourishingFrostling_BG26_537_G:\r\n\t\t\tconst multiplierFrostling = spawned.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\t\tconst statsBonusFrostling = multiplierFrostling * boardHero.globalInfo.FrostlingBonus;\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tnull,\r\n\t\t\t\t2 * statsBonusFrostling,\r\n\t\t\t\tstatsBonusFrostling,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SaltyLooter_BGS_081:\r\n\t\tcase CardIds.SaltyLooter_TB_BaconUps_143:\r\n\t\t\tconst multiplierLooter = spawned.cardId === CardIds.SaltyLooter_TB_BaconUps_143 ? 2 : 1;\r\n\t\t\tconst statsBonusLooter = multiplierLooter * boardHero.globalInfo.PiratesSummonedThisGame;\r\n\t\t\tmodifyStats(spawned, null, 2 * statsBonusLooter, 2 * multiplierLooter, board, boardHero, gameState, false);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401:\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401_G:\r\n\t\t\tconst multiplierAstral = spawned.cardId === CardIds.AstralAutomaton_BG_TTN_401_G ? 2 : 1;\r\n\t\t\t// Don't count the yourself\r\n\t\t\tconst statsBonusAstral = multiplierAstral * (boardHero.globalInfo.AstralAutomatonsSummonedThisGame - 1);\r\n\t\t\tmodifyStats(spawned, null, 3 * statsBonusAstral, 2 * statsBonusAstral, board, boardHero, gameState, false);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.RotHideGnoll_BG25_013:\r\n\t\tcase CardIds.RotHideGnoll_BG25_013_G:\r\n\t\t\tconst multiplierGnoll = spawned.cardId === CardIds.RotHideGnoll_BG25_013_G ? 2 : 1;\r\n\t\t\tconst statsBonusGnoll =\r\n\t\t\t\tmultiplierGnoll * gameState.sharedState.deaths.filter((e) => e.friendly === spawned.friendly).length;\r\n\t\t\tmodifyStats(spawned, null, statsBonusGnoll, 0, board, boardHero, gameState, false);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n\r\n// Introduced for Rapid Reanimation: since we will \"addMinionToBoard\" the minion afterwards, the auras will\r\n// be re-applied then, so we need to remove them first\r\nexport const removeAurasFromSelf = (\r\n\tentity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tentity.attack -= Math.max(0, boardHero.globalInfo.AdditionalAttack);\r\n\r\n\tconst onDespawnedImpl = cardMappings[entity.cardId];\r\n\tif (hasOnDespawned(onDespawnedImpl)) {\r\n\t\tonDespawnedImpl.onDespawned(entity, {\r\n\t\t\thero: boardHero,\r\n\t\t\tboard: board,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t}\r\n\r\n\tif (!!boardHero.questRewards?.length) {\r\n\t\tfor (const quest of boardHero.questRewards) {\r\n\t\t\tswitch (quest) {\r\n\t\t\t\tcase CardIds.VolatileVenom:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 7);\r\n\t\t\t\t\tentity.health = Math.max(1, entity.health - 7);\r\n\t\t\t\t\tentity.enchantments = entity.enchantments.filter(\r\n\t\t\t\t\t\t(e) => e.cardId !== CardIds.VolatileVenom_VolatileEnchantment,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.TheSmokingGun:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 7);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.FlagbearerPortrait_BG30_MagicItem_921:\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tentity.cardId === CardIds.SkyPirateFlagbearer_BG30_119 ||\r\n\t\t\t\t\t\tentity.cardId === CardIds.SkyPirateFlagbearer_BG30_119_G\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 8);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (!!boardHero.trinkets?.length) {\r\n\t\tfor (const trinket of boardHero.trinkets) {\r\n\t\t\tswitch (trinket.cardId) {\r\n\t\t\t\tcase CardIds.FeralTalisman_BG30_MagicItem_880:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 2);\r\n\t\t\t\t\tentity.health = Math.max(1, entity.health - 1);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.FeralTalisman_FeralTalismanToken_BG30_MagicItem_880t:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 8);\r\n\t\t\t\t\tentity.health = Math.max(1, entity.health - 5);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.DazzlingDagger_BG32_MagicItem_934:\r\n\t\t\t\t\tentity.attack = Math.max(0, entity.attack - (trinket.scriptDataNum1 || 1));\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase CardIds.HordeKeychainToken_BG30_MagicItem_843t:\r\n\t\t\t\t\tif (gameState.cardsData.getTavernLevel(entity.cardId) <= 3) {\r\n\t\t\t\t\t\tentity.attack = Math.max(0, entity.attack - 7);\r\n\t\t\t\t\t\tentity.health = Math.max(1, entity.health - 5);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tif (boardHero.globalInfo.HauntedCarapaceAttackBonus > 0) {\r\n\t\tentity.attack = Math.max(0, entity.attack - boardHero.globalInfo.HauntedCarapaceAttackBonus);\r\n\t}\r\n\tif (boardHero.globalInfo.HauntedCarapaceHealthBonus > 0) {\r\n\t\tentity.health = Math.max(1, entity.health - boardHero.globalInfo.HauntedCarapaceHealthBonus);\r\n\t}\r\n\tif (hasCorrectTribe(entity, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.UndeadAttackBonus > 0) {\r\n\t\t\tentity.attack = Math.max(0, entity.attack - boardHero.globalInfo.UndeadAttackBonus);\r\n\t\t}\r\n\t}\r\n\tif (hasCorrectTribe(entity, boardHero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\tif (boardHero.globalInfo.GoldrinnBuffAtk > 0) {\r\n\t\t\tentity.attack = Math.max(0, entity.attack - boardHero.globalInfo.GoldrinnBuffAtk);\r\n\t\t\tentity.health = Math.max(1, entity.health - boardHero.globalInfo.GoldrinnBuffHealth);\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const boardEntity of board) {\r\n\t\tswitch (boardEntity.cardId) {\r\n\t\t\tcase CardIds.MurlocWarleaderLegacy_BG_EX1_507:\r\n\t\t\tcase CardIds.MurlocWarleaderLegacy_TB_BaconUps_008:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(entity, boardHero, Race.MURLOC, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== boardEntity.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tentity.attack = Math.max(\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tentity.attack - (boardEntity.cardId === CardIds.MurlocWarleaderLegacy_TB_BaconUps_008 ? 4 : 2),\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SouthseaCaptainLegacy_BG_NEW1_027:\r\n\t\t\tcase CardIds.SouthseaCaptainLegacy_TB_BaconUps_136:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(entity, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== boardEntity.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tentity.attack = Math.max(\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tentity.attack - (boardEntity.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1),\r\n\t\t\t\t\t);\r\n\t\t\t\t\tentity.health = Math.max(\r\n\t\t\t\t\t\t1,\r\n\t\t\t\t\t\tentity.health - (boardEntity.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1),\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.Kathranatir_BG21_039:\r\n\t\t\t// case CardIds.Kathranatir_BG21_039_G:\r\n\t\t\t// \tif (\r\n\t\t\t// \t\thasCorrectTribe(entity, boardHero, Race.DEMON, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t// \t\tentity.entityId !== boardEntity.entityId\r\n\t\t\t// \t) {\r\n\t\t\t// \t\tentity.attack = Math.max(\r\n\t\t\t// \t\t\t0,\r\n\t\t\t// \t\t\tentity.attack - (boardEntity.cardId === CardIds.Kathranatir_BG21_039_G ? 2 : 1),\r\n\t\t\t// \t\t);\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.CyborgDrake_BG25_043:\r\n\t\t\tcase CardIds.CyborgDrake_BG25_043_G:\r\n\t\t\t\tif (entity.divineShield) {\r\n\t\t\t\t\tentity.attack = Math.max(\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tentity.attack - (boardEntity.cardId === CardIds.CyborgDrake_BG25_043_G ? 12 : 6),\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SoreLoser_BG27_030:\r\n\t\t\tcase CardIds.SoreLoser_BG27_030_G:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(entity, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== boardEntity.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tentity.attack = Math.max(\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\tentity.attack -\r\n\t\t\t\t\t\t\t(boardEntity.cardId === CardIds.SoreLoser_BG27_030_G ? 2 : 1) * boardHero.tavernTier,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.EternalKnight_BG25_008:\r\n\t\tcase CardIds.EternalKnight_BG25_008_G:\r\n\t\t\tconst multiplierKnight = entity.cardId === CardIds.EternalKnight_BG25_008_G ? 2 : 1;\r\n\t\t\tconst statsBonusKnight = multiplierKnight * boardHero.globalInfo.EternalKnightsDeadThisGame;\r\n\t\t\tentity.attack = Math.max(0, entity.attack - eternalKnightAttack * statsBonusKnight);\r\n\t\t\tentity.health = Math.max(1, entity.health - eternalKnightHealth * statsBonusKnight);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.EnsorcelledFungus_BG28_555:\r\n\t\tcase CardIds.EnsorcelledFungus_BG28_555_G:\r\n\t\t\tconst multiplierFungus = entity.cardId === CardIds.EnsorcelledFungus_BG28_555_G ? 2 : 1;\r\n\t\t\tconst statsBonusFungus = multiplierFungus * boardHero.globalInfo.TavernSpellsCastThisGame;\r\n\t\t\tentity.attack = Math.max(0, entity.attack - statsBonusFungus);\r\n\t\t\tentity.health = Math.max(1, entity.health - 2 * statsBonusFungus);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.FlourishingFrostling_BG26_537:\r\n\t\tcase CardIds.FlourishingFrostling_BG26_537_G:\r\n\t\t\tconst multiplierFrostling = entity.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\t\tconst statsBonusFrostling = multiplierFrostling * boardHero.globalInfo.FrostlingBonus;\r\n\t\t\tentity.attack = Math.max(0, entity.attack - statsBonusFrostling);\r\n\t\t\tentity.health = Math.max(1, entity.health - statsBonusFrostling);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401:\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401_G:\r\n\t\t\tconst multiplierAstral = entity.cardId === CardIds.AstralAutomaton_BG_TTN_401_G ? 2 : 1;\r\n\t\t\t// We remove 1 because the AstralAutomatonsSummonedThisGame also includes the current one\r\n\t\t\t// and ancestral automaton only counts \"other\" automatons\r\n\t\t\tconst statsBonusAstral = multiplierAstral * (boardHero.globalInfo.AstralAutomatonsSummonedThisGame - 1);\r\n\t\t\tentity.attack = Math.max(0, entity.attack - 3 * statsBonusAstral);\r\n\t\t\tentity.health = Math.max(1, entity.health - 2 * statsBonusAstral);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.RotHideGnoll_BG25_013:\r\n\t\tcase CardIds.RotHideGnoll_BG25_013_G:\r\n\t\t\tconst multiplierGnoll = entity.cardId === CardIds.RotHideGnoll_BG25_013_G ? 2 : 1;\r\n\t\t\tconst statsBonusGnoll =\r\n\t\t\t\tmultiplierGnoll * gameState.sharedState.deaths.filter((e) => e.friendly === entity.friendly).length;\r\n\t\t\tentity.attack = Math.max(0, entity.attack - statsBonusGnoll);\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\tfor (const enchantment of entity.enchantments) {\r\n\t\tswitch (enchantment?.cardId) {\r\n\t\t\tcase CardIds.TavernLighting_TavernLightsEnchantment:\r\n\t\t\t\tentity.attack = Math.max(0, entity.attack - enchantment.tagScriptDataNum1);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleMinionAddedAuraEffect = (\r\n\tspawnedCardId: string,\r\n\tspawned: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tisActuallySpawned = true,\r\n): void => {\r\n\tswitch (spawnedCardId) {\r\n\t\tcase CardIds.SouthseaCaptainLegacy_BG_NEW1_027:\r\n\t\tcase CardIds.SouthseaCaptainLegacy_TB_BaconUps_136:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.PIRATE, gameState.anomalies, gameState.allCards))\r\n\t\t\t\t// Other\r\n\t\t\t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\te.attack += spawned.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t\te.health += spawned.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.MurlocWarleaderLegacy_BG_EX1_507:\r\n\t\tcase CardIds.MurlocWarleaderLegacy_TB_BaconUps_008:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.MURLOC, gameState.anomalies, gameState.allCards))\r\n\t\t\t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\te.attack += spawned.cardId === CardIds.MurlocWarleaderLegacy_TB_BaconUps_008 ? 4 : 2;\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\t// case CardIds.Kathranatir_BG21_039:\r\n\t\t// case CardIds.Kathranatir_BG21_039_G:\r\n\t\t// \tboard\r\n\t\t// \t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.DEMON, gameState.anomalies, gameState.allCards))\r\n\t\t// \t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t// \t\t.forEach((e) => {\r\n\t\t// \t\t\te.attack += spawned.cardId === CardIds.Kathranatir_BG21_039_G ? 4 : 2;\r\n\t\t// \t\t});\r\n\t\t// \tbreak;\r\n\t\tcase CardIds.CyborgDrake_BG25_043:\r\n\t\tcase CardIds.CyborgDrake_BG25_043_G:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => e.divineShield)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\te.attack += spawned.cardId === CardIds.CyborgDrake_BG25_043_G ? 12 : 6;\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\r\n\t\tcase CardIds.SoreLoser_BG27_030:\r\n\t\tcase CardIds.SoreLoser_BG27_030_G:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.UNDEAD, gameState.anomalies, gameState.allCards))\r\n\t\t\t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\te.attack += (spawned.cardId === CardIds.SoreLoser_BG27_030_G ? 2 : 1) * boardHero.tavernTier;\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401:\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401_G:\r\n\t\t\t// TODO: move this somewhere else\r\n\t\t\tif (isActuallySpawned) {\r\n\t\t\t\tboardHero.globalInfo.AstralAutomatonsSummonedThisGame++;\r\n\t\t\t}\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => e.entityId !== spawned.entityId)\r\n\t\t\t\t.filter(\r\n\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\te.cardId === CardIds.AstralAutomaton_BG_TTN_401 ||\r\n\t\t\t\t\t\te.cardId === CardIds.AstralAutomaton_BG_TTN_401_G,\r\n\t\t\t\t)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tconst multiplierAstral = e.cardId === CardIds.AstralAutomaton_BG_TTN_401_G ? 2 : 1;\r\n\t\t\t\t\tmodifyStats(e, e, 3 * multiplierAstral, 2 * multiplierAstral, board, boardHero, gameState, false);\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.DrBoomsMonster_BG31_176:\r\n\t\tcase CardIds.DrBoomsMonster_BG31_176_G:\r\n\t\t\tconst multiplierDrBoom = spawned.cardId === CardIds.DrBoomsMonster_BG31_176_G ? 2 : 1;\r\n\t\t\tmodifyStats(\r\n\t\t\t\tspawned,\r\n\t\t\t\tspawned,\r\n\t\t\t\t2 * boardHero.globalInfo.MagnetizedThisGame * multiplierDrBoom,\r\n\t\t\t\t2 * boardHero.globalInfo.MagnetizedThisGame * multiplierDrBoom,\r\n\t\t\t\tboard,\r\n\t\t\t\tboardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n\r\nconst handleAfterSpawnEffects = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tallSpawned: readonly BoardEntity[],\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tfor (const spawned of allSpawned) {\r\n\t\thandleAfterSpawnEffect(board, hero, otherBoard, otherHero, spawned, gameState);\r\n\t}\r\n};\r\n\r\nexport const onMinionSummoned = (hero: BgsPlayerEntity, board: BoardEntity[], gameState: FullGameState): void => {\r\n\tconst quests = hero.questEntities ?? [];\r\n\tif (!quests.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.AssembleALineup:\r\n\t\t\t\tonQuestProgressUpdated(hero, quest, board, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleAfterSpawnEffect = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tspawned: BoardEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// So that spawns don't mess up the loop\r\n\tconst initialBoard = [...board];\r\n\r\n\tfor (const trinket of hero.trinkets ?? []) {\r\n\t\tconst onAfterSpawnedImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasAfterOtherSpawned(onAfterSpawnedImpl)) {\r\n\t\t\tonAfterSpawnedImpl.afterOtherSpawned(trinket, {\r\n\t\t\t\tspawned: spawned,\r\n\t\t\t\thero: hero,\r\n\t\t\t\tboard: board,\r\n\t\t\t\totherHero: otherHero,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tapplySelfAuras: false,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const entity of initialBoard) {\r\n\t\tif (entity.entityId === spawned.entityId) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst onAfterSpawnedImpl = cardMappings[entity.cardId];\r\n\t\tif (hasAfterOtherSpawned(onAfterSpawnedImpl)) {\r\n\t\t\tonAfterSpawnedImpl.afterOtherSpawned(entity, {\r\n\t\t\t\tspawned: spawned,\r\n\t\t\t\thero: hero,\r\n\t\t\t\tboard: board,\r\n\t\t\t\totherHero: otherHero,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tapplySelfAuras: false,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tswitch (entity.cardId) {\r\n\t\t\tcase CardIds.XyloBones_BG26_172:\r\n\t\t\tcase CardIds.XyloBones_BG26_172_G:\r\n\t\t\t\tif (entity.entityId !== spawned.entityId) {\r\n\t\t\t\t\tconst xylobonesBuff = entity.cardId === CardIds.XyloBones_BG26_172_G ? 4 : 2;\r\n\t\t\t\t\tmodifyStats(entity, entity, 0, xylobonesBuff, board, hero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.OctosariWrapGod_BG26_804:\r\n\t\t\tcase CardIds.OctosariWrapGod_BG26_804_G:\r\n\t\t\t\tif (entity.entityId !== spawned.entityId) {\r\n\t\t\t\t\tconst octoStats = entity.cardId === CardIds.OctosariWrapGod_BG26_804_G ? 4 : 2;\r\n\t\t\t\t\tentity.scriptDataNum1 = (entity.scriptDataNum1 ?? 0) + octoStats;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.BananaSlamma_BG26_802:\r\n\t\t\tcase CardIds.BananaSlamma_BG26_802_G:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, hero, Race.BEAST, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tconst bananaStatBuff = entity.cardId === CardIds.BananaSlamma_BG26_802_G ? 3 : 2;\r\n\t\t\t\t\tsetEntityStats(\r\n\t\t\t\t\t\tspawned,\r\n\t\t\t\t\t\tspawned.attack * bananaStatBuff,\r\n\t\t\t\t\t\tspawned.health * bananaStatBuff,\r\n\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\thero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, spawned, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.ObserverOfMyths_BG_TTN_078:\r\n\t\t\t// case CardIds.ObserverOfMyths_BG_TTN_078_G:\r\n\t\t\t// \tif (spawned.attack > entity.attack) {\r\n\t\t\t// \t\tconst observerBuff = entity.cardId === CardIds.ObserverOfMyths_BG_TTN_078_G ? 2 : 1;\r\n\t\t\t// \t\taddStatsToBoard(entity, board, hero, observerBuff, 0, gameState);\r\n\t\t\t// \t}\r\n\t\t\t// \tbreak;\r\n\t\t\tcase CardIds.ValithriaDreamwalker_TB_BaconShop_HERO_53_Buddy:\r\n\t\t\tcase CardIds.ValithriaDreamwalker_TB_BaconShop_HERO_53_Buddy_G:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, hero, Race.DRAGON, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tconst valithriaBuff =\r\n\t\t\t\t\t\tentity.cardId === CardIds.ValithriaDreamwalker_TB_BaconShop_HERO_53_Buddy_G ? 3 : 2;\r\n\t\t\t\t\tmodifyStats(entity, entity, valithriaBuff, valithriaBuff, board, hero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, spawned, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t// Putricide-only\r\n\t\t\tcase CardIds.ArmsDealer_BG26_RLK_824:\r\n\t\t\t\tif (\r\n\t\t\t\t\thasCorrectTribe(spawned, hero, Race.UNDEAD, gameState.anomalies, gameState.allCards) &&\r\n\t\t\t\t\tentity.entityId !== spawned.entityId\r\n\t\t\t\t) {\r\n\t\t\t\t\tmodifyStats(spawned, spawned, 1, 0, board, hero, gameState, false);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(entity, entity, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const trinket of hero.trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.SlammaSticker_BG30_MagicItem_540:\r\n\t\t\t\tif (hasCorrectTribe(spawned, hero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\t\t\t\tsetEntityStats(spawned, spawned.attack * 2, spawned.health * 2, board, hero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(hero, spawned, board, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport interface OnSpawnInput {\r\n\thero: BgsPlayerEntity;\r\n\tboard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n}\r\nexport interface OnOtherSpawnInput {\r\n\tspawned: BoardEntity;\r\n\thero: BgsPlayerEntity;\r\n\tboard: BoardEntity[];\r\n\totherHero: BgsPlayerEntity;\r\n\totherBoard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n\tapplySelfAuras: boolean;\r\n}\r\nexport interface OnOtherSpawnAuraInput {\r\n\tspawned: BoardEntity;\r\n\thero: BgsPlayerEntity;\r\n\tboard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n}\r\nexport interface OnDespawnInput {\r\n\thero: BgsPlayerEntity;\r\n\tboard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n}\r\n"]}
@@ -363,12 +363,6 @@ const processMinionDeath = (board1, board1Hero, board2, board2Hero, gameState, s
363
363
  if (deadEntities1.length === 0 && deadEntities2.length === 0) {
364
364
  return;
365
365
  }
366
- board1
367
- .filter((entity) => (0, utils_2.isFish)(entity))
368
- .forEach((entity) => (0, deathrattle_effects_1.rememberDeathrattles)(entity, deadEntities1, gameState.cardsData, gameState.allCards, gameState.sharedState));
369
- board2
370
- .filter((entity) => (0, utils_2.isFish)(entity))
371
- .forEach((entity) => (0, deathrattle_effects_1.rememberDeathrattles)(entity, deadEntities2, gameState.cardsData, gameState.allCards, gameState.sharedState));
372
366
  gameState.spectator.registerDeadEntities(deadMinionIndexesFromRights1, deadEntities1, board1, deadMinionIndexesFromRights2, deadEntities2, board2);
373
367
  gameState.sharedState.deaths.push(...deadEntities1.map((e, index) => (0, utils_2.addImpliedMechanics)({
374
368
  ...e,
@@ -424,6 +418,12 @@ const processMinionDeath = (board1, board1Hero, board2, board2Hero, gameState, s
424
418
  (0, summon_when_space_1.handleSummonsWhenSpace)(board1, board1Hero, board2, board2Hero, gameState);
425
419
  }
426
420
  handleAfterMinionsDeaths(board1, deadEntities1, board1Hero, board2, deadEntities2, board2Hero, gameState);
421
+ board1
422
+ .filter((entity) => (0, utils_2.isFish)(entity))
423
+ .forEach((entity) => (0, deathrattle_effects_1.rememberDeathrattles)(entity, deadEntities1, gameState.cardsData, gameState.allCards, gameState.sharedState));
424
+ board2
425
+ .filter((entity) => (0, utils_2.isFish)(entity))
426
+ .forEach((entity) => (0, deathrattle_effects_1.rememberDeathrattles)(entity, deadEntities2, gameState.cardsData, gameState.allCards, gameState.sharedState));
427
427
  };
428
428
  exports.processMinionDeath = processMinionDeath;
429
429
  const handleAfterMinionsDeaths = (board1, deadEntities1, heroEntity1, board2, deadEntities2, heroEntity2, gameState) => {
@@ -1 +1 @@
1
- {"version":3,"file":"attack.js","sourceRoot":"","sources":["../../src/simulation/attack.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnAfterDeath, hasOnDeath } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { debugState } from '../debug-state';\r\nimport { updateDivineShield } from '../keywords/divine-shield';\r\nimport { updateVenomous } from '../keywords/venomous';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { addImpliedMechanics, isFish } from '../utils';\r\nimport { applyAfterAttackEffects, applyAfterAttackTrinkets } from './after-attack';\r\nimport { onEntityDamaged } from './damage-effects';\r\nimport { rememberDeathrattles } from './deathrattle-effects';\r\nimport { orchestrateMinionDeathEffects } from './deathrattle-orchestration';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { makeMinionsDie } from './minion-death';\r\nimport { onMinionKill } from './minion-kill';\r\nimport { applyOnAttackEffects } from './on-attack';\r\nimport { applyOnBeingAttackedBuffs } from './on-being-attacked';\r\nimport { performEntitySpawns } from './spawns';\r\nimport { applyAfterStatsUpdate } from './stats';\r\nimport { handleSummonsWhenSpace } from './summon-when-space';\r\nimport { canAttack } from './utils/entity-utils';\r\n\r\n// Only use it to simulate actual attack. To simulate damage, or something similar, use bumpInto\r\nexport const simulateAttack = (\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tforceTarget: BoardEntity = null,\r\n): BoardEntity => {\r\n\t// console.debug(\r\n\t// \t'\\nsimulating attack',\r\n\t// \tstringifySimple(attackingBoard, gameState.allCards),\r\n\t// \t'\\n',\r\n\t// \tstringifySimple(defendingBoard, gameState.allCards),\r\n\t// );\r\n\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst attackingEntity = getAttackingEntity(attackingBoard, gameState.allCards);\r\n\tif (attackingEntity) {\r\n\t\tgameState.sharedState.currentAttackerEntityId = attackingEntity.entityId;\r\n\t\t// Get the left entities now, otherwise things might break if the attacker dies and/or other\r\n\t\t// entities pop\r\n\t\tconst attackingEntityIndex = attackingBoard.indexOf(attackingEntity);\r\n\t\tconst attackingEntitiesToTheLeft = attackingBoard.slice(0, attackingEntityIndex);\r\n\t\tconst isAttackingImmediately = attackingEntity.attackImmediately;\r\n\t\t// In case of Broodmother spawn, it spawns where the dead minion was, and has no influence on the\r\n\t\t// attack order\r\n\t\t// Situation this is trying to resolve by putting this right at the top of the loop:\r\n\t\t// - One scallywag attacks into another one, both die\r\n\t\t// - The first one attacks. To its left is a Harmless Bonehead with 1 HP. The scallywag attacks, and both scallys die\r\n\t\t// - The *other* sky pirate attacks first, and kills the bonehead. Two minions are spawned\r\n\t\t// - The first sy pirate attacks\r\n\t\t// - The initial loop is resolved. If this is at the end, the Harmless Bonehead is already dead, and not flagged\r\n\t\t// While having this right away, we immediately flag all minions to the left\r\n\t\tif (!isAttackingImmediately) {\r\n\t\t\t// Make sure they won't be able to attack until everyone has attacked\r\n\t\t\t// See http://replays.firestoneapp.com/?reviewId=a1b3066d-e806-44c1-ab4b-7ef9dbf9b5b9&turn=5&action=4\r\n\t\t\tattackingEntitiesToTheLeft.forEach((entity) => (entity.hasAttacked = 2));\r\n\t\t} else {\r\n\t\t\t// Change it right away so that new spawns don't trigger the \"attack immediately\" again\r\n\t\t\tattackingEntity.attackImmediately = false;\r\n\t\t}\r\n\r\n\t\tconst numberOfAttacks = attackingEntity.windfury ? 2 : 1;\r\n\t\tfor (let i = 0; i < numberOfAttacks; i++) {\r\n\t\t\t// We refresh the entity in case of windfury\r\n\t\t\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\t\t\t// We still want to flag the entity as having attacked, so that it doesn't attack again\r\n\t\t\t\t// after teammate switch in Duos\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t// Check that didn't die\r\n\t\t\tif (attackingBoard.find((entity) => entity.entityId === attackingEntity.entityId)) {\r\n\t\t\t\tconst defendingEntity: BoardEntity = forceTarget ?? getDefendingEntity(defendingBoard, attackingEntity);\r\n\t\t\t\t// Can happen with a single defender that has stealth\r\n\t\t\t\tif (defendingEntity && defendingEntity.health > 0 && !defendingEntity.definitelyDead) {\r\n\t\t\t\t\tdoFullAttack(\r\n\t\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingEntity,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Solves the edge case of Sky Pirate vs a stealth board\r\n\t\t\t\t\tattackingEntity.attackImmediately = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tgameState.sharedState.currentAttackerEntityId = null;\r\n\t\tattackingEntity.hasAttacked = 1;\r\n\t}\r\n\treturn attackingEntity;\r\n};\r\n\r\nexport const doFullAttack = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst isAttackingImmediately = attackingEntity.attackImmediately;\r\n\tgameState.spectator.registerAttack(\r\n\t\tattackingEntity,\r\n\t\tdefendingEntity,\r\n\t\tattackingBoard,\r\n\t\tdefendingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoardHero,\r\n\t);\r\n\t// http://replays.firestoneapp.com/?reviewId=50576a9f-2e6a-4600-87ba-6e737ca9853e&turn=21&action=4\r\n\t// Looks like onBeingAttacked effects apply before onAttack effects\r\n\tapplyOnBeingAttackedBuffs(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tconst { damageDoneByAttacker: damageDoneByAttacker1, damageDoneByDefender: damageDoneByDefender1 } =\r\n\t\tapplyOnAttackEffects(\r\n\t\t\tattackingEntity,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingEntity,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\tconst { damageDoneByAttacker: damageDoneByAttacker2, damageDoneByDefender: damageDoneByDefender2 } = performAttack(\r\n\t\tattackingEntity,\r\n\t\tdefendingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tconst damageDoneByAttacker = damageDoneByAttacker1 + damageDoneByAttacker2;\r\n\tconst damageDoneByDefender = damageDoneByDefender1 + damageDoneByDefender2;\r\n\r\n\t// Process this after the minions die and deathrattles are triggered/spawned\r\n\t// https://replays.firestoneapp.com/?reviewId=dd4e9dbe-abca-434a-ab94-04777cbedefe&turn=29&action=3\r\n\t// BUT: the attacking entity's afterAttack (like Macaw) needs to be processed\r\n\t// To recap:\r\n\t// - Jar o'Gems procs after the deathrattles have spawned\r\n\t// - When Monstrous Macaw procs a deathrattle, it is still on board, thus limiting the spawn room\r\n\t// So not sure what the exact timings are. It could be:\r\n\t// 1. Trigger minion's after attack\r\n\t// 2. Make minions die\r\n\t// 3. Process trinkets after attack\r\n\t// I have asked on Discord - for now I will consider a \"minion after attack\" phase and a \"trinket after attack\" phase.\r\n\t// I'm not sure about the secrets / trinkets, they will need to be adapted\r\n\tapplyAfterAttackEffects(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tdamageDoneByAttacker,\r\n\t\tdamageDoneByDefender,\r\n\t\tgameState,\r\n\t);\r\n\r\n\tprocessMinionDeath(\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t\tisAttackingImmediately,\r\n\t);\r\n\r\n\tapplyAfterAttackTrinkets(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tdamageDoneByAttacker,\r\n\t\tdamageDoneByDefender,\r\n\t\tgameState,\r\n\t);\r\n\tapplyAfterStatsUpdate(gameState);\r\n\tattackingEntity.immuneWhenAttackCharges = Math.max(0, (attackingEntity.immuneWhenAttackCharges ?? 0) - 1);\r\n\t// if (\r\n\t// \tdefendingEntity.health > 0 &&\r\n\t// \t!defendingEntity.definitelyDead\r\n\t// \t&& (defendingEntity.cardId === CardIds.YoHoOgre_BGS_060 ||\r\n\t// \t\tdefendingEntity.cardId === CardIds.YoHoOgre_TB_BaconUps_150)\r\n\t// ) {\r\n\t// \tdefendingEntity.attackImmediately = true;\r\n\t// \tif (defendingEntity.attackImmediately) {\r\n\t// \t\tsimulateAttack(defendingBoard, defendingBoardHero, attackingBoard, attackingBoardHero, gameState);\r\n\t// \t}\r\n\t// }\r\n};\r\n\r\nconst performAttack = (\r\n\tattackingEntity: BoardEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): { damageDoneByAttacker: number; damageDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\r\n\t// if (hasCorrectTribe(attackingEntity, attackingBoardHero, Race.DRAGON, gameState.anomalies, gameState.allCards)) {\r\n\t// \tconst prestors = attackingBoard\r\n\t// \t\t.filter((e) => e.entityId !== attackingEntity.entityId)\r\n\t// \t\t.filter(\r\n\t// \t\t\t(e) =>\r\n\t// \t\t\t\te.cardId === CardIds.PrestorsPyrospawn_BG21_012 ||\r\n\t// \t\t\t\te.cardId === CardIds.PrestorsPyrospawn_BG21_012_G,\r\n\t// \t\t);\r\n\t// \tprestors.forEach((prestor) => {\r\n\t// \t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\tprestor,\r\n\t// \t\t\tdefendingEntity,\r\n\t// \t\t\tdefendingBoard,\r\n\t// \t\t\tattackingBoardHero,\r\n\t// \t\t\tdefendingBoardHero,\r\n\t// \t\t);\r\n\t// \t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t// \t\t\tdefendingEntity,\r\n\t// \t\t\tdefendingBoard,\r\n\t// \t\t\tdefendingBoardHero,\r\n\t// \t\t\tprestor,\r\n\t// \t\t\tprestor.cardId === CardIds.PrestorsPyrospawn_BG21_012_G ? 6 : 3,\r\n\t// \t\t\tattackingBoard,\r\n\t// \t\t\tattackingBoardHero,\r\n\t// \t\t\tgameState,\r\n\t// \t\t);\r\n\t// \t});\r\n\t// }\r\n\t// if (\r\n\t// \tattackingEntity.cardId === CardIds.Atramedes_BG23_362 ||\r\n\t// \tattackingEntity.cardId === CardIds.Atramedes_BG23_362_G\r\n\t// ) {\r\n\t// \tconst targets = [defendingEntity, ...getNeighbours(defendingBoard, defendingEntity)];\r\n\t// \tconst multiplier = attackingEntity.cardId === CardIds.Atramedes_BG23_362_G ? 2 : 1;\r\n\r\n\t// \tfor (let i = 0; i < multiplier; i++) {\r\n\t// \t\ttargets.forEach((target) => {\r\n\t// \t\t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\t\tattackingEntity,\r\n\t// \t\t\t\ttarget,\r\n\t// \t\t\t\tdefendingBoard,\r\n\t// \t\t\t\tattackingBoardHero,\r\n\t// \t\t\t\tdefendingBoardHero,\r\n\t// \t\t\t);\r\n\t// \t\t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t// \t\t\t\ttarget,\r\n\t// \t\t\t\tdefendingBoard,\r\n\t// \t\t\t\tdefendingBoardHero,\r\n\t// \t\t\t\tattackingEntity,\r\n\t// \t\t\t\t3,\r\n\t// \t\t\t\tattackingBoard,\r\n\t// \t\t\t\tattackingBoardHero,\r\n\t// \t\t\t\tgameState,\r\n\t// \t\t\t);\r\n\t// \t\t});\r\n\t// \t}\r\n\t// } else\r\n\tif ([CardIds.BabyKrush_BG22_001, CardIds.BabyKrush_BG22_001_G].includes(attackingEntity.cardId as CardIds)) {\r\n\t\tconst spawns = spawnEntities(\r\n\t\t\tattackingEntity.cardId === CardIds.BabyKrush_BG22_001_G\r\n\t\t\t\t? CardIds.BabyKrush_BG22_001_G\r\n\t\t\t\t: CardIds.BabyKrush_DevilsaurToken,\r\n\t\t\t1,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t\tif (spawns.length > 0) {\r\n\t\t\tconst sourceIndex = attackingBoard.indexOf(attackingEntity);\r\n\t\t\tconst actualSpawns = performEntitySpawns(\r\n\t\t\t\tspawns,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tsourceIndex,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tfor (const actualSpawn of actualSpawns) {\r\n\t\t\t\tif (defendingEntity.health > 0 && !defendingEntity.definitelyDead) {\r\n\t\t\t\t\tperformAttack(\r\n\t\t\t\t\t\tactualSpawn,\r\n\t\t\t\t\t\tdefendingEntity,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// For Prestor\r\n\tconst defenderAliveBeforeAttack = defendingEntity.health > 0 && !defendingEntity.definitelyDead;\r\n\t// Because of Bristleback Knight, which changes its divine shield status during bumpEntities\r\n\tconst attackerHadDivineShield = attackingEntity.divineShield;\r\n\tconst defenderHadDivineShield = defendingEntity.divineShield;\r\n\t// For cleave\r\n\t// We do that now so that we don't include entities that spawn on entity damaged\r\n\tconst defenderNeighbours: readonly BoardEntity[] = getNeighbours(defendingBoard, defendingEntity);\r\n\tif (defenderAliveBeforeAttack) {\r\n\t\tif (!attackingEntity.immuneWhenAttackCharges) {\r\n\t\t\t// TODO: this bumpEntities approach doesn't work well, as it leads to code duplication\r\n\t\t\tdamageDoneByDefender += bumpEntities(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tdamageDoneByAttacker += bumpEntities(\r\n\t\t\tdefendingEntity,\r\n\t\t\tattackingEntity,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tif (defendingEntity.attack > 0 && attackerHadDivineShield && !attackingEntity.immuneWhenAttackCharges) {\r\n\t\t\tupdateDivineShield(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tfalse,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (attackingEntity.attack > 0 && defenderHadDivineShield) {\r\n\t\t\tupdateDivineShield(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tfalse,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t// cause wrong results to happen\r\n\t\t// This whole logic is a MEEEEESSSSSSSSSSSSSSS\r\n\t\tif (damageDoneByDefender > 0) {\r\n\t\t\tonEntityDamaged(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdamageDoneByDefender,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (damageDoneByAttacker > 0) {\r\n\t\t\tonEntityDamaged(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdamageDoneByAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (defendingEntity.health <= 0 || defendingEntity.definitelyDead) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\ttrue,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tdefenderNeighbours,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tif (attackingEntity.health <= 0 || attackingEntity.definitelyDead) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tfalse,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefenderNeighbours,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t}\r\n\t// Cleave\r\n\tif (attackingEntity.cleave) {\r\n\t\tfor (const neighbour of defenderNeighbours) {\r\n\t\t\tconst thisAttackDamage = bumpEntities(\r\n\t\t\t\tneighbour,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += thisAttackDamage;\r\n\t\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t\t// cause wrong results to happen\r\n\t\t\tif (attackingEntity.attack > 0 && neighbour.divineShield) {\r\n\t\t\t\tupdateDivineShield(neighbour, defendingBoard, defendingBoardHero, attackingBoardHero, false, gameState);\r\n\t\t\t}\r\n\t\t\tif (thisAttackDamage > 0) {\r\n\t\t\t\tonEntityDamaged(\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\tthisAttackDamage,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tif (neighbour.health <= 0 || neighbour.definitelyDead) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tdefenderNeighbours,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tattackingEntity.attackImmediately = false;\r\n\tif (attackingEntity.enchantments.some((e) => e.cardId === CardIds.VolatileVenom_VolatileEnchantment)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\treturn { damageDoneByAttacker, damageDoneByDefender };\r\n};\r\n\r\n// TODO: Could it be possible to store the index of the entity that last attacked? Probably not, because minion\r\n// spawns would mess this up? Could we update the indexes as each entity spawns / dies?\r\nconst getAttackingEntity = (attackingBoard: BoardEntity[], allCards: AllCardsService): BoardEntity => {\r\n\tlet validAttackers = attackingBoard.filter((entity) => canAttack(entity));\r\n\tif (validAttackers.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (validAttackers.some((entity) => entity.attackImmediately)) {\r\n\t\tvalidAttackers = validAttackers.filter((entity) => entity.attackImmediately);\r\n\t} else if (validAttackers.every((e) => e.hasAttacked)) {\r\n\t\tattackingBoard.forEach((e) => (e.hasAttacked = 0));\r\n\t} else {\r\n\t\tvalidAttackers = validAttackers.filter((entity) => !entity.hasAttacked);\r\n\t}\r\n\tconst attacker = validAttackers[0];\r\n\t// const debug = attacker.cardId === CardIds.Onyxia_OnyxianWhelpToken;\r\n\t// const attackerName = allCards.getCard(attacker.cardId)?.name;\r\n\treturn attacker;\r\n};\r\n\r\nexport const findNearestEnemies = (\r\n\tattackingBoard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tentityIndexFromRight: number,\r\n\tdefendingBoard: BoardEntity[],\r\n\tnumberOfTargets: number,\r\n\tallCards: AllCardsService,\r\n): BoardEntity[] => {\r\n\tconst result = [];\r\n\tif (defendingBoard.length > 0) {\r\n\t\t// console.debug('defending board', numberOfTargets, stringifySimple(defendingBoard, allCards));\r\n\t\tconst attackerIndex = attackingBoard.length - entityIndexFromRight - 1;\r\n\t\tconst targetIndex = attackerIndex - (attackingBoard.length - defendingBoard.length) / 2;\r\n\t\t// console.debug('indexes', attackerIndex, entityIndexFromRight, targetIndex, attackingBoard.length);\r\n\r\n\t\tfor (let i = 0; i < numberOfTargets; i++) {\r\n\t\t\tconst possibleTargets = defendingBoard\r\n\t\t\t\t.filter((e) => !e.definitelyDead && e.health > 0)\r\n\t\t\t\t.filter((e) => !result.includes(e));\r\n\t\t\t// console.debug('possibleTargets', stringifySimple(possibleTargets, allCards));\r\n\t\t\tif (!possibleTargets.length) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tconst targetGroups = groupByFunction((e: BoardEntity) => Math.abs(defendingBoard.indexOf(e) - targetIndex))(\r\n\t\t\t\tpossibleTargets,\r\n\t\t\t);\r\n\t\t\tconst distances = Object.keys(targetGroups)\r\n\t\t\t\t.map((k) => +k)\r\n\t\t\t\t.sort();\r\n\t\t\tconst nearestDistance = distances[0];\r\n\t\t\tif (nearestDistance != null) {\r\n\t\t\t\t// console.debug(\r\n\t\t\t\t// \t'targetGroups[nearestDistance]',\r\n\t\t\t\t// \tnearestDistance,\r\n\t\t\t\t// \tstringifySimple(targetGroups[nearestDistance], allCards),\r\n\t\t\t\t// );\r\n\t\t\t\tconst target = pickRandom(targetGroups[nearestDistance]);\r\n\t\t\t\tresult.push(target);\r\n\t\t\t}\r\n\t\t\t// console.debug('\\n');\r\n\t\t}\r\n\t}\r\n\treturn result.filter((e) => !!e);\r\n};\r\n\r\nexport const getNeighbours = (\r\n\tboard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tdeadEntityIndexFromRight?: number,\r\n): readonly BoardEntity[] => {\r\n\tconst neighbours = [];\r\n\t// When triggering DR with Hawkstrider, the entity is still on the board\r\n\tif (deadEntityIndexFromRight != null && !board.includes(entity)) {\r\n\t\tconst leftNeighbourIndex = board.length - 1 - deadEntityIndexFromRight;\r\n\t\tconst leftNeighbour = board[leftNeighbourIndex];\r\n\t\tif (leftNeighbour) {\r\n\t\t\tneighbours.push(leftNeighbour);\r\n\t\t}\r\n\r\n\t\t// If the deadEntityIndexFromRight === 0 (right-most minion), no neighbour will be found\r\n\t\tconst rightNeighbourIndex = board.length - 1 - (deadEntityIndexFromRight - 1);\r\n\t\tconst rightNeighbour = board[rightNeighbourIndex];\r\n\t\tif (rightNeighbour) {\r\n\t\t\tneighbours.push(rightNeighbour);\r\n\t\t}\r\n\t} else {\r\n\t\tconst index = board.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\tif (index - 1 >= 0) {\r\n\t\t\tneighbours.push(board[index - 1]);\r\n\t\t}\r\n\t\t// neighbours.push(entity);\r\n\t\tif (index + 1 < board.length) {\r\n\t\t\tneighbours.push(board[index + 1]);\r\n\t\t}\r\n\t}\r\n\treturn neighbours;\r\n};\r\n\r\nexport const getLeftNeighbour = (\r\n\tboard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tdeadEntityIndexFromRight?: number,\r\n): BoardEntity => {\r\n\t// When triggering DR with Hawkstrider, the entity is still on the board\r\n\tif (deadEntityIndexFromRight != null && !board.includes(entity)) {\r\n\t\tconst leftNeighbourIndex = board.length - 1 - deadEntityIndexFromRight;\r\n\t\tconst leftNeighbour = board[leftNeighbourIndex];\r\n\t\tif (leftNeighbour) {\r\n\t\t\treturn leftNeighbour;\r\n\t\t}\r\n\t} else {\r\n\t\tconst index = board.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\tif (index - 1 >= 0) {\r\n\t\t\treturn board[index - 1];\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const dealDamageToRandomEnemy = (\r\n\tboardToBeDamaged: BoardEntity[],\r\n\tboardToBeDamagedHero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity,\r\n\tdamage: number,\r\n\tboardWithAttackOrigin: BoardEntity[],\r\n\tboardWithAttackOriginHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (boardToBeDamaged.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\tconst validTargets = boardToBeDamaged.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst defendingEntity: BoardEntity = pickRandom(validTargets);\r\n\tif (defendingEntity) {\r\n\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\tdamageSource,\r\n\t\t\tdefendingEntity,\r\n\t\t\tboardToBeDamaged,\r\n\t\t\tboardToBeDamagedHero,\r\n\t\t\tboardWithAttackOriginHero,\r\n\t\t);\r\n\t\tdealDamageToMinion(\r\n\t\t\tdefendingEntity,\r\n\t\t\tboardToBeDamaged,\r\n\t\t\tboardToBeDamagedHero,\r\n\t\t\tdamageSource,\r\n\t\t\tdamage,\r\n\t\t\tboardWithAttackOrigin,\r\n\t\t\tboardWithAttackOriginHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport const dealDamageToMinion = (\r\n\ttarget: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity | BgsPlayerEntity,\r\n\tdamage: number,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// console.log('dealing damage to', damage, stringifySimpleCard(defendingEntity, allCards));\r\n\tif (!target) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst isDeadBeforeDamage = target.definitelyDead || target.health <= 0;\r\n\tconst spawns = [];\r\n\t// Why do we use a fakeAttacker? Is that for the \"attacking\" prop?\r\n\t// That prop is only used for Overkill, and even in that case it looks like it would work\r\n\t// without it\r\n\tconst fakeAttacker = {\r\n\t\t...(damageSource || {}),\r\n\t\tentityId: -1,\r\n\t\tattack: damage,\r\n\t\t// attacking: true,\r\n\t} as BoardEntity;\r\n\tconst actualDamageDone = bumpEntities(target, fakeAttacker, board, hero, otherBoard, otherHero, gameState);\r\n\r\n\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t// cause wrong results to happen\r\n\t// TODO: why isn't it done in bumpEntities?\r\n\t// Because of how \"bump\" works: we do it first for the attacker, then the defender, and we only want to update\r\n\t// the divine shield once both bumps are done\r\n\t// The problem is with the Frenzy: bumpEntities can trigger the frenzy, and which can act on the divine shield\r\n\tif (fakeAttacker.attack > 0 && target.divineShield) {\r\n\t\tupdateDivineShield(target, board, hero, otherHero, false, gameState);\r\n\t}\r\n\r\n\tif (actualDamageDone > 0) {\r\n\t\t// TODO: handle entities that have been spawned here to adjust the dead entity index from parent stack\r\n\t\tconst newSpawns = onEntityDamaged(\r\n\t\t\ttarget,\r\n\t\t\tboard,\r\n\t\t\thero,\r\n\t\t\totherBoard,\r\n\t\t\totherHero,\r\n\t\t\tdamageSource,\r\n\t\t\tactualDamageDone,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n\tif (!isDeadBeforeDamage && actualDamageDone > 0 && 'attack' in damageSource && 'health' in damageSource) {\r\n\t\ttarget.lastAffectedByEntity = damageSource as BoardEntity;\r\n\r\n\t\tif (target.health <= 0 || target.definitelyDead) {\r\n\t\t\tonMinionKill(damageSource as BoardEntity, false, target, otherBoard, otherHero, board, hero, [], gameState);\r\n\t\t}\r\n\t}\r\n\tconst defendingEntityIndex = board.map((entity) => entity.entityId).indexOf(target.entityId);\r\n\tboard[defendingEntityIndex] = target;\r\n\treturn actualDamageDone;\r\n};\r\n\r\nexport const getDefendingEntity = (\r\n\tdefendingBoard: BoardEntity[],\r\n\tattackingEntity: BoardEntity,\r\n\tignoreTaunts = false,\r\n): BoardEntity => {\r\n\tif (debugState.active) {\r\n\t\tfor (const forcedFaceOff of debugState.forcedFaceOff) {\r\n\t\t\tif (debugState.isCorrectEntity(forcedFaceOff.attacker, attackingEntity)) {\r\n\t\t\t\t// if (attackingEntity.entityId === forcedFaceOff.attacker.entityId) {\r\n\t\t\t\tconst def = defendingBoard.find((e) => debugState.isCorrectEntity(forcedFaceOff.defender, e));\r\n\t\t\t\tif (!!def) {\r\n\t\t\t\t\t// Remove the face-off\r\n\t\t\t\t\tdebugState.forcedFaceOff = debugState.forcedFaceOff.filter((f) => f != forcedFaceOff);\r\n\t\t\t\t\treturn def;\r\n\t\t\t\t}\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet possibleDefenders: readonly BoardEntity[];\r\n\tif (\r\n\t\tattackingEntity.cardId === CardIds.ZappSlywick_BGS_022 ||\r\n\t\tattackingEntity.cardId === CardIds.ZappSlywick_TB_BaconUps_091 ||\r\n\t\tattackingEntity.cardId === CardIds.MercilessMammoth_BG33_845 ||\r\n\t\tattackingEntity.cardId === CardIds.MercilessMammoth_BG33_845_G\r\n\t) {\r\n\t\tconst minAttack = Math.min(...defendingBoard.map((entity) => entity.attack));\r\n\t\tpossibleDefenders = defendingBoard.filter((entity) => entity.attack === minAttack);\r\n\t} else if (\r\n\t\tattackingEntity.cardId === CardIds.WorgenVigilante_BG26_921 ||\r\n\t\tattackingEntity.cardId === CardIds.WorgenVigilante_BG26_921_G\r\n\t) {\r\n\t\tpossibleDefenders = defendingBoard\r\n\t\t\t.filter(\r\n\t\t\t\t(entity) =>\r\n\t\t\t\t\tentity.health <= attackingEntity.attack || attackingEntity.venomous || attackingEntity.poisonous,\r\n\t\t\t)\r\n\t\t\t.filter((e) => !e.divineShield);\r\n\t\tif (!possibleDefenders.length) {\r\n\t\t\tpossibleDefenders = defendingBoard;\r\n\t\t}\r\n\t} else {\r\n\t\tpossibleDefenders = defendingBoard.filter((e) => !e.stealth);\r\n\t\tif (!ignoreTaunts) {\r\n\t\t\tconst taunts = possibleDefenders.filter((entity) => entity.taunt);\r\n\t\t\tpossibleDefenders = taunts.length > 0 ? taunts : possibleDefenders;\r\n\t\t}\r\n\t}\r\n\r\n\tconst chosenDefender = pickRandom(possibleDefenders);\r\n\t// if (chosenDefender?.taunt) {\r\n\t// \tconst elistras = defendingBoard.filter(\r\n\t// \t\t(entity) =>\r\n\t// \t\t\tentity.cardId === CardIds.ElistraTheImmortal_BGS_205 ||\r\n\t// \t\t\tentity.cardId === CardIds.ElistraTheImmortal_TB_BaconUps_306,\r\n\t// \t);\r\n\t// \tif (elistras.length > 0) {\r\n\t// \t\tchosenDefender = elistras[Math.floor(Math.random() * elistras.length)];\r\n\t// \t}\r\n\t// }\r\n\treturn chosenDefender;\r\n};\r\n\r\nexport const bumpEntities = (\r\n\tentity: BoardEntity,\r\n\tbumpInto: BoardEntity,\r\n\tentityBoard: BoardEntity[],\r\n\tentityBoardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tapplyVenomous = true,\r\n): number => {\r\n\t// No attack has no impact\r\n\tconst debug = bumpInto.cardId === 'BG26_888';\r\n\tif (bumpInto.attack === 0) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t// Matador effect has priority\r\n\tif (\r\n\t\tentity.abiityChargesLeft > 0 &&\r\n\t\t(entity.cardId === CardIds.MadMatador_BG28_404 || entity.cardId === CardIds.MadMatador_BG28_404_G)\r\n\t) {\r\n\t\tentity.abiityChargesLeft--;\r\n\t\tconst newTarget = pickRandom(otherBoard);\r\n\t\tif (newTarget) {\r\n\t\t\tgameState.spectator.registerPowerTarget(entity, newTarget, otherBoard, entityBoardHero, otherHero);\r\n\t\t\t// TODO: here the MadMatador is the source of the damage, not the initial attacker\r\n\t\t\t// Not sure exactly what the impact would be, as there is no counter\r\n\t\t\tconst newSource = {\r\n\t\t\t\t...entity,\r\n\t\t\t\tattack: bumpInto.attack,\r\n\t\t\t\t// attacking: true,\r\n\t\t\t} as BoardEntity;\r\n\t\t\tconst defenderHadDivineShield = newTarget.divineShield;\r\n\t\t\tconst damageDone = bumpEntities(\r\n\t\t\t\tnewTarget,\r\n\t\t\t\tnewSource,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherHero,\r\n\t\t\t\tentityBoard,\r\n\t\t\t\tentityBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tif (newSource.attack > 0 && defenderHadDivineShield) {\r\n\t\t\t\tupdateDivineShield(newTarget, otherBoard, otherHero, entityBoardHero, false, gameState);\r\n\t\t\t}\r\n\t\t\tif (damageDone > 0) {\r\n\t\t\t\tonEntityDamaged(\r\n\t\t\t\t\tnewTarget,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherHero,\r\n\t\t\t\t\tentityBoard,\r\n\t\t\t\t\tentityBoardHero,\r\n\t\t\t\t\tnewSource,\r\n\t\t\t\t\tdamageDone,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\treturn damageDone;\r\n\t\t}\r\n\t}\r\n\r\n\tif (entity.divineShield) {\r\n\t\tgameState.spectator.registerDamageDealt(bumpInto, entity, 0, entityBoard);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst damageDealt = (entity.damageMultiplier || 1) * bumpInto.attack;\r\n\tentity.health = entity.health - damageDealt;\r\n\t// FIXME: This will likely be incorrect in terms of timings, e.g. if the entity ends up\r\n\t// surviving following a buff like Spawn.\r\n\tgameState.spectator.registerDamageDealt(bumpInto, entity, damageDealt, entityBoard);\r\n\r\n\t// if (entity.cardId === CardIds.Bubblette_BG_TID_713 && bumpInto.attack === 1) {\r\n\t// \tentity.definitelyDead = true;\r\n\t// } else if (entity.cardId === CardIds.Bubblette_BG_TID_713_G && bumpInto.attack === 2) {\r\n\t// \tentity.definitelyDead = true;\r\n\t// }\r\n\t// Do it last, so that other effects are still processed\r\n\tif (bumpInto.poisonous) {\r\n\t\t// So that further buffs don't revive it\r\n\t\t// And we don't just set the health to avoid applying overkill effects\r\n\t\tentity.definitelyDead = true;\r\n\t}\r\n\tif (bumpInto.venomous && applyVenomous) {\r\n\t\t// So that further buffs don't revive it\r\n\t\t// And we don't just set the health to avoid applying overkill effects\r\n\t\tentity.definitelyDead = true;\r\n\t\tupdateVenomous(bumpInto, false, otherBoard, otherHero, entityBoardHero, gameState);\r\n\t}\r\n\t// Ideally we should do the Reckoning stuff here. However, at this point we only have half the damage\r\n\t// information, so it is possible that the entity deals more than 3 (which should trigger Reckoning)\r\n\t// but dies during the exchange (and Reckoning doesn't trigger then)\r\n\r\n\tentity.lastAffectedByEntity = bumpInto;\r\n\t// if (entity.frenzyChargesLeft > 0 && entity.health > 0 && !entity.definitelyDead) {\r\n\t// \tapplyFrenzy(entity, entityBoard, entityBoardHero, gameState);\r\n\t// \tentity.frenzyChargesLeft--;\r\n\t// }\r\n\r\n\t// We spawn them here, because it says \"whenever\", and so happens right away\r\n\t// FIXME: there could be a bug here, if a Cleave attacks several IGB at the same time. The current\r\n\t// implementation could spawn minions above the max board size. Fringe case though, so leaving it\r\n\t// like this for now\r\n\t// const entitySpawns = getWheneverEntitySpawns(\r\n\t// \tentity,\r\n\t// \tentityBoard,\r\n\t// \tentityBoardHero,\r\n\t// \totherBoard,\r\n\t// \totherHero,\r\n\t// \tgameState.allCards,\r\n\t// \tgameState.cardsData,\r\n\t// \tgameState.sharedState,\r\n\t// \tgameState.spectator,\r\n\t// );\r\n\t// if (!!entitySpawns?.length) {\r\n\t// \t// Spawn to the right\r\n\t// \tconst index = entityBoard.map((e) => e.entityId).indexOf(entity.entityId) + 1;\r\n\t// \taddMinionsToBoard(entityBoard, entityBoardHero, otherHero, index, entitySpawns, gameState);\r\n\t// \tgameState.spectator.registerMinionsSpawn(entity, entityBoard, entitySpawns);\r\n\t// }\r\n\treturn bumpInto.attack;\r\n};\r\n\r\n// const getWheneverEntitySpawns = (\r\n// \tentity: BoardEntity,\r\n// \tentityBoard: BoardEntity[],\r\n// \tentityBoardHero: BgsPlayerEntity,\r\n// \totherBoard: BoardEntity[],\r\n// \totherHero: BgsPlayerEntity,\r\n// \tallCards: AllCardsService,\r\n// \tcardsData: CardsData,\r\n// \tsharedState: SharedState,\r\n// \tspectator: Spectator,\r\n// ): readonly BoardEntity[] => {\r\n// \tif (entityBoard.length === 7) {\r\n// \t\treturn null;\r\n// \t}\r\n\r\n// \tif (entity.cardId === CardIds.ImpGangBoss_BRM_006) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.ImpGangBoss_ImpToken_BRM_006t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.ImpGangBoss_TB_BaconUps_030) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.ImpGangBoss_ImpToken_TB_BaconUps_030t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.ImpMama_BGS_044) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tcardsData.impMamaSpawns[Math.floor(Math.random() * cardsData.impMamaSpawns.length)],\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t).map((entity) => ({ ...entity, taunt: true }));\r\n// \t} else if (entity.cardId === CardIds.ImpMama_TB_BaconUps_116) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tcardsData.impMamaSpawns[Math.floor(Math.random() * cardsData.impMamaSpawns.length)],\r\n// \t\t\t2,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t).map((entity) => ({ ...entity, taunt: true }));\r\n// \t} else if (entity.cardId === CardIds.SecurityRover_BOT_218) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.SecurityRover_GuardBotToken_BOT_218t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.SecurityRover_TB_BaconUps_041) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.SecurityRover_GuardBotToken_TB_BaconUps_041t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t}\r\n// \treturn null;\r\n// };\r\n\r\nexport const processMinionDeath = (\r\n\tboard1: BoardEntity[],\r\n\tboard1Hero: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tboard2Hero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\t// When we're in an \"attack immediately\" phase, we wait until we're out of the phase to summon minions\r\n\tskipSummonWhenSpace = false,\r\n): void => {\r\n\t// const debug = board1.some((e) => e.health <= 0) || board2.some((e) => e.health <= 0);\r\n\t// debug && console.debug('\\nprocessing minions death');\r\n\t// debug && console.debug(stringifySimple(board1, gameState.allCards));\r\n\t// debug && console.debug(stringifySimple(board2, gameState.allCards));\r\n\tconst [deadMinionIndexesFromLeft1, deadMinionIndexesFromRights1, deadEntities1] = makeMinionsDie(\r\n\t\tboard1,\r\n\t\tboard1Hero,\r\n\t\tboard2,\r\n\t\tboard2Hero,\r\n\t\tgameState,\r\n\t);\r\n\tconst [deadMinionIndexesFromLeft2, deadMinionIndexesFromRights2, deadEntities2] = makeMinionsDie(\r\n\t\tboard2,\r\n\t\tboard2Hero,\r\n\t\tboard1,\r\n\t\tboard1Hero,\r\n\t\tgameState,\r\n\t);\r\n\t// debug && console.debug('after processing minions death');\r\n\t// debug && console.debug(stringifySimple(board1, gameState.allCards));\r\n\t// debug && console.debug(stringifySimple(board2, gameState.allCards));\r\n\t// debug && console.debug(deadMinionIndexesFromRights1);\r\n\t// debug && console.debug(deadMinionIndexesFromRights2);\r\n\t// console.debug('dead entities', stringifySimple(deadEntities1, allCards), stringifySimple(deadEntities2, allCards));\r\n\t// No death to process, we can return\r\n\tif (deadEntities1.length === 0 && deadEntities2.length === 0) {\r\n\t\treturn;\r\n\t\t// return [board1, board2];\r\n\t}\r\n\r\n\t// Remember them right away, so that subsequent deaths do not break the order\r\n\t// TODO: move this to the deathrattle-orchestration?\r\n\t// If the fish dies (from Scallywag for instance), it doesn't remember the deathrattle\r\n\t// console.debug(\r\n\t// \t'\\n\\ndeadEntities',\r\n\t// \tstringifySimple(deadEntities1, gameState.allCards),\r\n\t// \tstringifySimple(deadEntities2, gameState.allCards),\r\n\t// );\r\n\tboard1\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) =>\r\n\t\t\trememberDeathrattles(entity, deadEntities1, gameState.cardsData, gameState.allCards, gameState.sharedState),\r\n\t\t);\r\n\tboard2\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) =>\r\n\t\t\trememberDeathrattles(entity, deadEntities2, gameState.cardsData, gameState.allCards, gameState.sharedState),\r\n\t\t);\r\n\r\n\tgameState.spectator.registerDeadEntities(\r\n\t\tdeadMinionIndexesFromRights1,\r\n\t\tdeadEntities1,\r\n\t\tboard1,\r\n\t\tdeadMinionIndexesFromRights2,\r\n\t\tdeadEntities2,\r\n\t\tboard2,\r\n\t);\r\n\tgameState.sharedState.deaths.push(\r\n\t\t...deadEntities1.map((e, index) =>\r\n\t\t\taddImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\t...e,\r\n\t\t\t\t\thealth: e.maxHealth,\r\n\t\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\t\tindexFromLeftAtTimeOfDeath: deadMinionIndexesFromLeft1[index],\r\n\t\t\t\t},\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t),\r\n\t\t),\r\n\t);\r\n\tgameState.sharedState.deaths.push(\r\n\t\t...deadEntities2.map((e, index) =>\r\n\t\t\taddImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\t...e,\r\n\t\t\t\t\thealth: e.maxHealth,\r\n\t\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\t\tindexFromLeftAtTimeOfDeath: deadMinionIndexesFromLeft2[index],\r\n\t\t\t\t},\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t),\r\n\t\t),\r\n\t);\r\n\r\n\tfor (const deadEntity of deadEntities1) {\r\n\t\tconst onDeathImpl = cardMappings[deadEntity.cardId];\r\n\t\tif (hasOnDeath(onDeathImpl)) {\r\n\t\t\tonDeathImpl.onDeath(deadEntity, {\r\n\t\t\t\thero: board1Hero,\r\n\t\t\t\tboard: board1,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const deadEntity of deadEntities2) {\r\n\t\tconst onDeathImpl = cardMappings[deadEntity.cardId];\r\n\t\tif (hasOnDeath(onDeathImpl)) {\r\n\t\t\tonDeathImpl.onDeath(deadEntity, {\r\n\t\t\t\thero: board2Hero,\r\n\t\t\t\tboard: board2,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tboard1Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard1Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities1.filter(\r\n\t\t\t(e) => e.cardId === CardIds.EternalKnight_BG25_008 || e.cardId === CardIds.EternalKnight_BG25_008_G,\r\n\t\t).length;\r\n\tboard2Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard2Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities2.filter(\r\n\t\t\t(e) => e.cardId === CardIds.EternalKnight_BG25_008 || e.cardId === CardIds.EternalKnight_BG25_008_G,\r\n\t\t).length;\r\n\r\n\torchestrateMinionDeathEffects({\r\n\t\tgameState: gameState,\r\n\t\tplayerDeadEntities: board1Hero.friendly ? deadEntities1 : deadEntities2,\r\n\t\tplayerDeadEntityIndexesFromRight: board1Hero.friendly\r\n\t\t\t? deadMinionIndexesFromRights1\r\n\t\t\t: deadMinionIndexesFromRights2,\r\n\t\topponentDeadEntities: board1Hero.friendly ? deadEntities2 : deadEntities1,\r\n\t\topponentDeadEntityIndexesFromRight: board1Hero.friendly\r\n\t\t\t? deadMinionIndexesFromRights2\r\n\t\t\t: deadMinionIndexesFromRights1,\r\n\t});\r\n\r\n\t// Make sure we only return when there are no more deaths to process\r\n\t// Make sure to do this right before the end of the process\r\n\t// FIXME: this will propagate the killer between rounds, which is incorrect. For instance,\r\n\t// if a dragon kills a Ghoul, then the Ghoul's deathrattle kills a Kaboom, the killer should\r\n\t// now be the ghoul. Then if the Kaboom kills someone, the killer should again change. You could\r\n\t// also have multiple killers, which is not taken into account here.\r\n\t// The current assumption is that it's a suffienctly fringe case to not matter too much\r\n\tprocessMinionDeath(board1, board1Hero, board2, board2Hero, gameState);\r\n\r\n\t// Not sure about the timing here, but I have bothered Mitchell quite a lot already recently :)\r\n\tif (!skipSummonWhenSpace) {\r\n\t\thandleSummonsWhenSpace(board1, board1Hero, board2, board2Hero, gameState);\r\n\t}\r\n\r\n\t// Apply \"after minion death\" effects\r\n\thandleAfterMinionsDeaths(board1, deadEntities1, board1Hero, board2, deadEntities2, board2Hero, gameState);\r\n};\r\n\r\nconst handleAfterMinionsDeaths = (\r\n\tboard1: BoardEntity[],\r\n\tdeadEntities1: BoardEntity[],\r\n\theroEntity1: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tdeadEntities2: BoardEntity[],\r\n\theroEntity2: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst random = Math.random() > 0.5;\r\n\thandleAfterMinionsDeathsForBoard(\r\n\t\trandom ? board1 : board2,\r\n\t\trandom ? deadEntities1 : deadEntities2,\r\n\t\trandom ? heroEntity1 : heroEntity2,\r\n\t\trandom ? board2 : board1,\r\n\t\trandom ? deadEntities2 : deadEntities1,\r\n\t\trandom ? heroEntity2 : heroEntity1,\r\n\t\tgameState,\r\n\t);\r\n\thandleAfterMinionsDeathsForBoard(\r\n\t\t!random ? board1 : board2,\r\n\t\t!random ? deadEntities1 : deadEntities2,\r\n\t\t!random ? heroEntity1 : heroEntity2,\r\n\t\t!random ? board2 : board1,\r\n\t\t!random ? deadEntities2 : deadEntities1,\r\n\t\t!random ? heroEntity2 : heroEntity1,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nconst handleAfterMinionsDeathsForBoard = (\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyDeadEntities: BoardEntity[],\r\n\tfriendlyHeroEntity: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherDeadEntities: BoardEntity[],\r\n\totherHeroEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst candidateEntities = [];\r\n\r\n\tfor (const trinket of friendlyHeroEntity.trinkets ?? []) {\r\n\t\tconst onAfterDeathImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasOnAfterDeath(onAfterDeathImpl)) {\r\n\t\t\tonAfterDeathImpl.onAfterDeath(trinket, {\r\n\t\t\t\thero: friendlyHeroEntity,\r\n\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\totherHero: otherHeroEntity,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tdeadEntities: friendlyDeadEntities,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const entity of friendlyBoard) {\r\n\t\tconst onAfterDeathImpl = cardMappings[entity.cardId];\r\n\t\tif (hasOnAfterDeath(onAfterDeathImpl)) {\r\n\t\t\tonAfterDeathImpl.onAfterDeath(entity, {\r\n\t\t\t\thero: friendlyHeroEntity,\r\n\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\totherHero: otherHeroEntity,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tdeadEntities: friendlyDeadEntities,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tconst secretTriggered = null;\r\n\t// if (\r\n\t// \t(secretTriggered = friendlyHeroEntity.secrets?.find(\r\n\t// \t\t(secret) => !secret.triggered && secret?.cardId === CardIds.MagicBlackSoulstone,\r\n\t// \t)) != null\r\n\t// ) {\r\n\t// \tif (friendlyBoard.length === 0) {\r\n\t// \t\tsecretTriggered.triggered = true;\r\n\t// \t\tfor (let i = 0; i < 2; i++) {\r\n\t// \t\t\tconst toSummon = pickRandom(gameState.cardsData.demonSpawns);\r\n\t// \t\t\tcandidateEntities.push(\r\n\t// \t\t\t\t...spawnEntities(\r\n\t// \t\t\t\t\ttoSummon,\r\n\t// \t\t\t\t\t1,\r\n\t// \t\t\t\t\tfriendlyBoard,\r\n\t// \t\t\t\t\tfriendlyHeroEntity,\r\n\t// \t\t\t\t\totherBoard,\r\n\t// \t\t\t\t\totherHeroEntity,\r\n\t// \t\t\t\t\tgameState,\r\n\t// \t\t\t\t\tfriendlyHeroEntity.friendly,\r\n\t// \t\t\t\t\tfalse,\r\n\t// \t\t\t\t),\r\n\t// \t\t\t);\r\n\t// \t\t}\r\n\t// \t}\r\n\t// }\r\n\tperformEntitySpawns(\r\n\t\tcandidateEntities,\r\n\t\tfriendlyBoard,\r\n\t\tfriendlyHeroEntity,\r\n\t\tsecretTriggered,\r\n\t\t0,\r\n\t\totherBoard,\r\n\t\totherHeroEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nexport interface OnDeathInput {\r\n\treadonly hero: BgsPlayerEntity;\r\n\treadonly board: BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n}\r\nexport interface OnAfterDeathInput {\r\n\treadonly hero: BgsPlayerEntity;\r\n\treadonly board: BoardEntity[];\r\n\treadonly otherHero: BgsPlayerEntity;\r\n\treadonly otherBoard: BoardEntity[];\r\n\treadonly deadEntities: BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n}\r\nexport interface OnMinionKilledInput {\r\n\treadonly killer: BoardEntity;\r\n\treadonly killerIsAttacking: boolean;\r\n\treadonly minionKilled: BoardEntity;\r\n\treadonly attackingHero: BgsPlayerEntity;\r\n\treadonly attackingBoard: BoardEntity[];\r\n\treadonly defendingHero: BgsPlayerEntity;\r\n\treadonly defendingBoard: BoardEntity[];\r\n\treadonly defenderNeighbours: readonly BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n\treadonly playerIsFriendly: boolean;\r\n}\r\n"]}
1
+ {"version":3,"file":"attack.js","sourceRoot":"","sources":["../../src/simulation/attack.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnAfterDeath, hasOnDeath } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { debugState } from '../debug-state';\r\nimport { updateDivineShield } from '../keywords/divine-shield';\r\nimport { updateVenomous } from '../keywords/venomous';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { addImpliedMechanics, isFish } from '../utils';\r\nimport { applyAfterAttackEffects, applyAfterAttackTrinkets } from './after-attack';\r\nimport { onEntityDamaged } from './damage-effects';\r\nimport { rememberDeathrattles } from './deathrattle-effects';\r\nimport { orchestrateMinionDeathEffects } from './deathrattle-orchestration';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { makeMinionsDie } from './minion-death';\r\nimport { onMinionKill } from './minion-kill';\r\nimport { applyOnAttackEffects } from './on-attack';\r\nimport { applyOnBeingAttackedBuffs } from './on-being-attacked';\r\nimport { performEntitySpawns } from './spawns';\r\nimport { applyAfterStatsUpdate } from './stats';\r\nimport { handleSummonsWhenSpace } from './summon-when-space';\r\nimport { canAttack } from './utils/entity-utils';\r\n\r\n// Only use it to simulate actual attack. To simulate damage, or something similar, use bumpInto\r\nexport const simulateAttack = (\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tforceTarget: BoardEntity = null,\r\n): BoardEntity => {\r\n\t// console.debug(\r\n\t// \t'\\nsimulating attack',\r\n\t// \tstringifySimple(attackingBoard, gameState.allCards),\r\n\t// \t'\\n',\r\n\t// \tstringifySimple(defendingBoard, gameState.allCards),\r\n\t// );\r\n\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst attackingEntity = getAttackingEntity(attackingBoard, gameState.allCards);\r\n\tif (attackingEntity) {\r\n\t\tgameState.sharedState.currentAttackerEntityId = attackingEntity.entityId;\r\n\t\t// Get the left entities now, otherwise things might break if the attacker dies and/or other\r\n\t\t// entities pop\r\n\t\tconst attackingEntityIndex = attackingBoard.indexOf(attackingEntity);\r\n\t\tconst attackingEntitiesToTheLeft = attackingBoard.slice(0, attackingEntityIndex);\r\n\t\tconst isAttackingImmediately = attackingEntity.attackImmediately;\r\n\t\t// In case of Broodmother spawn, it spawns where the dead minion was, and has no influence on the\r\n\t\t// attack order\r\n\t\t// Situation this is trying to resolve by putting this right at the top of the loop:\r\n\t\t// - One scallywag attacks into another one, both die\r\n\t\t// - The first one attacks. To its left is a Harmless Bonehead with 1 HP. The scallywag attacks, and both scallys die\r\n\t\t// - The *other* sky pirate attacks first, and kills the bonehead. Two minions are spawned\r\n\t\t// - The first sy pirate attacks\r\n\t\t// - The initial loop is resolved. If this is at the end, the Harmless Bonehead is already dead, and not flagged\r\n\t\t// While having this right away, we immediately flag all minions to the left\r\n\t\tif (!isAttackingImmediately) {\r\n\t\t\t// Make sure they won't be able to attack until everyone has attacked\r\n\t\t\t// See http://replays.firestoneapp.com/?reviewId=a1b3066d-e806-44c1-ab4b-7ef9dbf9b5b9&turn=5&action=4\r\n\t\t\tattackingEntitiesToTheLeft.forEach((entity) => (entity.hasAttacked = 2));\r\n\t\t} else {\r\n\t\t\t// Change it right away so that new spawns don't trigger the \"attack immediately\" again\r\n\t\t\tattackingEntity.attackImmediately = false;\r\n\t\t}\r\n\r\n\t\tconst numberOfAttacks = attackingEntity.windfury ? 2 : 1;\r\n\t\tfor (let i = 0; i < numberOfAttacks; i++) {\r\n\t\t\t// We refresh the entity in case of windfury\r\n\t\t\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\t\t\t// We still want to flag the entity as having attacked, so that it doesn't attack again\r\n\t\t\t\t// after teammate switch in Duos\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t// Check that didn't die\r\n\t\t\tif (attackingBoard.find((entity) => entity.entityId === attackingEntity.entityId)) {\r\n\t\t\t\tconst defendingEntity: BoardEntity = forceTarget ?? getDefendingEntity(defendingBoard, attackingEntity);\r\n\t\t\t\t// Can happen with a single defender that has stealth\r\n\t\t\t\tif (defendingEntity && defendingEntity.health > 0 && !defendingEntity.definitelyDead) {\r\n\t\t\t\t\tdoFullAttack(\r\n\t\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingEntity,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Solves the edge case of Sky Pirate vs a stealth board\r\n\t\t\t\t\tattackingEntity.attackImmediately = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tgameState.sharedState.currentAttackerEntityId = null;\r\n\t\tattackingEntity.hasAttacked = 1;\r\n\t}\r\n\treturn attackingEntity;\r\n};\r\n\r\nexport const doFullAttack = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst isAttackingImmediately = attackingEntity.attackImmediately;\r\n\tgameState.spectator.registerAttack(\r\n\t\tattackingEntity,\r\n\t\tdefendingEntity,\r\n\t\tattackingBoard,\r\n\t\tdefendingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoardHero,\r\n\t);\r\n\t// http://replays.firestoneapp.com/?reviewId=50576a9f-2e6a-4600-87ba-6e737ca9853e&turn=21&action=4\r\n\t// Looks like onBeingAttacked effects apply before onAttack effects\r\n\tapplyOnBeingAttackedBuffs(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tconst { damageDoneByAttacker: damageDoneByAttacker1, damageDoneByDefender: damageDoneByDefender1 } =\r\n\t\tapplyOnAttackEffects(\r\n\t\t\tattackingEntity,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingEntity,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\tconst { damageDoneByAttacker: damageDoneByAttacker2, damageDoneByDefender: damageDoneByDefender2 } = performAttack(\r\n\t\tattackingEntity,\r\n\t\tdefendingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tconst damageDoneByAttacker = damageDoneByAttacker1 + damageDoneByAttacker2;\r\n\tconst damageDoneByDefender = damageDoneByDefender1 + damageDoneByDefender2;\r\n\r\n\t// Process this after the minions die and deathrattles are triggered/spawned\r\n\t// https://replays.firestoneapp.com/?reviewId=dd4e9dbe-abca-434a-ab94-04777cbedefe&turn=29&action=3\r\n\t// BUT: the attacking entity's afterAttack (like Macaw) needs to be processed\r\n\t// To recap:\r\n\t// - Jar o'Gems procs after the deathrattles have spawned\r\n\t// - When Monstrous Macaw procs a deathrattle, it is still on board, thus limiting the spawn room\r\n\t// So not sure what the exact timings are. It could be:\r\n\t// 1. Trigger minion's after attack\r\n\t// 2. Make minions die\r\n\t// 3. Process trinkets after attack\r\n\t// I have asked on Discord - for now I will consider a \"minion after attack\" phase and a \"trinket after attack\" phase.\r\n\t// I'm not sure about the secrets / trinkets, they will need to be adapted\r\n\tapplyAfterAttackEffects(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tdamageDoneByAttacker,\r\n\t\tdamageDoneByDefender,\r\n\t\tgameState,\r\n\t);\r\n\r\n\tprocessMinionDeath(\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t\tisAttackingImmediately,\r\n\t);\r\n\r\n\tapplyAfterAttackTrinkets(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tdamageDoneByAttacker,\r\n\t\tdamageDoneByDefender,\r\n\t\tgameState,\r\n\t);\r\n\tapplyAfterStatsUpdate(gameState);\r\n\tattackingEntity.immuneWhenAttackCharges = Math.max(0, (attackingEntity.immuneWhenAttackCharges ?? 0) - 1);\r\n\t// if (\r\n\t// \tdefendingEntity.health > 0 &&\r\n\t// \t!defendingEntity.definitelyDead\r\n\t// \t&& (defendingEntity.cardId === CardIds.YoHoOgre_BGS_060 ||\r\n\t// \t\tdefendingEntity.cardId === CardIds.YoHoOgre_TB_BaconUps_150)\r\n\t// ) {\r\n\t// \tdefendingEntity.attackImmediately = true;\r\n\t// \tif (defendingEntity.attackImmediately) {\r\n\t// \t\tsimulateAttack(defendingBoard, defendingBoardHero, attackingBoard, attackingBoardHero, gameState);\r\n\t// \t}\r\n\t// }\r\n};\r\n\r\nconst performAttack = (\r\n\tattackingEntity: BoardEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): { damageDoneByAttacker: number; damageDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\r\n\t// if (hasCorrectTribe(attackingEntity, attackingBoardHero, Race.DRAGON, gameState.anomalies, gameState.allCards)) {\r\n\t// \tconst prestors = attackingBoard\r\n\t// \t\t.filter((e) => e.entityId !== attackingEntity.entityId)\r\n\t// \t\t.filter(\r\n\t// \t\t\t(e) =>\r\n\t// \t\t\t\te.cardId === CardIds.PrestorsPyrospawn_BG21_012 ||\r\n\t// \t\t\t\te.cardId === CardIds.PrestorsPyrospawn_BG21_012_G,\r\n\t// \t\t);\r\n\t// \tprestors.forEach((prestor) => {\r\n\t// \t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\tprestor,\r\n\t// \t\t\tdefendingEntity,\r\n\t// \t\t\tdefendingBoard,\r\n\t// \t\t\tattackingBoardHero,\r\n\t// \t\t\tdefendingBoardHero,\r\n\t// \t\t);\r\n\t// \t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t// \t\t\tdefendingEntity,\r\n\t// \t\t\tdefendingBoard,\r\n\t// \t\t\tdefendingBoardHero,\r\n\t// \t\t\tprestor,\r\n\t// \t\t\tprestor.cardId === CardIds.PrestorsPyrospawn_BG21_012_G ? 6 : 3,\r\n\t// \t\t\tattackingBoard,\r\n\t// \t\t\tattackingBoardHero,\r\n\t// \t\t\tgameState,\r\n\t// \t\t);\r\n\t// \t});\r\n\t// }\r\n\t// if (\r\n\t// \tattackingEntity.cardId === CardIds.Atramedes_BG23_362 ||\r\n\t// \tattackingEntity.cardId === CardIds.Atramedes_BG23_362_G\r\n\t// ) {\r\n\t// \tconst targets = [defendingEntity, ...getNeighbours(defendingBoard, defendingEntity)];\r\n\t// \tconst multiplier = attackingEntity.cardId === CardIds.Atramedes_BG23_362_G ? 2 : 1;\r\n\r\n\t// \tfor (let i = 0; i < multiplier; i++) {\r\n\t// \t\ttargets.forEach((target) => {\r\n\t// \t\t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\t\tattackingEntity,\r\n\t// \t\t\t\ttarget,\r\n\t// \t\t\t\tdefendingBoard,\r\n\t// \t\t\t\tattackingBoardHero,\r\n\t// \t\t\t\tdefendingBoardHero,\r\n\t// \t\t\t);\r\n\t// \t\t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t// \t\t\t\ttarget,\r\n\t// \t\t\t\tdefendingBoard,\r\n\t// \t\t\t\tdefendingBoardHero,\r\n\t// \t\t\t\tattackingEntity,\r\n\t// \t\t\t\t3,\r\n\t// \t\t\t\tattackingBoard,\r\n\t// \t\t\t\tattackingBoardHero,\r\n\t// \t\t\t\tgameState,\r\n\t// \t\t\t);\r\n\t// \t\t});\r\n\t// \t}\r\n\t// } else\r\n\tif ([CardIds.BabyKrush_BG22_001, CardIds.BabyKrush_BG22_001_G].includes(attackingEntity.cardId as CardIds)) {\r\n\t\tconst spawns = spawnEntities(\r\n\t\t\tattackingEntity.cardId === CardIds.BabyKrush_BG22_001_G\r\n\t\t\t\t? CardIds.BabyKrush_BG22_001_G\r\n\t\t\t\t: CardIds.BabyKrush_DevilsaurToken,\r\n\t\t\t1,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t\tif (spawns.length > 0) {\r\n\t\t\tconst sourceIndex = attackingBoard.indexOf(attackingEntity);\r\n\t\t\tconst actualSpawns = performEntitySpawns(\r\n\t\t\t\tspawns,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tsourceIndex,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tfor (const actualSpawn of actualSpawns) {\r\n\t\t\t\tif (defendingEntity.health > 0 && !defendingEntity.definitelyDead) {\r\n\t\t\t\t\tperformAttack(\r\n\t\t\t\t\t\tactualSpawn,\r\n\t\t\t\t\t\tdefendingEntity,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// For Prestor\r\n\tconst defenderAliveBeforeAttack = defendingEntity.health > 0 && !defendingEntity.definitelyDead;\r\n\t// Because of Bristleback Knight, which changes its divine shield status during bumpEntities\r\n\tconst attackerHadDivineShield = attackingEntity.divineShield;\r\n\tconst defenderHadDivineShield = defendingEntity.divineShield;\r\n\t// For cleave\r\n\t// We do that now so that we don't include entities that spawn on entity damaged\r\n\tconst defenderNeighbours: readonly BoardEntity[] = getNeighbours(defendingBoard, defendingEntity);\r\n\tif (defenderAliveBeforeAttack) {\r\n\t\tif (!attackingEntity.immuneWhenAttackCharges) {\r\n\t\t\t// TODO: this bumpEntities approach doesn't work well, as it leads to code duplication\r\n\t\t\tdamageDoneByDefender += bumpEntities(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tdamageDoneByAttacker += bumpEntities(\r\n\t\t\tdefendingEntity,\r\n\t\t\tattackingEntity,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tif (defendingEntity.attack > 0 && attackerHadDivineShield && !attackingEntity.immuneWhenAttackCharges) {\r\n\t\t\tupdateDivineShield(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tfalse,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (attackingEntity.attack > 0 && defenderHadDivineShield) {\r\n\t\t\tupdateDivineShield(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tfalse,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t// cause wrong results to happen\r\n\t\t// This whole logic is a MEEEEESSSSSSSSSSSSSSS\r\n\t\tif (damageDoneByDefender > 0) {\r\n\t\t\tonEntityDamaged(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdamageDoneByDefender,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (damageDoneByAttacker > 0) {\r\n\t\t\tonEntityDamaged(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdamageDoneByAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (defendingEntity.health <= 0 || defendingEntity.definitelyDead) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\ttrue,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tdefenderNeighbours,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tif (attackingEntity.health <= 0 || attackingEntity.definitelyDead) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tfalse,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefenderNeighbours,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t}\r\n\t// Cleave\r\n\tif (attackingEntity.cleave) {\r\n\t\tfor (const neighbour of defenderNeighbours) {\r\n\t\t\tconst thisAttackDamage = bumpEntities(\r\n\t\t\t\tneighbour,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += thisAttackDamage;\r\n\t\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t\t// cause wrong results to happen\r\n\t\t\tif (attackingEntity.attack > 0 && neighbour.divineShield) {\r\n\t\t\t\tupdateDivineShield(neighbour, defendingBoard, defendingBoardHero, attackingBoardHero, false, gameState);\r\n\t\t\t}\r\n\t\t\tif (thisAttackDamage > 0) {\r\n\t\t\t\tonEntityDamaged(\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\tthisAttackDamage,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tif (neighbour.health <= 0 || neighbour.definitelyDead) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tdefenderNeighbours,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tattackingEntity.attackImmediately = false;\r\n\tif (attackingEntity.enchantments.some((e) => e.cardId === CardIds.VolatileVenom_VolatileEnchantment)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\treturn { damageDoneByAttacker, damageDoneByDefender };\r\n};\r\n\r\n// TODO: Could it be possible to store the index of the entity that last attacked? Probably not, because minion\r\n// spawns would mess this up? Could we update the indexes as each entity spawns / dies?\r\nconst getAttackingEntity = (attackingBoard: BoardEntity[], allCards: AllCardsService): BoardEntity => {\r\n\tlet validAttackers = attackingBoard.filter((entity) => canAttack(entity));\r\n\tif (validAttackers.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (validAttackers.some((entity) => entity.attackImmediately)) {\r\n\t\tvalidAttackers = validAttackers.filter((entity) => entity.attackImmediately);\r\n\t} else if (validAttackers.every((e) => e.hasAttacked)) {\r\n\t\tattackingBoard.forEach((e) => (e.hasAttacked = 0));\r\n\t} else {\r\n\t\tvalidAttackers = validAttackers.filter((entity) => !entity.hasAttacked);\r\n\t}\r\n\tconst attacker = validAttackers[0];\r\n\t// const debug = attacker.cardId === CardIds.Onyxia_OnyxianWhelpToken;\r\n\t// const attackerName = allCards.getCard(attacker.cardId)?.name;\r\n\treturn attacker;\r\n};\r\n\r\nexport const findNearestEnemies = (\r\n\tattackingBoard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tentityIndexFromRight: number,\r\n\tdefendingBoard: BoardEntity[],\r\n\tnumberOfTargets: number,\r\n\tallCards: AllCardsService,\r\n): BoardEntity[] => {\r\n\tconst result = [];\r\n\tif (defendingBoard.length > 0) {\r\n\t\t// console.debug('defending board', numberOfTargets, stringifySimple(defendingBoard, allCards));\r\n\t\tconst attackerIndex = attackingBoard.length - entityIndexFromRight - 1;\r\n\t\tconst targetIndex = attackerIndex - (attackingBoard.length - defendingBoard.length) / 2;\r\n\t\t// console.debug('indexes', attackerIndex, entityIndexFromRight, targetIndex, attackingBoard.length);\r\n\r\n\t\tfor (let i = 0; i < numberOfTargets; i++) {\r\n\t\t\tconst possibleTargets = defendingBoard\r\n\t\t\t\t.filter((e) => !e.definitelyDead && e.health > 0)\r\n\t\t\t\t.filter((e) => !result.includes(e));\r\n\t\t\t// console.debug('possibleTargets', stringifySimple(possibleTargets, allCards));\r\n\t\t\tif (!possibleTargets.length) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tconst targetGroups = groupByFunction((e: BoardEntity) => Math.abs(defendingBoard.indexOf(e) - targetIndex))(\r\n\t\t\t\tpossibleTargets,\r\n\t\t\t);\r\n\t\t\tconst distances = Object.keys(targetGroups)\r\n\t\t\t\t.map((k) => +k)\r\n\t\t\t\t.sort();\r\n\t\t\tconst nearestDistance = distances[0];\r\n\t\t\tif (nearestDistance != null) {\r\n\t\t\t\t// console.debug(\r\n\t\t\t\t// \t'targetGroups[nearestDistance]',\r\n\t\t\t\t// \tnearestDistance,\r\n\t\t\t\t// \tstringifySimple(targetGroups[nearestDistance], allCards),\r\n\t\t\t\t// );\r\n\t\t\t\tconst target = pickRandom(targetGroups[nearestDistance]);\r\n\t\t\t\tresult.push(target);\r\n\t\t\t}\r\n\t\t\t// console.debug('\\n');\r\n\t\t}\r\n\t}\r\n\treturn result.filter((e) => !!e);\r\n};\r\n\r\nexport const getNeighbours = (\r\n\tboard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tdeadEntityIndexFromRight?: number,\r\n): readonly BoardEntity[] => {\r\n\tconst neighbours = [];\r\n\t// When triggering DR with Hawkstrider, the entity is still on the board\r\n\tif (deadEntityIndexFromRight != null && !board.includes(entity)) {\r\n\t\tconst leftNeighbourIndex = board.length - 1 - deadEntityIndexFromRight;\r\n\t\tconst leftNeighbour = board[leftNeighbourIndex];\r\n\t\tif (leftNeighbour) {\r\n\t\t\tneighbours.push(leftNeighbour);\r\n\t\t}\r\n\r\n\t\t// If the deadEntityIndexFromRight === 0 (right-most minion), no neighbour will be found\r\n\t\tconst rightNeighbourIndex = board.length - 1 - (deadEntityIndexFromRight - 1);\r\n\t\tconst rightNeighbour = board[rightNeighbourIndex];\r\n\t\tif (rightNeighbour) {\r\n\t\t\tneighbours.push(rightNeighbour);\r\n\t\t}\r\n\t} else {\r\n\t\tconst index = board.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\tif (index - 1 >= 0) {\r\n\t\t\tneighbours.push(board[index - 1]);\r\n\t\t}\r\n\t\t// neighbours.push(entity);\r\n\t\tif (index + 1 < board.length) {\r\n\t\t\tneighbours.push(board[index + 1]);\r\n\t\t}\r\n\t}\r\n\treturn neighbours;\r\n};\r\n\r\nexport const getLeftNeighbour = (\r\n\tboard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tdeadEntityIndexFromRight?: number,\r\n): BoardEntity => {\r\n\t// When triggering DR with Hawkstrider, the entity is still on the board\r\n\tif (deadEntityIndexFromRight != null && !board.includes(entity)) {\r\n\t\tconst leftNeighbourIndex = board.length - 1 - deadEntityIndexFromRight;\r\n\t\tconst leftNeighbour = board[leftNeighbourIndex];\r\n\t\tif (leftNeighbour) {\r\n\t\t\treturn leftNeighbour;\r\n\t\t}\r\n\t} else {\r\n\t\tconst index = board.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\tif (index - 1 >= 0) {\r\n\t\t\treturn board[index - 1];\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const dealDamageToRandomEnemy = (\r\n\tboardToBeDamaged: BoardEntity[],\r\n\tboardToBeDamagedHero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity,\r\n\tdamage: number,\r\n\tboardWithAttackOrigin: BoardEntity[],\r\n\tboardWithAttackOriginHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (boardToBeDamaged.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\tconst validTargets = boardToBeDamaged.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst defendingEntity: BoardEntity = pickRandom(validTargets);\r\n\tif (defendingEntity) {\r\n\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\tdamageSource,\r\n\t\t\tdefendingEntity,\r\n\t\t\tboardToBeDamaged,\r\n\t\t\tboardToBeDamagedHero,\r\n\t\t\tboardWithAttackOriginHero,\r\n\t\t);\r\n\t\tdealDamageToMinion(\r\n\t\t\tdefendingEntity,\r\n\t\t\tboardToBeDamaged,\r\n\t\t\tboardToBeDamagedHero,\r\n\t\t\tdamageSource,\r\n\t\t\tdamage,\r\n\t\t\tboardWithAttackOrigin,\r\n\t\t\tboardWithAttackOriginHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport const dealDamageToMinion = (\r\n\ttarget: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity | BgsPlayerEntity,\r\n\tdamage: number,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// console.log('dealing damage to', damage, stringifySimpleCard(defendingEntity, allCards));\r\n\tif (!target) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst isDeadBeforeDamage = target.definitelyDead || target.health <= 0;\r\n\tconst spawns = [];\r\n\t// Why do we use a fakeAttacker? Is that for the \"attacking\" prop?\r\n\t// That prop is only used for Overkill, and even in that case it looks like it would work\r\n\t// without it\r\n\tconst fakeAttacker = {\r\n\t\t...(damageSource || {}),\r\n\t\tentityId: -1,\r\n\t\tattack: damage,\r\n\t\t// attacking: true,\r\n\t} as BoardEntity;\r\n\tconst actualDamageDone = bumpEntities(target, fakeAttacker, board, hero, otherBoard, otherHero, gameState);\r\n\r\n\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t// cause wrong results to happen\r\n\t// TODO: why isn't it done in bumpEntities?\r\n\t// Because of how \"bump\" works: we do it first for the attacker, then the defender, and we only want to update\r\n\t// the divine shield once both bumps are done\r\n\t// The problem is with the Frenzy: bumpEntities can trigger the frenzy, and which can act on the divine shield\r\n\tif (fakeAttacker.attack > 0 && target.divineShield) {\r\n\t\tupdateDivineShield(target, board, hero, otherHero, false, gameState);\r\n\t}\r\n\r\n\tif (actualDamageDone > 0) {\r\n\t\t// TODO: handle entities that have been spawned here to adjust the dead entity index from parent stack\r\n\t\tconst newSpawns = onEntityDamaged(\r\n\t\t\ttarget,\r\n\t\t\tboard,\r\n\t\t\thero,\r\n\t\t\totherBoard,\r\n\t\t\totherHero,\r\n\t\t\tdamageSource,\r\n\t\t\tactualDamageDone,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n\tif (!isDeadBeforeDamage && actualDamageDone > 0 && 'attack' in damageSource && 'health' in damageSource) {\r\n\t\ttarget.lastAffectedByEntity = damageSource as BoardEntity;\r\n\r\n\t\tif (target.health <= 0 || target.definitelyDead) {\r\n\t\t\tonMinionKill(damageSource as BoardEntity, false, target, otherBoard, otherHero, board, hero, [], gameState);\r\n\t\t}\r\n\t}\r\n\tconst defendingEntityIndex = board.map((entity) => entity.entityId).indexOf(target.entityId);\r\n\tboard[defendingEntityIndex] = target;\r\n\treturn actualDamageDone;\r\n};\r\n\r\nexport const getDefendingEntity = (\r\n\tdefendingBoard: BoardEntity[],\r\n\tattackingEntity: BoardEntity,\r\n\tignoreTaunts = false,\r\n): BoardEntity => {\r\n\tif (debugState.active) {\r\n\t\tfor (const forcedFaceOff of debugState.forcedFaceOff) {\r\n\t\t\tif (debugState.isCorrectEntity(forcedFaceOff.attacker, attackingEntity)) {\r\n\t\t\t\t// if (attackingEntity.entityId === forcedFaceOff.attacker.entityId) {\r\n\t\t\t\tconst def = defendingBoard.find((e) => debugState.isCorrectEntity(forcedFaceOff.defender, e));\r\n\t\t\t\tif (!!def) {\r\n\t\t\t\t\t// Remove the face-off\r\n\t\t\t\t\tdebugState.forcedFaceOff = debugState.forcedFaceOff.filter((f) => f != forcedFaceOff);\r\n\t\t\t\t\treturn def;\r\n\t\t\t\t}\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet possibleDefenders: readonly BoardEntity[];\r\n\tif (\r\n\t\tattackingEntity.cardId === CardIds.ZappSlywick_BGS_022 ||\r\n\t\tattackingEntity.cardId === CardIds.ZappSlywick_TB_BaconUps_091 ||\r\n\t\tattackingEntity.cardId === CardIds.MercilessMammoth_BG33_845 ||\r\n\t\tattackingEntity.cardId === CardIds.MercilessMammoth_BG33_845_G\r\n\t) {\r\n\t\tconst minAttack = Math.min(...defendingBoard.map((entity) => entity.attack));\r\n\t\tpossibleDefenders = defendingBoard.filter((entity) => entity.attack === minAttack);\r\n\t} else if (\r\n\t\tattackingEntity.cardId === CardIds.WorgenVigilante_BG26_921 ||\r\n\t\tattackingEntity.cardId === CardIds.WorgenVigilante_BG26_921_G\r\n\t) {\r\n\t\tpossibleDefenders = defendingBoard\r\n\t\t\t.filter(\r\n\t\t\t\t(entity) =>\r\n\t\t\t\t\tentity.health <= attackingEntity.attack || attackingEntity.venomous || attackingEntity.poisonous,\r\n\t\t\t)\r\n\t\t\t.filter((e) => !e.divineShield);\r\n\t\tif (!possibleDefenders.length) {\r\n\t\t\tpossibleDefenders = defendingBoard;\r\n\t\t}\r\n\t} else {\r\n\t\tpossibleDefenders = defendingBoard.filter((e) => !e.stealth);\r\n\t\tif (!ignoreTaunts) {\r\n\t\t\tconst taunts = possibleDefenders.filter((entity) => entity.taunt);\r\n\t\t\tpossibleDefenders = taunts.length > 0 ? taunts : possibleDefenders;\r\n\t\t}\r\n\t}\r\n\r\n\tconst chosenDefender = pickRandom(possibleDefenders);\r\n\t// if (chosenDefender?.taunt) {\r\n\t// \tconst elistras = defendingBoard.filter(\r\n\t// \t\t(entity) =>\r\n\t// \t\t\tentity.cardId === CardIds.ElistraTheImmortal_BGS_205 ||\r\n\t// \t\t\tentity.cardId === CardIds.ElistraTheImmortal_TB_BaconUps_306,\r\n\t// \t);\r\n\t// \tif (elistras.length > 0) {\r\n\t// \t\tchosenDefender = elistras[Math.floor(Math.random() * elistras.length)];\r\n\t// \t}\r\n\t// }\r\n\treturn chosenDefender;\r\n};\r\n\r\nexport const bumpEntities = (\r\n\tentity: BoardEntity,\r\n\tbumpInto: BoardEntity,\r\n\tentityBoard: BoardEntity[],\r\n\tentityBoardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tapplyVenomous = true,\r\n): number => {\r\n\t// No attack has no impact\r\n\tconst debug = bumpInto.cardId === 'BG26_888';\r\n\tif (bumpInto.attack === 0) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t// Matador effect has priority\r\n\tif (\r\n\t\tentity.abiityChargesLeft > 0 &&\r\n\t\t(entity.cardId === CardIds.MadMatador_BG28_404 || entity.cardId === CardIds.MadMatador_BG28_404_G)\r\n\t) {\r\n\t\tentity.abiityChargesLeft--;\r\n\t\tconst newTarget = pickRandom(otherBoard);\r\n\t\tif (newTarget) {\r\n\t\t\tgameState.spectator.registerPowerTarget(entity, newTarget, otherBoard, entityBoardHero, otherHero);\r\n\t\t\t// TODO: here the MadMatador is the source of the damage, not the initial attacker\r\n\t\t\t// Not sure exactly what the impact would be, as there is no counter\r\n\t\t\tconst newSource = {\r\n\t\t\t\t...entity,\r\n\t\t\t\tattack: bumpInto.attack,\r\n\t\t\t\t// attacking: true,\r\n\t\t\t} as BoardEntity;\r\n\t\t\tconst defenderHadDivineShield = newTarget.divineShield;\r\n\t\t\tconst damageDone = bumpEntities(\r\n\t\t\t\tnewTarget,\r\n\t\t\t\tnewSource,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherHero,\r\n\t\t\t\tentityBoard,\r\n\t\t\t\tentityBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tif (newSource.attack > 0 && defenderHadDivineShield) {\r\n\t\t\t\tupdateDivineShield(newTarget, otherBoard, otherHero, entityBoardHero, false, gameState);\r\n\t\t\t}\r\n\t\t\tif (damageDone > 0) {\r\n\t\t\t\tonEntityDamaged(\r\n\t\t\t\t\tnewTarget,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherHero,\r\n\t\t\t\t\tentityBoard,\r\n\t\t\t\t\tentityBoardHero,\r\n\t\t\t\t\tnewSource,\r\n\t\t\t\t\tdamageDone,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\treturn damageDone;\r\n\t\t}\r\n\t}\r\n\r\n\tif (entity.divineShield) {\r\n\t\tgameState.spectator.registerDamageDealt(bumpInto, entity, 0, entityBoard);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst damageDealt = (entity.damageMultiplier || 1) * bumpInto.attack;\r\n\tentity.health = entity.health - damageDealt;\r\n\t// FIXME: This will likely be incorrect in terms of timings, e.g. if the entity ends up\r\n\t// surviving following a buff like Spawn.\r\n\tgameState.spectator.registerDamageDealt(bumpInto, entity, damageDealt, entityBoard);\r\n\r\n\t// if (entity.cardId === CardIds.Bubblette_BG_TID_713 && bumpInto.attack === 1) {\r\n\t// \tentity.definitelyDead = true;\r\n\t// } else if (entity.cardId === CardIds.Bubblette_BG_TID_713_G && bumpInto.attack === 2) {\r\n\t// \tentity.definitelyDead = true;\r\n\t// }\r\n\t// Do it last, so that other effects are still processed\r\n\tif (bumpInto.poisonous) {\r\n\t\t// So that further buffs don't revive it\r\n\t\t// And we don't just set the health to avoid applying overkill effects\r\n\t\tentity.definitelyDead = true;\r\n\t}\r\n\tif (bumpInto.venomous && applyVenomous) {\r\n\t\t// So that further buffs don't revive it\r\n\t\t// And we don't just set the health to avoid applying overkill effects\r\n\t\tentity.definitelyDead = true;\r\n\t\tupdateVenomous(bumpInto, false, otherBoard, otherHero, entityBoardHero, gameState);\r\n\t}\r\n\t// Ideally we should do the Reckoning stuff here. However, at this point we only have half the damage\r\n\t// information, so it is possible that the entity deals more than 3 (which should trigger Reckoning)\r\n\t// but dies during the exchange (and Reckoning doesn't trigger then)\r\n\r\n\tentity.lastAffectedByEntity = bumpInto;\r\n\t// if (entity.frenzyChargesLeft > 0 && entity.health > 0 && !entity.definitelyDead) {\r\n\t// \tapplyFrenzy(entity, entityBoard, entityBoardHero, gameState);\r\n\t// \tentity.frenzyChargesLeft--;\r\n\t// }\r\n\r\n\t// We spawn them here, because it says \"whenever\", and so happens right away\r\n\t// FIXME: there could be a bug here, if a Cleave attacks several IGB at the same time. The current\r\n\t// implementation could spawn minions above the max board size. Fringe case though, so leaving it\r\n\t// like this for now\r\n\t// const entitySpawns = getWheneverEntitySpawns(\r\n\t// \tentity,\r\n\t// \tentityBoard,\r\n\t// \tentityBoardHero,\r\n\t// \totherBoard,\r\n\t// \totherHero,\r\n\t// \tgameState.allCards,\r\n\t// \tgameState.cardsData,\r\n\t// \tgameState.sharedState,\r\n\t// \tgameState.spectator,\r\n\t// );\r\n\t// if (!!entitySpawns?.length) {\r\n\t// \t// Spawn to the right\r\n\t// \tconst index = entityBoard.map((e) => e.entityId).indexOf(entity.entityId) + 1;\r\n\t// \taddMinionsToBoard(entityBoard, entityBoardHero, otherHero, index, entitySpawns, gameState);\r\n\t// \tgameState.spectator.registerMinionsSpawn(entity, entityBoard, entitySpawns);\r\n\t// }\r\n\treturn bumpInto.attack;\r\n};\r\n\r\n// const getWheneverEntitySpawns = (\r\n// \tentity: BoardEntity,\r\n// \tentityBoard: BoardEntity[],\r\n// \tentityBoardHero: BgsPlayerEntity,\r\n// \totherBoard: BoardEntity[],\r\n// \totherHero: BgsPlayerEntity,\r\n// \tallCards: AllCardsService,\r\n// \tcardsData: CardsData,\r\n// \tsharedState: SharedState,\r\n// \tspectator: Spectator,\r\n// ): readonly BoardEntity[] => {\r\n// \tif (entityBoard.length === 7) {\r\n// \t\treturn null;\r\n// \t}\r\n\r\n// \tif (entity.cardId === CardIds.ImpGangBoss_BRM_006) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.ImpGangBoss_ImpToken_BRM_006t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.ImpGangBoss_TB_BaconUps_030) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.ImpGangBoss_ImpToken_TB_BaconUps_030t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.ImpMama_BGS_044) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tcardsData.impMamaSpawns[Math.floor(Math.random() * cardsData.impMamaSpawns.length)],\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t).map((entity) => ({ ...entity, taunt: true }));\r\n// \t} else if (entity.cardId === CardIds.ImpMama_TB_BaconUps_116) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tcardsData.impMamaSpawns[Math.floor(Math.random() * cardsData.impMamaSpawns.length)],\r\n// \t\t\t2,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t).map((entity) => ({ ...entity, taunt: true }));\r\n// \t} else if (entity.cardId === CardIds.SecurityRover_BOT_218) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.SecurityRover_GuardBotToken_BOT_218t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.SecurityRover_TB_BaconUps_041) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.SecurityRover_GuardBotToken_TB_BaconUps_041t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t}\r\n// \treturn null;\r\n// };\r\n\r\nexport const processMinionDeath = (\r\n\tboard1: BoardEntity[],\r\n\tboard1Hero: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tboard2Hero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\t// When we're in an \"attack immediately\" phase, we wait until we're out of the phase to summon minions\r\n\tskipSummonWhenSpace = false,\r\n): void => {\r\n\t// const debug = board1.some((e) => e.health <= 0) || board2.some((e) => e.health <= 0);\r\n\t// debug && console.debug('\\nprocessing minions death');\r\n\t// debug && console.debug(stringifySimple(board1, gameState.allCards));\r\n\t// debug && console.debug(stringifySimple(board2, gameState.allCards));\r\n\tconst [deadMinionIndexesFromLeft1, deadMinionIndexesFromRights1, deadEntities1] = makeMinionsDie(\r\n\t\tboard1,\r\n\t\tboard1Hero,\r\n\t\tboard2,\r\n\t\tboard2Hero,\r\n\t\tgameState,\r\n\t);\r\n\tconst [deadMinionIndexesFromLeft2, deadMinionIndexesFromRights2, deadEntities2] = makeMinionsDie(\r\n\t\tboard2,\r\n\t\tboard2Hero,\r\n\t\tboard1,\r\n\t\tboard1Hero,\r\n\t\tgameState,\r\n\t);\r\n\t// debug && console.debug('after processing minions death');\r\n\t// debug && console.debug(stringifySimple(board1, gameState.allCards));\r\n\t// debug && console.debug(stringifySimple(board2, gameState.allCards));\r\n\t// debug && console.debug(deadMinionIndexesFromRights1);\r\n\t// debug && console.debug(deadMinionIndexesFromRights2);\r\n\t// console.debug('dead entities', stringifySimple(deadEntities1, allCards), stringifySimple(deadEntities2, allCards));\r\n\t// No death to process, we can return\r\n\tif (deadEntities1.length === 0 && deadEntities2.length === 0) {\r\n\t\treturn;\r\n\t\t// return [board1, board2];\r\n\t}\r\n\r\n\t// Remember them right away, so that subsequent deaths do not break the order\r\n\t// TODO: move this to the deathrattle-orchestration?\r\n\t// If the fish dies (from Scallywag for instance), it doesn't remember the deathrattle\r\n\t// console.debug(\r\n\t// \t'\\n\\ndeadEntities',\r\n\t// \tstringifySimple(deadEntities1, gameState.allCards),\r\n\t// \tstringifySimple(deadEntities2, gameState.allCards),\r\n\t// );\r\n\r\n\tgameState.spectator.registerDeadEntities(\r\n\t\tdeadMinionIndexesFromRights1,\r\n\t\tdeadEntities1,\r\n\t\tboard1,\r\n\t\tdeadMinionIndexesFromRights2,\r\n\t\tdeadEntities2,\r\n\t\tboard2,\r\n\t);\r\n\tgameState.sharedState.deaths.push(\r\n\t\t...deadEntities1.map((e, index) =>\r\n\t\t\taddImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\t...e,\r\n\t\t\t\t\thealth: e.maxHealth,\r\n\t\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\t\tindexFromLeftAtTimeOfDeath: deadMinionIndexesFromLeft1[index],\r\n\t\t\t\t},\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t),\r\n\t\t),\r\n\t);\r\n\tgameState.sharedState.deaths.push(\r\n\t\t...deadEntities2.map((e, index) =>\r\n\t\t\taddImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\t...e,\r\n\t\t\t\t\thealth: e.maxHealth,\r\n\t\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\t\tindexFromLeftAtTimeOfDeath: deadMinionIndexesFromLeft2[index],\r\n\t\t\t\t},\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t),\r\n\t\t),\r\n\t);\r\n\r\n\tfor (const deadEntity of deadEntities1) {\r\n\t\tconst onDeathImpl = cardMappings[deadEntity.cardId];\r\n\t\tif (hasOnDeath(onDeathImpl)) {\r\n\t\t\tonDeathImpl.onDeath(deadEntity, {\r\n\t\t\t\thero: board1Hero,\r\n\t\t\t\tboard: board1,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const deadEntity of deadEntities2) {\r\n\t\tconst onDeathImpl = cardMappings[deadEntity.cardId];\r\n\t\tif (hasOnDeath(onDeathImpl)) {\r\n\t\t\tonDeathImpl.onDeath(deadEntity, {\r\n\t\t\t\thero: board2Hero,\r\n\t\t\t\tboard: board2,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tboard1Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard1Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities1.filter(\r\n\t\t\t(e) => e.cardId === CardIds.EternalKnight_BG25_008 || e.cardId === CardIds.EternalKnight_BG25_008_G,\r\n\t\t).length;\r\n\tboard2Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard2Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities2.filter(\r\n\t\t\t(e) => e.cardId === CardIds.EternalKnight_BG25_008 || e.cardId === CardIds.EternalKnight_BG25_008_G,\r\n\t\t).length;\r\n\r\n\torchestrateMinionDeathEffects({\r\n\t\tgameState: gameState,\r\n\t\tplayerDeadEntities: board1Hero.friendly ? deadEntities1 : deadEntities2,\r\n\t\tplayerDeadEntityIndexesFromRight: board1Hero.friendly\r\n\t\t\t? deadMinionIndexesFromRights1\r\n\t\t\t: deadMinionIndexesFromRights2,\r\n\t\topponentDeadEntities: board1Hero.friendly ? deadEntities2 : deadEntities1,\r\n\t\topponentDeadEntityIndexesFromRight: board1Hero.friendly\r\n\t\t\t? deadMinionIndexesFromRights2\r\n\t\t\t: deadMinionIndexesFromRights1,\r\n\t});\r\n\r\n\t// Make sure we only return when there are no more deaths to process\r\n\t// Make sure to do this right before the end of the process\r\n\t// FIXME: this will propagate the killer between rounds, which is incorrect. For instance,\r\n\t// if a dragon kills a Ghoul, then the Ghoul's deathrattle kills a Kaboom, the killer should\r\n\t// now be the ghoul. Then if the Kaboom kills someone, the killer should again change. You could\r\n\t// also have multiple killers, which is not taken into account here.\r\n\t// The current assumption is that it's a suffienctly fringe case to not matter too much\r\n\tprocessMinionDeath(board1, board1Hero, board2, board2Hero, gameState);\r\n\r\n\t// Not sure about the timing here, but I have bothered Mitchell quite a lot already recently :)\r\n\tif (!skipSummonWhenSpace) {\r\n\t\thandleSummonsWhenSpace(board1, board1Hero, board2, board2Hero, gameState);\r\n\t}\r\n\r\n\t// Apply \"after minion death\" effects\r\n\thandleAfterMinionsDeaths(board1, deadEntities1, board1Hero, board2, deadEntities2, board2Hero, gameState);\r\n\r\n\t// Only when all deathrattles have resolved\r\n\t// 2025-12-20: https://replays.firestoneapp.com/?reviewId=7d8f9af4-b484-4256-976b-ff9df8847b50&turn=5&action=0\r\n\t// Confirmed by dev that the fish doesn't get the deathrattle in this case\r\n\tboard1\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) =>\r\n\t\t\trememberDeathrattles(entity, deadEntities1, gameState.cardsData, gameState.allCards, gameState.sharedState),\r\n\t\t);\r\n\tboard2\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) =>\r\n\t\t\trememberDeathrattles(entity, deadEntities2, gameState.cardsData, gameState.allCards, gameState.sharedState),\r\n\t\t);\r\n};\r\n\r\nconst handleAfterMinionsDeaths = (\r\n\tboard1: BoardEntity[],\r\n\tdeadEntities1: BoardEntity[],\r\n\theroEntity1: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tdeadEntities2: BoardEntity[],\r\n\theroEntity2: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst random = Math.random() > 0.5;\r\n\thandleAfterMinionsDeathsForBoard(\r\n\t\trandom ? board1 : board2,\r\n\t\trandom ? deadEntities1 : deadEntities2,\r\n\t\trandom ? heroEntity1 : heroEntity2,\r\n\t\trandom ? board2 : board1,\r\n\t\trandom ? deadEntities2 : deadEntities1,\r\n\t\trandom ? heroEntity2 : heroEntity1,\r\n\t\tgameState,\r\n\t);\r\n\thandleAfterMinionsDeathsForBoard(\r\n\t\t!random ? board1 : board2,\r\n\t\t!random ? deadEntities1 : deadEntities2,\r\n\t\t!random ? heroEntity1 : heroEntity2,\r\n\t\t!random ? board2 : board1,\r\n\t\t!random ? deadEntities2 : deadEntities1,\r\n\t\t!random ? heroEntity2 : heroEntity1,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nconst handleAfterMinionsDeathsForBoard = (\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyDeadEntities: BoardEntity[],\r\n\tfriendlyHeroEntity: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherDeadEntities: BoardEntity[],\r\n\totherHeroEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst candidateEntities = [];\r\n\r\n\tfor (const trinket of friendlyHeroEntity.trinkets ?? []) {\r\n\t\tconst onAfterDeathImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasOnAfterDeath(onAfterDeathImpl)) {\r\n\t\t\tonAfterDeathImpl.onAfterDeath(trinket, {\r\n\t\t\t\thero: friendlyHeroEntity,\r\n\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\totherHero: otherHeroEntity,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tdeadEntities: friendlyDeadEntities,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const entity of friendlyBoard) {\r\n\t\tconst onAfterDeathImpl = cardMappings[entity.cardId];\r\n\t\tif (hasOnAfterDeath(onAfterDeathImpl)) {\r\n\t\t\tonAfterDeathImpl.onAfterDeath(entity, {\r\n\t\t\t\thero: friendlyHeroEntity,\r\n\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\totherHero: otherHeroEntity,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tdeadEntities: friendlyDeadEntities,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tconst secretTriggered = null;\r\n\t// if (\r\n\t// \t(secretTriggered = friendlyHeroEntity.secrets?.find(\r\n\t// \t\t(secret) => !secret.triggered && secret?.cardId === CardIds.MagicBlackSoulstone,\r\n\t// \t)) != null\r\n\t// ) {\r\n\t// \tif (friendlyBoard.length === 0) {\r\n\t// \t\tsecretTriggered.triggered = true;\r\n\t// \t\tfor (let i = 0; i < 2; i++) {\r\n\t// \t\t\tconst toSummon = pickRandom(gameState.cardsData.demonSpawns);\r\n\t// \t\t\tcandidateEntities.push(\r\n\t// \t\t\t\t...spawnEntities(\r\n\t// \t\t\t\t\ttoSummon,\r\n\t// \t\t\t\t\t1,\r\n\t// \t\t\t\t\tfriendlyBoard,\r\n\t// \t\t\t\t\tfriendlyHeroEntity,\r\n\t// \t\t\t\t\totherBoard,\r\n\t// \t\t\t\t\totherHeroEntity,\r\n\t// \t\t\t\t\tgameState,\r\n\t// \t\t\t\t\tfriendlyHeroEntity.friendly,\r\n\t// \t\t\t\t\tfalse,\r\n\t// \t\t\t\t),\r\n\t// \t\t\t);\r\n\t// \t\t}\r\n\t// \t}\r\n\t// }\r\n\tperformEntitySpawns(\r\n\t\tcandidateEntities,\r\n\t\tfriendlyBoard,\r\n\t\tfriendlyHeroEntity,\r\n\t\tsecretTriggered,\r\n\t\t0,\r\n\t\totherBoard,\r\n\t\totherHeroEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nexport interface OnDeathInput {\r\n\treadonly hero: BgsPlayerEntity;\r\n\treadonly board: BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n}\r\nexport interface OnAfterDeathInput {\r\n\treadonly hero: BgsPlayerEntity;\r\n\treadonly board: BoardEntity[];\r\n\treadonly otherHero: BgsPlayerEntity;\r\n\treadonly otherBoard: BoardEntity[];\r\n\treadonly deadEntities: BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n}\r\nexport interface OnMinionKilledInput {\r\n\treadonly killer: BoardEntity;\r\n\treadonly killerIsAttacking: boolean;\r\n\treadonly minionKilled: BoardEntity;\r\n\treadonly attackingHero: BgsPlayerEntity;\r\n\treadonly attackingBoard: BoardEntity[];\r\n\treadonly defendingHero: BgsPlayerEntity;\r\n\treadonly defendingBoard: BoardEntity[];\r\n\treadonly defenderNeighbours: readonly BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n\treadonly playerIsFriendly: boolean;\r\n}\r\n"]}
package/dist/utils.d.ts CHANGED
@@ -23,6 +23,7 @@ export declare const hasMechanic: (card: ReferenceCard, mechanic: GameTag) => bo
23
23
  export declare const hasEntityMechanic: (entity: BoardEntity | BoardEnchantment, mechanic: GameTag, allCards: AllCardsService) => boolean;
24
24
  export declare const hasCorrectTribe: (entity: BoardEntity, playerEntity: BgsPlayerEntity, targetTribe: Race, anomalies: readonly string[], allCards: AllCardsService) => boolean;
25
25
  export declare const isVolumizer: (cardId: string | number, playerEntity: BgsPlayerEntity, anomalies: readonly string[], allCards: AllCardsService) => boolean;
26
+ export declare const alreadyHasVolumizerBuff: (entity: BoardEntity, playerEntity: BgsPlayerEntity, gameState: FullGameState) => boolean;
26
27
  export declare const getEffectiveTribesForEntity: (entity: BoardEntity, playerEntity: BgsPlayerEntity, anomalies: readonly string[], allCards: AllCardsService) => readonly Race[];
27
28
  export declare const isCorrectTribe: (cardRaces: readonly string[], targetTribe: Race) => boolean;
28
29
  export declare const getRaceEnum: (race: string) => Race;
package/dist/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isDead = exports.copyEntity = exports.getTeamInitialStates = exports.getTeammateInitialState = exports.getPlayerState = exports.isBoardEntity = exports.isGolden = exports.isPilotedWhirlOTron = exports.isFish = exports.stringifySimpleCard = exports.stringifySimple = exports.normalizeCardIdForSkin = exports.addImpliedMechanics = exports.getRaceEnum = exports.isCorrectTribe = exports.getEffectiveTribesForEntity = exports.isVolumizer = exports.hasCorrectTribe = exports.hasEntityMechanic = exports.hasMechanic = exports.getMinionsOfDifferentTypes = exports.grantStatsToMinionsOfEachType = exports.addStatsToAliveBoard = exports.addStatsToBoard = exports.getRandomMinionWithHighestHealth = exports.getRandomRevivableMinion = exports.getRandomAliveMinion = exports.grantRandomStats = exports.grantRandomHealth = exports.grantRandomAttack = exports.buildRandomUndeadCreation = exports.buildSingleBoardEntity = void 0;
3
+ exports.isDead = exports.copyEntity = exports.getTeamInitialStates = exports.getTeammateInitialState = exports.getPlayerState = exports.isBoardEntity = exports.isGolden = exports.isPilotedWhirlOTron = exports.isFish = exports.stringifySimpleCard = exports.stringifySimple = exports.normalizeCardIdForSkin = exports.addImpliedMechanics = exports.getRaceEnum = exports.isCorrectTribe = exports.getEffectiveTribesForEntity = exports.alreadyHasVolumizerBuff = exports.isVolumizer = exports.hasCorrectTribe = exports.hasEntityMechanic = exports.hasMechanic = exports.getMinionsOfDifferentTypes = exports.grantStatsToMinionsOfEachType = exports.addStatsToAliveBoard = exports.addStatsToBoard = exports.getRandomMinionWithHighestHealth = exports.getRandomRevivableMinion = exports.getRandomAliveMinion = exports.grantRandomStats = exports.grantRandomHealth = exports.grantRandomAttack = exports.buildRandomUndeadCreation = exports.buildSingleBoardEntity = void 0;
4
4
  const reference_data_1 = require("@firestone-hs/reference-data");
5
5
  const card_interface_1 = require("./cards/card.interface");
6
6
  const _card_mappings_1 = require("./cards/impl/_card-mappings");
@@ -301,6 +301,11 @@ const isVolumizer = (cardId, playerEntity, anomalies, allCards) => {
301
301
  return (_a = refCard.mechanics) === null || _a === void 0 ? void 0 : _a.includes('BACON_VOLUMIZER');
302
302
  };
303
303
  exports.isVolumizer = isVolumizer;
304
+ const alreadyHasVolumizerBuff = (entity, playerEntity, gameState) => {
305
+ var _a;
306
+ return (_a = entity.enchantments) === null || _a === void 0 ? void 0 : _a.some((e) => { var _a; return (_a = e.cardId) === null || _a === void 0 ? void 0 : _a.includes('BG34_170'); });
307
+ };
308
+ exports.alreadyHasVolumizerBuff = alreadyHasVolumizerBuff;
304
309
  const getEffectiveTribesForEntity = (entity, playerEntity, anomalies, allCards) => {
305
310
  var _a, _b, _c, _d;
306
311
  const cardId = (_a = entity === null || entity === void 0 ? void 0 : entity.originalCardId) !== null && _a !== void 0 ? _a : entity === null || entity === void 0 ? void 0 : entity.cardId;
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { ALL_BG_RACES, AllCardsService, GameTag, Race, ReferenceCard } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity, BoardTrinket } from './bgs-player-entity';\r\nimport { BoardEnchantment, BoardEntity } from './board-entity';\r\nimport { BoardSecret } from './board-secret';\r\nimport { hasDefaultCharges } from './cards/card.interface';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { cardMappings } from './cards/impl/_card-mappings';\r\nimport { CardIds } from './services/card-ids';\r\nimport { pickRandom, shuffleArray } from './services/utils';\r\nimport { FullGameState, GameState, PlayerState } from './simulation/internal-game-state';\r\nimport { SharedState } from './simulation/shared-state';\r\nimport { modifyStats } from './simulation/stats';\r\n\r\nconst CLEAVE_IDS = [\r\n\tCardIds.CaveHydra_BG_LOOT_078,\r\n\tCardIds.CaveHydra_TB_BaconUps_151,\r\n\tCardIds.FoeReaper4000_BG_GVG_113,\r\n\tCardIds.FoeReaper4000_TB_BaconUps_153,\r\n\tCardIds.BladeCollector_BG26_817,\r\n\tCardIds.BladeCollector_BG26_817_G,\r\n\tCardIds.KerriganQueenOfBlades_UltraliskToken_BG31_HERO_811t10,\r\n\tCardIds.Ultralisk_BG31_HERO_811t10_G,\r\n\tCardIds.TimewarpedUltralisk_BG34_Treasure_994,\r\n\tCardIds.TimewarpedUltralisk_BG34_Treasure_994_G,\r\n];\r\nconst ATTACK_IMMEDIATELY_IDS = [\r\n\tCardIds.Scallywag_SkyPirateToken_BGS_061t,\r\n\tCardIds.Scallywag_SkyPirateToken_TB_BaconUps_141t,\r\n\tCardIds.Onyxia_OnyxianWhelpToken,\r\n\tCardIds.TwilightWhelp_WhelpToken,\r\n\tCardIds.TwilightHatchling_TwilightWhelpToken_BG34_630t,\r\n\tCardIds.TwilightHatchling_TwilightWhelpToken_BG34_630_Gt,\r\n\t// CardIds.Carrier_InterceptorToken_BG31_HERO_802pt1t,\r\n\t// CardIds.Interceptor_BG31_HERO_802pt1t_G,\r\n\t// The token doesn't attack immediately natively, only when spawned by the spell\r\n\t// See http://replays.firestoneapp.com/?reviewId=8924452a-540a-4324-8306-46900c3f9f35&turn=22&action=38\r\n\t// CardIds.ToxicTumbleweed_TumblingAssassinToken_BG28_641t,\r\n];\r\nconst CANT_ATTACK_IDS = [\r\n\t// CardIds.ArcaneCannon_BGS_077, CardIds.ArcaneCannon_TB_BaconUps_128\r\n];\r\n\r\nexport const buildSingleBoardEntity = (\r\n\tcardId: string,\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tentityId = 1,\r\n\tspawnReborn = false,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tentityToSpawn: BoardEntity,\r\n\toriginalEntity: BoardEntity = null,\r\n\toptions: {\r\n\t\treferenceCardToUse: ReferenceCard;\r\n\t} = null,\r\n): BoardEntity => {\r\n\tconst trueRefCard = allCards.getCard(cardId);\r\n\tconst card = options?.referenceCardToUse ?? trueRefCard;\r\n\tconst attackImmediately = ATTACK_IMMEDIATELY_IDS.indexOf(cardId as CardIds) !== -1;\r\n\tconst newEntity = !!entityToSpawn\r\n\t\t? ({\r\n\t\t\t\t...entityToSpawn,\r\n\t\t\t\tentityId: sharedState.currentEntityId++,\r\n\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\tavengeCurrent: entityToSpawn.avengeDefault,\r\n\t\t\t\t// attacking: false,\r\n\t\t\t\tdamageMultiplier: 1,\r\n\t\t\t\tfrenzyChargesLeft: 1,\r\n\t\t\t\tfriendly: friendly,\r\n\t\t\t\thasAttacked: 0,\r\n\t\t } as BoardEntity)\r\n\t\t: addImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\tentityId: entityId,\r\n\t\t\t\t\tattack: card.attack,\r\n\t\t\t\t\thasAttacked: 0,\r\n\t\t\t\t\tcardId: cardId,\r\n\t\t\t\t\tdivineShield: hasMechanic(card, GameTag.DIVINE_SHIELD),\r\n\t\t\t\t\thealth: card.health,\r\n\t\t\t\t\tmaxHealth: card.health || trueRefCard.health,\r\n\t\t\t\t\tmaxAttack: card.attack || trueRefCard.attack,\r\n\t\t\t\t\ttaunt: hasMechanic(card, GameTag.TAUNT),\r\n\t\t\t\t\treborn: hasMechanic(card, GameTag.REBORN),\r\n\t\t\t\t\tpoisonous: hasMechanic(card, GameTag.POISONOUS),\r\n\t\t\t\t\tvenomous: hasMechanic(card, GameTag.VENOMOUS),\r\n\t\t\t\t\tstealth: hasMechanic(card, GameTag.STEALTH),\r\n\t\t\t\t\twindfury: hasMechanic(card, GameTag.WINDFURY),\r\n\t\t\t\t\tenchantments: [],\r\n\t\t\t\t\tpendingAttackBuffs: [],\r\n\t\t\t\t\tfriendly: friendly,\r\n\t\t\t\t\tattackImmediately: attackImmediately,\r\n\t\t\t\t\tavengeCurrent: cardsData.avengeValue(cardId),\r\n\t\t\t\t\tavengeDefault: cardsData.avengeValue(cardId),\r\n\t\t\t\t\tscriptDataNum1: originalEntity?.scriptDataNum1 ?? 0,\r\n\t\t\t\t\t// This is useful for Showy Cycilst, but I wonder if this could cause some issues otherwise\r\n\t\t\t\t\tscriptDataNum2: originalEntity?.scriptDataNum2 ?? 0,\r\n\t\t\t\t} as BoardEntity,\r\n\t\t\t\tcardsData,\r\n\t\t );\r\n\r\n\tif (spawnReborn && !entityToSpawn) {\r\n\t\tif (cardId === CardIds.BuildAnUndead_PutricidesCreationToken) {\r\n\t\t\tconst stitchedCardId = !!originalEntity.additionalCards?.length ? originalEntity.additionalCards[0] : null;\r\n\t\t\tif (stitchedCardId) {\r\n\t\t\t\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\t\t\t\tnewEntity.attack = newEntity.attack + stitchedCard.attack;\r\n\t\t\t\tnewEntity.maxHealth = newEntity.maxHealth + stitchedCard.health;\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag.TAUNT);\r\n\t\t\t\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(stitchedCard, GameTag.DIVINE_SHIELD);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag.POISONOUS);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag.VENOMOUS);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag.WINDFURY);\r\n\t\t\t\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t}\r\n\t\t} else if (\r\n\t\t\tcardId === CardIds.ZilliaxAssembled_BG29_100_G &&\r\n\t\t\t!!originalEntity.additionalCards?.filter((c) => !!c).length\r\n\t\t) {\r\n\t\t\t// In this case, the base stats are still correct (the golden stats of Zilliax), but the keywords\r\n\t\t\t// can change\r\n\t\t\tfor (const moduleCardId of originalEntity.additionalCards) {\r\n\t\t\t\tconst moduleCard = allCards.getCard(moduleCardId);\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(moduleCard, GameTag.TAUNT);\r\n\t\t\t\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(moduleCard, GameTag.DIVINE_SHIELD);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(moduleCard, GameTag.POISONOUS);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(moduleCard, GameTag.VENOMOUS);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(moduleCard, GameTag.WINDFURY);\r\n\t\t\t\tnewEntity.stealth = newEntity.stealth || hasMechanic(moduleCard, GameTag.STEALTH);\r\n\t\t\t}\r\n\t\t}\r\n\t\tnewEntity.health = 1;\r\n\t\tnewEntity.reborn = false;\r\n\t\tnewEntity.scriptDataNum1 = getScriptDataNum1(cardId, originalEntity);\r\n\r\n\t\t// For ghoul-acabra + reborn\r\n\t\t// newEntity.attack += originalEntity.permanentAttack ?? 0;\r\n\t\t// newEntity.health += originalEntity.permanentHealth ?? 0;\r\n\t}\r\n\r\n\tnewEntity.hadDivineShield = newEntity.divineShield || newEntity.hadDivineShield;\r\n\treturn newEntity;\r\n};\r\n\r\nconst getScriptDataNum1 = (cardId: string, originalEntity: BoardEntity): number => {\r\n\tswitch (cardId) {\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804:\r\n\t\t\treturn 8;\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804_G:\r\n\t\t\treturn 16;\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t}\r\n};\r\n\r\nexport const buildRandomUndeadCreation = (\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n): BoardEntity => {\r\n\tconst baseCard = pickRandom(cardsData.putricidePool1);\r\n\tconst newEntity = buildSingleBoardEntity(\r\n\t\tbaseCard,\r\n\t\tcontrollerHero,\r\n\t\tfriendlyBoard,\r\n\t\tallCards,\r\n\t\tfriendly,\r\n\t\tsharedState.currentEntityId++,\r\n\t\tfalse,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst stitchedCardId =\r\n\t\tbaseCard === CardIds.EternalSummoner_BG25_009\r\n\t\t\t? pickRandom(cardsData.putridicePool2ForEternalSummoner)\r\n\t\t\t: pickRandom(cardsData.putricidePool2);\r\n\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\tnewEntity.attack += stitchedCard.attack;\r\n\tnewEntity.health += stitchedCard.health;\r\n\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag.TAUNT);\r\n\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(stitchedCard, GameTag.DIVINE_SHIELD);\r\n\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag.POISONOUS);\r\n\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag.VENOMOUS);\r\n\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag.WINDFURY);\r\n\tnewEntity.reborn = newEntity.reborn || hasMechanic(stitchedCard, GameTag.REBORN);\r\n\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\treturn newEntity;\r\n};\r\n\r\nexport const grantRandomAttack = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tadditionalAttack: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = candidateBoard[Math.floor(Math.random() * candidateBoard.length)];\r\n\t\tmodifyStats(target, source, additionalAttack, 0, candidateBoard, hero, gameState);\r\n\t}\r\n};\r\n\r\nexport const grantRandomHealth = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = pickRandom(candidateBoard);\r\n\t\tmodifyStats(target, source, 0, health, board, hero, gameState);\r\n\t}\r\n};\r\n\r\nexport const grantRandomStats = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\trace: Race,\r\n\texcludeSource: boolean,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tif (board.length > 0) {\r\n\t\tconst target: BoardEntity = getRandomAliveMinion(\r\n\t\t\tboard.filter((e) => !!e.cardId).filter((e) => (excludeSource ? e.entityId !== source.entityId : true)),\r\n\t\t\thero,\r\n\t\t\trace,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tif (target) {\r\n\t\t\tmodifyStats(target, source, attack, health, board, hero, gameState);\r\n\t\t\treturn target;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const getRandomAliveMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, gameState.anomalies, gameState.allCards))\r\n\t\t.filter((e) => e?.health > 0 && !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomRevivableMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, gameState.anomalies, gameState.allCards))\r\n\t\t.filter((e) => !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomMinionWithHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tif (!board.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst highestHealth = Math.max(...board.map((e) => e.health));\r\n\tconst validMinions = board.filter((e) => e.health === highestHealth);\r\n\treturn validMinions[Math.floor(Math.random() * validMinions.length)];\r\n};\r\n\r\n/**\r\n * Only use if the full board gets the stats, or if you're able to filter use the tribe param.\r\n * Otherwise some minions will be missing when applying onStatsUpdate effects\r\n */\r\nexport const addStatsToBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\tcountsAsStatsGain = true,\r\n): void => {\r\n\tfor (const entity of board) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.anomalies, gameState.allCards)) {\r\n\t\t\tif (countsAsStatsGain) {\r\n\t\t\t\tmodifyStats(entity, sourceEntity, attack, health, board, hero, gameState);\r\n\t\t\t} else {\r\n\t\t\t\tentity.attack += attack;\r\n\t\t\t\tentity.health += health;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const addStatsToAliveBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\t// permanentUpgrade = false,\r\n): void => {\r\n\tfor (const entity of board.filter((e) => e.health > 0 && !e.definitelyDead)) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.anomalies, gameState.allCards)) {\r\n\t\t\tmodifyStats(entity, sourceEntity, attack, health, board, hero, gameState);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const grantStatsToMinionsOfEachType = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\tnumberOfDifferentTypes = 99,\r\n\tcanRevive = true,\r\n): void => {\r\n\tconst minionsToBuff = getMinionsOfDifferentTypes(board, hero, gameState, canRevive, numberOfDifferentTypes);\r\n\tfor (const entity of minionsToBuff) {\r\n\t\tmodifyStats(entity, source, attack, health, board, hero, gameState);\r\n\t}\r\n};\r\n\r\nexport const getMinionsOfDifferentTypes = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcanRevive = true,\r\n\tnumberOfDifferentTypes = 99,\r\n): BoardEntity[] => {\r\n\tconst result: BoardEntity[] = [];\r\n\tif (board.length > 0) {\r\n\t\tlet boardCopy = board.filter(\r\n\t\t\t(e) => !getEffectiveTribesForEntity(e, hero, gameState.anomalies, gameState.allCards)?.includes(Race.ALL),\r\n\t\t);\r\n\t\tconst allRaces = shuffleArray(ALL_BG_RACES);\r\n\t\tlet typesBuffed = 0;\r\n\t\tconst racesProcessed = [];\r\n\t\tfor (let i = 1; i <= 2; i++) {\r\n\t\t\tfor (const tribe of allRaces) {\r\n\t\t\t\tconst minionsWithRaces = boardCopy\r\n\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\t\tgetEffectiveTribesForEntity(e, hero, gameState.anomalies, gameState.allCards).length === i,\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.filter((e) => hasCorrectTribe(e, hero, tribe, gameState.anomalies, gameState.allCards))\r\n\t\t\t\t\t.filter((e) =>\r\n\t\t\t\t\t\tgetEffectiveTribesForEntity(e, hero, gameState.anomalies, gameState.allCards).some(\r\n\t\t\t\t\t\t\t(r) => !racesProcessed.includes(r),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t);\r\n\t\t\t\tif (typesBuffed >= numberOfDifferentTypes) {\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t\tconst validMinion: BoardEntity = canRevive\r\n\t\t\t\t\t? getRandomRevivableMinion(minionsWithRaces, hero, tribe, gameState)\r\n\t\t\t\t\t: getRandomAliveMinion(minionsWithRaces, hero, tribe, gameState);\r\n\t\t\t\tif (validMinion) {\r\n\t\t\t\t\tresult.push(validMinion);\r\n\t\t\t\t\tboardCopy = boardCopy.filter((e) => e !== validMinion);\r\n\t\t\t\t\ttypesBuffed++;\r\n\t\t\t\t\tracesProcessed.push(tribe);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tresult.push(\r\n\t\t\t...board.filter((e) => {\r\n\t\t\t\tconst effectiveTribes = getEffectiveTribesForEntity(e, hero, gameState.anomalies, gameState.allCards);\r\n\t\t\t\treturn effectiveTribes?.includes(Race.ALL);\r\n\t\t\t}),\r\n\t\t);\r\n\t}\r\n\treturn result;\r\n};\r\n\r\nexport const hasMechanic = (card: ReferenceCard, mechanic: GameTag): boolean => {\r\n\treturn card.mechanics?.includes(GameTag[mechanic]);\r\n};\r\n\r\nexport const hasEntityMechanic = (\r\n\tentity: BoardEntity | BoardEnchantment,\r\n\tmechanic: GameTag,\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tconst card = allCards.getCard(entity.cardId);\r\n\tif (card.mechanics?.includes(GameTag[mechanic])) {\r\n\t\treturn true;\r\n\t}\r\n\t// Look at the base card\r\n\tif (card.entityDbfIf) {\r\n\t\treturn hasMechanic(allCards.getCard(card.entityDbfIf), mechanic);\r\n\t}\r\n\tfor (const enchant of (entity as BoardEntity).enchantments ?? []) {\r\n\t\tif (hasEntityMechanic(enchant, mechanic, allCards)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n};\r\n\r\nexport const hasCorrectTribe = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\ttargetTribe: Race,\r\n\tanomalies: readonly string[],\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tif (entity == null) {\r\n\t\treturn false;\r\n\t}\r\n\tconst effectiveTribesForEntity = getEffectiveTribesForEntity(entity, playerEntity, anomalies, allCards);\r\n\treturn (\r\n\t\teffectiveTribesForEntity.length > 0 &&\r\n\t\t(effectiveTribesForEntity.includes(targetTribe) || effectiveTribesForEntity.includes(Race.ALL))\r\n\t);\r\n};\r\n\r\nexport const isVolumizer = (\r\n\tcardId: string | number,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tanomalies: readonly string[],\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tif (cardId == null) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst refCard = allCards.getCard(cardId);\r\n\treturn refCard.mechanics?.includes('BACON_VOLUMIZER');\r\n};\r\n\r\nexport const getEffectiveTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tanomalies: readonly string[],\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\t// When we trigger a remembered deathrattle, the tribe is the tribe of the actual minion, not the remembered effect\r\n\tconst cardId = entity?.originalCardId ?? entity?.cardId;\r\n\tif (!cardId) {\r\n\t\treturn [];\r\n\t}\r\n\tconst refCard = allCards.getCard(cardId);\r\n\tconst nativeTribes = refCard.races?.map((r) => Race[r]) ?? [];\r\n\tif (!nativeTribes.length && anomalies?.includes(CardIds.IncubationMutation_BG31_Anomaly_112)) {\r\n\t\treturn [Race.ALL];\r\n\t}\r\n\tif (\r\n\t\trefCard.mechanics?.includes(GameTag[GameTag.BACON_BUDDY]) &&\r\n\t\tanomalies?.includes(CardIds.ColorfulCamaraderie_BG33_Anomaly_005)\r\n\t) {\r\n\t\treturn [Race.ALL];\r\n\t}\r\n\treturn [...nativeTribes, ...getSpecialTribesForEntity(entity, playerEntity, allCards)];\r\n};\r\n\r\nconst getSpecialTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013:\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013_G:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.SmugglerPortrait_BG30_MagicItem_825)\r\n\t\t\t\t? [Race.DRAGON]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.LightfangEnforcer_BGS_009:\r\n\t\tcase CardIds.LightfangEnforcer_TB_BaconUps_082:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.EnforcerPortrait_BG30_MagicItem_971)\r\n\t\t\t\t? [Race.ALL]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.BrannBronzebeard_BG_LOE_077:\r\n\t\tcase CardIds.BrannBronzebeard_TB_BaconUps_045:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.BronzebeardPortrait_BG30_MagicItem_418)\r\n\t\t\t\t? [Race.DRAGON, Race.MURLOC]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.DrakkariEnchanter_BG26_ICC_901:\r\n\t\tcase CardIds.DrakkariEnchanter_BG26_ICC_901_G:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.DrakkariPortrait_BG32_MagicItem_179)\r\n\t\t\t\t? [Race.MECH, Race.ELEMENTAL]\r\n\t\t\t\t: [];\r\n\t}\r\n\treturn [];\r\n};\r\n\r\n/** @deprecated use hasCorreectTribe instead */\r\nexport const isCorrectTribe = (cardRaces: readonly string[], targetTribe: Race): boolean => {\r\n\tif (!cardRaces?.length) {\r\n\t\treturn false;\r\n\t}\r\n\treturn cardRaces\r\n\t\t.map((cardRace) => getRaceEnum(cardRace))\r\n\t\t.some((raceEnum) => raceEnum === Race.ALL || raceEnum === targetTribe);\r\n};\r\n\r\nexport const getRaceEnum = (race: string): Race => {\r\n\treturn Race[race];\r\n};\r\n\r\nexport const addImpliedMechanics = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tconst cleave = CLEAVE_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tconst cantAttack = CANT_ATTACK_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tentity.cleave = cleave;\r\n\tentity.cantAttack = cantAttack;\r\n\tentity.divineShield = entity.divineShield || entity.hadDivineShield;\r\n\tentity.immuneWhenAttackCharges = [\r\n\t\tCardIds.Warpwing_BG24_004,\r\n\t\tCardIds.Warpwing_BG24_004_G,\r\n\t\tCardIds.KerriganQueenOfBlades_ViperToken_BG31_HERO_811t8,\r\n\t\tCardIds.Viper_BG31_HERO_811t8_G,\r\n\t\tCardIds.TimewarpedViper_BG34_Treasure_990,\r\n\t\tCardIds.TimewarpedViper_BG34_Treasure_990_G,\r\n\t].includes(entity.cardId as CardIds)\r\n\t\t? 99999\r\n\t\t: null;\r\n\tentity.frenzyChargesLeft =\r\n\t\tentity.cardId === CardIds.BristlebackKnight_BG20_204_G\r\n\t\t\t? 2\r\n\t\t\t: entity.cardId === CardIds.BristlebackKnight_BG20_204\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n\t// It's not an issue adding a charge for entities without a special ability\r\n\tconst defaultChargesImpl = cardMappings[entity.cardId];\r\n\tif (hasDefaultCharges(defaultChargesImpl)) {\r\n\t\tentity.abiityChargesLeft = defaultChargesImpl.defaultCharges(entity);\r\n\t} else {\r\n\t\tentity.abiityChargesLeft = [\r\n\t\t\t// CardIds.MarineMatriarch_BG29_610,\r\n\t\t\t// CardIds.MarineMatriarch_BG29_610_G,\r\n\t\t\t// CardIds.SoftHeartedSiren_BG26_590,\r\n\t\t\t// CardIds.SoftHeartedSiren_BG26_590_G,\r\n\t\t\t// CardIds.LongJohnCopper_BG29_831,\r\n\t\t\t// CardIds.LongJohnCopper_BG29_831_G,\r\n\t\t\t// CardIds.BristlingBuffoon_BG29_160,\r\n\t\t\t// CardIds.BristlingBuffoon_BG29_160_G,\r\n\t\t].includes(entity.cardId as CardIds)\r\n\t\t\t? 3\r\n\t\t\t: [\r\n\t\t\t\t\tCardIds.Mannoroth_BG27_507_G,\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\t\tCardIds.MadMatador_BG28_404_G,\r\n\t\t\t\t\tCardIds.WingedChimera_BG29_844,\r\n\t\t\t\t\tCardIds.WingedChimera_BG29_844_G,\r\n\t\t\t\t\tCardIds.MossOfTheSchloss_BG30_111_G,\r\n\t\t\t ].includes(entity.cardId as CardIds)\r\n\t\t\t? 2\r\n\t\t\t: 1;\r\n\t}\r\n\r\n\treturn setImplicitDataForEntity(entity, cardsData);\r\n};\r\n\r\nconst setImplicitDataForEntity = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tentity.cardId = normalizeCardIdForSkin(entity.cardId);\r\n\tentity.maxHealth = Math.max(0, entity.health, entity.maxHealth ?? 0);\r\n\tentity.maxAttack = Math.max(0, entity.attack, entity.maxAttack ?? 0);\r\n\tconst avengeValue = cardsData.avengeValue(entity.cardId);\r\n\tif (avengeValue > 0) {\r\n\t\tentity.avengeCurrent = avengeValue;\r\n\t\tentity.avengeDefault = avengeValue;\r\n\t}\r\n\treturn entity;\r\n};\r\n\r\nexport const normalizeCardIdForSkin = (cardId: string): string => {\r\n\tif (!cardId?.length) {\r\n\t\treturn cardId;\r\n\t}\r\n\tconst skinMatch = cardId.match(/(.*)_SKIN_.*/);\r\n\tif (skinMatch) {\r\n\t\treturn skinMatch[1];\r\n\t}\r\n\treturn cardId;\r\n};\r\n\r\nexport const stringifySimple = (board: readonly BoardEntity[], allCards: AllCardsService = null): string => {\r\n\treturn '[' + board.map((entity) => stringifySimpleCard(entity, allCards)).join(', ') + ']';\r\n};\r\n\r\nexport const stringifySimpleCard = (entity: BoardEntity, allCards: AllCardsService = null): string => {\r\n\treturn entity\r\n\t\t? `${allCards?.getCard(entity.cardId)?.name ?? entity.cardId}/entityId=${entity.entityId}/atk=${\r\n\t\t\t\tentity.attack\r\n\t\t }/hp=${entity.health}/ench=${entity.enchantments.map((e) => e.cardId).join(',')}`\r\n\t\t: null;\r\n};\r\n\r\nexport const isFish = (entity: BoardEntity): boolean => {\r\n\treturn (\r\n\t\tentity.cardId?.startsWith(CardIds.AvatarOfNzoth_FishOfNzothToken) ||\r\n\t\tentity.cardId?.startsWith(CardIds.FishOfNzoth) ||\r\n\t\tentity.additionalCards?.includes(CardIds.DevourerOfSouls_BG_RLK_538)\r\n\t);\r\n};\r\n\r\nexport const isPilotedWhirlOTron = (entity: BoardEntity): boolean => {\r\n\treturn entity.cardId?.startsWith(CardIds.PilotedWhirlOTron_BG21_HERO_030_Buddy);\r\n};\r\n\r\nexport const isGolden = (cardId: string, allCards: AllCardsService): boolean => {\r\n\treturn allCards.getCard(cardId).premium;\r\n};\r\n\r\nexport const isBoardEntity = (entity: BoardEntity | BoardTrinket): entity is BoardEntity => {\r\n\treturn entity != null && 'maxHealth' in entity;\r\n};\r\n\r\nexport const getPlayerState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.player.player === hero\r\n\t\t? gameState.player\r\n\t\t: gameState.player.teammate?.player === hero\r\n\t\t? gameState.player.teammate\r\n\t\t: gameState.opponent.player === hero\r\n\t\t? gameState.opponent\r\n\t\t: gameState.opponent.teammate?.player === hero\r\n\t\t? gameState.opponent.teammate\r\n\t\t: null;\r\n};\r\n\r\nexport const getTeammateInitialState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.playerInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial.teammate\r\n\t\t: gameState.playerInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial\r\n\t\t: gameState.opponentInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial.teammate\r\n\t\t: gameState.opponentInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial\r\n\t\t: null;\r\n};\r\n\r\nexport const getTeamInitialStates = (gameState: GameState, hero: BgsPlayerEntity): PlayerState[] => {\r\n\treturn gameState.playerInitial.player?.friendly === hero?.friendly\r\n\t\t? [gameState.playerInitial, gameState.playerInitial.teammate].filter((p) => p)\r\n\t\t: [gameState.opponentInitial, gameState.opponentInitial.teammate].filter((p) => p);\r\n};\r\n\r\nexport const copyEntity = (entity: BoardEntity): BoardEntity => {\r\n\tconst copy: BoardEntity = {\r\n\t\t...entity,\r\n\t\tenchantments: entity.enchantments.map((ench) => ({ ...ench })),\r\n\t\tpendingAttackBuffs: [],\r\n\t\trememberedDeathrattles: (entity.rememberedDeathrattles ?? []).map((r) => ({ ...r })),\r\n\t\tadditionalCards: entity.additionalCards?.map((c) => c),\r\n\t\ttags: entity.tags ? { ...entity.tags } : null,\r\n\t\tlastAffectedByEntity: null,\r\n\t};\r\n\treturn copy;\r\n};\r\n\r\nexport const isDead = (entity: BoardEntity): boolean => {\r\n\treturn entity.health <= 0 || entity.definitelyDead;\r\n};\r\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { ALL_BG_RACES, AllCardsService, GameTag, Race, ReferenceCard } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity, BoardTrinket } from './bgs-player-entity';\r\nimport { BoardEnchantment, BoardEntity } from './board-entity';\r\nimport { BoardSecret } from './board-secret';\r\nimport { hasDefaultCharges } from './cards/card.interface';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { cardMappings } from './cards/impl/_card-mappings';\r\nimport { CardIds } from './services/card-ids';\r\nimport { pickRandom, shuffleArray } from './services/utils';\r\nimport { FullGameState, GameState, PlayerState } from './simulation/internal-game-state';\r\nimport { SharedState } from './simulation/shared-state';\r\nimport { modifyStats } from './simulation/stats';\r\n\r\nconst CLEAVE_IDS = [\r\n\tCardIds.CaveHydra_BG_LOOT_078,\r\n\tCardIds.CaveHydra_TB_BaconUps_151,\r\n\tCardIds.FoeReaper4000_BG_GVG_113,\r\n\tCardIds.FoeReaper4000_TB_BaconUps_153,\r\n\tCardIds.BladeCollector_BG26_817,\r\n\tCardIds.BladeCollector_BG26_817_G,\r\n\tCardIds.KerriganQueenOfBlades_UltraliskToken_BG31_HERO_811t10,\r\n\tCardIds.Ultralisk_BG31_HERO_811t10_G,\r\n\tCardIds.TimewarpedUltralisk_BG34_Treasure_994,\r\n\tCardIds.TimewarpedUltralisk_BG34_Treasure_994_G,\r\n];\r\nconst ATTACK_IMMEDIATELY_IDS = [\r\n\tCardIds.Scallywag_SkyPirateToken_BGS_061t,\r\n\tCardIds.Scallywag_SkyPirateToken_TB_BaconUps_141t,\r\n\tCardIds.Onyxia_OnyxianWhelpToken,\r\n\tCardIds.TwilightWhelp_WhelpToken,\r\n\tCardIds.TwilightHatchling_TwilightWhelpToken_BG34_630t,\r\n\tCardIds.TwilightHatchling_TwilightWhelpToken_BG34_630_Gt,\r\n\t// CardIds.Carrier_InterceptorToken_BG31_HERO_802pt1t,\r\n\t// CardIds.Interceptor_BG31_HERO_802pt1t_G,\r\n\t// The token doesn't attack immediately natively, only when spawned by the spell\r\n\t// See http://replays.firestoneapp.com/?reviewId=8924452a-540a-4324-8306-46900c3f9f35&turn=22&action=38\r\n\t// CardIds.ToxicTumbleweed_TumblingAssassinToken_BG28_641t,\r\n];\r\nconst CANT_ATTACK_IDS = [\r\n\t// CardIds.ArcaneCannon_BGS_077, CardIds.ArcaneCannon_TB_BaconUps_128\r\n];\r\n\r\nexport const buildSingleBoardEntity = (\r\n\tcardId: string,\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tentityId = 1,\r\n\tspawnReborn = false,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tentityToSpawn: BoardEntity,\r\n\toriginalEntity: BoardEntity = null,\r\n\toptions: {\r\n\t\treferenceCardToUse: ReferenceCard;\r\n\t} = null,\r\n): BoardEntity => {\r\n\tconst trueRefCard = allCards.getCard(cardId);\r\n\tconst card = options?.referenceCardToUse ?? trueRefCard;\r\n\tconst attackImmediately = ATTACK_IMMEDIATELY_IDS.indexOf(cardId as CardIds) !== -1;\r\n\tconst newEntity = !!entityToSpawn\r\n\t\t? ({\r\n\t\t\t\t...entityToSpawn,\r\n\t\t\t\tentityId: sharedState.currentEntityId++,\r\n\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\tavengeCurrent: entityToSpawn.avengeDefault,\r\n\t\t\t\t// attacking: false,\r\n\t\t\t\tdamageMultiplier: 1,\r\n\t\t\t\tfrenzyChargesLeft: 1,\r\n\t\t\t\tfriendly: friendly,\r\n\t\t\t\thasAttacked: 0,\r\n\t\t } as BoardEntity)\r\n\t\t: addImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\tentityId: entityId,\r\n\t\t\t\t\tattack: card.attack,\r\n\t\t\t\t\thasAttacked: 0,\r\n\t\t\t\t\tcardId: cardId,\r\n\t\t\t\t\tdivineShield: hasMechanic(card, GameTag.DIVINE_SHIELD),\r\n\t\t\t\t\thealth: card.health,\r\n\t\t\t\t\tmaxHealth: card.health || trueRefCard.health,\r\n\t\t\t\t\tmaxAttack: card.attack || trueRefCard.attack,\r\n\t\t\t\t\ttaunt: hasMechanic(card, GameTag.TAUNT),\r\n\t\t\t\t\treborn: hasMechanic(card, GameTag.REBORN),\r\n\t\t\t\t\tpoisonous: hasMechanic(card, GameTag.POISONOUS),\r\n\t\t\t\t\tvenomous: hasMechanic(card, GameTag.VENOMOUS),\r\n\t\t\t\t\tstealth: hasMechanic(card, GameTag.STEALTH),\r\n\t\t\t\t\twindfury: hasMechanic(card, GameTag.WINDFURY),\r\n\t\t\t\t\tenchantments: [],\r\n\t\t\t\t\tpendingAttackBuffs: [],\r\n\t\t\t\t\tfriendly: friendly,\r\n\t\t\t\t\tattackImmediately: attackImmediately,\r\n\t\t\t\t\tavengeCurrent: cardsData.avengeValue(cardId),\r\n\t\t\t\t\tavengeDefault: cardsData.avengeValue(cardId),\r\n\t\t\t\t\tscriptDataNum1: originalEntity?.scriptDataNum1 ?? 0,\r\n\t\t\t\t\t// This is useful for Showy Cycilst, but I wonder if this could cause some issues otherwise\r\n\t\t\t\t\tscriptDataNum2: originalEntity?.scriptDataNum2 ?? 0,\r\n\t\t\t\t} as BoardEntity,\r\n\t\t\t\tcardsData,\r\n\t\t );\r\n\r\n\tif (spawnReborn && !entityToSpawn) {\r\n\t\tif (cardId === CardIds.BuildAnUndead_PutricidesCreationToken) {\r\n\t\t\tconst stitchedCardId = !!originalEntity.additionalCards?.length ? originalEntity.additionalCards[0] : null;\r\n\t\t\tif (stitchedCardId) {\r\n\t\t\t\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\t\t\t\tnewEntity.attack = newEntity.attack + stitchedCard.attack;\r\n\t\t\t\tnewEntity.maxHealth = newEntity.maxHealth + stitchedCard.health;\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag.TAUNT);\r\n\t\t\t\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(stitchedCard, GameTag.DIVINE_SHIELD);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag.POISONOUS);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag.VENOMOUS);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag.WINDFURY);\r\n\t\t\t\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t}\r\n\t\t} else if (\r\n\t\t\tcardId === CardIds.ZilliaxAssembled_BG29_100_G &&\r\n\t\t\t!!originalEntity.additionalCards?.filter((c) => !!c).length\r\n\t\t) {\r\n\t\t\t// In this case, the base stats are still correct (the golden stats of Zilliax), but the keywords\r\n\t\t\t// can change\r\n\t\t\tfor (const moduleCardId of originalEntity.additionalCards) {\r\n\t\t\t\tconst moduleCard = allCards.getCard(moduleCardId);\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(moduleCard, GameTag.TAUNT);\r\n\t\t\t\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(moduleCard, GameTag.DIVINE_SHIELD);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(moduleCard, GameTag.POISONOUS);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(moduleCard, GameTag.VENOMOUS);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(moduleCard, GameTag.WINDFURY);\r\n\t\t\t\tnewEntity.stealth = newEntity.stealth || hasMechanic(moduleCard, GameTag.STEALTH);\r\n\t\t\t}\r\n\t\t}\r\n\t\tnewEntity.health = 1;\r\n\t\tnewEntity.reborn = false;\r\n\t\tnewEntity.scriptDataNum1 = getScriptDataNum1(cardId, originalEntity);\r\n\r\n\t\t// For ghoul-acabra + reborn\r\n\t\t// newEntity.attack += originalEntity.permanentAttack ?? 0;\r\n\t\t// newEntity.health += originalEntity.permanentHealth ?? 0;\r\n\t}\r\n\r\n\tnewEntity.hadDivineShield = newEntity.divineShield || newEntity.hadDivineShield;\r\n\treturn newEntity;\r\n};\r\n\r\nconst getScriptDataNum1 = (cardId: string, originalEntity: BoardEntity): number => {\r\n\tswitch (cardId) {\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804:\r\n\t\t\treturn 8;\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804_G:\r\n\t\t\treturn 16;\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t}\r\n};\r\n\r\nexport const buildRandomUndeadCreation = (\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n): BoardEntity => {\r\n\tconst baseCard = pickRandom(cardsData.putricidePool1);\r\n\tconst newEntity = buildSingleBoardEntity(\r\n\t\tbaseCard,\r\n\t\tcontrollerHero,\r\n\t\tfriendlyBoard,\r\n\t\tallCards,\r\n\t\tfriendly,\r\n\t\tsharedState.currentEntityId++,\r\n\t\tfalse,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst stitchedCardId =\r\n\t\tbaseCard === CardIds.EternalSummoner_BG25_009\r\n\t\t\t? pickRandom(cardsData.putridicePool2ForEternalSummoner)\r\n\t\t\t: pickRandom(cardsData.putricidePool2);\r\n\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\tnewEntity.attack += stitchedCard.attack;\r\n\tnewEntity.health += stitchedCard.health;\r\n\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag.TAUNT);\r\n\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(stitchedCard, GameTag.DIVINE_SHIELD);\r\n\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag.POISONOUS);\r\n\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag.VENOMOUS);\r\n\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag.WINDFURY);\r\n\tnewEntity.reborn = newEntity.reborn || hasMechanic(stitchedCard, GameTag.REBORN);\r\n\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\treturn newEntity;\r\n};\r\n\r\nexport const grantRandomAttack = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tadditionalAttack: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = candidateBoard[Math.floor(Math.random() * candidateBoard.length)];\r\n\t\tmodifyStats(target, source, additionalAttack, 0, candidateBoard, hero, gameState);\r\n\t}\r\n};\r\n\r\nexport const grantRandomHealth = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = pickRandom(candidateBoard);\r\n\t\tmodifyStats(target, source, 0, health, board, hero, gameState);\r\n\t}\r\n};\r\n\r\nexport const grantRandomStats = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\trace: Race,\r\n\texcludeSource: boolean,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tif (board.length > 0) {\r\n\t\tconst target: BoardEntity = getRandomAliveMinion(\r\n\t\t\tboard.filter((e) => !!e.cardId).filter((e) => (excludeSource ? e.entityId !== source.entityId : true)),\r\n\t\t\thero,\r\n\t\t\trace,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tif (target) {\r\n\t\t\tmodifyStats(target, source, attack, health, board, hero, gameState);\r\n\t\t\treturn target;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const getRandomAliveMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, gameState.anomalies, gameState.allCards))\r\n\t\t.filter((e) => e?.health > 0 && !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomRevivableMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, gameState.anomalies, gameState.allCards))\r\n\t\t.filter((e) => !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomMinionWithHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tif (!board.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst highestHealth = Math.max(...board.map((e) => e.health));\r\n\tconst validMinions = board.filter((e) => e.health === highestHealth);\r\n\treturn validMinions[Math.floor(Math.random() * validMinions.length)];\r\n};\r\n\r\n/**\r\n * Only use if the full board gets the stats, or if you're able to filter use the tribe param.\r\n * Otherwise some minions will be missing when applying onStatsUpdate effects\r\n */\r\nexport const addStatsToBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\tcountsAsStatsGain = true,\r\n): void => {\r\n\tfor (const entity of board) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.anomalies, gameState.allCards)) {\r\n\t\t\tif (countsAsStatsGain) {\r\n\t\t\t\tmodifyStats(entity, sourceEntity, attack, health, board, hero, gameState);\r\n\t\t\t} else {\r\n\t\t\t\tentity.attack += attack;\r\n\t\t\t\tentity.health += health;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const addStatsToAliveBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\t// permanentUpgrade = false,\r\n): void => {\r\n\tfor (const entity of board.filter((e) => e.health > 0 && !e.definitelyDead)) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.anomalies, gameState.allCards)) {\r\n\t\t\tmodifyStats(entity, sourceEntity, attack, health, board, hero, gameState);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const grantStatsToMinionsOfEachType = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\tnumberOfDifferentTypes = 99,\r\n\tcanRevive = true,\r\n): void => {\r\n\tconst minionsToBuff = getMinionsOfDifferentTypes(board, hero, gameState, canRevive, numberOfDifferentTypes);\r\n\tfor (const entity of minionsToBuff) {\r\n\t\tmodifyStats(entity, source, attack, health, board, hero, gameState);\r\n\t}\r\n};\r\n\r\nexport const getMinionsOfDifferentTypes = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcanRevive = true,\r\n\tnumberOfDifferentTypes = 99,\r\n): BoardEntity[] => {\r\n\tconst result: BoardEntity[] = [];\r\n\tif (board.length > 0) {\r\n\t\tlet boardCopy = board.filter(\r\n\t\t\t(e) => !getEffectiveTribesForEntity(e, hero, gameState.anomalies, gameState.allCards)?.includes(Race.ALL),\r\n\t\t);\r\n\t\tconst allRaces = shuffleArray(ALL_BG_RACES);\r\n\t\tlet typesBuffed = 0;\r\n\t\tconst racesProcessed = [];\r\n\t\tfor (let i = 1; i <= 2; i++) {\r\n\t\t\tfor (const tribe of allRaces) {\r\n\t\t\t\tconst minionsWithRaces = boardCopy\r\n\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\t\tgetEffectiveTribesForEntity(e, hero, gameState.anomalies, gameState.allCards).length === i,\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.filter((e) => hasCorrectTribe(e, hero, tribe, gameState.anomalies, gameState.allCards))\r\n\t\t\t\t\t.filter((e) =>\r\n\t\t\t\t\t\tgetEffectiveTribesForEntity(e, hero, gameState.anomalies, gameState.allCards).some(\r\n\t\t\t\t\t\t\t(r) => !racesProcessed.includes(r),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t);\r\n\t\t\t\tif (typesBuffed >= numberOfDifferentTypes) {\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t\tconst validMinion: BoardEntity = canRevive\r\n\t\t\t\t\t? getRandomRevivableMinion(minionsWithRaces, hero, tribe, gameState)\r\n\t\t\t\t\t: getRandomAliveMinion(minionsWithRaces, hero, tribe, gameState);\r\n\t\t\t\tif (validMinion) {\r\n\t\t\t\t\tresult.push(validMinion);\r\n\t\t\t\t\tboardCopy = boardCopy.filter((e) => e !== validMinion);\r\n\t\t\t\t\ttypesBuffed++;\r\n\t\t\t\t\tracesProcessed.push(tribe);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tresult.push(\r\n\t\t\t...board.filter((e) => {\r\n\t\t\t\tconst effectiveTribes = getEffectiveTribesForEntity(e, hero, gameState.anomalies, gameState.allCards);\r\n\t\t\t\treturn effectiveTribes?.includes(Race.ALL);\r\n\t\t\t}),\r\n\t\t);\r\n\t}\r\n\treturn result;\r\n};\r\n\r\nexport const hasMechanic = (card: ReferenceCard, mechanic: GameTag): boolean => {\r\n\treturn card.mechanics?.includes(GameTag[mechanic]);\r\n};\r\n\r\nexport const hasEntityMechanic = (\r\n\tentity: BoardEntity | BoardEnchantment,\r\n\tmechanic: GameTag,\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tconst card = allCards.getCard(entity.cardId);\r\n\tif (card.mechanics?.includes(GameTag[mechanic])) {\r\n\t\treturn true;\r\n\t}\r\n\t// Look at the base card\r\n\tif (card.entityDbfIf) {\r\n\t\treturn hasMechanic(allCards.getCard(card.entityDbfIf), mechanic);\r\n\t}\r\n\tfor (const enchant of (entity as BoardEntity).enchantments ?? []) {\r\n\t\tif (hasEntityMechanic(enchant, mechanic, allCards)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t}\r\n\treturn false;\r\n};\r\n\r\nexport const hasCorrectTribe = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\ttargetTribe: Race,\r\n\tanomalies: readonly string[],\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tif (entity == null) {\r\n\t\treturn false;\r\n\t}\r\n\tconst effectiveTribesForEntity = getEffectiveTribesForEntity(entity, playerEntity, anomalies, allCards);\r\n\treturn (\r\n\t\teffectiveTribesForEntity.length > 0 &&\r\n\t\t(effectiveTribesForEntity.includes(targetTribe) || effectiveTribesForEntity.includes(Race.ALL))\r\n\t);\r\n};\r\n\r\nexport const isVolumizer = (\r\n\tcardId: string | number,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tanomalies: readonly string[],\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tif (cardId == null) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst refCard = allCards.getCard(cardId);\r\n\treturn refCard.mechanics?.includes('BACON_VOLUMIZER');\r\n};\r\n\r\n/**\r\n * Useful in cases where a volumizer is summoned from hand, where the volumizer buff is already applied\r\n */\r\nexport const alreadyHasVolumizerBuff = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): boolean => {\r\n\treturn entity.enchantments?.some((e) => e.cardId?.includes('BG34_170'));\r\n};\r\n\r\nexport const getEffectiveTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tanomalies: readonly string[],\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\t// When we trigger a remembered deathrattle, the tribe is the tribe of the actual minion, not the remembered effect\r\n\tconst cardId = entity?.originalCardId ?? entity?.cardId;\r\n\tif (!cardId) {\r\n\t\treturn [];\r\n\t}\r\n\tconst refCard = allCards.getCard(cardId);\r\n\tconst nativeTribes = refCard.races?.map((r) => Race[r]) ?? [];\r\n\tif (!nativeTribes.length && anomalies?.includes(CardIds.IncubationMutation_BG31_Anomaly_112)) {\r\n\t\treturn [Race.ALL];\r\n\t}\r\n\tif (\r\n\t\trefCard.mechanics?.includes(GameTag[GameTag.BACON_BUDDY]) &&\r\n\t\tanomalies?.includes(CardIds.ColorfulCamaraderie_BG33_Anomaly_005)\r\n\t) {\r\n\t\treturn [Race.ALL];\r\n\t}\r\n\treturn [...nativeTribes, ...getSpecialTribesForEntity(entity, playerEntity, allCards)];\r\n};\r\n\r\nconst getSpecialTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013:\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013_G:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.SmugglerPortrait_BG30_MagicItem_825)\r\n\t\t\t\t? [Race.DRAGON]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.LightfangEnforcer_BGS_009:\r\n\t\tcase CardIds.LightfangEnforcer_TB_BaconUps_082:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.EnforcerPortrait_BG30_MagicItem_971)\r\n\t\t\t\t? [Race.ALL]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.BrannBronzebeard_BG_LOE_077:\r\n\t\tcase CardIds.BrannBronzebeard_TB_BaconUps_045:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.BronzebeardPortrait_BG30_MagicItem_418)\r\n\t\t\t\t? [Race.DRAGON, Race.MURLOC]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.DrakkariEnchanter_BG26_ICC_901:\r\n\t\tcase CardIds.DrakkariEnchanter_BG26_ICC_901_G:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.DrakkariPortrait_BG32_MagicItem_179)\r\n\t\t\t\t? [Race.MECH, Race.ELEMENTAL]\r\n\t\t\t\t: [];\r\n\t}\r\n\treturn [];\r\n};\r\n\r\n/** @deprecated use hasCorreectTribe instead */\r\nexport const isCorrectTribe = (cardRaces: readonly string[], targetTribe: Race): boolean => {\r\n\tif (!cardRaces?.length) {\r\n\t\treturn false;\r\n\t}\r\n\treturn cardRaces\r\n\t\t.map((cardRace) => getRaceEnum(cardRace))\r\n\t\t.some((raceEnum) => raceEnum === Race.ALL || raceEnum === targetTribe);\r\n};\r\n\r\nexport const getRaceEnum = (race: string): Race => {\r\n\treturn Race[race];\r\n};\r\n\r\nexport const addImpliedMechanics = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tconst cleave = CLEAVE_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tconst cantAttack = CANT_ATTACK_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tentity.cleave = cleave;\r\n\tentity.cantAttack = cantAttack;\r\n\tentity.divineShield = entity.divineShield || entity.hadDivineShield;\r\n\tentity.immuneWhenAttackCharges = [\r\n\t\tCardIds.Warpwing_BG24_004,\r\n\t\tCardIds.Warpwing_BG24_004_G,\r\n\t\tCardIds.KerriganQueenOfBlades_ViperToken_BG31_HERO_811t8,\r\n\t\tCardIds.Viper_BG31_HERO_811t8_G,\r\n\t\tCardIds.TimewarpedViper_BG34_Treasure_990,\r\n\t\tCardIds.TimewarpedViper_BG34_Treasure_990_G,\r\n\t].includes(entity.cardId as CardIds)\r\n\t\t? 99999\r\n\t\t: null;\r\n\tentity.frenzyChargesLeft =\r\n\t\tentity.cardId === CardIds.BristlebackKnight_BG20_204_G\r\n\t\t\t? 2\r\n\t\t\t: entity.cardId === CardIds.BristlebackKnight_BG20_204\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n\t// It's not an issue adding a charge for entities without a special ability\r\n\tconst defaultChargesImpl = cardMappings[entity.cardId];\r\n\tif (hasDefaultCharges(defaultChargesImpl)) {\r\n\t\tentity.abiityChargesLeft = defaultChargesImpl.defaultCharges(entity);\r\n\t} else {\r\n\t\tentity.abiityChargesLeft = [\r\n\t\t\t// CardIds.MarineMatriarch_BG29_610,\r\n\t\t\t// CardIds.MarineMatriarch_BG29_610_G,\r\n\t\t\t// CardIds.SoftHeartedSiren_BG26_590,\r\n\t\t\t// CardIds.SoftHeartedSiren_BG26_590_G,\r\n\t\t\t// CardIds.LongJohnCopper_BG29_831,\r\n\t\t\t// CardIds.LongJohnCopper_BG29_831_G,\r\n\t\t\t// CardIds.BristlingBuffoon_BG29_160,\r\n\t\t\t// CardIds.BristlingBuffoon_BG29_160_G,\r\n\t\t].includes(entity.cardId as CardIds)\r\n\t\t\t? 3\r\n\t\t\t: [\r\n\t\t\t\t\tCardIds.Mannoroth_BG27_507_G,\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\t\tCardIds.MadMatador_BG28_404_G,\r\n\t\t\t\t\tCardIds.WingedChimera_BG29_844,\r\n\t\t\t\t\tCardIds.WingedChimera_BG29_844_G,\r\n\t\t\t\t\tCardIds.MossOfTheSchloss_BG30_111_G,\r\n\t\t\t ].includes(entity.cardId as CardIds)\r\n\t\t\t? 2\r\n\t\t\t: 1;\r\n\t}\r\n\r\n\treturn setImplicitDataForEntity(entity, cardsData);\r\n};\r\n\r\nconst setImplicitDataForEntity = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tentity.cardId = normalizeCardIdForSkin(entity.cardId);\r\n\tentity.maxHealth = Math.max(0, entity.health, entity.maxHealth ?? 0);\r\n\tentity.maxAttack = Math.max(0, entity.attack, entity.maxAttack ?? 0);\r\n\tconst avengeValue = cardsData.avengeValue(entity.cardId);\r\n\tif (avengeValue > 0) {\r\n\t\tentity.avengeCurrent = avengeValue;\r\n\t\tentity.avengeDefault = avengeValue;\r\n\t}\r\n\treturn entity;\r\n};\r\n\r\nexport const normalizeCardIdForSkin = (cardId: string): string => {\r\n\tif (!cardId?.length) {\r\n\t\treturn cardId;\r\n\t}\r\n\tconst skinMatch = cardId.match(/(.*)_SKIN_.*/);\r\n\tif (skinMatch) {\r\n\t\treturn skinMatch[1];\r\n\t}\r\n\treturn cardId;\r\n};\r\n\r\nexport const stringifySimple = (board: readonly BoardEntity[], allCards: AllCardsService = null): string => {\r\n\treturn '[' + board.map((entity) => stringifySimpleCard(entity, allCards)).join(', ') + ']';\r\n};\r\n\r\nexport const stringifySimpleCard = (entity: BoardEntity, allCards: AllCardsService = null): string => {\r\n\treturn entity\r\n\t\t? `${allCards?.getCard(entity.cardId)?.name ?? entity.cardId}/entityId=${entity.entityId}/atk=${\r\n\t\t\t\tentity.attack\r\n\t\t }/hp=${entity.health}/ench=${entity.enchantments.map((e) => e.cardId).join(',')}`\r\n\t\t: null;\r\n};\r\n\r\nexport const isFish = (entity: BoardEntity): boolean => {\r\n\treturn (\r\n\t\tentity.cardId?.startsWith(CardIds.AvatarOfNzoth_FishOfNzothToken) ||\r\n\t\tentity.cardId?.startsWith(CardIds.FishOfNzoth) ||\r\n\t\tentity.additionalCards?.includes(CardIds.DevourerOfSouls_BG_RLK_538)\r\n\t);\r\n};\r\n\r\nexport const isPilotedWhirlOTron = (entity: BoardEntity): boolean => {\r\n\treturn entity.cardId?.startsWith(CardIds.PilotedWhirlOTron_BG21_HERO_030_Buddy);\r\n};\r\n\r\nexport const isGolden = (cardId: string, allCards: AllCardsService): boolean => {\r\n\treturn allCards.getCard(cardId).premium;\r\n};\r\n\r\nexport const isBoardEntity = (entity: BoardEntity | BoardTrinket): entity is BoardEntity => {\r\n\treturn entity != null && 'maxHealth' in entity;\r\n};\r\n\r\nexport const getPlayerState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.player.player === hero\r\n\t\t? gameState.player\r\n\t\t: gameState.player.teammate?.player === hero\r\n\t\t? gameState.player.teammate\r\n\t\t: gameState.opponent.player === hero\r\n\t\t? gameState.opponent\r\n\t\t: gameState.opponent.teammate?.player === hero\r\n\t\t? gameState.opponent.teammate\r\n\t\t: null;\r\n};\r\n\r\nexport const getTeammateInitialState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.playerInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial.teammate\r\n\t\t: gameState.playerInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial\r\n\t\t: gameState.opponentInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial.teammate\r\n\t\t: gameState.opponentInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial\r\n\t\t: null;\r\n};\r\n\r\nexport const getTeamInitialStates = (gameState: GameState, hero: BgsPlayerEntity): PlayerState[] => {\r\n\treturn gameState.playerInitial.player?.friendly === hero?.friendly\r\n\t\t? [gameState.playerInitial, gameState.playerInitial.teammate].filter((p) => p)\r\n\t\t: [gameState.opponentInitial, gameState.opponentInitial.teammate].filter((p) => p);\r\n};\r\n\r\nexport const copyEntity = (entity: BoardEntity): BoardEntity => {\r\n\tconst copy: BoardEntity = {\r\n\t\t...entity,\r\n\t\tenchantments: entity.enchantments.map((ench) => ({ ...ench })),\r\n\t\tpendingAttackBuffs: [],\r\n\t\trememberedDeathrattles: (entity.rememberedDeathrattles ?? []).map((r) => ({ ...r })),\r\n\t\tadditionalCards: entity.additionalCards?.map((c) => c),\r\n\t\ttags: entity.tags ? { ...entity.tags } : null,\r\n\t\tlastAffectedByEntity: null,\r\n\t};\r\n\treturn copy;\r\n};\r\n\r\nexport const isDead = (entity: BoardEntity): boolean => {\r\n\treturn entity.health <= 0 || entity.definitelyDead;\r\n};\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firestone-hs/simulate-bgs-battle",
3
- "version": "1.1.671",
3
+ "version": "1.1.673",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "lint": "eslint --color --fix --ext .ts .",