@firestone-hs/simulate-bgs-battle 1.1.482 → 1.1.484

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.
@@ -1 +1 @@
1
- {"version":3,"file":"simulator.js","sourceRoot":"","sources":["../../src/simulation/simulator.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEffectiveTechLevel } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { debugState } from '../debug-state';\r\nimport { SingleSimulationResult } from '../single-simulation-result';\r\nimport { stringifySimple } from '../utils';\r\nimport { simulateAttack } from './attack';\r\nimport { clearStealthIfNeeded } from './auras';\r\nimport { FullGameState, PlayerState } from './internal-game-state';\r\nimport { handleStartOfCombat } from './start-of-combat';\r\nimport { handleSummonsWhenSpace } from './summon-when-space';\r\n\r\n// New simulator should be instantiated for each match\r\nexport class Simulator {\r\n\tprivate currentAttacker: number;\r\n\tprivate currentSpeedAttacker = -1;\r\n\r\n\t// It should come already initialized\r\n\tconstructor(private readonly gameState: FullGameState) {}\r\n\r\n\t// Here we suppose that the BoardEntity only contain at most the enchantments that are linked\r\n\t// to auras (so we probably should hand-filter that, since there are actually few auras)\r\n\tpublic simulateSingleBattle(playerState: PlayerState, opponentState: PlayerState): SingleSimulationResult {\r\n\t\tlet playerBoard: BoardEntity[] = playerState.board;\r\n\t\tlet playerEntity: BgsPlayerEntity = playerState.player;\r\n\t\tlet opponentBoard: BoardEntity[] = opponentState.board;\r\n\t\tlet opponentEntity: BgsPlayerEntity = opponentState.player;\r\n\t\twhile (\r\n\t\t\t!playerEntity.startOfCombatDone ||\r\n\t\t\t!opponentEntity.startOfCombatDone ||\r\n\t\t\t(playerBoard?.length > 0 && opponentBoard?.length > 0)\r\n\t\t) {\r\n\t\t\tthis.simulateSingleBattlePass(playerBoard, playerEntity, opponentBoard, opponentEntity);\r\n\r\n\t\t\t// The only case where there can only 0-attack minions on a board is when both boards\r\n\t\t\t// are that way (otherwise one side would kill the other)\r\n\t\t\tconst areBothBoards0Attack =\r\n\t\t\t\tplayerState.board.length > 0 &&\r\n\t\t\t\tplayerState.board.every((entity) => entity.attack === 0) &&\r\n\t\t\t\topponentState.board.length > 0 &&\r\n\t\t\t\topponentState.board.every((entity) => entity.attack === 0);\r\n\t\t\tconst isPlayerBoardEmpty = playerState.board.length === 0;\r\n\t\t\tconst isOpponentBoardEmpty = opponentState.board.length === 0;\r\n\t\t\tplayerBoard = areBothBoards0Attack || isPlayerBoardEmpty ? playerState.teammate?.board : playerState.board;\r\n\t\t\tplayerEntity =\r\n\t\t\t\tareBothBoards0Attack || isPlayerBoardEmpty ? playerState.teammate?.player : playerState.player;\r\n\t\t\topponentBoard =\r\n\t\t\t\tareBothBoards0Attack || isOpponentBoardEmpty ? opponentState.teammate?.board : opponentState.board;\r\n\t\t\topponentEntity =\r\n\t\t\t\tareBothBoards0Attack || isOpponentBoardEmpty ? opponentState.teammate?.player : opponentState.player;\r\n\t\t\t// So that gameState.player always refers to the active player\r\n\t\t\tif (isPlayerBoardEmpty) {\r\n\t\t\t\t// Reset deaths\r\n\t\t\t\tthis.gameState.sharedState.deaths = this.gameState.sharedState.deaths.filter(\r\n\t\t\t\t\t(e) => e.friendly !== this.gameState.gameState.player.player.friendly,\r\n\t\t\t\t);\r\n\t\t\t\tthis.gameState.gameState.player.teammate = {\r\n\t\t\t\t\tboard: this.gameState.gameState.player.board,\r\n\t\t\t\t\tplayer: this.gameState.gameState.player.player,\r\n\t\t\t\t};\r\n\t\t\t\tthis.gameState.gameState.player.player = playerEntity;\r\n\t\t\t\tthis.gameState.gameState.player.board = playerBoard;\r\n\r\n\t\t\t\t// const initialPlayer = this.gameState.gameState.playerInitial;\r\n\t\t\t\t// const initialPlayerTeammate = initialPlayer.teammate;\r\n\t\t\t}\r\n\t\t\tif (isOpponentBoardEmpty) {\r\n\t\t\t\t// Reset deaths\r\n\t\t\t\tthis.gameState.sharedState.deaths = this.gameState.sharedState.deaths.filter(\r\n\t\t\t\t\t(e) => e.friendly !== this.gameState.gameState.opponent.player.friendly,\r\n\t\t\t\t);\r\n\t\t\t\tthis.gameState.gameState.opponent.teammate = {\r\n\t\t\t\t\tboard: this.gameState.gameState.opponent.board,\r\n\t\t\t\t\tplayer: this.gameState.gameState.opponent.player,\r\n\t\t\t\t};\r\n\t\t\t\tthis.gameState.gameState.opponent.player = opponentEntity;\r\n\t\t\t\tthis.gameState.gameState.opponent.board = opponentBoard;\r\n\t\t\t}\r\n\r\n\t\t\tif (!playerEntity || !opponentEntity) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t(!playerBoard?.length && !opponentBoard?.length) ||\r\n\t\t\t// E.g. when both players have a 0-attack minion\r\n\t\t\t(playerBoard?.length > 0 && opponentBoard?.length > 0)\r\n\t\t) {\r\n\t\t\treturn {\r\n\t\t\t\tresult: 'tied',\r\n\t\t\t} as SingleSimulationResult;\r\n\t\t}\r\n\t\tif (!playerBoard?.length) {\r\n\t\t\tconst damage =\r\n\t\t\t\tthis.buildBoardTotalDamage(opponentBoard, this.gameState.gameState.opponent?.teammate?.board) +\r\n\t\t\t\topponentEntity.tavernTier;\r\n\t\t\tthis.gameState.spectator.registerOpponentAttack(playerBoard, opponentBoard, damage);\r\n\t\t\treturn {\r\n\t\t\t\tresult: 'lost',\r\n\t\t\t\tdamageDealt: damage,\r\n\t\t\t};\r\n\t\t}\r\n\t\tconst damage =\r\n\t\t\tthis.buildBoardTotalDamage(playerBoard, this.gameState.gameState.player?.teammate?.board) +\r\n\t\t\tplayerEntity.tavernTier;\r\n\t\tthis.gameState.spectator.registerPlayerAttack(playerBoard, opponentBoard, damage);\r\n\t\treturn {\r\n\t\t\tresult: 'won',\r\n\t\t\tdamageDealt: damage,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate simulateSingleBattlePass(\r\n\t\tplayerBoard: BoardEntity[],\r\n\t\tplayerEntity: BgsPlayerEntity,\r\n\t\topponentBoard: BoardEntity[],\r\n\t\topponentEntity: BgsPlayerEntity,\r\n\t) {\r\n\t\tif (debugState?.active) {\r\n\t\t\tdebugState.onBattleStart();\r\n\t\t}\r\n\t\t// Start of combat happens only once, so we need to flag whether it has already happened for a\r\n\t\t// given player\r\n\t\tthis.gameState.spectator.registerStartOfCombat(playerBoard, opponentBoard, playerEntity, opponentEntity);\r\n\r\n\t\t// Who attacks first is decided by the game before the hero power comes into effect. However, the full board (with the generated minion)\r\n\t\t// is sent tothe simulator\r\n\t\t// But in fact, the first player decision takes into account that additional minion. See\r\n\t\t// https://replays.firestoneapp.com/?reviewId=ddbbbe93-464b-4400-8e8d-4abca8680a2e\r\n\t\tconst effectivePlayerBoardLength = playerBoard.length;\r\n\t\tconst effectiveOpponentBoardLength = opponentBoard.length;\r\n\t\tthis.currentAttacker =\r\n\t\t\teffectivePlayerBoardLength > effectiveOpponentBoardLength\r\n\t\t\t\t? 0\r\n\t\t\t\t: effectiveOpponentBoardLength > effectivePlayerBoardLength\r\n\t\t\t\t? 1\r\n\t\t\t\t: Math.round(Math.random());\r\n\t\tthis.gameState.sharedState.currentEntityId =\r\n\t\t\tMath.max(\r\n\t\t\t\t...playerBoard.map((entity) => entity.entityId),\r\n\t\t\t\t...opponentBoard.map((entity) => entity.entityId),\r\n\t\t\t\t...(playerEntity.hand?.map((entity) => entity.entityId) ?? []),\r\n\t\t\t\t...(opponentEntity.hand?.map((entity) => entity.entityId) ?? []),\r\n\t\t\t) + 1;\r\n\t\tconst suggestedNewCurrentAttacker = handleStartOfCombat(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tthis.currentAttacker,\r\n\t\t\tthis.gameState,\r\n\t\t);\r\n\t\tthis.currentAttacker = suggestedNewCurrentAttacker;\r\n\t\tlet counter = 0;\r\n\t\tif (debugState?.active) {\r\n\t\t\tthis.currentAttacker = debugState.forcedCurrentAttacker ?? this.currentAttacker;\r\n\t\t}\r\n\t\twhile (playerBoard.length > 0 && opponentBoard.length > 0) {\r\n\t\t\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, this.gameState);\r\n\t\t\tclearStealthIfNeeded(playerBoard, opponentBoard);\r\n\t\t\t// console.log('this.currentSpeedAttacker', this.currentAttacker);\r\n\t\t\t// If there are \"attack immediately\" minions, we keep the same player\r\n\t\t\t// We put it here so that it can kick in after the start of combat effects. However here we don't want\r\n\t\t\t// to change who attacks first, so we repeat that block again after all the attacks have been resolved\r\n\t\t\t// FIXME: This is not strictly correct - if there are multiple attack immediately\r\n\t\t\t// minions that spawn on both player sides it might get a bit more complex\r\n\t\t\t// but overall it works\r\n\t\t\t// Also, this doesn't work when there are several deathrattle competing\r\n\t\t\t// to know who triggers first. See the second test case of the scallywag.test.ts\r\n\t\t\t// that is not handled properly today (the attack should in some cases happen before\r\n\t\t\t// the other deathrattle procs)\r\n\t\t\tif (playerBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 0;\r\n\t\t\t} else if (opponentBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentSpeedAttacker = -1;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tplayerBoard.filter((e) => e.attack > 0).length === 0 &&\r\n\t\t\t\topponentBoard.filter((e) => e.attack > 0).length === 0\r\n\t\t\t) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// console.log('this.currentSpeedAttacker 2', this.currentAttacker, this.currentSpeedAttacker);\r\n\t\t\tif (this.currentSpeedAttacker === 0 || (this.currentSpeedAttacker === -1 && this.currentAttacker === 0)) {\r\n\t\t\t\tsimulateAttack(playerBoard, playerEntity, opponentBoard, opponentEntity, this.gameState);\r\n\t\t\t} else {\r\n\t\t\t\tsimulateAttack(opponentBoard, opponentEntity, playerBoard, playerEntity, this.gameState);\r\n\t\t\t}\r\n\r\n\t\t\t// Update the attacker indices in case there were some deaths\r\n\t\t\tif (playerBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 0;\r\n\t\t\t} else if (opponentBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentSpeedAttacker = -1;\r\n\t\t\t\tthis.currentAttacker = (this.currentAttacker + 1) % 2;\r\n\t\t\t}\r\n\t\t\tcounter++;\r\n\t\t\tif (counter > 400) {\r\n\t\t\t\tconsole.warn(\r\n\t\t\t\t\t'short-circuiting simulation, too many iterations',\r\n\t\t\t\t\tcounter,\r\n\t\t\t\t\t'\\n',\r\n\t\t\t\t\tstringifySimple(playerBoard, this.gameState.allCards),\r\n\t\t\t\t\t'\\n',\r\n\t\t\t\t\tstringifySimple(opponentBoard, this.gameState.allCards),\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t\t\t// return null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate buildBoardTotalDamage(playerBoard: readonly BoardEntity[], teammateBoard?: BoardEntity[]): number {\r\n\t\tconst damageFromPlayerBoard = playerBoard\r\n\t\t\t.map((entity) =>\r\n\t\t\t\tgetEffectiveTechLevel(this.gameState.allCards.getCard(entity.cardId), this.gameState.allCards),\r\n\t\t\t)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst numberOfTeamateMinionsToSummnon = 7 - playerBoard.length;\r\n\t\tconst damageFromTeammateBoard =\r\n\t\t\tteammateBoard\r\n\t\t\t\t?.slice(0, numberOfTeamateMinionsToSummnon)\r\n\t\t\t\t.map((entity) =>\r\n\t\t\t\t\tgetEffectiveTechLevel(this.gameState.allCards.getCard(entity.cardId), this.gameState.allCards),\r\n\t\t\t\t)\r\n\t\t\t\t.reduce((a, b) => a + b, 0) ?? 0;\r\n\t\treturn damageFromPlayerBoard + damageFromTeammateBoard;\r\n\t}\r\n}\r\n"]}
1
+ {"version":3,"file":"simulator.js","sourceRoot":"","sources":["../../src/simulation/simulator.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEffectiveTechLevel } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { debugState } from '../debug-state';\r\nimport { SingleSimulationResult } from '../single-simulation-result';\r\nimport { stringifySimple } from '../utils';\r\nimport { simulateAttack } from './attack';\r\nimport { clearStealthIfNeeded } from './auras';\r\nimport { FullGameState, PlayerState } from './internal-game-state';\r\nimport { handleStartOfCombat } from './start-of-combat';\r\nimport { handleSummonsWhenSpace } from './summon-when-space';\r\n\r\n// New simulator should be instantiated for each match\r\nexport class Simulator {\r\n\tprivate currentAttacker: number;\r\n\tprivate currentSpeedAttacker = -1;\r\n\r\n\tprivate hasShowShortCircuitWarning = false;\r\n\r\n\t// It should come already initialized\r\n\tconstructor(private readonly gameState: FullGameState) {}\r\n\r\n\t// Here we suppose that the BoardEntity only contain at most the enchantments that are linked\r\n\t// to auras (so we probably should hand-filter that, since there are actually few auras)\r\n\tpublic simulateSingleBattle(playerState: PlayerState, opponentState: PlayerState): SingleSimulationResult {\r\n\t\tlet playerBoard: BoardEntity[] = playerState.board;\r\n\t\tlet playerEntity: BgsPlayerEntity = playerState.player;\r\n\t\tlet opponentBoard: BoardEntity[] = opponentState.board;\r\n\t\tlet opponentEntity: BgsPlayerEntity = opponentState.player;\r\n\t\twhile (\r\n\t\t\t!playerEntity.startOfCombatDone ||\r\n\t\t\t!opponentEntity.startOfCombatDone ||\r\n\t\t\t(playerBoard?.length > 0 && opponentBoard?.length > 0)\r\n\t\t) {\r\n\t\t\tthis.simulateSingleBattlePass(playerBoard, playerEntity, opponentBoard, opponentEntity);\r\n\r\n\t\t\t// The only case where there can only 0-attack minions on a board is when both boards\r\n\t\t\t// are that way (otherwise one side would kill the other)\r\n\t\t\tconst areBothBoards0Attack =\r\n\t\t\t\tplayerState.board.length > 0 &&\r\n\t\t\t\tplayerState.board.every((entity) => entity.attack === 0) &&\r\n\t\t\t\topponentState.board.length > 0 &&\r\n\t\t\t\topponentState.board.every((entity) => entity.attack === 0);\r\n\t\t\tconst isPlayerBoardEmpty = playerState.board.length === 0;\r\n\t\t\tconst isOpponentBoardEmpty = opponentState.board.length === 0;\r\n\t\t\tplayerBoard = areBothBoards0Attack || isPlayerBoardEmpty ? playerState.teammate?.board : playerState.board;\r\n\t\t\tplayerEntity =\r\n\t\t\t\tareBothBoards0Attack || isPlayerBoardEmpty ? playerState.teammate?.player : playerState.player;\r\n\t\t\topponentBoard =\r\n\t\t\t\tareBothBoards0Attack || isOpponentBoardEmpty ? opponentState.teammate?.board : opponentState.board;\r\n\t\t\topponentEntity =\r\n\t\t\t\tareBothBoards0Attack || isOpponentBoardEmpty ? opponentState.teammate?.player : opponentState.player;\r\n\t\t\t// So that gameState.player always refers to the active player\r\n\t\t\tif (isPlayerBoardEmpty) {\r\n\t\t\t\t// Reset deaths\r\n\t\t\t\tthis.gameState.sharedState.deaths = this.gameState.sharedState.deaths.filter(\r\n\t\t\t\t\t(e) => e.friendly !== this.gameState.gameState.player.player.friendly,\r\n\t\t\t\t);\r\n\t\t\t\tthis.gameState.gameState.player.teammate = {\r\n\t\t\t\t\tboard: this.gameState.gameState.player.board,\r\n\t\t\t\t\tplayer: this.gameState.gameState.player.player,\r\n\t\t\t\t};\r\n\t\t\t\tthis.gameState.gameState.player.player = playerEntity;\r\n\t\t\t\tthis.gameState.gameState.player.board = playerBoard;\r\n\r\n\t\t\t\t// const initialPlayer = this.gameState.gameState.playerInitial;\r\n\t\t\t\t// const initialPlayerTeammate = initialPlayer.teammate;\r\n\t\t\t}\r\n\t\t\tif (isOpponentBoardEmpty) {\r\n\t\t\t\t// Reset deaths\r\n\t\t\t\tthis.gameState.sharedState.deaths = this.gameState.sharedState.deaths.filter(\r\n\t\t\t\t\t(e) => e.friendly !== this.gameState.gameState.opponent.player.friendly,\r\n\t\t\t\t);\r\n\t\t\t\tthis.gameState.gameState.opponent.teammate = {\r\n\t\t\t\t\tboard: this.gameState.gameState.opponent.board,\r\n\t\t\t\t\tplayer: this.gameState.gameState.opponent.player,\r\n\t\t\t\t};\r\n\t\t\t\tthis.gameState.gameState.opponent.player = opponentEntity;\r\n\t\t\t\tthis.gameState.gameState.opponent.board = opponentBoard;\r\n\t\t\t}\r\n\r\n\t\t\tif (!playerEntity || !opponentEntity) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t(!playerBoard?.length && !opponentBoard?.length) ||\r\n\t\t\t// E.g. when both players have a 0-attack minion\r\n\t\t\t(playerBoard?.length > 0 && opponentBoard?.length > 0)\r\n\t\t) {\r\n\t\t\treturn {\r\n\t\t\t\tresult: 'tied',\r\n\t\t\t} as SingleSimulationResult;\r\n\t\t}\r\n\t\tif (!playerBoard?.length) {\r\n\t\t\tconst damage =\r\n\t\t\t\tthis.buildBoardTotalDamage(opponentBoard, this.gameState.gameState.opponent?.teammate?.board) +\r\n\t\t\t\topponentEntity.tavernTier;\r\n\t\t\tthis.gameState.spectator.registerOpponentAttack(playerBoard, opponentBoard, damage);\r\n\t\t\treturn {\r\n\t\t\t\tresult: 'lost',\r\n\t\t\t\tdamageDealt: damage,\r\n\t\t\t};\r\n\t\t}\r\n\t\tconst damage =\r\n\t\t\tthis.buildBoardTotalDamage(playerBoard, this.gameState.gameState.player?.teammate?.board) +\r\n\t\t\tplayerEntity.tavernTier;\r\n\t\tthis.gameState.spectator.registerPlayerAttack(playerBoard, opponentBoard, damage);\r\n\t\treturn {\r\n\t\t\tresult: 'won',\r\n\t\t\tdamageDealt: damage,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate simulateSingleBattlePass(\r\n\t\tplayerBoard: BoardEntity[],\r\n\t\tplayerEntity: BgsPlayerEntity,\r\n\t\topponentBoard: BoardEntity[],\r\n\t\topponentEntity: BgsPlayerEntity,\r\n\t) {\r\n\t\tif (debugState?.active) {\r\n\t\t\tdebugState.onBattleStart();\r\n\t\t}\r\n\t\t// Start of combat happens only once, so we need to flag whether it has already happened for a\r\n\t\t// given player\r\n\t\tthis.gameState.spectator.registerStartOfCombat(playerBoard, opponentBoard, playerEntity, opponentEntity);\r\n\r\n\t\t// Who attacks first is decided by the game before the hero power comes into effect. However, the full board (with the generated minion)\r\n\t\t// is sent tothe simulator\r\n\t\t// But in fact, the first player decision takes into account that additional minion. See\r\n\t\t// https://replays.firestoneapp.com/?reviewId=ddbbbe93-464b-4400-8e8d-4abca8680a2e\r\n\t\tconst effectivePlayerBoardLength = playerBoard.length;\r\n\t\tconst effectiveOpponentBoardLength = opponentBoard.length;\r\n\t\tthis.currentAttacker =\r\n\t\t\teffectivePlayerBoardLength > effectiveOpponentBoardLength\r\n\t\t\t\t? 0\r\n\t\t\t\t: effectiveOpponentBoardLength > effectivePlayerBoardLength\r\n\t\t\t\t? 1\r\n\t\t\t\t: Math.round(Math.random());\r\n\t\tthis.gameState.sharedState.currentEntityId =\r\n\t\t\tMath.max(\r\n\t\t\t\t...playerBoard.map((entity) => entity.entityId),\r\n\t\t\t\t...opponentBoard.map((entity) => entity.entityId),\r\n\t\t\t\t...(playerEntity.hand?.map((entity) => entity.entityId) ?? []),\r\n\t\t\t\t...(opponentEntity.hand?.map((entity) => entity.entityId) ?? []),\r\n\t\t\t) + 1;\r\n\t\tconst suggestedNewCurrentAttacker = handleStartOfCombat(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tthis.currentAttacker,\r\n\t\t\tthis.gameState,\r\n\t\t);\r\n\t\tthis.currentAttacker = suggestedNewCurrentAttacker;\r\n\t\tlet counter = 0;\r\n\t\tif (debugState?.active) {\r\n\t\t\tthis.currentAttacker = debugState.forcedCurrentAttacker ?? this.currentAttacker;\r\n\t\t}\r\n\t\twhile (playerBoard.length > 0 && opponentBoard.length > 0) {\r\n\t\t\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, this.gameState);\r\n\t\t\tclearStealthIfNeeded(playerBoard, opponentBoard);\r\n\t\t\t// console.log('this.currentSpeedAttacker', this.currentAttacker);\r\n\t\t\t// If there are \"attack immediately\" minions, we keep the same player\r\n\t\t\t// We put it here so that it can kick in after the start of combat effects. However here we don't want\r\n\t\t\t// to change who attacks first, so we repeat that block again after all the attacks have been resolved\r\n\t\t\t// FIXME: This is not strictly correct - if there are multiple attack immediately\r\n\t\t\t// minions that spawn on both player sides it might get a bit more complex\r\n\t\t\t// but overall it works\r\n\t\t\t// Also, this doesn't work when there are several deathrattle competing\r\n\t\t\t// to know who triggers first. See the second test case of the scallywag.test.ts\r\n\t\t\t// that is not handled properly today (the attack should in some cases happen before\r\n\t\t\t// the other deathrattle procs)\r\n\t\t\tif (playerBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 0;\r\n\t\t\t} else if (opponentBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentSpeedAttacker = -1;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tplayerBoard.filter((e) => e.attack > 0).length === 0 &&\r\n\t\t\t\topponentBoard.filter((e) => e.attack > 0).length === 0\r\n\t\t\t) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// console.log('this.currentSpeedAttacker 2', this.currentAttacker, this.currentSpeedAttacker);\r\n\t\t\tif (this.currentSpeedAttacker === 0 || (this.currentSpeedAttacker === -1 && this.currentAttacker === 0)) {\r\n\t\t\t\tsimulateAttack(playerBoard, playerEntity, opponentBoard, opponentEntity, this.gameState);\r\n\t\t\t} else {\r\n\t\t\t\tsimulateAttack(opponentBoard, opponentEntity, playerBoard, playerEntity, this.gameState);\r\n\t\t\t}\r\n\r\n\t\t\t// Update the attacker indices in case there were some deaths\r\n\t\t\tif (playerBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 0;\r\n\t\t\t} else if (opponentBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentSpeedAttacker = -1;\r\n\t\t\t\tthis.currentAttacker = (this.currentAttacker + 1) % 2;\r\n\t\t\t}\r\n\t\t\tcounter++;\r\n\t\t\tif (counter > 400 && !this.hasShowShortCircuitWarning) {\r\n\t\t\t\tconsole.warn(\r\n\t\t\t\t\t'short-circuiting simulation, too many iterations',\r\n\t\t\t\t\tcounter,\r\n\t\t\t\t\t'\\n',\r\n\t\t\t\t\tstringifySimple(playerBoard, this.gameState.allCards),\r\n\t\t\t\t\t'\\n',\r\n\t\t\t\t\tstringifySimple(opponentBoard, this.gameState.allCards),\r\n\t\t\t\t);\r\n\t\t\t\tthis.hasShowShortCircuitWarning = true;\r\n\t\t\t\tbreak;\r\n\t\t\t\t// return null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate buildBoardTotalDamage(playerBoard: readonly BoardEntity[], teammateBoard?: BoardEntity[]): number {\r\n\t\tconst damageFromPlayerBoard = playerBoard\r\n\t\t\t.map((entity) =>\r\n\t\t\t\tgetEffectiveTechLevel(this.gameState.allCards.getCard(entity.cardId), this.gameState.allCards),\r\n\t\t\t)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst numberOfTeamateMinionsToSummnon = 7 - playerBoard.length;\r\n\t\tconst damageFromTeammateBoard =\r\n\t\t\tteammateBoard\r\n\t\t\t\t?.slice(0, numberOfTeamateMinionsToSummnon)\r\n\t\t\t\t.map((entity) =>\r\n\t\t\t\t\tgetEffectiveTechLevel(this.gameState.allCards.getCard(entity.cardId), this.gameState.allCards),\r\n\t\t\t\t)\r\n\t\t\t\t.reduce((a, b) => a + b, 0) ?? 0;\r\n\t\treturn damageFromPlayerBoard + damageFromTeammateBoard;\r\n\t}\r\n}\r\n"]}
package/dist/utils.js CHANGED
@@ -380,7 +380,7 @@ exports.stringifySimple = stringifySimple;
380
380
  const stringifySimpleCard = (entity, allCards = null) => {
381
381
  var _a, _b, _c;
382
382
  return entity
383
- ? `${(_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 : entity.cardId}/entityId=${entity.entityId}/ench=${(_c = entity.enchantments) === null || _c === void 0 ? void 0 : _c.map((e) => `${e.cardId}/${e.repeats}`).join(',')}`
383
+ ? `${(_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 : entity.cardId}/entityId=${entity.entityId}/atk=${entity.attack}/hp=${entity.health}/ench=${(_c = entity.enchantments) === null || _c === void 0 ? void 0 : _c.length}`
384
384
  : null;
385
385
  };
