@firestone-hs/simulate-bgs-battle 1.1.708 → 1.1.710
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/impl/bg-spell/back-to-back.js +3 -5
- package/dist/cards/impl/bg-spell/back-to-back.js.map +1 -1
- package/dist/cards/impl/bg-spell/ophidian-staff.js +1 -1
- package/dist/cards/impl/bg-spell/ophidian-staff.js.map +1 -1
- package/dist/cards/impl/bg-spell/queens-command.js +1 -1
- package/dist/cards/impl/bg-spell/queens-command.js.map +1 -1
- package/dist/cards/impl/minion/bronze-chromadrake.js +1 -2
- package/dist/cards/impl/minion/bronze-chromadrake.js.map +1 -1
- package/dist/cards/impl/minion/diremuck-forager.js +4 -1
- package/dist/cards/impl/minion/diremuck-forager.js.map +1 -1
- package/dist/cards/impl/minion/forsaken-weaver.js +1 -1
- package/dist/cards/impl/minion/forsaken-weaver.js.map +1 -1
- package/dist/cards/impl/minion/green-chromadrake.js +1 -2
- package/dist/cards/impl/minion/green-chromadrake.js.map +1 -1
- package/dist/cards/impl/minion/moonsteel-juggernaut.js +0 -1
- package/dist/cards/impl/minion/moonsteel-juggernaut.js.map +1 -1
- package/dist/cards/impl/minion/ring-bearer.d.ts +2 -2
- package/dist/cards/impl/minion/ring-bearer.js +11 -16
- package/dist/cards/impl/minion/ring-bearer.js.map +1 -1
- package/dist/cards/impl/minion/ship-jumper.d.ts +2 -2
- package/dist/cards/impl/minion/ship-jumper.js +25 -6
- package/dist/cards/impl/minion/ship-jumper.js.map +1 -1
- package/dist/cards/impl/spellcraft/deep-blues.js +1 -1
- package/dist/cards/impl/spellcraft/deep-blues.js.map +1 -1
- package/dist/cards/impl/trinket/bewitched-ribbon.js +1 -2
- package/dist/cards/impl/trinket/bewitched-ribbon.js.map +1 -1
- package/dist/cards/impl/trinket/bluegill-flippers.js +2 -2
- package/dist/cards/impl/trinket/bluegill-flippers.js.map +1 -1
- package/dist/cards/impl/trinket/bubble-crown.js +2 -2
- package/dist/cards/impl/trinket/bubble-crown.js.map +1 -1
- package/dist/cards/impl/trinket/copper-coil.js +1 -1
- package/dist/cards/impl/trinket/copper-coil.js.map +1 -1
- package/dist/cards/impl/trinket/eternal-portrait.d.ts +1 -1
- package/dist/cards/impl/trinket/eternal-portrait.js +1 -1
- package/dist/cards/impl/trinket/eternal-portrait.js.map +1 -1
- package/dist/cards/impl/trinket/lorewalker-scroll.js +3 -3
- package/dist/cards/impl/trinket/lorewalker-scroll.js.map +1 -1
- package/dist/cards/impl/trinket/miniature-ship.js +1 -1
- package/dist/cards/impl/trinket/miniature-ship.js.map +1 -1
- package/dist/simulation/avenge.js +3 -1
- package/dist/simulation/avenge.js.map +1 -1
- package/dist/simulation/damage-effects.js +1 -1
- package/dist/simulation/damage-effects.js.map +1 -1
- package/dist/simulation/deathrattle-spawns.js +1 -1
- package/dist/simulation/deathrattle-spawns.js.map +1 -1
- package/dist/simulation/spawn-fail.js +1 -1
- package/dist/simulation/spawn-fail.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lorewalker-scroll.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/lorewalker-scroll.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AAG3C,QAAA,gBAAgB,GAA0B;IACtD,OAAO,EAAE;;;KAGR;IACD,iBAAiB,EAAE,CAAC,OAAqB,EAAE,KAAqB,EAAE,EAAE;QACnE,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE;YAChC,OAAO;SACP;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc;YAAE,OAAO;QACrF,MAAM,
|
|
1
|
+
{"version":3,"file":"lorewalker-scroll.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/lorewalker-scroll.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AAG3C,QAAA,gBAAgB,GAA0B;IACtD,OAAO,EAAE;;;KAGR;IACD,iBAAiB,EAAE,CAAC,OAAqB,EAAE,KAAqB,EAAE,EAAE;QACnE,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE;YAChC,OAAO;SACP;QACD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,cAAc;YAAE,OAAO;QACrF,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,0BAAuE,CAAC;QACxG,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,IAAA,mBAAW,EAAC,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC9F,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { CastSpellInput, OnTavernSpellCastCard } from '../../card.interface';\r\n\r\nexport const LorewalkerScroll: OnTavernSpellCastCard = {\r\n\tcardIds: [\r\n\t\tCardIds.LorewalkerScroll_BG30_MagicItem_422,\r\n\t\tCardIds.LorewalkerScroll_LorewalkerScrollToken_BG30_MagicItem_422t,\r\n\t],\r\n\tonTavernSpellCast: (trinket: BoardTrinket, input: CastSpellInput) => {\r\n\t\tif (input.source !== input.hero) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!input.target || input.target.health <= 0 || input.target.definitelyDead) return;\r\n\t\tconst isGreater = trinket.cardId === CardIds.LorewalkerScroll_LorewalkerScrollToken_BG30_MagicItem_422t;\r\n\t\tconst attack = isGreater ? 8 : 2;\r\n\t\tconst health = isGreater ? 8 : 2;\r\n\t\tmodifyStats(input.target, trinket, attack, health, input.board, input.hero, input.gameState);\r\n\t},\r\n};\r\n"]}
|
|
@@ -11,7 +11,7 @@ exports.MiniatureShip = {
|
|
|
11
11
|
if (entity.health <= 0 || entity.definitelyDead)
|
|
12
12
|
continue;
|
|
13
13
|
if ((0, utils_1.hasCorrectTribe)(entity, input.hero, reference_data_1.Race.PIRATE, input.gameState.anomalies, input.gameState.allCards)) {
|
|
14
|
-
(0, stats_1.modifyStats)(entity, trinket, 2,
|
|
14
|
+
(0, stats_1.modifyStats)(entity, trinket, 2, 2, input.board, input.hero, input.gameState);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"miniature-ship.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/miniature-ship.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,qDAAwD;AACxD,0CAAiD;AAGpC,QAAA,aAAa,GAA6B;IACtD,OAAO,EAAE,sBAA0C;IACnD,oBAAoB,EAAE,CAAC,OAAqB,EAAE,KAAqB,EAAE,EAAE;QACtE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;YACjC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc;gBAAE,SAAS;YAC1D,IAAI,IAAA,uBAAe,EAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;gBAC1G,IAAA,mBAAW,EAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;aAC7E;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { AfterTavernSpellCastCard, CastSpellInput } from '../../card.interface';\r\n\r\nexport const MiniatureShip: AfterTavernSpellCastCard = {\r\n\tcardIds: [CardIds.MiniatureShip_BG35_MagicItem_710],\r\n\tafterTavernSpellCast: (trinket: BoardTrinket, input: CastSpellInput) => {\r\n\t\tfor (const entity of input.board) {\r\n\t\t\tif (entity.health <= 0 || entity.definitelyDead) continue;\r\n\t\t\tif (hasCorrectTribe(entity, input.hero, Race.PIRATE, input.gameState.anomalies, input.gameState.allCards)) {\r\n\t\t\t\tmodifyStats(entity, trinket, 2,
|
|
1
|
+
{"version":3,"file":"miniature-ship.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/miniature-ship.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,qDAAwD;AACxD,0CAAiD;AAGpC,QAAA,aAAa,GAA6B;IACtD,OAAO,EAAE,sBAA0C;IACnD,oBAAoB,EAAE,CAAC,OAAqB,EAAE,KAAqB,EAAE,EAAE;QACtE,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE;YACjC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc;gBAAE,SAAS;YAC1D,IAAI,IAAA,uBAAe,EAAC,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;gBAC1G,IAAA,mBAAW,EAAC,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;aAC7E;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { AfterTavernSpellCastCard, CastSpellInput } from '../../card.interface';\r\n\r\nexport const MiniatureShip: AfterTavernSpellCastCard = {\r\n\tcardIds: [CardIds.MiniatureShip_BG35_MagicItem_710],\r\n\tafterTavernSpellCast: (trinket: BoardTrinket, input: CastSpellInput) => {\r\n\t\tfor (const entity of input.board) {\r\n\t\t\tif (entity.health <= 0 || entity.definitelyDead) continue;\r\n\t\t\tif (hasCorrectTribe(entity, input.hero, Race.PIRATE, input.gameState.anomalies, input.gameState.allCards)) {\r\n\t\t\t\tmodifyStats(entity, trinket, 2, 2, input.board, input.hero, input.gameState);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -201,7 +201,9 @@ const handleAvenge = (boardWithDeadEntity, boardWithDeadEntityHero, deadEntity,
|
|
|
201
201
|
break;
|
|
202
202
|
case "BG30_MagicItem_437":
|
|
203
203
|
if (boardWithDeadEntity.length > 0) {
|
|
204
|
-
const
|
|
204
|
+
const candidates = boardWithDeadEntity.filter((e) => !e.reborn &&
|
|
205
|
+
(0, utils_2.hasCorrectTribe)(e, boardWithDeadEntityHero, reference_data_1.Race.UNDEAD, gameState.anomalies, gameState.allCards));
|
|
206
|
+
const target = (0, utils_1.pickRandom)(candidates);
|
|
205
207
|
if (!!target) {
|
|
206
208
|
(0, reborn_1.updateReborn)(target, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);
|
|
207
209
|
gameState.spectator.registerPowerTarget(avenger, target, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"avenge.js","sourceRoot":"","sources":["../../src/simulation/avenge.ts"],"names":[],"mappings":"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","sourcesContent":["import { GameTag, Race } from '@firestone-hs/reference-data';\nimport { BgsHeroPower, BgsPlayerEntity } from '../bgs-player-entity';\nimport { BoardEntity } from '../board-entity';\nimport { hasAvenge } from '../cards/card.interface';\nimport { cardMappings } from '../cards/impl/_card-mappings';\nimport { grantRandomDivineShield } from '../keywords/divine-shield';\nimport { updateReborn } from '../keywords/reborn';\nimport { updateTaunt } from '../keywords/taunt';\nimport { CardIds } from '../services/card-ids';\nimport { pickRandom } from '../services/utils';\nimport { isValidDeathrattleEnchantment } from '../simulate-bgs-battle';\nimport {\n\taddStatsToBoard,\n\tgetRandomMinionWithHighestHealth,\n\tgrantRandomStats,\n\thasCorrectTribe,\n\thasEntityMechanic,\n} from '../utils';\nimport { dealDamageToMinion } from './attack';\nimport { playBloodGemsOn } from './blood-gems';\nimport { addCardsInHand } from './cards-in-hand';\nimport { spawnEntities } from './deathrattle-spawns';\nimport { FullGameState } from './internal-game-state';\nimport { performEntitySpawns } from './spawns';\nimport { modifyStats } from './stats';\n\nexport const applyAvengeEffects = (\n\tdeadEntity: BoardEntity,\n\tdeadEntityIndexFromRight: number,\n\tboardWithDeadEntity: BoardEntity[],\n\tboardWithDeadEntityHero: BgsPlayerEntity,\n\totherBoard: BoardEntity[],\n\totherBoardHero: BgsPlayerEntity,\n\tgameState: FullGameState,\n\tentitiesSpawnedFromMinionDeath: BoardEntity[],\n): BoardEntity[] => {\n\tconst candidatesEntitiesSpawnedFromAvenge: BoardEntity[] = [];\n\t// updateAvengeCounters(boardWithDeadEntity, boardWithDeadEntityHero);\n\tconst avengers = boardWithDeadEntity\n\t\t.filter((e) => !!e.avengeDefault && e.avengeCurrent <= 0)\n\t\t// Get Tony to be processed first, because of the \"when turned golden, the minion ignores the death for the avenge counter\"\n\t\t// behavior\n\t\t.sort((a, b) => {\n\t\t\t// if (a.cardId === CardIds.TonyTwoTusk_BG21_031 || a.cardId === CardIds.TonyTwoTusk_BG21_031_G) {\n\t\t\t// \treturn -1;\n\t\t\t// }\n\t\t\t// if (b.cardId === CardIds.TonyTwoTusk_BG21_031 || b.cardId === CardIds.TonyTwoTusk_BG21_031_G) {\n\t\t\t// \treturn 1;\n\t\t\t// }\n\t\t\treturn 0;\n\t\t});\n\tfor (const avenger of avengers) {\n\t\thandleAvenge(\n\t\t\tboardWithDeadEntity,\n\t\t\tboardWithDeadEntityHero,\n\t\t\tdeadEntity,\n\t\t\tdeadEntityIndexFromRight,\n\t\t\tavenger,\n\t\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\t\totherBoard,\n\t\t\totherBoardHero,\n\t\t\tgameState,\n\t\t);\n\t}\n\t// console.log('updating dead entity avenge counter', boardWithDeadEntityHero.avengeCurrent, stringifySimpleCard(deadEntity, allCards));\n\tfor (const heroPower of boardWithDeadEntityHero.heroPowers) {\n\t\tconst heroAvenger = !!heroPower.avengeDefault && heroPower.avengeCurrent <= 0;\n\t\tif (heroAvenger) {\n\t\t\thandleHeroAvenge(\n\t\t\t\tdeadEntity,\n\t\t\t\theroPower,\n\t\t\t\tboardWithDeadEntity,\n\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\totherBoard,\n\t\t\t\totherBoardHero,\n\t\t\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\t\t\tgameState,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst questRewardAvengers = boardWithDeadEntityHero.questRewardEntities.filter(\n\t\t(e) => !!e.avengeDefault && e.avengeCurrent <= 0,\n\t);\n\tfor (const avenger of questRewardAvengers) {\n\t\thandleAvenge(\n\t\t\tboardWithDeadEntity,\n\t\t\tboardWithDeadEntityHero,\n\t\t\tdeadEntity,\n\t\t\tdeadEntityIndexFromRight,\n\t\t\tavenger as BoardEntity,\n\t\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\t\totherBoard,\n\t\t\totherBoardHero,\n\t\t\tgameState,\n\t\t);\n\t}\n\n\tconst trinketAvengers = boardWithDeadEntityHero.trinkets.filter((e) => !!e.avengeDefault && e.avengeCurrent <= 0);\n\tfor (const avenger of trinketAvengers) {\n\t\thandleAvenge(\n\t\t\tboardWithDeadEntity,\n\t\t\tboardWithDeadEntityHero,\n\t\t\tdeadEntity,\n\t\t\tdeadEntityIndexFromRight,\n\t\t\tavenger as BoardEntity,\n\t\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\t\totherBoard,\n\t\t\totherBoardHero,\n\t\t\tgameState,\n\t\t);\n\t}\n\n\tperformEntitySpawns(\n\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\tboardWithDeadEntity,\n\t\tboardWithDeadEntityHero,\n\t\tdeadEntity,\n\t\tdeadEntityIndexFromRight,\n\t\totherBoard,\n\t\totherBoardHero,\n\t\tgameState,\n\t);\n\n\t// Not an avenge, but with Avenge timing\n\tconst hasDeathrattle =\n\t\thasEntityMechanic(deadEntity, GameTag.DEATHRATTLE, gameState.allCards) ||\n\t\tdeadEntity.enchantments.some((e) => isValidDeathrattleEnchantment(e.cardId));\n\tif (hasDeathrattle) {\n\t\t// These are apparently processed after Reborn is triggered\n\t\t// http://replays.firestoneapp.com/?reviewId=5db9a191-ae9b-43a5-a072-0d460631d7a9&turn=23&action=12\n\t\t// UPDATE 2024-06-24: Multiple counterexamples of this, so I'm not sure exactly what is the right approach\n\t\t// I'm implementing the one that makes more sense to me; triggering after reborn is just too different\n\t\t// from what happens usually\n\t\t// However, we want to trigger it after all the spawns have been processed, so more or less an \"avenge\" timing?\n\t\t// Maybe even after that?\n\t\t// Update 2024-06-27 29.6.2: timing should stay the same\n\t\tboardWithDeadEntity\n\t\t\t.filter((e) => e.cardId === CardIds.GhoulAcabra_BG29_863 || e.cardId === CardIds.GhoulAcabra_BG29_863_G)\n\t\t\t.forEach((ghoul) => {\n\t\t\t\tconst buff = ghoul.cardId === CardIds.GhoulAcabra_BG29_863_G ? 2 : 1;\n\t\t\t\taddStatsToBoard(ghoul, boardWithDeadEntity, boardWithDeadEntityHero, 2 * buff, 2 * buff, gameState);\n\t\t\t});\n\t}\n\n\treturn candidatesEntitiesSpawnedFromAvenge;\n};\n\nexport const updateAvengeCounters = (board: readonly BoardEntity[], boardWithDeadEntityHero: BgsPlayerEntity) => {\n\tfor (const entity of board) {\n\t\tif (!!entity.avengeDefault) {\n\t\t\tentity.avengeCurrent -= 1;\n\t\t}\n\t}\n\tfor (const heroPower of boardWithDeadEntityHero.heroPowers) {\n\t\tif (!!heroPower.avengeDefault) {\n\t\t\theroPower.avengeCurrent -= 1;\n\t\t}\n\t}\n\n\tfor (const reward of boardWithDeadEntityHero.questRewardEntities) {\n\t\tif (!!reward.avengeDefault) {\n\t\t\treward.avengeCurrent -= 1;\n\t\t}\n\t}\n\n\tfor (const trinket of boardWithDeadEntityHero.trinkets) {\n\t\tif (!!trinket.avengeDefault) {\n\t\t\ttrinket.avengeCurrent -= 1;\n\t\t}\n\t}\n};\n\nconst handleAvenge = (\n\tboardWithDeadEntity: BoardEntity[],\n\tboardWithDeadEntityHero: BgsPlayerEntity,\n\tdeadEntity: BoardEntity,\n\tdeadEntityIndexFromRight: number,\n\tavenger: BoardEntity,\n\tcandidatesEntitiesSpawnedFromAvenge: BoardEntity[],\n\totherBoard: BoardEntity[],\n\totherBoardHero: BgsPlayerEntity,\n\tgameState: FullGameState,\n) => {\n\tconst avengeImpl = cardMappings[avenger.cardId];\n\tif (hasAvenge(avengeImpl)) {\n\t\tconst newSpawns = avengeImpl.avenge(avenger, {\n\t\t\tboard: boardWithDeadEntity,\n\t\t\thero: boardWithDeadEntityHero,\n\t\t\totherBoard: otherBoard,\n\t\t\totherHero: otherBoardHero,\n\t\t\tdeadEntity: deadEntity,\n\t\t\tgameState,\n\t\t});\n\t\tif (Array.isArray(newSpawns) && newSpawns?.length) {\n\t\t\tcandidatesEntitiesSpawnedFromAvenge.push(...newSpawns);\n\t\t}\n\t} else {\n\t\t// Don't forget to update the avenge data in cards-data\n\t\tswitch (avenger.cardId) {\n\t\t\tcase CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy:\n\t\t\tcase CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy_G:\n\t\t\t\t// Only for Tavern\n\t\t\t\t// addStatsToBoard(\n\t\t\t\t// \tavenger,\n\t\t\t\t// \tboardWithDeadEntity,\n\t\t\t\t// \t0,\n\t\t\t\t// \tavenger.cardId === CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy_G ? 2 : 1,\n\t\t\t\t// \tgameState.allCards,\n\t\t\t\t// \tgameState.spectator,\n\t\t\t\t// );\n\t\t\t\tbreak;\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\n\t\t\t\tconst target1 = grantRandomStats(\n\t\t\t\t\tavenger,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t6,\n\t\t\t\t\t6,\n\t\t\t\t\tRace.BEAST,\n\t\t\t\t\ttrue,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tif (!!target1) {\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\ttarget1,\n\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001_G:\n\t\t\t\tconst target2 = grantRandomStats(\n\t\t\t\t\tavenger,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t12,\n\t\t\t\t\t12,\n\t\t\t\t\tRace.BEAST,\n\t\t\t\t\ttrue,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tif (!!target2) {\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\ttarget2,\n\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.ImpatientDoomsayer_BG21_007:\n\t\t\tcase CardIds.ImpatientDoomsayer_BG21_007_G:\n\t\t\t\tconst doomsayerCardsToAddQuantity = avenger.cardId === CardIds.ImpatientDoomsayer_BG21_007_G ? 2 : 1;\n\t\t\t\tconst doomsayerCardsToAdd = [];\n\t\t\t\tfor (let i = 0; i < doomsayerCardsToAddQuantity; i++) {\n\t\t\t\t\tdoomsayerCardsToAdd.push(pickRandom(gameState.cardsData.demonSpawns));\n\t\t\t\t}\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, doomsayerCardsToAdd, gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.PashmarTheVengeful_BG23_014:\n\t\t\tcase CardIds.PashmarTheVengeful_BG23_014_G:\n\t\t\t\tbreak;\n\t\t\tcase CardIds.TremblingTrolley_BG28_967:\n\t\t\tcase CardIds.TremblingTrolley_BG28_967_G:\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, [null], gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.Thorncaller_BG20_105:\n\t\t\tcase CardIds.Thorncaller_BG20_105_G:\n\t\t\t\tconst thorncallerToAddQuantity = avenger.cardId === CardIds.Thorncaller_BG20_105_G ? 2 : 1;\n\t\t\t\tconst thorncallerCardsToAdd = Array(thorncallerToAddQuantity).fill(CardIds.BloodGem);\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, thorncallerCardsToAdd, gameState);\n\t\t\t\tbreak;\n\t\t\t// case CardIds.Sisefin_BG21_009:\n\t\t\t// case CardIds.Sisefin_BG21_009_G:\n\t\t\t// \tconst poisonousIterations = avenger.cardId === CardIds.Sisefin_BG21_009_G ? 2 : 1;\n\t\t\t// \tfor (let i = 0; i < poisonousIterations; i++) {\n\t\t\t// \t\tconst validTargets = boardWithDeadEntity.filter((e) => !e.poisonous && !e.venomous);\n\t\t\t// \t\tconst murloc = getRandomAliveMinion(validTargets, boardWithDeadEntityHero, Race.MURLOC, gameState);\n\t\t\t// \t\tif (murloc) {\n\t\t\t// \t\t\tupdateVenomous(\n\t\t\t// \t\t\t\tmurloc,\n\t\t\t// \t\t\t\ttrue,\n\t\t\t// \t\t\t\tboardWithDeadEntity,\n\t\t\t// \t\t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\t\totherBoardHero,\n\t\t\t// \t\t\t\tgameState,\n\t\t\t// \t\t\t);\n\t\t\t// \t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t// \t\t\t\tavenger,\n\t\t\t// \t\t\t\tmurloc,\n\t\t\t// \t\t\t\tboardWithDeadEntity,\n\t\t\t// \t\t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\t\totherBoardHero,\n\t\t\t// \t\t\t);\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// \tbreak;\n\t\t\tcase CardIds.MechanoTank_BG21_023:\n\t\t\t\t// This can be null if the avenge triggers when the last enemy minion dies as well\n\t\t\t\tconst target = getRandomMinionWithHighestHealth(otherBoard);\n\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\tavenger,\n\t\t\t\t\ttarget,\n\t\t\t\t\totherBoard,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\totherBoardHero,\n\t\t\t\t);\n\t\t\t\tdealDamageToMinion(\n\t\t\t\t\ttarget,\n\t\t\t\t\totherBoard,\n\t\t\t\t\totherBoardHero,\n\t\t\t\t\tavenger,\n\t\t\t\t\t5,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.MechanoTank_BG21_023_G:\n\t\t\t\tfor (let i = 0; i < 2; i++) {\n\t\t\t\t\tconst target = getRandomMinionWithHighestHealth(otherBoard);\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\totherBoard,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t);\n\t\t\t\t\tdealDamageToMinion(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\totherBoard,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\t5,\n\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\tgameState,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t// case CardIds.TonyTwoTusk_BG21_031:\n\t\t\t// \tconst nonGoldenMinions = boardWithDeadEntity\n\t\t\t// \t\t.filter((e) => e.entityId !== avenger.entityId)\n\t\t\t// \t\t.filter((e) => {\n\t\t\t// \t\t\tconst ref = gameState.allCards.getCard(e.cardId);\n\t\t\t// \t\t\treturn (\n\t\t\t// \t\t\t\t!!ref.battlegroundsPremiumDbfId &&\n\t\t\t// \t\t\t\t!!gameState.allCards.getCardFromDbfId(ref.battlegroundsPremiumDbfId).id\n\t\t\t// \t\t\t);\n\t\t\t// \t\t});\n\t\t\t// \tconst pirate = getRandomAliveMinion(nonGoldenMinions, boardWithDeadEntityHero, Race.PIRATE, gameState);\n\t\t\t// \tif (pirate) {\n\t\t\t// \t\tmakeMinionGolden(\n\t\t\t// \t\t\tpirate,\n\t\t\t// \t\t\tavenger,\n\t\t\t// \t\t\tboardWithDeadEntity,\n\t\t\t// \t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\totherBoard,\n\t\t\t// \t\t\totherBoardHero,\n\t\t\t// \t\t\tgameState,\n\t\t\t// \t\t);\n\t\t\t// \t}\n\t\t\t// \tbreak;\n\t\t\t// case CardIds.TonyTwoTusk_BG21_031_G:\n\t\t\t// \tfor (let i = 0; i < 2; i++) {\n\t\t\t// \t\tconst nonGoldenMinions = boardWithDeadEntity.filter((e) => !isMinionGolden(e, gameState.allCards));\n\t\t\t// \t\tconst pirate = getRandomAliveMinion(\n\t\t\t// \t\t\tnonGoldenMinions,\n\t\t\t// \t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\tRace.PIRATE,\n\t\t\t// \t\t\tgameState,\n\t\t\t// \t\t);\n\t\t\t// \t\tif (pirate) {\n\t\t\t// \t\t\tmakeMinionGolden(\n\t\t\t// \t\t\t\tpirate,\n\t\t\t// \t\t\t\tavenger,\n\t\t\t// \t\t\t\tboardWithDeadEntity,\n\t\t\t// \t\t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\t\totherBoard,\n\t\t\t// \t\t\t\totherBoardHero,\n\t\t\t// \t\t\t\tgameState,\n\t\t\t// \t\t\t);\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// \tbreak;\n\t\t\tcase CardIds.HungeringAbomination_BG25_014:\n\t\t\tcase CardIds.HungeringAbomination_BG25_014_G:\n\t\t\t\tconst abominationMultiplier = avenger.cardId === CardIds.HungeringAbomination_BG25_014_G ? 2 : 1;\n\t\t\t\tmodifyStats(\n\t\t\t\t\tavenger,\n\t\t\t\t\tavenger,\n\t\t\t\t\tabominationMultiplier * 1,\n\t\t\t\t\tabominationMultiplier * 2,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t// case CardIds.IceSickle:\n\t\t\t// \tgrantRandomStats(\n\t\t\t// \t\tavenger,\n\t\t\t// \t\tboardWithDeadEntityHero.hand.filter(\n\t\t\t// \t\t\t(e) => gameState.allCards.getCard(e.cardId).type?.toUpperCase() === CardType[CardType.MINION],\n\t\t\t// \t\t),\n\t\t\t// \t\tboardWithDeadEntityHero,\n\t\t\t// \t\t4,\n\t\t\t// \t\t0,\n\t\t\t// \t\tnull,\n\t\t\t// \t\ttrue,\n\t\t\t// \t\tgameState,\n\t\t\t// \t);\n\t\t\t// \tbreak;\n\t\t\tcase CardIds.BoomSquad_BG27_Reward_502:\n\t\t\t\tconst highestHealthMinion = [...otherBoard].sort((a, b) => b.health - a.health)[0];\n\t\t\t\tdealDamageToMinion(\n\t\t\t\t\thighestHealthMinion,\n\t\t\t\t\totherBoard,\n\t\t\t\t\totherBoardHero,\n\t\t\t\t\tavenger,\n\t\t\t\t\t10,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\tavenger,\n\t\t\t\t\thighestHealthMinion,\n\t\t\t\t\totherBoard,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\totherBoardHero,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.RelentlessSentry_BG25_003:\n\t\t\tcase CardIds.RelentlessSentry_BG25_003_G:\n\t\t\t\tupdateReborn(avenger, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);\n\t\t\t\tupdateTaunt(avenger, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.RelentlessMurghoul_BG27_010:\n\t\t\tcase CardIds.RelentlessMurghoul_BG27_010_G:\n\t\t\t\tupdateReborn(avenger, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);\n\t\t\t\tupdateTaunt(avenger, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.PhaerixWrathOfTheSun_BG28_403:\n\t\t\tcase CardIds.PhaerixWrathOfTheSun_BG28_403_G:\n\t\t\t\tconst phaerixLoops = avenger.cardId === CardIds.PhaerixWrathOfTheSun_BG28_403_G ? 2 : 1;\n\t\t\t\tfor (let i = 0; i < phaerixLoops; i++) {\n\t\t\t\t\tgrantRandomDivineShield(\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t\tgameState,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.AugmentedLaborer_BG28_740:\n\t\t\tcase CardIds.AugmentedLaborer_BG28_740_G:\n\t\t\t\tconst AugmentedLaborerLoops = avenger.cardId === CardIds.AugmentedLaborer_BG28_740_G ? 2 : 1;\n\t\t\t\tfor (let i = 0; i < AugmentedLaborerLoops; i++) {\n\t\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, [null], gameState);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.TumblingDisaster_BG28_Reward_505:\n\t\t\t\tconst tumblingDisasterEntity = boardWithDeadEntityHero.questRewardEntities?.find(\n\t\t\t\t\t(e) => e.cardId === CardIds.TumblingDisaster_BG28_Reward_505,\n\t\t\t\t);\n\t\t\t\tif (tumblingDisasterEntity) {\n\t\t\t\t\ttumblingDisasterEntity.scriptDataNum1 = (tumblingDisasterEntity.scriptDataNum1 ?? 0) + 1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.CycleOfEnergy_BG28_Reward_504:\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, [null], gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.StableAmalgamation_BG28_Reward_518:\n\t\t\t\tavenger.scriptDataNum1 = (avenger.scriptDataNum1 ?? 0) + 1;\n\t\t\t\tbreak;\n\t\t\tcase CardIds.MurglMkIi_BG29_991:\n\t\t\tcase CardIds.MurglMkIi_BG29_991_G:\n\t\t\t\tconst murglMkStats = avenger.cardId === CardIds.MurglMkIi_BG29_991_G ? 2 : 1;\n\t\t\t\taddStatsToBoard(\n\t\t\t\t\tavenger,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\tmurglMkStats,\n\t\t\t\t\tmurglMkStats,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\t// Don't use utility methods, as we don't want triggers to proc\n\t\t\t\tfor (const e of boardWithDeadEntityHero.hand ?? []) {\n\t\t\t\t\te.attack += murglMkStats;\n\t\t\t\t\te.health += murglMkStats;\n\t\t\t\t\te.maxHealth += murglMkStats;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.StaffOfTheScourge_BG30_MagicItem_437:\n\t\t\t\tif (boardWithDeadEntity.length > 0) {\n\t\t\t\t\tconst target = pickRandom(boardWithDeadEntity.filter((e) => !e.reborn));\n\t\t\t\t\tif (!!target) {\n\t\t\t\t\t\tupdateReborn(\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t\t\tgameState,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\t\t\tavenger,\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.BleedingHeart_BG30_MagicItem_713:\n\t\t\t\tconst randomUndead = gameState.cardsData.getRandomMinionForTribe(\n\t\t\t\t\tRace.UNDEAD,\n\t\t\t\t\tboardWithDeadEntityHero.tavernTier,\n\t\t\t\t);\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, [randomUndead], gameState);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tavenger.avengeCurrent += avenger.avengeDefault;\n};\n\nconst handleHeroAvenge = (\n\tdeadEntity: BoardEntity,\n\theroPower: BgsHeroPower,\n\tboardWithDeadEntity: BoardEntity[],\n\tboardWithDeadEntityHero: BgsPlayerEntity,\n\totherBoard: BoardEntity[],\n\totherBoardHero: BgsPlayerEntity,\n\tcandidatesEntitiesSpawnedFromAvenge: BoardEntity[],\n\tgameState: FullGameState,\n) => {\n\t// https://twitter.com/LoewenMitchell/status/1491879869457879040\n\t// Not affected by Khadgar\n\tswitch (heroPower.cardId) {\n\t\tcase CardIds.Onyxia_Broodmother:\n\t\t\tconst broodmotherTokens = spawnEntities(\n\t\t\t\tCardIds.Onyxia_OnyxianWhelpToken,\n\t\t\t\t1,\n\t\t\t\tboardWithDeadEntity,\n\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\totherBoard,\n\t\t\t\totherBoardHero,\n\t\t\t\tgameState,\n\t\t\t\tdeadEntity.friendly,\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tbroodmotherTokens.forEach((token) => {\n\t\t\t\ttoken.attack = +heroPower.info;\n\t\t\t\ttoken.health = +heroPower.info;\n\t\t\t\ttoken.maxAttack = +heroPower.info;\n\t\t\t\ttoken.maxHealth = +heroPower.info;\n\t\t\t});\n\t\t\theroPower.info = +heroPower.info + 1;\n\t\t\tcandidatesEntitiesSpawnedFromAvenge.push(...broodmotherTokens);\n\t\t\tbreak;\n\t}\n\theroPower.avengeCurrent += heroPower.avengeDefault;\n};\n\nexport interface AvengeInput {\n\treadonly board: BoardEntity[];\n\treadonly deadEntity: BoardEntity;\n\treadonly hero: BgsPlayerEntity;\n\treadonly otherBoard: BoardEntity[];\n\treadonly otherHero: BgsPlayerEntity;\n\treadonly gameState: FullGameState;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"avenge.js","sourceRoot":"","sources":["../../src/simulation/avenge.ts"],"names":[],"mappings":"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","sourcesContent":["import { GameTag, Race } from '@firestone-hs/reference-data';\nimport { BgsHeroPower, BgsPlayerEntity } from '../bgs-player-entity';\nimport { BoardEntity } from '../board-entity';\nimport { hasAvenge } from '../cards/card.interface';\nimport { cardMappings } from '../cards/impl/_card-mappings';\nimport { grantRandomDivineShield } from '../keywords/divine-shield';\nimport { updateReborn } from '../keywords/reborn';\nimport { updateTaunt } from '../keywords/taunt';\nimport { CardIds } from '../services/card-ids';\nimport { pickRandom } from '../services/utils';\nimport { isValidDeathrattleEnchantment } from '../simulate-bgs-battle';\nimport {\n\taddStatsToBoard,\n\tgetRandomMinionWithHighestHealth,\n\tgrantRandomStats,\n\thasCorrectTribe,\n\thasEntityMechanic,\n} from '../utils';\nimport { dealDamageToMinion } from './attack';\nimport { addCardsInHand } from './cards-in-hand';\nimport { spawnEntities } from './deathrattle-spawns';\nimport { FullGameState } from './internal-game-state';\nimport { performEntitySpawns } from './spawns';\nimport { modifyStats } from './stats';\n\nexport const applyAvengeEffects = (\n\tdeadEntity: BoardEntity,\n\tdeadEntityIndexFromRight: number,\n\tboardWithDeadEntity: BoardEntity[],\n\tboardWithDeadEntityHero: BgsPlayerEntity,\n\totherBoard: BoardEntity[],\n\totherBoardHero: BgsPlayerEntity,\n\tgameState: FullGameState,\n\tentitiesSpawnedFromMinionDeath: BoardEntity[],\n): BoardEntity[] => {\n\tconst candidatesEntitiesSpawnedFromAvenge: BoardEntity[] = [];\n\t// updateAvengeCounters(boardWithDeadEntity, boardWithDeadEntityHero);\n\tconst avengers = boardWithDeadEntity\n\t\t.filter((e) => !!e.avengeDefault && e.avengeCurrent <= 0)\n\t\t// Get Tony to be processed first, because of the \"when turned golden, the minion ignores the death for the avenge counter\"\n\t\t// behavior\n\t\t.sort((a, b) => {\n\t\t\t// if (a.cardId === CardIds.TonyTwoTusk_BG21_031 || a.cardId === CardIds.TonyTwoTusk_BG21_031_G) {\n\t\t\t// \treturn -1;\n\t\t\t// }\n\t\t\t// if (b.cardId === CardIds.TonyTwoTusk_BG21_031 || b.cardId === CardIds.TonyTwoTusk_BG21_031_G) {\n\t\t\t// \treturn 1;\n\t\t\t// }\n\t\t\treturn 0;\n\t\t});\n\tfor (const avenger of avengers) {\n\t\thandleAvenge(\n\t\t\tboardWithDeadEntity,\n\t\t\tboardWithDeadEntityHero,\n\t\t\tdeadEntity,\n\t\t\tdeadEntityIndexFromRight,\n\t\t\tavenger,\n\t\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\t\totherBoard,\n\t\t\totherBoardHero,\n\t\t\tgameState,\n\t\t);\n\t}\n\t// console.log('updating dead entity avenge counter', boardWithDeadEntityHero.avengeCurrent, stringifySimpleCard(deadEntity, allCards));\n\tfor (const heroPower of boardWithDeadEntityHero.heroPowers) {\n\t\tconst heroAvenger = !!heroPower.avengeDefault && heroPower.avengeCurrent <= 0;\n\t\tif (heroAvenger) {\n\t\t\thandleHeroAvenge(\n\t\t\t\tdeadEntity,\n\t\t\t\theroPower,\n\t\t\t\tboardWithDeadEntity,\n\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\totherBoard,\n\t\t\t\totherBoardHero,\n\t\t\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\t\t\tgameState,\n\t\t\t);\n\t\t}\n\t}\n\n\tconst questRewardAvengers = boardWithDeadEntityHero.questRewardEntities.filter(\n\t\t(e) => !!e.avengeDefault && e.avengeCurrent <= 0,\n\t);\n\tfor (const avenger of questRewardAvengers) {\n\t\thandleAvenge(\n\t\t\tboardWithDeadEntity,\n\t\t\tboardWithDeadEntityHero,\n\t\t\tdeadEntity,\n\t\t\tdeadEntityIndexFromRight,\n\t\t\tavenger as BoardEntity,\n\t\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\t\totherBoard,\n\t\t\totherBoardHero,\n\t\t\tgameState,\n\t\t);\n\t}\n\n\tconst trinketAvengers = boardWithDeadEntityHero.trinkets.filter((e) => !!e.avengeDefault && e.avengeCurrent <= 0);\n\tfor (const avenger of trinketAvengers) {\n\t\thandleAvenge(\n\t\t\tboardWithDeadEntity,\n\t\t\tboardWithDeadEntityHero,\n\t\t\tdeadEntity,\n\t\t\tdeadEntityIndexFromRight,\n\t\t\tavenger as BoardEntity,\n\t\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\t\totherBoard,\n\t\t\totherBoardHero,\n\t\t\tgameState,\n\t\t);\n\t}\n\n\tperformEntitySpawns(\n\t\tcandidatesEntitiesSpawnedFromAvenge,\n\t\tboardWithDeadEntity,\n\t\tboardWithDeadEntityHero,\n\t\tdeadEntity,\n\t\tdeadEntityIndexFromRight,\n\t\totherBoard,\n\t\totherBoardHero,\n\t\tgameState,\n\t);\n\n\t// Not an avenge, but with Avenge timing\n\tconst hasDeathrattle =\n\t\thasEntityMechanic(deadEntity, GameTag.DEATHRATTLE, gameState.allCards) ||\n\t\tdeadEntity.enchantments.some((e) => isValidDeathrattleEnchantment(e.cardId));\n\tif (hasDeathrattle) {\n\t\t// These are apparently processed after Reborn is triggered\n\t\t// http://replays.firestoneapp.com/?reviewId=5db9a191-ae9b-43a5-a072-0d460631d7a9&turn=23&action=12\n\t\t// UPDATE 2024-06-24: Multiple counterexamples of this, so I'm not sure exactly what is the right approach\n\t\t// I'm implementing the one that makes more sense to me; triggering after reborn is just too different\n\t\t// from what happens usually\n\t\t// However, we want to trigger it after all the spawns have been processed, so more or less an \"avenge\" timing?\n\t\t// Maybe even after that?\n\t\t// Update 2024-06-27 29.6.2: timing should stay the same\n\t\tboardWithDeadEntity\n\t\t\t.filter((e) => e.cardId === CardIds.GhoulAcabra_BG29_863 || e.cardId === CardIds.GhoulAcabra_BG29_863_G)\n\t\t\t.forEach((ghoul) => {\n\t\t\t\tconst buff = ghoul.cardId === CardIds.GhoulAcabra_BG29_863_G ? 2 : 1;\n\t\t\t\taddStatsToBoard(ghoul, boardWithDeadEntity, boardWithDeadEntityHero, 2 * buff, 2 * buff, gameState);\n\t\t\t});\n\t}\n\n\treturn candidatesEntitiesSpawnedFromAvenge;\n};\n\nexport const updateAvengeCounters = (board: readonly BoardEntity[], boardWithDeadEntityHero: BgsPlayerEntity) => {\n\tfor (const entity of board) {\n\t\tif (!!entity.avengeDefault) {\n\t\t\tentity.avengeCurrent -= 1;\n\t\t}\n\t}\n\tfor (const heroPower of boardWithDeadEntityHero.heroPowers) {\n\t\tif (!!heroPower.avengeDefault) {\n\t\t\theroPower.avengeCurrent -= 1;\n\t\t}\n\t}\n\n\tfor (const reward of boardWithDeadEntityHero.questRewardEntities) {\n\t\tif (!!reward.avengeDefault) {\n\t\t\treward.avengeCurrent -= 1;\n\t\t}\n\t}\n\n\tfor (const trinket of boardWithDeadEntityHero.trinkets) {\n\t\tif (!!trinket.avengeDefault) {\n\t\t\ttrinket.avengeCurrent -= 1;\n\t\t}\n\t}\n};\n\nconst handleAvenge = (\n\tboardWithDeadEntity: BoardEntity[],\n\tboardWithDeadEntityHero: BgsPlayerEntity,\n\tdeadEntity: BoardEntity,\n\tdeadEntityIndexFromRight: number,\n\tavenger: BoardEntity,\n\tcandidatesEntitiesSpawnedFromAvenge: BoardEntity[],\n\totherBoard: BoardEntity[],\n\totherBoardHero: BgsPlayerEntity,\n\tgameState: FullGameState,\n) => {\n\tconst avengeImpl = cardMappings[avenger.cardId];\n\tif (hasAvenge(avengeImpl)) {\n\t\tconst newSpawns = avengeImpl.avenge(avenger, {\n\t\t\tboard: boardWithDeadEntity,\n\t\t\thero: boardWithDeadEntityHero,\n\t\t\totherBoard: otherBoard,\n\t\t\totherHero: otherBoardHero,\n\t\t\tdeadEntity: deadEntity,\n\t\t\tgameState,\n\t\t});\n\t\tif (Array.isArray(newSpawns) && newSpawns?.length) {\n\t\t\tcandidatesEntitiesSpawnedFromAvenge.push(...newSpawns);\n\t\t}\n\t} else {\n\t\t// Don't forget to update the avenge data in cards-data\n\t\tswitch (avenger.cardId) {\n\t\t\tcase CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy:\n\t\t\tcase CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy_G:\n\t\t\t\t// Only for Tavern\n\t\t\t\t// addStatsToBoard(\n\t\t\t\t// \tavenger,\n\t\t\t\t// \tboardWithDeadEntity,\n\t\t\t\t// \t0,\n\t\t\t\t// \tavenger.cardId === CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy_G ? 2 : 1,\n\t\t\t\t// \tgameState.allCards,\n\t\t\t\t// \tgameState.spectator,\n\t\t\t\t// );\n\t\t\t\tbreak;\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\n\t\t\t\tconst target1 = grantRandomStats(\n\t\t\t\t\tavenger,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t6,\n\t\t\t\t\t6,\n\t\t\t\t\tRace.BEAST,\n\t\t\t\t\ttrue,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tif (!!target1) {\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\ttarget1,\n\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001_G:\n\t\t\t\tconst target2 = grantRandomStats(\n\t\t\t\t\tavenger,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t12,\n\t\t\t\t\t12,\n\t\t\t\t\tRace.BEAST,\n\t\t\t\t\ttrue,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tif (!!target2) {\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\ttarget2,\n\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.ImpatientDoomsayer_BG21_007:\n\t\t\tcase CardIds.ImpatientDoomsayer_BG21_007_G:\n\t\t\t\tconst doomsayerCardsToAddQuantity = avenger.cardId === CardIds.ImpatientDoomsayer_BG21_007_G ? 2 : 1;\n\t\t\t\tconst doomsayerCardsToAdd = [];\n\t\t\t\tfor (let i = 0; i < doomsayerCardsToAddQuantity; i++) {\n\t\t\t\t\tdoomsayerCardsToAdd.push(pickRandom(gameState.cardsData.demonSpawns));\n\t\t\t\t}\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, doomsayerCardsToAdd, gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.PashmarTheVengeful_BG23_014:\n\t\t\tcase CardIds.PashmarTheVengeful_BG23_014_G:\n\t\t\t\tbreak;\n\t\t\tcase CardIds.TremblingTrolley_BG28_967:\n\t\t\tcase CardIds.TremblingTrolley_BG28_967_G:\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, [null], gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.Thorncaller_BG20_105:\n\t\t\tcase CardIds.Thorncaller_BG20_105_G:\n\t\t\t\tconst thorncallerToAddQuantity = avenger.cardId === CardIds.Thorncaller_BG20_105_G ? 2 : 1;\n\t\t\t\tconst thorncallerCardsToAdd = Array(thorncallerToAddQuantity).fill(CardIds.BloodGem);\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, thorncallerCardsToAdd, gameState);\n\t\t\t\tbreak;\n\t\t\t// case CardIds.Sisefin_BG21_009:\n\t\t\t// case CardIds.Sisefin_BG21_009_G:\n\t\t\t// \tconst poisonousIterations = avenger.cardId === CardIds.Sisefin_BG21_009_G ? 2 : 1;\n\t\t\t// \tfor (let i = 0; i < poisonousIterations; i++) {\n\t\t\t// \t\tconst validTargets = boardWithDeadEntity.filter((e) => !e.poisonous && !e.venomous);\n\t\t\t// \t\tconst murloc = getRandomAliveMinion(validTargets, boardWithDeadEntityHero, Race.MURLOC, gameState);\n\t\t\t// \t\tif (murloc) {\n\t\t\t// \t\t\tupdateVenomous(\n\t\t\t// \t\t\t\tmurloc,\n\t\t\t// \t\t\t\ttrue,\n\t\t\t// \t\t\t\tboardWithDeadEntity,\n\t\t\t// \t\t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\t\totherBoardHero,\n\t\t\t// \t\t\t\tgameState,\n\t\t\t// \t\t\t);\n\t\t\t// \t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t// \t\t\t\tavenger,\n\t\t\t// \t\t\t\tmurloc,\n\t\t\t// \t\t\t\tboardWithDeadEntity,\n\t\t\t// \t\t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\t\totherBoardHero,\n\t\t\t// \t\t\t);\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// \tbreak;\n\t\t\tcase CardIds.MechanoTank_BG21_023:\n\t\t\t\t// This can be null if the avenge triggers when the last enemy minion dies as well\n\t\t\t\tconst target = getRandomMinionWithHighestHealth(otherBoard);\n\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\tavenger,\n\t\t\t\t\ttarget,\n\t\t\t\t\totherBoard,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\totherBoardHero,\n\t\t\t\t);\n\t\t\t\tdealDamageToMinion(\n\t\t\t\t\ttarget,\n\t\t\t\t\totherBoard,\n\t\t\t\t\totherBoardHero,\n\t\t\t\t\tavenger,\n\t\t\t\t\t5,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.MechanoTank_BG21_023_G:\n\t\t\t\tfor (let i = 0; i < 2; i++) {\n\t\t\t\t\tconst target = getRandomMinionWithHighestHealth(otherBoard);\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\totherBoard,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t);\n\t\t\t\t\tdealDamageToMinion(\n\t\t\t\t\t\ttarget,\n\t\t\t\t\t\totherBoard,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\t5,\n\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\tgameState,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t// case CardIds.TonyTwoTusk_BG21_031:\n\t\t\t// \tconst nonGoldenMinions = boardWithDeadEntity\n\t\t\t// \t\t.filter((e) => e.entityId !== avenger.entityId)\n\t\t\t// \t\t.filter((e) => {\n\t\t\t// \t\t\tconst ref = gameState.allCards.getCard(e.cardId);\n\t\t\t// \t\t\treturn (\n\t\t\t// \t\t\t\t!!ref.battlegroundsPremiumDbfId &&\n\t\t\t// \t\t\t\t!!gameState.allCards.getCardFromDbfId(ref.battlegroundsPremiumDbfId).id\n\t\t\t// \t\t\t);\n\t\t\t// \t\t});\n\t\t\t// \tconst pirate = getRandomAliveMinion(nonGoldenMinions, boardWithDeadEntityHero, Race.PIRATE, gameState);\n\t\t\t// \tif (pirate) {\n\t\t\t// \t\tmakeMinionGolden(\n\t\t\t// \t\t\tpirate,\n\t\t\t// \t\t\tavenger,\n\t\t\t// \t\t\tboardWithDeadEntity,\n\t\t\t// \t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\totherBoard,\n\t\t\t// \t\t\totherBoardHero,\n\t\t\t// \t\t\tgameState,\n\t\t\t// \t\t);\n\t\t\t// \t}\n\t\t\t// \tbreak;\n\t\t\t// case CardIds.TonyTwoTusk_BG21_031_G:\n\t\t\t// \tfor (let i = 0; i < 2; i++) {\n\t\t\t// \t\tconst nonGoldenMinions = boardWithDeadEntity.filter((e) => !isMinionGolden(e, gameState.allCards));\n\t\t\t// \t\tconst pirate = getRandomAliveMinion(\n\t\t\t// \t\t\tnonGoldenMinions,\n\t\t\t// \t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\tRace.PIRATE,\n\t\t\t// \t\t\tgameState,\n\t\t\t// \t\t);\n\t\t\t// \t\tif (pirate) {\n\t\t\t// \t\t\tmakeMinionGolden(\n\t\t\t// \t\t\t\tpirate,\n\t\t\t// \t\t\t\tavenger,\n\t\t\t// \t\t\t\tboardWithDeadEntity,\n\t\t\t// \t\t\t\tboardWithDeadEntityHero,\n\t\t\t// \t\t\t\totherBoard,\n\t\t\t// \t\t\t\totherBoardHero,\n\t\t\t// \t\t\t\tgameState,\n\t\t\t// \t\t\t);\n\t\t\t// \t\t}\n\t\t\t// \t}\n\t\t\t// \tbreak;\n\t\t\tcase CardIds.HungeringAbomination_BG25_014:\n\t\t\tcase CardIds.HungeringAbomination_BG25_014_G:\n\t\t\t\tconst abominationMultiplier = avenger.cardId === CardIds.HungeringAbomination_BG25_014_G ? 2 : 1;\n\t\t\t\tmodifyStats(\n\t\t\t\t\tavenger,\n\t\t\t\t\tavenger,\n\t\t\t\t\tabominationMultiplier * 1,\n\t\t\t\t\tabominationMultiplier * 2,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\t// case CardIds.IceSickle:\n\t\t\t// \tgrantRandomStats(\n\t\t\t// \t\tavenger,\n\t\t\t// \t\tboardWithDeadEntityHero.hand.filter(\n\t\t\t// \t\t\t(e) => gameState.allCards.getCard(e.cardId).type?.toUpperCase() === CardType[CardType.MINION],\n\t\t\t// \t\t),\n\t\t\t// \t\tboardWithDeadEntityHero,\n\t\t\t// \t\t4,\n\t\t\t// \t\t0,\n\t\t\t// \t\tnull,\n\t\t\t// \t\ttrue,\n\t\t\t// \t\tgameState,\n\t\t\t// \t);\n\t\t\t// \tbreak;\n\t\t\tcase CardIds.BoomSquad_BG27_Reward_502:\n\t\t\t\tconst highestHealthMinion = [...otherBoard].sort((a, b) => b.health - a.health)[0];\n\t\t\t\tdealDamageToMinion(\n\t\t\t\t\thighestHealthMinion,\n\t\t\t\t\totherBoard,\n\t\t\t\t\totherBoardHero,\n\t\t\t\t\tavenger,\n\t\t\t\t\t10,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\tavenger,\n\t\t\t\t\thighestHealthMinion,\n\t\t\t\t\totherBoard,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\totherBoardHero,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.RelentlessSentry_BG25_003:\n\t\t\tcase CardIds.RelentlessSentry_BG25_003_G:\n\t\t\t\tupdateReborn(avenger, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);\n\t\t\t\tupdateTaunt(avenger, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.RelentlessMurghoul_BG27_010:\n\t\t\tcase CardIds.RelentlessMurghoul_BG27_010_G:\n\t\t\t\tupdateReborn(avenger, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);\n\t\t\t\tupdateTaunt(avenger, true, boardWithDeadEntity, boardWithDeadEntityHero, otherBoardHero, gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.PhaerixWrathOfTheSun_BG28_403:\n\t\t\tcase CardIds.PhaerixWrathOfTheSun_BG28_403_G:\n\t\t\t\tconst phaerixLoops = avenger.cardId === CardIds.PhaerixWrathOfTheSun_BG28_403_G ? 2 : 1;\n\t\t\t\tfor (let i = 0; i < phaerixLoops; i++) {\n\t\t\t\t\tgrantRandomDivineShield(\n\t\t\t\t\t\tavenger,\n\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t\tgameState,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.AugmentedLaborer_BG28_740:\n\t\t\tcase CardIds.AugmentedLaborer_BG28_740_G:\n\t\t\t\tconst AugmentedLaborerLoops = avenger.cardId === CardIds.AugmentedLaborer_BG28_740_G ? 2 : 1;\n\t\t\t\tfor (let i = 0; i < AugmentedLaborerLoops; i++) {\n\t\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, [null], gameState);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.TumblingDisaster_BG28_Reward_505:\n\t\t\t\tconst tumblingDisasterEntity = boardWithDeadEntityHero.questRewardEntities?.find(\n\t\t\t\t\t(e) => e.cardId === CardIds.TumblingDisaster_BG28_Reward_505,\n\t\t\t\t);\n\t\t\t\tif (tumblingDisasterEntity) {\n\t\t\t\t\ttumblingDisasterEntity.scriptDataNum1 = (tumblingDisasterEntity.scriptDataNum1 ?? 0) + 1;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.CycleOfEnergy_BG28_Reward_504:\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, [null], gameState);\n\t\t\t\tbreak;\n\t\t\tcase CardIds.StableAmalgamation_BG28_Reward_518:\n\t\t\t\tavenger.scriptDataNum1 = (avenger.scriptDataNum1 ?? 0) + 1;\n\t\t\t\tbreak;\n\t\t\tcase CardIds.MurglMkIi_BG29_991:\n\t\t\tcase CardIds.MurglMkIi_BG29_991_G:\n\t\t\t\tconst murglMkStats = avenger.cardId === CardIds.MurglMkIi_BG29_991_G ? 2 : 1;\n\t\t\t\taddStatsToBoard(\n\t\t\t\t\tavenger,\n\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\tmurglMkStats,\n\t\t\t\t\tmurglMkStats,\n\t\t\t\t\tgameState,\n\t\t\t\t);\n\t\t\t\t// Don't use utility methods, as we don't want triggers to proc\n\t\t\t\tfor (const e of boardWithDeadEntityHero.hand ?? []) {\n\t\t\t\t\te.attack += murglMkStats;\n\t\t\t\t\te.health += murglMkStats;\n\t\t\t\t\te.maxHealth += murglMkStats;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.StaffOfTheScourge_BG30_MagicItem_437:\n\t\t\t\tif (boardWithDeadEntity.length > 0) {\n\t\t\t\t\tconst candidates = boardWithDeadEntity.filter(\n\t\t\t\t\t\t(e) =>\n\t\t\t\t\t\t\t!e.reborn &&\n\t\t\t\t\t\t\thasCorrectTribe(\n\t\t\t\t\t\t\t\te,\n\t\t\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\t\t\tRace.UNDEAD,\n\t\t\t\t\t\t\t\tgameState.anomalies,\n\t\t\t\t\t\t\t\tgameState.allCards,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t);\n\t\t\t\t\tconst target = pickRandom(candidates);\n\t\t\t\t\tif (!!target) {\n\t\t\t\t\t\tupdateReborn(\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t\t\tgameState,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tgameState.spectator.registerPowerTarget(\n\t\t\t\t\t\t\tavenger,\n\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\tboardWithDeadEntity,\n\t\t\t\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\t\t\t\totherBoardHero,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase CardIds.BleedingHeart_BG30_MagicItem_713:\n\t\t\t\tconst randomUndead = gameState.cardsData.getRandomMinionForTribe(\n\t\t\t\t\tRace.UNDEAD,\n\t\t\t\t\tboardWithDeadEntityHero.tavernTier,\n\t\t\t\t);\n\t\t\t\taddCardsInHand(boardWithDeadEntityHero, boardWithDeadEntity, [randomUndead], gameState);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\tavenger.avengeCurrent += avenger.avengeDefault;\n};\n\nconst handleHeroAvenge = (\n\tdeadEntity: BoardEntity,\n\theroPower: BgsHeroPower,\n\tboardWithDeadEntity: BoardEntity[],\n\tboardWithDeadEntityHero: BgsPlayerEntity,\n\totherBoard: BoardEntity[],\n\totherBoardHero: BgsPlayerEntity,\n\tcandidatesEntitiesSpawnedFromAvenge: BoardEntity[],\n\tgameState: FullGameState,\n) => {\n\t// https://twitter.com/LoewenMitchell/status/1491879869457879040\n\t// Not affected by Khadgar\n\tswitch (heroPower.cardId) {\n\t\tcase CardIds.Onyxia_Broodmother:\n\t\t\tconst broodmotherTokens = spawnEntities(\n\t\t\t\tCardIds.Onyxia_OnyxianWhelpToken,\n\t\t\t\t1,\n\t\t\t\tboardWithDeadEntity,\n\t\t\t\tboardWithDeadEntityHero,\n\t\t\t\totherBoard,\n\t\t\t\totherBoardHero,\n\t\t\t\tgameState,\n\t\t\t\tdeadEntity.friendly,\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t\tfalse,\n\t\t\t);\n\t\t\tbroodmotherTokens.forEach((token) => {\n\t\t\t\ttoken.attack = +heroPower.info;\n\t\t\t\ttoken.health = +heroPower.info;\n\t\t\t\ttoken.maxAttack = +heroPower.info;\n\t\t\t\ttoken.maxHealth = +heroPower.info;\n\t\t\t});\n\t\t\theroPower.info = +heroPower.info + 1;\n\t\t\tcandidatesEntitiesSpawnedFromAvenge.push(...broodmotherTokens);\n\t\t\tbreak;\n\t}\n\theroPower.avengeCurrent += heroPower.avengeDefault;\n};\n\nexport interface AvengeInput {\n\treadonly board: BoardEntity[];\n\treadonly deadEntity: BoardEntity;\n\treadonly hero: BgsPlayerEntity;\n\treadonly otherBoard: BoardEntity[];\n\treadonly otherHero: BgsPlayerEntity;\n\treadonly gameState: FullGameState;\n}\n"]}
|
|
@@ -116,7 +116,7 @@ const handleOtherEntityEffects = (entity, board, hero, otherBoard, otherHero, sp
|
|
|
116
116
|
const stats = e.cardId === "BG29_806_G" ? 2 : 1;
|
|
117
117
|
const target = (0, utils_1.pickRandom)(board.filter((e) => e.entityId !== entity.entityId));
|
|
118
118
|
if (!!target) {
|
|
119
|
-
(0, stats_1.modifyStats)(target, e, 3 * stats,
|
|
119
|
+
(0, stats_1.modifyStats)(target, e, 3 * stats, 2 * stats, board, hero, gameState);
|
|
120
120
|
}
|
|
121
121
|
});
|
|
122
122
|
board
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"damage-effects.js","sourceRoot":"","sources":["../../src/simulation/damage-effects.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,4DAAiH;AACjH,iEAA4D;AAC5D,6DAA+D;AAE/D,6CAA+C;AAC/C,oCAA0E;AAC1E,6DAAqD;AACrD,qCAAuC;AAEvC,qCAA+C;AAC/C,mCAAsC;AAE/B,MAAM,eAAe,GAAG,CAC9B,aAA0B,EAC1B,KAAoB,EACpB,IAAqB,EACrB,UAAyB,EACzB,SAA0B,EAC1B,YAA2C,EAC3C,MAAc,EACd,SAAwB,EACC,EAAE;;IAC3B,MAAM,eAAe,GAAkB,EAAE,CAAC;IAC1C,MAAM,aAAa,GAClB,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAAC,0CAAE,QAAQ,MAAK,aAAa,CAAC,QAAQ;QAC9C,CAAC,CAAC,KAAK;QACP,CAAC,CAAC,CAAA,MAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAG,CAAC,CAAC,0CAAE,QAAQ,MAAK,aAAa,CAAC,QAAQ;YACtD,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,UAAU,GACf,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAAC,0CAAE,QAAQ,MAAK,aAAa,CAAC,QAAQ;QAC9C,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAG,CAAC,CAAC,0CAAE,QAAQ,MAAK,aAAa,CAAC,QAAQ;YACjD,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,YAAY,GAAG,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,MAAM,SAAS,GAAG,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IAE7D,IAAI,aAAa,CAAC,iBAAiB,GAAG,CAAC,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE;QACrG,IAAA,oBAAW,EAAC,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;QACnE,aAAa,CAAC,iBAAiB,EAAE,CAAC;KAClC;IAED,MAAM,mBAAmB,GAAG,6BAAY,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC/D,IAAI,IAAA,6BAAY,EAAC,mBAAmB,CAAC,EAAE;QACtC,mBAAmB,CAAC,SAAS,CAAC,aAAa,EAAE;YAC5C,aAAa,EAAE,aAAa;YAC5B,YAAY,EAAE,YAAY;YAC1B,MAAM,EAAE,MAAM;YACd,KAAK,EAAE,aAAa;YACpB,IAAI,EAAE,YAAY;YAClB,SAAS,EAAE,SAAS;YACpB,SAAS;SACT,CAAC,CAAC;KACH;IAED,QAAQ,aAAa,CAAC,MAAM,EAAE;QAC7B,gBAAoC;QACpC;YACC,IAAI,aAAa,CAAC,iBAAiB,GAAG,CAAC,EAAE;gBACxC,MAAM,qBAAqB,GAAG,aAAa,CAAC,MAAM,iBAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChG,IAAA,qCAA6B,EAC5B,aAAa,EACb,aAAa,EACb,YAAY,EACZ,qBAAqB,GAAG,CAAC,EACzB,qBAAqB,GAAG,CAAC,EACzB,SAAS,CACT,CAAC;gBACF,aAAa,CAAC,iBAAiB,EAAE,CAAC;aAClC;YACD,MAAM;QACP,gBAAkC;QAClC;YACC,IAAA,kCAAkB,EAAC,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YAC3F,SAAS,CAAC,SAAS,CAAC,mBAAmB,CACtC,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,SAAS,CACT,CAAC;YACF,MAAM;QACP,gBAAgC;QAChC;YACC,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrF,IAAA,mBAAW,EAAC,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,CAAC,EAAE,aAAa,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;YACrG,MAAM;QACP,gBAAkC;QAClC;YACC,eAAe,CAAC,IAAI,CACnB,GAAG,IAAA,kCAAa,EACf,aAAa,CAAC,MAAM,iBAAmC;gBACtD,CAAC;gBACD,CAAC,YAAmD,EACrD,CAAC,EACD,aAAa,EACb,YAAY,EACZ,UAAU,EACV,SAAS,EACT,SAAS,EACT,aAAa,CAAC,QAAQ,EACtB,KAAK,CACL,CACD,CAAC;YACF,MAAM;KACP;IAED,wBAAwB,CACvB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,UAAU,EACV,SAAS,EACT,eAAe,EACf,SAAS,CACT,CAAC;IACF,MAAM,WAAW,GAAG,IAAA,4BAAmB,EACtC,eAAe,EACf,aAAa,EACb,YAAY,EACZ,aAAa,EACb,aAAa,CAAC,MAAM,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EACjE,UAAU,EACV,SAAS,EACT,SAAS,CACT,CAAC;IAEF,MAAM,mBAAmB,GAAG,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;;QACzB,CAAC,CAAC,WAAW,GAAG,aAAa,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,WAAW,mCAAI,SAAS,CAAC;IACnG,CAAC,CAAC,CAAC;IAEH,IAAI,MAAM,GAAG,CAAC,EAAE;QACf,KAAK,MAAM,MAAM,IAAI,aAAa,EAAE;YACnC,MAAM,mBAAmB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,IAAA,mCAAkB,EAAC,mBAAmB,CAAC,EAAE;gBAC5C,mBAAmB,CAAC,eAAe,CAAC,MAAM,EAAE;oBAC3C,aAAa,EAAE,aAAa;oBAC5B,YAAY,EAAE,YAAY;oBAC1B,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,aAAa;oBACpB,IAAI,EAAE,YAAY;oBAClB,SAAS;iBACT,CAAC,CAAC;aACH;SACD;QACD,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE;YAChC,MAAM,mBAAmB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxD,IAAI,IAAA,mCAAkB,EAAC,mBAAmB,CAAC,EAAE;gBAC5C,mBAAmB,CAAC,eAAe,CAAC,MAAM,EAAE;oBAC3C,aAAa,EAAE,aAAa;oBAC5B,YAAY,EAAE,YAAY;oBAC1B,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,UAAU;oBACjB,IAAI,EAAE,SAAS;oBACf,SAAS;iBACT,CAAC,CAAC;aACH;SACD;KACD;IACD,OAAO,WAAW,CAAC;AACpB,CAAC,CAAC;AAtJW,QAAA,eAAe,mBAsJ1B;AAEF,MAAM,wBAAwB,GAAG,CAChC,MAAmB,EACnB,KAAoB,EACpB,IAAqB,EACrB,UAAyB,EACzB,SAA0B,EAC1B,eAA8B,EAC9B,SAAwB,EACvB,EAAE;;IACH,IAAI,IAAA,uBAAe,EAAC,MAAM,EAAE,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE;QACvF,KAAK;aACH,MAAM,CACN,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,MAAM,eAAyC;YACjD,CAAC,CAAC,MAAM,iBAA2C,CACpD;aACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,iBAA2C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC/E,IAAI,CAAC,CAAC,MAAM,EAAE;gBACb,IAAA,mBAAW,EAAC,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;aACrE;QACF,CAAC,CAAC,CAAC;QACJ,KAAK;aACH,MAAM,CACN,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,MAAM,eAAsC,IAAI,CAAC,CAAC,MAAM,iBAAwC,CACnG;aACA,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC;aAC7C,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,iBAAwC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,IAAA,mBAAW,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;KACJ;IAED,KAAK,MAAM,OAAO,IAAI,MAAA,IAAI,CAAC,QAAQ,mCAAI,EAAE,EAAE;QAC1C,MAAM,WAAW,GAAG,6BAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,IAAA,qDAAoC,EAAC,WAAW,CAAC,EAAE;YACtD,WAAW,CAAC,0BAA0B,CAAC,OAAO,EAAE;gBAC/C,aAAa,EAAE,MAAM;gBACrB,KAAK;gBACL,IAAI;gBACJ,SAAS;aACT,CAAC,CAAC;SACH;KACD;AACF,CAAC,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasAfterDealDamage, hasAfterFriendlyMinionDamagedTrinket, hasOnDamaged } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateDivineShield } from '../keywords/divine-shield';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { pickRandom } from '../services/utils';\r\nimport { grantStatsToMinionsOfEachType, hasCorrectTribe } from '../utils';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { applyFrenzy } from './frenzy';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { performEntitySpawns } from './spawns';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const onEntityDamaged = (\r\n\tdamagedEntity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity | BgsPlayerEntity,\r\n\tdamage: number,\r\n\tgameState: FullGameState,\r\n): readonly BoardEntity[] => {\r\n\tconst spawnedEntities: BoardEntity[] = [];\r\n\tconst friendlyBoard =\r\n\t\tboard?.[0]?.friendly === damagedEntity.friendly\r\n\t\t\t? board\r\n\t\t\t: otherBoard?.[0]?.friendly === damagedEntity.friendly\r\n\t\t\t? otherBoard\r\n\t\t\t: [];\r\n\tconst enemyBoard =\r\n\t\tboard?.[0]?.friendly === damagedEntity.friendly\r\n\t\t\t? otherBoard\r\n\t\t\t: board?.[0]?.friendly === damagedEntity.friendly\r\n\t\t\t? board\r\n\t\t\t: [];\r\n\tconst friendlyHero = friendlyBoard === board ? hero : otherHero;\r\n\tconst enemyHero = friendlyBoard === board ? otherHero : hero;\r\n\r\n\tif (damagedEntity.frenzyChargesLeft > 0 && damagedEntity.health > 0 && !damagedEntity.definitelyDead) {\r\n\t\tapplyFrenzy(damagedEntity, friendlyBoard, friendlyHero, gameState);\r\n\t\tdamagedEntity.frenzyChargesLeft--;\r\n\t}\r\n\r\n\tconst wheneverDamagedImpl = cardMappings[damagedEntity.cardId];\r\n\tif (hasOnDamaged(wheneverDamagedImpl)) {\r\n\t\twheneverDamagedImpl.onDamaged(damagedEntity, {\r\n\t\t\tdamagedEntity: damagedEntity,\r\n\t\t\tdamageDealer: damageSource,\r\n\t\t\tdamage: damage,\r\n\t\t\tboard: friendlyBoard,\r\n\t\t\thero: friendlyHero,\r\n\t\t\totherHero: enemyHero,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t}\r\n\r\n\tswitch (damagedEntity.cardId) {\r\n\t\tcase CardIds.WingedChimera_BG29_844:\r\n\t\tcase CardIds.WingedChimera_BG29_844_G:\r\n\t\t\tif (damagedEntity.abiityChargesLeft > 0) {\r\n\t\t\t\tconst wingedChimeraModifier = damagedEntity.cardId === CardIds.WingedChimera_BG29_844_G ? 2 : 1;\r\n\t\t\t\tgrantStatsToMinionsOfEachType(\r\n\t\t\t\t\tdamagedEntity,\r\n\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\tfriendlyHero,\r\n\t\t\t\t\twingedChimeraModifier * 1,\r\n\t\t\t\t\twingedChimeraModifier * 1,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t\tdamagedEntity.abiityChargesLeft--;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Untameabull_BG29_878:\r\n\t\tcase CardIds.Untameabull_BG29_878_G:\r\n\t\t\tupdateDivineShield(damagedEntity, friendlyBoard, friendlyHero, enemyHero, true, gameState);\r\n\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\tdamagedEntity,\r\n\t\t\t\tdamagedEntity,\r\n\t\t\t\tfriendlyBoard,\r\n\t\t\t\tfriendlyHero,\r\n\t\t\t\tenemyHero,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TrustyPup_BG29_800:\r\n\t\tcase CardIds.TrustyPup_BG29_800_G:\r\n\t\t\tconst trustyPupStats = damagedEntity.cardId === CardIds.TrustyPup_BG29_800_G ? 2 : 1;\r\n\t\t\tmodifyStats(damagedEntity, damagedEntity, trustyPupStats, 0, friendlyBoard, friendlyHero, gameState);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SilverGoose_BG29_801:\r\n\t\tcase CardIds.SilverGoose_BG29_801_G:\r\n\t\t\tspawnedEntities.push(\r\n\t\t\t\t...spawnEntities(\r\n\t\t\t\t\tdamagedEntity.cardId === CardIds.SilverGoose_BG29_801_G\r\n\t\t\t\t\t\t? CardIds.SilverGoose_SilverFledglingToken_BG29_801_Gt\r\n\t\t\t\t\t\t: CardIds.SilverGoose_SilverFledglingToken_BG29_801t,\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\tfriendlyHero,\r\n\t\t\t\t\tenemyBoard,\r\n\t\t\t\t\tenemyHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tdamagedEntity.friendly,\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}\r\n\r\n\thandleOtherEntityEffects(\r\n\t\tdamagedEntity,\r\n\t\tfriendlyBoard,\r\n\t\tfriendlyHero,\r\n\t\tenemyBoard,\r\n\t\tenemyHero,\r\n\t\tspawnedEntities,\r\n\t\tgameState,\r\n\t);\r\n\tconst finalSpawns = performEntitySpawns(\r\n\t\tspawnedEntities,\r\n\t\tfriendlyBoard,\r\n\t\tfriendlyHero,\r\n\t\tdamagedEntity,\r\n\t\tfriendlyBoard.length - (friendlyBoard.indexOf(damagedEntity) + 1),\r\n\t\tenemyBoard,\r\n\t\tenemyHero,\r\n\t\tgameState,\r\n\t);\r\n\r\n\tconst entityRightToSpawns = friendlyBoard[friendlyBoard.indexOf(damagedEntity) + 1];\r\n\tfinalSpawns.forEach((e) => {\r\n\t\te.hasAttacked = damagedEntity.hasAttacked > 1 ? 1 : entityRightToSpawns?.hasAttacked ?? undefined;\r\n\t});\r\n\r\n\tif (damage > 0) {\r\n\t\tfor (const entity of friendlyBoard) {\r\n\t\t\tconst afterDealDamageImpl = cardMappings[entity.cardId];\r\n\t\t\tif (hasAfterDealDamage(afterDealDamageImpl)) {\r\n\t\t\t\tafterDealDamageImpl.afterDealDamage(entity, {\r\n\t\t\t\t\tdamagedEntity: damagedEntity,\r\n\t\t\t\t\tdamageDealer: damageSource,\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\t\thero: friendlyHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (const entity of enemyBoard) {\r\n\t\t\tconst afterDealDamageImpl = cardMappings[entity.cardId];\r\n\t\t\tif (hasAfterDealDamage(afterDealDamageImpl)) {\r\n\t\t\t\tafterDealDamageImpl.afterDealDamage(entity, {\r\n\t\t\t\t\tdamagedEntity: damagedEntity,\r\n\t\t\t\t\tdamageDealer: damageSource,\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t\tboard: enemyBoard,\r\n\t\t\t\t\thero: enemyHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn finalSpawns;\r\n};\r\n\r\nconst handleOtherEntityEffects = (\r\n\tentity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tspawnedEntities: BoardEntity[],\r\n\tgameState: FullGameState,\r\n) => {\r\n\tif (hasCorrectTribe(entity, hero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\tboard\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.IridescentSkyblazer_BG29_806 ||\r\n\t\t\t\t\te.cardId === CardIds.IridescentSkyblazer_BG29_806_G,\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst stats = e.cardId === CardIds.IridescentSkyblazer_BG29_806_G ? 2 : 1;\r\n\t\t\t\tconst target = pickRandom(board.filter((e) => e.entityId !== entity.entityId));\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tmodifyStats(target, e, 3 * stats, 1 * stats, board, hero, gameState);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\tboard\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.TrigoreTheLasher_BG29_807 || e.cardId === CardIds.TrigoreTheLasher_BG29_807_G,\r\n\t\t\t)\r\n\t\t\t.filter((e) => e.entityId !== entity.entityId)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst stats = e.cardId === CardIds.TrigoreTheLasher_BG29_807_G ? 2 : 1;\r\n\t\t\t\tmodifyStats(e, e, 0, 2 * stats, board, hero, gameState);\r\n\t\t\t});\r\n\t}\r\n\r\n\tfor (const trinket of hero.trinkets ?? []) {\r\n\t\tconst trinketImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasAfterFriendlyMinionDamagedTrinket(trinketImpl)) {\r\n\t\t\ttrinketImpl.afterFriendlyMinionDamaged(trinket, {\r\n\t\t\t\tdamagedEntity: entity,\r\n\t\t\t\tboard,\r\n\t\t\t\thero,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport interface AfterDealDamageInput {\r\n\tdamagedEntity: BoardEntity | BgsPlayerEntity;\r\n\tdamageDealer: BoardEntity | BgsPlayerEntity;\r\n\tdamage: number;\r\n\tboard: BoardEntity[];\r\n\thero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n}\r\n\r\n/** Fired from the friendly hero’s perspective when any friendly board minion takes damage. */\r\nexport interface AfterFriendlyMinionDamagedInput {\r\n\tdamagedEntity: BoardEntity;\r\n\tboard: BoardEntity[];\r\n\thero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"damage-effects.js","sourceRoot":"","sources":["../../src/simulation/damage-effects.ts"],"names":[],"mappings":"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","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasAfterDealDamage, hasAfterFriendlyMinionDamagedTrinket, hasOnDamaged } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateDivineShield } from '../keywords/divine-shield';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { pickRandom } from '../services/utils';\r\nimport { grantStatsToMinionsOfEachType, hasCorrectTribe } from '../utils';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { applyFrenzy } from './frenzy';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { performEntitySpawns } from './spawns';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const onEntityDamaged = (\r\n\tdamagedEntity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity | BgsPlayerEntity,\r\n\tdamage: number,\r\n\tgameState: FullGameState,\r\n): readonly BoardEntity[] => {\r\n\tconst spawnedEntities: BoardEntity[] = [];\r\n\tconst friendlyBoard =\r\n\t\tboard?.[0]?.friendly === damagedEntity.friendly\r\n\t\t\t? board\r\n\t\t\t: otherBoard?.[0]?.friendly === damagedEntity.friendly\r\n\t\t\t? otherBoard\r\n\t\t\t: [];\r\n\tconst enemyBoard =\r\n\t\tboard?.[0]?.friendly === damagedEntity.friendly\r\n\t\t\t? otherBoard\r\n\t\t\t: board?.[0]?.friendly === damagedEntity.friendly\r\n\t\t\t? board\r\n\t\t\t: [];\r\n\tconst friendlyHero = friendlyBoard === board ? hero : otherHero;\r\n\tconst enemyHero = friendlyBoard === board ? otherHero : hero;\r\n\r\n\tif (damagedEntity.frenzyChargesLeft > 0 && damagedEntity.health > 0 && !damagedEntity.definitelyDead) {\r\n\t\tapplyFrenzy(damagedEntity, friendlyBoard, friendlyHero, gameState);\r\n\t\tdamagedEntity.frenzyChargesLeft--;\r\n\t}\r\n\r\n\tconst wheneverDamagedImpl = cardMappings[damagedEntity.cardId];\r\n\tif (hasOnDamaged(wheneverDamagedImpl)) {\r\n\t\twheneverDamagedImpl.onDamaged(damagedEntity, {\r\n\t\t\tdamagedEntity: damagedEntity,\r\n\t\t\tdamageDealer: damageSource,\r\n\t\t\tdamage: damage,\r\n\t\t\tboard: friendlyBoard,\r\n\t\t\thero: friendlyHero,\r\n\t\t\totherHero: enemyHero,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t}\r\n\r\n\tswitch (damagedEntity.cardId) {\r\n\t\tcase CardIds.WingedChimera_BG29_844:\r\n\t\tcase CardIds.WingedChimera_BG29_844_G:\r\n\t\t\tif (damagedEntity.abiityChargesLeft > 0) {\r\n\t\t\t\tconst wingedChimeraModifier = damagedEntity.cardId === CardIds.WingedChimera_BG29_844_G ? 2 : 1;\r\n\t\t\t\tgrantStatsToMinionsOfEachType(\r\n\t\t\t\t\tdamagedEntity,\r\n\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\tfriendlyHero,\r\n\t\t\t\t\twingedChimeraModifier * 1,\r\n\t\t\t\t\twingedChimeraModifier * 1,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t\tdamagedEntity.abiityChargesLeft--;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Untameabull_BG29_878:\r\n\t\tcase CardIds.Untameabull_BG29_878_G:\r\n\t\t\tupdateDivineShield(damagedEntity, friendlyBoard, friendlyHero, enemyHero, true, gameState);\r\n\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\tdamagedEntity,\r\n\t\t\t\tdamagedEntity,\r\n\t\t\t\tfriendlyBoard,\r\n\t\t\t\tfriendlyHero,\r\n\t\t\t\tenemyHero,\r\n\t\t\t);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TrustyPup_BG29_800:\r\n\t\tcase CardIds.TrustyPup_BG29_800_G:\r\n\t\t\tconst trustyPupStats = damagedEntity.cardId === CardIds.TrustyPup_BG29_800_G ? 2 : 1;\r\n\t\t\tmodifyStats(damagedEntity, damagedEntity, trustyPupStats, 0, friendlyBoard, friendlyHero, gameState);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SilverGoose_BG29_801:\r\n\t\tcase CardIds.SilverGoose_BG29_801_G:\r\n\t\t\tspawnedEntities.push(\r\n\t\t\t\t...spawnEntities(\r\n\t\t\t\t\tdamagedEntity.cardId === CardIds.SilverGoose_BG29_801_G\r\n\t\t\t\t\t\t? CardIds.SilverGoose_SilverFledglingToken_BG29_801_Gt\r\n\t\t\t\t\t\t: CardIds.SilverGoose_SilverFledglingToken_BG29_801t,\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\tfriendlyHero,\r\n\t\t\t\t\tenemyBoard,\r\n\t\t\t\t\tenemyHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tdamagedEntity.friendly,\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}\r\n\r\n\thandleOtherEntityEffects(\r\n\t\tdamagedEntity,\r\n\t\tfriendlyBoard,\r\n\t\tfriendlyHero,\r\n\t\tenemyBoard,\r\n\t\tenemyHero,\r\n\t\tspawnedEntities,\r\n\t\tgameState,\r\n\t);\r\n\tconst finalSpawns = performEntitySpawns(\r\n\t\tspawnedEntities,\r\n\t\tfriendlyBoard,\r\n\t\tfriendlyHero,\r\n\t\tdamagedEntity,\r\n\t\tfriendlyBoard.length - (friendlyBoard.indexOf(damagedEntity) + 1),\r\n\t\tenemyBoard,\r\n\t\tenemyHero,\r\n\t\tgameState,\r\n\t);\r\n\r\n\tconst entityRightToSpawns = friendlyBoard[friendlyBoard.indexOf(damagedEntity) + 1];\r\n\tfinalSpawns.forEach((e) => {\r\n\t\te.hasAttacked = damagedEntity.hasAttacked > 1 ? 1 : entityRightToSpawns?.hasAttacked ?? undefined;\r\n\t});\r\n\r\n\tif (damage > 0) {\r\n\t\tfor (const entity of friendlyBoard) {\r\n\t\t\tconst afterDealDamageImpl = cardMappings[entity.cardId];\r\n\t\t\tif (hasAfterDealDamage(afterDealDamageImpl)) {\r\n\t\t\t\tafterDealDamageImpl.afterDealDamage(entity, {\r\n\t\t\t\t\tdamagedEntity: damagedEntity,\r\n\t\t\t\t\tdamageDealer: damageSource,\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\t\thero: friendlyHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t\tfor (const entity of enemyBoard) {\r\n\t\t\tconst afterDealDamageImpl = cardMappings[entity.cardId];\r\n\t\t\tif (hasAfterDealDamage(afterDealDamageImpl)) {\r\n\t\t\t\tafterDealDamageImpl.afterDealDamage(entity, {\r\n\t\t\t\t\tdamagedEntity: damagedEntity,\r\n\t\t\t\t\tdamageDealer: damageSource,\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t\tboard: enemyBoard,\r\n\t\t\t\t\thero: enemyHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn finalSpawns;\r\n};\r\n\r\nconst handleOtherEntityEffects = (\r\n\tentity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tspawnedEntities: BoardEntity[],\r\n\tgameState: FullGameState,\r\n) => {\r\n\tif (hasCorrectTribe(entity, hero, Race.BEAST, gameState.anomalies, gameState.allCards)) {\r\n\t\tboard\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.IridescentSkyblazer_BG29_806 ||\r\n\t\t\t\t\te.cardId === CardIds.IridescentSkyblazer_BG29_806_G,\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst stats = e.cardId === CardIds.IridescentSkyblazer_BG29_806_G ? 2 : 1;\r\n\t\t\t\tconst target = pickRandom(board.filter((e) => e.entityId !== entity.entityId));\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tmodifyStats(target, e, 3 * stats, 2 * stats, board, hero, gameState);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\tboard\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.TrigoreTheLasher_BG29_807 || e.cardId === CardIds.TrigoreTheLasher_BG29_807_G,\r\n\t\t\t)\r\n\t\t\t.filter((e) => e.entityId !== entity.entityId)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst stats = e.cardId === CardIds.TrigoreTheLasher_BG29_807_G ? 2 : 1;\r\n\t\t\t\tmodifyStats(e, e, 0, 2 * stats, board, hero, gameState);\r\n\t\t\t});\r\n\t}\r\n\r\n\tfor (const trinket of hero.trinkets ?? []) {\r\n\t\tconst trinketImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasAfterFriendlyMinionDamagedTrinket(trinketImpl)) {\r\n\t\t\ttrinketImpl.afterFriendlyMinionDamaged(trinket, {\r\n\t\t\t\tdamagedEntity: entity,\r\n\t\t\t\tboard,\r\n\t\t\t\thero,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport interface AfterDealDamageInput {\r\n\tdamagedEntity: BoardEntity | BgsPlayerEntity;\r\n\tdamageDealer: BoardEntity | BgsPlayerEntity;\r\n\tdamage: number;\r\n\tboard: BoardEntity[];\r\n\thero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n}\r\n\r\n/** Fired from the friendly hero’s perspective when any friendly board minion takes damage. */\r\nexport interface AfterFriendlyMinionDamagedInput {\r\n\tdamagedEntity: BoardEntity;\r\n\tboard: BoardEntity[];\r\n\thero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n}\r\n"]}
|
|
@@ -561,7 +561,7 @@ const spawnEntitiesFromDeathrattle = (deadEntity, deadEntityIndexFromRight, boar
|
|
|
561
561
|
(0, cards_in_hand_1.addCardsInHand)(boardWithDeadEntityHero, boardWithDeadEntity, [null], gameState);
|
|
562
562
|
break;
|
|
563
563
|
case "BG30_MagicItem_411e":
|
|
564
|
-
(0, cards_in_hand_1.addCardsInHand)(boardWithDeadEntityHero, boardWithDeadEntity, ["BG20_GEM"], gameState);
|
|
564
|
+
(0, cards_in_hand_1.addCardsInHand)(boardWithDeadEntityHero, boardWithDeadEntity, ["BG20_GEM", "BG20_GEM"], gameState);
|
|
565
565
|
break;
|
|
566
566
|
case "BG21_000e":
|
|
567
567
|
case "BG21_000_Ge":
|