@firestone-hs/simulate-bgs-battle 1.1.530 → 1.1.531

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 (103) hide show
  1. package/dist/bgs-player-entity.d.ts +1 -0
  2. package/dist/bgs-player-entity.js.map +1 -1
  3. package/dist/board-entity.d.ts +1 -0
  4. package/dist/board-entity.js.map +1 -1
  5. package/dist/cards/card.interface.d.ts +9 -2
  6. package/dist/cards/card.interface.js +3 -1
  7. package/dist/cards/card.interface.js.map +1 -1
  8. package/dist/cards/cards-data.d.ts +1 -0
  9. package/dist/cards/cards-data.js +8 -0
  10. package/dist/cards/cards-data.js.map +1 -1
  11. package/dist/cards/impl/_card-mappings.js +36 -0
  12. package/dist/cards/impl/_card-mappings.js.map +1 -1
  13. package/dist/cards/impl/bg-spell/sharing-is-caring.d.ts +2 -0
  14. package/dist/cards/impl/bg-spell/sharing-is-caring.js +26 -0
  15. package/dist/cards/impl/bg-spell/sharing-is-caring.js.map +1 -0
  16. package/dist/cards/impl/minion/baneling.d.ts +2 -0
  17. package/dist/cards/impl/minion/baneling.js +16 -0
  18. package/dist/cards/impl/minion/baneling.js.map +1 -0
  19. package/dist/cards/impl/minion/bellowing-tyrant.d.ts +2 -0
  20. package/dist/cards/impl/minion/bellowing-tyrant.js +25 -0
  21. package/dist/cards/impl/minion/bellowing-tyrant.js.map +1 -0
  22. package/dist/cards/impl/minion/captain-bonerender.d.ts +2 -0
  23. package/dist/cards/impl/minion/captain-bonerender.js +27 -0
  24. package/dist/cards/impl/minion/captain-bonerender.js.map +1 -0
  25. package/dist/cards/impl/minion/carrier.d.ts +2 -0
  26. package/dist/cards/impl/minion/carrier.js +25 -0
  27. package/dist/cards/impl/minion/carrier.js.map +1 -0
  28. package/dist/cards/impl/minion/colossus.d.ts +2 -0
  29. package/dist/cards/impl/minion/colossus.js +21 -0
  30. package/dist/cards/impl/minion/colossus.js.map +1 -0
  31. package/dist/cards/impl/minion/corrupted-myrmidon.js +1 -1
  32. package/dist/cards/impl/minion/corrupted-myrmidon.js.map +1 -1
  33. package/dist/cards/impl/minion/gentle-stag.d.ts +2 -0
  34. package/dist/cards/impl/minion/gentle-stag.js +14 -0
  35. package/dist/cards/impl/minion/gentle-stag.js.map +1 -0
  36. package/dist/cards/impl/minion/hydralisk.d.ts +2 -0
  37. package/dist/cards/impl/minion/hydralisk.js +16 -0
  38. package/dist/cards/impl/minion/hydralisk.js.map +1 -0
  39. package/dist/cards/impl/minion/immortal.d.ts +2 -0
  40. package/dist/cards/impl/minion/immortal.js +18 -0
  41. package/dist/cards/impl/minion/immortal.js.map +1 -0
  42. package/dist/cards/impl/minion/karmic-chameleon.js +1 -1
  43. package/dist/cards/impl/minion/karmic-chameleon.js.map +1 -1
  44. package/dist/cards/impl/minion/lurker.d.ts +2 -0
  45. package/dist/cards/impl/minion/lurker.js +12 -0
  46. package/dist/cards/impl/minion/lurker.js.map +1 -0
  47. package/dist/cards/impl/minion/mothership.d.ts +2 -0
  48. package/dist/cards/impl/minion/mothership.js +14 -0
  49. package/dist/cards/impl/minion/mothership.js.map +1 -0
  50. package/dist/cards/impl/minion/mutalisk.d.ts +2 -0
  51. package/dist/cards/impl/minion/mutalisk.js +12 -0
  52. package/dist/cards/impl/minion/mutalisk.js.map +1 -0
  53. package/dist/cards/impl/minion/mythrax.d.ts +2 -0
  54. package/dist/cards/impl/minion/mythrax.js +18 -0
  55. package/dist/cards/impl/minion/mythrax.js.map +1 -0
  56. package/dist/cards/impl/minion/sandy.js +1 -1
  57. package/dist/cards/impl/minion/sandy.js.map +1 -1
  58. package/dist/cards/impl/minion/stitched-salvager.d.ts +2 -0
  59. package/dist/cards/impl/minion/stitched-salvager.js +31 -0
  60. package/dist/cards/impl/minion/stitched-salvager.js.map +1 -0
  61. package/dist/cards/impl/minion/ultralisk.d.ts +2 -0
  62. package/dist/cards/impl/minion/ultralisk.js +14 -0
  63. package/dist/cards/impl/minion/ultralisk.js.map +1 -0
  64. package/dist/cards/impl/minion/void-ray.d.ts +2 -0
  65. package/dist/cards/impl/minion/void-ray.js +14 -0
  66. package/dist/cards/impl/minion/void-ray.js.map +1 -0
  67. package/dist/cards/impl/minion/wildfire-elemental.d.ts +2 -0
  68. package/dist/cards/impl/minion/wildfire-elemental.js +24 -0
  69. package/dist/cards/impl/minion/wildfire-elemental.js.map +1 -0
  70. package/dist/cards/impl/minion/yulon-fortune-granter.js +1 -1
  71. package/dist/cards/impl/minion/yulon-fortune-granter.js.map +1 -1
  72. package/dist/cards/impl/minion/zergling.d.ts +2 -0
  73. package/dist/cards/impl/minion/zergling.js +23 -0
  74. package/dist/cards/impl/minion/zergling.js.map +1 -0
  75. package/dist/cards/impl/quest-reward/stolen-gold.js +2 -2
  76. package/dist/cards/impl/quest-reward/stolen-gold.js.map +1 -1
  77. package/dist/simulation/add-minion-to-board.d.ts +4 -3
  78. package/dist/simulation/add-minion-to-board.js +15 -12
  79. package/dist/simulation/add-minion-to-board.js.map +1 -1
  80. package/dist/simulation/attack.d.ts +10 -0
  81. package/dist/simulation/attack.js +10 -20
  82. package/dist/simulation/attack.js.map +1 -1
  83. package/dist/simulation/auras.js +17 -15
  84. package/dist/simulation/auras.js.map +1 -1
  85. package/dist/simulation/avenge.js +2 -2
  86. package/dist/simulation/avenge.js.map +1 -1
  87. package/dist/simulation/battlecries.js +1 -1
  88. package/dist/simulation/battlecries.js.map +1 -1
  89. package/dist/simulation/deathrattle-effects.js +4 -2
  90. package/dist/simulation/deathrattle-effects.js.map +1 -1
  91. package/dist/simulation/minion-kill.d.ts +4 -1
  92. package/dist/simulation/minion-kill.js +25 -2
  93. package/dist/simulation/minion-kill.js.map +1 -1
  94. package/dist/simulation/spawns.js +1 -1
  95. package/dist/simulation/spawns.js.map +1 -1
  96. package/dist/simulation/utils/golden.d.ts +1 -1
  97. package/dist/simulation/utils/golden.js +2 -2
  98. package/dist/simulation/utils/golden.js.map +1 -1
  99. package/dist/temp-card-ids.d.ts +35 -0
  100. package/dist/temp-card-ids.js.map +1 -1
  101. package/dist/utils.js +12 -2
  102. package/dist/utils.js.map +1 -1
  103. package/package.json +2 -2
@@ -2,10 +2,32 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.onMinionKill = void 0;
4
4
  const reference_data_1 = require("@firestone-hs/reference-data");
5
+ const card_interface_1 = require("../cards/card.interface");
6
+ const _card_mappings_1 = require("../cards/impl/_card-mappings");
5
7
  const utils_1 = require("../services/utils");
6
8
  const stats_1 = require("./stats");
