@firestone-hs/simulate-bgs-battle 1.1.261 → 1.1.263
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.
- package/dist/cards/cards-data.js +4 -4
- package/dist/cards/cards-data.js.map +1 -1
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/avenge.js +2 -2
- package/dist/simulation/avenge.js.map +1 -1
- package/dist/simulation/deathrattle-effects.js +4 -4
- package/dist/simulation/deathrattle-effects.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +11 -12
- package/dist/utils.js.map +1 -1
- package/package.json +1 -4
|
@@ -62,13 +62,13 @@ const handleAvenge = (boardWithDeadEntity, boardWithDeadEntityHero, deadEntity,
|
|
|
62
62
|
utils_1.addStatsToBoard(avenger, boardWithDeadEntity, 0, avenger.cardId === "BG22_HERO_003_Buddy_G" ? 2 : 1, allCards, spectator);
|
|
63
63
|
break;
|
|
64
64
|
case "BG21_001":
|
|
65
|
-
const target1 = utils_1.grantRandomStats(avenger, boardWithDeadEntity, 6, 6, reference_data_1.Race.BEAST, allCards, spectator);
|
|
65
|
+
const target1 = utils_1.grantRandomStats(avenger, boardWithDeadEntity, 6, 6, reference_data_1.Race.BEAST, true, allCards, spectator);
|
|
66
66
|
if (!!target1) {
|
|
67
67
|
spectator.registerPowerTarget(avenger, target1, boardWithDeadEntity);
|
|
68
68
|
}
|
|
69
69
|
break;
|
|
70
70
|
case "BG21_001_G":
|
|
71
|
-
const target2 = utils_1.grantRandomStats(avenger, boardWithDeadEntity, 12, 12, reference_data_1.Race.BEAST, allCards, spectator);
|
|
71
|
+
const target2 = utils_1.grantRandomStats(avenger, boardWithDeadEntity, 12, 12, reference_data_1.Race.BEAST, true, allCards, spectator);
|
|
72
72
|
if (!!target2) {
|
|
73
73
|
spectator.registerPowerTarget(avenger, target2, boardWithDeadEntity);
|
|
74
74
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avenge.js","sourceRoot":"","sources":["../../src/simulation/avenge.ts"],"names":[],"mappings":"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","sourcesContent":["import { 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 {\r\n\taddCardsInHand,\r\n\taddStatsToBoard,\r\n\tafterStatsUpdate,\r\n\tgetRandomAliveMinion,\r\n\tgetRandomMinionWithHighestHealth,\r\n\tgrantRandomStats,\r\n\tgrantStatsToMinionsOfEachType,\r\n\tmakeMinionGolden,\r\n\tmodifyAttack,\r\n\tmodifyHealth,\r\n} from '../utils';\r\nimport { dealDamageToEnemy, getNeighbours, performEntitySpawns } 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 applyAvengeEffects = (\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndexFromRight: 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\tconst candidatesEntitiesSpawnedFromAvenge: BoardEntity[] = [];\r\n\tupdateAvengeCounters(boardWithDeadEntity, boardWithDeadEntityHero);\r\n\tconst avengers = boardWithDeadEntity\r\n\t\t.filter((e) => !!e.avengeDefault && e.avengeCurrent === 0)\r\n\t\t// Get Tony to be processed first, because of the \"when turned golden, the minion ignores the death for the avenge counter\"\r\n\t\t// behavior\r\n\t\t.sort((a, b) => {\r\n\t\t\tif (a.cardId === CardIds.TonyTwoTusk_BG21_031 || a.cardId === CardIds.TonyTwoTusk_BG21_031_G) {\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\tif (b.cardId === CardIds.TonyTwoTusk_BG21_031 || b.cardId === CardIds.TonyTwoTusk_BG21_031_G) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t});\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\tdeadEntity,\r\n\t\t\tdeadEntityIndexFromRight,\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\t// console.log('updating dead entity avenge counter', boardWithDeadEntityHero.avengeCurrent, stringifySimpleCard(deadEntity, allCards));\r\n\tconst heroAvenger = !!boardWithDeadEntityHero.avengeDefault && boardWithDeadEntityHero.avengeCurrent === 0;\r\n\tif (heroAvenger) {\r\n\t\t// console.log(\r\n\t\t// \t'Hero is an avenger',\r\n\t\t// \tboardWithDeadEntityHero.avengeCurrent,\r\n\t\t// \tboardWithDeadEntityHero.avengeDefault,\r\n\t\t// \tboardWithDeadEntityHero.heroPowerId,\r\n\t\t// );\r\n\t\thandleHeroAvenge(\r\n\t\t\tdeadEntity,\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tcandidatesEntitiesSpawnedFromAvenge,\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\tperformEntitySpawns(\r\n\t\tcandidatesEntitiesSpawnedFromAvenge,\r\n\t\tboardWithDeadEntity,\r\n\t\tboardWithDeadEntityHero,\r\n\t\tdeadEntity,\r\n\t\tdeadEntityIndexFromRight,\r\n\t\totherBoard,\r\n\t\totherBoardHero,\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 updateAvengeCounters = (board: readonly BoardEntity[], boardWithDeadEntityHero: BgsPlayerEntity) => {\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\tif (!!boardWithDeadEntityHero.avengeDefault) {\r\n\t\tboardWithDeadEntityHero.avengeCurrent -= 1;\r\n\t}\r\n};\r\n\r\nconst handleAvenge = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndexFromRight: number,\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, boardWithDeadEntity, allCards);\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\t// case CardIds.FrostwolfLieutenant:\r\n\t\t// case CardIds.FrostwolfLieutenantBattlegrounds:\r\n\t\t// \taddStatsToBoard(\r\n\t\t// \t\tavenger,\r\n\t\t// \t\tboardWithDeadEntity,\r\n\t\t// \t\tavenger.cardId === CardIds.FrostwolfLieutenantBattlegrounds ? 2 : 1,\r\n\t\t// \t\t0,\r\n\t\t// \t\tallCards,\r\n\t\t// \t\tspectator,\r\n\t\t// \t);\r\n\t\t// \tbreak;\r\n\t\tcase CardIds.StormpikeLieutenant:\r\n\t\tcase CardIds.StormpikeLieutenantBattlegrounds:\r\n\t\t\taddStatsToBoard(\r\n\t\t\t\tavenger,\r\n\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t0,\r\n\t\t\t\tavenger.cardId === CardIds.StormpikeLieutenantBattlegrounds ? 2 : 1,\r\n\t\t\t\tallCards,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\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.PalescaleCrocolisk_BG21_001_G:\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.PashmarTheVengeful:\r\n\t\tcase CardIds.PashmarTheVengefulBattlegrounds:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.WitchwingNestmatron_BG21_038:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.WitchwingNestmatron_BG21_038_G:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 2, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Thorncaller:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ThorncallerBattlegrounds:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 2, boardWithDeadEntity, allCards, spectator, CardIds.BloodGem);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Sisefin_BG21_009:\r\n\t\t\tconst validTargets = boardWithDeadEntity.filter((e) => !e.poisonous);\r\n\t\t\tconst murloc = getRandomAliveMinion(validTargets, 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.Sisefin_BG21_009_G:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tconst validTargets = boardWithDeadEntity.filter((e) => !e.poisonous);\r\n\t\t\t\tconst murloc2 = getRandomAliveMinion(validTargets, 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_BG21_023:\r\n\t\t\t// This can be null if the avenge triggers when the last enemy minion dies as well\r\n\t\t\tconst target = getRandomMinionWithHighestHealth(otherBoard);\r\n\t\t\tspectator.registerPowerTarget(avenger, target, otherBoard);\r\n\t\t\tdealDamageToEnemy(\r\n\t\t\t\ttarget,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tavenger,\r\n\t\t\t\t5,\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.MechanoTank_BG21_023_G:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tconst target = getRandomMinionWithHighestHealth(otherBoard);\r\n\t\t\t\tspectator.registerPowerTarget(avenger, target, otherBoard);\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\ttarget,\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\t5,\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_BG21_031:\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 = getRandomAliveMinion(nonGoldenMinions, Race.PIRATE, allCards);\r\n\t\t\tif (pirate) {\r\n\t\t\t\tmakeMinionGolden(pirate, avenger, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TonyTwoTusk_BG21_031_G:\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 = getRandomAliveMinion(nonGoldenMinions, Race.PIRATE, allCards);\r\n\t\t\t\tif (pirate) {\r\n\t\t\t\t\tmakeMinionGolden(pirate, avenger, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.GhoulOfTheFeast:\r\n\t\tcase CardIds.GhoulOfTheFeastBattlegrounds:\r\n\t\t\tconst ghoulMultiplier = avenger.cardId === CardIds.GhoulOfTheFeastBattlegrounds ? 2 : 1;\r\n\t\t\tgrantStatsToMinionsOfEachType(avenger, boardWithDeadEntity, ghoulMultiplier * 3, 0, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.HungeringAbomination:\r\n\t\tcase CardIds.HungeringAbominationBattlegrounds:\r\n\t\t\tconst abominationMultiplier = avenger.cardId === CardIds.HungeringAbominationBattlegrounds ? 2 : 1;\r\n\t\t\tmodifyAttack(avenger, abominationMultiplier * 1, boardWithDeadEntity, allCards);\r\n\t\t\tmodifyHealth(avenger, abominationMultiplier * 1, boardWithDeadEntity, allCards);\r\n\t\t\tafterStatsUpdate(avenger, boardWithDeadEntity, allCards);\r\n\t\t\tspectator.registerPowerTarget(avenger, avenger, boardWithDeadEntity);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ShadowyConstruct:\r\n\t\tcase CardIds.ShadowyConstructBattlegrounds:\r\n\t\t\tconst neighboursShadowy = getNeighbours(boardWithDeadEntity, null, deadEntityIndexFromRight);\r\n\t\t\tconst multiplierShadowy = avenger.cardId === CardIds.ShadowyConstructBattlegrounds ? 2 : 1;\r\n\t\t\tneighboursShadowy.forEach((neighbour) => {\r\n\t\t\t\tmodifyAttack(neighbour, multiplierShadowy * 1, boardWithDeadEntity, allCards);\r\n\t\t\t\tmodifyHealth(neighbour, multiplierShadowy * 1, boardWithDeadEntity, allCards);\r\n\t\t\t\tafterStatsUpdate(neighbour, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(avenger, neighbour, boardWithDeadEntity);\r\n\t\t\t});\r\n\t\t\tbreak;\r\n\t}\r\n\tavenger.avengeCurrent = avenger.avengeDefault;\r\n};\r\n\r\nconst handleHeroAvenge = (\r\n\tdeadEntity: BoardEntity,\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tcandidatesEntitiesSpawnedFromAvenge: BoardEntity[],\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n\tallCards: AllCardsService,\r\n) => {\r\n\t// https://twitter.com/LoewenMitchell/status/1491879869457879040\r\n\t// Not affected by Khadgar\r\n\tswitch (boardWithDeadEntityHero?.heroPowerId) {\r\n\t\tcase CardIds.Onyxia_Broodmother:\r\n\t\t\tcandidatesEntitiesSpawnedFromAvenge.push(\r\n\t\t\t\t...spawnEntities(\r\n\t\t\t\t\tCardIds.Onyxia_OnyxianWhelpToken,\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\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\tdeadEntity.friendly,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.VanndarStormpike_LeadTheStormpikes:\r\n\t\t\tboardWithDeadEntity\r\n\t\t\t\t.filter((entity) => !entity.definitelyDead && entity.health > 0)\r\n\t\t\t\t.forEach((entity) => {\r\n\t\t\t\t\tmodifyHealth(entity, 1, boardWithDeadEntity, allCards);\r\n\t\t\t\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t\t\t\t\tspectator.registerPowerTarget(boardWithDeadEntityHero, entity, boardWithDeadEntity);\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Drekthar_LeadTheFrostwolves:\r\n\t\t\tboardWithDeadEntity.forEach((entity) => {\r\n\t\t\t\tmodifyAttack(entity, 1, boardWithDeadEntity, allCards);\r\n\t\t\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(boardWithDeadEntityHero, entity, boardWithDeadEntity);\r\n\t\t\t});\r\n\t\t\tbreak;\r\n\t}\r\n\tboardWithDeadEntityHero.avengeCurrent = boardWithDeadEntityHero.avengeDefault;\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"avenge.js","sourceRoot":"","sources":["../../src/simulation/avenge.ts"],"names":[],"mappings":"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","sourcesContent":["import { 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 {\r\n\taddCardsInHand,\r\n\taddStatsToBoard,\r\n\tafterStatsUpdate,\r\n\tgetRandomAliveMinion,\r\n\tgetRandomMinionWithHighestHealth,\r\n\tgrantRandomStats,\r\n\tgrantStatsToMinionsOfEachType,\r\n\tmakeMinionGolden,\r\n\tmodifyAttack,\r\n\tmodifyHealth,\r\n} from '../utils';\r\nimport { dealDamageToEnemy, getNeighbours, performEntitySpawns } 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 applyAvengeEffects = (\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndexFromRight: 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\tconst candidatesEntitiesSpawnedFromAvenge: BoardEntity[] = [];\r\n\tupdateAvengeCounters(boardWithDeadEntity, boardWithDeadEntityHero);\r\n\tconst avengers = boardWithDeadEntity\r\n\t\t.filter((e) => !!e.avengeDefault && e.avengeCurrent === 0)\r\n\t\t// Get Tony to be processed first, because of the \"when turned golden, the minion ignores the death for the avenge counter\"\r\n\t\t// behavior\r\n\t\t.sort((a, b) => {\r\n\t\t\tif (a.cardId === CardIds.TonyTwoTusk_BG21_031 || a.cardId === CardIds.TonyTwoTusk_BG21_031_G) {\r\n\t\t\t\treturn -1;\r\n\t\t\t}\r\n\t\t\tif (b.cardId === CardIds.TonyTwoTusk_BG21_031 || b.cardId === CardIds.TonyTwoTusk_BG21_031_G) {\r\n\t\t\t\treturn 1;\r\n\t\t\t}\r\n\t\t\treturn 0;\r\n\t\t});\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\tdeadEntity,\r\n\t\t\tdeadEntityIndexFromRight,\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\t// console.log('updating dead entity avenge counter', boardWithDeadEntityHero.avengeCurrent, stringifySimpleCard(deadEntity, allCards));\r\n\tconst heroAvenger = !!boardWithDeadEntityHero.avengeDefault && boardWithDeadEntityHero.avengeCurrent === 0;\r\n\tif (heroAvenger) {\r\n\t\t// console.log(\r\n\t\t// \t'Hero is an avenger',\r\n\t\t// \tboardWithDeadEntityHero.avengeCurrent,\r\n\t\t// \tboardWithDeadEntityHero.avengeDefault,\r\n\t\t// \tboardWithDeadEntityHero.heroPowerId,\r\n\t\t// );\r\n\t\thandleHeroAvenge(\r\n\t\t\tdeadEntity,\r\n\t\t\tboardWithDeadEntity,\r\n\t\t\tboardWithDeadEntityHero,\r\n\t\t\totherBoard,\r\n\t\t\totherBoardHero,\r\n\t\t\tcandidatesEntitiesSpawnedFromAvenge,\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\tperformEntitySpawns(\r\n\t\tcandidatesEntitiesSpawnedFromAvenge,\r\n\t\tboardWithDeadEntity,\r\n\t\tboardWithDeadEntityHero,\r\n\t\tdeadEntity,\r\n\t\tdeadEntityIndexFromRight,\r\n\t\totherBoard,\r\n\t\totherBoardHero,\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 updateAvengeCounters = (board: readonly BoardEntity[], boardWithDeadEntityHero: BgsPlayerEntity) => {\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\tif (!!boardWithDeadEntityHero.avengeDefault) {\r\n\t\tboardWithDeadEntityHero.avengeCurrent -= 1;\r\n\t}\r\n};\r\n\r\nconst handleAvenge = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndexFromRight: number,\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, boardWithDeadEntity, allCards);\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\t// case CardIds.FrostwolfLieutenant:\r\n\t\t// case CardIds.FrostwolfLieutenantBattlegrounds:\r\n\t\t// \taddStatsToBoard(\r\n\t\t// \t\tavenger,\r\n\t\t// \t\tboardWithDeadEntity,\r\n\t\t// \t\tavenger.cardId === CardIds.FrostwolfLieutenantBattlegrounds ? 2 : 1,\r\n\t\t// \t\t0,\r\n\t\t// \t\tallCards,\r\n\t\t// \t\tspectator,\r\n\t\t// \t);\r\n\t\t// \tbreak;\r\n\t\tcase CardIds.StormpikeLieutenant:\r\n\t\tcase CardIds.StormpikeLieutenantBattlegrounds:\r\n\t\t\taddStatsToBoard(\r\n\t\t\t\tavenger,\r\n\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t0,\r\n\t\t\t\tavenger.cardId === CardIds.StormpikeLieutenantBattlegrounds ? 2 : 1,\r\n\t\t\t\tallCards,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\r\n\t\t\tconst target1 = grantRandomStats(avenger, boardWithDeadEntity, 6, 6, Race.BEAST, true, 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.PalescaleCrocolisk_BG21_001_G:\r\n\t\t\tconst target2 = grantRandomStats(avenger, boardWithDeadEntity, 12, 12, Race.BEAST, true, 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.PashmarTheVengeful:\r\n\t\tcase CardIds.PashmarTheVengefulBattlegrounds:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.WitchwingNestmatron_BG21_038:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.WitchwingNestmatron_BG21_038_G:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 2, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Thorncaller:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 1, boardWithDeadEntity, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ThorncallerBattlegrounds:\r\n\t\t\taddCardsInHand(boardWithDeadEntityHero, 2, boardWithDeadEntity, allCards, spectator, CardIds.BloodGem);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Sisefin_BG21_009:\r\n\t\t\tconst validTargets = boardWithDeadEntity.filter((e) => !e.poisonous);\r\n\t\t\tconst murloc = getRandomAliveMinion(validTargets, 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.Sisefin_BG21_009_G:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tconst validTargets = boardWithDeadEntity.filter((e) => !e.poisonous);\r\n\t\t\t\tconst murloc2 = getRandomAliveMinion(validTargets, 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_BG21_023:\r\n\t\t\t// This can be null if the avenge triggers when the last enemy minion dies as well\r\n\t\t\tconst target = getRandomMinionWithHighestHealth(otherBoard);\r\n\t\t\tspectator.registerPowerTarget(avenger, target, otherBoard);\r\n\t\t\tdealDamageToEnemy(\r\n\t\t\t\ttarget,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tavenger,\r\n\t\t\t\t5,\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.MechanoTank_BG21_023_G:\r\n\t\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\t\tconst target = getRandomMinionWithHighestHealth(otherBoard);\r\n\t\t\t\tspectator.registerPowerTarget(avenger, target, otherBoard);\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\ttarget,\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\t5,\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_BG21_031:\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 = getRandomAliveMinion(nonGoldenMinions, Race.PIRATE, allCards);\r\n\t\t\tif (pirate) {\r\n\t\t\t\tmakeMinionGolden(pirate, avenger, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TonyTwoTusk_BG21_031_G:\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 = getRandomAliveMinion(nonGoldenMinions, Race.PIRATE, allCards);\r\n\t\t\t\tif (pirate) {\r\n\t\t\t\t\tmakeMinionGolden(pirate, avenger, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.GhoulOfTheFeast:\r\n\t\tcase CardIds.GhoulOfTheFeastBattlegrounds:\r\n\t\t\tconst ghoulMultiplier = avenger.cardId === CardIds.GhoulOfTheFeastBattlegrounds ? 2 : 1;\r\n\t\t\tgrantStatsToMinionsOfEachType(avenger, boardWithDeadEntity, ghoulMultiplier * 3, 0, allCards, spectator);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.HungeringAbomination:\r\n\t\tcase CardIds.HungeringAbominationBattlegrounds:\r\n\t\t\tconst abominationMultiplier = avenger.cardId === CardIds.HungeringAbominationBattlegrounds ? 2 : 1;\r\n\t\t\tmodifyAttack(avenger, abominationMultiplier * 1, boardWithDeadEntity, allCards);\r\n\t\t\tmodifyHealth(avenger, abominationMultiplier * 1, boardWithDeadEntity, allCards);\r\n\t\t\tafterStatsUpdate(avenger, boardWithDeadEntity, allCards);\r\n\t\t\tspectator.registerPowerTarget(avenger, avenger, boardWithDeadEntity);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.ShadowyConstruct:\r\n\t\tcase CardIds.ShadowyConstructBattlegrounds:\r\n\t\t\tconst neighboursShadowy = getNeighbours(boardWithDeadEntity, null, deadEntityIndexFromRight);\r\n\t\t\tconst multiplierShadowy = avenger.cardId === CardIds.ShadowyConstructBattlegrounds ? 2 : 1;\r\n\t\t\tneighboursShadowy.forEach((neighbour) => {\r\n\t\t\t\tmodifyAttack(neighbour, multiplierShadowy * 1, boardWithDeadEntity, allCards);\r\n\t\t\t\tmodifyHealth(neighbour, multiplierShadowy * 1, boardWithDeadEntity, allCards);\r\n\t\t\t\tafterStatsUpdate(neighbour, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(avenger, neighbour, boardWithDeadEntity);\r\n\t\t\t});\r\n\t\t\tbreak;\r\n\t}\r\n\tavenger.avengeCurrent = avenger.avengeDefault;\r\n};\r\n\r\nconst handleHeroAvenge = (\r\n\tdeadEntity: BoardEntity,\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tcandidatesEntitiesSpawnedFromAvenge: BoardEntity[],\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n\tallCards: AllCardsService,\r\n) => {\r\n\t// https://twitter.com/LoewenMitchell/status/1491879869457879040\r\n\t// Not affected by Khadgar\r\n\tswitch (boardWithDeadEntityHero?.heroPowerId) {\r\n\t\tcase CardIds.Onyxia_Broodmother:\r\n\t\t\tcandidatesEntitiesSpawnedFromAvenge.push(\r\n\t\t\t\t...spawnEntities(\r\n\t\t\t\t\tCardIds.Onyxia_OnyxianWhelpToken,\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tboardWithDeadEntityHero,\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\tdeadEntity.friendly,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t),\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.VanndarStormpike_LeadTheStormpikes:\r\n\t\t\tboardWithDeadEntity\r\n\t\t\t\t.filter((entity) => !entity.definitelyDead && entity.health > 0)\r\n\t\t\t\t.forEach((entity) => {\r\n\t\t\t\t\tmodifyHealth(entity, 1, boardWithDeadEntity, allCards);\r\n\t\t\t\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t\t\t\t\tspectator.registerPowerTarget(boardWithDeadEntityHero, entity, boardWithDeadEntity);\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Drekthar_LeadTheFrostwolves:\r\n\t\t\tboardWithDeadEntity.forEach((entity) => {\r\n\t\t\t\tmodifyAttack(entity, 1, boardWithDeadEntity, allCards);\r\n\t\t\t\tafterStatsUpdate(entity, boardWithDeadEntity, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(boardWithDeadEntityHero, entity, boardWithDeadEntity);\r\n\t\t\t});\r\n\t\t\tbreak;\r\n\t}\r\n\tboardWithDeadEntityHero.avengeCurrent = boardWithDeadEntityHero.avengeDefault;\r\n};\r\n"]}
|
|
@@ -116,7 +116,7 @@ const handleDeathrattleEffects = (boardWithDeadEntity, boardWithDeadEntityHero,
|
|
|
116
116
|
break;
|
|
117
117
|
case "BG21_001":
|
|
118
118
|
for (let i = 0; i < multiplier; i++) {
|
|
119
|
-
const target = utils_2.grantRandomStats(deadEntity, boardWithDeadEntity, 6, 6, reference_data_1.Race.BEAST, allCards, spectator);
|
|
119
|
+
const target = utils_2.grantRandomStats(deadEntity, boardWithDeadEntity, 6, 6, reference_data_1.Race.BEAST, true, allCards, spectator);
|
|
120
120
|
if (!!target) {
|
|
121
121
|
spectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);
|
|
122
122
|
}
|
|
@@ -124,7 +124,7 @@ const handleDeathrattleEffects = (boardWithDeadEntity, boardWithDeadEntityHero,
|
|
|
124
124
|
break;
|
|
125
125
|
case "BG21_001_G":
|
|
126
126
|
for (let i = 0; i < multiplier; i++) {
|
|
127
|
-
const target = utils_2.grantRandomStats(deadEntity, boardWithDeadEntity, 12, 12, reference_data_1.Race.BEAST, allCards, spectator);
|
|
127
|
+
const target = utils_2.grantRandomStats(deadEntity, boardWithDeadEntity, 12, 12, reference_data_1.Race.BEAST, true, allCards, spectator);
|
|
128
128
|
if (!!target) {
|
|
129
129
|
spectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);
|
|
130
130
|
}
|
|
@@ -134,7 +134,7 @@ const handleDeathrattleEffects = (boardWithDeadEntity, boardWithDeadEntityHero,
|
|
|
134
134
|
case "BG25_022_G":
|
|
135
135
|
const scarletMultiplier = deadEntityCardId === "BG25_022_G" ? 2 : 1;
|
|
136
136
|
for (let i = 0; i < multiplier; i++) {
|
|
137
|
-
const target = utils_2.grantRandomStats(deadEntity, boardWithDeadEntity, scarletMultiplier * 1, scarletMultiplier * 2, reference_data_1.Race.UNDEAD, allCards, spectator);
|
|
137
|
+
const target = utils_2.grantRandomStats(deadEntity, boardWithDeadEntity, scarletMultiplier * 1, scarletMultiplier * 2, reference_data_1.Race.UNDEAD, false, allCards, spectator);
|
|
138
138
|
if (!!target) {
|
|
139
139
|
spectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);
|
|
140
140
|
}
|
|
@@ -345,7 +345,7 @@ exports.applyEarthInvocationEnchantment = applyEarthInvocationEnchantment;
|
|
|
345
345
|
const applyLeapFroggerEffect = (boardWithDeadEntity, deadEntity, isPremium, allCards, spectator, sharedState, multiplier = 1) => {
|
|
346
346
|
var _a;
|
|
347
347
|
multiplier = multiplier || 1;
|
|
348
|
-
const buffed = utils_2.grantRandomStats(deadEntity, boardWithDeadEntity, multiplier * (isPremium ? 2 : 1), multiplier * (isPremium ? 2 : 1), reference_data_1.Race.BEAST, allCards, spectator);
|
|
348
|
+
const buffed = utils_2.grantRandomStats(deadEntity, boardWithDeadEntity, multiplier * (isPremium ? 2 : 1), multiplier * (isPremium ? 2 : 1), reference_data_1.Race.BEAST, false, allCards, spectator);
|
|
349
349
|
if (buffed) {
|
|
350
350
|
buffed.enchantments = (_a = buffed.enchantments) !== null && _a !== void 0 ? _a : [];
|
|
351
351
|
buffed.enchantments.push({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deathrattle-effects.js","sourceRoot":"","sources":["../../src/simulation/deathrattle-effects.ts"],"names":[],"mappings":";;;AACA,iEAA8E;AAI9E,6CAA6F;AAC7F,oCAiBkB;AAClB,qCAA0F;AAC1F,6DAAqD;AAI9C,MAAM,4BAA4B,GAAG,CAAC,KAAoB,EAAE,UAAuB,EAAU,EAAE;;IACrG,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,iBAAsC,CAAC,CAAC;IAC9F,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,sBAAwC,CAAC,CAAC;IACtG,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,eAA2B,CAAC,CAAC,MAAM,CAAC;IACxF,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,iBAAwC,CAAC,CAAC,MAAM,CAAC;IAE3G,MAAM,iBAAiB,GAAG,OAAA,UAAU,CAAC,eAAe,0CAAE,QAAQ,aAAuB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,UAAU,GAAG,iBAAiB,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC;IAC7G,OAAO,UAAU,CAAC;AACnB,CAAC,CAAC;AATW,QAAA,4BAA4B,gCASvC;AAEK,MAAM,wBAAwB,GAAG,CACvC,mBAAkC,EAClC,uBAAwC,EACxC,UAAuB,EACvB,wBAAgC,EAChC,UAAyB,EACzB,cAA+B,EAC/B,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;;IACT,MAAM,UAAU,GAAG,oCAA4B,CAAC,mBAAmB,EAAE,UAAU,CAAC,CAAC;IAIjF,MAAM,OAAO,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,OAAC,UAAU,CAAC,eAAe,mCAAI,EAAE,CAAC,CAAC,CAAC;IAC3E,KAAK,MAAM,gBAAgB,IAAI,OAAO,EAAE;QACvC,QAAQ,gBAAgB,EAAE;YACzB;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,+BAAuB,CAAC,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBAC9E;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,+BAAuB,CAAC,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAC9E,+BAAuB,CAAC,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBAC9E;gBACD,MAAM;YACP,kCAAiE;YACjE;gBACC,MAAM,UAAU,GAAG,gBAAgB,mCAAkE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;wBACpC,IAAI,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;wBAChF,IAAI,EAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,CAAA,EAAE;4BAC1B,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;4BACrE,IAAI,EAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,CAAA,EAAE;gCAC1B,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;6BACxE;yBACD;wBACD,MAAM,MAAM,GAAG,kBAAU,CAAC,YAAY,CAAC,CAAC;wBACxC,IAAI,MAAM,EAAE;4BACX,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;gCACzB,0BAAkB,CAAC,MAAM,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;6BAChE;4BACD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;4BACpB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;4BACvB,SAAS,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;yBACvE;qBACD;iBACD;gBACD,MAAM;YACP,eAA0B;YAC1B;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,4BAAoB,CAAC,mBAAmB,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;iBAC9D;gBACD,MAAM;YACP;gBACC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACtG,MAAM;YACP;gBACC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACtG,MAAM;YACP;gBACC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBAC/G,MAAM;YACP;gBACC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,GAAG,EAAE,EAAE,UAAU,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;gBACjH,MAAM;YACP;gBACC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAChH,MAAM;YACP;gBACC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAChH,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,yBAAiB,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBAC3F;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,yBAAiB,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAC3F,yBAAiB,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBAC3F;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,yBAAiB,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;iBACpG;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,yBAAiB,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;oBACpG,yBAAiB,CAAC,UAAU,EAAE,mBAAmB,EAAE,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;iBACpG;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,sBAAsB,CAAC,mBAAmB,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;iBACjG;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,sBAAsB,CAAC,mBAAmB,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;iBAChG;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,MAAM,MAAM,GAAG,wBAAgB,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,qBAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACxG,IAAI,CAAC,CAAC,MAAM,EAAE;wBACb,SAAS,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;qBACvE;iBACD;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,MAAM,MAAM,GAAG,wBAAgB,CAAC,UAAU,EAAE,mBAAmB,EAAE,EAAE,EAAE,EAAE,EAAE,qBAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAC1G,IAAI,CAAC,CAAC,MAAM,EAAE;wBACb,SAAS,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;qBACvE;iBACD;gBACD,MAAM;YACP,gBAA0B;YAC1B;gBACC,MAAM,iBAAiB,GAAG,gBAAgB,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,MAAM,MAAM,GAAG,wBAAgB,CAC9B,UAAU,EACV,mBAAmB,EACnB,iBAAiB,GAAG,CAAC,EACrB,iBAAiB,GAAG,CAAC,EACrB,qBAAI,CAAC,MAAM,EACX,QAAQ,EACR,SAAS,CACT,CAAC;oBACF,IAAI,CAAC,CAAC,MAAM,EAAE;wBACb,SAAS,CAAC,mBAAmB,CAAC,UAAU,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;qBACvE;iBACD;gBACD,MAAM;YACP,gBAAkC;YAClC;gBACC,MAAM,kBAAkB,GAAG,gBAAgB,iBAA8C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClG,MAAM,WAAW,GAAG,kBAAkB,GAAG,CAAC,CAAC;gBAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAI,CAAC,qBAAI,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzG,uBAAuB,CAAC,UAAU,CAAC,iBAAiB,IAAI,WAAW,CAAC;iBACpE;gBACD,MAAM;YAyBP,kCAA4E;YAC5E;gBAGC,MAAM,cAAc,GACnB,UAAU,CAAC,MAAM,mCAA6E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACxG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,MAAM,2BAA2B,GAAG,WAAW,CAAC,MAAM;yBACpD,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,CAAC;yBAE3D,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,WAAC,OAAA,sBAAc,OAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,0CAAE,KAAK,EAAE,qBAAI,CAAC,IAAI,CAAC,CAAA,EAAA,CAAC,CAAC,MAAM,CAAC;oBAC/F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,2BAA2B,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;wBACzD,gCAAuB,CACtB,UAAU,EACV,cAAc,EACd,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;qBACF;iBACD;gBACD,MAAM;YAgBP,kBAAkC;YAClC;gBAGC,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,sBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;wBACrC,gCAAuB,CACtB,UAAU,EACV,cAAc,EACd,UAAU,EACV,CAAC,EACD,mBAAmB,EACnB,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;qBACF;iBACD;gBACD,MAAM;YACP,gBAAuB;YACvB;gBAGC,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,MAAM,OAAO,GAAG,2BAAkB,CAAC,mBAAmB,EAAE,IAAI,EAAE,wBAAwB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC;oBAEvG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;wBAE1B,0BAAiB,CAChB,MAAM,EACN,UAAU,EACV,cAAc,EACd,UAAU,EACV,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;oBACH,CAAC,CAAC,CAAC;iBACH;gBACD,MAAM;YACP,kBAAsC;YACtC;gBACC,MAAM,MAAM,GAAG,gBAAgB,sBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,8BAAsB,CACrB,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,cAAc,EACd,UAAU,EACV,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;iBACF;gBACD,MAAM;YACP,kBAAsC;YACtC;gBACC,MAAM,KAAK,GAAG,gBAAgB,mBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;wBAC/B,8BAAsB,CACrB,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,cAAc,EACd,UAAU,EACV,CAAC,EACD,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;qBACF;iBACD;gBACD,MAAM;YACP,gBAA+B;YAC/B;gBACC,IAAI,UAAU,CAAC,oBAAoB,EAAE;oBACpC,UAAU,CAAC,oBAAoB,CAAC,cAAc,GAAG,IAAI,CAAC;iBACtD;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE;oBACjE,MAAM,eAAe,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBAChF,IAAI,eAAe,EAAE;wBACpB,wBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;qBACxF;iBACD;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,EAAE;oBACjE,MAAM,eAAe,GAAG,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;oBAChF,IAAI,eAAe,EAAE;wBACpB,wBAAgB,CAAC,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;qBACxF;iBACD;gBACD,MAAM;YAGP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAI,CAAC,qBAAI,CAAC,MAAM,CAAC,CAAC,CAAC;iBAC/F;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,uBAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;iBAClF;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE;wBACzC,0BAAiB,CAChB,MAAM,EACN,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,CAAC,EACD,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;qBACF;iBACD;gBACD,MAAM;SACP;KACD;IAKD,IAAI,YAAY,GAAoE;QACnF,GAAG,OAAC,UAAU,CAAC,YAAY,mCAAI,EAAE,CAAC;QAClC,GAAG,OAAC,UAAU,CAAC,sBAAsB,mCAAI,EAAE,CAAC;KAC5C,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAMtC,MAAM,iBAAiB,GAAG,EAAE,CAAC;IAC7B,MAAM,iBAAiB,GAAG,uBAAe,CAAC,CAAC,WAAgB,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAClG,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAChE,IAAI,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAGrG,IACC,4BAA8G,CAAC,QAAQ,CACtH,MAAiB,CACjB,EACA;YACD,cAAc,GAAG,cAAc,GAAG,UAAU,CAAC;SAC7C;QAED,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC;QACnF,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,OAAO,WAAW,GAAG,cAAc,EAAE;YACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,cAAc,GAAG,WAAW,CAAC,CAAC;YACvE,OAAO,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,OAAO;gBAChB,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;aACnE,CAAC,CAAC;YACH,WAAW,IAAI,cAAc,CAAC;SAC9B;QACD,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;QACvC,QAAQ,WAAW,CAAC,MAAM,EAAE;YAC3B,iBAA0D;YAC1D;gBACC,sBAAsB,CACrB,mBAAmB,EACnB,UAAU,EACV,WAAW,CAAC,MAAM,kBAA2D,EAC7E,QAAQ,EACR,SAAS,EACT,WAAW,EACX,WAAW,CAAC,OAAO,IAAI,CAAC,CACxB,CAAC;gBACF,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,uCAA+B,CAAC,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;iBAC/G;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,sCAA8B,CAAC,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBACjG;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,uCAA+B,CAAC,mBAAmB,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;iBAClG;gBACD,MAAM;YACP;gBACC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;oBACpC,2CAAmC,CAClC,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;iBACF;gBACD,MAAM;SACP;KACD;AAKF,CAAC,CAAC;AAncW,QAAA,wBAAwB,4BAmcnC;AAEK,MAAM,mCAAmC,GAAG,CAClD,mBAAkC,EAClC,uBAAwC,EACxC,UAAuB,EACvB,UAAyB,EACzB,cAA+B,EAC/B,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IAET,MAAM,UAAU,GAAG,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,6BAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,mCAA2B,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC3D,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,0BAAiB,CAChB,MAAM,EACN,UAAU,EACV,cAAc,EACd,UAAU,EACV,CAAC,EACD,mBAAmB,EACnB,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;SACF;KACD;AACF,CAAC,CAAC;AA/BW,QAAA,mCAAmC,uCA+B9C;AAEK,MAAM,+BAA+B,GAAG,CAC9C,mBAAkC,EAClC,UAAuB,EACvB,YAA2C,EAC3C,QAAyB,EACzB,SAAoB,EACb,EAAE;IACT,MAAM,UAAU,GAAG,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,6BAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,MAAM,GAAgB,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAChF,IAAI,CAAC,CAAC,MAAM,EAAE;YACb,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC;YACpB,wBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;YACxD,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;SACzE;KACD;AACF,CAAC,CAAC;AAjBW,QAAA,+BAA+B,mCAiB1C;AAEK,MAAM,8BAA8B,GAAG,CAC7C,mBAAkC,EAClC,UAAuB,EACvB,YAA2C,EAC3C,QAAyB,EACzB,SAAoB,EACb,EAAE;IACT,MAAM,UAAU,GAAG,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,6BAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,MAAM,GAAgB,mBAAmB,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,CAAC,MAAM,EAAE;YACb,oBAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;YACnE,wBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;YACxD,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;SACzE;KACD;AACF,CAAC,CAAC;AAhBW,QAAA,8BAA8B,kCAgBzC;AAEK,MAAM,+BAA+B,GAAG,CAC9C,mBAAkC,EAClC,UAAuB,EACvB,YAA2C,EAC3C,QAAyB,EACzB,WAAwB,EACxB,SAAoB,EACb,EAAE;IACT,MAAM,UAAU,GAAG,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,6BAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,yBAAyB,GAAkB,mCAA2B,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;QACrG,yBAAyB,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5C,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;gBACxB,MAAM,sBAAiD;gBACvD,cAAc,EAAE,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,QAAQ;gBACpC,MAAM,EAAE,WAAW,CAAC,eAAe,EAAE;aACrC,CAAC,CAAC;YACH,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;KACH;AACF,CAAC,CAAC;AApBW,QAAA,+BAA+B,mCAoB1C;AAEF,MAAM,sBAAsB,GAAG,CAC9B,mBAAkC,EAClC,UAAuB,EACvB,SAAkB,EAClB,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,UAAU,GAAG,CAAC,EACP,EAAE;;IACT,UAAU,GAAG,UAAU,IAAI,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,wBAAgB,CAC9B,UAAU,EACV,mBAAmB,EACnB,UAAU,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAChC,UAAU,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAChC,qBAAI,CAAC,KAAK,EACV,QAAQ,EACR,SAAS,CACT,CAAC;IACF,IAAI,MAAM,EAAE;QACX,MAAM,CAAC,YAAY,SAAG,MAAM,CAAC,YAAY,mCAAI,EAAE,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,SAAS;gBAChB,CAAC;gBACD,CAAC,YAAqD;YACvD,cAAc,EAAE,UAAU,CAAC,QAAQ;YACnC,OAAO,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,EAAE,WAAW,CAAC,eAAe,EAAE;SACrC,CAAC,CAAC;KAIH;AACF,CAAC,CAAC;AAEK,MAAM,sBAAsB,GAAG,CACrC,UAAuB,EACvB,wBAAgC,EAChC,mBAAkC,EAClC,uBAAwC,EACxC,UAAyB,EACzB,cAA+B,EAC/B,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;;IAET,IAAI,sBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,qBAAI,CAAC,KAAK,CAAC,EAAE;QAC1E,0BAA0B,CAAC,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;KACrE;IACD,IAAI,sBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,qBAAI,CAAC,KAAK,CAAC,EAAE;QAC1E,sBAAsB,CACrB,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;IACD,IAAI,sBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,qBAAI,CAAC,IAAI,CAAC,EAAE;QACzE,kBAAkB,CAAC,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;KAC7D;IACD,IAAI,uBAAe,CAAC,UAAU,EAAE,qBAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;QACvD,sBAAsB,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;QACtD,sBAAsB,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;KAC7C;IACD,IAAI,UAAU,CAAC,KAAK,EAAE;QACrB,gCAAgC,CAAC,mBAAmB,EAAE,uBAAuB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;KACpG;IACD,IAAI,UAAU,CAAC,MAAM,eAA0B,IAAI,UAAU,CAAC,MAAM,iBAAuC,EAAE;QAC5G,wBAAwB,CAAC,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;KACnE;IAGD,mBAAmB;SACjB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,wBAAC,CAAC,CAAC,eAAe,0CAAE,QAAQ,kBAA4C,CAAC;SACtF,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACd,oBAAY,CAAC,CAAC,EAAE,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;QAClD,wBAAgB,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEJ,uBAAuB,CAAC,mBAAmB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAGlE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,WAAI,UAAU,CAAC,oBAAoB,0CAAE,SAAS,CAAA,EAAE;QACxE,IAAI,UAAU,CAAC,oBAAoB,CAAC,MAAM,cAAkC,EAAE;YAC7E,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACpG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,0BAAiB,CAChB,MAAM,EACN,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,CAAC,oBAAoB,EAC/B,CAAC,EACD,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;aACF;SACD;aAAM,IAAI,UAAU,CAAC,oBAAoB,CAAC,MAAM,sBAAuC,EAAE;YACzF,MAAM,OAAO,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;YACpG,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;gBACvB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC1B,0BAAiB,CAChB,MAAM,EACN,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,CAAC,oBAAoB,EAC/B,CAAC,EACD,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;aACF;SACD;aAgDI,IAAI,UAAU,CAAC,oBAAoB,CAAC,MAAM,cAA6B,EAAE;YAC7E,MAAM,WAAW,GAAG,kCAAa,aAEhC,CAAC,EACD,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,CAAC,UAAU,CAAC,QAAQ,EACpB,IAAI,CACJ,CAAC;YACF,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC;SACnF;aAAM,IAAI,UAAU,CAAC,oBAAoB,CAAC,MAAM,sBAA0C,EAAE;YAC5F,MAAM,WAAW,GAAG,kCAAa,qBAEhC,CAAC,EACD,UAAU,EACV,cAAc,EACd,mBAAmB,EACnB,uBAAuB,EACvB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,CAAC,UAAU,CAAC,QAAQ,EACpB,IAAI,CACJ,CAAC;YACF,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC;SACnF;aAAM,IAAI,UAAU,CAAC,oBAAoB,CAAC,MAAM,cAAsC,EAAE;YACxF,MAAM,YAAY,GAAG,UAAU;iBAC7B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,sBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,qBAAI,CAAC,MAAM,CAAC,CAAC;iBACtF,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACnF,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/B,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;gBACvD,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;gBACvD,wBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;gBACxD,SAAS,CAAC,mBAAmB,CAAC,UAAU,CAAC,oBAAoB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YACpF,CAAC,CAAC,CAAC;SACH;aAAM,IAAI,UAAU,CAAC,oBAAoB,CAAC,MAAM,sBAA2C,EAAE;YAC7F,MAAM,YAAY,GAAG,UAAU;iBAC7B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,sBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,qBAAI,CAAC,MAAM,CAAC,CAAC;iBACtF,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;YACnF,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC/B,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;gBACvD,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;gBACvD,wBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;gBACxD,SAAS,CAAC,mBAAmB,CAAC,UAAU,CAAC,oBAAoB,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;YACpF,CAAC,CAAC,CAAC;SACH;KACD;AACF,CAAC,CAAC;AAhMW,QAAA,sBAAsB,0BAgMjC;AAEK,MAAM,sBAAsB,GAAG,CACrC,MAAqB,EACrB,UAA2B,EAC3B,MAAqB,EACrB,UAA2B,EAC3B,YAAyB,EACzB,WAAmB,EACnB,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IACT,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;QAC/C,OAAO;KACP;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,0BAAiB,CAChB,MAAM,CAAC,CAAC,CAAC,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,WAAW,EACX,MAAM,EACN,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,0BAAiB,CAChB,MAAM,CAAC,CAAC,CAAC,EACT,MAAM,EACN,UAAU,EACV,YAAY,EACZ,WAAW,EACX,MAAM,EACN,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;AACF,CAAC,CAAC;AA7CW,QAAA,sBAAsB,0BA6CjC;AAEF,MAAM,sBAAsB,GAAG,CAC9B,iBAAgC,EAChC,qBAAsC,EACtC,aAA4B,EAC5B,iBAAkC,EAClC,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IACT,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;QACjE,OAAO;KAEP;IACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,cAAwB,CAAC,CAAC;IAC7F,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC/B,gCAAuB,CACtB,aAAa,EACb,iBAAiB,EACjB,OAAO,EACP,CAAC,EACD,iBAAiB,EACjB,qBAAqB,EACrB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;IACD,MAAM,cAAc,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,sBAAqC,CAAC,CAAC;IAChH,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE;QACrC,gCAAuB,CACtB,aAAa,EACb,iBAAiB,EACjB,OAAO,EACP,CAAC,EACD,iBAAiB,EACjB,qBAAqB,EACrB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;QACF,gCAAuB,CACtB,aAAa,EACb,iBAAiB,EACjB,OAAO,EACP,CAAC,EACD,iBAAiB,EACjB,qBAAqB,EACrB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;AAWF,CAAC,CAAC;AAEF,MAAM,0BAA0B,GAAG,CAAC,KAAoB,EAAE,QAAyB,EAAE,SAAoB,EAAQ,EAAE;IAElH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,iBAA6C,EAAE;YACjE,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,wBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACzD;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,sBAA+C,EAAE;YAC1E,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,wBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACzD;KACD;AACF,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAAC,KAAoB,EAAE,QAAyB,EAAE,SAAoB,EAAQ,EAAE;IAChH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,eAA0B,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,iBAAuC,EAAE;YACxG,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClF,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxD,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxD,wBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACzD;KACD;AACF,CAAC,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,KAAoB,EAAE,QAAyB,EAAE,SAAoB,EAAQ,EAAE;IAC/G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,eAAyB,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,iBAAsC,EAAE;YACtG,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACjF,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YACxD,wBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACzD;KACD;AACF,CAAC,CAAC;AAEF,MAAM,gCAAgC,GAAG,CACxC,KAAoB,EACpB,iBAAkC,EAClC,QAAyB,EACzB,SAAoB,EACb,EAAE;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,eAAkC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,iBAA+C,EAAE;YACxH,sBAAc,CACb,iBAAiB,EACjB,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,iBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACtE,KAAK,EACL,QAAQ,EACR,SAAS,CACT,CAAC;YACF,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACzD;KACD;AACF,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,KAAoB,EAAE,QAAyB,EAAE,SAAoB,EAAQ,EAAE;IAC1G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,cAAoB,EAAE;YACxC,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,wBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACzD;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,sBAAiC,EAAE;YAC5D,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,oBAAY,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC3C,wBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC5C,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACzD;KACD;AACF,CAAC,CAAC;AAgBK,MAAM,gBAAgB,GAAG,CAC/B,WAAwB,EACxB,YAAoC,EACpC,qBAAoC,EACpC,QAAyB,EAClB,EAAE;IACT,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE;QACtC,oBAAY,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QAC9E,IAAI,WAAW,CAAC,MAAM,4BAAqC,EAAE;YAC5D,oBAAY,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;SAC9E;KACD;AACF,CAAC,CAAC;AAZW,QAAA,gBAAgB,oBAY3B;AAEK,MAAM,oBAAoB,GAAG,CACnC,IAAiB,EACjB,YAAoC,EACpC,SAAoB,EACpB,QAAyB,EACzB,WAAwB,EACjB,EAAE;;IACT,MAAM,iBAAiB,GAAG,YAAY;SACpC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,cAAM,CAAC,MAAM,CAAC,CAAC;SACzF,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;IAClG,MAAM,iBAAiB,GAAG,YAAY;SACpC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,wBAAC,MAAM,CAAC,YAAY,0CAAE,MAAM,GAAA,CAAC;SAC/C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;SACjC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE;;QAAC,OAAA,CAAC;YAC1B,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,OAAO,QAAE,WAAW,CAAC,OAAO,mCAAI,CAAC;YACjC,MAAM,EAAE,WAAW,CAAC,eAAe,EAAE;SACrC,CAAC,CAAA;KAAA,CAAC;SACF,MAAM,CAAC,CAAC,WAAW,EAAE,EAAE,CACvB;;;;;;;;;;;KAWC,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAiB,CAAC,CACzC,CAAC;IAEH,MAAM,gCAAgC,SACrC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,CAAC,QAAC,CAAC,CAAC,sBAAsB,0CAAE,MAAM,CAAA,CAAA,EAAA,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC,mCAAI,EAAE,CAAC;IAC/G,MAAM,eAAe,GAAG,CAAC,GAAG,iBAAiB,EAAE,GAAG,iBAAiB,EAAE,GAAG,gCAAgC,CAAC,CAAC;IAW1G,IAAI,gBAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;QAEpC,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,IAAI,CAAC,sBAAsB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,EAAE,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC;KACpF;SAAM;QACN,IAAI,CAAC,sBAAsB,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC;KAC3F;AAEF,CAAC,CAAC;AAvDW,QAAA,oBAAoB,wBAuD/B;AAEF,MAAM,sBAAsB,GAAG,CAAC,mBAAkC,EAAE,QAAyB,EAAE,EAAE;IAChG,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAC1C,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,cAA6B,IAAI,MAAM,CAAC,MAAM,kBAA8B,CACrG,CAAC;IACF,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,sBAAoC,CAAC,CAAC;IACjH,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QAC3B,oBAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;QACxD,wBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IACH,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACjC,oBAAY,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;QACxD,wBAAgB,CAAC,MAAM,EAAE,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC","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, pickMultipleRandomDifferent, pickRandom } from '../services/utils';\r\nimport {\r\n\taddCardsInHand,\r\n\taddStatsToBoard,\r\n\tafterStatsUpdate,\r\n\tgrantAllDivineShield,\r\n\tgrantRandomAttack,\r\n\tgrantRandomDivineShield,\r\n\tgrantRandomHealth,\r\n\tgrantRandomStats,\r\n\thasCorrectTribe,\r\n\tisCorrectTribe,\r\n\tisFish,\r\n\tisGolden,\r\n\tmakeMinionGolden,\r\n\tmodifyAttack,\r\n\tmodifyHealth,\r\n\tupdateDivineShield,\r\n} from '../utils';\r\nimport { dealDamageToEnemy, dealDamageToRandomEnemy, findNearestEnemies } 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 computeDeathrattleMultiplier = (board: BoardEntity[], deadEntity: BoardEntity): number => {\r\n\tconst rivendare = board.find((entity) => entity.cardId === CardIds.BaronRivendare_BG_FP1_031);\r\n\tconst goldenRivendare = board.find((entity) => entity.cardId === CardIds.BaronRivendareBattlegrounds);\r\n\tconst titus = board.filter((entity) => entity.cardId === CardIds.TitusRivendare).length;\r\n\tconst goldenTitus = board.filter((entity) => entity.cardId === CardIds.TitusRivendareBattlegrounds).length;\r\n\t// The multiplication / addition order here is irrelelvant, since Baron has been removed once Titus was introduced\r\n\tconst scourgeMultiplier = deadEntity.additionalCards?.includes(CardIds.ScourgeTroll) ? 2 : 1;\r\n\tconst multiplier = scourgeMultiplier * ((goldenRivendare ? 3 : rivendare ? 2 : 1) + titus + 2 * goldenTitus);\r\n\treturn multiplier;\r\n};\r\n\r\nexport const handleDeathrattleEffects = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndexFromRight: number,\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 multiplier = computeDeathrattleMultiplier(boardWithDeadEntity, deadEntity);\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\r\n\tconst cardIds = [deadEntity.cardId, ...(deadEntity.additionalCards ?? [])];\r\n\tfor (const deadEntityCardId of cardIds) {\r\n\t\tswitch (deadEntityCardId) {\r\n\t\t\tcase CardIds.SelflessHero_BG_OG_221:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SelflessHeroBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SpiritOfAirBattlegrounds_TB_BaconShop_HERO_76_Buddy:\r\n\t\t\tcase CardIds.SpiritOfAirBattlegrounds_TB_BaconShop_HERO_76_Buddy_G:\r\n\t\t\t\tconst iterations = deadEntityCardId === CardIds.SpiritOfAirBattlegrounds_TB_BaconShop_HERO_76_Buddy_G ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tfor (let j = 0; j < iterations; j++) {\r\n\t\t\t\t\t\tlet validTargets = boardWithDeadEntity.filter((entity) => !entity.divineShield);\r\n\t\t\t\t\t\tif (!validTargets?.length) {\r\n\t\t\t\t\t\t\tvalidTargets = boardWithDeadEntity.filter((entity) => !entity.taunt);\r\n\t\t\t\t\t\t\tif (!validTargets?.length) {\r\n\t\t\t\t\t\t\t\tvalidTargets = boardWithDeadEntity.filter((entity) => !entity.windfury);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tconst target = pickRandom(validTargets);\r\n\t\t\t\t\t\tif (target) {\r\n\t\t\t\t\t\t\tif (!target.divineShield) {\r\n\t\t\t\t\t\t\t\tupdateDivineShield(target, boardWithDeadEntity, true, allCards);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\ttarget.taunt = true;\r\n\t\t\t\t\t\t\ttarget.windfury = true;\r\n\t\t\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\r\n\t\t\t\t\t\t}\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.NadinaTheRed:\r\n\t\t\tcase CardIds.NadinaTheRedBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantAllDivineShield(boardWithDeadEntity, 'DRAGON', allCards);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SpawnOfNzoth_BG_OG_256:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 1, multiplier * 1, allCards, spectator);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SpawnOfNzothBattlegrounds:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 2, multiplier * 2, allCards, spectator);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.GoldrinnTheGreatWolf:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 5, multiplier * 5, allCards, spectator, 'BEAST');\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.GoldrinnTheGreatWolfBattlegrounds:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 10, multiplier * 10, allCards, spectator, 'BEAST');\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.KingBagurgle:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 2, multiplier * 2, allCards, spectator, 'MURLOC');\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.KingBagurgleBattlegrounds:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 4, multiplier * 4, allCards, spectator, 'MURLOC');\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.FiendishServant:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.FiendishServantBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.ImpulsiveTrickster:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.ImpulsiveTricksterBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.Leapfrogger:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, false, allCards, spectator, sharedState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.LeapfroggerBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator, sharedState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst target = grantRandomStats(deadEntity, boardWithDeadEntity, 6, 6, Race.BEAST, allCards, spectator);\r\n\t\t\t\t\tif (!!target) {\r\n\t\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\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.PalescaleCrocolisk_BG21_001_G:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst target = grantRandomStats(deadEntity, boardWithDeadEntity, 12, 12, Race.BEAST, allCards, spectator);\r\n\t\t\t\t\tif (!!target) {\r\n\t\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\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.ScarletSkull:\r\n\t\t\tcase CardIds.ScarletSkullBattlegrounds:\r\n\t\t\t\tconst scarletMultiplier = deadEntityCardId === CardIds.ScarletSkullBattlegrounds ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst target = grantRandomStats(\r\n\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\tscarletMultiplier * 1,\r\n\t\t\t\t\t\tscarletMultiplier * 2,\r\n\t\t\t\t\t\tRace.UNDEAD,\r\n\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tif (!!target) {\r\n\t\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\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.AnubarakNerubianKing:\r\n\t\t\tcase CardIds.AnubarakNerubianKingBattlegrounds:\r\n\t\t\t\tconst anubarakMultiplier = deadEntityCardId === CardIds.AnubarakNerubianKingBattlegrounds ? 2 : 1;\r\n\t\t\t\tconst attackBonus = anubarakMultiplier * 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, attackBonus, 0, allCards, spectator, Race[Race.UNDEAD]);\r\n\t\t\t\t\tboardWithDeadEntityHero.globalInfo.UndeadAttackBonus += attackBonus;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.ElementiumSquirrelBombBattlegrounds_TB_BaconShop_HERO_17_Buddy:\r\n\t\t\t// \t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t// \t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\t// \tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t// \t\tconst numberOfDeadMechsThisCombat = sharedState.deaths\r\n\t\t\t// \t\t\t.filter((entity) => entity.friendly === deadEntity.friendly)\r\n\t\t\t// \t\t\t// eslint-disable-next-line prettier/prettier\r\n\t\t\t// \t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId)?.races, Race.MECH)).length;\r\n\t\t\t// \t\tfor (let j = 0; j < numberOfDeadMechsThisCombat + 1; j++) {\r\n\t\t\t// \t\t\tdealDamageToRandomEnemy(\r\n\t\t\t// \t\t\t\totherBoard,\r\n\t\t\t// \t\t\t\totherBoardHero,\r\n\t\t\t// \t\t\t\tdeadEntity,\r\n\t\t\t// \t\t\t\t3,\r\n\t\t\t// \t\t\t\tboardWithDeadEntity,\r\n\t\t\t// \t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t// \t\t\t\tallCards,\r\n\t\t\t// \t\t\t\tcardsData,\r\n\t\t\t// \t\t\t\tsharedState,\r\n\t\t\t// \t\t\t\tspectator,\r\n\t\t\t// \t\t\t);\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.ElementiumSquirrelBombBattlegrounds_TB_BaconShop_HERO_17_Buddy:\r\n\t\t\tcase CardIds.ElementiumSquirrelBombBattlegrounds_TB_BaconShop_HERO_17_Buddy_G:\r\n\t\t\t\t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t\t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\t\tconst squirrelDamage =\r\n\t\t\t\t\tdeadEntity.cardId === CardIds.ElementiumSquirrelBombBattlegrounds_TB_BaconShop_HERO_17_Buddy_G ? 4 : 2;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst numberOfDeadMechsThisCombat = sharedState.deaths\r\n\t\t\t\t\t\t.filter((entity) => entity.friendly === deadEntity.friendly)\r\n\t\t\t\t\t\t// eslint-disable-next-line prettier/prettier\r\n\t\t\t\t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId)?.races, Race.MECH)).length;\r\n\t\t\t\t\tfor (let j = 0; j < numberOfDeadMechsThisCombat + 1; j++) {\r\n\t\t\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\tsquirrelDamage,\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// for (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\t// break;\r\n\t\t\tcase CardIds.KaboomBot_BG_BOT_606:\r\n\t\t\tcase CardIds.KaboomBotBattlegrounds:\r\n\t\t\t\t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t\t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\t\tconst kaboomLoops = deadEntity.cardId === CardIds.KaboomBotBattlegrounds ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tfor (let j = 0; j < kaboomLoops; j++) {\r\n\t\t\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\t4,\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\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.DrBoombox:\r\n\t\t\tcase CardIds.DrBoomboxBattlegrounds:\r\n\t\t\t\t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t\t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\t\tconst boomboxDamage = deadEntity.cardId === CardIds.DrBoomboxBattlegrounds ? 14 : 7;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst targets = findNearestEnemies(boardWithDeadEntity, null, deadEntityIndexFromRight, otherBoard, 2);\r\n\t\t\t\t\t// console.debug('nearest', stringifySimple(targets));\r\n\t\t\t\t\ttargets.forEach((target) => {\r\n\t\t\t\t\t\t// console.debug('dealing damage to', stringifySimpleCard(target));\r\n\t\t\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\t\t\ttarget,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\tboomboxDamage,\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\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.UnstableGhoul_BG_FP1_024:\r\n\t\t\tcase CardIds.UnstableGhoulBattlegrounds:\r\n\t\t\t\tconst damage = deadEntityCardId === CardIds.UnstableGhoulBattlegrounds ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tdealDamageToAllMinions(\r\n\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\tdamage,\r\n\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\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.TunnelBlaster_BG_DAL_775:\r\n\t\t\tcase CardIds.TunnelBlasterBattlegrounds:\r\n\t\t\t\tconst loops = deadEntityCardId === CardIds.TunnelBlasterBattlegrounds ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tfor (let j = 0; j < loops; j++) {\r\n\t\t\t\t\t\tdealDamageToAllMinions(\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\t3,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\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.LeeroyTheReckless:\r\n\t\t\tcase CardIds.LeeroyTheRecklessBattlegrounds:\r\n\t\t\t\tif (deadEntity.lastAffectedByEntity) {\r\n\t\t\t\t\tdeadEntity.lastAffectedByEntity.definitelyDead = true;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SrTombDiverBattlegrounds_TB_BaconShop_HERO_41_Buddy:\r\n\t\t\t\tfor (let i = 0; i < Math.min(1, boardWithDeadEntity.length); i++) {\r\n\t\t\t\t\tconst rightMostMinion = boardWithDeadEntity[boardWithDeadEntity.length - 1 - i];\r\n\t\t\t\t\tif (rightMostMinion) {\r\n\t\t\t\t\t\tmakeMinionGolden(rightMostMinion, deadEntity, boardWithDeadEntity, 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.SrTombDiverBattlegrounds_TB_BaconShop_HERO_41_Buddy_G:\r\n\t\t\t\tfor (let i = 0; i < Math.min(2, boardWithDeadEntity.length); i++) {\r\n\t\t\t\t\tconst rightMostMinion = boardWithDeadEntity[boardWithDeadEntity.length - 1 - i];\r\n\t\t\t\t\tif (rightMostMinion) {\r\n\t\t\t\t\t\tmakeMinionGolden(rightMostMinion, deadEntity, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t// Putricide-only\r\n\t\t\tcase CardIds.Banshee_BG_RLK_957:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, 2, 1, allCards, spectator, Race[Race.UNDEAD]);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.LostSpirit_BG26_GIL_513:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, 1, 0, allCards, spectator, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.TickingAbomination_BG_ICC_099:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tfor (const entity of boardWithDeadEntity) {\r\n\t\t\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\t5,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\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\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\r\n\tlet enchantments: { cardId: string; originEntityId?: number; repeats?: number }[] = [\r\n\t\t...(deadEntity.enchantments ?? []),\r\n\t\t...(deadEntity.rememberedDeathrattles ?? []),\r\n\t].sort((a, b) => a.timing - b.timing);\r\n\t// In some cases it's possible that there are way too many enchantments because of the frog\r\n\t// In that case, we make a trade-off and don't trigger the \"on stats change\" trigger as\r\n\t// often as we should, so that we can have the stats themselves correct\r\n\t// We don't want to lump everything together, as it skews the stats when there are a lot of buffs\r\n\t// Instead, we build groups\r\n\tconst maxNumberOfGroups = 12;\r\n\tconst enchantmentGroups = groupByFunction((enchantment: any) => enchantment.cardId)(enchantments);\r\n\tenchantments = Object.keys(enchantmentGroups).flatMap((cardId) => {\r\n\t\tlet repeatsToApply = enchantmentGroups[cardId].map((e) => e.repeats || 1).reduce((a, b) => a + b, 0);\r\n\r\n\t\t// Frogs include the multiplers here directly\r\n\t\tif (\r\n\t\t\t[CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000e, CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge].includes(\r\n\t\t\t\tcardId as CardIds,\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\trepeatsToApply = repeatsToApply * multiplier;\r\n\t\t}\r\n\r\n\t\tconst results = [];\r\n\t\tconst repeatsPerBuff = Math.max(1, Math.floor(repeatsToApply / maxNumberOfGroups));\r\n\t\tlet repeatsDone = 0;\r\n\t\twhile (repeatsDone < repeatsToApply) {\r\n\t\t\tconst repeats = Math.min(repeatsPerBuff, repeatsToApply - repeatsDone);\r\n\t\t\tresults.push({\r\n\t\t\t\tcardId: cardId,\r\n\t\t\t\trepeats: repeats,\r\n\t\t\t\ttiming: Math.min(...enchantmentGroups[cardId].map((e) => e.timing)),\r\n\t\t\t});\r\n\t\t\trepeatsDone += repeatsPerBuff;\r\n\t\t}\r\n\t\treturn results;\r\n\t});\r\n\tfor (const enchantment of enchantments) {\r\n\t\tswitch (enchantment.cardId) {\r\n\t\t\tcase CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000e:\r\n\t\t\tcase CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge:\r\n\t\t\t\tapplyLeapFroggerEffect(\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\tenchantment.cardId === CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tenchantment.repeats || 1,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.EarthRecollectionEnchantment:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyEarthInvocationEnchantment(boardWithDeadEntity, deadEntity, deadEntity, allCards, sharedState, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.FireRecollectionEnchantment:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyFireInvocationEnchantment(boardWithDeadEntity, deadEntity, deadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.WaterRecollectionEnchantment:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyWaterInvocationEnchantment(boardWithDeadEntity, deadEntity, deadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.LightningRecollectionEnchantment:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyLightningInvocationEnchantment(\r\n\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\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\t// const playerCopy = boardWithDeadEntity.map((e) => ({ ...e, lastAffectedByEntity: null }));\r\n\t// const oppCopy = otherBoard.map((e) => ({ ...e, lastAffectedByEntity: null }));\r\n\t// console.log('player board', boardWithDeadEntity.length, playerCopy.length, playerCopy.map((e) => JSON.stringify(e)).join('\\n'));\r\n\t// console.log('opp board', JSON.stringify(oppCopy));\r\n};\r\n\r\nexport const applyLightningInvocationEnchantment = (\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\t// Because the golden version doubles all the remembered effects\r\n\tconst multiplier = deadEntity?.cardId === CardIds.SpiritRaptorBattlegrounds ? 2 : 1;\r\n\tfor (let i = 0; i < multiplier; i++) {\r\n\t\tconst targets = pickMultipleRandomDifferent(otherBoard, 5);\r\n\t\tfor (const target of targets) {\r\n\t\t\tdealDamageToEnemy(\r\n\t\t\t\ttarget,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tdeadEntity,\r\n\t\t\t\t1,\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}\r\n\t}\r\n};\r\n\r\nexport const applyWaterInvocationEnchantment = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tdeadEntity: BoardEntity,\r\n\tsourceEntity: BgsPlayerEntity | BoardEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst multiplier = deadEntity?.cardId === CardIds.SpiritRaptorBattlegrounds ? 2 : 1;\r\n\tfor (let i = 0; i < multiplier; i++) {\r\n\t\tconst target: BoardEntity = boardWithDeadEntity[boardWithDeadEntity.length - 1];\r\n\t\tif (!!target) {\r\n\t\t\tmodifyHealth(target, 3, boardWithDeadEntity, allCards);\r\n\t\t\ttarget.taunt = true;\r\n\t\t\tafterStatsUpdate(target, boardWithDeadEntity, allCards);\r\n\t\t\tspectator.registerPowerTarget(sourceEntity, target, boardWithDeadEntity);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const applyFireInvocationEnchantment = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tdeadEntity: BoardEntity,\r\n\tsourceEntity: BgsPlayerEntity | BoardEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst multiplier = deadEntity?.cardId === CardIds.SpiritRaptorBattlegrounds ? 2 : 1;\r\n\tfor (let i = 0; i < multiplier; i++) {\r\n\t\tconst target: BoardEntity = boardWithDeadEntity[0];\r\n\t\tif (!!target) {\r\n\t\t\tmodifyAttack(target, target.attack, boardWithDeadEntity, allCards);\r\n\t\t\tafterStatsUpdate(target, boardWithDeadEntity, allCards);\r\n\t\t\tspectator.registerPowerTarget(sourceEntity, target, boardWithDeadEntity);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const applyEarthInvocationEnchantment = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tdeadEntity: BoardEntity,\r\n\tsourceEntity: BgsPlayerEntity | BoardEntity,\r\n\tallCards: AllCardsService,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst multiplier = deadEntity?.cardId === CardIds.SpiritRaptorBattlegrounds ? 2 : 1;\r\n\tfor (let i = 0; i < multiplier; i++) {\r\n\t\tconst minionsGrantedDeathrattle: BoardEntity[] = pickMultipleRandomDifferent(boardWithDeadEntity, 4);\r\n\t\tminionsGrantedDeathrattle.forEach((minion) => {\r\n\t\t\tminion.enchantments.push({\r\n\t\t\t\tcardId: CardIds.EarthInvocation_ElementEarthEnchantment,\r\n\t\t\t\toriginEntityId: deadEntity?.entityId,\r\n\t\t\t\ttiming: sharedState.currentEntityId++,\r\n\t\t\t});\r\n\t\t\tspectator.registerPowerTarget(sourceEntity, minion, boardWithDeadEntity);\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\tsharedState: SharedState,\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\r\n\t\t\t\t? CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge\r\n\t\t\t\t: CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000e,\r\n\t\t\toriginEntityId: deadEntity.entityId,\r\n\t\t\trepeats: multiplier > 1 ? multiplier : 1,\r\n\t\t\ttiming: sharedState.currentEntityId++,\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\nexport const applyMinionDeathEffect = (\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndexFromRight: 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).races, Race.BEAST)) {\r\n\t\tapplyScavengingHyenaEffect(boardWithDeadEntity, allCards, spectator);\r\n\t}\r\n\tif (isCorrectTribe(allCards.getCard(deadEntity.cardId).races, 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).races, 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\tif (deadEntity.taunt) {\r\n\t\tapplyBristlemaneScrapsmithEffect(boardWithDeadEntity, boardWithDeadEntityHero, allCards, spectator);\r\n\t}\r\n\tif (deadEntity.cardId === CardIds.EternalKnight || deadEntity.cardId === CardIds.EternalKnightBattlegrounds) {\r\n\t\tapplyEternalKnightEffect(boardWithDeadEntity, allCards, spectator);\r\n\t}\r\n\r\n\t// Putricide-only\r\n\tboardWithDeadEntity\r\n\t\t.filter((e) => e.additionalCards?.includes(CardIds.FlesheatingGhoulLegacy_BG26_tt_004))\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyAttack(e, 1, boardWithDeadEntity, allCards);\r\n\t\t\tafterStatsUpdate(e, boardWithDeadEntity, allCards);\r\n\t\t});\r\n\r\n\tapplyRotHideGnollEffect(boardWithDeadEntity, allCards, spectator);\r\n\r\n\t// Overkill\r\n\tif (deadEntity.health < 0 && deadEntity.lastAffectedByEntity?.attacking) {\r\n\t\tif (deadEntity.lastAffectedByEntity.cardId === CardIds.HeraldOfFlame_BGS_032) {\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}\r\n\t\t// else if (deadEntity.lastAffectedByEntity.cardId === CardIds.WildfireElemental && deadEntity.lastAffectedByEntity.attacking) {\r\n\t\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// \t// Prevent propagation of the effect\r\n\t\t// \tdeadEntity.lastAffectedByEntity.attacking = false;\r\n\t\t// \tconst neighbours = getNeighbours(boardWithDeadEntity, null, boardWithDeadEntity.length - deadEntityIndexFromRight);\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\tdeadEntity.lastAffectedByEntity,\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 (\r\n\t\t// \tdeadEntity.lastAffectedByEntity.cardId === CardIds.WildfireElementalBattlegrounds &&\r\n\t\t// \tdeadEntity.lastAffectedByEntity.attacking\r\n\t\t// ) {\r\n\t\t// \tconst excessDamage = -deadEntity.health;\r\n\t\t// \tdeadEntity.lastAffectedByEntity.attacking = false;\r\n\t\t// \tconst neighbours = getNeighbours(boardWithDeadEntity, null, boardWithDeadEntity.length - deadEntityIndexFromRight);\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\tdeadEntity.lastAffectedByEntity,\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// }\r\n\t\telse 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(otherBoard.length - deadEntityIndexFromRight, 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(otherBoard.length - deadEntityIndexFromRight, 0, ...newEntities);\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.SeabreakerGoliath_BGS_080) {\r\n\t\t\tconst otherPirates = otherBoard\r\n\t\t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId).races, 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, boardWithDeadEntity, allCards);\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).races, 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, boardWithDeadEntity, allCards);\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}\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}\r\n\tfor (let i = 0; i < board1.length; i++) {\r\n\t\tdealDamageToEnemy(\r\n\t\t\tboard1[i],\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdamageSource,\r\n\t\t\tdamageDealt,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\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\tfor (let i = 0; i < board2.length; i++) {\r\n\t\tdealDamageToEnemy(\r\n\t\t\tboard2[i],\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdamageSource,\r\n\t\t\tdamageDealt,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\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\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_BG_EX1_531) {\r\n\t\t\tmodifyAttack(board[i], 2, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 1, board, allCards);\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.ScavengingHyenaLegacyBattlegrounds) {\r\n\t\t\tmodifyAttack(board[i], 4, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 2, board, allCards);\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 applyEternalKnightEffect = (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.EternalKnight || board[i].cardId === CardIds.EternalKnightBattlegrounds) {\r\n\t\t\tconst multiplier = board[i].cardId === CardIds.EternalKnightBattlegrounds ? 2 : 1;\r\n\t\t\tmodifyAttack(board[i], multiplier * 1, board, allCards);\r\n\t\t\tmodifyHealth(board[i], multiplier * 1, board, allCards);\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 applyRotHideGnollEffect = (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.RotHideGnoll || board[i].cardId === CardIds.RotHideGnollBattlegrounds) {\r\n\t\t\tconst multiplier = board[i].cardId === CardIds.RotHideGnollBattlegrounds ? 2 : 1;\r\n\t\t\tmodifyAttack(board[i], multiplier * 1, board, allCards);\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 applyBristlemaneScrapsmithEffect = (\r\n\tboard: BoardEntity[],\r\n\tboardPlayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].cardId === CardIds.BristlemaneScrapsmith || board[i].cardId === CardIds.BristlemaneScrapsmithBattlegrounds) {\r\n\t\t\taddCardsInHand(\r\n\t\t\t\tboardPlayerEntity,\r\n\t\t\t\tboard[i].cardId === CardIds.BristlemaneScrapsmithBattlegrounds ? 2 : 1,\r\n\t\t\t\tboard,\r\n\t\t\t\tallCards,\r\n\t\t\t\tspectator,\r\n\t\t\t);\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, board, allCards);\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, board, allCards);\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\nexport const applyMonstrosity = (\r\n\tmonstrosity: BoardEntity,\r\n\tdeadEntities: readonly BoardEntity[],\r\n\tboardWithDeadEntities: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n): void => {\r\n\tfor (const deadEntity of deadEntities) {\r\n\t\tmodifyAttack(monstrosity, deadEntity.attack, boardWithDeadEntities, allCards);\r\n\t\tif (monstrosity.cardId === CardIds.MonstrosityBattlegrounds) {\r\n\t\t\tmodifyAttack(monstrosity, deadEntity.attack, boardWithDeadEntities, allCards);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const rememberDeathrattles = (\r\n\tfish: BoardEntity,\r\n\tdeadEntities: readonly BoardEntity[],\r\n\tcardsData: CardsData,\r\n\tallCards: AllCardsService,\r\n\tsharedState: SharedState,\r\n): void => {\r\n\tconst validDeathrattles = deadEntities\r\n\t\t.filter((entity) => cardsData.validDeathrattles.includes(entity.cardId) || isFish(entity))\r\n\t\t.map((entity) => ({ cardId: entity.cardId, repeats: 1, timing: sharedState.currentEntityId++ }));\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.flatMap((enchantment) => ({\r\n\t\t\tcardId: enchantment.cardId,\r\n\t\t\trepeats: enchantment.repeats ?? 1,\r\n\t\t\ttiming: sharedState.currentEntityId++,\r\n\t\t}))\r\n\t\t.filter((enchantment) =>\r\n\t\t\t[\r\n\t\t\t\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantment_BG_BOT_312e,\r\n\t\t\t\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantmentBattlegrounds,\r\n\t\t\t\tCardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000e,\r\n\t\t\t\tCardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge,\r\n\t\t\t\tCardIds.LivingSpores_LivingSporesEnchantment,\r\n\t\t\t\tCardIds.SneedsReplicator_ReplicateEnchantment,\r\n\t\t\t\tCardIds.EarthInvocation_ElementEarthEnchantment,\r\n\t\t\t\tCardIds.FireInvocation_ElementFireEnchantment,\r\n\t\t\t\tCardIds.WaterInvocation_ElementWaterEnchantment,\r\n\t\t\t\tCardIds.LightningInvocation,\r\n\t\t\t].includes(enchantment.cardId as CardIds),\r\n\t\t);\r\n\t// Multiple fish\r\n\tconst deadEntityRememberedDeathrattles =\r\n\t\tdeadEntities.filter((e) => !!e.rememberedDeathrattles?.length).flatMap((e) => e.rememberedDeathrattles) ?? [];\r\n\tconst newDeathrattles = [...validDeathrattles, ...validEnchantments, ...deadEntityRememberedDeathrattles];\r\n\t// Order is important - the DR are triggered in the ordered the minions have died\r\n\t// console.log(\r\n\t// \t'remembering deathrattle',\r\n\t// \t'\\n',\r\n\t// \tstringifySimpleCard(fish, allCards),\r\n\t// \t'\\n',\r\n\t// \tstringifySimple(deadEntities, allCards),\r\n\t// \t'\\n',\r\n\t// \tfish.rememberedDeathrattles,\r\n\t// );\r\n\tif (isGolden(fish.cardId, allCards)) {\r\n\t\t// https://stackoverflow.com/questions/33305152/how-to-duplicate-elements-in-a-js-array\r\n\t\tconst doubleDr = newDeathrattles.reduce((res, current) => res.concat([current, current]), []);\r\n\t\tfish.rememberedDeathrattles = [...(fish.rememberedDeathrattles || []), ...doubleDr];\r\n\t} else {\r\n\t\tfish.rememberedDeathrattles = [...(fish.rememberedDeathrattles || []), ...newDeathrattles];\r\n\t}\r\n\t// console.log('remembering deathrattle after', '\\n', 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, pickMultipleRandomDifferent, pickRandom } from '../services/utils';\r\nimport {\r\n\taddCardsInHand,\r\n\taddStatsToBoard,\r\n\tafterStatsUpdate,\r\n\tgrantAllDivineShield,\r\n\tgrantRandomAttack,\r\n\tgrantRandomDivineShield,\r\n\tgrantRandomHealth,\r\n\tgrantRandomStats,\r\n\thasCorrectTribe,\r\n\tisCorrectTribe,\r\n\tisFish,\r\n\tisGolden,\r\n\tmakeMinionGolden,\r\n\tmodifyAttack,\r\n\tmodifyHealth,\r\n\tupdateDivineShield,\r\n} from '../utils';\r\nimport { dealDamageToEnemy, dealDamageToRandomEnemy, findNearestEnemies } 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 computeDeathrattleMultiplier = (board: BoardEntity[], deadEntity: BoardEntity): number => {\r\n\tconst rivendare = board.find((entity) => entity.cardId === CardIds.BaronRivendare_BG_FP1_031);\r\n\tconst goldenRivendare = board.find((entity) => entity.cardId === CardIds.BaronRivendareBattlegrounds);\r\n\tconst titus = board.filter((entity) => entity.cardId === CardIds.TitusRivendare).length;\r\n\tconst goldenTitus = board.filter((entity) => entity.cardId === CardIds.TitusRivendareBattlegrounds).length;\r\n\t// The multiplication / addition order here is irrelelvant, since Baron has been removed once Titus was introduced\r\n\tconst scourgeMultiplier = deadEntity.additionalCards?.includes(CardIds.ScourgeTroll) ? 2 : 1;\r\n\tconst multiplier = scourgeMultiplier * ((goldenRivendare ? 3 : rivendare ? 2 : 1) + titus + 2 * goldenTitus);\r\n\treturn multiplier;\r\n};\r\n\r\nexport const handleDeathrattleEffects = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tboardWithDeadEntityHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndexFromRight: number,\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 multiplier = computeDeathrattleMultiplier(boardWithDeadEntity, deadEntity);\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\r\n\tconst cardIds = [deadEntity.cardId, ...(deadEntity.additionalCards ?? [])];\r\n\tfor (const deadEntityCardId of cardIds) {\r\n\t\tswitch (deadEntityCardId) {\r\n\t\t\tcase CardIds.SelflessHero_BG_OG_221:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SelflessHeroBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t\tgrantRandomDivineShield(deadEntity, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SpiritOfAirBattlegrounds_TB_BaconShop_HERO_76_Buddy:\r\n\t\t\tcase CardIds.SpiritOfAirBattlegrounds_TB_BaconShop_HERO_76_Buddy_G:\r\n\t\t\t\tconst iterations = deadEntityCardId === CardIds.SpiritOfAirBattlegrounds_TB_BaconShop_HERO_76_Buddy_G ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tfor (let j = 0; j < iterations; j++) {\r\n\t\t\t\t\t\tlet validTargets = boardWithDeadEntity.filter((entity) => !entity.divineShield);\r\n\t\t\t\t\t\tif (!validTargets?.length) {\r\n\t\t\t\t\t\t\tvalidTargets = boardWithDeadEntity.filter((entity) => !entity.taunt);\r\n\t\t\t\t\t\t\tif (!validTargets?.length) {\r\n\t\t\t\t\t\t\t\tvalidTargets = boardWithDeadEntity.filter((entity) => !entity.windfury);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tconst target = pickRandom(validTargets);\r\n\t\t\t\t\t\tif (target) {\r\n\t\t\t\t\t\t\tif (!target.divineShield) {\r\n\t\t\t\t\t\t\t\tupdateDivineShield(target, boardWithDeadEntity, true, allCards);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\ttarget.taunt = true;\r\n\t\t\t\t\t\t\ttarget.windfury = true;\r\n\t\t\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\r\n\t\t\t\t\t\t}\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.NadinaTheRed:\r\n\t\t\tcase CardIds.NadinaTheRedBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantAllDivineShield(boardWithDeadEntity, 'DRAGON', allCards);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SpawnOfNzoth_BG_OG_256:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 1, multiplier * 1, allCards, spectator);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SpawnOfNzothBattlegrounds:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 2, multiplier * 2, allCards, spectator);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.GoldrinnTheGreatWolf:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 5, multiplier * 5, allCards, spectator, 'BEAST');\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.GoldrinnTheGreatWolfBattlegrounds:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 10, multiplier * 10, allCards, spectator, 'BEAST');\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.KingBagurgle:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 2, multiplier * 2, allCards, spectator, 'MURLOC');\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.KingBagurgleBattlegrounds:\r\n\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, multiplier * 4, multiplier * 4, allCards, spectator, 'MURLOC');\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.FiendishServant:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.FiendishServantBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t\t\tgrantRandomAttack(deadEntity, boardWithDeadEntity, deadEntity.attack, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.ImpulsiveTrickster:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.ImpulsiveTricksterBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t\t\tgrantRandomHealth(deadEntity, boardWithDeadEntity, deadEntity.maxHealth, allCards, spectator, true);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.Leapfrogger:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, false, allCards, spectator, sharedState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.LeapfroggerBattlegrounds:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyLeapFroggerEffect(boardWithDeadEntity, deadEntity, true, allCards, spectator, sharedState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst target = grantRandomStats(deadEntity, boardWithDeadEntity, 6, 6, Race.BEAST, true, allCards, spectator);\r\n\t\t\t\t\tif (!!target) {\r\n\t\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\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.PalescaleCrocolisk_BG21_001_G:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst target = grantRandomStats(deadEntity, boardWithDeadEntity, 12, 12, Race.BEAST, true, allCards, spectator);\r\n\t\t\t\t\tif (!!target) {\r\n\t\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\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.ScarletSkull:\r\n\t\t\tcase CardIds.ScarletSkullBattlegrounds:\r\n\t\t\t\tconst scarletMultiplier = deadEntityCardId === CardIds.ScarletSkullBattlegrounds ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst target = grantRandomStats(\r\n\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\tscarletMultiplier * 1,\r\n\t\t\t\t\t\tscarletMultiplier * 2,\r\n\t\t\t\t\t\tRace.UNDEAD,\r\n\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tif (!!target) {\r\n\t\t\t\t\t\tspectator.registerPowerTarget(deadEntity, target, boardWithDeadEntity);\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.AnubarakNerubianKing:\r\n\t\t\tcase CardIds.AnubarakNerubianKingBattlegrounds:\r\n\t\t\t\tconst anubarakMultiplier = deadEntityCardId === CardIds.AnubarakNerubianKingBattlegrounds ? 2 : 1;\r\n\t\t\t\tconst attackBonus = anubarakMultiplier * 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, attackBonus, 0, allCards, spectator, Race[Race.UNDEAD]);\r\n\t\t\t\t\tboardWithDeadEntityHero.globalInfo.UndeadAttackBonus += attackBonus;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// case CardIds.ElementiumSquirrelBombBattlegrounds_TB_BaconShop_HERO_17_Buddy:\r\n\t\t\t// \t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t// \t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\t// \tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t// \t\tconst numberOfDeadMechsThisCombat = sharedState.deaths\r\n\t\t\t// \t\t\t.filter((entity) => entity.friendly === deadEntity.friendly)\r\n\t\t\t// \t\t\t// eslint-disable-next-line prettier/prettier\r\n\t\t\t// \t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId)?.races, Race.MECH)).length;\r\n\t\t\t// \t\tfor (let j = 0; j < numberOfDeadMechsThisCombat + 1; j++) {\r\n\t\t\t// \t\t\tdealDamageToRandomEnemy(\r\n\t\t\t// \t\t\t\totherBoard,\r\n\t\t\t// \t\t\t\totherBoardHero,\r\n\t\t\t// \t\t\t\tdeadEntity,\r\n\t\t\t// \t\t\t\t3,\r\n\t\t\t// \t\t\t\tboardWithDeadEntity,\r\n\t\t\t// \t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t// \t\t\t\tallCards,\r\n\t\t\t// \t\t\t\tcardsData,\r\n\t\t\t// \t\t\t\tsharedState,\r\n\t\t\t// \t\t\t\tspectator,\r\n\t\t\t// \t\t\t);\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.ElementiumSquirrelBombBattlegrounds_TB_BaconShop_HERO_17_Buddy:\r\n\t\t\tcase CardIds.ElementiumSquirrelBombBattlegrounds_TB_BaconShop_HERO_17_Buddy_G:\r\n\t\t\t\t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t\t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\t\tconst squirrelDamage =\r\n\t\t\t\t\tdeadEntity.cardId === CardIds.ElementiumSquirrelBombBattlegrounds_TB_BaconShop_HERO_17_Buddy_G ? 4 : 2;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst numberOfDeadMechsThisCombat = sharedState.deaths\r\n\t\t\t\t\t\t.filter((entity) => entity.friendly === deadEntity.friendly)\r\n\t\t\t\t\t\t// eslint-disable-next-line prettier/prettier\r\n\t\t\t\t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId)?.races, Race.MECH)).length;\r\n\t\t\t\t\tfor (let j = 0; j < numberOfDeadMechsThisCombat + 1; j++) {\r\n\t\t\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\tsquirrelDamage,\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\t// for (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\t// break;\r\n\t\t\tcase CardIds.KaboomBot_BG_BOT_606:\r\n\t\t\tcase CardIds.KaboomBotBattlegrounds:\r\n\t\t\t\t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t\t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\t\tconst kaboomLoops = deadEntity.cardId === CardIds.KaboomBotBattlegrounds ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tfor (let j = 0; j < kaboomLoops; j++) {\r\n\t\t\t\t\t\tdealDamageToRandomEnemy(\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\t4,\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\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.DrBoombox:\r\n\t\t\tcase CardIds.DrBoomboxBattlegrounds:\r\n\t\t\t\t// FIXME: I don't think this way of doing things is really accurate (as some deathrattles\r\n\t\t\t\t// could be spawned between the shots firing), but let's say it's good enough for now\r\n\t\t\t\tconst boomboxDamage = deadEntity.cardId === CardIds.DrBoomboxBattlegrounds ? 14 : 7;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tconst targets = findNearestEnemies(boardWithDeadEntity, null, deadEntityIndexFromRight, otherBoard, 2);\r\n\t\t\t\t\t// console.debug('nearest', stringifySimple(targets));\r\n\t\t\t\t\ttargets.forEach((target) => {\r\n\t\t\t\t\t\t// console.debug('dealing damage to', stringifySimpleCard(target));\r\n\t\t\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\t\t\ttarget,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\tboomboxDamage,\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\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.UnstableGhoul_BG_FP1_024:\r\n\t\t\tcase CardIds.UnstableGhoulBattlegrounds:\r\n\t\t\t\tconst damage = deadEntityCardId === CardIds.UnstableGhoulBattlegrounds ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tdealDamageToAllMinions(\r\n\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\tdamage,\r\n\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\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.TunnelBlaster_BG_DAL_775:\r\n\t\t\tcase CardIds.TunnelBlasterBattlegrounds:\r\n\t\t\t\tconst loops = deadEntityCardId === CardIds.TunnelBlasterBattlegrounds ? 2 : 1;\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tfor (let j = 0; j < loops; j++) {\r\n\t\t\t\t\t\tdealDamageToAllMinions(\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\t3,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\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.LeeroyTheReckless:\r\n\t\t\tcase CardIds.LeeroyTheRecklessBattlegrounds:\r\n\t\t\t\tif (deadEntity.lastAffectedByEntity) {\r\n\t\t\t\t\tdeadEntity.lastAffectedByEntity.definitelyDead = true;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.SrTombDiverBattlegrounds_TB_BaconShop_HERO_41_Buddy:\r\n\t\t\t\tfor (let i = 0; i < Math.min(1, boardWithDeadEntity.length); i++) {\r\n\t\t\t\t\tconst rightMostMinion = boardWithDeadEntity[boardWithDeadEntity.length - 1 - i];\r\n\t\t\t\t\tif (rightMostMinion) {\r\n\t\t\t\t\t\tmakeMinionGolden(rightMostMinion, deadEntity, boardWithDeadEntity, 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.SrTombDiverBattlegrounds_TB_BaconShop_HERO_41_Buddy_G:\r\n\t\t\t\tfor (let i = 0; i < Math.min(2, boardWithDeadEntity.length); i++) {\r\n\t\t\t\t\tconst rightMostMinion = boardWithDeadEntity[boardWithDeadEntity.length - 1 - i];\r\n\t\t\t\t\tif (rightMostMinion) {\r\n\t\t\t\t\t\tmakeMinionGolden(rightMostMinion, deadEntity, boardWithDeadEntity, allCards, spectator);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t// Putricide-only\r\n\t\t\tcase CardIds.Banshee_BG_RLK_957:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, 2, 1, allCards, spectator, Race[Race.UNDEAD]);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.LostSpirit_BG26_GIL_513:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\taddStatsToBoard(deadEntity, boardWithDeadEntity, 1, 0, allCards, spectator, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.TickingAbomination_BG_ICC_099:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tfor (const entity of boardWithDeadEntity) {\r\n\t\t\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\t5,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t);\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\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\r\n\tlet enchantments: { cardId: string; originEntityId?: number; repeats?: number }[] = [\r\n\t\t...(deadEntity.enchantments ?? []),\r\n\t\t...(deadEntity.rememberedDeathrattles ?? []),\r\n\t].sort((a, b) => a.timing - b.timing);\r\n\t// In some cases it's possible that there are way too many enchantments because of the frog\r\n\t// In that case, we make a trade-off and don't trigger the \"on stats change\" trigger as\r\n\t// often as we should, so that we can have the stats themselves correct\r\n\t// We don't want to lump everything together, as it skews the stats when there are a lot of buffs\r\n\t// Instead, we build groups\r\n\tconst maxNumberOfGroups = 12;\r\n\tconst enchantmentGroups = groupByFunction((enchantment: any) => enchantment.cardId)(enchantments);\r\n\tenchantments = Object.keys(enchantmentGroups).flatMap((cardId) => {\r\n\t\tlet repeatsToApply = enchantmentGroups[cardId].map((e) => e.repeats || 1).reduce((a, b) => a + b, 0);\r\n\r\n\t\t// Frogs include the multiplers here directly\r\n\t\tif (\r\n\t\t\t[CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000e, CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge].includes(\r\n\t\t\t\tcardId as CardIds,\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\trepeatsToApply = repeatsToApply * multiplier;\r\n\t\t}\r\n\r\n\t\tconst results = [];\r\n\t\tconst repeatsPerBuff = Math.max(1, Math.floor(repeatsToApply / maxNumberOfGroups));\r\n\t\tlet repeatsDone = 0;\r\n\t\twhile (repeatsDone < repeatsToApply) {\r\n\t\t\tconst repeats = Math.min(repeatsPerBuff, repeatsToApply - repeatsDone);\r\n\t\t\tresults.push({\r\n\t\t\t\tcardId: cardId,\r\n\t\t\t\trepeats: repeats,\r\n\t\t\t\ttiming: Math.min(...enchantmentGroups[cardId].map((e) => e.timing)),\r\n\t\t\t});\r\n\t\t\trepeatsDone += repeatsPerBuff;\r\n\t\t}\r\n\t\treturn results;\r\n\t});\r\n\tfor (const enchantment of enchantments) {\r\n\t\tswitch (enchantment.cardId) {\r\n\t\t\tcase CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000e:\r\n\t\t\tcase CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge:\r\n\t\t\t\tapplyLeapFroggerEffect(\r\n\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\tenchantment.cardId === CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tenchantment.repeats || 1,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.EarthRecollectionEnchantment:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyEarthInvocationEnchantment(boardWithDeadEntity, deadEntity, deadEntity, allCards, sharedState, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.FireRecollectionEnchantment:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyFireInvocationEnchantment(boardWithDeadEntity, deadEntity, deadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.WaterRecollectionEnchantment:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyWaterInvocationEnchantment(boardWithDeadEntity, deadEntity, deadEntity, allCards, spectator);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.LightningRecollectionEnchantment:\r\n\t\t\t\tfor (let i = 0; i < multiplier; i++) {\r\n\t\t\t\t\tapplyLightningInvocationEnchantment(\r\n\t\t\t\t\t\tboardWithDeadEntity,\r\n\t\t\t\t\t\tboardWithDeadEntityHero,\r\n\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\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\t// const playerCopy = boardWithDeadEntity.map((e) => ({ ...e, lastAffectedByEntity: null }));\r\n\t// const oppCopy = otherBoard.map((e) => ({ ...e, lastAffectedByEntity: null }));\r\n\t// console.log('player board', boardWithDeadEntity.length, playerCopy.length, playerCopy.map((e) => JSON.stringify(e)).join('\\n'));\r\n\t// console.log('opp board', JSON.stringify(oppCopy));\r\n};\r\n\r\nexport const applyLightningInvocationEnchantment = (\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\t// Because the golden version doubles all the remembered effects\r\n\tconst multiplier = deadEntity?.cardId === CardIds.SpiritRaptorBattlegrounds ? 2 : 1;\r\n\tfor (let i = 0; i < multiplier; i++) {\r\n\t\tconst targets = pickMultipleRandomDifferent(otherBoard, 5);\r\n\t\tfor (const target of targets) {\r\n\t\t\tdealDamageToEnemy(\r\n\t\t\t\ttarget,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tdeadEntity,\r\n\t\t\t\t1,\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}\r\n\t}\r\n};\r\n\r\nexport const applyWaterInvocationEnchantment = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tdeadEntity: BoardEntity,\r\n\tsourceEntity: BgsPlayerEntity | BoardEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst multiplier = deadEntity?.cardId === CardIds.SpiritRaptorBattlegrounds ? 2 : 1;\r\n\tfor (let i = 0; i < multiplier; i++) {\r\n\t\tconst target: BoardEntity = boardWithDeadEntity[boardWithDeadEntity.length - 1];\r\n\t\tif (!!target) {\r\n\t\t\tmodifyHealth(target, 3, boardWithDeadEntity, allCards);\r\n\t\t\ttarget.taunt = true;\r\n\t\t\tafterStatsUpdate(target, boardWithDeadEntity, allCards);\r\n\t\t\tspectator.registerPowerTarget(sourceEntity, target, boardWithDeadEntity);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const applyFireInvocationEnchantment = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tdeadEntity: BoardEntity,\r\n\tsourceEntity: BgsPlayerEntity | BoardEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst multiplier = deadEntity?.cardId === CardIds.SpiritRaptorBattlegrounds ? 2 : 1;\r\n\tfor (let i = 0; i < multiplier; i++) {\r\n\t\tconst target: BoardEntity = boardWithDeadEntity[0];\r\n\t\tif (!!target) {\r\n\t\t\tmodifyAttack(target, target.attack, boardWithDeadEntity, allCards);\r\n\t\t\tafterStatsUpdate(target, boardWithDeadEntity, allCards);\r\n\t\t\tspectator.registerPowerTarget(sourceEntity, target, boardWithDeadEntity);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const applyEarthInvocationEnchantment = (\r\n\tboardWithDeadEntity: BoardEntity[],\r\n\tdeadEntity: BoardEntity,\r\n\tsourceEntity: BgsPlayerEntity | BoardEntity,\r\n\tallCards: AllCardsService,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst multiplier = deadEntity?.cardId === CardIds.SpiritRaptorBattlegrounds ? 2 : 1;\r\n\tfor (let i = 0; i < multiplier; i++) {\r\n\t\tconst minionsGrantedDeathrattle: BoardEntity[] = pickMultipleRandomDifferent(boardWithDeadEntity, 4);\r\n\t\tminionsGrantedDeathrattle.forEach((minion) => {\r\n\t\t\tminion.enchantments.push({\r\n\t\t\t\tcardId: CardIds.EarthInvocation_ElementEarthEnchantment,\r\n\t\t\t\toriginEntityId: deadEntity?.entityId,\r\n\t\t\t\ttiming: sharedState.currentEntityId++,\r\n\t\t\t});\r\n\t\t\tspectator.registerPowerTarget(sourceEntity, minion, boardWithDeadEntity);\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\tsharedState: SharedState,\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\tfalse,\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\r\n\t\t\t\t? CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge\r\n\t\t\t\t: CardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000e,\r\n\t\t\toriginEntityId: deadEntity.entityId,\r\n\t\t\trepeats: multiplier > 1 ? multiplier : 1,\r\n\t\t\ttiming: sharedState.currentEntityId++,\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\nexport const applyMinionDeathEffect = (\r\n\tdeadEntity: BoardEntity,\r\n\tdeadEntityIndexFromRight: 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).races, Race.BEAST)) {\r\n\t\tapplyScavengingHyenaEffect(boardWithDeadEntity, allCards, spectator);\r\n\t}\r\n\tif (isCorrectTribe(allCards.getCard(deadEntity.cardId).races, 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).races, 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\tif (deadEntity.taunt) {\r\n\t\tapplyBristlemaneScrapsmithEffect(boardWithDeadEntity, boardWithDeadEntityHero, allCards, spectator);\r\n\t}\r\n\tif (deadEntity.cardId === CardIds.EternalKnight || deadEntity.cardId === CardIds.EternalKnightBattlegrounds) {\r\n\t\tapplyEternalKnightEffect(boardWithDeadEntity, allCards, spectator);\r\n\t}\r\n\r\n\t// Putricide-only\r\n\tboardWithDeadEntity\r\n\t\t.filter((e) => e.additionalCards?.includes(CardIds.FlesheatingGhoulLegacy_BG26_tt_004))\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyAttack(e, 1, boardWithDeadEntity, allCards);\r\n\t\t\tafterStatsUpdate(e, boardWithDeadEntity, allCards);\r\n\t\t});\r\n\r\n\tapplyRotHideGnollEffect(boardWithDeadEntity, allCards, spectator);\r\n\r\n\t// Overkill\r\n\tif (deadEntity.health < 0 && deadEntity.lastAffectedByEntity?.attacking) {\r\n\t\tif (deadEntity.lastAffectedByEntity.cardId === CardIds.HeraldOfFlame_BGS_032) {\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}\r\n\t\t// else if (deadEntity.lastAffectedByEntity.cardId === CardIds.WildfireElemental && deadEntity.lastAffectedByEntity.attacking) {\r\n\t\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// \t// Prevent propagation of the effect\r\n\t\t// \tdeadEntity.lastAffectedByEntity.attacking = false;\r\n\t\t// \tconst neighbours = getNeighbours(boardWithDeadEntity, null, boardWithDeadEntity.length - deadEntityIndexFromRight);\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\tdeadEntity.lastAffectedByEntity,\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 (\r\n\t\t// \tdeadEntity.lastAffectedByEntity.cardId === CardIds.WildfireElementalBattlegrounds &&\r\n\t\t// \tdeadEntity.lastAffectedByEntity.attacking\r\n\t\t// ) {\r\n\t\t// \tconst excessDamage = -deadEntity.health;\r\n\t\t// \tdeadEntity.lastAffectedByEntity.attacking = false;\r\n\t\t// \tconst neighbours = getNeighbours(boardWithDeadEntity, null, boardWithDeadEntity.length - deadEntityIndexFromRight);\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\tdeadEntity.lastAffectedByEntity,\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// }\r\n\t\telse 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(otherBoard.length - deadEntityIndexFromRight, 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(otherBoard.length - deadEntityIndexFromRight, 0, ...newEntities);\r\n\t\t} else if (deadEntity.lastAffectedByEntity.cardId === CardIds.SeabreakerGoliath_BGS_080) {\r\n\t\t\tconst otherPirates = otherBoard\r\n\t\t\t\t.filter((entity) => isCorrectTribe(allCards.getCard(entity.cardId).races, 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, boardWithDeadEntity, allCards);\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).races, 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, boardWithDeadEntity, allCards);\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}\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}\r\n\tfor (let i = 0; i < board1.length; i++) {\r\n\t\tdealDamageToEnemy(\r\n\t\t\tboard1[i],\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdamageSource,\r\n\t\t\tdamageDealt,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\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\tfor (let i = 0; i < board2.length; i++) {\r\n\t\tdealDamageToEnemy(\r\n\t\t\tboard2[i],\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdamageSource,\r\n\t\t\tdamageDealt,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\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\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_BG_EX1_531) {\r\n\t\t\tmodifyAttack(board[i], 2, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 1, board, allCards);\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.ScavengingHyenaLegacyBattlegrounds) {\r\n\t\t\tmodifyAttack(board[i], 4, board, allCards);\r\n\t\t\tmodifyHealth(board[i], 2, board, allCards);\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 applyEternalKnightEffect = (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.EternalKnight || board[i].cardId === CardIds.EternalKnightBattlegrounds) {\r\n\t\t\tconst multiplier = board[i].cardId === CardIds.EternalKnightBattlegrounds ? 2 : 1;\r\n\t\t\tmodifyAttack(board[i], multiplier * 1, board, allCards);\r\n\t\t\tmodifyHealth(board[i], multiplier * 1, board, allCards);\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 applyRotHideGnollEffect = (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.RotHideGnoll || board[i].cardId === CardIds.RotHideGnollBattlegrounds) {\r\n\t\t\tconst multiplier = board[i].cardId === CardIds.RotHideGnollBattlegrounds ? 2 : 1;\r\n\t\t\tmodifyAttack(board[i], multiplier * 1, board, allCards);\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 applyBristlemaneScrapsmithEffect = (\r\n\tboard: BoardEntity[],\r\n\tboardPlayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].cardId === CardIds.BristlemaneScrapsmith || board[i].cardId === CardIds.BristlemaneScrapsmithBattlegrounds) {\r\n\t\t\taddCardsInHand(\r\n\t\t\t\tboardPlayerEntity,\r\n\t\t\t\tboard[i].cardId === CardIds.BristlemaneScrapsmithBattlegrounds ? 2 : 1,\r\n\t\t\t\tboard,\r\n\t\t\t\tallCards,\r\n\t\t\t\tspectator,\r\n\t\t\t);\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, board, allCards);\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, board, allCards);\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\nexport const applyMonstrosity = (\r\n\tmonstrosity: BoardEntity,\r\n\tdeadEntities: readonly BoardEntity[],\r\n\tboardWithDeadEntities: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n): void => {\r\n\tfor (const deadEntity of deadEntities) {\r\n\t\tmodifyAttack(monstrosity, deadEntity.attack, boardWithDeadEntities, allCards);\r\n\t\tif (monstrosity.cardId === CardIds.MonstrosityBattlegrounds) {\r\n\t\t\tmodifyAttack(monstrosity, deadEntity.attack, boardWithDeadEntities, allCards);\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const rememberDeathrattles = (\r\n\tfish: BoardEntity,\r\n\tdeadEntities: readonly BoardEntity[],\r\n\tcardsData: CardsData,\r\n\tallCards: AllCardsService,\r\n\tsharedState: SharedState,\r\n): void => {\r\n\tconst validDeathrattles = deadEntities\r\n\t\t.filter((entity) => cardsData.validDeathrattles.includes(entity.cardId) || isFish(entity))\r\n\t\t.map((entity) => ({ cardId: entity.cardId, repeats: 1, timing: sharedState.currentEntityId++ }));\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.flatMap((enchantment) => ({\r\n\t\t\tcardId: enchantment.cardId,\r\n\t\t\trepeats: enchantment.repeats ?? 1,\r\n\t\t\ttiming: sharedState.currentEntityId++,\r\n\t\t}))\r\n\t\t.filter((enchantment) =>\r\n\t\t\t[\r\n\t\t\t\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantment_BG_BOT_312e,\r\n\t\t\t\tCardIds.ReplicatingMenace_ReplicatingMenaceEnchantmentBattlegrounds,\r\n\t\t\t\tCardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000e,\r\n\t\t\t\tCardIds.Leapfrogger_LeapfrogginEnchantment_BG21_000_Ge,\r\n\t\t\t\tCardIds.LivingSpores_LivingSporesEnchantment,\r\n\t\t\t\tCardIds.SneedsReplicator_ReplicateEnchantment,\r\n\t\t\t\tCardIds.EarthInvocation_ElementEarthEnchantment,\r\n\t\t\t\tCardIds.FireInvocation_ElementFireEnchantment,\r\n\t\t\t\tCardIds.WaterInvocation_ElementWaterEnchantment,\r\n\t\t\t\tCardIds.LightningInvocation,\r\n\t\t\t].includes(enchantment.cardId as CardIds),\r\n\t\t);\r\n\t// Multiple fish\r\n\tconst deadEntityRememberedDeathrattles =\r\n\t\tdeadEntities.filter((e) => !!e.rememberedDeathrattles?.length).flatMap((e) => e.rememberedDeathrattles) ?? [];\r\n\tconst newDeathrattles = [...validDeathrattles, ...validEnchantments, ...deadEntityRememberedDeathrattles];\r\n\t// Order is important - the DR are triggered in the ordered the minions have died\r\n\t// console.log(\r\n\t// \t'remembering deathrattle',\r\n\t// \t'\\n',\r\n\t// \tstringifySimpleCard(fish, allCards),\r\n\t// \t'\\n',\r\n\t// \tstringifySimple(deadEntities, allCards),\r\n\t// \t'\\n',\r\n\t// \tfish.rememberedDeathrattles,\r\n\t// );\r\n\tif (isGolden(fish.cardId, allCards)) {\r\n\t\t// https://stackoverflow.com/questions/33305152/how-to-duplicate-elements-in-a-js-array\r\n\t\tconst doubleDr = newDeathrattles.reduce((res, current) => res.concat([current, current]), []);\r\n\t\tfish.rememberedDeathrattles = [...(fish.rememberedDeathrattles || []), ...doubleDr];\r\n\t} else {\r\n\t\tfish.rememberedDeathrattles = [...(fish.rememberedDeathrattles || []), ...newDeathrattles];\r\n\t}\r\n\t// console.log('remembering deathrattle after', '\\n', 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/dist/utils.d.ts
CHANGED
|
@@ -13,7 +13,7 @@ export declare const afterStatsUpdate: (entity: BoardEntity, friendlyBoard: Boar
|
|
|
13
13
|
export declare const makeMinionGolden: (target: BoardEntity, source: BoardEntity | BgsPlayerEntity, sourceBoard: BoardEntity[], allCards: AllCardsService, spectator: Spectator) => void;
|
|
14
14
|
export declare const grantRandomAttack: (source: BoardEntity, board: BoardEntity[], additionalAttack: number, allCards: AllCardsService, spectator: Spectator, excludeSource?: boolean) => void;
|
|
15
15
|
export declare const grantRandomHealth: (source: BoardEntity, board: BoardEntity[], health: number, allCards: AllCardsService, spectator: Spectator, excludeSource?: boolean) => void;
|
|
16
|
-
export declare const grantRandomStats: (source: BoardEntity, board: BoardEntity[], attack: number, health: number, race: Race, allCards: AllCardsService, spectator: Spectator) => BoardEntity;
|
|
16
|
+
export declare const grantRandomStats: (source: BoardEntity, board: BoardEntity[], attack: number, health: number, race: Race, excludeSource: boolean, allCards: AllCardsService, spectator: Spectator) => BoardEntity;
|
|
17
17
|
export declare const addCardsInHand: (playerEntity: BgsPlayerEntity, cards: number, board: BoardEntity[], allCards: AllCardsService, spectator: Spectator, cardAdded?: CardIds) => void;
|
|
18
18
|
export declare const grantRandomDivineShield: (source: BoardEntity, board: BoardEntity[], allCards: AllCardsService, spectator: Spectator) => void;
|
|
19
19
|
export declare const updateDivineShield: (entity: BoardEntity, board: BoardEntity[], newValue: boolean, allCards: AllCardsService) => void;
|
package/dist/utils.js
CHANGED
|
@@ -239,15 +239,15 @@ const grantRandomHealth = (source, board, health, allCards, spectator, excludeSo
|
|
|
239
239
|
}
|
|
240
240
|
};
|
|
241
241
|
exports.grantRandomHealth = grantRandomHealth;
|
|
242
|
-
const grantRandomStats = (source, board, attack, health, race, allCards, spectator) => {
|
|
242
|
+
const grantRandomStats = (source, board, attack, health, race, excludeSource, allCards, spectator) => {
|
|
243
243
|
if (board.length > 0) {
|
|
244
|
-
const
|
|
245
|
-
if (
|
|
246
|
-
exports.modifyAttack(
|
|
247
|
-
exports.modifyHealth(
|
|
248
|
-
exports.afterStatsUpdate(
|
|
249
|
-
spectator.registerPowerTarget(source,
|
|
250
|
-
return
|
|
244
|
+
const target = exports.getRandomAliveMinion(board.filter((e) => (excludeSource ? e.entityId !== source.entityId : true)), race, allCards);
|
|
245
|
+
if (target) {
|
|
246
|
+
exports.modifyAttack(target, attack, board, allCards);
|
|
247
|
+
exports.modifyHealth(target, health, board, allCards);
|
|
248
|
+
exports.afterStatsUpdate(target, board, allCards);
|
|
249
|
+
spectator.registerPowerTarget(source, target, board);
|
|
250
|
+
return target;
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
return null;
|
|
@@ -327,7 +327,8 @@ const getRandomAliveMinion = (board, race, allCards) => {
|
|
|
327
327
|
if (!validTribes.length) {
|
|
328
328
|
return null;
|
|
329
329
|
}
|
|
330
|
-
|
|
330
|
+
const randomIndex = Math.floor(Math.random() * validTribes.length);
|
|
331
|
+
return validTribes[randomIndex];
|
|
331
332
|
};
|
|
332
333
|
exports.getRandomAliveMinion = getRandomAliveMinion;
|
|
333
334
|
const getRandomMinionWithHighestHealth = (board) => {
|
|
@@ -413,9 +414,7 @@ const stringifySimple = (board, allCards = null) => {
|
|
|
413
414
|
exports.stringifySimple = stringifySimple;
|
|
414
415
|
const stringifySimpleCard = (entity, allCards = null) => {
|
|
415
416
|
var _a, _b;
|
|
416
|
-
return entity
|
|
417
|
-
? `${entity.cardId}/${(_b = (_a = allCards === null || allCards === void 0 ? void 0 : allCards.getCard(entity.cardId)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : ''}/atk=${entity.attack}/hp=${entity.health}/ench=${entity.enchantments}`
|
|
418
|
-
: null;
|
|
417
|
+
return entity ? `${entity.cardId}/${(_b = (_a = allCards === null || allCards === void 0 ? void 0 : allCards.getCard(entity.cardId)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : ''}/atk=${entity.attack}/hp=${entity.health}` : null;
|
|
419
418
|
};
|
|
420
419
|
exports.stringifySimpleCard = stringifySimpleCard;
|
|
421
420
|
const isFish = (entity) => {
|