386
386
  exports.stringifySimpleCard = stringifySimpleCard;
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { ALL_BG_RACES, AllCardsService, CardIds, GameTag, Race, ReferenceCard } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from './bgs-player-entity';\r\nimport { BoardEntity } from './board-entity';\r\nimport { BoardSecret } from './board-secret';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { pickRandom, shuffleArray } from './services/utils';\r\nimport { FullGameState, GameState, PlayerState } from './simulation/internal-game-state';\r\nimport { SharedState } from './simulation/shared-state';\r\nimport { modifyStats } from './simulation/stats';\r\n\r\nconst CLEAVE_IDS = [\r\n\tCardIds.CaveHydra_BG_LOOT_078,\r\n\tCardIds.CaveHydra_TB_BaconUps_151,\r\n\tCardIds.FoeReaper4000_BG_GVG_113,\r\n\tCardIds.FoeReaper4000_TB_BaconUps_153,\r\n\tCardIds.BladeCollector_BG26_817,\r\n\tCardIds.BladeCollector_BG26_817_G,\r\n];\r\nconst ATTACK_IMMEDIATELY_IDS = [\r\n\tCardIds.Scallywag_SkyPirateToken_BGS_061t,\r\n\tCardIds.Scallywag_SkyPirateToken_TB_BaconUps_141t,\r\n\tCardIds.Onyxia_OnyxianWhelpToken,\r\n\t// The token doesn't attack immediately natively, only when spawned by the spell\r\n\t// See http://replays.firestoneapp.com/?reviewId=8924452a-540a-4324-8306-46900c3f9f35&turn=22&action=38\r\n\t// CardIds.ToxicTumbleweed_TumblingAssassinToken_BG28_641t,\r\n];\r\nconst CANT_ATTACK_IDS = [CardIds.ArcaneCannon_BGS_077, CardIds.ArcaneCannon_TB_BaconUps_128];\r\n\r\nexport const buildSingleBoardEntity = (\r\n\tcardId: string,\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tentityId = 1,\r\n\tspawnReborn = false,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tentityToSpawn: BoardEntity,\r\n\toriginalEntity: BoardEntity = null,\r\n): BoardEntity => {\r\n\tconst card = allCards.getCard(cardId);\r\n\tconst attackImmediately = ATTACK_IMMEDIATELY_IDS.indexOf(cardId as CardIds) !== -1;\r\n\tconst newEntity = !!entityToSpawn\r\n\t\t? ({\r\n\t\t\t\t...entityToSpawn,\r\n\t\t\t\tentityId: sharedState.currentEntityId++,\r\n\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\tavengeCurrent: entityToSpawn.avengeDefault,\r\n\t\t\t\tattacking: false,\r\n\t\t\t\tdamageMultiplier: 1,\r\n\t\t\t\tfrenzyChargesLeft: 1,\r\n\t\t\t\tfriendly: friendly,\r\n\t\t\t\thasAttacked: 0,\r\n\t\t } as BoardEntity)\r\n\t\t: addImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\tentityId: entityId,\r\n\t\t\t\t\tattack: card.attack,\r\n\t\t\t\t\thasAttacked: 0,\r\n\t\t\t\t\tcardId: cardId,\r\n\t\t\t\t\tdivineShield: hasMechanic(card, 'DIVINE_SHIELD'),\r\n\t\t\t\t\thealth: card.health,\r\n\t\t\t\t\tmaxHealth: card.health,\r\n\t\t\t\t\ttaunt: hasMechanic(card, GameTag[GameTag.TAUNT]),\r\n\t\t\t\t\treborn: hasMechanic(card, 'REBORN'),\r\n\t\t\t\t\tpoisonous: hasMechanic(card, GameTag[GameTag.POISONOUS]),\r\n\t\t\t\t\tvenomous: hasMechanic(card, GameTag[GameTag.VENOMOUS]),\r\n\t\t\t\t\tstealth: hasMechanic(card, GameTag[GameTag.STEALTH]),\r\n\t\t\t\t\twindfury:\r\n\t\t\t\t\t\thasMechanic(card, GameTag[GameTag.WINDFURY]) ||\r\n\t\t\t\t\t\tcard.referencedTags?.includes(GameTag[GameTag.WINDFURY]),\r\n\t\t\t\t\tenchantments: [],\r\n\t\t\t\t\tpendingAttackBuffs: [],\r\n\t\t\t\t\tfriendly: friendly,\r\n\t\t\t\t\tattackImmediately: attackImmediately,\r\n\t\t\t\t\tavengeCurrent: cardsData.avengeValue(cardId),\r\n\t\t\t\t\tavengeDefault: cardsData.avengeValue(cardId),\r\n\t\t\t\t} as BoardEntity,\r\n\t\t\t\tcardsData,\r\n\t\t );\r\n\r\n\tif (spawnReborn && !entityToSpawn) {\r\n\t\tif (cardId === CardIds.BuildAnUndead_PutricidesCreationToken) {\r\n\t\t\tconst stitchedCardId = !!originalEntity.additionalCards?.length ? originalEntity.additionalCards[0] : null;\r\n\t\t\tif (stitchedCardId) {\r\n\t\t\t\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\t\t\t\tnewEntity.attack = newEntity.attack + stitchedCard.attack;\r\n\t\t\t\tnewEntity.maxHealth = newEntity.maxHealth + stitchedCard.health;\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag[GameTag.TAUNT]);\r\n\t\t\t\tnewEntity.divineShield =\r\n\t\t\t\t\tnewEntity.divineShield || hasMechanic(stitchedCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag[GameTag.POISONOUS]);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag[GameTag.VENOMOUS]);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag[GameTag.WINDFURY]);\r\n\t\t\t\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t}\r\n\t\t} else if (\r\n\t\t\tcardId === CardIds.ZilliaxAssembled_BG29_100_G &&\r\n\t\t\t!!originalEntity.additionalCards?.filter((c) => !!c).length\r\n\t\t) {\r\n\t\t\t// In this case, the base stats are still correct (the golden stats of Zilliax), but the keywords\r\n\t\t\t// can change\r\n\t\t\tfor (const moduleCardId of originalEntity.additionalCards) {\r\n\t\t\t\tconst moduleCard = allCards.getCard(moduleCardId);\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(moduleCard, GameTag[GameTag.TAUNT]);\r\n\t\t\t\tnewEntity.divineShield =\r\n\t\t\t\t\tnewEntity.divineShield || hasMechanic(moduleCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(moduleCard, GameTag[GameTag.POISONOUS]);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(moduleCard, GameTag[GameTag.VENOMOUS]);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(moduleCard, GameTag[GameTag.WINDFURY]);\r\n\t\t\t\tnewEntity.stealth = newEntity.stealth || hasMechanic(moduleCard, GameTag[GameTag.STEALTH]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tnewEntity.health = 1;\r\n\t\tnewEntity.reborn = false;\r\n\t\tnewEntity.scriptDataNum1 = getScriptDataNum1(cardId, originalEntity);\r\n\r\n\t\t// For ghoul-acabra + reborn\r\n\t\t// newEntity.attack += originalEntity.permanentAttack ?? 0;\r\n\t\t// newEntity.health += originalEntity.permanentHealth ?? 0;\r\n\t}\r\n\r\n\tnewEntity.hadDivineShield = newEntity.divineShield || newEntity.hadDivineShield;\r\n\treturn newEntity;\r\n};\r\n\r\nconst getScriptDataNum1 = (cardId: string, originalEntity: BoardEntity): number => {\r\n\tswitch (cardId) {\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804:\r\n\t\t\treturn 8;\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804_G:\r\n\t\t\treturn 16;\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t}\r\n};\r\n\r\nexport const buildRandomUndeadCreation = (\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n): BoardEntity => {\r\n\tconst baseCard = pickRandom(cardsData.putricidePool1);\r\n\tconst newEntity = buildSingleBoardEntity(\r\n\t\tbaseCard,\r\n\t\tcontrollerHero,\r\n\t\tfriendlyBoard,\r\n\t\tallCards,\r\n\t\tfriendly,\r\n\t\tsharedState.currentEntityId++,\r\n\t\tfalse,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst stitchedCardId =\r\n\t\tbaseCard === CardIds.EternalSummoner_BG25_009\r\n\t\t\t? pickRandom(cardsData.putridicePool2ForEternalSummoner)\r\n\t\t\t: pickRandom(cardsData.putricidePool2);\r\n\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\tnewEntity.attack += stitchedCard.attack;\r\n\tnewEntity.health += stitchedCard.health;\r\n\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag[GameTag.TAUNT]);\r\n\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(stitchedCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag[GameTag.POISONOUS]);\r\n\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag[GameTag.VENOMOUS]);\r\n\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag[GameTag.WINDFURY]);\r\n\tnewEntity.reborn = newEntity.reborn || hasMechanic(stitchedCard, GameTag[GameTag.REBORN]);\r\n\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\treturn newEntity;\r\n};\r\n\r\nexport const grantRandomAttack = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tadditionalAttack: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = candidateBoard[Math.floor(Math.random() * candidateBoard.length)];\r\n\t\tmodifyStats(target, additionalAttack, 0, candidateBoard, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantRandomHealth = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = pickRandom(candidateBoard);\r\n\t\tmodifyStats(target, 0, health, board, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantRandomStats = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\trace: Race,\r\n\texcludeSource: boolean,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tif (board.length > 0) {\r\n\t\tconst target: BoardEntity = getRandomAliveMinion(\r\n\t\t\tboard.filter((e) => !!e.cardId).filter((e) => (excludeSource ? e.entityId !== source.entityId : true)),\r\n\t\t\thero,\r\n\t\t\trace,\r\n\t\t\tgameState.allCards,\r\n\t\t);\r\n\t\tif (target) {\r\n\t\t\tmodifyStats(target, attack, health, board, hero, gameState);\r\n\t\t\tif (gameState.spectator) {\r\n\t\t\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t\t\t}\r\n\t\t\treturn target;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const updateVenomous = (\r\n\tentity: BoardEntity,\r\n\tnewValue: boolean,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst lostVenomous = entity.venomous && !newValue;\r\n\tentity.venomous = newValue;\r\n\tif (lostVenomous) {\r\n\t\tconst belcherPortraits = boardHero.trinkets.filter(\r\n\t\t\t(t) =>\r\n\t\t\t\tt.cardId === CardIds.BelcherPortrait_BG30_MagicItem_432 ||\r\n\t\t\t\tt.cardId === CardIds.BelcherPortrait_BelcherPortraitToken_BG30_MagicItem_432t,\r\n\t\t);\r\n\t\tbelcherPortraits.forEach((p) => {\r\n\t\t\tconst buff = p.cardId === CardIds.BelcherPortrait_BelcherPortraitToken_BG30_MagicItem_432t ? 15 : 5;\r\n\t\t\tmodifyStats(entity, buff, buff, board, boardHero, gameState);\r\n\t\t\tgameState.spectator.registerPowerTarget(p, entity, board, null, null);\r\n\t\t});\r\n\t}\r\n};\r\n\r\n// export const grantAllDivineShield = (\r\n// \tboard: BoardEntity[],\r\n// \thero: BgsPlayerEntity,\r\n// \ttribe: string,\r\n// \tcards: AllCardsService,\r\n// ): void => {\r\n// \tconst elligibleEntities = board\r\n// \t\t.filter((entity) => !entity.divineShield)\r\n// \t\t.filter((entity) => hasCorrectTribe(entity, hero, getRaceEnum(tribe), cards));\r\n// \tfor (const entity of elligibleEntities) {\r\n// \t\tupdateDivineShield(entity, board, true, cards);\r\n// \t}\r\n// };\r\n\r\nexport const getRandomAliveMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, allCards))\r\n\t\t.filter((e) => e?.health > 0 && !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomRevivableMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, allCards))\r\n\t\t.filter((e) => !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomMinionWithHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tif (!board.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst highestHealth = Math.max(...board.map((e) => e.health));\r\n\tconst validMinions = board.filter((e) => e.health === highestHealth);\r\n\treturn validMinions[Math.floor(Math.random() * validMinions.length)];\r\n};\r\n\r\nexport const addStatsToBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\t// permanentUpgrade = false,\r\n): void => {\r\n\tfor (const entity of board) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.allCards)) {\r\n\t\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\t\tgameState.spectator?.registerPowerTarget(sourceEntity, entity, board, null, null);\r\n\t\t\t// if (permanentUpgrade) {\r\n\t\t\t// \tentity.permanentAttack = (entity.permanentAttack ?? 0) + attack;\r\n\t\t\t// \tentity.permanentHealth = (entity.permanentHealth ?? 0) + health;\r\n\t\t\t// }\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const grantStatsToMinionsOfEachType = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\tnumberOfDifferentTypes = 99,\r\n\tcanRevive = true,\r\n): void => {\r\n\tconst minionsToBuff = getMinionsOfDifferentTypes(board, hero, gameState, canRevive, numberOfDifferentTypes);\r\n\tfor (const entity of minionsToBuff) {\r\n\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, entity, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const getMinionsOfDifferentTypes = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcanRevive = true,\r\n\tnumberOfDifferentTypes = 99,\r\n): BoardEntity[] => {\r\n\tconst result: BoardEntity[] = [];\r\n\tif (board.length > 0) {\r\n\t\tlet boardCopy = board.filter((e) => !gameState.allCards.getCard(e.cardId).races?.includes(Race[Race.ALL]));\r\n\t\tconst allRaces = shuffleArray(ALL_BG_RACES);\r\n\t\tlet typesBuffed = 0;\r\n\t\tconst racesProcessed = [];\r\n\t\tfor (let i = 1; i <= 2; i++) {\r\n\t\t\tfor (const tribe of allRaces) {\r\n\t\t\t\tconst minionsWithRaces = boardCopy\r\n\t\t\t\t\t.filter((e) => getEffectiveTribesForEntity(e, hero, gameState.allCards).length === i)\r\n\t\t\t\t\t.filter((e) =>\r\n\t\t\t\t\t\tgetEffectiveTribesForEntity(e, hero, gameState.allCards).some(\r\n\t\t\t\t\t\t\t(r) => !racesProcessed.includes(Race[r]),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t);\r\n\t\t\t\tif (typesBuffed >= numberOfDifferentTypes) {\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t\tconst validMinion: BoardEntity = canRevive\r\n\t\t\t\t\t? getRandomRevivableMinion(minionsWithRaces, hero, tribe, gameState.allCards)\r\n\t\t\t\t\t: getRandomAliveMinion(minionsWithRaces, hero, tribe, gameState.allCards);\r\n\t\t\t\tif (validMinion) {\r\n\t\t\t\t\tresult.push(validMinion);\r\n\t\t\t\t\tboardCopy = boardCopy.filter((e) => e !== validMinion);\r\n\t\t\t\t\ttypesBuffed++;\r\n\t\t\t\t\tracesProcessed.push(tribe);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tresult.push(\r\n\t\t\t...board.filter((e) => {\r\n\t\t\t\tconst effectiveTribes = getEffectiveTribesForEntity(e, hero, gameState.allCards);\r\n\t\t\t\treturn effectiveTribes?.includes(Race.ALL);\r\n\t\t\t}),\r\n\t\t);\r\n\t}\r\n\treturn result;\r\n};\r\n\r\nexport const hasMechanic = (card: ReferenceCard, mechanic: string): boolean => {\r\n\treturn card.mechanics?.includes(mechanic);\r\n};\r\n\r\nexport const hasCorrectTribe = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\ttargetTribe: Race,\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tconst effectiveTribesForEntity = getEffectiveTribesForEntity(entity, playerEntity, allCards);\r\n\treturn (\r\n\t\teffectiveTribesForEntity.length > 0 &&\r\n\t\t(effectiveTribesForEntity.includes(targetTribe) || effectiveTribesForEntity.includes(Race.ALL))\r\n\t);\r\n};\r\n\r\nexport const getEffectiveTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\treturn [\r\n\t\t...(allCards.getCard(entity.cardId).races?.map((r) => Race[r]) ?? []),\r\n\t\t...getSpecialTribesForEntity(entity, playerEntity, allCards),\r\n\t];\r\n};\r\n\r\nconst getSpecialTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013:\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013_G:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.SmugglerPortrait_BG30_MagicItem_825)\r\n\t\t\t\t? [Race.DRAGON]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.LightfangEnforcer_BGS_009:\r\n\t\tcase CardIds.LightfangEnforcer_TB_BaconUps_082:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.EnforcerPortrait_BG30_MagicItem_971)\r\n\t\t\t\t? [Race.ALL]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.BrannBronzebeard_BG_LOE_077:\r\n\t\tcase CardIds.BrannBronzebeard_TB_BaconUps_045:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.BronzebeardPortrait_BG30_MagicItem_418)\r\n\t\t\t\t? [Race.DRAGON, Race.MURLOC]\r\n\t\t\t\t: [];\r\n\t}\r\n\treturn [];\r\n};\r\n\r\n/** @deprecated use hasCorreectTribe instead */\r\nexport const isCorrectTribe = (cardRaces: readonly string[], targetTribe: Race): boolean => {\r\n\tif (!cardRaces?.length) {\r\n\t\treturn false;\r\n\t}\r\n\treturn cardRaces\r\n\t\t.map((cardRace) => getRaceEnum(cardRace))\r\n\t\t.some((raceEnum) => raceEnum === Race.ALL || raceEnum === targetTribe);\r\n};\r\n\r\nexport const getRaceEnum = (race: string): Race => {\r\n\treturn Race[race];\r\n};\r\n\r\nexport const addImpliedMechanics = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tconst cleave = CLEAVE_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tconst cantAttack = CANT_ATTACK_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tentity.cleave = cleave;\r\n\tentity.cantAttack = cantAttack;\r\n\tentity.divineShield = entity.divineShield || entity.hadDivineShield;\r\n\tentity.immuneWhenAttackCharges =\r\n\t\tentity.cardId === CardIds.Warpwing_BG24_004 || entity.cardId === CardIds.Warpwing_BG24_004_G ? 99999 : null;\r\n\tentity.frenzyChargesLeft =\r\n\t\tentity.cardId === CardIds.BristlebackKnight_BG20_204_G\r\n\t\t\t? 2\r\n\t\t\t: entity.cardId === CardIds.BristlebackKnight_BG20_204\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n\t// It's not an issue adding a charge for entities without a special ability\r\n\tentity.abiityChargesLeft = [\r\n\t\tCardIds.MarineMatriarch_BG29_610,\r\n\t\tCardIds.MarineMatriarch_BG29_610_G,\r\n\t\tCardIds.SoftHeartedSiren_BG26_590,\r\n\t\tCardIds.SoftHeartedSiren_BG26_590_G,\r\n\t\tCardIds.LongJohnCopper_BG29_831,\r\n\t\tCardIds.LongJohnCopper_BG29_831_G,\r\n\t\tCardIds.BristlingBuffoon_BG29_160,\r\n\t\tCardIds.BristlingBuffoon_BG29_160_G,\r\n\t].includes(entity.cardId as CardIds)\r\n\t\t? 3\r\n\t\t: [\r\n\t\t\t\tCardIds.TransmutedBramblewitch_BG27_013_G,\r\n\t\t\t\tCardIds.Mannoroth_BG27_507_G,\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\tCardIds.MadMatador_BG28_404_G,\r\n\t\t\t\tCardIds.WingedChimera_BG29_844,\r\n\t\t\t\tCardIds.WingedChimera_BG29_844_G,\r\n\t\t\t\tCardIds.MossOfTheSchloss_BG30_111_G,\r\n\t\t ].includes(entity.cardId as CardIds)\r\n\t\t? 2\r\n\t\t: 1;\r\n\r\n\treturn setImplicitDataForEntity(entity, cardsData);\r\n};\r\n\r\nconst setImplicitDataForEntity = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tentity.cardId = normalizeCardIdForSkin(entity.cardId);\r\n\tentity.maxHealth = Math.max(0, entity.health, entity.maxHealth ?? 0);\r\n\tentity.maxAttack = Math.max(0, entity.attack, entity.maxAttack ?? 0);\r\n\tconst avengeValue = cardsData.avengeValue(entity.cardId);\r\n\tif (avengeValue > 0) {\r\n\t\tentity.avengeCurrent = avengeValue;\r\n\t\tentity.avengeDefault = avengeValue;\r\n\t}\r\n\treturn entity;\r\n};\r\n\r\nexport const normalizeCardIdForSkin = (cardId: string): string => {\r\n\tif (!cardId?.length) {\r\n\t\treturn cardId;\r\n\t}\r\n\tconst skinMatch = cardId.match(/(.*)_SKIN_.*/);\r\n\tif (skinMatch) {\r\n\t\treturn skinMatch[1];\r\n\t}\r\n\treturn cardId;\r\n};\r\n\r\nexport const stringifySimple = (board: readonly BoardEntity[], allCards: AllCardsService = null): string => {\r\n\treturn '[' + board.map((entity) => stringifySimpleCard(entity, allCards)).join(', ') + ']';\r\n};\r\n\r\nexport const stringifySimpleCard = (entity: BoardEntity, allCards: AllCardsService = null): string => {\r\n\treturn entity\r\n\t\t? `${allCards?.getCard(entity.cardId)?.name ?? entity.cardId}/entityId=${\r\n\t\t\t\tentity.entityId\r\n\t\t }/ench=${entity.enchantments?.map((e) => `${e.cardId}/${e.repeats}`).join(',')}`\r\n\t\t: null;\r\n};\r\n\r\nexport const isFish = (entity: BoardEntity): boolean => {\r\n\treturn (\r\n\t\tentity.cardId.startsWith(CardIds.AvatarOfNzoth_FishOfNzothToken) ||\r\n\t\tentity.cardId.startsWith(CardIds.FishOfNzoth) ||\r\n\t\tentity.additionalCards?.includes(CardIds.DevourerOfSouls_BG_RLK_538)\r\n\t);\r\n};\r\n\r\nexport const isPilotedWhirlOTron = (entity: BoardEntity): boolean => {\r\n\treturn entity.cardId.startsWith(CardIds.PilotedWhirlOTron_BG21_HERO_030_Buddy);\r\n};\r\n\r\nexport const isGolden = (cardId: string, allCards: AllCardsService): boolean => {\r\n\treturn !!allCards.getCard(cardId).premium || !!allCards.getCard(cardId).battlegroundsNormalDbfId;\r\n};\r\n\r\nexport const getPlayerState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.player.player === hero\r\n\t\t? gameState.player\r\n\t\t: gameState.player.teammate?.player === hero\r\n\t\t? gameState.player.teammate\r\n\t\t: gameState.opponent.player === hero\r\n\t\t? gameState.opponent\r\n\t\t: gameState.opponent.teammate?.player === hero\r\n\t\t? gameState.opponent.teammate\r\n\t\t: null;\r\n};\r\n\r\nexport const getTeammateInitialState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.playerInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial.teammate\r\n\t\t: gameState.playerInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial\r\n\t\t: gameState.opponentInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial.teammate\r\n\t\t: gameState.opponentInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial\r\n\t\t: null;\r\n};\r\n\r\nexport const copyEntity = (entity: BoardEntity): BoardEntity => {\r\n\tconst copy: BoardEntity = {\r\n\t\t...entity,\r\n\t\tenchantments: (entity.enchantments ?? []).map((ench) => ({ ...ench })),\r\n\t\tpendingAttackBuffs: [],\r\n\t\trememberedDeathrattles: (entity.rememberedDeathrattles ?? []).map((r) => ({ ...r })),\r\n\t};\r\n\treturn copy;\r\n};\r\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { ALL_BG_RACES, AllCardsService, CardIds, GameTag, Race, ReferenceCard } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from './bgs-player-entity';\r\nimport { BoardEntity } from './board-entity';\r\nimport { BoardSecret } from './board-secret';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { pickRandom, shuffleArray } from './services/utils';\r\nimport { FullGameState, GameState, PlayerState } from './simulation/internal-game-state';\r\nimport { SharedState } from './simulation/shared-state';\r\nimport { modifyStats } from './simulation/stats';\r\n\r\nconst CLEAVE_IDS = [\r\n\tCardIds.CaveHydra_BG_LOOT_078,\r\n\tCardIds.CaveHydra_TB_BaconUps_151,\r\n\tCardIds.FoeReaper4000_BG_GVG_113,\r\n\tCardIds.FoeReaper4000_TB_BaconUps_153,\r\n\tCardIds.BladeCollector_BG26_817,\r\n\tCardIds.BladeCollector_BG26_817_G,\r\n];\r\nconst ATTACK_IMMEDIATELY_IDS = [\r\n\tCardIds.Scallywag_SkyPirateToken_BGS_061t,\r\n\tCardIds.Scallywag_SkyPirateToken_TB_BaconUps_141t,\r\n\tCardIds.Onyxia_OnyxianWhelpToken,\r\n\t// The token doesn't attack immediately natively, only when spawned by the spell\r\n\t// See http://replays.firestoneapp.com/?reviewId=8924452a-540a-4324-8306-46900c3f9f35&turn=22&action=38\r\n\t// CardIds.ToxicTumbleweed_TumblingAssassinToken_BG28_641t,\r\n];\r\nconst CANT_ATTACK_IDS = [CardIds.ArcaneCannon_BGS_077, CardIds.ArcaneCannon_TB_BaconUps_128];\r\n\r\nexport const buildSingleBoardEntity = (\r\n\tcardId: string,\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tentityId = 1,\r\n\tspawnReborn = false,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tentityToSpawn: BoardEntity,\r\n\toriginalEntity: BoardEntity = null,\r\n): BoardEntity => {\r\n\tconst card = allCards.getCard(cardId);\r\n\tconst attackImmediately = ATTACK_IMMEDIATELY_IDS.indexOf(cardId as CardIds) !== -1;\r\n\tconst newEntity = !!entityToSpawn\r\n\t\t? ({\r\n\t\t\t\t...entityToSpawn,\r\n\t\t\t\tentityId: sharedState.currentEntityId++,\r\n\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\tavengeCurrent: entityToSpawn.avengeDefault,\r\n\t\t\t\tattacking: false,\r\n\t\t\t\tdamageMultiplier: 1,\r\n\t\t\t\tfrenzyChargesLeft: 1,\r\n\t\t\t\tfriendly: friendly,\r\n\t\t\t\thasAttacked: 0,\r\n\t\t } as BoardEntity)\r\n\t\t: addImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\tentityId: entityId,\r\n\t\t\t\t\tattack: card.attack,\r\n\t\t\t\t\thasAttacked: 0,\r\n\t\t\t\t\tcardId: cardId,\r\n\t\t\t\t\tdivineShield: hasMechanic(card, 'DIVINE_SHIELD'),\r\n\t\t\t\t\thealth: card.health,\r\n\t\t\t\t\tmaxHealth: card.health,\r\n\t\t\t\t\ttaunt: hasMechanic(card, GameTag[GameTag.TAUNT]),\r\n\t\t\t\t\treborn: hasMechanic(card, 'REBORN'),\r\n\t\t\t\t\tpoisonous: hasMechanic(card, GameTag[GameTag.POISONOUS]),\r\n\t\t\t\t\tvenomous: hasMechanic(card, GameTag[GameTag.VENOMOUS]),\r\n\t\t\t\t\tstealth: hasMechanic(card, GameTag[GameTag.STEALTH]),\r\n\t\t\t\t\twindfury:\r\n\t\t\t\t\t\thasMechanic(card, GameTag[GameTag.WINDFURY]) ||\r\n\t\t\t\t\t\tcard.referencedTags?.includes(GameTag[GameTag.WINDFURY]),\r\n\t\t\t\t\tenchantments: [],\r\n\t\t\t\t\tpendingAttackBuffs: [],\r\n\t\t\t\t\tfriendly: friendly,\r\n\t\t\t\t\tattackImmediately: attackImmediately,\r\n\t\t\t\t\tavengeCurrent: cardsData.avengeValue(cardId),\r\n\t\t\t\t\tavengeDefault: cardsData.avengeValue(cardId),\r\n\t\t\t\t} as BoardEntity,\r\n\t\t\t\tcardsData,\r\n\t\t );\r\n\r\n\tif (spawnReborn && !entityToSpawn) {\r\n\t\tif (cardId === CardIds.BuildAnUndead_PutricidesCreationToken) {\r\n\t\t\tconst stitchedCardId = !!originalEntity.additionalCards?.length ? originalEntity.additionalCards[0] : null;\r\n\t\t\tif (stitchedCardId) {\r\n\t\t\t\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\t\t\t\tnewEntity.attack = newEntity.attack + stitchedCard.attack;\r\n\t\t\t\tnewEntity.maxHealth = newEntity.maxHealth + stitchedCard.health;\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag[GameTag.TAUNT]);\r\n\t\t\t\tnewEntity.divineShield =\r\n\t\t\t\t\tnewEntity.divineShield || hasMechanic(stitchedCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag[GameTag.POISONOUS]);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag[GameTag.VENOMOUS]);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag[GameTag.WINDFURY]);\r\n\t\t\t\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t}\r\n\t\t} else if (\r\n\t\t\tcardId === CardIds.ZilliaxAssembled_BG29_100_G &&\r\n\t\t\t!!originalEntity.additionalCards?.filter((c) => !!c).length\r\n\t\t) {\r\n\t\t\t// In this case, the base stats are still correct (the golden stats of Zilliax), but the keywords\r\n\t\t\t// can change\r\n\t\t\tfor (const moduleCardId of originalEntity.additionalCards) {\r\n\t\t\t\tconst moduleCard = allCards.getCard(moduleCardId);\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(moduleCard, GameTag[GameTag.TAUNT]);\r\n\t\t\t\tnewEntity.divineShield =\r\n\t\t\t\t\tnewEntity.divineShield || hasMechanic(moduleCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(moduleCard, GameTag[GameTag.POISONOUS]);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(moduleCard, GameTag[GameTag.VENOMOUS]);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(moduleCard, GameTag[GameTag.WINDFURY]);\r\n\t\t\t\tnewEntity.stealth = newEntity.stealth || hasMechanic(moduleCard, GameTag[GameTag.STEALTH]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tnewEntity.health = 1;\r\n\t\tnewEntity.reborn = false;\r\n\t\tnewEntity.scriptDataNum1 = getScriptDataNum1(cardId, originalEntity);\r\n\r\n\t\t// For ghoul-acabra + reborn\r\n\t\t// newEntity.attack += originalEntity.permanentAttack ?? 0;\r\n\t\t// newEntity.health += originalEntity.permanentHealth ?? 0;\r\n\t}\r\n\r\n\tnewEntity.hadDivineShield = newEntity.divineShield || newEntity.hadDivineShield;\r\n\treturn newEntity;\r\n};\r\n\r\nconst getScriptDataNum1 = (cardId: string, originalEntity: BoardEntity): number => {\r\n\tswitch (cardId) {\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804:\r\n\t\t\treturn 8;\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804_G:\r\n\t\t\treturn 16;\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t}\r\n};\r\n\r\nexport const buildRandomUndeadCreation = (\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n): BoardEntity => {\r\n\tconst baseCard = pickRandom(cardsData.putricidePool1);\r\n\tconst newEntity = buildSingleBoardEntity(\r\n\t\tbaseCard,\r\n\t\tcontrollerHero,\r\n\t\tfriendlyBoard,\r\n\t\tallCards,\r\n\t\tfriendly,\r\n\t\tsharedState.currentEntityId++,\r\n\t\tfalse,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst stitchedCardId =\r\n\t\tbaseCard === CardIds.EternalSummoner_BG25_009\r\n\t\t\t? pickRandom(cardsData.putridicePool2ForEternalSummoner)\r\n\t\t\t: pickRandom(cardsData.putricidePool2);\r\n\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\tnewEntity.attack += stitchedCard.attack;\r\n\tnewEntity.health += stitchedCard.health;\r\n\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag[GameTag.TAUNT]);\r\n\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(stitchedCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag[GameTag.POISONOUS]);\r\n\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag[GameTag.VENOMOUS]);\r\n\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag[GameTag.WINDFURY]);\r\n\tnewEntity.reborn = newEntity.reborn || hasMechanic(stitchedCard, GameTag[GameTag.REBORN]);\r\n\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\treturn newEntity;\r\n};\r\n\r\nexport const grantRandomAttack = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tadditionalAttack: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = candidateBoard[Math.floor(Math.random() * candidateBoard.length)];\r\n\t\tmodifyStats(target, additionalAttack, 0, candidateBoard, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantRandomHealth = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = pickRandom(candidateBoard);\r\n\t\tmodifyStats(target, 0, health, board, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantRandomStats = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\trace: Race,\r\n\texcludeSource: boolean,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tif (board.length > 0) {\r\n\t\tconst target: BoardEntity = getRandomAliveMinion(\r\n\t\t\tboard.filter((e) => !!e.cardId).filter((e) => (excludeSource ? e.entityId !== source.entityId : true)),\r\n\t\t\thero,\r\n\t\t\trace,\r\n\t\t\tgameState.allCards,\r\n\t\t);\r\n\t\tif (target) {\r\n\t\t\tmodifyStats(target, attack, health, board, hero, gameState);\r\n\t\t\tif (gameState.spectator) {\r\n\t\t\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t\t\t}\r\n\t\t\treturn target;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const updateVenomous = (\r\n\tentity: BoardEntity,\r\n\tnewValue: boolean,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst lostVenomous = entity.venomous && !newValue;\r\n\tentity.venomous = newValue;\r\n\tif (lostVenomous) {\r\n\t\tconst belcherPortraits = boardHero.trinkets.filter(\r\n\t\t\t(t) =>\r\n\t\t\t\tt.cardId === CardIds.BelcherPortrait_BG30_MagicItem_432 ||\r\n\t\t\t\tt.cardId === CardIds.BelcherPortrait_BelcherPortraitToken_BG30_MagicItem_432t,\r\n\t\t);\r\n\t\tbelcherPortraits.forEach((p) => {\r\n\t\t\tconst buff = p.cardId === CardIds.BelcherPortrait_BelcherPortraitToken_BG30_MagicItem_432t ? 15 : 5;\r\n\t\t\tmodifyStats(entity, buff, buff, board, boardHero, gameState);\r\n\t\t\tgameState.spectator.registerPowerTarget(p, entity, board, null, null);\r\n\t\t});\r\n\t}\r\n};\r\n\r\n// export const grantAllDivineShield = (\r\n// \tboard: BoardEntity[],\r\n// \thero: BgsPlayerEntity,\r\n// \ttribe: string,\r\n// \tcards: AllCardsService,\r\n// ): void => {\r\n// \tconst elligibleEntities = board\r\n// \t\t.filter((entity) => !entity.divineShield)\r\n// \t\t.filter((entity) => hasCorrectTribe(entity, hero, getRaceEnum(tribe), cards));\r\n// \tfor (const entity of elligibleEntities) {\r\n// \t\tupdateDivineShield(entity, board, true, cards);\r\n// \t}\r\n// };\r\n\r\nexport const getRandomAliveMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, allCards))\r\n\t\t.filter((e) => e?.health > 0 && !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomRevivableMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, allCards))\r\n\t\t.filter((e) => !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomMinionWithHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tif (!board.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst highestHealth = Math.max(...board.map((e) => e.health));\r\n\tconst validMinions = board.filter((e) => e.health === highestHealth);\r\n\treturn validMinions[Math.floor(Math.random() * validMinions.length)];\r\n};\r\n\r\nexport const addStatsToBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\t// permanentUpgrade = false,\r\n): void => {\r\n\tfor (const entity of board) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.allCards)) {\r\n\t\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\t\tgameState.spectator?.registerPowerTarget(sourceEntity, entity, board, null, null);\r\n\t\t\t// if (permanentUpgrade) {\r\n\t\t\t// \tentity.permanentAttack = (entity.permanentAttack ?? 0) + attack;\r\n\t\t\t// \tentity.permanentHealth = (entity.permanentHealth ?? 0) + health;\r\n\t\t\t// }\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const grantStatsToMinionsOfEachType = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\tnumberOfDifferentTypes = 99,\r\n\tcanRevive = true,\r\n): void => {\r\n\tconst minionsToBuff = getMinionsOfDifferentTypes(board, hero, gameState, canRevive, numberOfDifferentTypes);\r\n\tfor (const entity of minionsToBuff) {\r\n\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, entity, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const getMinionsOfDifferentTypes = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcanRevive = true,\r\n\tnumberOfDifferentTypes = 99,\r\n): BoardEntity[] => {\r\n\tconst result: BoardEntity[] = [];\r\n\tif (board.length > 0) {\r\n\t\tlet boardCopy = board.filter((e) => !gameState.allCards.getCard(e.cardId).races?.includes(Race[Race.ALL]));\r\n\t\tconst allRaces = shuffleArray(ALL_BG_RACES);\r\n\t\tlet typesBuffed = 0;\r\n\t\tconst racesProcessed = [];\r\n\t\tfor (let i = 1; i <= 2; i++) {\r\n\t\t\tfor (const tribe of allRaces) {\r\n\t\t\t\tconst minionsWithRaces = boardCopy\r\n\t\t\t\t\t.filter((e) => getEffectiveTribesForEntity(e, hero, gameState.allCards).length === i)\r\n\t\t\t\t\t.filter((e) =>\r\n\t\t\t\t\t\tgetEffectiveTribesForEntity(e, hero, gameState.allCards).some(\r\n\t\t\t\t\t\t\t(r) => !racesProcessed.includes(Race[r]),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t);\r\n\t\t\t\tif (typesBuffed >= numberOfDifferentTypes) {\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t\tconst validMinion: BoardEntity = canRevive\r\n\t\t\t\t\t? getRandomRevivableMinion(minionsWithRaces, hero, tribe, gameState.allCards)\r\n\t\t\t\t\t: getRandomAliveMinion(minionsWithRaces, hero, tribe, gameState.allCards);\r\n\t\t\t\tif (validMinion) {\r\n\t\t\t\t\tresult.push(validMinion);\r\n\t\t\t\t\tboardCopy = boardCopy.filter((e) => e !== validMinion);\r\n\t\t\t\t\ttypesBuffed++;\r\n\t\t\t\t\tracesProcessed.push(tribe);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tresult.push(\r\n\t\t\t...board.filter((e) => {\r\n\t\t\t\tconst effectiveTribes = getEffectiveTribesForEntity(e, hero, gameState.allCards);\r\n\t\t\t\treturn effectiveTribes?.includes(Race.ALL);\r\n\t\t\t}),\r\n\t\t);\r\n\t}\r\n\treturn result;\r\n};\r\n\r\nexport const hasMechanic = (card: ReferenceCard, mechanic: string): boolean => {\r\n\treturn card.mechanics?.includes(mechanic);\r\n};\r\n\r\nexport const hasCorrectTribe = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\ttargetTribe: Race,\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tconst effectiveTribesForEntity = getEffectiveTribesForEntity(entity, playerEntity, allCards);\r\n\treturn (\r\n\t\teffectiveTribesForEntity.length > 0 &&\r\n\t\t(effectiveTribesForEntity.includes(targetTribe) || effectiveTribesForEntity.includes(Race.ALL))\r\n\t);\r\n};\r\n\r\nexport const getEffectiveTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\treturn [\r\n\t\t...(allCards.getCard(entity.cardId).races?.map((r) => Race[r]) ?? []),\r\n\t\t...getSpecialTribesForEntity(entity, playerEntity, allCards),\r\n\t];\r\n};\r\n\r\nconst getSpecialTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013:\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013_G:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.SmugglerPortrait_BG30_MagicItem_825)\r\n\t\t\t\t? [Race.DRAGON]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.LightfangEnforcer_BGS_009:\r\n\t\tcase CardIds.LightfangEnforcer_TB_BaconUps_082:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.EnforcerPortrait_BG30_MagicItem_971)\r\n\t\t\t\t? [Race.ALL]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.BrannBronzebeard_BG_LOE_077:\r\n\t\tcase CardIds.BrannBronzebeard_TB_BaconUps_045:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.BronzebeardPortrait_BG30_MagicItem_418)\r\n\t\t\t\t? [Race.DRAGON, Race.MURLOC]\r\n\t\t\t\t: [];\r\n\t}\r\n\treturn [];\r\n};\r\n\r\n/** @deprecated use hasCorreectTribe instead */\r\nexport const isCorrectTribe = (cardRaces: readonly string[], targetTribe: Race): boolean => {\r\n\tif (!cardRaces?.length) {\r\n\t\treturn false;\r\n\t}\r\n\treturn cardRaces\r\n\t\t.map((cardRace) => getRaceEnum(cardRace))\r\n\t\t.some((raceEnum) => raceEnum === Race.ALL || raceEnum === targetTribe);\r\n};\r\n\r\nexport const getRaceEnum = (race: string): Race => {\r\n\treturn Race[race];\r\n};\r\n\r\nexport const addImpliedMechanics = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tconst cleave = CLEAVE_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tconst cantAttack = CANT_ATTACK_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tentity.cleave = cleave;\r\n\tentity.cantAttack = cantAttack;\r\n\tentity.divineShield = entity.divineShield || entity.hadDivineShield;\r\n\tentity.immuneWhenAttackCharges =\r\n\t\tentity.cardId === CardIds.Warpwing_BG24_004 || entity.cardId === CardIds.Warpwing_BG24_004_G ? 99999 : null;\r\n\tentity.frenzyChargesLeft =\r\n\t\tentity.cardId === CardIds.BristlebackKnight_BG20_204_G\r\n\t\t\t? 2\r\n\t\t\t: entity.cardId === CardIds.BristlebackKnight_BG20_204\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n\t// It's not an issue adding a charge for entities without a special ability\r\n\tentity.abiityChargesLeft = [\r\n\t\tCardIds.MarineMatriarch_BG29_610,\r\n\t\tCardIds.MarineMatriarch_BG29_610_G,\r\n\t\tCardIds.SoftHeartedSiren_BG26_590,\r\n\t\tCardIds.SoftHeartedSiren_BG26_590_G,\r\n\t\tCardIds.LongJohnCopper_BG29_831,\r\n\t\tCardIds.LongJohnCopper_BG29_831_G,\r\n\t\tCardIds.BristlingBuffoon_BG29_160,\r\n\t\tCardIds.BristlingBuffoon_BG29_160_G,\r\n\t].includes(entity.cardId as CardIds)\r\n\t\t? 3\r\n\t\t: [\r\n\t\t\t\tCardIds.TransmutedBramblewitch_BG27_013_G,\r\n\t\t\t\tCardIds.Mannoroth_BG27_507_G,\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\tCardIds.MadMatador_BG28_404_G,\r\n\t\t\t\tCardIds.WingedChimera_BG29_844,\r\n\t\t\t\tCardIds.WingedChimera_BG29_844_G,\r\n\t\t\t\tCardIds.MossOfTheSchloss_BG30_111_G,\r\n\t\t ].includes(entity.cardId as CardIds)\r\n\t\t? 2\r\n\t\t: 1;\r\n\r\n\treturn setImplicitDataForEntity(entity, cardsData);\r\n};\r\n\r\nconst setImplicitDataForEntity = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tentity.cardId = normalizeCardIdForSkin(entity.cardId);\r\n\tentity.maxHealth = Math.max(0, entity.health, entity.maxHealth ?? 0);\r\n\tentity.maxAttack = Math.max(0, entity.attack, entity.maxAttack ?? 0);\r\n\tconst avengeValue = cardsData.avengeValue(entity.cardId);\r\n\tif (avengeValue > 0) {\r\n\t\tentity.avengeCurrent = avengeValue;\r\n\t\tentity.avengeDefault = avengeValue;\r\n\t}\r\n\treturn entity;\r\n};\r\n\r\nexport const normalizeCardIdForSkin = (cardId: string): string => {\r\n\tif (!cardId?.length) {\r\n\t\treturn cardId;\r\n\t}\r\n\tconst skinMatch = cardId.match(/(.*)_SKIN_.*/);\r\n\tif (skinMatch) {\r\n\t\treturn skinMatch[1];\r\n\t}\r\n\treturn cardId;\r\n};\r\n\r\nexport const stringifySimple = (board: readonly BoardEntity[], allCards: AllCardsService = null): string => {\r\n\treturn '[' + board.map((entity) => stringifySimpleCard(entity, allCards)).join(', ') + ']';\r\n};\r\n\r\nexport const stringifySimpleCard = (entity: BoardEntity, allCards: AllCardsService = null): string => {\r\n\treturn entity\r\n\t\t? `${allCards?.getCard(entity.cardId)?.name ?? entity.cardId}/entityId=${entity.entityId}/atk=${\r\n\t\t\t\tentity.attack\r\n\t\t }/hp=${entity.health}/ench=${entity.enchantments?.length}`\r\n\t\t: null;\r\n};\r\n\r\nexport const isFish = (entity: BoardEntity): boolean => {\r\n\treturn (\r\n\t\tentity.cardId.startsWith(CardIds.AvatarOfNzoth_FishOfNzothToken) ||\r\n\t\tentity.cardId.startsWith(CardIds.FishOfNzoth) ||\r\n\t\tentity.additionalCards?.includes(CardIds.DevourerOfSouls_BG_RLK_538)\r\n\t);\r\n};\r\n\r\nexport const isPilotedWhirlOTron = (entity: BoardEntity): boolean => {\r\n\treturn entity.cardId.startsWith(CardIds.PilotedWhirlOTron_BG21_HERO_030_Buddy);\r\n};\r\n\r\nexport const isGolden = (cardId: string, allCards: AllCardsService): boolean => {\r\n\treturn !!allCards.getCard(cardId).premium || !!allCards.getCard(cardId).battlegroundsNormalDbfId;\r\n};\r\n\r\nexport const getPlayerState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.player.player === hero\r\n\t\t? gameState.player\r\n\t\t: gameState.player.teammate?.player === hero\r\n\t\t? gameState.player.teammate\r\n\t\t: gameState.opponent.player === hero\r\n\t\t? gameState.opponent\r\n\t\t: gameState.opponent.teammate?.player === hero\r\n\t\t? gameState.opponent.teammate\r\n\t\t: null;\r\n};\r\n\r\nexport const getTeammateInitialState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.playerInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial.teammate\r\n\t\t: gameState.playerInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial\r\n\t\t: gameState.opponentInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial.teammate\r\n\t\t: gameState.opponentInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial\r\n\t\t: null;\r\n};\r\n\r\nexport const copyEntity = (entity: BoardEntity): BoardEntity => {\r\n\tconst copy: BoardEntity = {\r\n\t\t...entity,\r\n\t\tenchantments: (entity.enchantments ?? []).map((ench) => ({ ...ench })),\r\n\t\tpendingAttackBuffs: [],\r\n\t\trememberedDeathrattles: (entity.rememberedDeathrattles ?? []).map((r) => ({ ...r })),\r\n\t};\r\n\treturn copy;\r\n};\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firestone-hs/simulate-bgs-battle",
3
- "version": "1.1.482",
3
+ "version": "1.1.484",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "lint": "eslint --color --fix --ext .ts .",