@firestone-hs/simulate-bgs-battle 1.1.466 → 1.1.468

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.
Files changed (77) hide show
  1. package/dist/bgs-player-entity.d.ts +12 -1
  2. package/dist/bgs-player-entity.js.map +1 -1
  3. package/dist/cards/cards-data.d.ts +0 -1
  4. package/dist/cards/cards-data.js +18 -50
  5. package/dist/cards/cards-data.js.map +1 -1
  6. package/dist/divine-shield.d.ts +6 -0
  7. package/dist/divine-shield.js +100 -0
  8. package/dist/divine-shield.js.map +1 -0
  9. package/dist/input-sanitation.js +3 -2
  10. package/dist/input-sanitation.js.map +1 -1
  11. package/dist/simulate-bgs-battle.js +3 -0
  12. package/dist/simulate-bgs-battle.js.map +1 -1
  13. package/dist/simulation/add-minion-to-board.d.ts +2 -5
  14. package/dist/simulation/add-minion-to-board.js +172 -45
  15. package/dist/simulation/add-minion-to-board.js.map +1 -1
  16. package/dist/simulation/attack.js +30 -60
  17. package/dist/simulation/attack.js.map +1 -1
  18. package/dist/simulation/auras.d.ts +2 -0
  19. package/dist/simulation/auras.js +60 -23
  20. package/dist/simulation/auras.js.map +1 -1
  21. package/dist/simulation/avenge.js +36 -7
  22. package/dist/simulation/avenge.js.map +1 -1
  23. package/dist/simulation/battlecries.js +53 -12
  24. package/dist/simulation/battlecries.js.map +1 -1
  25. package/dist/simulation/blood-gems.d.ts +2 -2
  26. package/dist/simulation/blood-gems.js +28 -5
  27. package/dist/simulation/blood-gems.js.map +1 -1
  28. package/dist/simulation/cards-in-hand.js +1 -1
  29. package/dist/simulation/cards-in-hand.js.map +1 -1
  30. package/dist/simulation/damage-effects.js +14 -2
  31. package/dist/simulation/damage-effects.js.map +1 -1
  32. package/dist/simulation/damage-to-hero.d.ts +4 -0
  33. package/dist/simulation/damage-to-hero.js +8 -0
  34. package/dist/simulation/damage-to-hero.js.map +1 -0
  35. package/dist/simulation/death-effects.js +15 -0
  36. package/dist/simulation/death-effects.js.map +1 -1
  37. package/dist/simulation/deathrattle-effects.js +58 -27
  38. package/dist/simulation/deathrattle-effects.js.map +1 -1
  39. package/dist/simulation/deathrattle-orchestration.js +3 -3
  40. package/dist/simulation/deathrattle-orchestration.js.map +1 -1
  41. package/dist/simulation/deathrattle-spawns.js +32 -5
  42. package/dist/simulation/deathrattle-spawns.js.map +1 -1
  43. package/dist/simulation/frenzy.js +2 -2
  44. package/dist/simulation/frenzy.js.map +1 -1
  45. package/dist/simulation/minion-death.d.ts +1 -1
  46. package/dist/simulation/minion-death.js +47 -9
  47. package/dist/simulation/minion-death.js.map +1 -1
  48. package/dist/simulation/on-attack.js +11 -4
  49. package/dist/simulation/on-attack.js.map +1 -1
  50. package/dist/simulation/on-being-attacked.js +3 -2
  51. package/dist/simulation/on-being-attacked.js.map +1 -1
  52. package/dist/simulation/reborn.js +9 -0
  53. package/dist/simulation/reborn.js.map +1 -1
  54. package/dist/simulation/remove-minion-from-board.d.ts +2 -1
  55. package/dist/simulation/remove-minion-from-board.js +9 -7
  56. package/dist/simulation/remove-minion-from-board.js.map +1 -1
  57. package/dist/simulation/spawn-fail.d.ts +4 -0
  58. package/dist/simulation/spawn-fail.js +28 -0
  59. package/dist/simulation/spawn-fail.js.map +1 -0
  60. package/dist/simulation/spawns.js +2 -4
  61. package/dist/simulation/spawns.js.map +1 -1
  62. package/dist/simulation/spectator/spectator.d.ts +2 -2
  63. package/dist/simulation/spectator/spectator.js.map +1 -1
  64. package/dist/simulation/start-of-combat.d.ts +1 -1
  65. package/dist/simulation/start-of-combat.js +283 -45
  66. package/dist/simulation/start-of-combat.js.map +1 -1
  67. package/dist/simulation/stats.js +2 -2
  68. package/dist/simulation/stats.js.map +1 -1
  69. package/dist/simulation/summon-when-space.js +39 -0
  70. package/dist/simulation/summon-when-space.js.map +1 -1
  71. package/dist/simulation/utils/golden.d.ts +1 -1
  72. package/dist/simulation/utils/golden.js +2 -2
  73. package/dist/simulation/utils/golden.js.map +1 -1
  74. package/dist/utils.d.ts +7 -8
  75. package/dist/utils.js +73 -53
  76. package/dist/utils.js.map +1 -1
  77. package/package.json +1 -1
