@firestone-hs/simulate-bgs-battle 1.1.113 → 1.1.114

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.
@@ -40,15 +40,11 @@ class CardsData {
40
40
  .filter((card) => card.race === 'PIRATE')
41
41
  .map((card) => card.id);
42
42
  this.auraEnchantments = [
43
- ["EX1_185e"],
44
- ["TB_BaconUps_053", "TB_BaconUps_053e"],
45
- ["GVG_021e"],
46
- ["TB_BaconUps_060", "TB_BaconUps_060e"],
47
- ["BG21_039e"],
43
+ ["BG21_039", "BG21_039e"],
48
44
  ["BG21_039_G", "BG21_039_Ge"],
49
- ["EX1_507e"],
45
+ ["EX1_507", "EX1_507e"],
50
46
  ["TB_BaconUps_008", "TB_BaconUps_008e"],
51
- ["NEW1_027e"],
47
+ ["NEW1_027", "NEW1_027e"],
52
48
  ["TB_BaconUps_136", "TB_BaconUps_136e"],
53
49
  ];
54
50
  this.auraOrigins = this.auraEnchantments.map((pair) => pair[0]);
@@ -1 +1 @@
1
- {"version":3,"file":"cards-data.js","sourceRoot":"","sources":["../../src/cards/cards-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllCardsService, CardIds, isBattlegroundsCard, Race, ReferenceCard } from '@firestone-hs/reference-data';\r\nimport { getRaceEnum, hasMechanic } from '../utils';\r\n\r\nexport class CardsData {\r\n\tpublic static CARDS_WITH_NO_BACONUP_VERSION = [\r\n\t\tCardIds.BronzeWarden,\r\n\t\tCardIds.YoHoOgre,\r\n\t\tCardIds.CaveHydra,\r\n\t\tCardIds.FoeReaper4000,\r\n\t\tCardIds.Maexxna1,\r\n\t];\r\n\r\n\t// public shredderSpawns: readonly string[];\r\n\tpublic ghastcoilerSpawns: readonly string[];\r\n\tpublic validDeathrattles: readonly string[];\r\n\tpublic impMamaSpawns: readonly string[];\r\n\tpublic gentleDjinniSpawns: readonly string[];\r\n\t// public sneedsSpawns: readonly string[];\r\n\t// public treasureChestSpawns: readonly string[];\r\n\tpublic pirateSpawns: readonly string[];\r\n\r\n\tpublic auraEnchantments: readonly string[][];\r\n\tpublic auraOrigins: readonly string[];\r\n\tpublic startOfCombats: readonly string[];\r\n\r\n\tconstructor(private readonly allCards: AllCardsService, init = true) {\r\n\t\tif (init) {\r\n\t\t\tthis.inititialize();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic inititialize(validTribes?: readonly Race[]): void {\r\n\t\tconst pool = this.allCards\r\n\t\t\t.getCards()\r\n\t\t\t.filter((card) => isBattlegroundsCard(card))\r\n\t\t\t.filter((card) => card.set !== 'Vanilla');\r\n\t\tthis.ghastcoilerSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.id !== 'BGS_008')\r\n\t\t\t.filter((card) => hasMechanic(card, 'DEATHRATTLE'))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.race))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.validDeathrattles = pool\r\n\t\t\t// .filter((card) => !card.id.startsWith('TB_BaconUps')) // Ignore golden\r\n\t\t\t.filter((card) => hasMechanic(card, 'DEATHRATTLE'))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.race))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.impMamaSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.race === 'DEMON')\r\n\t\t\t.filter((card) => card.id !== CardIds.ImpMama)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.gentleDjinniSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.race === 'ELEMENTAL')\r\n\t\t\t.filter((card) => card.id !== CardIds.GentleDjinni)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.pirateSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.race === 'PIRATE')\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\t// Auras are effects that are permanent (unlike deathrattles or \"whenever\" effects)\r\n\t\t// and that stop once the origin entity leaves play (so it doesn't include buffs)\r\n\t\tthis.auraEnchantments = [\r\n\t\t\t[CardIds.Siegebreaker_SiegebreakingLegacyEnchantment],\r\n\t\t\t[CardIds.SiegebreakerBattlegrounds, CardIds.Siegebreaker_SiegebreakingEnchantmentBattlegrounds],\r\n\t\t\t[CardIds.Malganis_GraspOfMalganisEnchantment],\r\n\t\t\t[CardIds.MalganisBattlegrounds, CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds],\r\n\t\t\t[CardIds.Kathranatir_GraspOfKathranatirEnchantment1],\r\n\t\t\t[CardIds.KathranatirBattlegrounds, CardIds.Kathranatir_GraspOfKathranatirEnchantment2],\r\n\t\t\t[CardIds.MurlocWarleader_MrgglaarglLegacyEnchantment],\r\n\t\t\t[CardIds.MurlocWarleaderBattlegrounds, CardIds.MurlocWarleader_MrgglaarglEnchantmentBattlegrounds],\r\n\t\t\t[CardIds.SouthseaCaptain_YarrrLegacyEnchantment],\r\n\t\t\t[CardIds.SouthseaCaptainBattlegrounds, CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds],\r\n\t\t];\r\n\t\tthis.auraOrigins = this.auraEnchantments.map((pair) => pair[0]);\r\n\t\tthis.startOfCombats = [\r\n\t\t\tCardIds.RedWhelp,\r\n\t\t\tCardIds.RedWhelpBattlegrounds,\r\n\t\t\tCardIds.PrizedPromoDrake,\r\n\t\t\tCardIds.PrizedPromoDrakeBattlegrounds,\r\n\t\t];\r\n\t}\r\n\r\n\tpublic avengeValue(cardId: string): number {\r\n\t\tswitch (cardId) {\r\n\t\t\tcase CardIds.BirdBuddy:\r\n\t\t\tcase CardIds.BirdBuddyBattlegrounds:\r\n\t\t\t\treturn 1;\r\n\t\t\tcase CardIds.PalescaleCrocolisk:\r\n\t\t\tcase CardIds.PalescaleCrocoliskBattlegrounds:\r\n\t\t\tcase CardIds.MechanoTank:\r\n\t\t\tcase CardIds.MechanoTankBattlegrounds:\r\n\t\t\t\treturn 2;\r\n\t\t\tcase CardIds.Sisefin:\r\n\t\t\tcase CardIds.SisefinBattlegrounds:\r\n\t\t\tcase CardIds.BuddingGreenthumb:\r\n\t\t\tcase CardIds.BuddingGreenthumbBattlegrounds:\r\n\t\t\t\treturn 3;\r\n\t\t\tcase CardIds.ImpatientDoomsayer:\r\n\t\t\tcase CardIds.ImpatientDoomsayerBattlegrounds:\r\n\t\t\tcase CardIds.WitchwingNestmatron:\r\n\t\t\tcase CardIds.WitchwingNestmatronBattlegrounds:\r\n\t\t\t\treturn 4;\r\n\t\t\tcase CardIds.TonyTwoTusk:\r\n\t\t\tcase CardIds.TonyTwoTuskBattlegrounds:\r\n\t\t\t\treturn 5;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tprivate isGolden(card: ReferenceCard): boolean {\r\n\t\treturn !!card.battlegroundsNormalDbfId;\r\n\t}\r\n\r\n\tprivate isValidTribe(validTribes: readonly Race[], race: string): boolean {\r\n\t\tconst raceEnum: Race = getRaceEnum(race);\r\n\t\treturn raceEnum === Race.ALL || !validTribes || validTribes.length === 0 || validTribes.includes(raceEnum);\r\n\t}\r\n}\r\n"]}
1
+ {"version":3,"file":"cards-data.js","sourceRoot":"","sources":["../../src/cards/cards-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllCardsService, CardIds, isBattlegroundsCard, Race, ReferenceCard } from '@firestone-hs/reference-data';\r\nimport { getRaceEnum, hasMechanic } from '../utils';\r\n\r\nexport class CardsData {\r\n\tpublic static CARDS_WITH_NO_BACONUP_VERSION = [\r\n\t\tCardIds.BronzeWarden,\r\n\t\tCardIds.YoHoOgre,\r\n\t\tCardIds.CaveHydra,\r\n\t\tCardIds.FoeReaper4000,\r\n\t\tCardIds.Maexxna1,\r\n\t];\r\n\r\n\t// public shredderSpawns: readonly string[];\r\n\tpublic ghastcoilerSpawns: readonly string[];\r\n\tpublic validDeathrattles: readonly string[];\r\n\tpublic impMamaSpawns: readonly string[];\r\n\tpublic gentleDjinniSpawns: readonly string[];\r\n\t// public sneedsSpawns: readonly string[];\r\n\t// public treasureChestSpawns: readonly string[];\r\n\tpublic pirateSpawns: readonly string[];\r\n\r\n\tpublic auraEnchantments: readonly string[][];\r\n\tpublic auraOrigins: readonly string[];\r\n\tpublic startOfCombats: readonly string[];\r\n\r\n\tconstructor(private readonly allCards: AllCardsService, init = true) {\r\n\t\tif (init) {\r\n\t\t\tthis.inititialize();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic inititialize(validTribes?: readonly Race[]): void {\r\n\t\tconst pool = this.allCards\r\n\t\t\t.getCards()\r\n\t\t\t.filter((card) => isBattlegroundsCard(card))\r\n\t\t\t.filter((card) => card.set !== 'Vanilla');\r\n\t\tthis.ghastcoilerSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.id !== 'BGS_008')\r\n\t\t\t.filter((card) => hasMechanic(card, 'DEATHRATTLE'))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.race))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.validDeathrattles = pool\r\n\t\t\t// .filter((card) => !card.id.startsWith('TB_BaconUps')) // Ignore golden\r\n\t\t\t.filter((card) => hasMechanic(card, 'DEATHRATTLE'))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.race))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.impMamaSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.race === 'DEMON')\r\n\t\t\t.filter((card) => card.id !== CardIds.ImpMama)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.gentleDjinniSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.race === 'ELEMENTAL')\r\n\t\t\t.filter((card) => card.id !== CardIds.GentleDjinni)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.pirateSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.race === 'PIRATE')\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\t// Auras are effects that are permanent (unlike deathrattles or \"whenever\" effects)\r\n\t\t// and that stop once the origin entity leaves play (so it doesn't include buffs)\r\n\t\tthis.auraEnchantments = [\r\n\t\t\t[CardIds.Kathranatir2, CardIds.Kathranatir_GraspOfKathranatirEnchantment1],\r\n\t\t\t[CardIds.KathranatirBattlegrounds, CardIds.Kathranatir_GraspOfKathranatirEnchantment2],\r\n\t\t\t[CardIds.MurlocWarleaderLegacy, CardIds.MurlocWarleader_MrgglaarglLegacyEnchantment],\r\n\t\t\t[CardIds.MurlocWarleaderBattlegrounds, CardIds.MurlocWarleader_MrgglaarglEnchantmentBattlegrounds],\r\n\t\t\t[CardIds.SouthseaCaptainLegacy, CardIds.SouthseaCaptain_YarrrLegacyEnchantment],\r\n\t\t\t[CardIds.SouthseaCaptainBattlegrounds, CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds],\r\n\t\t];\r\n\t\tthis.auraOrigins = this.auraEnchantments.map((pair) => pair[0]);\r\n\t\tthis.startOfCombats = [\r\n\t\t\tCardIds.RedWhelp,\r\n\t\t\tCardIds.RedWhelpBattlegrounds,\r\n\t\t\tCardIds.PrizedPromoDrake,\r\n\t\t\tCardIds.PrizedPromoDrakeBattlegrounds,\r\n\t\t];\r\n\t}\r\n\r\n\tpublic avengeValue(cardId: string): number {\r\n\t\tswitch (cardId) {\r\n\t\t\tcase CardIds.BirdBuddy:\r\n\t\t\tcase CardIds.BirdBuddyBattlegrounds:\r\n\t\t\t\treturn 1;\r\n\t\t\tcase CardIds.PalescaleCrocolisk:\r\n\t\t\tcase CardIds.PalescaleCrocoliskBattlegrounds:\r\n\t\t\tcase CardIds.MechanoTank:\r\n\t\t\tcase CardIds.MechanoTankBattlegrounds:\r\n\t\t\t\treturn 2;\r\n\t\t\tcase CardIds.Sisefin:\r\n\t\t\tcase CardIds.SisefinBattlegrounds:\r\n\t\t\tcase CardIds.BuddingGreenthumb:\r\n\t\t\tcase CardIds.BuddingGreenthumbBattlegrounds:\r\n\t\t\t\treturn 3;\r\n\t\t\tcase CardIds.ImpatientDoomsayer:\r\n\t\t\tcase CardIds.ImpatientDoomsayerBattlegrounds:\r\n\t\t\tcase CardIds.WitchwingNestmatron:\r\n\t\t\tcase CardIds.WitchwingNestmatronBattlegrounds:\r\n\t\t\t\treturn 4;\r\n\t\t\tcase CardIds.TonyTwoTusk:\r\n\t\t\tcase CardIds.TonyTwoTuskBattlegrounds:\r\n\t\t\t\treturn 5;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tprivate isGolden(card: ReferenceCard): boolean {\r\n\t\treturn !!card.battlegroundsNormalDbfId;\r\n\t}\r\n\r\n\tprivate isValidTribe(validTribes: readonly Race[], race: string): boolean {\r\n\t\tconst raceEnum: Race = getRaceEnum(race);\r\n\t\treturn raceEnum === Race.ALL || !validTribes || validTribes.length === 0 || validTribes.includes(raceEnum);\r\n\t}\r\n}\r\n"]}
@@ -56,10 +56,10 @@ const simulateBattle = (battleInput, cards, cardsData) => {
56
56
  const opponentInfo = battleInput.opponentBoard;
57
57
  const playerBoard = playerInfo.board.map((entity) => (Object.assign(Object.assign({}, utils_1.addImpliedMechanics(entity)), { friendly: true })));
58
58
  const opponentBoard = opponentInfo.board.map((entity) => (Object.assign(Object.assign({}, utils_1.addImpliedMechanics(entity)), { friendly: false })));
59
- auras_1.setImplicitData(playerBoard, cardsData);
60
- auras_1.setImplicitData(opponentBoard, cardsData);
61
59
  auras_1.removeAuras(playerBoard, cardsData);
62
60
  auras_1.removeAuras(opponentBoard, cardsData);
61
+ auras_1.setImplicitData(playerBoard, cardsData);
62
+ auras_1.setImplicitData(opponentBoard, cardsData);
63
63
  const inputReady = {
64
64
  playerBoard: {
65
65
  board: playerBoard,
@@ -1 +1 @@
1
- {"version":3,"file":"simulate-bgs-battle.js","sourceRoot":"","sources":["../src/simulate-bgs-battle.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService, CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsBattleInfo } from './bgs-battle-info';\r\nimport { BoardEntity } from './board-entity';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { SimulationResult } from './simulation-result';\r\nimport { removeAuras, setImplicitData } from './simulation/auras';\r\nimport { Simulator } from './simulation/simulator';\r\nimport { Spectator } from './simulation/spectator/spectator';\r\nimport { addImpliedMechanics } from './utils';\r\n\r\nconst cards = new AllCardsService();\r\n\r\n// This example demonstrates a NodeJS 8.10 async handler[1], however of course you could use\r\n// the more traditional callback-style handler.\r\n// [1]: https://aws.amazon.com/blogs/compute/node-js-8-10-runtime-now-available-in-aws-lambda/\r\nexport default async (event): Promise<any> => {\r\n\tconst battleInput: BgsBattleInfo = JSON.parse(event.body);\r\n\tawait cards.initializeCardsDb('93849-2');\r\n\tconst cardsData = new CardsData(cards, false);\r\n\tcardsData.inititialize(battleInput.options?.validTribes);\r\n\tconst simulationResult = simulateBattle(battleInput, cards, cardsData);\r\n\r\n\tconst response = {\r\n\t\tstatusCode: 200,\r\n\t\tisBase64Encoded: false,\r\n\t\tbody: JSON.stringify(simulationResult),\r\n\t};\r\n\treturn response;\r\n};\r\n\r\nexport const simulateBattle = (battleInput: BgsBattleInfo, cards: AllCardsService, cardsData: CardsData): SimulationResult => {\r\n\tconst start = Date.now();\r\n\r\n\tconst maxAcceptableDuration = battleInput.options?.maxAcceptableDuration || 8000;\r\n\tconst numberOfSimulations = battleInput.options?.numberOfSimulations || 5000;\r\n\r\n\tconst simulationResult: SimulationResult = {\r\n\t\twonLethal: 0,\r\n\t\twon: 0,\r\n\t\ttied: 0,\r\n\t\tlost: 0,\r\n\t\tlostLethal: 0,\r\n\t\tdamageWon: 0,\r\n\t\tdamageLost: 0,\r\n\t\twonLethalPercent: undefined,\r\n\t\twonPercent: undefined,\r\n\t\ttiedPercent: undefined,\r\n\t\tlostPercent: undefined,\r\n\t\tlostLethalPercent: undefined,\r\n\t\taverageDamageWon: undefined,\r\n\t\taverageDamageLost: undefined,\r\n\t};\r\n\r\n\tconst playerInfo = battleInput.playerBoard;\r\n\tconst opponentInfo = battleInput.opponentBoard;\r\n\r\n\tconst playerBoard = playerInfo.board.map((entity) => ({ ...addImpliedMechanics(entity), friendly: true } as BoardEntity));\r\n\tconst opponentBoard = opponentInfo.board.map((entity) => ({ ...addImpliedMechanics(entity), friendly: false } as BoardEntity));\r\n\tsetImplicitData(playerBoard, cardsData); // Avenge, maxHealth, etc.\r\n\tsetImplicitData(opponentBoard, cardsData); // Avenge, maxHealth, etc.\r\n\tremoveAuras(playerBoard, cardsData); // cleanEnchantments(playerInfo.board);\r\n\tremoveAuras(opponentBoard, cardsData); // cleanEnchantments(opponentInfo.board);\r\n\t// removeGlobalModifiers(playerBoard, opponentBoard, cards);\r\n\r\n\t// We do this so that we can have mutated objects inside the simulation and still\r\n\t// be able to start from a fresh copy for each simulation\r\n\tconst inputReady: BgsBattleInfo = {\r\n\t\tplayerBoard: {\r\n\t\t\tboard: playerBoard,\r\n\t\t\tplayer: playerInfo.player,\r\n\t\t},\r\n\t\topponentBoard: {\r\n\t\t\tboard: opponentBoard,\r\n\t\t\tplayer: opponentInfo.player,\r\n\t\t},\r\n\t} as BgsBattleInfo;\r\n\tconst inputStr = JSON.stringify(inputReady);\r\n\tconst spectator = new Spectator(\r\n\t\tbattleInput.playerBoard.player.cardId,\r\n\t\tbattleInput.playerBoard.player.heroPowerId,\r\n\t\tbattleInput.opponentBoard.player.cardId,\r\n\t\tbattleInput.opponentBoard.player.heroPowerId,\r\n\t);\r\n\tconsole.time('simulation');\r\n\tfor (let i = 0; i < numberOfSimulations; i++) {\r\n\t\t// global.gc();\r\n\t\t// continue;\r\n\t\tconst simulator = new Simulator(cards, cardsData);\r\n\t\tconst input: BgsBattleInfo = JSON.parse(inputStr);\r\n\t\tconst battleResult = simulator.simulateSingleBattle(\r\n\t\t\tinput.playerBoard.board,\r\n\t\t\tinput.playerBoard.player,\r\n\t\t\tinput.opponentBoard.board,\r\n\t\t\tinput.opponentBoard.player,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\tif (Date.now() - start > maxAcceptableDuration) {\r\n\t\t\t// Can happen in case of inifinite boards, or a bug. Don't hog the user's computer in that case\r\n\t\t\tconsole.warn('Stopping simulation after', i, 'iterations and ', Date.now() - start, 'ms', battleResult);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (!battleResult) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (battleResult.result === 'won') {\r\n\t\t\tsimulationResult.won++;\r\n\t\t\tsimulationResult.damageWon += battleResult.damageDealt;\r\n\t\t\tif (battleResult.damageDealt >= battleInput.opponentBoard.player.hpLeft) {\r\n\t\t\t\tsimulationResult.wonLethal++;\r\n\t\t\t}\r\n\t\t} else if (battleResult.result === 'lost') {\r\n\t\t\tsimulationResult.lost++;\r\n\t\t\tsimulationResult.damageLost += battleResult.damageDealt;\r\n\t\t\tif (battleInput.playerBoard.player.hpLeft && battleResult.damageDealt >= battleInput.playerBoard.player.hpLeft) {\r\n\t\t\t\tsimulationResult.lostLethal++;\r\n\t\t\t}\r\n\t\t} else if (battleResult.result === 'tied') {\r\n\t\t\tsimulationResult.tied++;\r\n\t\t}\r\n\t\tspectator.commitBattleResult(battleResult.result);\r\n\t}\r\n\tconst totalMatches = simulationResult.won + simulationResult.tied + simulationResult.lost;\r\n\tsimulationResult.wonPercent = checkRounding(\r\n\t\tMath.round((10 * (100 * simulationResult.won)) / totalMatches) / 10,\r\n\t\tsimulationResult.won,\r\n\t\ttotalMatches,\r\n\t);\r\n\tsimulationResult.lostPercent = checkRounding(\r\n\t\tMath.round((10 * (100 * simulationResult.lost)) / totalMatches) / 10,\r\n\t\tsimulationResult.lost,\r\n\t\ttotalMatches,\r\n\t);\r\n\t// simulationResult.tiedPercent = checkRounding(Math.round((10 * (100 * simulationResult.tied)) / totalMatches) / 10, simulationResult.tied, totalMatches);\r\n\tsimulationResult.tiedPercent = checkRounding(\r\n\t\t100 - simulationResult.lostPercent - simulationResult.wonPercent,\r\n\t\tsimulationResult.tied,\r\n\t\ttotalMatches,\r\n\t);\r\n\r\n\tsimulationResult.wonLethalPercent = Math.round((10 * (100 * simulationResult.wonLethal)) / totalMatches) / 10;\r\n\tsimulationResult.lostLethalPercent = Math.round((10 * (100 * simulationResult.lostLethal)) / totalMatches) / 10;\r\n\tsimulationResult.averageDamageWon = simulationResult.won ? simulationResult.damageWon / simulationResult.won : 0;\r\n\tsimulationResult.averageDamageLost = simulationResult.lost ? simulationResult.damageLost / simulationResult.lost : 0;\r\n\tif (simulationResult.averageDamageWon > 0 && simulationResult.averageDamageWon < playerInfo.player.tavernTier) {\r\n\t\tconsole.warn('average damage won issue', simulationResult, playerInfo);\r\n\t}\r\n\tif (simulationResult.averageDamageLost > 0 && simulationResult.averageDamageLost < opponentInfo.player.tavernTier) {\r\n\t\tconsole.warn('average damage lost issue', simulationResult, opponentInfo);\r\n\t}\r\n\tconsole.timeEnd('simulation');\r\n\tspectator.prune();\r\n\tsimulationResult.outcomeSamples = spectator.buildOutcomeSamples();\r\n\t// spectator.reset();\r\n\treturn simulationResult;\r\n};\r\n\r\nconst checkRounding = (roundedValue: number, initialValue: number, totalValue: number): number => {\r\n\tif (roundedValue === 0 && initialValue !== 0) {\r\n\t\treturn 0.01;\r\n\t}\r\n\tif (roundedValue === 100 && initialValue !== totalValue) {\r\n\t\treturn 99.9;\r\n\t}\r\n\treturn roundedValue;\r\n};\r\n\r\nconst cleanEnchantments = (board: readonly BoardEntity[]): readonly BoardEntity[] => {\r\n\tconst entityIds = board.map((entity) => entity.entityId);\r\n\treturn board.map((entity) => ({\r\n\t\t...entity,\r\n\t\tenchantments: cleanEnchantmentsForEntity(entity.enchantments, entityIds),\r\n\t}));\r\n};\r\n\r\nexport const validEnchantments = [\r\n\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantment,\r\n\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantmentBattlegrounds,\r\n\tCardIds.LivingSpores_LivingSporesEnchantment,\r\n\tCardIds.Leapfrogger_LeapfrogginEnchantment1,\r\n\tCardIds.Leapfrogger_LeapfrogginEnchantment2,\r\n];\r\n\r\nconst cleanEnchantmentsForEntity = (\r\n\tenchantments: { cardId: string; originEntityId: number }[],\r\n\tentityIds: readonly number[],\r\n): { cardId: string; originEntityId: number }[] => {\r\n\treturn enchantments.filter(\r\n\t\t(enchant) => entityIds.indexOf(enchant.originEntityId) !== -1 || validEnchantments.indexOf(enchant.cardId as CardIds) !== -1,\r\n\t);\r\n};\r\n"]}
1
+ {"version":3,"file":"simulate-bgs-battle.js","sourceRoot":"","sources":["../src/simulate-bgs-battle.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService, CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsBattleInfo } from './bgs-battle-info';\r\nimport { BoardEntity } from './board-entity';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { SimulationResult } from './simulation-result';\r\nimport { removeAuras, setImplicitData } from './simulation/auras';\r\nimport { Simulator } from './simulation/simulator';\r\nimport { Spectator } from './simulation/spectator/spectator';\r\nimport { addImpliedMechanics } from './utils';\r\n\r\nconst cards = new AllCardsService();\r\n\r\n// This example demonstrates a NodeJS 8.10 async handler[1], however of course you could use\r\n// the more traditional callback-style handler.\r\n// [1]: https://aws.amazon.com/blogs/compute/node-js-8-10-runtime-now-available-in-aws-lambda/\r\nexport default async (event): Promise<any> => {\r\n\tconst battleInput: BgsBattleInfo = JSON.parse(event.body);\r\n\tawait cards.initializeCardsDb('93849-2');\r\n\tconst cardsData = new CardsData(cards, false);\r\n\tcardsData.inititialize(battleInput.options?.validTribes);\r\n\tconst simulationResult = simulateBattle(battleInput, cards, cardsData);\r\n\r\n\tconst response = {\r\n\t\tstatusCode: 200,\r\n\t\tisBase64Encoded: false,\r\n\t\tbody: JSON.stringify(simulationResult),\r\n\t};\r\n\treturn response;\r\n};\r\n\r\nexport const simulateBattle = (battleInput: BgsBattleInfo, cards: AllCardsService, cardsData: CardsData): SimulationResult => {\r\n\tconst start = Date.now();\r\n\r\n\tconst maxAcceptableDuration = battleInput.options?.maxAcceptableDuration || 8000;\r\n\tconst numberOfSimulations = battleInput.options?.numberOfSimulations || 5000;\r\n\r\n\tconst simulationResult: SimulationResult = {\r\n\t\twonLethal: 0,\r\n\t\twon: 0,\r\n\t\ttied: 0,\r\n\t\tlost: 0,\r\n\t\tlostLethal: 0,\r\n\t\tdamageWon: 0,\r\n\t\tdamageLost: 0,\r\n\t\twonLethalPercent: undefined,\r\n\t\twonPercent: undefined,\r\n\t\ttiedPercent: undefined,\r\n\t\tlostPercent: undefined,\r\n\t\tlostLethalPercent: undefined,\r\n\t\taverageDamageWon: undefined,\r\n\t\taverageDamageLost: undefined,\r\n\t};\r\n\r\n\tconst playerInfo = battleInput.playerBoard;\r\n\tconst opponentInfo = battleInput.opponentBoard;\r\n\r\n\tconst playerBoard = playerInfo.board.map((entity) => ({ ...addImpliedMechanics(entity), friendly: true } as BoardEntity));\r\n\tconst opponentBoard = opponentInfo.board.map((entity) => ({ ...addImpliedMechanics(entity), friendly: false } as BoardEntity));\r\n\tremoveAuras(playerBoard, cardsData);\r\n\tremoveAuras(opponentBoard, cardsData);\r\n\tsetImplicitData(playerBoard, cardsData); // Avenge, maxHealth, etc.\r\n\tsetImplicitData(opponentBoard, cardsData); // Avenge, maxHealth, etc.\r\n\r\n\t// We do this so that we can have mutated objects inside the simulation and still\r\n\t// be able to start from a fresh copy for each simulation\r\n\tconst inputReady: BgsBattleInfo = {\r\n\t\tplayerBoard: {\r\n\t\t\tboard: playerBoard,\r\n\t\t\tplayer: playerInfo.player,\r\n\t\t},\r\n\t\topponentBoard: {\r\n\t\t\tboard: opponentBoard,\r\n\t\t\tplayer: opponentInfo.player,\r\n\t\t},\r\n\t} as BgsBattleInfo;\r\n\tconst inputStr = JSON.stringify(inputReady);\r\n\tconst spectator = new Spectator(\r\n\t\tbattleInput.playerBoard.player.cardId,\r\n\t\tbattleInput.playerBoard.player.heroPowerId,\r\n\t\tbattleInput.opponentBoard.player.cardId,\r\n\t\tbattleInput.opponentBoard.player.heroPowerId,\r\n\t);\r\n\tconsole.time('simulation');\r\n\tfor (let i = 0; i < numberOfSimulations; i++) {\r\n\t\t// global.gc();\r\n\t\t// continue;\r\n\t\tconst simulator = new Simulator(cards, cardsData);\r\n\t\tconst input: BgsBattleInfo = JSON.parse(inputStr);\r\n\t\tconst battleResult = simulator.simulateSingleBattle(\r\n\t\t\tinput.playerBoard.board,\r\n\t\t\tinput.playerBoard.player,\r\n\t\t\tinput.opponentBoard.board,\r\n\t\t\tinput.opponentBoard.player,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\tif (Date.now() - start > maxAcceptableDuration) {\r\n\t\t\t// Can happen in case of inifinite boards, or a bug. Don't hog the user's computer in that case\r\n\t\t\tconsole.warn('Stopping simulation after', i, 'iterations and ', Date.now() - start, 'ms', battleResult);\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tif (!battleResult) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (battleResult.result === 'won') {\r\n\t\t\tsimulationResult.won++;\r\n\t\t\tsimulationResult.damageWon += battleResult.damageDealt;\r\n\t\t\tif (battleResult.damageDealt >= battleInput.opponentBoard.player.hpLeft) {\r\n\t\t\t\tsimulationResult.wonLethal++;\r\n\t\t\t}\r\n\t\t} else if (battleResult.result === 'lost') {\r\n\t\t\tsimulationResult.lost++;\r\n\t\t\tsimulationResult.damageLost += battleResult.damageDealt;\r\n\t\t\tif (battleInput.playerBoard.player.hpLeft && battleResult.damageDealt >= battleInput.playerBoard.player.hpLeft) {\r\n\t\t\t\tsimulationResult.lostLethal++;\r\n\t\t\t}\r\n\t\t} else if (battleResult.result === 'tied') {\r\n\t\t\tsimulationResult.tied++;\r\n\t\t}\r\n\t\tspectator.commitBattleResult(battleResult.result);\r\n\t}\r\n\tconst totalMatches = simulationResult.won + simulationResult.tied + simulationResult.lost;\r\n\tsimulationResult.wonPercent = checkRounding(\r\n\t\tMath.round((10 * (100 * simulationResult.won)) / totalMatches) / 10,\r\n\t\tsimulationResult.won,\r\n\t\ttotalMatches,\r\n\t);\r\n\tsimulationResult.lostPercent = checkRounding(\r\n\t\tMath.round((10 * (100 * simulationResult.lost)) / totalMatches) / 10,\r\n\t\tsimulationResult.lost,\r\n\t\ttotalMatches,\r\n\t);\r\n\t// simulationResult.tiedPercent = checkRounding(Math.round((10 * (100 * simulationResult.tied)) / totalMatches) / 10, simulationResult.tied, totalMatches);\r\n\tsimulationResult.tiedPercent = checkRounding(\r\n\t\t100 - simulationResult.lostPercent - simulationResult.wonPercent,\r\n\t\tsimulationResult.tied,\r\n\t\ttotalMatches,\r\n\t);\r\n\r\n\tsimulationResult.wonLethalPercent = Math.round((10 * (100 * simulationResult.wonLethal)) / totalMatches) / 10;\r\n\tsimulationResult.lostLethalPercent = Math.round((10 * (100 * simulationResult.lostLethal)) / totalMatches) / 10;\r\n\tsimulationResult.averageDamageWon = simulationResult.won ? simulationResult.damageWon / simulationResult.won : 0;\r\n\tsimulationResult.averageDamageLost = simulationResult.lost ? simulationResult.damageLost / simulationResult.lost : 0;\r\n\tif (simulationResult.averageDamageWon > 0 && simulationResult.averageDamageWon < playerInfo.player.tavernTier) {\r\n\t\tconsole.warn('average damage won issue', simulationResult, playerInfo);\r\n\t}\r\n\tif (simulationResult.averageDamageLost > 0 && simulationResult.averageDamageLost < opponentInfo.player.tavernTier) {\r\n\t\tconsole.warn('average damage lost issue', simulationResult, opponentInfo);\r\n\t}\r\n\tconsole.timeEnd('simulation');\r\n\tspectator.prune();\r\n\tsimulationResult.outcomeSamples = spectator.buildOutcomeSamples();\r\n\t// spectator.reset();\r\n\treturn simulationResult;\r\n};\r\n\r\nconst checkRounding = (roundedValue: number, initialValue: number, totalValue: number): number => {\r\n\tif (roundedValue === 0 && initialValue !== 0) {\r\n\t\treturn 0.01;\r\n\t}\r\n\tif (roundedValue === 100 && initialValue !== totalValue) {\r\n\t\treturn 99.9;\r\n\t}\r\n\treturn roundedValue;\r\n};\r\n\r\nconst cleanEnchantments = (board: readonly BoardEntity[]): readonly BoardEntity[] => {\r\n\tconst entityIds = board.map((entity) => entity.entityId);\r\n\treturn board.map((entity) => ({\r\n\t\t...entity,\r\n\t\tenchantments: cleanEnchantmentsForEntity(entity.enchantments, entityIds),\r\n\t}));\r\n};\r\n\r\nexport const validEnchantments = [\r\n\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantment,\r\n\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantmentBattlegrounds,\r\n\tCardIds.LivingSpores_LivingSporesEnchantment,\r\n\tCardIds.Leapfrogger_LeapfrogginEnchantment1,\r\n\tCardIds.Leapfrogger_LeapfrogginEnchantment2,\r\n];\r\n\r\nconst cleanEnchantmentsForEntity = (\r\n\tenchantments: { cardId: string; originEntityId: number }[],\r\n\tentityIds: readonly number[],\r\n): { cardId: string; originEntityId: number }[] => {\r\n\treturn enchantments.filter(\r\n\t\t(enchant) => entityIds.indexOf(enchant.originEntityId) !== -1 || validEnchantments.indexOf(enchant.cardId as CardIds) !== -1,\r\n\t);\r\n};\r\n"]}
@@ -4,3 +4,4 @@ import { CardsData } from '../cards/cards-data';
4
4
  export declare const applyAuras: (board: BoardEntity[], numberOfDeathwingPresents: number, data: CardsData, cards: AllCardsService) => void;
5
5
  export declare const setImplicitData: (board: BoardEntity[], cardsData: CardsData) => void;
6
6
  export declare const removeAuras: (board: BoardEntity[], data: CardsData) => void;
7
+ export declare const removeAurasAfterAuraSourceDeath: (board: BoardEntity[], auraSource: BoardEntity, data: CardsData) => void;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.removeAuras = exports.setImplicitData = exports.applyAuras = void 0;
3
+ exports.removeAurasAfterAuraSourceDeath = exports.removeAuras = exports.setImplicitData = exports.applyAuras = void 0;
4
4
  const reference_data_1 = require("@firestone-hs/reference-data");
5
5
  const utils_1 = require("../utils");
6
6
  const applyAuras = (board, numberOfDeathwingPresents, data, cards) => {
@@ -32,6 +32,17 @@ const removeAuras = (board, data) => {
32
32
  }
33
33
  };
34
34
  exports.removeAuras = removeAuras;
35
+ const removeAurasAfterAuraSourceDeath = (board, auraSource, data) => {
36
+ const auraPair = data.auraEnchantments.find((pair) => pair[0] === auraSource.cardId);
37
+ const auraEnchantmentId = !!auraPair ? auraPair[1] : null;
38
+ if (!auraEnchantmentId) {
39
+ return;
40
+ }
41
+ for (const entity of board) {
42
+ removeAura(entity, auraEnchantmentId, board, auraSource);
43
+ }
44
+ };
45
+ exports.removeAurasAfterAuraSourceDeath = removeAurasAfterAuraSourceDeath;
35
46
  const removeAurasFrom = (entity, board, data) => {
36
47
  for (const enchantment of entity.enchantments) {
37
48
  removeAura(entity, enchantment.cardId, board);
@@ -39,14 +50,6 @@ const removeAurasFrom = (entity, board, data) => {
39
50
  };
40
51
  const applyAura = (board, i, enchantmentId, cards) => {
41
52
  switch (board[i].cardId) {
42
- case "EX1_185":
43
- case "TB_BaconUps_053":
44
- applySiegebreakerAura(board, i, enchantmentId, cards);
45
- return;
46
- case "GVG_021":
47
- case "TB_BaconUps_060":
48
- applyMalGanisAura(board, i, enchantmentId, cards);
49
- return;
50
53
  case "BG21_039":
51
54
  case "BG21_039_G":
52
55
  applyKathranatirAura(board, i, enchantmentId, cards);
@@ -64,16 +67,8 @@ const applyAura = (board, i, enchantmentId, cards) => {
64
67
  return;
65
68
  }
66
69
  };
67
- const removeAura = (entity, enchantmentId, board) => {
70
+ const removeAura = (entity, enchantmentId, board, deadAuraSource = null) => {
68
71
  switch (enchantmentId) {
69
- case "EX1_185e":
70
- case "TB_BaconUps_053e":
71
- removeSiegebreakerAura(entity, enchantmentId);
72
- return;
73
- case "GVG_021e":
74
- case "TB_BaconUps_060e":
75
- removeMalGanisAura(entity, enchantmentId);
76
- return;
77
72
  case "BG21_039e":
78
73
  case "BG21_039_Ge":
79
74
  removeKathranatirAura(entity, enchantmentId);
@@ -86,7 +81,7 @@ const removeAura = (entity, enchantmentId, board) => {
86
81
  case "NEW1_027e":
87
82
  case "VAN_NEW1_027e":
88
83
  case "TB_BaconUps_136e":
89
- removeSouthseaCaptainAura(entity, enchantmentId, board);
84
+ removeSouthseaCaptainAura(entity, enchantmentId, board, deadAuraSource);
90
85
  return;
91
86
  case "TB_BaconShop_HP_061e":
92
87
  removeDeathwingAura(entity, enchantmentId);
@@ -102,33 +97,6 @@ const applyDeathwingAura = (board, enchantmentId) => {
102
97
  }
103
98
  }
104
99
  };
105
- const applySiegebreakerAura = (board, index, enchantmentId, cards) => {
106
- const originEntity = board[index];
107
- for (let i = 0; i < board.length; i++) {
108
- const entity = board[i];
109
- if (i === index || !utils_1.isCorrectTribe(cards.getCard(entity.cardId).race, reference_data_1.Race.DEMON)) {
110
- continue;
111
- }
112
- if (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {
113
- entity.attack += enchantmentId === "TB_BaconUps_053e" ? 2 : 1;
114
- entity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });
115
- }
116
- }
117
- };
118
- const applyMalGanisAura = (board, index, enchantmentId, cards) => {
119
- const originEntity = board[index];
120
- for (let i = 0; i < board.length; i++) {
121
- const entity = board[i];
122
- if (i === index || !utils_1.isCorrectTribe(cards.getCard(entity.cardId).race, reference_data_1.Race.DEMON)) {
123
- continue;
124
- }
125
- if (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {
126
- entity.attack += enchantmentId === "TB_BaconUps_060e" ? 4 : 2;
127
- entity.health += enchantmentId === "TB_BaconUps_060e" ? 4 : 2;
128
- entity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });
129
- }
130
- }
131
- };
132
100
  const applyKathranatirAura = (board, index, enchantmentId, cards) => {
133
101
  const originEntity = board[index];
134
102
  for (let i = 0; i < board.length; i++) {
@@ -147,17 +115,6 @@ const removeDeathwingAura = (entity, enchantmentId) => {
147
115
  entity.attack = Math.max(0, entity.attack - numberOfBuffs * 2);
148
116
  entity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);
149
117
  };
150
- const removeSiegebreakerAura = (entity, enchantmentId) => {
151
- const numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;
152
- entity.attack = Math.max(0, entity.attack - numberOfBuffs * (enchantmentId === "TB_BaconUps_053e" ? 2 : 1));
153
- entity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);
154
- };
155
- const removeMalGanisAura = (entity, enchantmentId) => {
156
- const numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;
157
- entity.attack = Math.max(0, entity.attack - numberOfBuffs * (enchantmentId === "TB_BaconUps_060e" ? 4 : 2));
158
- entity.health = Math.max(1, entity.health - numberOfBuffs * (enchantmentId === "TB_BaconUps_060e" ? 4 : 2));
159
- entity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);
160
- };
161
118
  const removeKathranatirAura = (entity, enchantmentId) => {
162
119
  const numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;
163
120
  entity.attack = Math.max(0, entity.attack - numberOfBuffs * (enchantmentId === "BG21_039_Ge" ? 4 : 2));
@@ -195,14 +152,22 @@ const applySouthseaCaptainAura = (board, index, enchantmentId, cards) => {
195
152
  }
196
153
  }
197
154
  };
198
- const removeSouthseaCaptainAura = (entity, enchantmentId, board) => {
199
- const debug = false && entity.entityId === 3879;
200
- if (debug) {
155
+ const removeSouthseaCaptainAura = (entity, enchantmentId, board, deadAuraSource = null) => {
156
+ if (!deadAuraSource) {
157
+ const buffs = entity.enchantments.filter((e) => e.cardId === enchantmentId && e.originEntityId !== entity.entityId);
158
+ const numberOfBuffs = buffs.length;
159
+ entity.attack = Math.max(0, entity.attack - numberOfBuffs * (enchantmentId === "TB_BaconUps_136e" ? 2 : 1));
160
+ entity.health = Math.max(1, entity.health - numberOfBuffs * (enchantmentId === "TB_BaconUps_136e" ? 2 : 1));
161
+ entity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);
162
+ }
163
+ else {
164
+ const buffs = entity.enchantments.filter((e) => e.cardId === enchantmentId && e.originEntityId === deadAuraSource.entityId);
165
+ const numberOfBuffs = buffs.length;
166
+ entity.attack = Math.max(0, entity.attack - numberOfBuffs * (enchantmentId === "TB_BaconUps_136e" ? 2 : 1));
167
+ entity.health = entity.maxHealth
168
+ ? Math.min(entity.health, entity.maxHealth)
169
+ : Math.max(1, entity.health - numberOfBuffs * (enchantmentId === "TB_BaconUps_136e" ? 2 : 1));
170
+ entity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);
201
171
  }
202
- const buffs = entity.enchantments.filter((e) => e.cardId === enchantmentId && e.originEntityId !== entity.entityId);
203
- const numberOfBuffs = buffs.length;
204
- entity.attack = Math.max(0, entity.attack - numberOfBuffs * (enchantmentId === "TB_BaconUps_136e" ? 2 : 1));
205
- entity.health = Math.max(1, entity.health - numberOfBuffs * (enchantmentId === "TB_BaconUps_136e" ? 2 : 1));
206
- entity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);
207
172
  };
208
173
  //# sourceMappingURL=auras.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auras.js","sourceRoot":"","sources":["../../src/simulation/auras.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService, CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { CardsData } from '../cards/cards-data';\r\nimport { isCorrectTribe } from '../utils';\r\n\r\n// Check if aura is already applied, and if not re-apply it\r\nexport const applyAuras = (board: BoardEntity[], numberOfDeathwingPresents: number, data: CardsData, cards: AllCardsService): void => {\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (data.auraOrigins.indexOf(board[i].cardId) !== -1) {\r\n\t\t\tconst enchantmentId = data.auraEnchantments.find((aura) => aura[0] === board[i].cardId)[1];\r\n\t\t\tapplyAura(board, i, enchantmentId, cards);\r\n\t\t}\r\n\t}\r\n\r\n\tfor (let i = 0; i < numberOfDeathwingPresents; i++) {\r\n\t\tapplyDeathwingAura(board, CardIds.AllWillBurn_AllWillBurnEnchantmentBattlegrounds);\r\n\t}\r\n\t// return board;\r\n};\r\n\r\nexport const setImplicitData = (board: BoardEntity[], cardsData: CardsData): void => {\r\n\tfor (const entity of board) {\r\n\t\tentity.maxHealth = entity.health;\r\n\t\tconst avengeValue = cardsData.avengeValue(entity.cardId);\r\n\t\tif (avengeValue > 0) {\r\n\t\t\tentity.avengeCurrent = avengeValue;\r\n\t\t\tentity.avengeDefault = avengeValue;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const removeAuras = (board: BoardEntity[], data: CardsData): void => {\r\n\tfor (const entity of board) {\r\n\t\tremoveAurasFrom(entity, board, data);\r\n\t}\r\n};\r\n\r\nconst removeAurasFrom = (entity: BoardEntity, board: BoardEntity[], data: CardsData): void => {\r\n\t// let newEntity = entity;\r\n\tfor (const enchantment of entity.enchantments) {\r\n\t\tremoveAura(entity, enchantment.cardId, board);\r\n\t}\r\n\t// return newEntity;\r\n};\r\n\r\nconst applyAura = (board: BoardEntity[], i: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tswitch (board[i].cardId) {\r\n\t\tcase CardIds.SiegebreakerLegacy:\r\n\t\tcase CardIds.SiegebreakerBattlegrounds:\r\n\t\t\tapplySiegebreakerAura(board, i, enchantmentId, cards);\r\n\t\t\treturn;\r\n\t\tcase CardIds.Malganis1:\r\n\t\tcase CardIds.MalganisBattlegrounds:\r\n\t\t\tapplyMalGanisAura(board, i, enchantmentId, cards);\r\n\t\t\treturn;\r\n\t\tcase CardIds.Kathranatir2:\r\n\t\tcase CardIds.KathranatirBattlegrounds:\r\n\t\t\tapplyKathranatirAura(board, i, enchantmentId, cards);\r\n\t\t\treturn;\r\n\t\tcase CardIds.MurlocWarleaderLegacy:\r\n\t\tcase CardIds.MurlocWarleaderVanilla:\r\n\t\tcase CardIds.MurlocWarleaderBattlegrounds:\r\n\t\t\tapplyMurlocWarleaderAura(board, i, enchantmentId, cards);\r\n\t\t\treturn;\r\n\t\tcase CardIds.SouthseaCaptainLegacy:\r\n\t\tcase CardIds.SouthseaCaptainCore:\r\n\t\tcase CardIds.SouthseaCaptainVanilla:\r\n\t\tcase CardIds.SouthseaCaptainBattlegrounds:\r\n\t\t\tapplySouthseaCaptainAura(board, i, enchantmentId, cards);\r\n\t\t\treturn;\r\n\t}\r\n};\r\n\r\nconst removeAura = (entity: BoardEntity, enchantmentId: string, board: BoardEntity[]): void => {\r\n\tswitch (enchantmentId) {\r\n\t\tcase CardIds.Siegebreaker_SiegebreakingLegacyEnchantment:\r\n\t\tcase CardIds.Siegebreaker_SiegebreakingEnchantmentBattlegrounds:\r\n\t\t\tremoveSiegebreakerAura(entity, enchantmentId);\r\n\t\t\treturn;\r\n\t\tcase CardIds.Malganis_GraspOfMalganisEnchantment:\r\n\t\tcase CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds:\r\n\t\t\tremoveMalGanisAura(entity, enchantmentId);\r\n\t\t\treturn;\r\n\t\tcase CardIds.Kathranatir_GraspOfKathranatirEnchantment1:\r\n\t\tcase CardIds.Kathranatir_GraspOfKathranatirEnchantment2:\r\n\t\t\tremoveKathranatirAura(entity, enchantmentId);\r\n\t\t\treturn;\r\n\t\tcase CardIds.MurlocWarleader_MrgglaarglLegacyEnchantment:\r\n\t\tcase CardIds.MurlocWarleader_MrgglaarglVanillaEnchantment:\r\n\t\tcase CardIds.MurlocWarleader_MrgglaarglEnchantmentBattlegrounds:\r\n\t\t\tremoveMurlocWarleaderAura(entity, enchantmentId);\r\n\t\t\treturn;\r\n\t\tcase CardIds.SouthseaCaptain_YarrrLegacyEnchantment:\r\n\t\tcase CardIds.SouthseaCaptain_YarrrVanillaEnchantment:\r\n\t\tcase CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds:\r\n\t\t\tremoveSouthseaCaptainAura(entity, enchantmentId, board);\r\n\t\t\treturn;\r\n\t\tcase CardIds.AllWillBurn_AllWillBurnEnchantmentBattlegrounds:\r\n\t\t\tremoveDeathwingAura(entity, enchantmentId);\r\n\t\t\treturn;\r\n\t\t// case CardIds.WhirlwindTempest_WhirlingEnchantment:\r\n\t\t// \tremoveWhirlwindTempestAura(entity, enchantmentId);\r\n\t\t// \treturn;\r\n\t}\r\n};\r\n\r\nconst applyDeathwingAura = (board: BoardEntity[], enchantmentId: string): void => {\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId)) {\r\n\t\t\tentity.attack += 2;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: undefined });\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst applySiegebreakerAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tconst originEntity = board[index];\r\n\t// const newBoard = [];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.DEMON)) {\r\n\t\t\t// newBoard.push(entity);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n\t\t\tentity.attack += enchantmentId === CardIds.Siegebreaker_SiegebreakingEnchantmentBattlegrounds ? 2 : 1;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst applyMalGanisAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tconst originEntity = board[index];\r\n\t// const newBoard = [];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.DEMON)) {\r\n\t\t\t// newBoard.push(entity);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n\t\t\tentity.attack += enchantmentId === CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds ? 4 : 2;\r\n\t\t\tentity.health += enchantmentId === CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds ? 4 : 2;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n\t\t}\r\n\t}\r\n\t// return newBoard;\r\n};\r\n\r\nconst applyKathranatirAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tconst originEntity = board[index];\r\n\t// const newBoard = [];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.DEMON)) {\r\n\t\t\t// newBoard.push(entity);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n\t\t\tentity.attack += enchantmentId === CardIds.Kathranatir_GraspOfKathranatirEnchantment2 ? 4 : 2;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n\t\t}\r\n\t}\r\n\t// return newBoard;\r\n};\r\n\r\nconst removeDeathwingAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n\tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;\r\n\tentity.attack = Math.max(0, entity.attack - numberOfBuffs * 2);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n\r\nconst removeSiegebreakerAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n\tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;\r\n\tentity.attack = Math.max(\r\n\t\t0,\r\n\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.Siegebreaker_SiegebreakingEnchantmentBattlegrounds ? 2 : 1),\r\n\t);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n\r\nconst removeMalGanisAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n\tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;\r\n\tentity.attack = Math.max(\r\n\t\t0,\r\n\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds ? 4 : 2),\r\n\t);\r\n\tentity.health = Math.max(\r\n\t\t1,\r\n\t\tentity.health - numberOfBuffs * (enchantmentId === CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds ? 4 : 2),\r\n\t);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n\r\nconst removeKathranatirAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n\tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;\r\n\tentity.attack = Math.max(\r\n\t\t0,\r\n\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.Kathranatir_GraspOfKathranatirEnchantment2 ? 4 : 2),\r\n\t);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n\r\nconst applyMurlocWarleaderAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tconst originEntity = board[index];\r\n\t// const newBoard = [];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.MURLOC)) {\r\n\t\t\t// newBoard.push(entity);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n\t\t\tentity.attack += enchantmentId === CardIds.MurlocWarleader_MrgglaarglEnchantmentBattlegrounds ? 4 : 2;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n\t\t}\r\n\t}\r\n\t// return newBoard;\r\n};\r\n\r\nconst removeMurlocWarleaderAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n\tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId && e.originEntityId !== entity.entityId).length;\r\n\tentity.attack = Math.max(\r\n\t\t0,\r\n\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.MurlocWarleader_MrgglaarglEnchantmentBattlegrounds ? 4 : 2),\r\n\t);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n\r\nconst applySouthseaCaptainAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tconst originEntity = board[index];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.PIRATE)) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n\t\t\tentity.attack += enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1;\r\n\t\t\tentity.health += enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1;\r\n\t\t\t// entity.maxHealth += enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n\t\t}\r\n\t}\r\n\t// return newBoard;\r\n};\r\n\r\nconst removeSouthseaCaptainAura = (entity: BoardEntity, enchantmentId: string, board: BoardEntity[]): void => {\r\n\tconst debug = false && entity.entityId === 3879;\r\n\tif (debug) {\r\n\t}\r\n\tconst buffs = entity.enchantments.filter((e) => e.cardId === enchantmentId && e.originEntityId !== entity.entityId);\r\n\tconst numberOfBuffs = buffs.length;\r\n\r\n\t// TODO: there is an issue here. If the minion's health at the end of the turn should be 1, removing then reapplying\r\n\t// the aura actually bumps it to 2\r\n\t// If the buffing entity is still alive, we should ignore this max\r\n\t// However, for now there's a bug, as the app originates the enchantment from an entity ID\r\n\t// that isn't on the board\r\n\t// const existingEnchantingEntity = board.filter((e) => buffs.map((b) => b.originEntityId).includes(e.entityId));\r\n\t// const isBuffingEntityAlive = existingEnchantingEntity.length > 0;\r\n\tentity.attack = Math.max(\r\n\t\t0,\r\n\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1),\r\n\t);\r\n\tentity.health = Math.max(\r\n\t\t1,\r\n\t\tentity.health - numberOfBuffs * (enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1),\r\n\t);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n"]}
1
+ {"version":3,"file":"auras.js","sourceRoot":"","sources":["../../src/simulation/auras.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService, CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { CardsData } from '../cards/cards-data';\r\nimport { isCorrectTribe } from '../utils';\r\n\r\n// Check if aura is already applied, and if not re-apply it\r\nexport const applyAuras = (board: BoardEntity[], numberOfDeathwingPresents: number, data: CardsData, cards: AllCardsService): void => {\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (data.auraOrigins.indexOf(board[i].cardId) !== -1) {\r\n\t\t\tconst enchantmentId = data.auraEnchantments.find((aura) => aura[0] === board[i].cardId)[1];\r\n\t\t\tapplyAura(board, i, enchantmentId, cards);\r\n\t\t}\r\n\t}\r\n\r\n\tfor (let i = 0; i < numberOfDeathwingPresents; i++) {\r\n\t\tapplyDeathwingAura(board, CardIds.AllWillBurn_AllWillBurnEnchantmentBattlegrounds);\r\n\t}\r\n\t// return board;\r\n};\r\n\r\nexport const setImplicitData = (board: BoardEntity[], cardsData: CardsData): void => {\r\n\tfor (const entity of board) {\r\n\t\tentity.maxHealth = entity.health;\r\n\t\tconst avengeValue = cardsData.avengeValue(entity.cardId);\r\n\t\tif (avengeValue > 0) {\r\n\t\t\tentity.avengeCurrent = avengeValue;\r\n\t\t\tentity.avengeDefault = avengeValue;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const removeAuras = (board: BoardEntity[], data: CardsData): void => {\r\n\tfor (const entity of board) {\r\n\t\tremoveAurasFrom(entity, board, data);\r\n\t}\r\n};\r\n\r\nexport const removeAurasAfterAuraSourceDeath = (board: BoardEntity[], auraSource: BoardEntity, data: CardsData): void => {\r\n\tconst auraPair = data.auraEnchantments.find((pair) => pair[0] === auraSource.cardId);\r\n\tconst auraEnchantmentId = !!auraPair ? auraPair[1] : null;\r\n\tif (!auraEnchantmentId) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (const entity of board) {\r\n\t\tremoveAura(entity, auraEnchantmentId, board, auraSource);\r\n\t}\r\n};\r\n\r\nconst removeAurasFrom = (entity: BoardEntity, board: BoardEntity[], data: CardsData): void => {\r\n\t// let newEntity = entity;\r\n\tfor (const enchantment of entity.enchantments) {\r\n\t\tremoveAura(entity, enchantment.cardId, board);\r\n\t}\r\n\t// return newEntity;\r\n};\r\n\r\nconst applyAura = (board: BoardEntity[], i: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tswitch (board[i].cardId) {\r\n\t\t// case CardIds.SiegebreakerLegacy:\r\n\t\t// case CardIds.SiegebreakerBattlegrounds:\r\n\t\t// \tapplySiegebreakerAura(board, i, enchantmentId, cards);\r\n\t\t// \treturn;\r\n\t\t// case CardIds.Malganis1:\r\n\t\t// case CardIds.MalganisBattlegrounds:\r\n\t\t// \tapplyMalGanisAura(board, i, enchantmentId, cards);\r\n\t\t// \treturn;\r\n\t\tcase CardIds.Kathranatir2:\r\n\t\tcase CardIds.KathranatirBattlegrounds:\r\n\t\t\tapplyKathranatirAura(board, i, enchantmentId, cards);\r\n\t\t\treturn;\r\n\t\tcase CardIds.MurlocWarleaderLegacy:\r\n\t\tcase CardIds.MurlocWarleaderVanilla:\r\n\t\tcase CardIds.MurlocWarleaderBattlegrounds:\r\n\t\t\tapplyMurlocWarleaderAura(board, i, enchantmentId, cards);\r\n\t\t\treturn;\r\n\t\tcase CardIds.SouthseaCaptainLegacy:\r\n\t\tcase CardIds.SouthseaCaptainCore:\r\n\t\tcase CardIds.SouthseaCaptainVanilla:\r\n\t\tcase CardIds.SouthseaCaptainBattlegrounds:\r\n\t\t\tapplySouthseaCaptainAura(board, i, enchantmentId, cards);\r\n\t\t\treturn;\r\n\t}\r\n};\r\n\r\nconst removeAura = (entity: BoardEntity, enchantmentId: string, board: BoardEntity[], deadAuraSource: BoardEntity = null): void => {\r\n\tswitch (enchantmentId) {\r\n\t\t// case CardIds.Siegebreaker_SiegebreakingLegacyEnchantment:\r\n\t\t// case CardIds.Siegebreaker_SiegebreakingEnchantmentBattlegrounds:\r\n\t\t// \tremoveSiegebreakerAura(entity, enchantmentId);\r\n\t\t// \treturn;\r\n\t\t// case CardIds.Malganis_GraspOfMalganisEnchantment:\r\n\t\t// case CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds:\r\n\t\t// \tremoveMalGanisAura(entity, enchantmentId);\r\n\t\t// \treturn;\r\n\t\tcase CardIds.Kathranatir_GraspOfKathranatirEnchantment1:\r\n\t\tcase CardIds.Kathranatir_GraspOfKathranatirEnchantment2:\r\n\t\t\tremoveKathranatirAura(entity, enchantmentId);\r\n\t\t\treturn;\r\n\t\tcase CardIds.MurlocWarleader_MrgglaarglLegacyEnchantment:\r\n\t\tcase CardIds.MurlocWarleader_MrgglaarglVanillaEnchantment:\r\n\t\tcase CardIds.MurlocWarleader_MrgglaarglEnchantmentBattlegrounds:\r\n\t\t\tremoveMurlocWarleaderAura(entity, enchantmentId);\r\n\t\t\treturn;\r\n\t\tcase CardIds.SouthseaCaptain_YarrrLegacyEnchantment:\r\n\t\tcase CardIds.SouthseaCaptain_YarrrVanillaEnchantment:\r\n\t\tcase CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds:\r\n\t\t\tremoveSouthseaCaptainAura(entity, enchantmentId, board, deadAuraSource);\r\n\t\t\treturn;\r\n\t\tcase CardIds.AllWillBurn_AllWillBurnEnchantmentBattlegrounds:\r\n\t\t\tremoveDeathwingAura(entity, enchantmentId);\r\n\t\t\treturn;\r\n\t\t// case CardIds.WhirlwindTempest_WhirlingEnchantment:\r\n\t\t// \tremoveWhirlwindTempestAura(entity, enchantmentId);\r\n\t\t// \treturn;\r\n\t}\r\n};\r\n\r\nconst applyDeathwingAura = (board: BoardEntity[], enchantmentId: string): void => {\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId)) {\r\n\t\t\tentity.attack += 2;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: undefined });\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// const applySiegebreakerAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n// \tconst originEntity = board[index];\r\n// \t// const newBoard = [];\r\n// \tfor (let i = 0; i < board.length; i++) {\r\n// \t\tconst entity = board[i];\r\n// \t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.DEMON)) {\r\n// \t\t\t// newBoard.push(entity);\r\n// \t\t\tcontinue;\r\n// \t\t}\r\n\r\n// \t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n// \t\t\tentity.attack += enchantmentId === CardIds.Siegebreaker_SiegebreakingEnchantmentBattlegrounds ? 2 : 1;\r\n// \t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n// \t\t}\r\n// \t}\r\n// };\r\n\r\n// const applyMalGanisAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n// \tconst originEntity = board[index];\r\n// \t// const newBoard = [];\r\n// \tfor (let i = 0; i < board.length; i++) {\r\n// \t\tconst entity = board[i];\r\n// \t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.DEMON)) {\r\n// \t\t\t// newBoard.push(entity);\r\n// \t\t\tcontinue;\r\n// \t\t}\r\n\r\n// \t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n// \t\t\tentity.attack += enchantmentId === CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds ? 4 : 2;\r\n// \t\t\tentity.health += enchantmentId === CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds ? 4 : 2;\r\n// \t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n// \t\t}\r\n// \t}\r\n// \t// return newBoard;\r\n// };\r\n\r\nconst applyKathranatirAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tconst originEntity = board[index];\r\n\t// const newBoard = [];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.DEMON)) {\r\n\t\t\t// newBoard.push(entity);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n\t\t\tentity.attack += enchantmentId === CardIds.Kathranatir_GraspOfKathranatirEnchantment2 ? 4 : 2;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n\t\t}\r\n\t}\r\n\t// return newBoard;\r\n};\r\n\r\nconst removeDeathwingAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n\tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;\r\n\tentity.attack = Math.max(0, entity.attack - numberOfBuffs * 2);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n\r\n// const removeSiegebreakerAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n// \tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;\r\n// \tentity.attack = Math.max(\r\n// \t\t0,\r\n// \t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.Siegebreaker_SiegebreakingEnchantmentBattlegrounds ? 2 : 1),\r\n// \t);\r\n// \tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n// };\r\n\r\n// const removeMalGanisAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n// \tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;\r\n// \tentity.attack = Math.max(\r\n// \t\t0,\r\n// \t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds ? 4 : 2),\r\n// \t);\r\n// \tentity.health = Math.max(\r\n// \t\t1,\r\n// \t\tentity.health - numberOfBuffs * (enchantmentId === CardIds.Malganis_GraspOfMalganisEnchantmentBattlegrounds ? 4 : 2),\r\n// \t);\r\n// \tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n// };\r\n\r\nconst removeKathranatirAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n\tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId).length;\r\n\tentity.attack = Math.max(\r\n\t\t0,\r\n\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.Kathranatir_GraspOfKathranatirEnchantment2 ? 4 : 2),\r\n\t);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n\r\nconst applyMurlocWarleaderAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tconst originEntity = board[index];\r\n\t// const newBoard = [];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.MURLOC)) {\r\n\t\t\t// newBoard.push(entity);\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n\t\t\tentity.attack += enchantmentId === CardIds.MurlocWarleader_MrgglaarglEnchantmentBattlegrounds ? 4 : 2;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n\t\t}\r\n\t}\r\n\t// return newBoard;\r\n};\r\n\r\nconst removeMurlocWarleaderAura = (entity: BoardEntity, enchantmentId: string): void => {\r\n\tconst numberOfBuffs = entity.enchantments.filter((e) => e.cardId === enchantmentId && e.originEntityId !== entity.entityId).length;\r\n\tentity.attack = Math.max(\r\n\t\t0,\r\n\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.MurlocWarleader_MrgglaarglEnchantmentBattlegrounds ? 4 : 2),\r\n\t);\r\n\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n};\r\n\r\nconst applySouthseaCaptainAura = (board: BoardEntity[], index: number, enchantmentId: string, cards: AllCardsService): void => {\r\n\tconst originEntity = board[index];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tconst entity = board[i];\r\n\t\tif (i === index || !isCorrectTribe(cards.getCard(entity.cardId).race, Race.PIRATE)) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!entity.enchantments.some((aura) => aura.cardId === enchantmentId && aura.originEntityId === originEntity.entityId)) {\r\n\t\t\tentity.attack += enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1;\r\n\t\t\tentity.health += enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1;\r\n\t\t\t// entity.maxHealth += enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1;\r\n\t\t\tentity.enchantments.push({ cardId: enchantmentId, originEntityId: originEntity.entityId });\r\n\t\t}\r\n\t}\r\n\t// return newBoard;\r\n};\r\n\r\nconst removeSouthseaCaptainAura = (\r\n\tentity: BoardEntity,\r\n\tenchantmentId: string,\r\n\tboard: BoardEntity[],\r\n\tdeadAuraSource: BoardEntity = null,\r\n): void => {\r\n\tif (!deadAuraSource) {\r\n\t\t// console.log('removing aura', stringifySimpleCard(entity), entity.maxHealth);\r\n\t\tconst buffs = entity.enchantments.filter((e) => e.cardId === enchantmentId && e.originEntityId !== entity.entityId);\r\n\t\tconst numberOfBuffs = buffs.length;\r\n\r\n\t\tentity.attack = Math.max(\r\n\t\t\t0,\r\n\t\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1),\r\n\t\t);\r\n\r\n\t\t// entity.health = entity.maxHealth\r\n\t\t// \t? Math.min(entity.health, entity.maxHealth)\r\n\t\t// \t: Math.max(1, entity.health - numberOfBuffs * (enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1));\r\n\t\tentity.health = Math.max(\r\n\t\t\t1,\r\n\t\t\tentity.health - numberOfBuffs * (enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1),\r\n\t\t);\r\n\t\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n\t\t// console.log('removed aura', stringifySimpleCard(entity), entity.maxHealth);\r\n\t}\r\n\t// Special case where the source dies, health is treated differently\r\n\telse {\r\n\t\t// console.log('removing aura after source death', stringifySimpleCard(entity), entity.maxHealth);\r\n\t\tconst buffs = entity.enchantments.filter((e) => e.cardId === enchantmentId && e.originEntityId === deadAuraSource.entityId);\r\n\t\tconst numberOfBuffs = buffs.length;\r\n\r\n\t\tentity.attack = Math.max(\r\n\t\t\t0,\r\n\t\t\tentity.attack - numberOfBuffs * (enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1),\r\n\t\t);\r\n\t\tentity.health = entity.maxHealth\r\n\t\t\t? Math.min(entity.health, entity.maxHealth)\r\n\t\t\t: Math.max(\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tentity.health - numberOfBuffs * (enchantmentId === CardIds.SouthseaCaptain_YarrrEnchantmentBattlegrounds ? 2 : 1),\r\n\t\t\t );\r\n\t\tentity.enchantments = entity.enchantments.filter((aura) => aura.cardId !== enchantmentId);\r\n\t\t// console.log('removed aura after source death', stringifySimpleCard(entity), entity.maxHealth);\r\n\t}\r\n};\r\n"]}
@@ -5,6 +5,7 @@ const reference_data_1 = require("@firestone-hs/reference-data");
5
5
  const utils_1 = require("../services/utils");
6
6
  const utils_2 = require("../utils");
7
7
  const attack_1 = require("./attack");
8
+ const auras_1 = require("./auras");
8
9
  const deathrattle_spawns_1 = require("./deathrattle-spawns");
9
10
  const handleDeathrattleEffects = (boardWithDeadEntity, boardWithDeadEntityHero, deadEntity, otherBoard, otherBoardHero, allCards, cardsData, sharedState, spectator) => {
10
11
  var _a;
@@ -201,6 +202,9 @@ const applyMinionDeathEffect = (deadEntity, deadEntityIndex, boardWithDeadEntity
201
202
  removeOldMurkEyeAttack(boardWithDeadEntity, allCards);
202
203
  removeOldMurkEyeAttack(otherBoard, allCards);
203
204
  }
205
+ if (cardsData.auraOrigins.includes(deadEntity.cardId)) {
206
+ auras_1.removeAurasAfterAuraSourceDeath(boardWithDeadEntity, deadEntity, cardsData);
207
+ }
204
208
  if (deadEntity.taunt) {
205
209
  }
206
210
  if (deadEntity.health < 0 && ((_a = deadEntity.lastAffectedByEntity) === null || _a === void 0 ? void 0 : _a.attacking)) {
@@ -1 +1 @@
1
- {"version":3,"file":"deathrattle-effects.js","sourceRoot":"","sources":["../../src/simulation/deathrattle-effects.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService, CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { CardsData } from '../cards/cards-data';\r\nimport { groupByFunction } from '../services/utils';\r\nimport { afterStatsUpdate, getRaceEnum, hasCorrectTribe, isCorrectTribe, modifyAttack, modifyHealth } from '../utils';\r\nimport { bumpEntities, dealDamageToEnemy, dealDamageToRandomEnemy, getNeighbours } from './attack';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { SharedState } from './shared-state';\r\nimport { Spectator } from './spectator/spectator';\r\n\r\nexport const handleDeathrattleEffects = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst rivendare = boardWithDeadEntity.find((entity) => entity.cardId === CardIds.BaronRivendare2);\r\n\tconst goldenRivendare = boardWithDeadEntity.find((entity) => entity.cardId === CardIds.BaronRivendareBattlegrounds);\r\n\tconst multiplier = goldenRivendare ? 3 : rivendare ? 2 : 1;\r\n\t// We do it on a case by case basis so that we deal all the damage in one go for instance\r\n\t// and avoid proccing deathrattle spawns between the times the damage triggers\r\n\tswitch (deadEntity.cardId) {\r\n\t\tcase CardIds.SelflessHero:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SelflessHeroBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, spectator);\r\n\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.NadinaTheRed:\r\n\t\tcase CardIds.NadinaTheRedBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantAllDivineShield(boardWithDeadEntity, 'DRAGON', allCards);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SpawnOfNzoth:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 1, multiplier * 1, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SpawnOfNzothBattlegrounds:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 2, multiplier * 2, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.GoldrinnTheGreatWolf:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 5, multiplier * 5, allCards, spectator, 'BEAST');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.GoldrinnTheGreatWolfBattlegrounds:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 10, multiplier * 10, allCards, spectator, 'BEAST');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.KingBagurgle:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 2, multiplier * 2, allCards, spectator, 'MURLOC');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.KingBagurgleBattlegrounds:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 4, multiplier * 4, allCards, spectator, 'MURLOC');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.FiendishServant:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.FiendishServantBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ImpulsiveTrickster:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ImpulsiveTricksterBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Leapfrogger:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, false, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.LeapfroggerBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocolisk:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tconst target = grantRandomStats(deadEntity, boardWithDeadEntity, 6, 6, Race.BEAST, allCards, spectator);\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocoliskBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tconst target = grantRandomStats(deadEntity, boardWithDeadEntity, 12, 12, Race.BEAST, allCards, spectator);\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.LeapfroggerBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.KaboomBot:\r\n\t\t\t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t4,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.KaboomBotBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t4,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t4,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t// It's important to first copy the enchantments, otherwise you could end up\r\n\t// in an infinite loop - since new enchants are added after each step\r\n\tlet enchantments: { cardId: string; originEntityId?: number; repeats?: number }[] = [...(deadEntity.enchantments ?? [])];\r\n\tconst threshold = 20;\r\n\tif (enchantments.length > threshold || enchantments.some((e) => e.repeats && e.repeats > 1)) {\r\n\t\t// console.warn(\r\n\t\t// \t'too many enchtments, truncating',\r\n\t\t// \tstringifySimpleCard(deadEntity),\r\n\t\t// \tdeadEntity.enchantments.length,\r\n\t\t// \tdeadEntity.enchantments,\r\n\t\t// );\r\n\t\t// In some cases it's possible that there are way too many enchantments because of the frog\r\n\t\t// In that case, we make a trade-off and don't trigger the \"on stats change\" trigger as\r\n\t\t// often as we should, so that we can have the stats themselves correct\r\n\t\tconst enchantmentGroups = groupByFunction((enchantment) => enchantment.cardId)(enchantments);\r\n\t\tenchantments = Object.keys(enchantmentGroups).map((cardId) => ({\r\n\t\t\tcardId: cardId,\r\n\t\t\trepeats: enchantmentGroups[cardId].length,\r\n\t\t}));\r\n\t}\r\n\tfor (const enchantment of enchantments) {\r\n\t\tswitch (enchantment.cardId) {\r\n\t\t\tcase CardIds.Leapfrogger_LeapfrogginEnchantment1:\r\n\t\t\t\tif (!!enchantment.repeats && enchantment.repeats > 1) {\r\n\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, false, allCards, spectator, multiplier * enchantment.repeats);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, false, allCards, spectator);\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.Leapfrogger_LeapfrogginEnchantment2:\r\n\t\t\t\tif (!!enchantment.repeats && enchantment.repeats > 1) {\r\n\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator, multiplier * enchantment.repeats);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator);\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\r\nconst applyLeapFroggerEffect = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tdeadEntity: BoardEntity,\r\n\tisPremium: boolean,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n\tmultiplier = 1,\r\n): void => {\r\n\tmultiplier = multiplier || 1;\r\n\tconst buffed = grantRandomStats(\r\n\t\tdeadEntity,\r\n\t\tboardWithDeadEntity,\r\n\t\tmultiplier * (isPremium ? 2 : 1),\r\n\t\tmultiplier * (isPremium ? 2 : 1),\r\n\t\tRace.BEAST,\r\n\t\tallCards,\r\n\t\tspectator,\r\n\t);\r\n\tif (buffed) {\r\n\t\tbuffed.enchantments = buffed.enchantments ?? [];\r\n\t\tbuffed.enchantments.push({\r\n\t\t\tcardId: isPremium ? CardIds.Leapfrogger_LeapfrogginEnchantment2 : CardIds.Leapfrogger_LeapfrogginEnchantment1,\r\n\t\t\toriginEntityId: deadEntity.entityId,\r\n\t\t\trepeats: multiplier > 1 ? multiplier : undefined,\r\n\t\t});\r\n\t\t// Don't register power effect here, since it's already done in the random stats\r\n\t\t// spectator.registerPowerTarget(deadEntity, buffed, boardWithDeadEntity);\r\n\t\t// console.log('applyLeapFroggerEffect', stringifySimpleCard(deadEntity), stringifySimpleCard(buffed));\r\n\t}\r\n};\r\n\r\nconst getRandomMinion = (board: BoardEntity[], race: Race, allCards: AllCardsService): BoardEntity => {\r\n\tconst validTribes = board.filter((e) => !race || isCorrectTribe(allCards.getCard(e.cardId).race, race));\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\treturn validTribes[Math.floor(Math.random() * validTribes.length)];\r\n};\r\n\r\nconst 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\nexport const addStatsToBoard = (\r\n\tsourceEntity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tattack: number,\r\n\thealth: number,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n\ttribe?: string,\r\n): void => {\r\n\tfor (const entity of board) {\r\n\t\tif (!tribe || isCorrectTribe(allCards.getCard(entity.cardId).race, Race[tribe])) {\r\n\t\t\tmodifyAttack(entity, attack, board, allCards);\r\n\t\t\tmodifyHealth(entity, health);\r\n\t\t\tafterStatsUpdate(entity, board, allCards);\r\n\t\t\tspectator.registerPowerTarget(sourceEntity, entity, board);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const applyMinionDeathEffect = (\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndex: number,\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\t// console.log('applying minion death effect', stringifySimpleCard(deadEntity, allCards));\r\n\tif (isCorrectTribe(allCards.getCard(deadEntity.cardId).race, Race.BEAST)) {\r\n\t\tapplyScavengingHyenaEffect(boardWithDeadEntity, allCards, spectator);\r\n\t}\r\n\tif (isCorrectTribe(allCards.getCard(deadEntity.cardId).race, Race.DEMON)) {\r\n\t\tapplySoulJugglerEffect(\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\tif (isCorrectTribe(allCards.getCard(deadEntity.cardId).race, Race.MECH)) {\r\n\t\tapplyJunkbotEffect(boardWithDeadEntity, allCards, spectator);\r\n\t}\r\n\tif (hasCorrectTribe(deadEntity, Race.MURLOC, allCards)) {\r\n\t\tremoveOldMurkEyeAttack(boardWithDeadEntity, allCards);\r\n\t\tremoveOldMurkEyeAttack(otherBoard, allCards);\r\n\t}\r\n\r\n\tif (deadEntity.taunt) {\r\n\t\t// applyQirajiHarbringerEffect(boardWithDeadEntity, deadEntityIndex, allCards);\r\n\t}\r\n\t// Overkill\r\n\tif (deadEntity.health < 0 && deadEntity.lastAffectedByEntity?.attacking) {\r\n\t\tif (deadEntity.lastAffectedByEntity.cardId === CardIds.HeraldOfFlame2) {\r\n\t\t\tconst targets = boardWithDeadEntity.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\t\t\tif (targets.length > 0) {\r\n\t\t\t\tconst target = targets[0];\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tdeadEntity.lastAffectedByEntity,\r\n\t\t\t\t\t3,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.HeraldOfFlameBattlegrounds) {\r\n\t\t\tconst targets = boardWithDeadEntity.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\t\t\tif (targets.length > 0) {\r\n\t\t\t\tconst target = targets[0];\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tdeadEntity.lastAffectedByEntity,\r\n\t\t\t\t\t6,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.WildfireElemental) {\r\n\t\t\t// console.log('applying WildfireElemental effect', stringifySimple(boardWithDeadEntity, allCards));\r\n\t\t\tconst excessDamage = -deadEntity.health;\r\n\t\t\tconst neighbours = getNeighbours(boardWithDeadEntity, null, deadEntityIndex);\r\n\t\t\t// console.log('neighbours', stringifySimple(neighbours, allCards));\r\n\t\t\tif (neighbours.length > 0) {\r\n\t\t\t\tconst randomTarget = neighbours[Math.floor(Math.random() * neighbours.length)];\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\trandomTarget,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tnull,\r\n\t\t\t\t\texcessDamage,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.WildfireElementalBattlegrounds) {\r\n\t\t\tconst excessDamage = -deadEntity.health;\r\n\t\t\tconst neighbours = getNeighbours(boardWithDeadEntity, null, deadEntityIndex);\r\n\t\t\tneighbours.forEach((neighbour) =>\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tnull,\r\n\t\t\t\t\texcessDamage,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.IronhideDirehorn) {\r\n\t\t\tconst newEntities = spawnEntities(\r\n\t\t\t\tCardIds.IronhideDirehorn_IronhideRuntToken,\r\n\t\t\t\t1,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t\t!deadEntity.friendly,\r\n\t\t\t\ttrue,\r\n\t\t\t);\r\n\t\t\totherBoard.splice(deadEntityIndex, 0, ...newEntities);\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.IronhideDirehornBattlegrounds) {\r\n\t\t\tconst newEntities = spawnEntities(\r\n\t\t\t\tCardIds.IronhideDirehorn_IronhideRuntTokenBattlegrounds,\r\n\t\t\t\t1,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t\t!deadEntity.friendly,\r\n\t\t\t\ttrue,\r\n\t\t\t);\r\n\t\t\totherBoard.splice(deadEntityIndex, 0, ...newEntities);\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.SeabreakerGoliath2) {\r\n\t\t\tconst otherPirates = otherBoard\r\n\t\t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId).race, Race.PIRATE))\r\n\t\t\t\t.filter((entity) => entity.entityId !== deadEntity.lastAffectedByEntity.entityId);\r\n\t\t\totherPirates.forEach((pirate) => {\r\n\t\t\t\tmodifyAttack(pirate, 2, boardWithDeadEntity, allCards);\r\n\t\t\t\tmodifyHealth(pirate, 2);\r\n\t\t\t\tafterStatsUpdate(pirate, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(deadEntity.lastAffectedByEntity, pirate, otherBoard);\r\n\t\t\t});\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.SeabreakerGoliathBattlegrounds) {\r\n\t\t\tconst otherPirates = otherBoard\r\n\t\t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId).race, Race.PIRATE))\r\n\t\t\t\t.filter((entity) => entity.entityId !== deadEntity.lastAffectedByEntity.entityId);\r\n\t\t\totherPirates.forEach((pirate) => {\r\n\t\t\t\tmodifyAttack(pirate, 4, boardWithDeadEntity, allCards);\r\n\t\t\t\tmodifyHealth(pirate, 4);\r\n\t\t\t\tafterStatsUpdate(pirate, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(deadEntity.lastAffectedByEntity, pirate, otherBoard);\r\n\t\t\t});\r\n\t\t}\r\n\t\t// else if (deadEntity.lastAffectedByEntity.cardId === CardIds.NatPagleExtremeAngler) {\r\n\t\t// }\r\n\t}\r\n\r\n\tconst rivendare = boardWithDeadEntity.find((entity) => entity.cardId === CardIds.BaronRivendare2);\r\n\tconst goldenRivendare = boardWithDeadEntity.find((entity) => entity.cardId === CardIds.BaronRivendareBattlegrounds);\r\n\tconst multiplier = goldenRivendare ? 3 : rivendare ? 2 : 1;\r\n\tif (deadEntity.cardId === CardIds.UnstableGhoul) {\r\n\t\tdealDamageToAllMinions(\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tdeadEntity,\r\n\t\t\tmultiplier * 1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t} else if (deadEntity.cardId === CardIds.UnstableGhoulBattlegrounds) {\r\n\t\tdealDamageToAllMinions(\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tdeadEntity,\r\n\t\t\tmultiplier * 2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\r\n\t// Avenge\r\n\tupdateAvengeCounters(boardWithDeadEntity);\r\n\tconst avengers = boardWithDeadEntity.filter((e) => !!e.avengeDefault && e.avengeCurrent === 0);\r\n\tfor (const avenger of avengers) {\r\n\t\thandleAvenge(\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\tavenger,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t\tallCards,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nconst updateAvengeCounters = (board: readonly BoardEntity[]) => {\r\n\tfor (const entity of board) {\r\n\t\tif (entity.avengeDefault) {\r\n\t\t\tentity.avengeCurrent -= 1;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleAvenge = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\tavenger: BoardEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n\tallCards: AllCardsService,\r\n) => {\r\n\t// Don't forget to update the avenge data in cards-data\r\n\tswitch (avenger.cardId) {\r\n\t\tcase CardIds.BirdBuddy:\r\n\t\t\taddStatsToBoard(avenger, boardWithDeadEntity, 1, 1, allCards, spectator, 'BEAST');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.BirdBuddyBattlegrounds:\r\n\t\t\taddStatsToBoard(avenger, boardWithDeadEntity, 2, 2, allCards, spectator, 'BEAST');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.BuddingGreenthumb:\r\n\t\tcase CardIds.BuddingGreenthumbBattlegrounds:\r\n\t\t\tconst neighbours = getNeighbours(boardWithDeadEntity, avenger);\r\n\t\t\tneighbours.forEach((entity) => {\r\n\t\t\t\tmodifyAttack(entity, avenger.cardId === CardIds.BuddingGreenthumbBattlegrounds ? 4 : 2, boardWithDeadEntity, allCards);\r\n\t\t\t\tmodifyHealth(entity, avenger.cardId === CardIds.BuddingGreenthumbBattlegrounds ? 2 : 1);\r\n\t\t\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(avenger, entity, boardWithDeadEntity);\r\n\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocolisk:\r\n\t\t\tconst target1 = grantRandomStats(avenger, boardWithDeadEntity, 6, 6, Race.BEAST, allCards, spectator);\r\n\t\t\tif (!!target1) {\r\n\t\t\t\tspectator.registerPowerTarget(avenger, target1, boardWithDeadEntity);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocoliskBattlegrounds:\r\n\t\t\tconst target2 = grantRandomStats(avenger, boardWithDeadEntity, 12, 12, Race.BEAST, allCards, spectator);\r\n\t\t\tif (!!target2) {\r\n\t\t\t\tspectator.registerPowerTarget(avenger, target2, boardWithDeadEntity);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ImpatientDoomsayer:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ImpatientDoomsayerBattlegrounds:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 2, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.WitchwingNestmatron:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.WitchwingNestmatronBattlegrounds:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 2, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Sisefin:\r\n\t\t\tconst murloc = getRandomMinion(boardWithDeadEntity, Race.MURLOC, allCards);\r\n\t\t\tif (murloc) {\r\n\t\t\t\tmurloc.poisonous = true;\r\n\t\t\t\tspectator.registerPowerTarget(avenger, murloc, boardWithDeadEntity);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SisefinBattlegrounds:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tconst murloc2 = getRandomMinion(boardWithDeadEntity, Race.MURLOC, allCards);\r\n\t\t\t\tif (murloc2) {\r\n\t\t\t\t\tmurloc2.poisonous = true;\r\n\t\t\t\t\tspectator.registerPowerTarget(avenger, murloc2, boardWithDeadEntity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.MechanoTank:\r\n\t\t\tdealDamageToEnemy(\r\n\t\t\t\t// This can be null if the avenge triggers when the last enemy minion dies as well\r\n\t\t\t\tgetRandomMinionWithHighestHealth(otherBoard),\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tavenger,\r\n\t\t\t\t6,\r\n\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.MechanoTankBattlegrounds:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\tgetRandomMinionWithHighestHealth(otherBoard),\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tavenger,\r\n\t\t\t\t\t6,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TonyTwoTusk:\r\n\t\t\tconst nonGoldenMinions = boardWithDeadEntity\r\n\t\t\t\t.filter((e) => e.entityId !== avenger.entityId)\r\n\t\t\t\t.filter((e) => {\r\n\t\t\t\t\tconst ref = allCards.getCard(e.cardId);\r\n\t\t\t\t\treturn !!ref.battlegroundsPremiumDbfId && !!allCards.getCardFromDbfId(ref.battlegroundsPremiumDbfId).id;\r\n\t\t\t\t});\r\n\t\t\tconst pirate = getRandomMinion(nonGoldenMinions, Race.PIRATE, allCards);\r\n\t\t\tif (pirate) {\r\n\t\t\t\tconst refCard = allCards.getCard(pirate.cardId);\r\n\t\t\t\tconst goldenCard = allCards.getCardFromDbfId(refCard.battlegroundsPremiumDbfId);\r\n\t\t\t\tpirate.cardId = goldenCard.id;\r\n\t\t\t\tspectator.registerPowerTarget(avenger, pirate, boardWithDeadEntity);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TonyTwoTuskBattlegrounds:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tconst nonGoldenMinions = boardWithDeadEntity.filter((e) => {\r\n\t\t\t\t\tconst ref = allCards.getCard(e.cardId);\r\n\t\t\t\t\treturn !!ref.battlegroundsPremiumDbfId;\r\n\t\t\t\t});\r\n\t\t\t\tconst pirate = getRandomMinion(nonGoldenMinions, Race.PIRATE, allCards);\r\n\t\t\t\tif (pirate) {\r\n\t\t\t\t\tconst refCard = allCards.getCard(pirate.cardId);\r\n\t\t\t\t\tpirate.cardId = refCard.id;\r\n\t\t\t\t\tspectator.registerPowerTarget(avenger, pirate, boardWithDeadEntity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t}\r\n\tavenger.avengeCurrent = avenger.avengeDefault;\r\n};\r\n\r\nexport const dealDamageToAllMinions = (\r\n\tboard1: BoardEntity[],\r\n\tboard1Hero: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tboard2Hero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity,\r\n\tdamageDealt: number,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (board1.length === 0 && board2.length === 0) {\r\n\t\treturn;\r\n\t\t// return [board1, board2];\r\n\t}\r\n\t// let updatedBoard1 = [...board1];\r\n\t// let updatedBoard2 = [...board2];\r\n\tconst fakeAttacker = {\r\n\t\t...(damageSource || {}),\r\n\t\tentityId: -1,\r\n\t\tattack: damageDealt,\r\n\t\tattacking: true,\r\n\t} as BoardEntity;\r\n\tfor (let i = 0; i < board1.length; i++) {\r\n\t\tbumpEntities(board1[i], fakeAttacker, board1, board1Hero, board2, board2Hero, allCards, cardsData, sharedState, spectator);\r\n\t\t// board1[i] = entity;\r\n\t}\r\n\tfor (let i = 0; i < board2.length; i++) {\r\n\t\tbumpEntities(board2[i], fakeAttacker, board2, board2Hero, board1, board1Hero, allCards, cardsData, sharedState, spectator);\r\n\t\t// updatedBoard2 = [...boardResult];\r\n\t\t// updatedBoard2[i] = entity;\r\n\t}\r\n\t// processMinionDeath(board1, board1Hero, board2, board2Hero, allCards, cardsData, sharedState, spectator);\r\n};\r\n\r\nconst applySoulJugglerEffect = (\r\n\tboardWithJugglers: BoardEntity[],\r\n\tboardWithJugglersHero: BgsPlayerEntity,\r\n\tboardToAttack: BoardEntity[],\r\n\tboardToAttackHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (boardWithJugglers.length === 0 && boardToAttack.length === 0) {\r\n\t\treturn;\r\n\t\t// return [boardWithJugglers, boardToAttack];\r\n\t}\r\n\tconst jugglers = boardWithJugglers.filter((entity) => entity.cardId === CardIds.SoulJuggler);\r\n\tfor (const juggler of jugglers) {\r\n\t\tdealDamageToRandomEnemy(\r\n\t\t\tboardToAttack,\r\n\t\t\tboardToAttackHero,\r\n\t\t\tjuggler,\r\n\t\t\t3,\r\n\t\t\tboardWithJugglers,\r\n\t\t\tboardWithJugglersHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\tconst goldenJugglers = boardWithJugglers.filter((entity) => entity.cardId === CardIds.SoulJugglerBattlegrounds);\r\n\tfor (const juggler of goldenJugglers) {\r\n\t\tdealDamageToRandomEnemy(\r\n\t\t\tboardToAttack,\r\n\t\t\tboardToAttackHero,\r\n\t\t\tjuggler,\r\n\t\t\t3,\r\n\t\t\tboardWithJugglers,\r\n\t\t\tboardWithJugglersHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\tdealDamageToRandomEnemy(\r\n\t\t\tboardToAttack,\r\n\t\t\tboardToAttackHero,\r\n\t\t\tjuggler,\r\n\t\t\t3,\r\n\t\t\tboardWithJugglers,\r\n\t\t\tboardWithJugglersHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\t// processMinionDeath(\r\n\t// \tboardWithJugglers,\r\n\t// \tboardWithJugglersHero,\r\n\t// \tboardToAttack,\r\n\t// \tboardToAttackHero,\r\n\t// \tallCards,\r\n\t// \tcardsData,\r\n\t// \tsharedState,\r\n\t// \tspectator,\r\n\t// );\r\n};\r\n\r\nconst applyScavengingHyenaEffect = (board: BoardEntity[], allCards: AllCardsService, spectator: Spectator): void => {\r\n\t// const copy = [...board];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].cardId === CardIds.ScavengingHyenaLegacy) {\r\n\t\t\tmodifyAttack(board[i], 2, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 1);\r\n\t\t\tafterStatsUpdate(board[i], board, allCards);\r\n\t\t\tspectator.registerPowerTarget(board[i], board[i], board);\r\n\t\t} else if (board[i].cardId === CardIds.ScavengingHyenaBattlegrounds) {\r\n\t\t\tmodifyAttack(board[i], 4, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 2);\r\n\t\t\tafterStatsUpdate(board[i], board, allCards);\r\n\t\t\tspectator.registerPowerTarget(board[i], board[i], board);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst applyJunkbotEffect = (board: BoardEntity[], allCards: AllCardsService, spectator: Spectator): void => {\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].cardId === CardIds.Junkbot) {\r\n\t\t\tmodifyAttack(board[i], 2, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 2);\r\n\t\t\tafterStatsUpdate(board[i], board, allCards);\r\n\t\t\tspectator.registerPowerTarget(board[i], board[i], board);\r\n\t\t} else if (board[i].cardId === CardIds.JunkbotBattlegrounds) {\r\n\t\t\tmodifyAttack(board[i], 4, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 4);\r\n\t\t\tafterStatsUpdate(board[i], board, allCards);\r\n\t\t\tspectator.registerPowerTarget(board[i], board[i], board);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// const applyQirajiHarbringerEffect = (board: BoardEntity[], deadEntityIndex: number, allCards: AllCardsService): void => {\r\n// \tconst qiraji = board.filter((entity) => entity.cardId === CardIds.QirajiHarbinger);\r\n// \tconst goldenQiraji = board.filter((entity) => entity.cardId === CardIds.QirajiHarbingerBattlegrounds);\r\n// \tconst neighbours = getNeighbours(board, null, deadEntityIndex);\r\n\r\n// \t// TODO: if reactivated, properly apply buffs one by one, instead of all together\r\n\r\n// \tneighbours.forEach((entity) => {\r\n// \t\tmodifyAttack(entity, 2 * qiraji.length + 4 * goldenQiraji.length, board, allCards);\r\n// \t\tmodifyHealth(entity, 2 * qiraji.length + 4 * goldenQiraji.length);\r\n// \t\tafterStatsUpdate(entity, board, allCards);\r\n// \t});\r\n// };\r\n\r\nconst grantRandomAttack = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tadditionalAttack: number,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (board.length > 0) {\r\n\t\tconst target = board[Math.floor(Math.random() * board.length)];\r\n\t\tmodifyAttack(target, additionalAttack, board, allCards);\r\n\t\tafterStatsUpdate(target, board, allCards);\r\n\t\tspectator.registerPowerTarget(source, target, board);\r\n\t}\r\n};\r\n\r\nconst grantRandomHealth = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thealth: number,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board.filter((e) => !excludeSource || e.entityId !== source.entityId);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = candidateBoard[Math.floor(Math.random() * candidateBoard.length)];\r\n\t\tmodifyHealth(target, health);\r\n\t\tafterStatsUpdate(target, board, allCards);\r\n\t\tspectator.registerPowerTarget(source, target, board);\r\n\t}\r\n};\r\n\r\nconst grantRandomStats = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tattack: number,\r\n\thealth: number,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): BoardEntity => {\r\n\tif (board.length > 0) {\r\n\t\tconst validBeast: BoardEntity = getRandomMinion(board, race, allCards);\r\n\t\tif (validBeast) {\r\n\t\t\tmodifyAttack(validBeast, attack, board, allCards);\r\n\t\t\tmodifyHealth(validBeast, health);\r\n\t\t\tafterStatsUpdate(validBeast, board, allCards);\r\n\t\t\tspectator.registerPowerTarget(source, validBeast, board);\r\n\t\t\treturn validBeast;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const addCardsInHand = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tcards: number,\r\n\tboard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tplayerEntity.cardsInHand = Math.min(10, (playerEntity.cardsInHand ?? 0) + cards);\r\n\r\n\tconst peggys = board.filter((e) => e.cardId === CardIds.PeggyBrittlebone || e.cardId === CardIds.PeggyBrittleboneBattlegrounds);\r\n\tpeggys.forEach((peggy) => {\r\n\t\tconst pirate = getRandomMinion(\r\n\t\t\tboard.filter((e) => e.entityId !== peggy.entityId),\r\n\t\t\tRace.PIRATE,\r\n\t\t\tallCards,\r\n\t\t);\r\n\t\tif (pirate) {\r\n\t\t\tmodifyAttack(pirate, peggy.cardId === CardIds.PeggyBrittleboneBattlegrounds ? 2 : 1, board, allCards);\r\n\t\t\tmodifyHealth(pirate, peggy.cardId === CardIds.PeggyBrittleboneBattlegrounds ? 2 : 1);\r\n\t\t\tafterStatsUpdate(pirate, board, allCards);\r\n\t\t\tspectator.registerPowerTarget(peggy, pirate, board);\r\n\t\t}\r\n\t});\r\n};\r\n\r\nconst grantRandomDivineShield = (source: BoardEntity, board: BoardEntity[], spectator: Spectator): void => {\r\n\tconst elligibleEntities = board.filter((entity) => !entity.divineShield);\r\n\tif (elligibleEntities.length > 0) {\r\n\t\tconst chosen = elligibleEntities[Math.floor(Math.random() * elligibleEntities.length)];\r\n\t\tchosen.divineShield = true;\r\n\t\tspectator.registerPowerTarget(source, chosen, board);\r\n\t}\r\n\t// return board;\r\n};\r\n\r\nconst grantAllDivineShield = (board: BoardEntity[], tribe: string, cards: AllCardsService): void => {\r\n\tconst elligibleEntities = board\r\n\t\t.filter((entity) => !entity.divineShield)\r\n\t\t.filter((entity) => isCorrectTribe(cards.getCard(entity.cardId).race, getRaceEnum(tribe)));\r\n\tfor (const entity of elligibleEntities) {\r\n\t\tentity.divineShield = true;\r\n\t}\r\n\t// return board;\r\n};\r\n\r\nexport const rememberDeathrattles = (fish: BoardEntity, deadEntities: readonly BoardEntity[], cardsData: CardsData): void => {\r\n\tconst validDeathrattles = deadEntities\r\n\t\t.filter((entity) => cardsData.validDeathrattles.includes(entity.cardId))\r\n\t\t.map((entity) => entity.cardId);\r\n\tconst validEnchantments = deadEntities\r\n\t\t.filter((entity) => entity.enchantments?.length)\r\n\t\t.map((entity) => entity.enchantments)\r\n\t\t.reduce((a, b) => a.concat(b), [])\r\n\t\t.map((enchantment) => enchantment.cardId)\r\n\t\t.filter((enchantmentId) =>\r\n\t\t\t[\r\n\t\t\t\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantment,\r\n\t\t\t\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantmentBattlegrounds,\r\n\t\t\t\tCardIds.LivingSpores_LivingSporesEnchantment,\r\n\t\t\t].includes(enchantmentId as CardIds),\r\n\t\t);\r\n\t// console.debug('remembering deathrattles', fish.cardId, stringifySimple(deadEntities), validDeathrattles, validEnchantments);\r\n\tconst newDeathrattles = [...validDeathrattles, ...validEnchantments];\r\n\t// Order is important\r\n\tif (fish.cardId === CardIds.FishOfNzothBattlegrounds) {\r\n\t\t// https://stackoverflow.com/questions/33305152/how-to-duplicate-elements-in-a-js-array\r\n\t\tconst doubleDr = [...validDeathrattles, ...validEnchantments].reduce((res, current) => res.concat([current, current]), []);\r\n\t\tfish.rememberedDeathrattles = [...doubleDr, ...(fish.rememberedDeathrattles || [])];\r\n\t} else {\r\n\t\tfish.rememberedDeathrattles = [...newDeathrattles, ...(fish.rememberedDeathrattles || [])];\r\n\t}\r\n\t// console.debug('remembered dr', fish.rememberedDeathrattles);\r\n};\r\n\r\nconst removeOldMurkEyeAttack = (boardWithDeadEntity: BoardEntity[], allCards: AllCardsService) => {\r\n\tconst murkeyes = boardWithDeadEntity.filter(\r\n\t\t(entity) => entity.cardId === CardIds.OldMurkEyeLegacy || entity.cardId === CardIds.OldMurkEyeVanilla,\r\n\t);\r\n\tconst goldenMurkeyes = boardWithDeadEntity.filter((entity) => entity.cardId === CardIds.OldMurkEyeBattlegrounds);\r\n\tmurkeyes.forEach((entity) => {\r\n\t\tmodifyAttack(entity, -1, boardWithDeadEntity, allCards);\r\n\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t});\r\n\tgoldenMurkeyes.forEach((entity) => {\r\n\t\tmodifyAttack(entity, -2, boardWithDeadEntity, allCards);\r\n\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t});\r\n};\r\n"]}
1
+ {"version":3,"file":"deathrattle-effects.js","sourceRoot":"","sources":["../../src/simulation/deathrattle-effects.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService, CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { CardsData } from '../cards/cards-data';\r\nimport { groupByFunction } from '../services/utils';\r\nimport { afterStatsUpdate, getRaceEnum, hasCorrectTribe, isCorrectTribe, modifyAttack, modifyHealth } from '../utils';\r\nimport { bumpEntities, dealDamageToEnemy, dealDamageToRandomEnemy, getNeighbours } from './attack';\r\nimport { removeAurasAfterAuraSourceDeath } from './auras';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { SharedState } from './shared-state';\r\nimport { Spectator } from './spectator/spectator';\r\n\r\nexport const handleDeathrattleEffects = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst rivendare = boardWithDeadEntity.find((entity) => entity.cardId === CardIds.BaronRivendare2);\r\n\tconst goldenRivendare = boardWithDeadEntity.find((entity) => entity.cardId === CardIds.BaronRivendareBattlegrounds);\r\n\tconst multiplier = goldenRivendare ? 3 : rivendare ? 2 : 1;\r\n\t// We do it on a case by case basis so that we deal all the damage in one go for instance\r\n\t// and avoid proccing deathrattle spawns between the times the damage triggers\r\n\tswitch (deadEntity.cardId) {\r\n\t\tcase CardIds.SelflessHero:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SelflessHeroBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, spectator);\r\n\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.NadinaTheRed:\r\n\t\tcase CardIds.NadinaTheRedBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantAllDivineShield(boardWithDeadEntity, 'DRAGON', allCards);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SpawnOfNzoth:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 1, multiplier * 1, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SpawnOfNzothBattlegrounds:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 2, multiplier * 2, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.GoldrinnTheGreatWolf:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 5, multiplier * 5, allCards, spectator, 'BEAST');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.GoldrinnTheGreatWolfBattlegrounds:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 10, multiplier * 10, allCards, spectator, 'BEAST');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.KingBagurgle:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 2, multiplier * 2, allCards, spectator, 'MURLOC');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.KingBagurgleBattlegrounds:\r\n\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 4, multiplier * 4, allCards, spectator, 'MURLOC');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.FiendishServant:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.FiendishServantBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ImpulsiveTrickster:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ImpulsiveTricksterBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Leapfrogger:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, false, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.LeapfroggerBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocolisk:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tconst target = grantRandomStats(deadEntity, boardWithDeadEntity, 6, 6, Race.BEAST, allCards, spectator);\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocoliskBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tconst target = grantRandomStats(deadEntity, boardWithDeadEntity, 12, 12, Race.BEAST, allCards, spectator);\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.LeapfroggerBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.KaboomBot:\r\n\t\t\t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t4,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.KaboomBotBattlegrounds:\r\n\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t4,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t4,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t}\r\n\r\n\t// It's important to first copy the enchantments, otherwise you could end up\r\n\t// in an infinite loop - since new enchants are added after each step\r\n\tlet enchantments: { cardId: string; originEntityId?: number; repeats?: number }[] = [...(deadEntity.enchantments ?? [])];\r\n\tconst threshold = 20;\r\n\tif (enchantments.length > threshold || enchantments.some((e) => e.repeats && e.repeats > 1)) {\r\n\t\t// console.warn(\r\n\t\t// \t'too many enchtments, truncating',\r\n\t\t// \tstringifySimpleCard(deadEntity),\r\n\t\t// \tdeadEntity.enchantments.length,\r\n\t\t// \tdeadEntity.enchantments,\r\n\t\t// );\r\n\t\t// In some cases it's possible that there are way too many enchantments because of the frog\r\n\t\t// In that case, we make a trade-off and don't trigger the \"on stats change\" trigger as\r\n\t\t// often as we should, so that we can have the stats themselves correct\r\n\t\tconst enchantmentGroups = groupByFunction((enchantment) => enchantment.cardId)(enchantments);\r\n\t\tenchantments = Object.keys(enchantmentGroups).map((cardId) => ({\r\n\t\t\tcardId: cardId,\r\n\t\t\trepeats: enchantmentGroups[cardId].length,\r\n\t\t}));\r\n\t}\r\n\tfor (const enchantment of enchantments) {\r\n\t\tswitch (enchantment.cardId) {\r\n\t\t\tcase CardIds.Leapfrogger_LeapfrogginEnchantment1:\r\n\t\t\t\tif (!!enchantment.repeats && enchantment.repeats > 1) {\r\n\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, false, allCards, spectator, multiplier * enchantment.repeats);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, false, allCards, spectator);\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.Leapfrogger_LeapfrogginEnchantment2:\r\n\t\t\t\tif (!!enchantment.repeats && enchantment.repeats > 1) {\r\n\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator, multiplier * enchantment.repeats);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator);\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\r\nconst applyLeapFroggerEffect = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tdeadEntity: BoardEntity,\r\n\tisPremium: boolean,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n\tmultiplier = 1,\r\n): void => {\r\n\tmultiplier = multiplier || 1;\r\n\tconst buffed = grantRandomStats(\r\n\t\tdeadEntity,\r\n\t\tboardWithDeadEntity,\r\n\t\tmultiplier * (isPremium ? 2 : 1),\r\n\t\tmultiplier * (isPremium ? 2 : 1),\r\n\t\tRace.BEAST,\r\n\t\tallCards,\r\n\t\tspectator,\r\n\t);\r\n\tif (buffed) {\r\n\t\tbuffed.enchantments = buffed.enchantments ?? [];\r\n\t\tbuffed.enchantments.push({\r\n\t\t\tcardId: isPremium ? CardIds.Leapfrogger_LeapfrogginEnchantment2 : CardIds.Leapfrogger_LeapfrogginEnchantment1,\r\n\t\t\toriginEntityId: deadEntity.entityId,\r\n\t\t\trepeats: multiplier > 1 ? multiplier : undefined,\r\n\t\t});\r\n\t\t// Don't register power effect here, since it's already done in the random stats\r\n\t\t// spectator.registerPowerTarget(deadEntity, buffed, boardWithDeadEntity);\r\n\t\t// console.log('applyLeapFroggerEffect', stringifySimpleCard(deadEntity), stringifySimpleCard(buffed));\r\n\t}\r\n};\r\n\r\nconst getRandomMinion = (board: BoardEntity[], race: Race, allCards: AllCardsService): BoardEntity => {\r\n\tconst validTribes = board.filter((e) => !race || isCorrectTribe(allCards.getCard(e.cardId).race, race));\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\treturn validTribes[Math.floor(Math.random() * validTribes.length)];\r\n};\r\n\r\nconst 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\nexport const addStatsToBoard = (\r\n\tsourceEntity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tattack: number,\r\n\thealth: number,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n\ttribe?: string,\r\n): void => {\r\n\tfor (const entity of board) {\r\n\t\tif (!tribe || isCorrectTribe(allCards.getCard(entity.cardId).race, Race[tribe])) {\r\n\t\t\tmodifyAttack(entity, attack, board, allCards);\r\n\t\t\tmodifyHealth(entity, health);\r\n\t\t\tafterStatsUpdate(entity, board, allCards);\r\n\t\t\tspectator.registerPowerTarget(sourceEntity, entity, board);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const applyMinionDeathEffect = (\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndex: number,\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\t// console.log('applying minion death effect', stringifySimpleCard(deadEntity, allCards));\r\n\tif (isCorrectTribe(allCards.getCard(deadEntity.cardId).race, Race.BEAST)) {\r\n\t\tapplyScavengingHyenaEffect(boardWithDeadEntity, allCards, spectator);\r\n\t}\r\n\tif (isCorrectTribe(allCards.getCard(deadEntity.cardId).race, Race.DEMON)) {\r\n\t\tapplySoulJugglerEffect(\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\tif (isCorrectTribe(allCards.getCard(deadEntity.cardId).race, Race.MECH)) {\r\n\t\tapplyJunkbotEffect(boardWithDeadEntity, allCards, spectator);\r\n\t}\r\n\tif (hasCorrectTribe(deadEntity, Race.MURLOC, allCards)) {\r\n\t\tremoveOldMurkEyeAttack(boardWithDeadEntity, allCards);\r\n\t\tremoveOldMurkEyeAttack(otherBoard, allCards);\r\n\t}\r\n\r\n\tif (cardsData.auraOrigins.includes(deadEntity.cardId)) {\r\n\t\tremoveAurasAfterAuraSourceDeath(boardWithDeadEntity, deadEntity, cardsData);\r\n\t}\r\n\r\n\tif (deadEntity.taunt) {\r\n\t\t// applyQirajiHarbringerEffect(boardWithDeadEntity, deadEntityIndex, allCards);\r\n\t}\r\n\t// Overkill\r\n\tif (deadEntity.health < 0 && deadEntity.lastAffectedByEntity?.attacking) {\r\n\t\tif (deadEntity.lastAffectedByEntity.cardId === CardIds.HeraldOfFlame2) {\r\n\t\t\tconst targets = boardWithDeadEntity.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\t\t\tif (targets.length > 0) {\r\n\t\t\t\tconst target = targets[0];\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tdeadEntity.lastAffectedByEntity,\r\n\t\t\t\t\t3,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.HeraldOfFlameBattlegrounds) {\r\n\t\t\tconst targets = boardWithDeadEntity.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\t\t\tif (targets.length > 0) {\r\n\t\t\t\tconst target = targets[0];\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tdeadEntity.lastAffectedByEntity,\r\n\t\t\t\t\t6,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.WildfireElemental) {\r\n\t\t\t// console.log('applying WildfireElemental effect', stringifySimple(boardWithDeadEntity, allCards));\r\n\t\t\tconst excessDamage = -deadEntity.health;\r\n\t\t\tconst neighbours = getNeighbours(boardWithDeadEntity, null, deadEntityIndex);\r\n\t\t\t// console.log('neighbours', stringifySimple(neighbours, allCards));\r\n\t\t\tif (neighbours.length > 0) {\r\n\t\t\t\tconst randomTarget = neighbours[Math.floor(Math.random() * neighbours.length)];\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\trandomTarget,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tnull,\r\n\t\t\t\t\texcessDamage,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.WildfireElementalBattlegrounds) {\r\n\t\t\tconst excessDamage = -deadEntity.health;\r\n\t\t\tconst neighbours = getNeighbours(boardWithDeadEntity, null, deadEntityIndex);\r\n\t\t\tneighbours.forEach((neighbour) =>\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tnull,\r\n\t\t\t\t\texcessDamage,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.IronhideDirehorn) {\r\n\t\t\tconst newEntities = spawnEntities(\r\n\t\t\t\tCardIds.IronhideDirehorn_IronhideRuntToken,\r\n\t\t\t\t1,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t\t!deadEntity.friendly,\r\n\t\t\t\ttrue,\r\n\t\t\t);\r\n\t\t\totherBoard.splice(deadEntityIndex, 0, ...newEntities);\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.IronhideDirehornBattlegrounds) {\r\n\t\t\tconst newEntities = spawnEntities(\r\n\t\t\t\tCardIds.IronhideDirehorn_IronhideRuntTokenBattlegrounds,\r\n\t\t\t\t1,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t\t!deadEntity.friendly,\r\n\t\t\t\ttrue,\r\n\t\t\t);\r\n\t\t\totherBoard.splice(deadEntityIndex, 0, ...newEntities);\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.SeabreakerGoliath2) {\r\n\t\t\tconst otherPirates = otherBoard\r\n\t\t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId).race, Race.PIRATE))\r\n\t\t\t\t.filter((entity) => entity.entityId !== deadEntity.lastAffectedByEntity.entityId);\r\n\t\t\totherPirates.forEach((pirate) => {\r\n\t\t\t\tmodifyAttack(pirate, 2, boardWithDeadEntity, allCards);\r\n\t\t\t\tmodifyHealth(pirate, 2);\r\n\t\t\t\tafterStatsUpdate(pirate, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(deadEntity.lastAffectedByEntity, pirate, otherBoard);\r\n\t\t\t});\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.SeabreakerGoliathBattlegrounds) {\r\n\t\t\tconst otherPirates = otherBoard\r\n\t\t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId).race, Race.PIRATE))\r\n\t\t\t\t.filter((entity) => entity.entityId !== deadEntity.lastAffectedByEntity.entityId);\r\n\t\t\totherPirates.forEach((pirate) => {\r\n\t\t\t\tmodifyAttack(pirate, 4, boardWithDeadEntity, allCards);\r\n\t\t\t\tmodifyHealth(pirate, 4);\r\n\t\t\t\tafterStatsUpdate(pirate, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(deadEntity.lastAffectedByEntity, pirate, otherBoard);\r\n\t\t\t});\r\n\t\t}\r\n\t\t// else if (deadEntity.lastAffectedByEntity.cardId === CardIds.NatPagleExtremeAngler) {\r\n\t\t// }\r\n\t}\r\n\r\n\tconst rivendare = boardWithDeadEntity.find((entity) => entity.cardId === CardIds.BaronRivendare2);\r\n\tconst goldenRivendare = boardWithDeadEntity.find((entity) => entity.cardId === CardIds.BaronRivendareBattlegrounds);\r\n\tconst multiplier = goldenRivendare ? 3 : rivendare ? 2 : 1;\r\n\tif (deadEntity.cardId === CardIds.UnstableGhoul) {\r\n\t\tdealDamageToAllMinions(\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tdeadEntity,\r\n\t\t\tmultiplier * 1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t} else if (deadEntity.cardId === CardIds.UnstableGhoulBattlegrounds) {\r\n\t\tdealDamageToAllMinions(\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tdeadEntity,\r\n\t\t\tmultiplier * 2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\r\n\t// Avenge\r\n\tupdateAvengeCounters(boardWithDeadEntity);\r\n\tconst avengers = boardWithDeadEntity.filter((e) => !!e.avengeDefault && e.avengeCurrent === 0);\r\n\tfor (const avenger of avengers) {\r\n\t\thandleAvenge(\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\tavenger,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t\tallCards,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nconst updateAvengeCounters = (board: readonly BoardEntity[]) => {\r\n\tfor (const entity of board) {\r\n\t\tif (entity.avengeDefault) {\r\n\t\t\tentity.avengeCurrent -= 1;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleAvenge = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\tavenger: BoardEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n\tallCards: AllCardsService,\r\n) => {\r\n\t// Don't forget to update the avenge data in cards-data\r\n\tswitch (avenger.cardId) {\r\n\t\tcase CardIds.BirdBuddy:\r\n\t\t\taddStatsToBoard(avenger, boardWithDeadEntity, 1, 1, allCards, spectator, 'BEAST');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.BirdBuddyBattlegrounds:\r\n\t\t\taddStatsToBoard(avenger, boardWithDeadEntity, 2, 2, allCards, spectator, 'BEAST');\r\n\t\t\tbreak;\r\n\t\tcase CardIds.BuddingGreenthumb:\r\n\t\tcase CardIds.BuddingGreenthumbBattlegrounds:\r\n\t\t\tconst neighbours = getNeighbours(boardWithDeadEntity, avenger);\r\n\t\t\tneighbours.forEach((entity) => {\r\n\t\t\t\tmodifyAttack(entity, avenger.cardId === CardIds.BuddingGreenthumbBattlegrounds ? 4 : 2, boardWithDeadEntity, allCards);\r\n\t\t\t\tmodifyHealth(entity, avenger.cardId === CardIds.BuddingGreenthumbBattlegrounds ? 2 : 1);\r\n\t\t\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(avenger, entity, boardWithDeadEntity);\r\n\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocolisk:\r\n\t\t\tconst target1 = grantRandomStats(avenger, boardWithDeadEntity, 6, 6, Race.BEAST, allCards, spectator);\r\n\t\t\tif (!!target1) {\r\n\t\t\t\tspectator.registerPowerTarget(avenger, target1, boardWithDeadEntity);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocoliskBattlegrounds:\r\n\t\t\tconst target2 = grantRandomStats(avenger, boardWithDeadEntity, 12, 12, Race.BEAST, allCards, spectator);\r\n\t\t\tif (!!target2) {\r\n\t\t\t\tspectator.registerPowerTarget(avenger, target2, boardWithDeadEntity);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ImpatientDoomsayer:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ImpatientDoomsayerBattlegrounds:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 2, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.WitchwingNestmatron:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.WitchwingNestmatronBattlegrounds:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 2, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Sisefin:\r\n\t\t\tconst murloc = getRandomMinion(boardWithDeadEntity, Race.MURLOC, allCards);\r\n\t\t\tif (murloc) {\r\n\t\t\t\tmurloc.poisonous = true;\r\n\t\t\t\tspectator.registerPowerTarget(avenger, murloc, boardWithDeadEntity);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SisefinBattlegrounds:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tconst murloc2 = getRandomMinion(boardWithDeadEntity, Race.MURLOC, allCards);\r\n\t\t\t\tif (murloc2) {\r\n\t\t\t\t\tmurloc2.poisonous = true;\r\n\t\t\t\t\tspectator.registerPowerTarget(avenger, murloc2, boardWithDeadEntity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.MechanoTank:\r\n\t\t\tdealDamageToEnemy(\r\n\t\t\t\t// This can be null if the avenge triggers when the last enemy minion dies as well\r\n\t\t\t\tgetRandomMinionWithHighestHealth(otherBoard),\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tavenger,\r\n\t\t\t\t6,\r\n\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.MechanoTankBattlegrounds:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\tgetRandomMinionWithHighestHealth(otherBoard),\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\tavenger,\r\n\t\t\t\t\t6,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TonyTwoTusk:\r\n\t\t\tconst nonGoldenMinions = boardWithDeadEntity\r\n\t\t\t\t.filter((e) => e.entityId !== avenger.entityId)\r\n\t\t\t\t.filter((e) => {\r\n\t\t\t\t\tconst ref = allCards.getCard(e.cardId);\r\n\t\t\t\t\treturn !!ref.battlegroundsPremiumDbfId && !!allCards.getCardFromDbfId(ref.battlegroundsPremiumDbfId).id;\r\n\t\t\t\t});\r\n\t\t\tconst pirate = getRandomMinion(nonGoldenMinions, Race.PIRATE, allCards);\r\n\t\t\tif (pirate) {\r\n\t\t\t\tconst refCard = allCards.getCard(pirate.cardId);\r\n\t\t\t\tconst goldenCard = allCards.getCardFromDbfId(refCard.battlegroundsPremiumDbfId);\r\n\t\t\t\tpirate.cardId = goldenCard.id;\r\n\t\t\t\tspectator.registerPowerTarget(avenger, pirate, boardWithDeadEntity);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TonyTwoTuskBattlegrounds:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tconst nonGoldenMinions = boardWithDeadEntity.filter((e) => {\r\n\t\t\t\t\tconst ref = allCards.getCard(e.cardId);\r\n\t\t\t\t\treturn !!ref.battlegroundsPremiumDbfId;\r\n\t\t\t\t});\r\n\t\t\t\tconst pirate = getRandomMinion(nonGoldenMinions, Race.PIRATE, allCards);\r\n\t\t\t\tif (pirate) {\r\n\t\t\t\t\tconst refCard = allCards.getCard(pirate.cardId);\r\n\t\t\t\t\tpirate.cardId = refCard.id;\r\n\t\t\t\t\tspectator.registerPowerTarget(avenger, pirate, boardWithDeadEntity);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t}\r\n\tavenger.avengeCurrent = avenger.avengeDefault;\r\n};\r\n\r\nexport const dealDamageToAllMinions = (\r\n\tboard1: BoardEntity[],\r\n\tboard1Hero: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tboard2Hero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity,\r\n\tdamageDealt: number,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (board1.length === 0 && board2.length === 0) {\r\n\t\treturn;\r\n\t\t// return [board1, board2];\r\n\t}\r\n\t// let updatedBoard1 = [...board1];\r\n\t// let updatedBoard2 = [...board2];\r\n\tconst fakeAttacker = {\r\n\t\t...(damageSource || {}),\r\n\t\tentityId: -1,\r\n\t\tattack: damageDealt,\r\n\t\tattacking: true,\r\n\t} as BoardEntity;\r\n\tfor (let i = 0; i < board1.length; i++) {\r\n\t\tbumpEntities(board1[i], fakeAttacker, board1, board1Hero, board2, board2Hero, allCards, cardsData, sharedState, spectator);\r\n\t\t// board1[i] = entity;\r\n\t}\r\n\tfor (let i = 0; i < board2.length; i++) {\r\n\t\tbumpEntities(board2[i], fakeAttacker, board2, board2Hero, board1, board1Hero, allCards, cardsData, sharedState, spectator);\r\n\t\t// updatedBoard2 = [...boardResult];\r\n\t\t// updatedBoard2[i] = entity;\r\n\t}\r\n\t// processMinionDeath(board1, board1Hero, board2, board2Hero, allCards, cardsData, sharedState, spectator);\r\n};\r\n\r\nconst applySoulJugglerEffect = (\r\n\tboardWithJugglers: BoardEntity[],\r\n\tboardWithJugglersHero: BgsPlayerEntity,\r\n\tboardToAttack: BoardEntity[],\r\n\tboardToAttackHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (boardWithJugglers.length === 0 && boardToAttack.length === 0) {\r\n\t\treturn;\r\n\t\t// return [boardWithJugglers, boardToAttack];\r\n\t}\r\n\tconst jugglers = boardWithJugglers.filter((entity) => entity.cardId === CardIds.SoulJuggler);\r\n\tfor (const juggler of jugglers) {\r\n\t\tdealDamageToRandomEnemy(\r\n\t\t\tboardToAttack,\r\n\t\t\tboardToAttackHero,\r\n\t\t\tjuggler,\r\n\t\t\t3,\r\n\t\t\tboardWithJugglers,\r\n\t\t\tboardWithJugglersHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\tconst goldenJugglers = boardWithJugglers.filter((entity) => entity.cardId === CardIds.SoulJugglerBattlegrounds);\r\n\tfor (const juggler of goldenJugglers) {\r\n\t\tdealDamageToRandomEnemy(\r\n\t\t\tboardToAttack,\r\n\t\t\tboardToAttackHero,\r\n\t\t\tjuggler,\r\n\t\t\t3,\r\n\t\t\tboardWithJugglers,\r\n\t\t\tboardWithJugglersHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\tdealDamageToRandomEnemy(\r\n\t\t\tboardToAttack,\r\n\t\t\tboardToAttackHero,\r\n\t\t\tjuggler,\r\n\t\t\t3,\r\n\t\t\tboardWithJugglers,\r\n\t\t\tboardWithJugglersHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\t// processMinionDeath(\r\n\t// \tboardWithJugglers,\r\n\t// \tboardWithJugglersHero,\r\n\t// \tboardToAttack,\r\n\t// \tboardToAttackHero,\r\n\t// \tallCards,\r\n\t// \tcardsData,\r\n\t// \tsharedState,\r\n\t// \tspectator,\r\n\t// );\r\n};\r\n\r\nconst applyScavengingHyenaEffect = (board: BoardEntity[], allCards: AllCardsService, spectator: Spectator): void => {\r\n\t// const copy = [...board];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].cardId === CardIds.ScavengingHyenaLegacy) {\r\n\t\t\tmodifyAttack(board[i], 2, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 1);\r\n\t\t\tafterStatsUpdate(board[i], board, allCards);\r\n\t\t\tspectator.registerPowerTarget(board[i], board[i], board);\r\n\t\t} else if (board[i].cardId === CardIds.ScavengingHyenaBattlegrounds) {\r\n\t\t\tmodifyAttack(board[i], 4, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 2);\r\n\t\t\tafterStatsUpdate(board[i], board, allCards);\r\n\t\t\tspectator.registerPowerTarget(board[i], board[i], board);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst applyJunkbotEffect = (board: BoardEntity[], allCards: AllCardsService, spectator: Spectator): void => {\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].cardId === CardIds.Junkbot) {\r\n\t\t\tmodifyAttack(board[i], 2, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 2);\r\n\t\t\tafterStatsUpdate(board[i], board, allCards);\r\n\t\t\tspectator.registerPowerTarget(board[i], board[i], board);\r\n\t\t} else if (board[i].cardId === CardIds.JunkbotBattlegrounds) {\r\n\t\t\tmodifyAttack(board[i], 4, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 4);\r\n\t\t\tafterStatsUpdate(board[i], board, allCards);\r\n\t\t\tspectator.registerPowerTarget(board[i], board[i], board);\r\n\t\t}\r\n\t}\r\n};\r\n\r\n// const applyQirajiHarbringerEffect = (board: BoardEntity[], deadEntityIndex: number, allCards: AllCardsService): void => {\r\n// \tconst qiraji = board.filter((entity) => entity.cardId === CardIds.QirajiHarbinger);\r\n// \tconst goldenQiraji = board.filter((entity) => entity.cardId === CardIds.QirajiHarbingerBattlegrounds);\r\n// \tconst neighbours = getNeighbours(board, null, deadEntityIndex);\r\n\r\n// \t// TODO: if reactivated, properly apply buffs one by one, instead of all together\r\n\r\n// \tneighbours.forEach((entity) => {\r\n// \t\tmodifyAttack(entity, 2 * qiraji.length + 4 * goldenQiraji.length, board, allCards);\r\n// \t\tmodifyHealth(entity, 2 * qiraji.length + 4 * goldenQiraji.length);\r\n// \t\tafterStatsUpdate(entity, board, allCards);\r\n// \t});\r\n// };\r\n\r\nconst grantRandomAttack = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tadditionalAttack: number,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (board.length > 0) {\r\n\t\tconst target = board[Math.floor(Math.random() * board.length)];\r\n\t\tmodifyAttack(target, additionalAttack, board, allCards);\r\n\t\tafterStatsUpdate(target, board, allCards);\r\n\t\tspectator.registerPowerTarget(source, target, board);\r\n\t}\r\n};\r\n\r\nconst grantRandomHealth = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thealth: number,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board.filter((e) => !excludeSource || e.entityId !== source.entityId);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = candidateBoard[Math.floor(Math.random() * candidateBoard.length)];\r\n\t\tmodifyHealth(target, health);\r\n\t\tafterStatsUpdate(target, board, allCards);\r\n\t\tspectator.registerPowerTarget(source, target, board);\r\n\t}\r\n};\r\n\r\nconst grantRandomStats = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\tattack: number,\r\n\thealth: number,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): BoardEntity => {\r\n\tif (board.length > 0) {\r\n\t\tconst validBeast: BoardEntity = getRandomMinion(board, race, allCards);\r\n\t\tif (validBeast) {\r\n\t\t\tmodifyAttack(validBeast, attack, board, allCards);\r\n\t\t\tmodifyHealth(validBeast, health);\r\n\t\t\tafterStatsUpdate(validBeast, board, allCards);\r\n\t\t\tspectator.registerPowerTarget(source, validBeast, board);\r\n\t\t\treturn validBeast;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const addCardsInHand = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tcards: number,\r\n\tboard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tplayerEntity.cardsInHand = Math.min(10, (playerEntity.cardsInHand ?? 0) + cards);\r\n\r\n\tconst peggys = board.filter((e) => e.cardId === CardIds.PeggyBrittlebone || e.cardId === CardIds.PeggyBrittleboneBattlegrounds);\r\n\tpeggys.forEach((peggy) => {\r\n\t\tconst pirate = getRandomMinion(\r\n\t\t\tboard.filter((e) => e.entityId !== peggy.entityId),\r\n\t\t\tRace.PIRATE,\r\n\t\t\tallCards,\r\n\t\t);\r\n\t\tif (pirate) {\r\n\t\t\tmodifyAttack(pirate, peggy.cardId === CardIds.PeggyBrittleboneBattlegrounds ? 2 : 1, board, allCards);\r\n\t\t\tmodifyHealth(pirate, peggy.cardId === CardIds.PeggyBrittleboneBattlegrounds ? 2 : 1);\r\n\t\t\tafterStatsUpdate(pirate, board, allCards);\r\n\t\t\tspectator.registerPowerTarget(peggy, pirate, board);\r\n\t\t}\r\n\t});\r\n};\r\n\r\nconst grantRandomDivineShield = (source: BoardEntity, board: BoardEntity[], spectator: Spectator): void => {\r\n\tconst elligibleEntities = board.filter((entity) => !entity.divineShield);\r\n\tif (elligibleEntities.length > 0) {\r\n\t\tconst chosen = elligibleEntities[Math.floor(Math.random() * elligibleEntities.length)];\r\n\t\tchosen.divineShield = true;\r\n\t\tspectator.registerPowerTarget(source, chosen, board);\r\n\t}\r\n\t// return board;\r\n};\r\n\r\nconst grantAllDivineShield = (board: BoardEntity[], tribe: string, cards: AllCardsService): void => {\r\n\tconst elligibleEntities = board\r\n\t\t.filter((entity) => !entity.divineShield)\r\n\t\t.filter((entity) => isCorrectTribe(cards.getCard(entity.cardId).race, getRaceEnum(tribe)));\r\n\tfor (const entity of elligibleEntities) {\r\n\t\tentity.divineShield = true;\r\n\t}\r\n\t// return board;\r\n};\r\n\r\nexport const rememberDeathrattles = (fish: BoardEntity, deadEntities: readonly BoardEntity[], cardsData: CardsData): void => {\r\n\tconst validDeathrattles = deadEntities\r\n\t\t.filter((entity) => cardsData.validDeathrattles.includes(entity.cardId))\r\n\t\t.map((entity) => entity.cardId);\r\n\tconst validEnchantments = deadEntities\r\n\t\t.filter((entity) => entity.enchantments?.length)\r\n\t\t.map((entity) => entity.enchantments)\r\n\t\t.reduce((a, b) => a.concat(b), [])\r\n\t\t.map((enchantment) => enchantment.cardId)\r\n\t\t.filter((enchantmentId) =>\r\n\t\t\t[\r\n\t\t\t\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantment,\r\n\t\t\t\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantmentBattlegrounds,\r\n\t\t\t\tCardIds.LivingSpores_LivingSporesEnchantment,\r\n\t\t\t].includes(enchantmentId as CardIds),\r\n\t\t);\r\n\t// console.debug('remembering deathrattles', fish.cardId, stringifySimple(deadEntities), validDeathrattles, validEnchantments);\r\n\tconst newDeathrattles = [...validDeathrattles, ...validEnchantments];\r\n\t// Order is important\r\n\tif (fish.cardId === CardIds.FishOfNzothBattlegrounds) {\r\n\t\t// https://stackoverflow.com/questions/33305152/how-to-duplicate-elements-in-a-js-array\r\n\t\tconst doubleDr = [...validDeathrattles, ...validEnchantments].reduce((res, current) => res.concat([current, current]), []);\r\n\t\tfish.rememberedDeathrattles = [...doubleDr, ...(fish.rememberedDeathrattles || [])];\r\n\t} else {\r\n\t\tfish.rememberedDeathrattles = [...newDeathrattles, ...(fish.rememberedDeathrattles || [])];\r\n\t}\r\n\t// console.debug('remembered dr', fish.rememberedDeathrattles);\r\n};\r\n\r\nconst removeOldMurkEyeAttack = (boardWithDeadEntity: BoardEntity[], allCards: AllCardsService) => {\r\n\tconst murkeyes = boardWithDeadEntity.filter(\r\n\t\t(entity) => entity.cardId === CardIds.OldMurkEyeLegacy || entity.cardId === CardIds.OldMurkEyeVanilla,\r\n\t);\r\n\tconst goldenMurkeyes = boardWithDeadEntity.filter((entity) => entity.cardId === CardIds.OldMurkEyeBattlegrounds);\r\n\tmurkeyes.forEach((entity) => {\r\n\t\tmodifyAttack(entity, -1, boardWithDeadEntity, allCards);\r\n\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t});\r\n\tgoldenMurkeyes.forEach((entity) => {\r\n\t\tmodifyAttack(entity, -2, boardWithDeadEntity, allCards);\r\n\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t});\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.113",
3
+ "version": "1.1.114",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "lint": "eslint --color --fix --ext .ts .",