7
- const onMinionKill = (killer, victim, killerBoard, killerHero, victimBoard, victimHero, gameState) => {
8
- switch (killer === null || killer === void 0 ? void 0 : killer.cardId) {
9
+ const onMinionKill = (killer, victim, killerBoard, killerHero, victimBoard, victimHero, defenderNeighbours, gameState) => {
10
+ if (!(killer === null || killer === void 0 ? void 0 : killer.cardId)) {
11
+ return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
12
+ }
13
+ let damageDoneByAttacker = 0;
14
+ let damageDoneByDefender = 0;
15
+ const onMinionKilledImpl = _card_mappings_1.cardMappings[killer.cardId];
16
+ if ((0, card_interface_1.hasOnMinionKilled)(onMinionKilledImpl)) {
17
+ const { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKilledImpl.onMinionKilled(killer, {
18
+ minionKilled: victim,
19
+ attackingHero: killerHero,
20
+ attackingBoard: killerBoard,
21
+ defendingHero: victimHero,
22
+ defendingBoard: victimBoard,
23
+ defenderNeighbours: defenderNeighbours,
24
+ gameState,
25
+ playerIsFriendly: killerHero.friendly,
26
+ });
27
+ damageDoneByAttacker += dmgDoneByAttacker;
28
+ damageDoneByDefender += dmgDoneByDefender;
29
+ }
30
+ switch (killer.cardId) {
9
31
  case "BG27_023":
10
32
  case "BG27_023_G":
11
33
  const murculesTarget = (0, utils_1.pickRandom)(killerHero.hand
@@ -38,6 +60,7 @@ const onMinionKill = (killer, victim, killerBoard, killerHero, victimBoard, vict
38
60
  }
39
61
  }
40
62
  }
63
+ return { dmgDoneByAttacker: damageDoneByAttacker, dmgDoneByDefender: damageDoneByDefender };
41
64
  };
42
65
  exports.onMinionKill = onMinionKill;
43
66
  //# sourceMappingURL=minion-kill.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"minion-kill.js","sourceRoot":"","sources":["../../src/simulation/minion-kill.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, CardType } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { pickRandom } from '../services/utils';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const onMinionKill = (\r\n\tkiller: BoardEntity,\r\n\tvictim: BoardEntity,\r\n\tkillerBoard: BoardEntity[],\r\n\tkillerHero: BgsPlayerEntity,\r\n\tvictimBoard: BoardEntity[],\r\n\tvictimHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// Can be null if killed by a hero power for instance\r\n\tswitch (killer?.cardId) {\r\n\t\tcase CardIds.Murcules_BG27_023:\r\n\t\tcase CardIds.Murcules_BG27_023_G:\r\n\t\t\tconst murculesTarget = pickRandom(\r\n\t\t\t\tkillerHero.hand\r\n\t\t\t\t\t.filter((e) => !!e?.cardId)\r\n\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t(e) => gameState.allCards.getCard(e.cardId).type?.toUpperCase() === CardType[CardType.MINION],\r\n\t\t\t\t\t),\r\n\t\t\t);\r\n\t\t\tif (murculesTarget) {\r\n\t\t\t\tconst murculesStats = killer.cardId === CardIds.Murcules_BG27_023 ? 2 : 4;\r\n\t\t\t\tmodifyStats(murculesTarget, murculesStats, murculesStats, killerBoard, killerHero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(killer, murculesTarget, killerBoard, killerHero, victimHero);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Mannoroth_BG27_507:\r\n\t\tcase CardIds.Mannoroth_BG27_507_G:\r\n\t\t\tif (killer.health > 0 && !killer.definitelyDead && killer.abiityChargesLeft > 0) {\r\n\t\t\t\tmodifyStats(killer, victim.attack, victim.maxHealth, killerBoard, killerHero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(killer, killer, killerBoard, killerHero, victimHero);\r\n\t\t\t\tkiller.abiityChargesLeft--;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TideOracleMorgl_BG27_513:\r\n\t\tcase CardIds.TideOracleMorgl_BG27_513_G:\r\n\t\t\tif (killer.attacking) {\r\n\t\t\t\tconst tideOracleMorgleTarget = pickRandom(\r\n\t\t\t\t\tkillerHero.hand\r\n\t\t\t\t\t\t.filter((e) => !!e?.cardId)\r\n\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\t\t\tgameState.allCards.getCard(e.cardId).type?.toUpperCase() === CardType[CardType.MINION],\r\n\t\t\t\t\t\t),\r\n\t\t\t\t);\r\n\t\t\t\tif (tideOracleMorgleTarget) {\r\n\t\t\t\t\tconst tideOracleMorgleMultiplier = killer.cardId === CardIds.TideOracleMorgl_BG27_513 ? 1 : 2;\r\n\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\ttideOracleMorgleTarget,\r\n\t\t\t\t\t\ttideOracleMorgleMultiplier * victim.attack,\r\n\t\t\t\t\t\ttideOracleMorgleMultiplier * victim.maxHealth,\r\n\t\t\t\t\t\tkillerBoard,\r\n\t\t\t\t\t\tkillerHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\tkiller,\r\n\t\t\t\t\t\ttideOracleMorgleTarget,\r\n\t\t\t\t\t\tkillerBoard,\r\n\t\t\t\t\t\tkillerHero,\r\n\t\t\t\t\t\tvictimHero,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t}\r\n};\r\n"]}
1
+ {"version":3,"file":"minion-kill.js","sourceRoot":"","sources":["../../src/simulation/minion-kill.ts"],"names":[],"mappings":";;;AAAA,iEAAiE;AAGjE,4DAA4D;AAC5D,iEAA4D;AAC5D,6CAA+C;AAE/C,mCAAsC;AAE/B,MAAM,YAAY,GAAG,CAC3B,MAAmB,EACnB,MAAmB,EACnB,WAA0B,EAC1B,UAA2B,EAC3B,WAA0B,EAC1B,UAA2B,EAC3B,kBAA0C,EAC1C,SAAwB,EACmC,EAAE;IAE7D,IAAI,CAAC,CAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA,EAAE;QACpB,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;KACtD;IAED,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,MAAM,kBAAkB,GAAG,6BAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,IAAA,kCAAiB,EAAC,kBAAkB,CAAC,EAAE;QAC1C,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,kBAAkB,CAAC,cAAc,CAAC,MAAM,EAAE;YAC1F,YAAY,EAAE,MAAM;YACpB,aAAa,EAAE,UAAU;YACzB,cAAc,EAAE,WAAW;YAC3B,aAAa,EAAE,UAAU;YACzB,cAAc,EAAE,WAAW;YAC3B,kBAAkB,EAAE,kBAAkB;YACtC,SAAS;YACT,gBAAgB,EAAE,UAAU,CAAC,QAAQ;SACrC,CAAC,CAAC;QACH,oBAAoB,IAAI,iBAAiB,CAAC;QAC1C,oBAAoB,IAAI,iBAAiB,CAAC;KAC1C;IAED,QAAQ,MAAM,CAAC,MAAM,EAAE;QACtB,gBAA+B;QAC/B;YACC,MAAM,cAAc,GAAG,IAAA,kBAAU,EAChC,UAAU,CAAC,IAAI;iBACb,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,MAAM,CAAA,CAAC;iBAC1B,MAAM,CACN,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,0CAAE,WAAW,EAAE,MAAK,yBAAQ,CAAC,yBAAQ,CAAC,MAAM,CAAC,CAAA,EAAA,CAC7F,CACF,CAAC;YACF,IAAI,cAAc,EAAE;gBACnB,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,eAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC1E,IAAA,mBAAW,EAAC,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBAC9F,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;aACrG;YACD,MAAM;QACP,gBAAgC;QAChC;YACC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,iBAAiB,GAAG,CAAC,EAAE;gBAChF,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;gBACzF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;gBAC7F,MAAM,CAAC,iBAAiB,EAAE,CAAC;aAC3B;YACD,MAAM;QACP,gBAAsC;QACtC;YACC,IAAI,MAAM,CAAC,SAAS,EAAE;gBACrB,MAAM,sBAAsB,GAAG,IAAA,kBAAU,EACxC,UAAU,CAAC,IAAI;qBACb,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,MAAM,CAAA,CAAC;qBAC1B,MAAM,CACN,CAAC,CAAC,EAAE,EAAE,WACL,OAAA,CAAA,MAAA,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,0CAAE,WAAW,EAAE,MAAK,yBAAQ,CAAC,yBAAQ,CAAC,MAAM,CAAC,CAAA,EAAA,CACvF,CACF,CAAC;gBACF,IAAI,sBAAsB,EAAE;oBAC3B,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,eAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC9F,IAAA,mBAAW,EACV,sBAAsB,EACtB,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAC1C,0BAA0B,GAAG,MAAM,CAAC,SAAS,EAC7C,WAAW,EACX,UAAU,EACV,SAAS,CACT,CAAC;oBACF,SAAS,CAAC,SAAS,CAAC,mBAAmB,CACtC,MAAM,EACN,sBAAsB,EACtB,WAAW,EACX,UAAU,EACV,UAAU,CACV,CAAC;iBACF;aACD;KACF;IAED,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;AAC7F,CAAC,CAAC;AA1FW,QAAA,YAAY,gBA0FvB","sourcesContent":["import { CardIds, CardType } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnMinionKilled } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { pickRandom } from '../services/utils';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const onMinionKill = (\r\n\tkiller: BoardEntity,\r\n\tvictim: BoardEntity,\r\n\tkillerBoard: BoardEntity[],\r\n\tkillerHero: BgsPlayerEntity,\r\n\tvictimBoard: BoardEntity[],\r\n\tvictimHero: BgsPlayerEntity,\r\n\tdefenderNeighbours: readonly BoardEntity[],\r\n\tgameState: FullGameState,\r\n): { dmgDoneByAttacker: number; dmgDoneByDefender: number } => {\r\n\t// Can be null if killed by a hero power for instance\r\n\tif (!killer?.cardId) {\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t}\r\n\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\tconst onMinionKilledImpl = cardMappings[killer.cardId];\r\n\tif (hasOnMinionKilled(onMinionKilledImpl)) {\r\n\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKilledImpl.onMinionKilled(killer, {\r\n\t\t\tminionKilled: victim,\r\n\t\t\tattackingHero: killerHero,\r\n\t\t\tattackingBoard: killerBoard,\r\n\t\t\tdefendingHero: victimHero,\r\n\t\t\tdefendingBoard: victimBoard,\r\n\t\t\tdefenderNeighbours: defenderNeighbours,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: killerHero.friendly,\r\n\t\t});\r\n\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t}\r\n\r\n\tswitch (killer.cardId) {\r\n\t\tcase CardIds.Murcules_BG27_023:\r\n\t\tcase CardIds.Murcules_BG27_023_G:\r\n\t\t\tconst murculesTarget = pickRandom(\r\n\t\t\t\tkillerHero.hand\r\n\t\t\t\t\t.filter((e) => !!e?.cardId)\r\n\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t(e) => gameState.allCards.getCard(e.cardId).type?.toUpperCase() === CardType[CardType.MINION],\r\n\t\t\t\t\t),\r\n\t\t\t);\r\n\t\t\tif (murculesTarget) {\r\n\t\t\t\tconst murculesStats = killer.cardId === CardIds.Murcules_BG27_023 ? 2 : 4;\r\n\t\t\t\tmodifyStats(murculesTarget, murculesStats, murculesStats, killerBoard, killerHero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(killer, murculesTarget, killerBoard, killerHero, victimHero);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Mannoroth_BG27_507:\r\n\t\tcase CardIds.Mannoroth_BG27_507_G:\r\n\t\t\tif (killer.health > 0 && !killer.definitelyDead && killer.abiityChargesLeft > 0) {\r\n\t\t\t\tmodifyStats(killer, victim.attack, victim.maxHealth, killerBoard, killerHero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(killer, killer, killerBoard, killerHero, victimHero);\r\n\t\t\t\tkiller.abiityChargesLeft--;\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase CardIds.TideOracleMorgl_BG27_513:\r\n\t\tcase CardIds.TideOracleMorgl_BG27_513_G:\r\n\t\t\tif (killer.attacking) {\r\n\t\t\t\tconst tideOracleMorgleTarget = pickRandom(\r\n\t\t\t\t\tkillerHero.hand\r\n\t\t\t\t\t\t.filter((e) => !!e?.cardId)\r\n\t\t\t\t\t\t.filter(\r\n\t\t\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\t\t\tgameState.allCards.getCard(e.cardId).type?.toUpperCase() === CardType[CardType.MINION],\r\n\t\t\t\t\t\t),\r\n\t\t\t\t);\r\n\t\t\t\tif (tideOracleMorgleTarget) {\r\n\t\t\t\t\tconst tideOracleMorgleMultiplier = killer.cardId === CardIds.TideOracleMorgl_BG27_513 ? 1 : 2;\r\n\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\ttideOracleMorgleTarget,\r\n\t\t\t\t\t\ttideOracleMorgleMultiplier * victim.attack,\r\n\t\t\t\t\t\ttideOracleMorgleMultiplier * victim.maxHealth,\r\n\t\t\t\t\t\tkillerBoard,\r\n\t\t\t\t\t\tkillerHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\tkiller,\r\n\t\t\t\t\t\ttideOracleMorgleTarget,\r\n\t\t\t\t\t\tkillerBoard,\r\n\t\t\t\t\t\tkillerHero,\r\n\t\t\t\t\t\tvictimHero,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t}\r\n\r\n\treturn { dmgDoneByAttacker: damageDoneByAttacker, dmgDoneByDefender: damageDoneByDefender };\r\n};\r\n"]}
@@ -16,7 +16,7 @@ const performEntitySpawns = (candidateEntities, boardWithKilledMinion, boardWith
16
16
  break;
17
17
  }
18
18
  const indexToSpawnAt = Math.max(0, boardWithKilledMinion.length - spawnSourceEntityIndexFromRight);
19
- (0, add_minion_to_board_1.addMinionToBoard)(boardWithKilledMinion, boardWithKilledMinionHero, opponentBoardHero, indexToSpawnAt, newMinion, gameState, true, applySelfAuras);
19
+ (0, add_minion_to_board_1.addMinionToBoard)(boardWithKilledMinion, boardWithKilledMinionHero, opponentBoard, opponentBoardHero, indexToSpawnAt, newMinion, gameState, true, applySelfAuras);
20
20
  if (newMinion.attackImmediately) {
21
21
  (0, attack_1.simulateAttack)(boardWithKilledMinion, boardWithKilledMinionHero, opponentBoard, opponentBoardHero, gameState);
22
22
  newMinion.attackImmediately = false;
@@ -1 +1 @@
1
- {"version":3,"file":"spawns.js","sourceRoot":"","sources":["../../src/simulation/spawns.ts"],"names":[],"mappings":";;;AAEA,+DAAyD;AACzD,qCAA0C;AAE1C,6CAAqD;AAE9C,MAAM,mBAAmB,GAAG,CAClC,iBAAyC,EACzC,qBAAoC,EACpC,yBAA0C,EAC1C,iBAAgD,EAChD,+BAAuC,EACvC,aAA4B,EAC5B,iBAAkC,EAClC,SAAwB,EACxB,cAAc,GAAG,IAAI,EACI,EAAE;IAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACvG,MAAM,eAAe,GAAG,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAElC,IAAI,qBAAqB,CAAC,MAAM,IAAI,CAAC,EAAE;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC7C,IAAA,kCAAqB,EAAC,YAAY,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;aACpG;YACD,MAAM;SACN;QAKD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC,MAAM,GAAG,+BAA+B,CAAC,CAAC;QACnG,IAAA,sCAAgB,EACf,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,SAAS,EACT,IAAI,EACJ,cAAc,CACd,CAAC;QACF,IAAI,SAAS,CAAC,iBAAiB,EAAE;YAQhC,IAAA,uBAAc,EACb,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,SAAS,CACT,CAAC;YASF,SAAS,CAAC,iBAAiB,GAAG,KAAK,CAAC;SACpC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;YACtD,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAChC;KACD;IAED,SAAS,CAAC,SAAS,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACpG,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AArEW,QAAA,mBAAmB,uBAqE9B","sourcesContent":["import { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { addMinionToBoard } from './add-minion-to-board';\r\nimport { simulateAttack } from './attack';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onMinionFailedToSpawn } from './spawn-fail';\r\n\r\nexport const performEntitySpawns = (\r\n\tcandidateEntities: readonly BoardEntity[],\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tspawnSourceEntity: BoardEntity | BgsPlayerEntity,\r\n\tspawnSourceEntityIndexFromRight: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tapplySelfAuras = true,\r\n): readonly BoardEntity[] => {\r\n\tconst aliveEntites = candidateEntities.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\tconst spawnedEntities = [];\r\n\tfor (let i = 0; i < aliveEntites.length; i++) {\r\n\t\tconst newMinion = aliveEntites[i];\r\n\t\t// All entities have been spawned\r\n\t\tif (boardWithKilledMinion.length >= 7) {\r\n\t\t\tfor (let j = i; j < aliveEntites.length; j++) {\r\n\t\t\t\tonMinionFailedToSpawn(aliveEntites[j], boardWithKilledMinion, boardWithKilledMinionHero, gameState);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t// Avoid minions spawning backwards (we don't have this issue if we add all elements at\r\n\t\t// the same time, but here we want to be able to attack after each spawn, which in turn\r\n\t\t// means that the minion can die before the other one spawns)\r\n\t\t// In boardWithKilledMinion, the dead minion has already been removed\r\n\t\tconst indexToSpawnAt = Math.max(0, boardWithKilledMinion.length - spawnSourceEntityIndexFromRight);\r\n\t\taddMinionToBoard(\r\n\t\t\tboardWithKilledMinion,\r\n\t\t\tboardWithKilledMinionHero,\r\n\t\t\topponentBoardHero,\r\n\t\t\tindexToSpawnAt,\r\n\t\t\tnewMinion,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t\tapplySelfAuras,\r\n\t\t);\r\n\t\tif (newMinion.attackImmediately) {\r\n\t\t\t// console.debug(\r\n\t\t\t// \t'\\nattack immediately\\n',\r\n\t\t\t// \tstringifySimple(boardWithKilledMinion, gameState.allCards),\r\n\t\t\t// \t'\\n',\r\n\t\t\t// \tstringifySimple(opponentBoard, gameState.allCards),\r\n\t\t\t// );\r\n\t\t\t// Whenever we are already in a combat phase, we need to first clean up the state\r\n\t\t\tsimulateAttack(\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\t// console.debug(\r\n\t\t\t// \t'after attack immediately\\n',\r\n\t\t\t// \tstringifySimple(boardWithKilledMinion, gameState.allCards),\r\n\t\t\t// \t'\\n',\r\n\t\t\t// \tstringifySimple(opponentBoard, gameState.allCards),\r\n\t\t\t// );\r\n\t\t\t// So that, even if the opponent's board is temporarily empty (e.g. no minion, but a token will\r\n\t\t\t// spawn in the enchantments resolution phase), the minion won't attack right away again\r\n\t\t\tnewMinion.attackImmediately = false;\r\n\t\t}\r\n\t\tif (newMinion.health > 0 && !newMinion.definitelyDead) {\r\n\t\t\tspawnedEntities.push(newMinion);\r\n\t\t}\r\n\t}\r\n\r\n\tgameState.spectator.registerMinionsSpawn(spawnSourceEntity, boardWithKilledMinion, spawnedEntities);\r\n\treturn spawnedEntities;\r\n};\r\n"]}
1
+ {"version":3,"file":"spawns.js","sourceRoot":"","sources":["../../src/simulation/spawns.ts"],"names":[],"mappings":";;;AAEA,+DAAyD;AACzD,qCAA0C;AAE1C,6CAAqD;AAE9C,MAAM,mBAAmB,GAAG,CAClC,iBAAyC,EACzC,qBAAoC,EACpC,yBAA0C,EAC1C,iBAAgD,EAChD,+BAAuC,EACvC,aAA4B,EAC5B,iBAAkC,EAClC,SAAwB,EACxB,cAAc,GAAG,IAAI,EACI,EAAE;IAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACvG,MAAM,eAAe,GAAG,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,SAAS,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAElC,IAAI,qBAAqB,CAAC,MAAM,IAAI,CAAC,EAAE;YACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBAC7C,IAAA,kCAAqB,EAAC,YAAY,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;aACpG;YACD,MAAM;SACN;QAKD,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC,MAAM,GAAG,+BAA+B,CAAC,CAAC;QACnG,IAAA,sCAAgB,EACf,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,SAAS,EACT,IAAI,EACJ,cAAc,CACd,CAAC;QACF,IAAI,SAAS,CAAC,iBAAiB,EAAE;YAQhC,IAAA,uBAAc,EACb,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,SAAS,CACT,CAAC;YASF,SAAS,CAAC,iBAAiB,GAAG,KAAK,CAAC;SACpC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;YACtD,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAChC;KACD;IAED,SAAS,CAAC,SAAS,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IACpG,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAtEW,QAAA,mBAAmB,uBAsE9B","sourcesContent":["import { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { addMinionToBoard } from './add-minion-to-board';\r\nimport { simulateAttack } from './attack';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onMinionFailedToSpawn } from './spawn-fail';\r\n\r\nexport const performEntitySpawns = (\r\n\tcandidateEntities: readonly BoardEntity[],\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tspawnSourceEntity: BoardEntity | BgsPlayerEntity,\r\n\tspawnSourceEntityIndexFromRight: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tapplySelfAuras = true,\r\n): readonly BoardEntity[] => {\r\n\tconst aliveEntites = candidateEntities.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\tconst spawnedEntities = [];\r\n\tfor (let i = 0; i < aliveEntites.length; i++) {\r\n\t\tconst newMinion = aliveEntites[i];\r\n\t\t// All entities have been spawned\r\n\t\tif (boardWithKilledMinion.length >= 7) {\r\n\t\t\tfor (let j = i; j < aliveEntites.length; j++) {\r\n\t\t\t\tonMinionFailedToSpawn(aliveEntites[j], boardWithKilledMinion, boardWithKilledMinionHero, gameState);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t// Avoid minions spawning backwards (we don't have this issue if we add all elements at\r\n\t\t// the same time, but here we want to be able to attack after each spawn, which in turn\r\n\t\t// means that the minion can die before the other one spawns)\r\n\t\t// In boardWithKilledMinion, the dead minion has already been removed\r\n\t\tconst indexToSpawnAt = Math.max(0, boardWithKilledMinion.length - spawnSourceEntityIndexFromRight);\r\n\t\taddMinionToBoard(\r\n\t\t\tboardWithKilledMinion,\r\n\t\t\tboardWithKilledMinionHero,\r\n\t\t\topponentBoard,\r\n\t\t\topponentBoardHero,\r\n\t\t\tindexToSpawnAt,\r\n\t\t\tnewMinion,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t\tapplySelfAuras,\r\n\t\t);\r\n\t\tif (newMinion.attackImmediately) {\r\n\t\t\t// console.debug(\r\n\t\t\t// \t'\\nattack immediately\\n',\r\n\t\t\t// \tstringifySimple(boardWithKilledMinion, gameState.allCards),\r\n\t\t\t// \t'\\n',\r\n\t\t\t// \tstringifySimple(opponentBoard, gameState.allCards),\r\n\t\t\t// );\r\n\t\t\t// Whenever we are already in a combat phase, we need to first clean up the state\r\n\t\t\tsimulateAttack(\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\t// console.debug(\r\n\t\t\t// \t'after attack immediately\\n',\r\n\t\t\t// \tstringifySimple(boardWithKilledMinion, gameState.allCards),\r\n\t\t\t// \t'\\n',\r\n\t\t\t// \tstringifySimple(opponentBoard, gameState.allCards),\r\n\t\t\t// );\r\n\t\t\t// So that, even if the opponent's board is temporarily empty (e.g. no minion, but a token will\r\n\t\t\t// spawn in the enchantments resolution phase), the minion won't attack right away again\r\n\t\t\tnewMinion.attackImmediately = false;\r\n\t\t}\r\n\t\tif (newMinion.health > 0 && !newMinion.definitelyDead) {\r\n\t\t\tspawnedEntities.push(newMinion);\r\n\t\t}\r\n\t}\r\n\r\n\tgameState.spectator.registerMinionsSpawn(spawnSourceEntity, boardWithKilledMinion, spawnedEntities);\r\n\treturn spawnedEntities;\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, otherHero: BgsPlayerEntity, gameState: FullGameState) => void;
5
+ export declare const makeMinionGolden: (target: BoardEntity, source: BoardEntity | BgsPlayerEntity, targetBoard: BoardEntity[], targetBoardHero: BgsPlayerEntity, otherBoard: BoardEntity[], 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, otherHero, gameState) => {
9
+ const makeMinionGolden = (target, source, targetBoard, targetBoardHero, otherBoard, 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, otherHer
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, otherHero, target, gameState, true, false);
25
+ (0, add_minion_to_board_1.handleAddedMinionAuraEffect)(targetBoard, targetBoardHero, otherBoard, otherHero, target, gameState, true, false);
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\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, true, false);\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;\r\n};\r\n\r\n// This feels wrong, and is probably an indicator that auras are not applied at the right time\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;\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\tcase CardIds.SanlaynScribe_BGDUO31_208:\r\n\t\tcase CardIds.SanlaynScribe_BGDUO31_208_G:\r\n\t\t\tconst sanlaynBuffToRemove = hero.globalInfo.SanlaynScribesDeadThisGame;\r\n\t\t\tconst sanlaynMultiplier = entity.cardId === CardIds.SanlaynScribe_BGDUO31_208_G ? 2 : 1;\r\n\t\t\tentity.health = Math.max(1, entity.health - sanlaynMultiplier * sanlaynBuffToRemove);\r\n\t\t\tentity.attack = Math.max(0, entity.attack - sanlaynMultiplier * sanlaynBuffToRemove);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401:\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401_G:\r\n\t\t\tconst multiplierAstral = entity.cardId === CardIds.AstralAutomaton_BG_TTN_401_G ? 2 : 1;\r\n\t\t\t// Doesn't count self\r\n\t\t\tconst statsBonusAstralToRemove = hero.globalInfo.AstralAutomatonsSummonedThisGame - 1;\r\n\t\t\tentity.health = Math.max(1, entity.health - 2 * multiplierAstral * statsBonusAstralToRemove);\r\n\t\t\tentity.attack = Math.max(0, entity.attack - 2 * multiplierAstral * statsBonusAstralToRemove);\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\totherBoard: BoardEntity[],\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, otherBoard, otherHero, target, gameState, true, false);\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;\r\n};\r\n\r\n// This feels wrong, and is probably an indicator that auras are not applied at the right time\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;\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\tcase CardIds.SanlaynScribe_BGDUO31_208:\r\n\t\tcase CardIds.SanlaynScribe_BGDUO31_208_G:\r\n\t\t\tconst sanlaynBuffToRemove = hero.globalInfo.SanlaynScribesDeadThisGame;\r\n\t\t\tconst sanlaynMultiplier = entity.cardId === CardIds.SanlaynScribe_BGDUO31_208_G ? 2 : 1;\r\n\t\t\tentity.health = Math.max(1, entity.health - sanlaynMultiplier * sanlaynBuffToRemove);\r\n\t\t\tentity.attack = Math.max(0, entity.attack - sanlaynMultiplier * sanlaynBuffToRemove);\r\n\t\t\tbreak;\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401:\r\n\t\tcase CardIds.AstralAutomaton_BG_TTN_401_G:\r\n\t\t\tconst multiplierAstral = entity.cardId === CardIds.AstralAutomaton_BG_TTN_401_G ? 2 : 1;\r\n\t\t\t// Doesn't count self\r\n\t\t\tconst statsBonusAstralToRemove = hero.globalInfo.AstralAutomatonsSummonedThisGame - 1;\r\n\t\t\tentity.health = Math.max(1, entity.health - 2 * multiplierAstral * statsBonusAstralToRemove);\r\n\t\t\tentity.attack = Math.max(0, entity.attack - 2 * multiplierAstral * statsBonusAstralToRemove);\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n"]}
@@ -1,2 +1,37 @@
1
1
  export declare const enum TempCardIds {
2
+ SharingIsCaring = "SharingIsCaring",
3
+ Zergling = "Zergling",
4
+ Zergling_G = "Zergling_G",
5
+ Hydralisk = "Hydralisk",
6
+ Hydralisk_G = "Hydralisk_G",
7
+ Baneling = "Baneling",
8
+ Baneling_G = "Baneling_G",
9
+ Mutalisk = "Mutalisk",
10
+ Mutalisk_G = "Mutalisk_G",
11
+ Lurker = "Lurker",
12
+ Lurker_G = "Lurker_G",
13
+ Viper = "Viper",
14
+ Viper_G = "Viper_G",
15
+ Ultralisk = "Ultralisk",
16
+ Ultralisk_G = "Ultralisk_G",
17
+ Colossus = "Colossus",
18
+ Colossus_G = "Colossus_G",
19
+ Interceptor_BG = "Interceptor_BG",
20
+ Interceptor_BG_G = "Interceptor_BG_G",
21
+ Carrier = "Carrier",
22
+ Carrier_G = "Carrier_G",
23
+ Immortal = "Immortal",
24
+ Immortal_G = "Immortal_G",
25
+ VoidRay = "VoidRay",
26
+ VoidRay_G = "VoidRay_G",
27
+ Mothership = "Mothership",
28
+ Mothership_G = "Mothership_G",
29
+ CaptainBonerender = "CaptainBonerender",
30
+ CaptainBonerender_G = "CaptainBonerender_G",
31
+ GentleStag = "GentleStag",
32
+ GentleStag_G = "GentleStag_G",
33
+ BellowingTyrant = "BellowingTyrant",
34
+ BellowingTyrant_G = "BellowingTyrant_G",
35
+ StitchedSalvager = "StitchedSalvager",
36
+ StitchedSalvager_G = "StitchedSalvager_G"
2
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"temp-card-ids.js","sourceRoot":"","sources":["../src/temp-card-ids.ts"],"names":[],"mappings":"","sourcesContent":["export declare const enum TempCardIds {}\r\n"]}
1
+ {"version":3,"file":"temp-card-ids.js","sourceRoot":"","sources":["../src/temp-card-ids.ts"],"names":[],"mappings":"","sourcesContent":["export declare const enum TempCardIds {\r\n\tSharingIsCaring = 'SharingIsCaring',\r\n\tZergling = 'Zergling',\r\n\tZergling_G = 'Zergling_G',\r\n\tHydralisk = 'Hydralisk',\r\n\tHydralisk_G = 'Hydralisk_G',\r\n\tBaneling = 'Baneling',\r\n\tBaneling_G = 'Baneling_G',\r\n\tMutalisk = 'Mutalisk',\r\n\tMutalisk_G = 'Mutalisk_G',\r\n\tLurker = 'Lurker',\r\n\tLurker_G = 'Lurker_G',\r\n\tViper = 'Viper',\r\n\tViper_G = 'Viper_G',\r\n\tUltralisk = 'Ultralisk',\r\n\tUltralisk_G = 'Ultralisk_G',\r\n\tColossus = 'Colossus',\r\n\tColossus_G = 'Colossus_G',\r\n\tInterceptor_BG = 'Interceptor_BG',\r\n\tInterceptor_BG_G = 'Interceptor_BG_G',\r\n\tCarrier = 'Carrier',\r\n\tCarrier_G = 'Carrier_G',\r\n\tImmortal = 'Immortal',\r\n\tImmortal_G = 'Immortal_G',\r\n\tVoidRay = 'VoidRay',\r\n\tVoidRay_G = 'VoidRay_G',\r\n\tMothership = 'Mothership',\r\n\tMothership_G = 'Mothership_G',\r\n\tCaptainBonerender = 'CaptainBonerender',\r\n\tCaptainBonerender_G = 'CaptainBonerender_G',\r\n\tGentleStag = 'GentleStag',\r\n\tGentleStag_G = 'GentleStag_G',\r\n\tBellowingTyrant = 'BellowingTyrant',\r\n\tBellowingTyrant_G = 'BellowingTyrant_G',\r\n\tStitchedSalvager = 'StitchedSalvager',\r\n\tStitchedSalvager_G = 'StitchedSalvager_G',\r\n}\r\n"]}
package/dist/utils.js CHANGED
@@ -13,11 +13,15 @@ const CLEAVE_IDS = [
13
13
  "TB_BaconUps_153",
14
14
  "BG26_817",
15
15
  "BG26_817_G",
16
+ "Ultralisk",
17
+ "Ultralisk_G",
16
18
  ];
17
19
  const ATTACK_IMMEDIATELY_IDS = [
18
20
  "BGS_061t",
19
21
  "TB_BaconUps_141t",
20
22
  "BG22_HERO_305t",
23
+ "Interceptor_BG",
24
+ "Interceptor_BG_G",
21
25
  ];
22
26
  const CANT_ATTACK_IDS = ["BGS_077", "TB_BaconUps_128"];
23
27
  const buildSingleBoardEntity = (cardId, controllerHero, friendlyBoard, allCards, friendly, entityId = 1, spawnReborn = false, cardsData, sharedState, entityToSpawn, originalEntity = null) => {
@@ -314,8 +318,14 @@ const addImpliedMechanics = (entity, cardsData) => {
314
318
  entity.cleave = cleave;
315
319
  entity.cantAttack = cantAttack;
316
320
  entity.divineShield = entity.divineShield || entity.hadDivineShield;
317
- entity.immuneWhenAttackCharges =
318
- entity.cardId === "BG24_004" || entity.cardId === "BG24_004_G" ? 99999 : null;
321
+ entity.immuneWhenAttackCharges = [
322
+ "BG24_004",
323
+ "BG24_004_G",
324
+ "Viper",
325
+ "Viper_G",
326
+ ].includes(entity.cardId)
327
+ ? 99999
328
+ : null;
319
329
  entity.frenzyChargesLeft =
320
330
  entity.cardId === "BG20_204_G"
321
331
  ? 2
package/dist/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { ALL_BG_RACES, AllCardsService, CardIds, GameTag, Race, ReferenceCard } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from './bgs-player-entity';\r\nimport { BoardEntity } from './board-entity';\r\nimport { BoardSecret } from './board-secret';\r\nimport { hasDefaultCharges } from './cards/card.interface';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { cardMappings } from './cards/impl/_card-mappings';\r\nimport { pickRandom, shuffleArray } from './services/utils';\r\nimport { FullGameState, GameState, PlayerState } from './simulation/internal-game-state';\r\nimport { SharedState } from './simulation/shared-state';\r\nimport { modifyStats } from './simulation/stats';\r\n\r\nconst CLEAVE_IDS = [\r\n\tCardIds.CaveHydra_BG_LOOT_078,\r\n\tCardIds.CaveHydra_TB_BaconUps_151,\r\n\tCardIds.FoeReaper4000_BG_GVG_113,\r\n\tCardIds.FoeReaper4000_TB_BaconUps_153,\r\n\tCardIds.BladeCollector_BG26_817,\r\n\tCardIds.BladeCollector_BG26_817_G,\r\n];\r\nconst ATTACK_IMMEDIATELY_IDS = [\r\n\tCardIds.Scallywag_SkyPirateToken_BGS_061t,\r\n\tCardIds.Scallywag_SkyPirateToken_TB_BaconUps_141t,\r\n\tCardIds.Onyxia_OnyxianWhelpToken,\r\n\t// The token doesn't attack immediately natively, only when spawned by the spell\r\n\t// See http://replays.firestoneapp.com/?reviewId=8924452a-540a-4324-8306-46900c3f9f35&turn=22&action=38\r\n\t// CardIds.ToxicTumbleweed_TumblingAssassinToken_BG28_641t,\r\n];\r\nconst CANT_ATTACK_IDS = [CardIds.ArcaneCannon_BGS_077, CardIds.ArcaneCannon_TB_BaconUps_128];\r\n\r\nexport const buildSingleBoardEntity = (\r\n\tcardId: string,\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tentityId = 1,\r\n\tspawnReborn = false,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tentityToSpawn: BoardEntity,\r\n\toriginalEntity: BoardEntity = null,\r\n): BoardEntity => {\r\n\tconst card = allCards.getCard(cardId);\r\n\tconst attackImmediately = ATTACK_IMMEDIATELY_IDS.indexOf(cardId as CardIds) !== -1;\r\n\tconst newEntity = !!entityToSpawn\r\n\t\t? ({\r\n\t\t\t\t...entityToSpawn,\r\n\t\t\t\tentityId: sharedState.currentEntityId++,\r\n\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\tavengeCurrent: entityToSpawn.avengeDefault,\r\n\t\t\t\tattacking: false,\r\n\t\t\t\tdamageMultiplier: 1,\r\n\t\t\t\tfrenzyChargesLeft: 1,\r\n\t\t\t\tfriendly: friendly,\r\n\t\t\t\thasAttacked: 0,\r\n\t\t } as BoardEntity)\r\n\t\t: addImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\tentityId: entityId,\r\n\t\t\t\t\tattack: card.attack,\r\n\t\t\t\t\thasAttacked: 0,\r\n\t\t\t\t\tcardId: cardId,\r\n\t\t\t\t\tdivineShield: hasMechanic(card, 'DIVINE_SHIELD'),\r\n\t\t\t\t\thealth: card.health,\r\n\t\t\t\t\tmaxHealth: card.health,\r\n\t\t\t\t\ttaunt: hasMechanic(card, GameTag[GameTag.TAUNT]),\r\n\t\t\t\t\treborn: hasMechanic(card, 'REBORN'),\r\n\t\t\t\t\tpoisonous: hasMechanic(card, GameTag[GameTag.POISONOUS]),\r\n\t\t\t\t\tvenomous: hasMechanic(card, GameTag[GameTag.VENOMOUS]),\r\n\t\t\t\t\tstealth: hasMechanic(card, GameTag[GameTag.STEALTH]),\r\n\t\t\t\t\twindfury: hasMechanic(card, GameTag[GameTag.WINDFURY]),\r\n\t\t\t\t\tenchantments: [],\r\n\t\t\t\t\tpendingAttackBuffs: [],\r\n\t\t\t\t\tfriendly: friendly,\r\n\t\t\t\t\tattackImmediately: attackImmediately,\r\n\t\t\t\t\tavengeCurrent: cardsData.avengeValue(cardId),\r\n\t\t\t\t\tavengeDefault: cardsData.avengeValue(cardId),\r\n\t\t\t\t} as BoardEntity,\r\n\t\t\t\tcardsData,\r\n\t\t );\r\n\r\n\tif (spawnReborn && !entityToSpawn) {\r\n\t\tif (cardId === CardIds.BuildAnUndead_PutricidesCreationToken) {\r\n\t\t\tconst stitchedCardId = !!originalEntity.additionalCards?.length ? originalEntity.additionalCards[0] : null;\r\n\t\t\tif (stitchedCardId) {\r\n\t\t\t\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\t\t\t\tnewEntity.attack = newEntity.attack + stitchedCard.attack;\r\n\t\t\t\tnewEntity.maxHealth = newEntity.maxHealth + stitchedCard.health;\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag[GameTag.TAUNT]);\r\n\t\t\t\tnewEntity.divineShield =\r\n\t\t\t\t\tnewEntity.divineShield || hasMechanic(stitchedCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag[GameTag.POISONOUS]);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag[GameTag.VENOMOUS]);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag[GameTag.WINDFURY]);\r\n\t\t\t\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t}\r\n\t\t} else if (\r\n\t\t\tcardId === CardIds.ZilliaxAssembled_BG29_100_G &&\r\n\t\t\t!!originalEntity.additionalCards?.filter((c) => !!c).length\r\n\t\t) {\r\n\t\t\t// In this case, the base stats are still correct (the golden stats of Zilliax), but the keywords\r\n\t\t\t// can change\r\n\t\t\tfor (const moduleCardId of originalEntity.additionalCards) {\r\n\t\t\t\tconst moduleCard = allCards.getCard(moduleCardId);\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(moduleCard, GameTag[GameTag.TAUNT]);\r\n\t\t\t\tnewEntity.divineShield =\r\n\t\t\t\t\tnewEntity.divineShield || hasMechanic(moduleCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(moduleCard, GameTag[GameTag.POISONOUS]);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(moduleCard, GameTag[GameTag.VENOMOUS]);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(moduleCard, GameTag[GameTag.WINDFURY]);\r\n\t\t\t\tnewEntity.stealth = newEntity.stealth || hasMechanic(moduleCard, GameTag[GameTag.STEALTH]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tnewEntity.health = 1;\r\n\t\tnewEntity.reborn = false;\r\n\t\tnewEntity.scriptDataNum1 = getScriptDataNum1(cardId, originalEntity);\r\n\r\n\t\t// For ghoul-acabra + reborn\r\n\t\t// newEntity.attack += originalEntity.permanentAttack ?? 0;\r\n\t\t// newEntity.health += originalEntity.permanentHealth ?? 0;\r\n\t}\r\n\r\n\tnewEntity.hadDivineShield = newEntity.divineShield || newEntity.hadDivineShield;\r\n\treturn newEntity;\r\n};\r\n\r\nconst getScriptDataNum1 = (cardId: string, originalEntity: BoardEntity): number => {\r\n\tswitch (cardId) {\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804:\r\n\t\t\treturn 8;\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804_G:\r\n\t\t\treturn 16;\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t}\r\n};\r\n\r\nexport const buildRandomUndeadCreation = (\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n): BoardEntity => {\r\n\tconst baseCard = pickRandom(cardsData.putricidePool1);\r\n\tconst newEntity = buildSingleBoardEntity(\r\n\t\tbaseCard,\r\n\t\tcontrollerHero,\r\n\t\tfriendlyBoard,\r\n\t\tallCards,\r\n\t\tfriendly,\r\n\t\tsharedState.currentEntityId++,\r\n\t\tfalse,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst stitchedCardId =\r\n\t\tbaseCard === CardIds.EternalSummoner_BG25_009\r\n\t\t\t? pickRandom(cardsData.putridicePool2ForEternalSummoner)\r\n\t\t\t: pickRandom(cardsData.putricidePool2);\r\n\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\tnewEntity.attack += stitchedCard.attack;\r\n\tnewEntity.health += stitchedCard.health;\r\n\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag[GameTag.TAUNT]);\r\n\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(stitchedCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag[GameTag.POISONOUS]);\r\n\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag[GameTag.VENOMOUS]);\r\n\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag[GameTag.WINDFURY]);\r\n\tnewEntity.reborn = newEntity.reborn || hasMechanic(stitchedCard, GameTag[GameTag.REBORN]);\r\n\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\treturn newEntity;\r\n};\r\n\r\nexport const grantRandomAttack = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tadditionalAttack: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = candidateBoard[Math.floor(Math.random() * candidateBoard.length)];\r\n\t\tmodifyStats(target, additionalAttack, 0, candidateBoard, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantRandomHealth = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = pickRandom(candidateBoard);\r\n\t\tmodifyStats(target, 0, health, board, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantRandomStats = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\trace: Race,\r\n\texcludeSource: boolean,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tif (board.length > 0) {\r\n\t\tconst target: BoardEntity = getRandomAliveMinion(\r\n\t\t\tboard.filter((e) => !!e.cardId).filter((e) => (excludeSource ? e.entityId !== source.entityId : true)),\r\n\t\t\thero,\r\n\t\t\trace,\r\n\t\t\tgameState.allCards,\r\n\t\t);\r\n\t\tif (target) {\r\n\t\t\tmodifyStats(target, attack, health, board, hero, gameState);\r\n\t\t\tif (gameState.spectator) {\r\n\t\t\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t\t\t}\r\n\t\t\treturn target;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const getRandomAliveMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, allCards))\r\n\t\t.filter((e) => e?.health > 0 && !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomRevivableMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, allCards))\r\n\t\t.filter((e) => !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomMinionWithHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tif (!board.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst highestHealth = Math.max(...board.map((e) => e.health));\r\n\tconst validMinions = board.filter((e) => e.health === highestHealth);\r\n\treturn validMinions[Math.floor(Math.random() * validMinions.length)];\r\n};\r\n\r\n/**\r\n * Only use if the full board gets the stats, or if you're able to filter use the tribe param.\r\n * Otherwise some minions will be missing when applying onStatsUpdate effects\r\n */\r\nexport const addStatsToBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\t// permanentUpgrade = false,\r\n): void => {\r\n\tfor (const entity of board) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.allCards)) {\r\n\t\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\t\tgameState.spectator?.registerPowerTarget(sourceEntity, entity, board, null, null);\r\n\t\t\t// if (permanentUpgrade) {\r\n\t\t\t// \tentity.permanentAttack = (entity.permanentAttack ?? 0) + attack;\r\n\t\t\t// \tentity.permanentHealth = (entity.permanentHealth ?? 0) + health;\r\n\t\t\t// }\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const addStatsToAliveBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\t// permanentUpgrade = false,\r\n): void => {\r\n\tfor (const entity of board.filter((e) => e.health > 0 && !e.definitelyDead)) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.allCards)) {\r\n\t\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\t\tgameState.spectator?.registerPowerTarget(sourceEntity, entity, board, null, null);\r\n\t\t\t// if (permanentUpgrade) {\r\n\t\t\t// \tentity.permanentAttack = (entity.permanentAttack ?? 0) + attack;\r\n\t\t\t// \tentity.permanentHealth = (entity.permanentHealth ?? 0) + health;\r\n\t\t\t// }\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const grantStatsToMinionsOfEachType = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\tnumberOfDifferentTypes = 99,\r\n\tcanRevive = true,\r\n): void => {\r\n\tconst minionsToBuff = getMinionsOfDifferentTypes(board, hero, gameState, canRevive, numberOfDifferentTypes);\r\n\tfor (const entity of minionsToBuff) {\r\n\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, entity, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const getMinionsOfDifferentTypes = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcanRevive = true,\r\n\tnumberOfDifferentTypes = 99,\r\n): BoardEntity[] => {\r\n\tconst result: BoardEntity[] = [];\r\n\tif (board.length > 0) {\r\n\t\tlet boardCopy = board.filter(\r\n\t\t\t(e) => !getEffectiveTribesForEntity(e, hero, gameState.allCards)?.includes(Race.ALL),\r\n\t\t);\r\n\t\tconst allRaces = shuffleArray(ALL_BG_RACES);\r\n\t\tlet typesBuffed = 0;\r\n\t\tconst racesProcessed = [];\r\n\t\tfor (let i = 1; i <= 2; i++) {\r\n\t\t\tfor (const tribe of allRaces) {\r\n\t\t\t\tconst minionsWithRaces = boardCopy\r\n\t\t\t\t\t.filter((e) => getEffectiveTribesForEntity(e, hero, gameState.allCards).length === i)\r\n\t\t\t\t\t.filter((e) =>\r\n\t\t\t\t\t\tgetEffectiveTribesForEntity(e, hero, gameState.allCards).some(\r\n\t\t\t\t\t\t\t(r) => !racesProcessed.includes(Race[r]),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t);\r\n\t\t\t\tif (typesBuffed >= numberOfDifferentTypes) {\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t\tconst validMinion: BoardEntity = canRevive\r\n\t\t\t\t\t? getRandomRevivableMinion(minionsWithRaces, hero, tribe, gameState.allCards)\r\n\t\t\t\t\t: getRandomAliveMinion(minionsWithRaces, hero, tribe, gameState.allCards);\r\n\t\t\t\tif (validMinion) {\r\n\t\t\t\t\tresult.push(validMinion);\r\n\t\t\t\t\tboardCopy = boardCopy.filter((e) => e !== validMinion);\r\n\t\t\t\t\ttypesBuffed++;\r\n\t\t\t\t\tracesProcessed.push(tribe);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tresult.push(\r\n\t\t\t...board.filter((e) => {\r\n\t\t\t\tconst effectiveTribes = getEffectiveTribesForEntity(e, hero, gameState.allCards);\r\n\t\t\t\treturn effectiveTribes?.includes(Race.ALL);\r\n\t\t\t}),\r\n\t\t);\r\n\t}\r\n\treturn result;\r\n};\r\n\r\nexport const hasMechanic = (card: ReferenceCard, mechanic: string): boolean => {\r\n\treturn card.mechanics?.includes(mechanic);\r\n};\r\n\r\nexport const hasCorrectTribe = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\ttargetTribe: Race,\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tconst effectiveTribesForEntity = getEffectiveTribesForEntity(entity, playerEntity, allCards);\r\n\treturn (\r\n\t\teffectiveTribesForEntity.length > 0 &&\r\n\t\t(effectiveTribesForEntity.includes(targetTribe) || effectiveTribesForEntity.includes(Race.ALL))\r\n\t);\r\n};\r\n\r\nexport const getEffectiveTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\treturn [\r\n\t\t...(allCards.getCard(entity.cardId).races?.map((r) => Race[r]) ?? []),\r\n\t\t...getSpecialTribesForEntity(entity, playerEntity, allCards),\r\n\t];\r\n};\r\n\r\nconst getSpecialTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013:\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013_G:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.SmugglerPortrait_BG30_MagicItem_825)\r\n\t\t\t\t? [Race.DRAGON]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.LightfangEnforcer_BGS_009:\r\n\t\tcase CardIds.LightfangEnforcer_TB_BaconUps_082:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.EnforcerPortrait_BG30_MagicItem_971)\r\n\t\t\t\t? [Race.ALL]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.BrannBronzebeard_BG_LOE_077:\r\n\t\tcase CardIds.BrannBronzebeard_TB_BaconUps_045:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.BronzebeardPortrait_BG30_MagicItem_418)\r\n\t\t\t\t? [Race.DRAGON, Race.MURLOC]\r\n\t\t\t\t: [];\r\n\t}\r\n\treturn [];\r\n};\r\n\r\n/** @deprecated use hasCorreectTribe instead */\r\nexport const isCorrectTribe = (cardRaces: readonly string[], targetTribe: Race): boolean => {\r\n\tif (!cardRaces?.length) {\r\n\t\treturn false;\r\n\t}\r\n\treturn cardRaces\r\n\t\t.map((cardRace) => getRaceEnum(cardRace))\r\n\t\t.some((raceEnum) => raceEnum === Race.ALL || raceEnum === targetTribe);\r\n};\r\n\r\nexport const getRaceEnum = (race: string): Race => {\r\n\treturn Race[race];\r\n};\r\n\r\nexport const addImpliedMechanics = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tconst cleave = CLEAVE_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tconst cantAttack = CANT_ATTACK_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tentity.cleave = cleave;\r\n\tentity.cantAttack = cantAttack;\r\n\tentity.divineShield = entity.divineShield || entity.hadDivineShield;\r\n\tentity.immuneWhenAttackCharges =\r\n\t\tentity.cardId === CardIds.Warpwing_BG24_004 || entity.cardId === CardIds.Warpwing_BG24_004_G ? 99999 : null;\r\n\tentity.frenzyChargesLeft =\r\n\t\tentity.cardId === CardIds.BristlebackKnight_BG20_204_G\r\n\t\t\t? 2\r\n\t\t\t: entity.cardId === CardIds.BristlebackKnight_BG20_204\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n\t// It's not an issue adding a charge for entities without a special ability\r\n\tconst defaultChargesImpl = cardMappings[entity.cardId];\r\n\tif (hasDefaultCharges(defaultChargesImpl)) {\r\n\t\tentity.abiityChargesLeft = defaultChargesImpl.defaultCharges(entity);\r\n\t} else {\r\n\t\tentity.abiityChargesLeft = [\r\n\t\t\tCardIds.MarineMatriarch_BG29_610,\r\n\t\t\tCardIds.MarineMatriarch_BG29_610_G,\r\n\t\t\tCardIds.SoftHeartedSiren_BG26_590,\r\n\t\t\tCardIds.SoftHeartedSiren_BG26_590_G,\r\n\t\t\tCardIds.LongJohnCopper_BG29_831,\r\n\t\t\tCardIds.LongJohnCopper_BG29_831_G,\r\n\t\t\tCardIds.BristlingBuffoon_BG29_160,\r\n\t\t\tCardIds.BristlingBuffoon_BG29_160_G,\r\n\t\t].includes(entity.cardId as CardIds)\r\n\t\t\t? 3\r\n\t\t\t: [\r\n\t\t\t\t\tCardIds.Mannoroth_BG27_507_G,\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\t\tCardIds.MadMatador_BG28_404_G,\r\n\t\t\t\t\tCardIds.WingedChimera_BG29_844,\r\n\t\t\t\t\tCardIds.WingedChimera_BG29_844_G,\r\n\t\t\t\t\tCardIds.MossOfTheSchloss_BG30_111_G,\r\n\t\t\t ].includes(entity.cardId as CardIds)\r\n\t\t\t? 2\r\n\t\t\t: 1;\r\n\t}\r\n\r\n\treturn setImplicitDataForEntity(entity, cardsData);\r\n};\r\n\r\nconst setImplicitDataForEntity = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tentity.cardId = normalizeCardIdForSkin(entity.cardId);\r\n\tentity.maxHealth = Math.max(0, entity.health, entity.maxHealth ?? 0);\r\n\tentity.maxAttack = Math.max(0, entity.attack, entity.maxAttack ?? 0);\r\n\tconst avengeValue = cardsData.avengeValue(entity.cardId);\r\n\tif (avengeValue > 0) {\r\n\t\tentity.avengeCurrent = avengeValue;\r\n\t\tentity.avengeDefault = avengeValue;\r\n\t}\r\n\treturn entity;\r\n};\r\n\r\nexport const normalizeCardIdForSkin = (cardId: string): string => {\r\n\tif (!cardId?.length) {\r\n\t\treturn cardId;\r\n\t}\r\n\tconst skinMatch = cardId.match(/(.*)_SKIN_.*/);\r\n\tif (skinMatch) {\r\n\t\treturn skinMatch[1];\r\n\t}\r\n\treturn cardId;\r\n};\r\n\r\nexport const stringifySimple = (board: readonly BoardEntity[], allCards: AllCardsService = null): string => {\r\n\treturn '[' + board.map((entity) => stringifySimpleCard(entity, allCards)).join(', ') + ']';\r\n};\r\n\r\nexport const stringifySimpleCard = (entity: BoardEntity, allCards: AllCardsService = null): string => {\r\n\treturn entity\r\n\t\t? `${allCards?.getCard(entity.cardId)?.name ?? entity.cardId}/entityId=${entity.entityId}/atk=${\r\n\t\t\t\tentity.attack\r\n\t\t }/hp=${entity.health}/ench=${entity.enchantments?.length}`\r\n\t\t: null;\r\n};\r\n\r\nexport const isFish = (entity: BoardEntity): boolean => {\r\n\treturn (\r\n\t\tentity.cardId.startsWith(CardIds.AvatarOfNzoth_FishOfNzothToken) ||\r\n\t\tentity.cardId.startsWith(CardIds.FishOfNzoth) ||\r\n\t\tentity.additionalCards?.includes(CardIds.DevourerOfSouls_BG_RLK_538)\r\n\t);\r\n};\r\n\r\nexport const isPilotedWhirlOTron = (entity: BoardEntity): boolean => {\r\n\treturn entity.cardId.startsWith(CardIds.PilotedWhirlOTron_BG21_HERO_030_Buddy);\r\n};\r\n\r\nexport const isGolden = (cardId: string, allCards: AllCardsService): boolean => {\r\n\treturn allCards.getCard(cardId).premium;\r\n};\r\n\r\nexport const getPlayerState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.player.player === hero\r\n\t\t? gameState.player\r\n\t\t: gameState.player.teammate?.player === hero\r\n\t\t? gameState.player.teammate\r\n\t\t: gameState.opponent.player === hero\r\n\t\t? gameState.opponent\r\n\t\t: gameState.opponent.teammate?.player === hero\r\n\t\t? gameState.opponent.teammate\r\n\t\t: null;\r\n};\r\n\r\nexport const getTeammateInitialState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.playerInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial.teammate\r\n\t\t: gameState.playerInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial\r\n\t\t: gameState.opponentInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial.teammate\r\n\t\t: gameState.opponentInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial\r\n\t\t: null;\r\n};\r\n\r\nexport const copyEntity = (entity: BoardEntity): BoardEntity => {\r\n\tconst copy: BoardEntity = {\r\n\t\t...entity,\r\n\t\tenchantments: (entity.enchantments ?? []).map((ench) => ({ ...ench })),\r\n\t\tpendingAttackBuffs: [],\r\n\t\trememberedDeathrattles: (entity.rememberedDeathrattles ?? []).map((r) => ({ ...r })),\r\n\t};\r\n\treturn copy;\r\n};\r\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { ALL_BG_RACES, AllCardsService, CardIds, GameTag, Race, ReferenceCard } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from './bgs-player-entity';\r\nimport { BoardEntity } from './board-entity';\r\nimport { BoardSecret } from './board-secret';\r\nimport { hasDefaultCharges } from './cards/card.interface';\r\nimport { CardsData } from './cards/cards-data';\r\nimport { cardMappings } from './cards/impl/_card-mappings';\r\nimport { pickRandom, shuffleArray } from './services/utils';\r\nimport { FullGameState, GameState, PlayerState } from './simulation/internal-game-state';\r\nimport { SharedState } from './simulation/shared-state';\r\nimport { modifyStats } from './simulation/stats';\r\nimport { TempCardIds } from './temp-card-ids';\r\n\r\nconst CLEAVE_IDS = [\r\n\tCardIds.CaveHydra_BG_LOOT_078,\r\n\tCardIds.CaveHydra_TB_BaconUps_151,\r\n\tCardIds.FoeReaper4000_BG_GVG_113,\r\n\tCardIds.FoeReaper4000_TB_BaconUps_153,\r\n\tCardIds.BladeCollector_BG26_817,\r\n\tCardIds.BladeCollector_BG26_817_G,\r\n\tTempCardIds.Ultralisk,\r\n\tTempCardIds.Ultralisk_G,\r\n];\r\nconst ATTACK_IMMEDIATELY_IDS = [\r\n\tCardIds.Scallywag_SkyPirateToken_BGS_061t,\r\n\tCardIds.Scallywag_SkyPirateToken_TB_BaconUps_141t,\r\n\tCardIds.Onyxia_OnyxianWhelpToken,\r\n\tTempCardIds.Interceptor_BG,\r\n\tTempCardIds.Interceptor_BG_G,\r\n\t// The token doesn't attack immediately natively, only when spawned by the spell\r\n\t// See http://replays.firestoneapp.com/?reviewId=8924452a-540a-4324-8306-46900c3f9f35&turn=22&action=38\r\n\t// CardIds.ToxicTumbleweed_TumblingAssassinToken_BG28_641t,\r\n];\r\nconst CANT_ATTACK_IDS = [CardIds.ArcaneCannon_BGS_077, CardIds.ArcaneCannon_TB_BaconUps_128];\r\n\r\nexport const buildSingleBoardEntity = (\r\n\tcardId: string,\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tentityId = 1,\r\n\tspawnReborn = false,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tentityToSpawn: BoardEntity,\r\n\toriginalEntity: BoardEntity = null,\r\n): BoardEntity => {\r\n\tconst card = allCards.getCard(cardId);\r\n\tconst attackImmediately = ATTACK_IMMEDIATELY_IDS.indexOf(cardId as CardIds) !== -1;\r\n\tconst newEntity = !!entityToSpawn\r\n\t\t? ({\r\n\t\t\t\t...entityToSpawn,\r\n\t\t\t\tentityId: sharedState.currentEntityId++,\r\n\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\tavengeCurrent: entityToSpawn.avengeDefault,\r\n\t\t\t\tattacking: false,\r\n\t\t\t\tdamageMultiplier: 1,\r\n\t\t\t\tfrenzyChargesLeft: 1,\r\n\t\t\t\tfriendly: friendly,\r\n\t\t\t\thasAttacked: 0,\r\n\t\t } as BoardEntity)\r\n\t\t: addImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\tentityId: entityId,\r\n\t\t\t\t\tattack: card.attack,\r\n\t\t\t\t\thasAttacked: 0,\r\n\t\t\t\t\tcardId: cardId,\r\n\t\t\t\t\tdivineShield: hasMechanic(card, 'DIVINE_SHIELD'),\r\n\t\t\t\t\thealth: card.health,\r\n\t\t\t\t\tmaxHealth: card.health,\r\n\t\t\t\t\ttaunt: hasMechanic(card, GameTag[GameTag.TAUNT]),\r\n\t\t\t\t\treborn: hasMechanic(card, 'REBORN'),\r\n\t\t\t\t\tpoisonous: hasMechanic(card, GameTag[GameTag.POISONOUS]),\r\n\t\t\t\t\tvenomous: hasMechanic(card, GameTag[GameTag.VENOMOUS]),\r\n\t\t\t\t\tstealth: hasMechanic(card, GameTag[GameTag.STEALTH]),\r\n\t\t\t\t\twindfury: hasMechanic(card, GameTag[GameTag.WINDFURY]),\r\n\t\t\t\t\tenchantments: [],\r\n\t\t\t\t\tpendingAttackBuffs: [],\r\n\t\t\t\t\tfriendly: friendly,\r\n\t\t\t\t\tattackImmediately: attackImmediately,\r\n\t\t\t\t\tavengeCurrent: cardsData.avengeValue(cardId),\r\n\t\t\t\t\tavengeDefault: cardsData.avengeValue(cardId),\r\n\t\t\t\t} as BoardEntity,\r\n\t\t\t\tcardsData,\r\n\t\t );\r\n\r\n\tif (spawnReborn && !entityToSpawn) {\r\n\t\tif (cardId === CardIds.BuildAnUndead_PutricidesCreationToken) {\r\n\t\t\tconst stitchedCardId = !!originalEntity.additionalCards?.length ? originalEntity.additionalCards[0] : null;\r\n\t\t\tif (stitchedCardId) {\r\n\t\t\t\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\t\t\t\tnewEntity.attack = newEntity.attack + stitchedCard.attack;\r\n\t\t\t\tnewEntity.maxHealth = newEntity.maxHealth + stitchedCard.health;\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag[GameTag.TAUNT]);\r\n\t\t\t\tnewEntity.divineShield =\r\n\t\t\t\t\tnewEntity.divineShield || hasMechanic(stitchedCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag[GameTag.POISONOUS]);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag[GameTag.VENOMOUS]);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag[GameTag.WINDFURY]);\r\n\t\t\t\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\t\t\t}\r\n\t\t} else if (\r\n\t\t\tcardId === CardIds.ZilliaxAssembled_BG29_100_G &&\r\n\t\t\t!!originalEntity.additionalCards?.filter((c) => !!c).length\r\n\t\t) {\r\n\t\t\t// In this case, the base stats are still correct (the golden stats of Zilliax), but the keywords\r\n\t\t\t// can change\r\n\t\t\tfor (const moduleCardId of originalEntity.additionalCards) {\r\n\t\t\t\tconst moduleCard = allCards.getCard(moduleCardId);\r\n\t\t\t\tnewEntity.taunt = newEntity.taunt || hasMechanic(moduleCard, GameTag[GameTag.TAUNT]);\r\n\t\t\t\tnewEntity.divineShield =\r\n\t\t\t\t\tnewEntity.divineShield || hasMechanic(moduleCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\t\t\t\tnewEntity.hadDivineShield = newEntity.hadDivineShield || newEntity.divineShield;\r\n\t\t\t\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(moduleCard, GameTag[GameTag.POISONOUS]);\r\n\t\t\t\tnewEntity.venomous = newEntity.venomous || hasMechanic(moduleCard, GameTag[GameTag.VENOMOUS]);\r\n\t\t\t\tnewEntity.windfury = newEntity.windfury || hasMechanic(moduleCard, GameTag[GameTag.WINDFURY]);\r\n\t\t\t\tnewEntity.stealth = newEntity.stealth || hasMechanic(moduleCard, GameTag[GameTag.STEALTH]);\r\n\t\t\t}\r\n\t\t}\r\n\t\tnewEntity.health = 1;\r\n\t\tnewEntity.reborn = false;\r\n\t\tnewEntity.scriptDataNum1 = getScriptDataNum1(cardId, originalEntity);\r\n\r\n\t\t// For ghoul-acabra + reborn\r\n\t\t// newEntity.attack += originalEntity.permanentAttack ?? 0;\r\n\t\t// newEntity.health += originalEntity.permanentHealth ?? 0;\r\n\t}\r\n\r\n\tnewEntity.hadDivineShield = newEntity.divineShield || newEntity.hadDivineShield;\r\n\treturn newEntity;\r\n};\r\n\r\nconst getScriptDataNum1 = (cardId: string, originalEntity: BoardEntity): number => {\r\n\tswitch (cardId) {\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804:\r\n\t\t\treturn 8;\r\n\t\tcase CardIds.OctosariWrapGod_BG26_804_G:\r\n\t\t\treturn 16;\r\n\t\tdefault:\r\n\t\t\treturn 0;\r\n\t}\r\n};\r\n\r\nexport const buildRandomUndeadCreation = (\r\n\tcontrollerHero: BgsPlayerEntity,\r\n\tfriendlyBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tfriendly: boolean,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n): BoardEntity => {\r\n\tconst baseCard = pickRandom(cardsData.putricidePool1);\r\n\tconst newEntity = buildSingleBoardEntity(\r\n\t\tbaseCard,\r\n\t\tcontrollerHero,\r\n\t\tfriendlyBoard,\r\n\t\tallCards,\r\n\t\tfriendly,\r\n\t\tsharedState.currentEntityId++,\r\n\t\tfalse,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tnull,\r\n\t);\r\n\r\n\tconst stitchedCardId =\r\n\t\tbaseCard === CardIds.EternalSummoner_BG25_009\r\n\t\t\t? pickRandom(cardsData.putridicePool2ForEternalSummoner)\r\n\t\t\t: pickRandom(cardsData.putricidePool2);\r\n\tconst stitchedCard = allCards.getCard(stitchedCardId);\r\n\tnewEntity.attack += stitchedCard.attack;\r\n\tnewEntity.health += stitchedCard.health;\r\n\tnewEntity.taunt = newEntity.taunt || hasMechanic(stitchedCard, GameTag[GameTag.TAUNT]);\r\n\tnewEntity.divineShield = newEntity.divineShield || hasMechanic(stitchedCard, GameTag[GameTag.DIVINE_SHIELD]);\r\n\tnewEntity.poisonous = newEntity.poisonous || hasMechanic(stitchedCard, GameTag[GameTag.POISONOUS]);\r\n\tnewEntity.venomous = newEntity.venomous || hasMechanic(stitchedCard, GameTag[GameTag.VENOMOUS]);\r\n\tnewEntity.windfury = newEntity.windfury || hasMechanic(stitchedCard, GameTag[GameTag.WINDFURY]);\r\n\tnewEntity.reborn = newEntity.reborn || hasMechanic(stitchedCard, GameTag[GameTag.REBORN]);\r\n\tnewEntity.avengeCurrent = newEntity.avengeCurrent || cardsData.avengeValue(stitchedCardId);\r\n\tnewEntity.avengeDefault = newEntity.avengeDefault || cardsData.avengeValue(stitchedCardId);\r\n\treturn newEntity;\r\n};\r\n\r\nexport const grantRandomAttack = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tadditionalAttack: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = candidateBoard[Math.floor(Math.random() * candidateBoard.length)];\r\n\t\tmodifyStats(target, additionalAttack, 0, candidateBoard, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantRandomHealth = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst candidateBoard = board\r\n\t\t.filter((e) => !excludeSource || e.entityId !== source.entityId)\r\n\t\t.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tif (candidateBoard.length > 0) {\r\n\t\tconst target = pickRandom(candidateBoard);\r\n\t\tmodifyStats(target, 0, health, board, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantRandomStats = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\trace: Race,\r\n\texcludeSource: boolean,\r\n\tgameState: FullGameState,\r\n): BoardEntity => {\r\n\tif (board.length > 0) {\r\n\t\tconst target: BoardEntity = getRandomAliveMinion(\r\n\t\t\tboard.filter((e) => !!e.cardId).filter((e) => (excludeSource ? e.entityId !== source.entityId : true)),\r\n\t\t\thero,\r\n\t\t\trace,\r\n\t\t\tgameState.allCards,\r\n\t\t);\r\n\t\tif (target) {\r\n\t\t\tmodifyStats(target, attack, health, board, hero, gameState);\r\n\t\t\tif (gameState.spectator) {\r\n\t\t\t\tgameState.spectator.registerPowerTarget(source, target, board, null, null);\r\n\t\t\t}\r\n\t\t\treturn target;\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const getRandomAliveMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, allCards))\r\n\t\t.filter((e) => e?.health > 0 && !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomRevivableMinion = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\trace: Race,\r\n\tallCards: AllCardsService,\r\n): BoardEntity => {\r\n\tconst validTribes = board\r\n\t\t.filter((e) => !race || hasCorrectTribe(e, hero, race, allCards))\r\n\t\t.filter((e) => !e.definitelyDead);\r\n\tif (!validTribes.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst randomIndex = Math.floor(Math.random() * validTribes.length);\r\n\treturn validTribes[randomIndex];\r\n};\r\n\r\nexport const getRandomMinionWithHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tif (!board.length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst highestHealth = Math.max(...board.map((e) => e.health));\r\n\tconst validMinions = board.filter((e) => e.health === highestHealth);\r\n\treturn validMinions[Math.floor(Math.random() * validMinions.length)];\r\n};\r\n\r\n/**\r\n * Only use if the full board gets the stats, or if you're able to filter use the tribe param.\r\n * Otherwise some minions will be missing when applying onStatsUpdate effects\r\n */\r\nexport const addStatsToBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\t// permanentUpgrade = false,\r\n): void => {\r\n\tfor (const entity of board) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.allCards)) {\r\n\t\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\t\tgameState.spectator?.registerPowerTarget(sourceEntity, entity, board, null, null);\r\n\t\t\t// if (permanentUpgrade) {\r\n\t\t\t// \tentity.permanentAttack = (entity.permanentAttack ?? 0) + attack;\r\n\t\t\t// \tentity.permanentHealth = (entity.permanentHealth ?? 0) + health;\r\n\t\t\t// }\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const addStatsToAliveBoard = (\r\n\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\ttribe?: string,\r\n\t// permanentUpgrade = false,\r\n): void => {\r\n\tfor (const entity of board.filter((e) => e.health > 0 && !e.definitelyDead)) {\r\n\t\tif (!tribe || hasCorrectTribe(entity, hero, Race[tribe], gameState.allCards)) {\r\n\t\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\t\tgameState.spectator?.registerPowerTarget(sourceEntity, entity, board, null, null);\r\n\t\t\t// if (permanentUpgrade) {\r\n\t\t\t// \tentity.permanentAttack = (entity.permanentAttack ?? 0) + attack;\r\n\t\t\t// \tentity.permanentHealth = (entity.permanentHealth ?? 0) + health;\r\n\t\t\t// }\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const grantStatsToMinionsOfEachType = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tattack: number,\r\n\thealth: number,\r\n\tgameState: FullGameState,\r\n\tnumberOfDifferentTypes = 99,\r\n\tcanRevive = true,\r\n): void => {\r\n\tconst minionsToBuff = getMinionsOfDifferentTypes(board, hero, gameState, canRevive, numberOfDifferentTypes);\r\n\tfor (const entity of minionsToBuff) {\r\n\t\tmodifyStats(entity, attack, health, board, hero, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, entity, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const getMinionsOfDifferentTypes = (\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcanRevive = true,\r\n\tnumberOfDifferentTypes = 99,\r\n): BoardEntity[] => {\r\n\tconst result: BoardEntity[] = [];\r\n\tif (board.length > 0) {\r\n\t\tlet boardCopy = board.filter(\r\n\t\t\t(e) => !getEffectiveTribesForEntity(e, hero, gameState.allCards)?.includes(Race.ALL),\r\n\t\t);\r\n\t\tconst allRaces = shuffleArray(ALL_BG_RACES);\r\n\t\tlet typesBuffed = 0;\r\n\t\tconst racesProcessed = [];\r\n\t\tfor (let i = 1; i <= 2; i++) {\r\n\t\t\tfor (const tribe of allRaces) {\r\n\t\t\t\tconst minionsWithRaces = boardCopy\r\n\t\t\t\t\t.filter((e) => getEffectiveTribesForEntity(e, hero, gameState.allCards).length === i)\r\n\t\t\t\t\t.filter((e) =>\r\n\t\t\t\t\t\tgetEffectiveTribesForEntity(e, hero, gameState.allCards).some(\r\n\t\t\t\t\t\t\t(r) => !racesProcessed.includes(Race[r]),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t);\r\n\t\t\t\tif (typesBuffed >= numberOfDifferentTypes) {\r\n\t\t\t\t\treturn result;\r\n\t\t\t\t}\r\n\t\t\t\tconst validMinion: BoardEntity = canRevive\r\n\t\t\t\t\t? getRandomRevivableMinion(minionsWithRaces, hero, tribe, gameState.allCards)\r\n\t\t\t\t\t: getRandomAliveMinion(minionsWithRaces, hero, tribe, gameState.allCards);\r\n\t\t\t\tif (validMinion) {\r\n\t\t\t\t\tresult.push(validMinion);\r\n\t\t\t\t\tboardCopy = boardCopy.filter((e) => e !== validMinion);\r\n\t\t\t\t\ttypesBuffed++;\r\n\t\t\t\t\tracesProcessed.push(tribe);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tresult.push(\r\n\t\t\t...board.filter((e) => {\r\n\t\t\t\tconst effectiveTribes = getEffectiveTribesForEntity(e, hero, gameState.allCards);\r\n\t\t\t\treturn effectiveTribes?.includes(Race.ALL);\r\n\t\t\t}),\r\n\t\t);\r\n\t}\r\n\treturn result;\r\n};\r\n\r\nexport const hasMechanic = (card: ReferenceCard, mechanic: string): boolean => {\r\n\treturn card.mechanics?.includes(mechanic);\r\n};\r\n\r\nexport const hasCorrectTribe = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\ttargetTribe: Race,\r\n\tallCards: AllCardsService,\r\n): boolean => {\r\n\tconst effectiveTribesForEntity = getEffectiveTribesForEntity(entity, playerEntity, allCards);\r\n\treturn (\r\n\t\teffectiveTribesForEntity.length > 0 &&\r\n\t\t(effectiveTribesForEntity.includes(targetTribe) || effectiveTribesForEntity.includes(Race.ALL))\r\n\t);\r\n};\r\n\r\nexport const getEffectiveTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\treturn [\r\n\t\t...(allCards.getCard(entity.cardId).races?.map((r) => Race[r]) ?? []),\r\n\t\t...getSpecialTribesForEntity(entity, playerEntity, allCards),\r\n\t];\r\n};\r\n\r\nconst getSpecialTribesForEntity = (\r\n\tentity: BoardEntity,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n): readonly Race[] => {\r\n\tswitch (entity.cardId) {\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013:\r\n\t\tcase CardIds.WhelpSmuggler_BG21_013_G:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.SmugglerPortrait_BG30_MagicItem_825)\r\n\t\t\t\t? [Race.DRAGON]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.LightfangEnforcer_BGS_009:\r\n\t\tcase CardIds.LightfangEnforcer_TB_BaconUps_082:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.EnforcerPortrait_BG30_MagicItem_971)\r\n\t\t\t\t? [Race.ALL]\r\n\t\t\t\t: [];\r\n\t\tcase CardIds.BrannBronzebeard_BG_LOE_077:\r\n\t\tcase CardIds.BrannBronzebeard_TB_BaconUps_045:\r\n\t\t\treturn playerEntity.trinkets.some((t) => t.cardId === CardIds.BronzebeardPortrait_BG30_MagicItem_418)\r\n\t\t\t\t? [Race.DRAGON, Race.MURLOC]\r\n\t\t\t\t: [];\r\n\t}\r\n\treturn [];\r\n};\r\n\r\n/** @deprecated use hasCorreectTribe instead */\r\nexport const isCorrectTribe = (cardRaces: readonly string[], targetTribe: Race): boolean => {\r\n\tif (!cardRaces?.length) {\r\n\t\treturn false;\r\n\t}\r\n\treturn cardRaces\r\n\t\t.map((cardRace) => getRaceEnum(cardRace))\r\n\t\t.some((raceEnum) => raceEnum === Race.ALL || raceEnum === targetTribe);\r\n};\r\n\r\nexport const getRaceEnum = (race: string): Race => {\r\n\treturn Race[race];\r\n};\r\n\r\nexport const addImpliedMechanics = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tconst cleave = CLEAVE_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tconst cantAttack = CANT_ATTACK_IDS.indexOf(entity.cardId as CardIds) !== -1;\r\n\tentity.cleave = cleave;\r\n\tentity.cantAttack = cantAttack;\r\n\tentity.divineShield = entity.divineShield || entity.hadDivineShield;\r\n\tentity.immuneWhenAttackCharges = [\r\n\t\tCardIds.Warpwing_BG24_004,\r\n\t\tCardIds.Warpwing_BG24_004_G,\r\n\t\tTempCardIds.Viper,\r\n\t\tTempCardIds.Viper_G,\r\n\t].includes(entity.cardId as CardIds)\r\n\t\t? 99999\r\n\t\t: null;\r\n\tentity.frenzyChargesLeft =\r\n\t\tentity.cardId === CardIds.BristlebackKnight_BG20_204_G\r\n\t\t\t? 2\r\n\t\t\t: entity.cardId === CardIds.BristlebackKnight_BG20_204\r\n\t\t\t? 1\r\n\t\t\t: 0;\r\n\t// It's not an issue adding a charge for entities without a special ability\r\n\tconst defaultChargesImpl = cardMappings[entity.cardId];\r\n\tif (hasDefaultCharges(defaultChargesImpl)) {\r\n\t\tentity.abiityChargesLeft = defaultChargesImpl.defaultCharges(entity);\r\n\t} else {\r\n\t\tentity.abiityChargesLeft = [\r\n\t\t\tCardIds.MarineMatriarch_BG29_610,\r\n\t\t\tCardIds.MarineMatriarch_BG29_610_G,\r\n\t\t\tCardIds.SoftHeartedSiren_BG26_590,\r\n\t\t\tCardIds.SoftHeartedSiren_BG26_590_G,\r\n\t\t\tCardIds.LongJohnCopper_BG29_831,\r\n\t\t\tCardIds.LongJohnCopper_BG29_831_G,\r\n\t\t\tCardIds.BristlingBuffoon_BG29_160,\r\n\t\t\tCardIds.BristlingBuffoon_BG29_160_G,\r\n\t\t].includes(entity.cardId as CardIds)\r\n\t\t\t? 3\r\n\t\t\t: [\r\n\t\t\t\t\tCardIds.Mannoroth_BG27_507_G,\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\t\tCardIds.MadMatador_BG28_404_G,\r\n\t\t\t\t\tCardIds.WingedChimera_BG29_844,\r\n\t\t\t\t\tCardIds.WingedChimera_BG29_844_G,\r\n\t\t\t\t\tCardIds.MossOfTheSchloss_BG30_111_G,\r\n\t\t\t ].includes(entity.cardId as CardIds)\r\n\t\t\t? 2\r\n\t\t\t: 1;\r\n\t}\r\n\r\n\treturn setImplicitDataForEntity(entity, cardsData);\r\n};\r\n\r\nconst setImplicitDataForEntity = (entity: BoardEntity, cardsData: CardsData): BoardEntity => {\r\n\tentity.cardId = normalizeCardIdForSkin(entity.cardId);\r\n\tentity.maxHealth = Math.max(0, entity.health, entity.maxHealth ?? 0);\r\n\tentity.maxAttack = Math.max(0, entity.attack, entity.maxAttack ?? 0);\r\n\tconst avengeValue = cardsData.avengeValue(entity.cardId);\r\n\tif (avengeValue > 0) {\r\n\t\tentity.avengeCurrent = avengeValue;\r\n\t\tentity.avengeDefault = avengeValue;\r\n\t}\r\n\treturn entity;\r\n};\r\n\r\nexport const normalizeCardIdForSkin = (cardId: string): string => {\r\n\tif (!cardId?.length) {\r\n\t\treturn cardId;\r\n\t}\r\n\tconst skinMatch = cardId.match(/(.*)_SKIN_.*/);\r\n\tif (skinMatch) {\r\n\t\treturn skinMatch[1];\r\n\t}\r\n\treturn cardId;\r\n};\r\n\r\nexport const stringifySimple = (board: readonly BoardEntity[], allCards: AllCardsService = null): string => {\r\n\treturn '[' + board.map((entity) => stringifySimpleCard(entity, allCards)).join(', ') + ']';\r\n};\r\n\r\nexport const stringifySimpleCard = (entity: BoardEntity, allCards: AllCardsService = null): string => {\r\n\treturn entity\r\n\t\t? `${allCards?.getCard(entity.cardId)?.name ?? entity.cardId}/entityId=${entity.entityId}/atk=${\r\n\t\t\t\tentity.attack\r\n\t\t }/hp=${entity.health}/ench=${entity.enchantments?.length}`\r\n\t\t: null;\r\n};\r\n\r\nexport const isFish = (entity: BoardEntity): boolean => {\r\n\treturn (\r\n\t\tentity.cardId.startsWith(CardIds.AvatarOfNzoth_FishOfNzothToken) ||\r\n\t\tentity.cardId.startsWith(CardIds.FishOfNzoth) ||\r\n\t\tentity.additionalCards?.includes(CardIds.DevourerOfSouls_BG_RLK_538)\r\n\t);\r\n};\r\n\r\nexport const isPilotedWhirlOTron = (entity: BoardEntity): boolean => {\r\n\treturn entity.cardId.startsWith(CardIds.PilotedWhirlOTron_BG21_HERO_030_Buddy);\r\n};\r\n\r\nexport const isGolden = (cardId: string, allCards: AllCardsService): boolean => {\r\n\treturn allCards.getCard(cardId).premium;\r\n};\r\n\r\nexport const getPlayerState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.player.player === hero\r\n\t\t? gameState.player\r\n\t\t: gameState.player.teammate?.player === hero\r\n\t\t? gameState.player.teammate\r\n\t\t: gameState.opponent.player === hero\r\n\t\t? gameState.opponent\r\n\t\t: gameState.opponent.teammate?.player === hero\r\n\t\t? gameState.opponent.teammate\r\n\t\t: null;\r\n};\r\n\r\nexport const getTeammateInitialState = (gameState: GameState, hero: BgsPlayerEntity): PlayerState => {\r\n\treturn gameState.playerInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial.teammate\r\n\t\t: gameState.playerInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.playerInitial\r\n\t\t: gameState.opponentInitial.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial.teammate\r\n\t\t: gameState.opponentInitial.teammate?.player?.entityId === hero?.entityId\r\n\t\t? gameState.opponentInitial\r\n\t\t: null;\r\n};\r\n\r\nexport const copyEntity = (entity: BoardEntity): BoardEntity => {\r\n\tconst copy: BoardEntity = {\r\n\t\t...entity,\r\n\t\tenchantments: (entity.enchantments ?? []).map((ench) => ({ ...ench })),\r\n\t\tpendingAttackBuffs: [],\r\n\t\trememberedDeathrattles: (entity.rememberedDeathrattles ?? []).map((r) => ({ ...r })),\r\n\t};\r\n\treturn copy;\r\n};\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@firestone-hs/simulate-bgs-battle",
3
- "version": "1.1.530",
3
+ "version": "1.1.531",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "lint": "eslint --color --fix --ext .ts .",
@@ -25,7 +25,7 @@
25
25
  ],
26
26
  "dependencies": {
27
27
  "@firestone-hs/hs-replay-xml-parser": "0.0.46",
28
- "@firestone-hs/reference-data": "^2.0.92"
28
+ "@firestone-hs/reference-data": "^2.0.105"
29
29
  },
30
30
  "devDependencies": {
31
31
  "@types/aws-lambda": "8.10.31",