@@ -41,7 +41,7 @@ const modifyStats = (entity, attackAmount, healthAmount, friendlyBoard, friendly
41
41
  entity.health += realHealthAmount;
42
42
  if (realAttackAmount > 0) {
43
43
  entity.maxAttack += realAttackAmount;
44
- if ((0, utils_1.isCorrectTribe)(gameState.allCards.getCard(entity.cardId).races, reference_data_1.Race.DRAGON)) {
44
+ if ((0, utils_1.hasCorrectTribe)(entity, friendlyBoardHero, reference_data_1.Race.DRAGON, gameState.allCards)) {
45
45
  const whelpSmugglers = friendlyBoard.filter((e) => e.cardId === "BG21_013" || e.cardId === "BG21_013_G");
46
46
  whelpSmugglers.forEach((smuggler) => {
47
47
  const buff = smuggler.cardId === "BG21_013_G" ? 2 : 1;
@@ -141,7 +141,7 @@ const onStatUpdateQuests = (entity, board, hero, gameState) => {
141
141
  }
142
142
  };
143
143
  const onStatUpdateMinions = (entity, friendlyBoard, friendlyBoardHero, gameState) => {
144
- if ((0, utils_1.hasCorrectTribe)(entity, reference_data_1.Race.ELEMENTAL, gameState.allCards)) {
144
+ if ((0, utils_1.hasCorrectTribe)(entity, friendlyBoardHero, reference_data_1.Race.ELEMENTAL, gameState.allCards)) {
145
145
  const masterOfRealities = friendlyBoard.filter((e) => e.cardId === "BG21_036" || e.cardId === "BG21_036_G");
146
146
  masterOfRealities.forEach((master) => {
147
147
  (0, exports.modifyStats)(master, master.cardId === "BG21_036_G" ? 2 : 1, master.cardId === "BG21_036_G" ? 2 : 1, friendlyBoard, friendlyBoardHero, gameState);
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/simulation/stats.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { addStatsToBoard, hasCorrectTribe, isCorrectTribe } from '../utils';\r\nimport { applyAurasToSelf } from './add-minion-to-board';\r\nimport { getNeighbours } from './attack';\r\nimport { FullGameState, PlayerState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { Spectator } from './spectator/spectator';\r\n\r\nexport const setEntityStats = (\r\n\tentity: BoardEntity,\r\n\tattack: number | null,\r\n\thealth: number | null,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (attack !== null) {\r\n\t\tentity.attack = attack;\r\n\t\tentity.maxAttack = attack;\r\n\t}\r\n\tif (health !== null) {\r\n\t\tentity.health = health;\r\n\t\tentity.maxHealth = health;\r\n\t}\r\n\tapplyAurasToSelf(entity, board, boardHero, gameState);\r\n};\r\n\r\nexport const modifyStats = (\r\n\tentity: BoardEntity,\r\n\tattackAmount: number,\r\n\thealthAmount: number,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tspectator: Spectator = null,\r\n): void => {\r\n\tif (attackAmount === 0 && healthAmount === 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (entity.cardId === CardIds.LocPrince_BG29_889 || entity.cardId === CardIds.LocPrince_BG29_889_G) {\r\n\t\tconst buff = entity.cardId === CardIds.LocPrince_BG29_889_G ? 4 : 2;\r\n\t\tattackAmount += buff;\r\n\t\thealthAmount += buff;\r\n\t}\r\n\r\n\tconst otherBoardHero: BgsPlayerEntity =\r\n\t\tgameState.gameState.player.player === friendlyBoardHero\r\n\t\t\t? gameState.gameState.opponent.player\r\n\t\t\t: gameState.gameState.player.player;\r\n\r\n\tconst neighbours = getNeighbours(friendlyBoard, entity);\r\n\tconst poetMultipliers = neighbours.filter((e) => e.cardId === CardIds.PersistentPoet_BG29_813_G).length * 2 || 1;\r\n\tconst tarecgosaMultiplier = entity.cardId === CardIds.Tarecgosa_BG21_015_G ? 2 : 1;\r\n\r\n\tconst realAttackAmount = attackAmount * poetMultipliers * tarecgosaMultiplier;\r\n\tconst realHealthAmount = healthAmount * poetMultipliers * tarecgosaMultiplier;\r\n\r\n\tentity.attack = Math.max(0, entity.attack + realAttackAmount);\r\n\tentity.previousAttack = entity.attack;\r\n\tentity.pendingAttackBuffs.push(realAttackAmount);\r\n\tentity.health += realHealthAmount;\r\n\r\n\tif (realAttackAmount > 0) {\r\n\t\tentity.maxAttack += realAttackAmount;\r\n\t\tif (isCorrectTribe(gameState.allCards.getCard(entity.cardId).races, Race.DRAGON)) {\r\n\t\t\tconst whelpSmugglers = friendlyBoard.filter(\r\n\t\t\t\t(e) => e.cardId === CardIds.WhelpSmuggler_BG21_013 || e.cardId === CardIds.WhelpSmuggler_BG21_013_G,\r\n\t\t\t);\r\n\t\t\twhelpSmugglers.forEach((smuggler) => {\r\n\t\t\t\tconst buff = smuggler.cardId === CardIds.WhelpSmuggler_BG21_013_G ? 2 : 1;\r\n\t\t\t\tmodifyStats(entity, 0, buff, friendlyBoard, friendlyBoardHero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tsmuggler,\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\r\n\t\t\tif (entity.cardId !== CardIds.Stormbringer_BG26_966 && entity.cardId !== CardIds.Stormbringer_BG26_966_G) {\r\n\t\t\t\tconst stormbringers = friendlyBoard.filter(\r\n\t\t\t\t\t(e) => e.cardId === CardIds.Stormbringer_BG26_966 || e.cardId === CardIds.Stormbringer_BG26_966_G,\r\n\t\t\t\t);\r\n\t\t\t\tstormbringers.forEach((stormbringer) => {\r\n\t\t\t\t\tconst multiplier = stormbringer.cardId === CardIds.Stormbringer_BG26_966_G ? 2 : 1;\r\n\t\t\t\t\t// This is never called?\r\n\t\t\t\t\t(e) => {\r\n\t\t\t\t\t\te.attack += multiplier * realAttackAmount;\r\n\t\t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\t\tstormbringer,\r\n\t\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Sinestra\r\n\t\tfriendlyBoard\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.LadySinestra_TB_BaconShop_HERO_52_Buddy ||\r\n\t\t\t\t\te.cardId === CardIds.LadySinestra_TB_BaconShop_HERO_52_Buddy_G,\r\n\t\t\t)\r\n\t\t\t.forEach((sinestra) => {\r\n\t\t\t\tconst buff = sinestra.cardId === CardIds.LadySinestra_TB_BaconShop_HERO_52_Buddy_G ? 2 : 1;\r\n\t\t\t\tentity.health += buff;\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tsinestra,\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\r\n\t\t// TODO: what happens if the Hunter is killed during the attack?\r\n\t\tif (\r\n\t\t\t[CardIds.HunterOfGatherers_BG25_027, CardIds.HunterOfGatherers_BG25_027_G].includes(\r\n\t\t\t\tentity.cardId as CardIds,\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\taddStatsToBoard(\r\n\t\t\t\tentity,\r\n\t\t\t\tfriendlyBoard,\r\n\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\t0,\r\n\t\t\t\tentity.cardId === CardIds.HunterOfGatherers_BG25_027_G ? 2 : 1,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tif (realHealthAmount > 0) {\r\n\t\tentity.maxHealth += realHealthAmount;\r\n\t\tconst titanicGuardians = friendlyBoard\r\n\t\t\t.filter((e) => e.entityId !== entity.entityId)\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.TitanicGuardian_TB_BaconShop_HERO_39_Buddy ||\r\n\t\t\t\t\te.cardId === CardIds.TitanicGuardian_TB_BaconShop_HERO_39_Buddy_G,\r\n\t\t\t);\r\n\t\ttitanicGuardians.forEach((guardian) => {\r\n\t\t\tconst buff =\r\n\t\t\t\t(guardian.cardId === CardIds.TitanicGuardian_TB_BaconShop_HERO_39_Buddy_G ? 2 : 1) * realHealthAmount;\r\n\t\t\tif (buff > 0) {\r\n\t\t\t\tguardian.health += buff;\r\n\t\t\t\tguardian.maxHealth += buff;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tif (\r\n\t\tentity.cardId === CardIds.Menagerist_AmalgamToken ||\r\n\t\tentity.cardId === CardIds.Cuddlgam_TB_BaconShop_HP_033t_SKIN_A ||\r\n\t\tentity.cardId === CardIds.Cuddlgam_TB_BaconShop_HP_033t_SKIN_A_G ||\r\n\t\tentity.cardId === CardIds.AbominableAmalgam_TB_BaconShop_HP_033t_SKIN_D ||\r\n\t\tentity.cardId === CardIds.AbominableAmalgam_TB_BaconShop_HP_033t_SKIN_D_G\r\n\t) {\r\n\t\tconst mishmashes = friendlyBoard.filter(\r\n\t\t\t(e) =>\r\n\t\t\t\te.cardId === CardIds.Mishmash_TB_BaconShop_HERO_33_Buddy ||\r\n\t\t\t\te.cardId === CardIds.Mishmash_TB_BaconShop_HERO_33_Buddy_G,\r\n\t\t);\r\n\t\tmishmashes.forEach((mishmash) => {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tmishmash,\r\n\t\t\t\t(mishmash.cardId === CardIds.Mishmash_TB_BaconShop_HERO_33_Buddy_G ? 2 : 1) * realAttackAmount,\r\n\t\t\t\t(mishmash.cardId === CardIds.Mishmash_TB_BaconShop_HERO_33_Buddy_G ? 2 : 1) * realHealthAmount,\r\n\t\t\t\tfriendlyBoard,\r\n\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t});\r\n\t} else if (\r\n\t\tentity.cardId === CardIds.DefiantShipwright_BG21_018 ||\r\n\t\tentity.cardId === CardIds.DefiantShipwright_BG21_018_G\r\n\t) {\r\n\t\tconst stat = entity.cardId === CardIds.DefiantShipwright_BG21_018_G ? 2 : 1;\r\n\t\tentity.health += stat;\r\n\t}\r\n\r\n\tonStatsUpdate(entity, friendlyBoard, friendlyBoardHero, gameState);\r\n};\r\n\r\nconst onStatsUpdate = (\r\n\tentity: BoardEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tonStatUpdateMinions(entity, friendlyBoard, friendlyHero, gameState);\r\n\tonStatUpdateQuests(entity, friendlyBoard, friendlyHero, gameState);\r\n};\r\n\r\nexport const applyAfterStatsUpdate = (gameState: FullGameState) => {\r\n\tfor (const entity of gameState.gameState.player.board) {\r\n\t\tapplyAfterStatsUpdateForEntity(entity, gameState.gameState.player, gameState.gameState.opponent, gameState);\r\n\t}\r\n\tfor (const entity of gameState.gameState.opponent.board) {\r\n\t\tapplyAfterStatsUpdateForEntity(entity, gameState.gameState.opponent, gameState.gameState.player, gameState);\r\n\t}\r\n};\r\n\r\nconst applyAfterStatsUpdateForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerState: PlayerState,\r\n\topponentState: PlayerState,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// Attack buffs\r\n\t// Actually this was a bug, and the stats update happen at the same time\r\n\t// Keeping the structure here in case it's useful in the future\r\n\t// for (const attackBuff of entity.pendingAttackBuffs) {\r\n\t// \tif (isCorrectTribe(gameState.allCards.getCard(entity.cardId).races, Race.DRAGON)) {\r\n\t// \t\tconst whelpSmugglers = playerState.board.filter(\r\n\t// \t\t\t(e) => e.cardId === CardIds.WhelpSmuggler_BG21_013 || e.cardId === CardIds.WhelpSmuggler_BG21_013_G,\r\n\t// \t\t);\r\n\t// \t\twhelpSmugglers.forEach((smuggler) => {\r\n\t// \t\t\tconst buff = smuggler.cardId === CardIds.WhelpSmuggler_BG21_013_G ? 2 : 1;\r\n\t// \t\t\tmodifyHealth(entity, buff, playerState.board, playerState.player, gameState);\r\n\t// \t\t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\t\tsmuggler,\r\n\t// \t\t\t\tentity,\r\n\t// \t\t\t\tplayerState.board,\r\n\t// \t\t\t\tplayerState.player,\r\n\t// \t\t\t\topponentState.player,\r\n\t// \t\t\t);\r\n\t// \t\t});\r\n\r\n\t// \t\tif (entity.cardId !== CardIds.Stormbringer_BG26_966 && entity.cardId !== CardIds.Stormbringer_BG26_966_G) {\r\n\t// \t\t\tconst stormbringers = playerState.board.filter(\r\n\t// \t\t\t\t(e) => e.cardId === CardIds.Stormbringer_BG26_966 || e.cardId === CardIds.Stormbringer_BG26_966_G,\r\n\t// \t\t\t);\r\n\t// \t\t\tstormbringers.forEach((stormbringer) => {\r\n\t// \t\t\t\tconst multiplier = stormbringer.cardId === CardIds.Stormbringer_BG26_966_G ? 2 : 1;\r\n\t// \t\t\t\t(e) => {\r\n\t// \t\t\t\t\tmodifyAttack(e, multiplier * attackBuff, playerState.board, playerState.player, gameState);\r\n\t// \t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\t\t\t\tstormbringer,\r\n\t// \t\t\t\t\t\tentity,\r\n\t// \t\t\t\t\t\tplayerState.board,\r\n\t// \t\t\t\t\t\tplayerState.player,\r\n\t// \t\t\t\t\t\topponentState.player,\r\n\t// \t\t\t\t\t);\r\n\t// \t\t\t\t};\r\n\t// \t\t\t});\r\n\t// \t\t}\r\n\t// \t}\r\n\r\n\t// \t// TODO: what happens if the Hunter is killed during the attack?\r\n\t// \tif (\r\n\t// \t\t[CardIds.HunterOfGatherers_BG25_027, CardIds.HunterOfGatherers_BG25_027_G].includes(\r\n\t// \t\t\tentity.cardId as CardIds,\r\n\t// \t\t)\r\n\t// \t) {\r\n\t// \t\taddStatsToBoard(\r\n\t// \t\t\tentity,\r\n\t// \t\t\tplayerState.board,\r\n\t// \t\t\tplayerState.player,\r\n\t// \t\t\t0,\r\n\t// \t\t\tentity.cardId === CardIds.HunterOfGatherers_BG25_027_G ? 2 : 1,\r\n\t// \t\t\tgameState,\r\n\t// \t\t);\r\n\t// \t}\r\n\t// }\r\n\tentity.pendingAttackBuffs = [];\r\n};\r\n\r\nconst onStatUpdateQuests = (\r\n\tentity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst quests = hero.questEntities ?? [];\r\n\tif (!quests.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.FindTheMurderWeapon:\r\n\t\t\t\tonQuestProgressUpdated(hero, quest, board, gameState);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.PressureTheAuthorities:\r\n\t\t\t\tconst totalAttack = board.map((e) => e.attack).reduce((a, b) => a + b, 0);\r\n\t\t\t\tif (totalAttack >= 35) {\r\n\t\t\t\t\tonQuestProgressUpdated(hero, quest, board, gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst onStatUpdateMinions = (\r\n\tentity: BoardEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (hasCorrectTribe(entity, Race.ELEMENTAL, gameState.allCards)) {\r\n\t\tconst masterOfRealities = friendlyBoard.filter(\r\n\t\t\t(e) => e.cardId === CardIds.MasterOfRealities_BG21_036 || e.cardId === CardIds.MasterOfRealities_BG21_036_G,\r\n\t\t);\r\n\t\tmasterOfRealities.forEach((master) => {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tmaster,\r\n\t\t\t\tmaster.cardId === CardIds.MasterOfRealities_BG21_036_G ? 2 : 1,\r\n\t\t\t\tmaster.cardId === CardIds.MasterOfRealities_BG21_036_G ? 2 : 1,\r\n\t\t\t\tfriendlyBoard,\r\n\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\tconst tentaclesOfCthun = friendlyBoard\r\n\t\t.filter((e) => e.entityId !== entity.entityId)\r\n\t\t.filter(\r\n\t\t\t(e) =>\r\n\t\t\t\te.cardId === CardIds.TentacleOfCthun_TB_BaconShop_HERO_29_Buddy ||\r\n\t\t\t\te.cardId === CardIds.TentacleOfCthun_TB_BaconShop_HERO_29_Buddy_G,\r\n\t\t);\r\n\ttentaclesOfCthun.forEach((tentacle) => {\r\n\t\ttentacle.attack += tentacle.cardId === CardIds.TentacleOfCthun_TB_BaconShop_HERO_29_Buddy_G ? 2 : 1;\r\n\t\ttentacle.health += tentacle.cardId === CardIds.TentacleOfCthun_TB_BaconShop_HERO_29_Buddy_G ? 2 : 1;\r\n\t});\r\n};\r\n"]}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/simulation/stats.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { addStatsToBoard, hasCorrectTribe } from '../utils';\r\nimport { applyAurasToSelf } from './add-minion-to-board';\r\nimport { getNeighbours } from './attack';\r\nimport { FullGameState, PlayerState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { Spectator } from './spectator/spectator';\r\n\r\nexport const setEntityStats = (\r\n\tentity: BoardEntity,\r\n\tattack: number | null,\r\n\thealth: number | null,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (attack !== null) {\r\n\t\tentity.attack = attack;\r\n\t\tentity.maxAttack = attack;\r\n\t}\r\n\tif (health !== null) {\r\n\t\tentity.health = health;\r\n\t\tentity.maxHealth = health;\r\n\t}\r\n\tapplyAurasToSelf(entity, board, boardHero, gameState);\r\n};\r\n\r\nexport const modifyStats = (\r\n\tentity: BoardEntity,\r\n\tattackAmount: number,\r\n\thealthAmount: number,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tspectator: Spectator = null,\r\n): void => {\r\n\tif (attackAmount === 0 && healthAmount === 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (entity.cardId === CardIds.LocPrince_BG29_889 || entity.cardId === CardIds.LocPrince_BG29_889_G) {\r\n\t\tconst buff = entity.cardId === CardIds.LocPrince_BG29_889_G ? 4 : 2;\r\n\t\tattackAmount += buff;\r\n\t\thealthAmount += buff;\r\n\t}\r\n\r\n\tconst otherBoardHero: BgsPlayerEntity =\r\n\t\tgameState.gameState.player.player === friendlyBoardHero\r\n\t\t\t? gameState.gameState.opponent.player\r\n\t\t\t: gameState.gameState.player.player;\r\n\r\n\tconst neighbours = getNeighbours(friendlyBoard, entity);\r\n\tconst poetMultipliers = neighbours.filter((e) => e.cardId === CardIds.PersistentPoet_BG29_813_G).length * 2 || 1;\r\n\tconst tarecgosaMultiplier = entity.cardId === CardIds.Tarecgosa_BG21_015_G ? 2 : 1;\r\n\r\n\tconst realAttackAmount = attackAmount * poetMultipliers * tarecgosaMultiplier;\r\n\tconst realHealthAmount = healthAmount * poetMultipliers * tarecgosaMultiplier;\r\n\r\n\tentity.attack = Math.max(0, entity.attack + realAttackAmount);\r\n\tentity.previousAttack = entity.attack;\r\n\tentity.pendingAttackBuffs.push(realAttackAmount);\r\n\tentity.health += realHealthAmount;\r\n\r\n\tif (realAttackAmount > 0) {\r\n\t\tentity.maxAttack += realAttackAmount;\r\n\t\tif (hasCorrectTribe(entity, friendlyBoardHero, Race.DRAGON, gameState.allCards)) {\r\n\t\t\tconst whelpSmugglers = friendlyBoard.filter(\r\n\t\t\t\t(e) => e.cardId === CardIds.WhelpSmuggler_BG21_013 || e.cardId === CardIds.WhelpSmuggler_BG21_013_G,\r\n\t\t\t);\r\n\t\t\twhelpSmugglers.forEach((smuggler) => {\r\n\t\t\t\tconst buff = smuggler.cardId === CardIds.WhelpSmuggler_BG21_013_G ? 2 : 1;\r\n\t\t\t\tmodifyStats(entity, 0, buff, friendlyBoard, friendlyBoardHero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tsmuggler,\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\r\n\t\t\tif (entity.cardId !== CardIds.Stormbringer_BG26_966 && entity.cardId !== CardIds.Stormbringer_BG26_966_G) {\r\n\t\t\t\tconst stormbringers = friendlyBoard.filter(\r\n\t\t\t\t\t(e) => e.cardId === CardIds.Stormbringer_BG26_966 || e.cardId === CardIds.Stormbringer_BG26_966_G,\r\n\t\t\t\t);\r\n\t\t\t\tstormbringers.forEach((stormbringer) => {\r\n\t\t\t\t\tconst multiplier = stormbringer.cardId === CardIds.Stormbringer_BG26_966_G ? 2 : 1;\r\n\t\t\t\t\t// This is never called?\r\n\t\t\t\t\t(e) => {\r\n\t\t\t\t\t\te.attack += multiplier * realAttackAmount;\r\n\t\t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\t\tstormbringer,\r\n\t\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\t\t\t\totherBoardHero,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t};\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Sinestra\r\n\t\tfriendlyBoard\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.LadySinestra_TB_BaconShop_HERO_52_Buddy ||\r\n\t\t\t\t\te.cardId === CardIds.LadySinestra_TB_BaconShop_HERO_52_Buddy_G,\r\n\t\t\t)\r\n\t\t\t.forEach((sinestra) => {\r\n\t\t\t\tconst buff = sinestra.cardId === CardIds.LadySinestra_TB_BaconShop_HERO_52_Buddy_G ? 2 : 1;\r\n\t\t\t\tentity.health += buff;\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tsinestra,\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tfriendlyBoard,\r\n\t\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\t\totherBoardHero,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\r\n\t\t// TODO: what happens if the Hunter is killed during the attack?\r\n\t\tif (\r\n\t\t\t[CardIds.HunterOfGatherers_BG25_027, CardIds.HunterOfGatherers_BG25_027_G].includes(\r\n\t\t\t\tentity.cardId as CardIds,\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\taddStatsToBoard(\r\n\t\t\t\tentity,\r\n\t\t\t\tfriendlyBoard,\r\n\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\t0,\r\n\t\t\t\tentity.cardId === CardIds.HunterOfGatherers_BG25_027_G ? 2 : 1,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tif (realHealthAmount > 0) {\r\n\t\tentity.maxHealth += realHealthAmount;\r\n\t\tconst titanicGuardians = friendlyBoard\r\n\t\t\t.filter((e) => e.entityId !== entity.entityId)\r\n\t\t\t.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\te.cardId === CardIds.TitanicGuardian_TB_BaconShop_HERO_39_Buddy ||\r\n\t\t\t\t\te.cardId === CardIds.TitanicGuardian_TB_BaconShop_HERO_39_Buddy_G,\r\n\t\t\t);\r\n\t\ttitanicGuardians.forEach((guardian) => {\r\n\t\t\tconst buff =\r\n\t\t\t\t(guardian.cardId === CardIds.TitanicGuardian_TB_BaconShop_HERO_39_Buddy_G ? 2 : 1) * realHealthAmount;\r\n\t\t\tif (buff > 0) {\r\n\t\t\t\tguardian.health += buff;\r\n\t\t\t\tguardian.maxHealth += buff;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tif (\r\n\t\tentity.cardId === CardIds.Menagerist_AmalgamToken ||\r\n\t\tentity.cardId === CardIds.Cuddlgam_TB_BaconShop_HP_033t_SKIN_A ||\r\n\t\tentity.cardId === CardIds.Cuddlgam_TB_BaconShop_HP_033t_SKIN_A_G ||\r\n\t\tentity.cardId === CardIds.AbominableAmalgam_TB_BaconShop_HP_033t_SKIN_D ||\r\n\t\tentity.cardId === CardIds.AbominableAmalgam_TB_BaconShop_HP_033t_SKIN_D_G\r\n\t) {\r\n\t\tconst mishmashes = friendlyBoard.filter(\r\n\t\t\t(e) =>\r\n\t\t\t\te.cardId === CardIds.Mishmash_TB_BaconShop_HERO_33_Buddy ||\r\n\t\t\t\te.cardId === CardIds.Mishmash_TB_BaconShop_HERO_33_Buddy_G,\r\n\t\t);\r\n\t\tmishmashes.forEach((mishmash) => {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tmishmash,\r\n\t\t\t\t(mishmash.cardId === CardIds.Mishmash_TB_BaconShop_HERO_33_Buddy_G ? 2 : 1) * realAttackAmount,\r\n\t\t\t\t(mishmash.cardId === CardIds.Mishmash_TB_BaconShop_HERO_33_Buddy_G ? 2 : 1) * realHealthAmount,\r\n\t\t\t\tfriendlyBoard,\r\n\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t});\r\n\t} else if (\r\n\t\tentity.cardId === CardIds.DefiantShipwright_BG21_018 ||\r\n\t\tentity.cardId === CardIds.DefiantShipwright_BG21_018_G\r\n\t) {\r\n\t\tconst stat = entity.cardId === CardIds.DefiantShipwright_BG21_018_G ? 2 : 1;\r\n\t\tentity.health += stat;\r\n\t}\r\n\r\n\tonStatsUpdate(entity, friendlyBoard, friendlyBoardHero, gameState);\r\n};\r\n\r\nconst onStatsUpdate = (\r\n\tentity: BoardEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tonStatUpdateMinions(entity, friendlyBoard, friendlyHero, gameState);\r\n\tonStatUpdateQuests(entity, friendlyBoard, friendlyHero, gameState);\r\n};\r\n\r\nexport const applyAfterStatsUpdate = (gameState: FullGameState) => {\r\n\tfor (const entity of gameState.gameState.player.board) {\r\n\t\tapplyAfterStatsUpdateForEntity(entity, gameState.gameState.player, gameState.gameState.opponent, gameState);\r\n\t}\r\n\tfor (const entity of gameState.gameState.opponent.board) {\r\n\t\tapplyAfterStatsUpdateForEntity(entity, gameState.gameState.opponent, gameState.gameState.player, gameState);\r\n\t}\r\n};\r\n\r\nconst applyAfterStatsUpdateForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerState: PlayerState,\r\n\topponentState: PlayerState,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// Attack buffs\r\n\t// Actually this was a bug, and the stats update happen at the same time\r\n\t// Keeping the structure here in case it's useful in the future\r\n\t// for (const attackBuff of entity.pendingAttackBuffs) {\r\n\t// \tif (isCorrectTribe(gameState.allCards.getCard(entity.cardId).races, Race.DRAGON)) {\r\n\t// \t\tconst whelpSmugglers = playerState.board.filter(\r\n\t// \t\t\t(e) => e.cardId === CardIds.WhelpSmuggler_BG21_013 || e.cardId === CardIds.WhelpSmuggler_BG21_013_G,\r\n\t// \t\t);\r\n\t// \t\twhelpSmugglers.forEach((smuggler) => {\r\n\t// \t\t\tconst buff = smuggler.cardId === CardIds.WhelpSmuggler_BG21_013_G ? 2 : 1;\r\n\t// \t\t\tmodifyHealth(entity, buff, playerState.board, playerState.player, gameState);\r\n\t// \t\t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\t\tsmuggler,\r\n\t// \t\t\t\tentity,\r\n\t// \t\t\t\tplayerState.board,\r\n\t// \t\t\t\tplayerState.player,\r\n\t// \t\t\t\topponentState.player,\r\n\t// \t\t\t);\r\n\t// \t\t});\r\n\r\n\t// \t\tif (entity.cardId !== CardIds.Stormbringer_BG26_966 && entity.cardId !== CardIds.Stormbringer_BG26_966_G) {\r\n\t// \t\t\tconst stormbringers = playerState.board.filter(\r\n\t// \t\t\t\t(e) => e.cardId === CardIds.Stormbringer_BG26_966 || e.cardId === CardIds.Stormbringer_BG26_966_G,\r\n\t// \t\t\t);\r\n\t// \t\t\tstormbringers.forEach((stormbringer) => {\r\n\t// \t\t\t\tconst multiplier = stormbringer.cardId === CardIds.Stormbringer_BG26_966_G ? 2 : 1;\r\n\t// \t\t\t\t(e) => {\r\n\t// \t\t\t\t\tmodifyAttack(e, multiplier * attackBuff, playerState.board, playerState.player, gameState);\r\n\t// \t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\t\t\t\tstormbringer,\r\n\t// \t\t\t\t\t\tentity,\r\n\t// \t\t\t\t\t\tplayerState.board,\r\n\t// \t\t\t\t\t\tplayerState.player,\r\n\t// \t\t\t\t\t\topponentState.player,\r\n\t// \t\t\t\t\t);\r\n\t// \t\t\t\t};\r\n\t// \t\t\t});\r\n\t// \t\t}\r\n\t// \t}\r\n\r\n\t// \t// TODO: what happens if the Hunter is killed during the attack?\r\n\t// \tif (\r\n\t// \t\t[CardIds.HunterOfGatherers_BG25_027, CardIds.HunterOfGatherers_BG25_027_G].includes(\r\n\t// \t\t\tentity.cardId as CardIds,\r\n\t// \t\t)\r\n\t// \t) {\r\n\t// \t\taddStatsToBoard(\r\n\t// \t\t\tentity,\r\n\t// \t\t\tplayerState.board,\r\n\t// \t\t\tplayerState.player,\r\n\t// \t\t\t0,\r\n\t// \t\t\tentity.cardId === CardIds.HunterOfGatherers_BG25_027_G ? 2 : 1,\r\n\t// \t\t\tgameState,\r\n\t// \t\t);\r\n\t// \t}\r\n\t// }\r\n\tentity.pendingAttackBuffs = [];\r\n};\r\n\r\nconst onStatUpdateQuests = (\r\n\tentity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst quests = hero.questEntities ?? [];\r\n\tif (!quests.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.FindTheMurderWeapon:\r\n\t\t\t\tonQuestProgressUpdated(hero, quest, board, gameState);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.PressureTheAuthorities:\r\n\t\t\t\tconst totalAttack = board.map((e) => e.attack).reduce((a, b) => a + b, 0);\r\n\t\t\t\tif (totalAttack >= 35) {\r\n\t\t\t\t\tonQuestProgressUpdated(hero, quest, board, gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst onStatUpdateMinions = (\r\n\tentity: BoardEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (hasCorrectTribe(entity, friendlyBoardHero, Race.ELEMENTAL, gameState.allCards)) {\r\n\t\tconst masterOfRealities = friendlyBoard.filter(\r\n\t\t\t(e) => e.cardId === CardIds.MasterOfRealities_BG21_036 || e.cardId === CardIds.MasterOfRealities_BG21_036_G,\r\n\t\t);\r\n\t\tmasterOfRealities.forEach((master) => {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tmaster,\r\n\t\t\t\tmaster.cardId === CardIds.MasterOfRealities_BG21_036_G ? 2 : 1,\r\n\t\t\t\tmaster.cardId === CardIds.MasterOfRealities_BG21_036_G ? 2 : 1,\r\n\t\t\t\tfriendlyBoard,\r\n\t\t\t\tfriendlyBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\tconst tentaclesOfCthun = friendlyBoard\r\n\t\t.filter((e) => e.entityId !== entity.entityId)\r\n\t\t.filter(\r\n\t\t\t(e) =>\r\n\t\t\t\te.cardId === CardIds.TentacleOfCthun_TB_BaconShop_HERO_29_Buddy ||\r\n\t\t\t\te.cardId === CardIds.TentacleOfCthun_TB_BaconShop_HERO_29_Buddy_G,\r\n\t\t);\r\n\ttentaclesOfCthun.forEach((tentacle) => {\r\n\t\ttentacle.attack += tentacle.cardId === CardIds.TentacleOfCthun_TB_BaconShop_HERO_29_Buddy_G ? 2 : 1;\r\n\t\ttentacle.health += tentacle.cardId === CardIds.TentacleOfCthun_TB_BaconShop_HERO_29_Buddy_G ? 2 : 1;\r\n\t});\r\n};\r\n"]}
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.handleSummonsWhenSpace = void 0;
4
+ const reference_data_1 = require("@firestone-hs/reference-data");
4
5
  const utils_1 = require("../utils");
5
6
  const deathrattle_spawns_1 = require("./deathrattle-spawns");
6
7
  const spawns_1 = require("./spawns");
@@ -23,6 +24,44 @@ const handleSummonsWhenSpaceForPlayer = (targetEntity, playerBoard, playerEntity
23
24
  if (targetEntity.heroPowerId === "BG23_HERO_201p") {
24
25
  handleOzumatForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, targetEntity.friendly, gameState);
25
26
  }
27
+ targetEntity.trinkets
28
+ .filter((t) => t.cardId === "BG30_MagicItem_822" ||
29
+ t.cardId === "BG30_MagicItem_822t2")
30
+ .forEach((t) => {
31
+ handleTwinSkyLanternsForPlayer(t, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
32
+ });
33
+ targetEntity.trinkets
34
+ .filter((t) => t.cardId === "BG30_MagicItem_440")
35
+ .forEach((t) => {
36
+ handleBoomControllerForPlayer(t, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
37
+ });
38
+ };
39
+ const handleBoomControllerForPlayer = (trinket, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState) => {
40
+ if (playerBoard.length < 7 && trinket.scriptDataNum1 > 0) {
41
+ const candidate = gameState.sharedState.deaths
42
+ .filter((d) => d.friendly === playerEntity.friendly)
43
+ .filter((d) => (0, utils_1.hasCorrectTribe)(d, playerEntity, reference_data_1.Race.MECH, gameState.allCards))[0];
44
+ if (!!candidate) {
45
+ const spawn = (0, utils_1.copyEntity)(candidate);
46
+ const target = (0, deathrattle_spawns_1.spawnEntities)(spawn.cardId, 1, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState.allCards, gameState.cardsData, gameState.sharedState, gameState.spectator, playerEntity.friendly, true, false, false, spawn);
47
+ (0, spawns_1.performEntitySpawns)(target, playerBoard, playerEntity, playerEntity, 0, opponentBoard, opponentEntity, gameState);
48
+ target.forEach((t) => gameState.spectator.registerPowerTarget(playerEntity, t, playerBoard, playerEntity, opponentEntity));
49
+ trinket.scriptDataNum1 = 0;
50
+ }
51
+ }
52
+ };
53
+ const handleTwinSkyLanternsForPlayer = (trinket, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState) => {
54
+ const spawnNumber = trinket.scriptDataNum1;
55
+ const canTrigger = trinket.cardId === "BG30_MagicItem_822t2"
56
+ ? spawnNumber >= 2
57
+ : spawnNumber >= 1;
58
+ if (playerBoard.length <= 7 - spawnNumber && trinket.rememberedMinion && canTrigger) {
59
+ const spawn = (0, utils_1.copyEntity)(trinket.rememberedMinion);
60
+ const target = (0, deathrattle_spawns_1.spawnEntities)(spawn.cardId, spawnNumber, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState.allCards, gameState.cardsData, gameState.sharedState, gameState.spectator, playerEntity.friendly, true, false, false, spawn);
61
+ (0, spawns_1.performEntitySpawns)(target, playerBoard, playerEntity, playerEntity, 0, opponentBoard, opponentEntity, gameState);
62
+ target.forEach((t) => gameState.spectator.registerPowerTarget(playerEntity, t, playerBoard, playerEntity, opponentEntity));
63
+ trinket.scriptDataNum1 = 0;
64
+ }
26
65
  };
27
66
  const handleOzumatForPlayer = (playerBoard, playerEntity, opponentBoard, opponentEntity, friendly, gameState) => {
28
67
  if (playerBoard.length < 7 && !playerEntity.heroPowerActivated) {
@@ -1 +1 @@
1
- {"version":3,"file":"summon-when-space.js","sourceRoot":"","sources":["../../src/simulation/summon-when-space.ts"],"names":[],"mappings":";;;AAGA,oCAAkD;AAClD,6DAAqD;AAErD,qCAA+C;AAExC,MAAM,sBAAsB,GAAG,CACrC,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACvB,EAAE;IACH,+BAA+B,CAAC,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IACnH,+BAA+B,CAC9B,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,SAAS,CACT,CAAC;AACH,CAAC,CAAC;AAhBW,QAAA,sBAAsB,0BAgBjC;AAEF,MAAM,+BAA+B,GAAG,CACvC,YAA6B,EAC7B,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACvB,EAAE;;IACH,IAAI,YAAY,CAAC,sBAAsB,EAAE;QACxC,+BAA+B,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;KACrG;IACD,IAAI,MAAA,YAAY,CAAC,YAAY,0CAAE,QAAQ,mBAA4C,EAAE;QACpF,iCAAiC,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;KACvG;IACD,IAAI,MAAA,YAAY,CAAC,OAAO,0CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAmC,CAAC,EAAE;QACnF,4BAA4B,CAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;KAClG;IACD,IAAI,YAAY,CAAC,WAAW,qBAA8B,EAAE;QAC3D,qBAAqB,CACpB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,YAAY,CAAC,QAAQ,EACrB,SAAS,CACT,CAAC;KACF;AACF,CAAC,CAAC;AAEF,MAAM,qBAAqB,GAAG,CAC7B,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,QAAiB,EACjB,SAAwB,EACjB,EAAE;IACT,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,kBAAkB,EAAE;QAC/D,MAAM,cAAc,GAAG,CAAC,YAAY,CAAC,aAAa,CAAC;QACnD,MAAM,UAAU,GAAG,IAAA,kCAAa,qBAE/B,CAAC,EACD,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,WAAW,EACrB,SAAS,CAAC,SAAS,EACnB,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,KAAK,CACL,CAAC;QACF,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC;QACtC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC;QACtC,MAAM,cAAc,GAAG,CAAC,CAAC;QACzB,IAAA,4BAAmB,EAClB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,SAAS,CACT,CAAC;QACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;QAChH,YAAY,CAAC,kBAAkB,GAAG,IAAI,CAAC;KACvC;AACF,CAAC,CAAC;AAEF,MAAM,4BAA4B,GAAG,CACpC,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACvB,EAAE;IACH,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,eAAmC,CAAC,CAAC;IAC7G,IAAI,YAAY,IAAI,YAAY,CAAC,cAAc,GAAG,CAAC,EAAE;QACpD,OAAO,YAAY,CAAC,cAAc,GAAG,CAAC,EAAE;YACvC,MAAM,WAAW,GAAG,YAAY,CAC/B,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,eAET,CAAC,CACD,CAAC;YACF,IAAI,WAAW,EAAE;gBAChB,YAAY,CAAC,cAAc,EAAE,CAAC;aAC9B;iBAAM;gBAEN,MAAM;aACN;SACD;KACD;AACF,CAAC,CAAC;AACF,MAAM,iCAAiC,GAAG,CACzC,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACvB,EAAE;IACH,MAAM,YAAY,GAAG,YAAY,CAAC,mBAAmB,CAAC,IAAI,CACzD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,sBAA+C,CACxE,CAAC;IACF,IAAI,YAAY,IAAI,YAAY,CAAC,cAAc,GAAG,CAAC,EAAE;QACpD,OAAO,YAAY,CAAC,cAAc,GAAG,CAAC,EAAE;YACvC,MAAM,WAAW,GAAG,YAAY,CAC/B,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,sBAET,CAAC,CACD,CAAC;YACF,IAAI,WAAW,EAAE;gBAChB,YAAY,CAAC,cAAc,EAAE,CAAC;aAC9B;iBAAM;gBAEN,MAAM;aACN;SACD;KACD;AACF,CAAC,CAAC;AAEF,MAAM,+BAA+B,GAAG,CACvC,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACvB,EAAE;IACH,MAAM,cAAc,GACnB,YAAY,CAAC,6BAA6B,KAAK,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,YAAY,CAAC,6BAA6B,CAAC;QAC9E,CAAC,CAAC,YAAY,CAAC,8BAA8B,CAAC;IAChD,MAAM,WAAW,GAAG,YAAY,CAC/B,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,EACT,YAAY,CAAC,sBAAsB,CAAC,MAAM,EAC1C,cAAc,EACd,YAAY,CAAC,sBAAsB,CACnC,CAAC;IACF,IAAI,WAAW,EAAE;QAChB,YAAY,CAAC,sBAAsB,GAAG,IAAI,CAAC;KAC3C;AACF,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CACpB,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACxB,MAAc,EACd,cAAsB,EACtB,SAAsB,IAAI,EAChB,EAAE;IACZ,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE;QAC5B,OAAO,KAAK,CAAC;KACb;IACD,MAAM,SAAS,GAAG,IAAA,8BAAsB,EACvC,MAAM,EACN,YAAY,EACZ,WAAW,EACX,SAAS,CAAC,QAAQ,EAClB,YAAY,CAAC,QAAQ,EACrB,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE,EACvC,KAAK,EACL,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,WAAW,EACrB,MAAM,EACN,IAAI,CACJ,CAAC;IAEF,MAAM,OAAO,GAAG,IAAA,4BAAmB,EAClC,CAAC,SAAS,CAAC,EACX,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,SAAS,EACT,KAAK,CACL,CAAC;IACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1F,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3B,CAAC,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { buildSingleBoardEntity } from '../utils';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { performEntitySpawns } from './spawns';\r\n\r\nexport const handleSummonsWhenSpace = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\thandleSummonsWhenSpaceForPlayer(playerEntity, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\thandleSummonsWhenSpaceForPlayer(\r\n\t\topponentEntity,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nconst handleSummonsWhenSpaceForPlayer = (\r\n\ttargetEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tif (targetEntity.rapidReanimationMinion) {\r\n\t\thandleRapidReanimationForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t}\r\n\tif (targetEntity.questRewards?.includes(CardIds.StableAmalgamation_BG28_Reward_518)) {\r\n\t\thandleStableAmalgamationForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t}\r\n\tif (targetEntity.secrets?.some((s) => s.cardId === CardIds.BoonOfBeetles_BG28_603)) {\r\n\t\thandleBoonOfBeetlesForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t}\r\n\tif (targetEntity.heroPowerId === CardIds.Ozumat_Tentacular) {\r\n\t\thandleOzumatForPlayer(\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\topponentBoard,\r\n\t\t\topponentEntity,\r\n\t\t\ttargetEntity.friendly,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nconst handleOzumatForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tfriendly: boolean,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (playerBoard.length < 7 && !playerEntity.heroPowerActivated) {\r\n\t\tconst tentacularSize = +playerEntity.heroPowerInfo;\r\n\t\tconst tentacular = spawnEntities(\r\n\t\t\tCardIds.Tentacular_OzumatsTentacleToken_BG23_HERO_201pt,\r\n\t\t\t1,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\topponentBoard,\r\n\t\t\topponentEntity,\r\n\t\t\tgameState.allCards,\r\n\t\t\tgameState.cardsData,\r\n\t\t\tgameState.sharedState,\r\n\t\t\tgameState.spectator,\r\n\t\t\tfriendly,\r\n\t\t\ttrue,\r\n\t\t\tfalse,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t\ttentacular[0].attack = tentacularSize;\r\n\t\ttentacular[0].health = tentacularSize;\r\n\t\tconst indexFromRight = 0;\r\n\t\tperformEntitySpawns(\r\n\t\t\ttentacular,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerEntity,\r\n\t\t\tindexFromRight,\r\n\t\t\topponentBoard,\r\n\t\t\topponentEntity,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tgameState.spectator.registerPowerTarget(playerEntity, tentacular[0], playerBoard, playerEntity, opponentEntity);\r\n\t\tplayerEntity.heroPowerActivated = true;\r\n\t}\r\n};\r\n\r\nconst handleBoonOfBeetlesForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst secretEntity = playerEntity.secrets.find((entity) => entity.cardId === CardIds.BoonOfBeetles_BG28_603);\r\n\tif (secretEntity && secretEntity.scriptDataNum1 > 0) {\r\n\t\twhile (secretEntity.scriptDataNum1 > 0) {\r\n\t\t\tconst hasSummoned = handleSummon(\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t\tCardIds.BoonOfBeetles_BeetleToken_BG28_603t,\r\n\t\t\t\t0,\r\n\t\t\t);\r\n\t\t\tif (hasSummoned) {\r\n\t\t\t\tsecretEntity.scriptDataNum1--;\r\n\t\t\t} else {\r\n\t\t\t\t// No room to summon, we stop here\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\nconst handleStableAmalgamationForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst rewardEntity = playerEntity.questRewardEntities.find(\r\n\t\t(entity) => entity.cardId === CardIds.StableAmalgamation_BG28_Reward_518,\r\n\t);\r\n\tif (rewardEntity && rewardEntity.scriptDataNum1 > 0) {\r\n\t\twhile (rewardEntity.scriptDataNum1 > 0) {\r\n\t\t\tconst hasSummoned = handleSummon(\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t\tCardIds.StableAmalgamation_TotallyNormalHorseToken_BG28_Reward_518t,\r\n\t\t\t\t0,\r\n\t\t\t);\r\n\t\t\tif (hasSummoned) {\r\n\t\t\t\trewardEntity.scriptDataNum1--;\r\n\t\t\t} else {\r\n\t\t\t\t// No room to summon, we stop here\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleRapidReanimationForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst indexFromRight =\r\n\t\tplayerEntity.rapidReanimationIndexFromLeft === 0\r\n\t\t\t? Math.max(0, playerBoard.length - playerEntity.rapidReanimationIndexFromLeft)\r\n\t\t\t: playerEntity.rapidReanimationIndexFromRight;\r\n\tconst hasSummoned = handleSummon(\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t\tplayerEntity.rapidReanimationMinion.cardId,\r\n\t\tindexFromRight,\r\n\t\tplayerEntity.rapidReanimationMinion,\r\n\t);\r\n\tif (hasSummoned) {\r\n\t\tplayerEntity.rapidReanimationMinion = null;\r\n\t}\r\n};\r\n\r\nconst handleSummon = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcardId: string,\r\n\tindexFromRight: number,\r\n\tminion: BoardEntity = null,\r\n): boolean => {\r\n\tif (playerBoard.length >= 7) {\r\n\t\treturn false;\r\n\t}\r\n\tconst newMinion = buildSingleBoardEntity(\r\n\t\tcardId,\r\n\t\tplayerEntity,\r\n\t\tplayerBoard,\r\n\t\tgameState.allCards,\r\n\t\tplayerEntity.friendly,\r\n\t\tgameState.sharedState.currentEntityId++,\r\n\t\tfalse,\r\n\t\tgameState.cardsData,\r\n\t\tgameState.sharedState,\r\n\t\tminion,\r\n\t\tnull,\r\n\t);\r\n\t// Don't reapply auras in this particular case? See https://x.com/ZerotoHeroes_HS/status/1737422727118487808?s=20\r\n\tconst spawned = performEntitySpawns(\r\n\t\t[newMinion],\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\tplayerEntity,\r\n\t\tindexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t\tfalse,\r\n\t);\r\n\tgameState.spectator.registerPowerTarget(playerEntity, newMinion, playerBoard, null, null);\r\n\treturn spawned.length > 0;\r\n};\r\n"]}
1
+ {"version":3,"file":"summon-when-space.js","sourceRoot":"","sources":["../../src/simulation/summon-when-space.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity, BoardTrinket } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { buildSingleBoardEntity, copyEntity, hasCorrectTribe } from '../utils';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { performEntitySpawns } from './spawns';\r\n\r\nexport const handleSummonsWhenSpace = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\thandleSummonsWhenSpaceForPlayer(playerEntity, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\thandleSummonsWhenSpaceForPlayer(\r\n\t\topponentEntity,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\n// TODO: Twin Sky Lanterns wait for 2 spaces\r\nconst handleSummonsWhenSpaceForPlayer = (\r\n\ttargetEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tif (targetEntity.rapidReanimationMinion) {\r\n\t\thandleRapidReanimationForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t}\r\n\tif (targetEntity.questRewards?.includes(CardIds.StableAmalgamation_BG28_Reward_518)) {\r\n\t\thandleStableAmalgamationForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t}\r\n\tif (targetEntity.secrets?.some((s) => s.cardId === CardIds.BoonOfBeetles_BG28_603)) {\r\n\t\thandleBoonOfBeetlesForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t}\r\n\tif (targetEntity.heroPowerId === CardIds.Ozumat_Tentacular) {\r\n\t\thandleOzumatForPlayer(\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\topponentBoard,\r\n\t\t\topponentEntity,\r\n\t\t\ttargetEntity.friendly,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n\ttargetEntity.trinkets\r\n\t\t.filter(\r\n\t\t\t(t) =>\r\n\t\t\t\tt.cardId === CardIds.TwinSkyLanterns_BG30_MagicItem_822 ||\r\n\t\t\t\tt.cardId === CardIds.TwinSkyLanterns_TwinSkyLanternsToken_BG30_MagicItem_822t2,\r\n\t\t)\r\n\t\t.forEach((t) => {\r\n\t\t\thandleTwinSkyLanternsForPlayer(t, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t\t});\r\n\ttargetEntity.trinkets\r\n\t\t.filter((t) => t.cardId === CardIds.BoomController_BG30_MagicItem_440)\r\n\t\t.forEach((t) => {\r\n\t\t\thandleBoomControllerForPlayer(t, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t\t});\r\n};\r\n\r\nconst handleBoomControllerForPlayer = (\r\n\ttrinket: BoardTrinket,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (playerBoard.length < 7 && trinket.scriptDataNum1 > 0) {\r\n\t\tconst candidate = gameState.sharedState.deaths\r\n\t\t\t.filter((d) => d.friendly === playerEntity.friendly)\r\n\t\t\t.filter((d) => hasCorrectTribe(d, playerEntity, Race.MECH, gameState.allCards))[0];\r\n\t\tif (!!candidate) {\r\n\t\t\tconst spawn = copyEntity(candidate);\r\n\t\t\tconst target = spawnEntities(\r\n\t\t\t\tspawn.cardId,\r\n\t\t\t\t1,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState.allCards,\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t\tgameState.sharedState,\r\n\t\t\t\tgameState.spectator,\r\n\t\t\t\tplayerEntity.friendly,\r\n\t\t\t\ttrue,\r\n\t\t\t\tfalse,\r\n\t\t\t\tfalse,\r\n\t\t\t\tspawn,\r\n\t\t\t);\r\n\t\t\tperformEntitySpawns(\r\n\t\t\t\ttarget,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\t0,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\ttarget.forEach((t) =>\r\n\t\t\t\tgameState.spectator.registerPowerTarget(playerEntity, t, playerBoard, playerEntity, opponentEntity),\r\n\t\t\t);\r\n\t\t\ttrinket.scriptDataNum1 = 0;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleTwinSkyLanternsForPlayer = (\r\n\ttrinket: BoardTrinket,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst spawnNumber = trinket.scriptDataNum1;\r\n\tconst canTrigger =\r\n\t\ttrinket.cardId === CardIds.TwinSkyLanterns_TwinSkyLanternsToken_BG30_MagicItem_822t2\r\n\t\t\t? spawnNumber >= 2\r\n\t\t\t: spawnNumber >= 1;\r\n\tif (playerBoard.length <= 7 - spawnNumber && trinket.rememberedMinion && canTrigger) {\r\n\t\tconst spawn = copyEntity(trinket.rememberedMinion);\r\n\t\tconst target = spawnEntities(\r\n\t\t\tspawn.cardId,\r\n\t\t\tspawnNumber,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\topponentBoard,\r\n\t\t\topponentEntity,\r\n\t\t\tgameState.allCards,\r\n\t\t\tgameState.cardsData,\r\n\t\t\tgameState.sharedState,\r\n\t\t\tgameState.spectator,\r\n\t\t\tplayerEntity.friendly,\r\n\t\t\ttrue,\r\n\t\t\tfalse,\r\n\t\t\tfalse,\r\n\t\t\tspawn,\r\n\t\t);\r\n\t\tperformEntitySpawns(\r\n\t\t\ttarget,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerEntity,\r\n\t\t\t0,\r\n\t\t\topponentBoard,\r\n\t\t\topponentEntity,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\ttarget.forEach((t) =>\r\n\t\t\tgameState.spectator.registerPowerTarget(playerEntity, t, playerBoard, playerEntity, opponentEntity),\r\n\t\t);\r\n\t\ttrinket.scriptDataNum1 = 0;\r\n\t}\r\n};\r\n\r\nconst handleOzumatForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tfriendly: boolean,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (playerBoard.length < 7 && !playerEntity.heroPowerActivated) {\r\n\t\tconst tentacularSize = +playerEntity.heroPowerInfo;\r\n\t\tconst tentacular = spawnEntities(\r\n\t\t\tCardIds.Tentacular_OzumatsTentacleToken_BG23_HERO_201pt,\r\n\t\t\t1,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\topponentBoard,\r\n\t\t\topponentEntity,\r\n\t\t\tgameState.allCards,\r\n\t\t\tgameState.cardsData,\r\n\t\t\tgameState.sharedState,\r\n\t\t\tgameState.spectator,\r\n\t\t\tfriendly,\r\n\t\t\ttrue,\r\n\t\t\tfalse,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t\ttentacular[0].attack = tentacularSize;\r\n\t\ttentacular[0].health = tentacularSize;\r\n\t\tconst indexFromRight = 0;\r\n\t\tperformEntitySpawns(\r\n\t\t\ttentacular,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerEntity,\r\n\t\t\tindexFromRight,\r\n\t\t\topponentBoard,\r\n\t\t\topponentEntity,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tgameState.spectator.registerPowerTarget(playerEntity, tentacular[0], playerBoard, playerEntity, opponentEntity);\r\n\t\tplayerEntity.heroPowerActivated = true;\r\n\t}\r\n};\r\n\r\nconst handleBoonOfBeetlesForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst secretEntity = playerEntity.secrets.find((entity) => entity.cardId === CardIds.BoonOfBeetles_BG28_603);\r\n\tif (secretEntity && secretEntity.scriptDataNum1 > 0) {\r\n\t\twhile (secretEntity.scriptDataNum1 > 0) {\r\n\t\t\tconst hasSummoned = handleSummon(\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t\tCardIds.BoonOfBeetles_BeetleToken_BG28_603t,\r\n\t\t\t\t0,\r\n\t\t\t);\r\n\t\t\tif (hasSummoned) {\r\n\t\t\t\tsecretEntity.scriptDataNum1--;\r\n\t\t\t} else {\r\n\t\t\t\t// No room to summon, we stop here\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\nconst handleStableAmalgamationForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst rewardEntity = playerEntity.questRewardEntities.find(\r\n\t\t(entity) => entity.cardId === CardIds.StableAmalgamation_BG28_Reward_518,\r\n\t);\r\n\tif (rewardEntity && rewardEntity.scriptDataNum1 > 0) {\r\n\t\twhile (rewardEntity.scriptDataNum1 > 0) {\r\n\t\t\tconst hasSummoned = handleSummon(\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t\tCardIds.StableAmalgamation_TotallyNormalHorseToken_BG28_Reward_518t,\r\n\t\t\t\t0,\r\n\t\t\t);\r\n\t\t\tif (hasSummoned) {\r\n\t\t\t\trewardEntity.scriptDataNum1--;\r\n\t\t\t} else {\r\n\t\t\t\t// No room to summon, we stop here\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleRapidReanimationForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst indexFromRight =\r\n\t\tplayerEntity.rapidReanimationIndexFromLeft === 0\r\n\t\t\t? Math.max(0, playerBoard.length - playerEntity.rapidReanimationIndexFromLeft)\r\n\t\t\t: playerEntity.rapidReanimationIndexFromRight;\r\n\tconst hasSummoned = handleSummon(\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t\tplayerEntity.rapidReanimationMinion.cardId,\r\n\t\tindexFromRight,\r\n\t\tplayerEntity.rapidReanimationMinion,\r\n\t);\r\n\tif (hasSummoned) {\r\n\t\tplayerEntity.rapidReanimationMinion = null;\r\n\t}\r\n};\r\n\r\nconst handleSummon = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcardId: string,\r\n\tindexFromRight: number,\r\n\tminion: BoardEntity = null,\r\n): boolean => {\r\n\tif (playerBoard.length >= 7) {\r\n\t\treturn false;\r\n\t}\r\n\tconst newMinion = buildSingleBoardEntity(\r\n\t\tcardId,\r\n\t\tplayerEntity,\r\n\t\tplayerBoard,\r\n\t\tgameState.allCards,\r\n\t\tplayerEntity.friendly,\r\n\t\tgameState.sharedState.currentEntityId++,\r\n\t\tfalse,\r\n\t\tgameState.cardsData,\r\n\t\tgameState.sharedState,\r\n\t\tminion,\r\n\t\tnull,\r\n\t);\r\n\t// Don't reapply auras in this particular case? See https://x.com/ZerotoHeroes_HS/status/1737422727118487808?s=20\r\n\tconst spawned = performEntitySpawns(\r\n\t\t[newMinion],\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\tplayerEntity,\r\n\t\tindexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t\tfalse,\r\n\t);\r\n\tgameState.spectator.registerPowerTarget(playerEntity, newMinion, playerBoard, null, null);\r\n\treturn spawned.length > 0;\r\n};\r\n"]}
@@ -2,5 +2,5 @@ import { AllCardsService } from '@firestone-hs/reference-data';
2
2
  import { BgsPlayerEntity } from '../../bgs-player-entity';
3
3
  import { BoardEntity } from '../../board-entity';
4
4
  import { FullGameState } from '../internal-game-state';
5
- export declare const makeMinionGolden: (target: BoardEntity, source: BoardEntity | BgsPlayerEntity, targetBoard: BoardEntity[], targetBoardHero: BgsPlayerEntity, gameState: FullGameState) => void;
5
+ export declare const makeMinionGolden: (target: BoardEntity, source: BoardEntity | BgsPlayerEntity, targetBoard: BoardEntity[], targetBoardHero: BgsPlayerEntity, otherHero: BgsPlayerEntity, gameState: FullGameState) => void;
6
6
  export declare const isMinionGolden: (entity: BoardEntity, allCards: AllCardsService) => boolean;
@@ -6,7 +6,7 @@ const utils_1 = require("../../utils");
6
6
  const add_minion_to_board_1 = require("../add-minion-to-board");
7
7
  const remove_minion_from_board_1 = require("../remove-minion-from-board");
8
8
  const stats_1 = require("../stats");
9
- const makeMinionGolden = (target, source, targetBoard, targetBoardHero, gameState) => {
9
+ const makeMinionGolden = (target, source, targetBoard, targetBoardHero, otherHero, gameState) => {
10
10
  var _a;
11
11
  if ((0, exports.isMinionGolden)(target, gameState.allCards)) {
12
12
  return;
@@ -22,7 +22,7 @@ const makeMinionGolden = (target, source, targetBoard, targetBoardHero, gameStat
22
22
  const refGoldenCard = gameState.allCards.getCard(target.cardId);
23
23
  target.cardId = goldenCard.id;
24
24
  (0, stats_1.modifyStats)(target, refCard.attack, refCard.health, targetBoard, targetBoardHero, gameState);
25
- (0, add_minion_to_board_1.handleAddedMinionAuraEffect)(targetBoard, targetBoardHero, target, gameState);
25
+ (0, add_minion_to_board_1.handleAddedMinionAuraEffect)(targetBoard, targetBoardHero, otherHero, target, gameState);
26
26
  const hasDivineShield = target.divineShield;
27
27
  const hasReborn = target.reborn;
28
28
  const avengeCurrent = target.avengeCurrent;
@@ -1 +1 @@
1
- {"version":3,"file":"golden.js","sourceRoot":"","sources":["../../../src/simulation/utils/golden.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllCardsService, CardIds, GameTag } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { addImpliedMechanics } from '../../utils';\r\nimport { handleAddedMinionAuraEffect } from '../add-minion-to-board';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleMinionRemovedAuraEffect } from '../remove-minion-from-board';\r\nimport { modifyStats } from '../stats';\r\n\r\nexport const makeMinionGolden = (\r\n\ttarget: BoardEntity,\r\n\tsource: BoardEntity | BgsPlayerEntity,\r\n\ttargetBoard: BoardEntity[],\r\n\ttargetBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// Typically, we are already golden\r\n\tif (isMinionGolden(target, gameState.allCards)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tgameState.spectator.registerPowerTarget(source, target, targetBoard, null, null);\r\n\r\n\t// console.log('before transforming minion', stringifySimple(targetBoard, allCards));\r\n\thandleMinionRemovedAuraEffect(targetBoard, target, targetBoardHero, gameState.allCards, gameState.spectator);\r\n\t// Specific for making a minion golden\r\n\t// This is not handled in handleMinionRemovedAuraEffect, though I'm not entirely sure why. Maybe because it's a self-effect only?\r\n\t// Also, because of how I implemented auras and such, it's probably good to have something specific for golden\r\n\tremoveMinionAuraEffectsForGolden(target, targetBoardHero);\r\n\t// console.log('after removed effect', stringifySimple(targetBoard, allCards));\r\n\tconst refCard = gameState.allCards.getCard(target.cardId);\r\n\tlet goldenCard = gameState.allCards.getCardFromDbfId(refCard.battlegroundsPremiumDbfId);\r\n\t// Happens when there is no dedicated golden card, like for the Bettle token from Boon of Beetles\r\n\tif (!goldenCard?.id) {\r\n\t\tgoldenCard = refCard;\r\n\t}\r\n\r\n\t// A minion becoming golden ignore the current death.\r\n\t// This way of handling it is not ideal, since it will still trigger if both avenges trigger at the same time, but\r\n\t// should solve the other cases\r\n\t// Update 2024-06-21: I'm not sure what this is about exactly. See\r\n\t// http://replays.firestoneapp.com/?reviewId=5d94ebeb-3691-4509-88de-5d5418b20597&turn=11&action=2\r\n\t// The Sr. Tomb Diver dies, thus gilding the Phaerix. Two other deaths later, the avenge procs\r\n\t// This means the death of the diver counted normally\r\n\t// target.avengeCurrent = Math.min(target.avengeDefault, target.avengeCurrent + 1);\r\n\r\n\t// Only change the card ID after modifying the stats, so that some effects (like Tarecgosa) won't trigger\r\n\t// too early\r\n\t// TODO: add a replay with Tarec to illustrate the difference with Defiant Shipwright, and\r\n\t// check if there is something different with Tarec\r\n\tconst refGoldenCard = gameState.allCards.getCard(target.cardId);\r\n\ttarget.cardId = goldenCard.id;\r\n\r\n\t// The rule for golden minions is to add the base stats\r\n\t// TO CHECK: not sure that this is what actually happens (i.e. do minions that trigger on stats modifications\r\n\t// trigger?)\r\n\t// UPDATE 2024-06-20: Defiant Shipwright (2/5) going golden (4/10) actually ends up at 4/12 because\r\n\t// of the +2 health bonus\r\n\t// http://replays.firestoneapp.com/?reviewId=283dc44c-5fc8-40fb-af89-7d752a39f9b9&turn=7&action=1\r\n\tmodifyStats(target, refCard.attack, refCard.health, targetBoard, targetBoardHero, gameState);\r\n\r\n\t// console.log('before adding new effect', stringifySimple(targetBoard, allCards));\r\n\thandleAddedMinionAuraEffect(targetBoard, targetBoardHero, target, gameState);\r\n\tconst hasDivineShield = target.divineShield;\r\n\tconst hasReborn = target.reborn;\r\n\tconst avengeCurrent = target.avengeCurrent;\r\n\taddImpliedMechanics(target, gameState.cardsData);\r\n\r\n\t// addImpliedMechanics grants divine shield if the card has divine shield, or if the entity had\r\n\t// it at some point. That means that when we gild Zilliax: Defense Module (with Divine Shield) into\r\n\t// Zilliaw: Assembled, we restore the divine shield, while we shouldn't\r\n\ttarget.divineShield = hasDivineShield;\r\n\t// Update 2024-06-19: Hat tested on one of their build, and gilding a zilliax module should NOT\r\n\t// remove its divine shield / reborn status\r\n\t// Gilding a reborn Risen Rider results into a golden Risen Rider with reborn\r\n\t// http://replays.firestoneapp.com/?reviewId=c553c3e7-01e2-494d-80f8-69f33c08fb39&turn=7&action=4\r\n\ttarget.reborn = hasReborn || refGoldenCard.mechanics?.includes(GameTag[GameTag.REBORN]);\r\n\t// target.windfury = refGoldenCard.mechanics?.includes(GameTag[GameTag.WINDFURY]);\r\n\t// target.taunt = refGoldenCard.mechanics?.includes(GameTag[GameTag.TAUNT]);\r\n\t// target.stealth = refGoldenCard.mechanics?.includes(GameTag[GameTag.STEALTH]);\r\n\ttarget.avengeCurrent = avengeCurrent;\r\n\r\n\t// console.log('after adding new effect', stringifySimple(targetBoard, allCards));\r\n};\r\n\r\nexport const isMinionGolden = (entity: BoardEntity, allCards: AllCardsService): boolean => {\r\n\tconst ref = allCards.getCard(entity.cardId);\r\n\t// Some cards (like the Bettle token from Boon of Beetles) don't have a premium dbf id. However, we can still\r\n\t// gild it\r\n\treturn ref.premium || !!ref.battlegroundsNormalDbfId;\r\n};\r\n\r\nconst removeMinionAuraEffectsForGolden = (entity: BoardEntity, hero: BgsPlayerEntity) => {\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.EternalKnight_BG25_008:\r\n\t\tcase CardIds.EternalKnight_BG25_008_G:\r\n\t\t\tconst eternalKnightBuffToRemove = hero.globalInfo.EternalKnightsDeadThisGame ?? 0;\r\n\t\t\tconst eternalKnighMultiplier = entity.cardId === CardIds.EternalKnight_BG25_008_G ? 2 : 1;\r\n\t\t\tentity.health = Math.max(1, entity.health - eternalKnighMultiplier * eternalKnightBuffToRemove);\r\n\t\t\tentity.attack = Math.max(0, entity.attack - eternalKnighMultiplier * eternalKnightBuffToRemove);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n"]}
1
+ {"version":3,"file":"golden.js","sourceRoot":"","sources":["../../../src/simulation/utils/golden.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllCardsService, CardIds, GameTag } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { addImpliedMechanics } from '../../utils';\r\nimport { handleAddedMinionAuraEffect } from '../add-minion-to-board';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleMinionRemovedAuraEffect } from '../remove-minion-from-board';\r\nimport { modifyStats } from '../stats';\r\n\r\nexport const makeMinionGolden = (\r\n\ttarget: BoardEntity,\r\n\tsource: BoardEntity | BgsPlayerEntity,\r\n\ttargetBoard: BoardEntity[],\r\n\ttargetBoardHero: BgsPlayerEntity,\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// Typically, we are already golden\r\n\tif (isMinionGolden(target, gameState.allCards)) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tgameState.spectator.registerPowerTarget(source, target, targetBoard, null, null);\r\n\r\n\t// console.log('before transforming minion', stringifySimple(targetBoard, allCards));\r\n\thandleMinionRemovedAuraEffect(targetBoard, target, targetBoardHero, gameState.allCards, gameState.spectator);\r\n\t// Specific for making a minion golden\r\n\t// This is not handled in handleMinionRemovedAuraEffect, though I'm not entirely sure why. Maybe because it's a self-effect only?\r\n\t// Also, because of how I implemented auras and such, it's probably good to have something specific for golden\r\n\tremoveMinionAuraEffectsForGolden(target, targetBoardHero);\r\n\t// console.log('after removed effect', stringifySimple(targetBoard, allCards));\r\n\tconst refCard = gameState.allCards.getCard(target.cardId);\r\n\tlet goldenCard = gameState.allCards.getCardFromDbfId(refCard.battlegroundsPremiumDbfId);\r\n\t// Happens when there is no dedicated golden card, like for the Bettle token from Boon of Beetles\r\n\tif (!goldenCard?.id) {\r\n\t\tgoldenCard = refCard;\r\n\t}\r\n\r\n\t// A minion becoming golden ignore the current death.\r\n\t// This way of handling it is not ideal, since it will still trigger if both avenges trigger at the same time, but\r\n\t// should solve the other cases\r\n\t// Update 2024-06-21: I'm not sure what this is about exactly. See\r\n\t// http://replays.firestoneapp.com/?reviewId=5d94ebeb-3691-4509-88de-5d5418b20597&turn=11&action=2\r\n\t// The Sr. Tomb Diver dies, thus gilding the Phaerix. Two other deaths later, the avenge procs\r\n\t// This means the death of the diver counted normally\r\n\t// target.avengeCurrent = Math.min(target.avengeDefault, target.avengeCurrent + 1);\r\n\r\n\t// Only change the card ID after modifying the stats, so that some effects (like Tarecgosa) won't trigger\r\n\t// too early\r\n\t// TODO: add a replay with Tarec to illustrate the difference with Defiant Shipwright, and\r\n\t// check if there is something different with Tarec\r\n\tconst refGoldenCard = gameState.allCards.getCard(target.cardId);\r\n\ttarget.cardId = goldenCard.id;\r\n\r\n\t// The rule for golden minions is to add the base stats\r\n\t// TO CHECK: not sure that this is what actually happens (i.e. do minions that trigger on stats modifications\r\n\t// trigger?)\r\n\t// UPDATE 2024-06-20: Defiant Shipwright (2/5) going golden (4/10) actually ends up at 4/12 because\r\n\t// of the +2 health bonus\r\n\t// http://replays.firestoneapp.com/?reviewId=283dc44c-5fc8-40fb-af89-7d752a39f9b9&turn=7&action=1\r\n\tmodifyStats(target, refCard.attack, refCard.health, targetBoard, targetBoardHero, gameState);\r\n\r\n\t// console.log('before adding new effect', stringifySimple(targetBoard, allCards));\r\n\thandleAddedMinionAuraEffect(targetBoard, targetBoardHero, otherHero, target, gameState);\r\n\tconst hasDivineShield = target.divineShield;\r\n\tconst hasReborn = target.reborn;\r\n\tconst avengeCurrent = target.avengeCurrent;\r\n\taddImpliedMechanics(target, gameState.cardsData);\r\n\r\n\t// addImpliedMechanics grants divine shield if the card has divine shield, or if the entity had\r\n\t// it at some point. That means that when we gild Zilliax: Defense Module (with Divine Shield) into\r\n\t// Zilliaw: Assembled, we restore the divine shield, while we shouldn't\r\n\ttarget.divineShield = hasDivineShield;\r\n\t// Update 2024-06-19: Hat tested on one of their build, and gilding a zilliax module should NOT\r\n\t// remove its divine shield / reborn status\r\n\t// Gilding a reborn Risen Rider results into a golden Risen Rider with reborn\r\n\t// http://replays.firestoneapp.com/?reviewId=c553c3e7-01e2-494d-80f8-69f33c08fb39&turn=7&action=4\r\n\ttarget.reborn = hasReborn || refGoldenCard.mechanics?.includes(GameTag[GameTag.REBORN]);\r\n\t// target.windfury = refGoldenCard.mechanics?.includes(GameTag[GameTag.WINDFURY]);\r\n\t// target.taunt = refGoldenCard.mechanics?.includes(GameTag[GameTag.TAUNT]);\r\n\t// target.stealth = refGoldenCard.mechanics?.includes(GameTag[GameTag.STEALTH]);\r\n\ttarget.avengeCurrent = avengeCurrent;\r\n\r\n\t// console.log('after adding new effect', stringifySimple(targetBoard, allCards));\r\n};\r\n\r\nexport const isMinionGolden = (entity: BoardEntity, allCards: AllCardsService): boolean => {\r\n\tconst ref = allCards.getCard(entity.cardId);\r\n\t// Some cards (like the Bettle token from Boon of Beetles) don't have a premium dbf id. However, we can still\r\n\t// gild it\r\n\treturn ref.premium || !!ref.battlegroundsNormalDbfId;\r\n};\r\n\r\nconst removeMinionAuraEffectsForGolden = (entity: BoardEntity, hero: BgsPlayerEntity) => {\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.EternalKnight_BG25_008:\r\n\t\tcase CardIds.EternalKnight_BG25_008_G:\r\n\t\t\tconst eternalKnightBuffToRemove = hero.globalInfo.EternalKnightsDeadThisGame ?? 0;\r\n\t\t\tconst eternalKnighMultiplier = entity.cardId === CardIds.EternalKnight_BG25_008_G ? 2 : 1;\r\n\t\t\tentity.health = Math.max(1, entity.health - eternalKnighMultiplier * eternalKnightBuffToRemove);\r\n\t\t\tentity.attack = Math.max(0, entity.attack - eternalKnighMultiplier * eternalKnightBuffToRemove);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n"]}
package/dist/utils.d.ts CHANGED
@@ -5,23 +5,21 @@ import { BoardSecret } from './board-secret';
5
5
  import { CardsData } from './cards/cards-data';
6
6
  import { FullGameState, GameState, PlayerState } from './simulation/internal-game-state';
7
7
  import { SharedState } from './simulation/shared-state';
8
- import { Spectator } from './simulation/spectator/spectator';
9
8
  export declare const buildSingleBoardEntity: (cardId: string, controllerHero: BgsPlayerEntity, friendlyBoard: BoardEntity[], allCards: AllCardsService, friendly: boolean, entityId: number, spawnReborn: boolean, cardsData: CardsData, sharedState: SharedState, entityToSpawn: BoardEntity, originalEntity?: BoardEntity) => BoardEntity;
10
9
  export declare const buildRandomUndeadCreation: (controllerHero: BgsPlayerEntity, friendlyBoard: BoardEntity[], allCards: AllCardsService, friendly: boolean, cardsData: CardsData, sharedState: SharedState) => BoardEntity;
11
10
  export declare const grantRandomAttack: (source: BoardEntity, board: BoardEntity[], hero: BgsPlayerEntity, additionalAttack: number, gameState: FullGameState, excludeSource?: boolean) => void;
12
11
  export declare const grantRandomHealth: (source: BoardEntity, board: BoardEntity[], hero: BgsPlayerEntity, health: number, gameState: FullGameState, excludeSource?: boolean) => void;
13
12
  export declare const grantRandomStats: (source: BoardEntity, board: BoardEntity[], hero: BgsPlayerEntity, attack: number, health: number, race: Race, excludeSource: boolean, gameState: FullGameState) => BoardEntity;
14
- export declare const grantRandomDivineShield: (source: BoardEntity, board: BoardEntity[], allCards: AllCardsService, spectator: Spectator) => void;
15
- export declare const updateDivineShield: (entity: BoardEntity, board: BoardEntity[], newValue: boolean, allCards: AllCardsService) => void;
16
- export declare const grantAllDivineShield: (board: BoardEntity[], tribe: string, cards: AllCardsService) => void;
17
- export declare const getRandomAliveMinion: (board: BoardEntity[], race: Race, allCards: AllCardsService) => BoardEntity;
18
- export declare const getRandomRevivableMinion: (board: BoardEntity[], race: Race, allCards: AllCardsService) => BoardEntity;
13
+ export declare const updateVenomous: (entity: BoardEntity, newValue: boolean, board: BoardEntity[], boardHero: BgsPlayerEntity, gameState: FullGameState) => void;
14
+ export declare const getRandomAliveMinion: (board: BoardEntity[], hero: BgsPlayerEntity, race: Race, allCards: AllCardsService) => BoardEntity;
15
+ export declare const getRandomRevivableMinion: (board: BoardEntity[], hero: BgsPlayerEntity, race: Race, allCards: AllCardsService) => BoardEntity;
19
16
  export declare const getRandomMinionWithHighestHealth: (board: BoardEntity[]) => BoardEntity;
20
17
  export declare const addStatsToBoard: (sourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret, board: BoardEntity[], hero: BgsPlayerEntity, attack: number, health: number, gameState: FullGameState, tribe?: string) => void;
21
18
  export declare const grantStatsToMinionsOfEachType: (source: BoardEntity, board: BoardEntity[], hero: BgsPlayerEntity, attack: number, health: number, gameState: FullGameState, numberOfDifferentTypes?: number, canRevive?: boolean) => void;
22
- export declare const getMinionsOfDifferentTypes: (board: BoardEntity[], gameState: FullGameState, canRevive?: boolean, numberOfDifferentTypes?: number) => BoardEntity[];
19
+ export declare const getMinionsOfDifferentTypes: (board: BoardEntity[], hero: BgsPlayerEntity, gameState: FullGameState, canRevive?: boolean, numberOfDifferentTypes?: number) => BoardEntity[];
23
20
  export declare const hasMechanic: (card: ReferenceCard, mechanic: string) => boolean;
24
- export declare const hasCorrectTribe: (entity: BoardEntity, targetTribe: Race, allCards: AllCardsService) => boolean;
21
+ export declare const hasCorrectTribe: (entity: BoardEntity, playerEntity: BgsPlayerEntity, targetTribe: Race, allCards: AllCardsService) => boolean;
22
+ export declare const getEffectiveTribesForEntity: (entity: BoardEntity, playerEntity: BgsPlayerEntity, allCards: AllCardsService) => readonly Race[];
25
23
  export declare const isCorrectTribe: (cardRaces: readonly string[], targetTribe: Race) => boolean;
26
24
  export declare const getRaceEnum: (race: string) => Race;
27
25
  export declare const addImpliedMechanics: (entity: BoardEntity, cardsData: CardsData) => BoardEntity;
@@ -33,3 +31,4 @@ export declare const isPilotedWhirlOTron: (entity: BoardEntity) => boolean;
33
31
  export declare const isGolden: (cardId: string, allCards: AllCardsService) => boolean;
34
32
  export declare const getPlayerState: (gameState: GameState, hero: BgsPlayerEntity) => PlayerState;
35
33
  export declare const getTeammateInitialState: (gameState: GameState, hero: BgsPlayerEntity) => PlayerState;
34
+ export declare const copyEntity: (entity: BoardEntity) => BoardEntity;
package/dist/utils.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTeammateInitialState = exports.getPlayerState = exports.isGolden = exports.isPilotedWhirlOTron = exports.isFish = exports.stringifySimpleCard = exports.stringifySimple = exports.normalizeCardIdForSkin = exports.addImpliedMechanics = exports.getRaceEnum = exports.isCorrectTribe = exports.hasCorrectTribe = exports.hasMechanic = exports.getMinionsOfDifferentTypes = exports.grantStatsToMinionsOfEachType = exports.addStatsToBoard = exports.getRandomMinionWithHighestHealth = exports.getRandomRevivableMinion = exports.getRandomAliveMinion = exports.grantAllDivineShield = exports.updateDivineShield = exports.grantRandomDivineShield = exports.grantRandomStats = exports.grantRandomHealth = exports.grantRandomAttack = exports.buildRandomUndeadCreation = exports.buildSingleBoardEntity = void 0;
3
+ exports.copyEntity = exports.getTeammateInitialState = exports.getPlayerState = exports.isGolden = exports.isPilotedWhirlOTron = exports.isFish = exports.stringifySimpleCard = exports.stringifySimple = exports.normalizeCardIdForSkin = exports.addImpliedMechanics = exports.getRaceEnum = exports.isCorrectTribe = exports.getEffectiveTribesForEntity = exports.hasCorrectTribe = exports.hasMechanic = exports.getMinionsOfDifferentTypes = exports.grantStatsToMinionsOfEachType = exports.addStatsToBoard = exports.getRandomMinionWithHighestHealth = exports.getRandomRevivableMinion = exports.getRandomAliveMinion = exports.updateVenomous = exports.grantRandomStats = exports.grantRandomHealth = exports.grantRandomAttack = exports.buildRandomUndeadCreation = exports.buildSingleBoardEntity = void 0;
4
4
  const reference_data_1 = require("@firestone-hs/reference-data");
5
5
  const utils_1 = require("./services/utils");
6
6
  const stats_1 = require("./simulation/stats");
@@ -108,18 +108,19 @@ const getScriptDataNum1 = (cardId, originalEntity) => {
108
108
  };
109
109
  const buildRandomUndeadCreation = (controllerHero, friendlyBoard, allCards, friendly, cardsData, sharedState) => {
110
110
  const baseCard = (0, utils_1.pickRandom)(cardsData.putricidePool1);
111
+ const newEntity = (0, exports.buildSingleBoardEntity)(baseCard, controllerHero, friendlyBoard, allCards, friendly, sharedState.currentEntityId++, false, cardsData, sharedState, null);
111
112
  const stitchedCardId = baseCard === "BG25_009"
112
113
  ? (0, utils_1.pickRandom)(cardsData.putridicePool2ForEternalSummoner)
113
114
  : (0, utils_1.pickRandom)(cardsData.putricidePool2);
114
- const newEntity = (0, exports.buildSingleBoardEntity)(baseCard, controllerHero, friendlyBoard, allCards, friendly, sharedState.currentEntityId++, false, cardsData, sharedState, null);
115
115
  const stitchedCard = allCards.getCard(stitchedCardId);
116
116
  newEntity.attack += stitchedCard.attack;
117
117
  newEntity.health += stitchedCard.health;
118
118
  newEntity.taunt = newEntity.taunt || (0, exports.hasMechanic)(stitchedCard, reference_data_1.GameTag[reference_data_1.GameTag.TAUNT]);
119
119
  newEntity.divineShield = newEntity.divineShield || (0, exports.hasMechanic)(stitchedCard, reference_data_1.GameTag[reference_data_1.GameTag.DIVINE_SHIELD]);
120
- newEntity.poisonous = newEntity.venomous || (0, exports.hasMechanic)(stitchedCard, reference_data_1.GameTag[reference_data_1.GameTag.POISONOUS]);
121
- newEntity.venomous = newEntity.poisonous || (0, exports.hasMechanic)(stitchedCard, reference_data_1.GameTag[reference_data_1.GameTag.VENOMOUS]);
120
+ newEntity.poisonous = newEntity.poisonous || (0, exports.hasMechanic)(stitchedCard, reference_data_1.GameTag[reference_data_1.GameTag.POISONOUS]);
121
+ newEntity.venomous = newEntity.venomous || (0, exports.hasMechanic)(stitchedCard, reference_data_1.GameTag[reference_data_1.GameTag.VENOMOUS]);
122
122
  newEntity.windfury = newEntity.windfury || (0, exports.hasMechanic)(stitchedCard, reference_data_1.GameTag[reference_data_1.GameTag.WINDFURY]);
123
+ newEntity.reborn = newEntity.reborn || (0, exports.hasMechanic)(stitchedCard, reference_data_1.GameTag[reference_data_1.GameTag.REBORN]);
123
124
  newEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);
124
125
  newEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);
125
126
  return newEntity;
@@ -149,7 +150,7 @@ const grantRandomHealth = (source, board, hero, health, gameState, excludeSource
149
150
  exports.grantRandomHealth = grantRandomHealth;
150
151
  const grantRandomStats = (source, board, hero, attack, health, race, excludeSource, gameState) => {
151
152
  if (board.length > 0) {
152
- const target = (0, exports.getRandomAliveMinion)(board.filter((e) => !!e.cardId).filter((e) => (excludeSource ? e.entityId !== source.entityId : true)), race, gameState.allCards);
153
+ const target = (0, exports.getRandomAliveMinion)(board.filter((e) => !!e.cardId).filter((e) => (excludeSource ? e.entityId !== source.entityId : true)), hero, race, gameState.allCards);
153
154
  if (target) {
154
155
  (0, stats_1.modifyStats)(target, attack, health, board, hero, gameState);
155
156
  if (gameState.spectator) {
@@ -161,46 +162,23 @@ const grantRandomStats = (source, board, hero, attack, health, race, excludeSour
161
162
  return null;
162
163
  };
163
164
  exports.grantRandomStats = grantRandomStats;
164
- const grantRandomDivineShield = (source, board, allCards, spectator) => {
165
- const elligibleEntities = board
166
- .filter((entity) => !entity.divineShield)
167
- .filter((entity) => entity.health > 0 && !entity.definitelyDead);
168
- if (elligibleEntities.length > 0) {
169
- const chosen = (0, utils_1.pickRandom)(elligibleEntities);
170
- (0, exports.updateDivineShield)(chosen, board, true, allCards);
171
- spectator.registerPowerTarget(source, chosen, board, null, null);
172
- }
173
- };
174
- exports.grantRandomDivineShield = grantRandomDivineShield;
175
- const updateDivineShield = (entity, board, newValue, allCards) => {
176
- entity.hadDivineShield = newValue || entity.divineShield || entity.hadDivineShield;
177
- entity.divineShield = newValue;
178
- if (entity.divineShield) {
179
- const boardForDrake = board;
180
- const statsBonus = 8 * boardForDrake.filter((e) => e.cardId === "BG25_043").length +
181
- 16 * boardForDrake.filter((e) => e.cardId === "BG25_043_G").length;
182
- entity.attack += statsBonus;
183
- }
184
- else {
185
- const boardForDrake = board;
186
- const statsBonus = 8 * boardForDrake.filter((e) => e.cardId === "BG25_043").length +
187
- 16 * boardForDrake.filter((e) => e.cardId === "BG25_043_G").length;
188
- entity.attack -= statsBonus;
189
- }
190
- };
191
- exports.updateDivineShield = updateDivineShield;
192
- const grantAllDivineShield = (board, tribe, cards) => {
193
- const elligibleEntities = board
194
- .filter((entity) => !entity.divineShield)
195
- .filter((entity) => (0, exports.isCorrectTribe)(cards.getCard(entity.cardId).races, (0, exports.getRaceEnum)(tribe)));
196
- for (const entity of elligibleEntities) {
197
- (0, exports.updateDivineShield)(entity, board, true, cards);
165
+ const updateVenomous = (entity, newValue, board, boardHero, gameState) => {
166
+ const lostVenomous = entity.venomous && !newValue;
167
+ entity.venomous = newValue;
168
+ if (lostVenomous) {
169
+ const belcherPortraits = boardHero.trinkets.filter((t) => t.cardId === "BG30_MagicItem_432" ||
170
+ t.cardId === "BG30_MagicItem_432t");
171
+ belcherPortraits.forEach((p) => {
172
+ const buff = p.cardId === "BG30_MagicItem_432t" ? 15 : 5;
173
+ (0, stats_1.modifyStats)(entity, buff, buff, board, boardHero, gameState);
174
+ gameState.spectator.registerPowerTarget(p, entity, board, null, null);
175
+ });
198
176
  }
199
177
  };
200
- exports.grantAllDivineShield = grantAllDivineShield;
201
- const getRandomAliveMinion = (board, race, allCards) => {
178
+ exports.updateVenomous = updateVenomous;
179
+ const getRandomAliveMinion = (board, hero, race, allCards) => {
202
180
  const validTribes = board
203
- .filter((e) => !race || (0, exports.isCorrectTribe)(allCards.getCard(e === null || e === void 0 ? void 0 : e.cardId).races, race))
181
+ .filter((e) => !race || (0, exports.hasCorrectTribe)(e, hero, race, allCards))
204
182
  .filter((e) => !!(e === null || e === void 0 ? void 0 : e.health) && !e.definitelyDead);
205
183
  if (!validTribes.length) {
206
184
  return null;
@@ -209,9 +187,9 @@ const getRandomAliveMinion = (board, race, allCards) => {
209
187
  return validTribes[randomIndex];
210
188
  };
211
189
  exports.getRandomAliveMinion = getRandomAliveMinion;
212
- const getRandomRevivableMinion = (board, race, allCards) => {
190
+ const getRandomRevivableMinion = (board, hero, race, allCards) => {
213
191
  const validTribes = board
214
- .filter((e) => !race || (0, exports.isCorrectTribe)(allCards.getCard(e === null || e === void 0 ? void 0 : e.cardId).races, race))
192
+ .filter((e) => !race || (0, exports.hasCorrectTribe)(e, hero, race, allCards))
215
193
  .filter((e) => !e.definitelyDead);
216
194
  if (!validTribes.length) {
217
195
  return null;
@@ -232,7 +210,7 @@ exports.getRandomMinionWithHighestHealth = getRandomMinionWithHighestHealth;
232
210
  const addStatsToBoard = (sourceEntity, board, hero, attack, health, gameState, tribe) => {
233
211
  var _a;
234
212
  for (const entity of board) {
235
- if (!tribe || (0, exports.hasCorrectTribe)(entity, reference_data_1.Race[tribe], gameState.allCards)) {
213
+ if (!tribe || (0, exports.hasCorrectTribe)(entity, hero, reference_data_1.Race[tribe], gameState.allCards)) {
236
214
  (0, stats_1.modifyStats)(entity, attack, health, board, hero, gameState);
237
215
  (_a = gameState.spectator) === null || _a === void 0 ? void 0 : _a.registerPowerTarget(sourceEntity, entity, board, null, null);
238
216
  }
@@ -240,14 +218,14 @@ const addStatsToBoard = (sourceEntity, board, hero, attack, health, gameState, t
240
218
  };
241
219
  exports.addStatsToBoard = addStatsToBoard;
242
220
  const grantStatsToMinionsOfEachType = (source, board, hero, attack, health, gameState, numberOfDifferentTypes = 99, canRevive = true) => {
243
- const minionsToBuff = (0, exports.getMinionsOfDifferentTypes)(board, gameState, canRevive, numberOfDifferentTypes);
221
+ const minionsToBuff = (0, exports.getMinionsOfDifferentTypes)(board, hero, gameState, canRevive, numberOfDifferentTypes);
244
222
  for (const entity of minionsToBuff) {
245
223
  (0, stats_1.modifyStats)(entity, attack, health, board, hero, gameState);
246
224
  gameState.spectator.registerPowerTarget(source, entity, board, null, null);
247
225
  }
248
226
  };
249
227
  exports.grantStatsToMinionsOfEachType = grantStatsToMinionsOfEachType;
250
- const getMinionsOfDifferentTypes = (board, gameState, canRevive = true, numberOfDifferentTypes = 99) => {
228
+ const getMinionsOfDifferentTypes = (board, hero, gameState, canRevive = true, numberOfDifferentTypes = 99) => {
251
229
  const result = [];
252
230
  if (board.length > 0) {
253
231
  let boardCopy = board.filter((e) => { var _a; return !((_a = gameState.allCards.getCard(e.cardId).races) === null || _a === void 0 ? void 0 : _a.includes(reference_data_1.Race[reference_data_1.Race.ALL])); });
@@ -257,14 +235,14 @@ const getMinionsOfDifferentTypes = (board, gameState, canRevive = true, numberOf
257
235
  for (let i = 1; i <= 2; i++) {
258
236
  for (const tribe of allRaces) {
259
237
  const minionsWithRaces = boardCopy
260
- .filter((e) => { var _a; return ((_a = gameState.allCards.getCard(e.cardId).races) === null || _a === void 0 ? void 0 : _a.length) === i; })
261
- .filter((e) => gameState.allCards.getCard(e.cardId).races.some((r) => !racesProcessed.includes(reference_data_1.Race[r])));
238
+ .filter((e) => (0, exports.getEffectiveTribesForEntity)(e, hero, gameState.allCards).length === i)
239
+ .filter((e) => (0, exports.getEffectiveTribesForEntity)(e, hero, gameState.allCards).some((r) => !racesProcessed.includes(reference_data_1.Race[r])));
262
240
  if (typesBuffed >= numberOfDifferentTypes) {
263
241
  return result;
264
242
  }
265
243
  const validMinion = canRevive
266
- ? (0, exports.getRandomRevivableMinion)(minionsWithRaces, tribe, gameState.allCards)
267
- : (0, exports.getRandomAliveMinion)(minionsWithRaces, tribe, gameState.allCards);
244
+ ? (0, exports.getRandomRevivableMinion)(minionsWithRaces, hero, tribe, gameState.allCards)
245
+ : (0, exports.getRandomAliveMinion)(minionsWithRaces, hero, tribe, gameState.allCards);
268
246
  if (validMinion) {
269
247
  result.push(validMinion);
270
248
  boardCopy = boardCopy.filter((e) => e !== validMinion);
@@ -283,10 +261,40 @@ const hasMechanic = (card, mechanic) => {
283
261
  return (_a = card.mechanics) === null || _a === void 0 ? void 0 : _a.includes(mechanic);
284
262
  };
285
263
  exports.hasMechanic = hasMechanic;
286
- const hasCorrectTribe = (entity, targetTribe, allCards) => {
287
- return (0, exports.isCorrectTribe)(allCards.getCard(entity.cardId).races, targetTribe);
264
+ const hasCorrectTribe = (entity, playerEntity, targetTribe, allCards) => {
265
+ const effectiveTribesForEntity = (0, exports.getEffectiveTribesForEntity)(entity, playerEntity, allCards);
266
+ return (effectiveTribesForEntity.length > 0 &&
267
+ (effectiveTribesForEntity.includes(targetTribe) || targetTribe === reference_data_1.Race.ALL));
288
268
  };
289
269
  exports.hasCorrectTribe = hasCorrectTribe;
270
+ const getEffectiveTribesForEntity = (entity, playerEntity, allCards) => {
271
+ var _a, _b;
272
+ return [
273
+ ...((_b = (_a = allCards.getCard(entity.cardId).races) === null || _a === void 0 ? void 0 : _a.map((r) => reference_data_1.Race[r])) !== null && _b !== void 0 ? _b : []),
274
+ ...getSpecialTribesForEntity(entity, playerEntity, allCards),
275
+ ];
276
+ };
277
+ exports.getEffectiveTribesForEntity = getEffectiveTribesForEntity;
278
+ const getSpecialTribesForEntity = (entity, playerEntity, allCards) => {
279
+ switch (entity.cardId) {
280
+ case "BG21_013":
281
+ case "BG21_013_G":
282
+ return playerEntity.trinkets.some((t) => t.cardId === "BG30_MagicItem_825")
283
+ ? [reference_data_1.Race.DRAGON]
284
+ : [];
285
+ case "BGS_009":
286
+ case "TB_BaconUps_082":
287
+ return playerEntity.trinkets.some((t) => t.cardId === "BG30_MagicItem_971")
288
+ ? [reference_data_1.Race.ALL]
289
+ : [];
290
+ case "BG_LOE_077":
291
+ case "TB_BaconUps_045":
292
+ return playerEntity.trinkets.some((t) => t.cardId === "BG30_MagicItem_418")
293
+ ? [reference_data_1.Race.DRAGON, reference_data_1.Race.MURLOC]
294
+ : [];
295
+ }
296
+ return [];
297
+ };
290
298
  const isCorrectTribe = (cardRaces, targetTribe) => {
291
299
  if (!(cardRaces === null || cardRaces === void 0 ? void 0 : cardRaces.length)) {
292
300
  return false;
@@ -332,6 +340,7 @@ const addImpliedMechanics = (entity, cardsData) => {
332
340
  "BG28_404_G",
333
341
  "BG29_844",
334
342
  "BG29_844_G",
343
+ "BG30_111_G",
335
344
  ].includes(entity.cardId)
336
345
  ? 2
337
346
  : 1;
@@ -413,4 +422,15 @@ const getTeammateInitialState = (gameState, hero) => {
413
422
  : null;
414
423
  };
415
424
  exports.getTeammateInitialState = getTeammateInitialState;
425
+ const copyEntity = (entity) => {
426
+ var _a, _b;
427
+ const copy = {
428
+ ...entity,
429
+ enchantments: ((_a = entity.enchantments) !== null && _a !== void 0 ? _a : []).map((ench) => ({ ...ench })),
430
+ pendingAttackBuffs: [],
431
+ rememberedDeathrattles: ((_b = entity.rememberedDeathrattles) !== null && _b !== void 0 ? _b : []).map((r) => ({ ...r })),
432
+ };
433
+ return copy;
434
+ };
435
+ exports.copyEntity = copyEntity;
416
436
  //# sourceMappingURL=utils.js.map