@firestone-hs/simulate-bgs-battle 1.1.692 → 1.1.694

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 (73) hide show
  1. package/dist/bgs-battle-info.d.ts +1 -1
  2. package/dist/bgs-battle-info.js.map +1 -1
  3. package/dist/cards/card.interface.d.ts +5 -1
  4. package/dist/cards/card.interface.js +3 -1
  5. package/dist/cards/card.interface.js.map +1 -1
  6. package/dist/cards/cards-data.d.ts +1 -1
  7. package/dist/cards/cards-data.js +16 -1
  8. package/dist/cards/cards-data.js.map +1 -1
  9. package/dist/cards/impl/_card-mappings.js +4 -0
  10. package/dist/cards/impl/_card-mappings.js.map +1 -1
  11. package/dist/cards/impl/minion/apexis-guardian.js +8 -2
  12. package/dist/cards/impl/minion/apexis-guardian.js.map +1 -1
  13. package/dist/cards/impl/minion/blue-volumizer.js +3 -1
  14. package/dist/cards/impl/minion/blue-volumizer.js.map +1 -1
  15. package/dist/cards/impl/minion/gleaming-trader.js +5 -3
  16. package/dist/cards/impl/minion/gleaming-trader.js.map +1 -1
  17. package/dist/cards/impl/minion/grease-bot.js +4 -2
  18. package/dist/cards/impl/minion/grease-bot.js.map +1 -1
  19. package/dist/cards/impl/minion/green-volumizer.js +3 -1
  20. package/dist/cards/impl/minion/green-volumizer.js.map +1 -1
  21. package/dist/cards/impl/minion/icesnarl-the-mighty.d.ts +2 -0
  22. package/dist/cards/impl/minion/icesnarl-the-mighty.js +15 -0
  23. package/dist/cards/impl/minion/icesnarl-the-mighty.js.map +1 -0
  24. package/dist/cards/impl/minion/polarizing-beatboxer.d.ts +2 -0
  25. package/dist/cards/impl/minion/polarizing-beatboxer.js +18 -0
  26. package/dist/cards/impl/minion/polarizing-beatboxer.js.map +1 -0
  27. package/dist/cards/impl/minion/red-volumizer.js +3 -1
  28. package/dist/cards/impl/minion/red-volumizer.js.map +1 -1
  29. package/dist/cards/impl/minion/stalwart-kodo.d.ts +2 -2
  30. package/dist/cards/impl/minion/stalwart-kodo.js +1 -1
  31. package/dist/cards/impl/minion/stalwart-kodo.js.map +1 -1
  32. package/dist/cards/impl/minion/timewarped-ghoul-acabra.js +1 -1
  33. package/dist/cards/impl/minion/timewarped-ghoul-acabra.js.map +1 -1
  34. package/dist/cards/impl/minion/timewarped-goldrinn.js +2 -2
  35. package/dist/cards/impl/minion/timewarped-goldrinn.js.map +1 -1
  36. package/dist/cards/impl/minion/timewarped-grease-bot.js +4 -2
  37. package/dist/cards/impl/minion/timewarped-grease-bot.js.map +1 -1
  38. package/dist/cards/impl/minion/timewarped-hooktail.js +4 -2
  39. package/dist/cards/impl/minion/timewarped-hooktail.js.map +1 -1
  40. package/dist/cards/impl/minion/timewarped-hyena.js +1 -1
  41. package/dist/cards/impl/minion/timewarped-hyena.js.map +1 -1
  42. package/dist/cards/impl/minion/timewarped-murcules.js +1 -1
  43. package/dist/cards/impl/minion/timewarped-murcules.js.map +1 -1
  44. package/dist/cards/impl/minion/timewarped-primscale.js +1 -1
  45. package/dist/cards/impl/minion/timewarped-primscale.js.map +1 -1
  46. package/dist/cards/impl/minion/timewarped-probius.d.ts +2 -2
  47. package/dist/cards/impl/minion/timewarped-probius.js +1 -1
  48. package/dist/cards/impl/minion/timewarped-probius.js.map +1 -1
  49. package/dist/cards/impl/minion/timewarped-wargear.d.ts +2 -2
  50. package/dist/cards/impl/minion/timewarped-wargear.js +1 -1
  51. package/dist/cards/impl/minion/timewarped-wargear.js.map +1 -1
  52. package/dist/cards/impl/trinket/divine-signet.js +1 -1
  53. package/dist/cards/impl/trinket/divine-signet.js.map +1 -1
  54. package/dist/debug-state.d.ts +2 -0
  55. package/dist/debug-state.js.map +1 -1
  56. package/dist/keywords/divine-shield.js +32 -28
  57. package/dist/keywords/divine-shield.js.map +1 -1
  58. package/dist/services/utils.js +3 -1
  59. package/dist/services/utils.js.map +1 -1
  60. package/dist/simulate-bgs-battle.js +6 -8
  61. package/dist/simulate-bgs-battle.js.map +1 -1
  62. package/dist/simulation/add-minion-to-board.d.ts +2 -2
  63. package/dist/simulation/add-minion-to-board.js +3 -12
  64. package/dist/simulation/add-minion-to-board.js.map +1 -1
  65. package/dist/simulation/attack.js.map +1 -1
  66. package/dist/simulation/deathrattle-effects.js +0 -8
  67. package/dist/simulation/deathrattle-effects.js.map +1 -1
  68. package/dist/simulation/magnetize.d.ts +3 -1
  69. package/dist/simulation/magnetize.js +22 -5
  70. package/dist/simulation/magnetize.js.map +1 -1
  71. package/dist/simulation/spawns.js +2 -1
  72. package/dist/simulation/spawns.js.map +1 -1
  73. package/package.json +1 -1
@@ -6,7 +6,7 @@ exports.TimewarpedGhoulAcabra = {
6
6
  cardIds: ["BG34_Giant_609", "BG34_Giant_609_G"],
7
7
  onDeathrattleTriggered: (minion, input) => {
8
8
  const mult = minion.cardId === "BG34_Giant_609_G" ? 2 : 1;
9
- (0, utils_1.addStatsToBoard)(minion, input.boardWithDeadEntity, input.boardWithDeadEntityHero, 2 * mult, 2 * mult, input.gameState);
9
+ (0, utils_1.addStatsToBoard)(minion, input.boardWithDeadEntity, input.boardWithDeadEntityHero, 3 * mult, 2 * mult, input.gameState);
10
10
  },
11
11
  };
12
12
  //# sourceMappingURL=timewarped-ghoul-acabra.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-ghoul-acabra.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-ghoul-acabra.ts"],"names":[],"mappings":";;;AAGA,0CAAiD;AAGpC,QAAA,qBAAqB,GAA6B;IAC9D,OAAO,EAAE,sCAA8F;IACvG,sBAAsB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QACjF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAmD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,CAAC,GAAG,IAAI,EACR,CAAC,GAAG,IAAI,EACR,KAAK,CAAC,SAAS,CACf,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { DeathrattleTriggeredCard } from '../../card.interface';\r\n\r\nexport const TimewarpedGhoulAcabra: DeathrattleTriggeredCard = {\r\n\tcardIds: [CardIds.TimewarpedGhoulAcabra_BG34_Giant_609, CardIds.TimewarpedGhoulAcabra_BG34_Giant_609_G],\r\n\tonDeathrattleTriggered: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedGhoulAcabra_BG34_Giant_609_G ? 2 : 1;\r\n\t\taddStatsToBoard(\r\n\t\t\tminion,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t2 * mult,\r\n\t\t\t2 * mult,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-ghoul-acabra.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-ghoul-acabra.ts"],"names":[],"mappings":";;;AAGA,0CAAiD;AAGpC,QAAA,qBAAqB,GAA6B;IAC9D,OAAO,EAAE,sCAA8F;IACvG,sBAAsB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QACjF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAmD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,CAAC,GAAG,IAAI,EACR,CAAC,GAAG,IAAI,EACR,KAAK,CAAC,SAAS,CACf,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { DeathrattleTriggeredCard } from '../../card.interface';\r\n\r\nexport const TimewarpedGhoulAcabra: DeathrattleTriggeredCard = {\r\n\tcardIds: [CardIds.TimewarpedGhoulAcabra_BG34_Giant_609, CardIds.TimewarpedGhoulAcabra_BG34_Giant_609_G],\r\n\tonDeathrattleTriggered: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedGhoulAcabra_BG34_Giant_609_G ? 2 : 1;\r\n\t\taddStatsToBoard(\r\n\t\t\tminion,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t3 * mult,\r\n\t\t\t2 * mult,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
@@ -7,8 +7,8 @@ exports.TimewarpedGoldrinn = {
7
7
  cardIds: ["BG34_Giant_362", "BG34_Giant_362_G"],
8
8
  deathrattleSpawn: (minion, input) => {
9
9
  const mult = minion.cardId === "BG34_Giant_362_G" ? 2 : 1;
10
- const goldrinnAttackBuff = 3 * mult;
11
- const goldrinnHealthBuff = 3 * mult;
10
+ const goldrinnAttackBuff = 4 * mult;
11
+ const goldrinnHealthBuff = 4 * mult;
12
12
  (0, utils_1.addStatsToBoard)(minion, input.boardWithDeadEntity, input.boardWithDeadEntityHero, goldrinnAttackBuff, goldrinnHealthBuff, input.gameState, reference_data_1.Race[reference_data_1.Race.BEAST]);
13
13
  input.boardWithDeadEntityHero.globalInfo.GoldrinnBuffAtk += goldrinnAttackBuff;
14
14
  input.boardWithDeadEntityHero.globalInfo.GoldrinnBuffHealth += goldrinnHealthBuff;
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-goldrinn.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-goldrinn.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,0CAAiD;AAGpC,QAAA,kBAAkB,GAAyB;IACvD,OAAO,EAAE,sCAAwF;IACjG,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC;QACpC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC;QACpC,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,CAAC,SAAS,EACf,qBAAI,CAAC,qBAAI,CAAC,KAAK,CAAC,CAChB,CAAC;QACF,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,eAAe,IAAI,kBAAkB,CAAC;QAC/E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,kBAAkB,IAAI,kBAAkB,CAAC;QAClF,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nexport const TimewarpedGoldrinn: DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.TimewarpedGoldrinn_BG34_Giant_362, CardIds.TimewarpedGoldrinn_BG34_Giant_362_G],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedGoldrinn_BG34_Giant_362_G ? 2 : 1;\r\n\t\tconst goldrinnAttackBuff = 3 * mult;\r\n\t\tconst goldrinnHealthBuff = 3 * mult;\r\n\t\taddStatsToBoard(\r\n\t\t\tminion,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\tgoldrinnAttackBuff,\r\n\t\t\tgoldrinnHealthBuff,\r\n\t\t\tinput.gameState,\r\n\t\t\tRace[Race.BEAST],\r\n\t\t);\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.GoldrinnBuffAtk += goldrinnAttackBuff;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.GoldrinnBuffHealth += goldrinnHealthBuff;\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-goldrinn.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-goldrinn.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,0CAAiD;AAGpC,QAAA,kBAAkB,GAAyB;IACvD,OAAO,EAAE,sCAAwF;IACjG,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC;QACpC,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,CAAC;QACpC,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,CAAC,SAAS,EACf,qBAAI,CAAC,qBAAI,CAAC,KAAK,CAAC,CAChB,CAAC;QACF,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,eAAe,IAAI,kBAAkB,CAAC;QAC/E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,kBAAkB,IAAI,kBAAkB,CAAC;QAClF,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nexport const TimewarpedGoldrinn: DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.TimewarpedGoldrinn_BG34_Giant_362, CardIds.TimewarpedGoldrinn_BG34_Giant_362_G],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedGoldrinn_BG34_Giant_362_G ? 2 : 1;\r\n\t\tconst goldrinnAttackBuff = 4 * mult;\r\n\t\tconst goldrinnHealthBuff = 4 * mult;\r\n\t\taddStatsToBoard(\r\n\t\t\tminion,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\tgoldrinnAttackBuff,\r\n\t\t\tgoldrinnHealthBuff,\r\n\t\t\tinput.gameState,\r\n\t\t\tRace[Race.BEAST],\r\n\t\t);\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.GoldrinnBuffAtk += goldrinnAttackBuff;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.GoldrinnBuffHealth += goldrinnHealthBuff;\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
@@ -5,8 +5,10 @@ const utils_1 = require("../../../utils");
5
5
  exports.TimewarpedGreaseBot = {
6
6
  cardIds: ["BG34_Giant_656", "BG34_Giant_656_G"],
7
7
  onDivineShieldUpdated: (minion, input) => {
8
- const mult = minion.cardId === "BG34_Giant_656_G" ? 2 : 1;
9
- (0, utils_1.addStatsToBoard)(input.target, input.board, input.hero, 2 * mult, 2 * mult, input.gameState);
8
+ if (!input.newValue) {
9
+ const mult = minion.cardId === "BG34_Giant_656_G" ? 2 : 1;
10
+ (0, utils_1.addStatsToBoard)(input.target, input.board, input.hero, 3 * mult, 3 * mult, input.gameState);
11
+ }
10
12
  },
11
13
  };
12
14
  //# sourceMappingURL=timewarped-grease-bot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-grease-bot.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-grease-bot.ts"],"names":[],"mappings":";;;AAGA,0CAAiD;AAGpC,QAAA,mBAAmB,GAA8B;IAC7D,OAAO,EAAE,sCAA0F;IACnG,qBAAqB,EAAE,CAAC,MAAmB,EAAE,KAAiC,EAAE,EAAE;QACjF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAiD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,IAAA,uBAAe,EAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7F,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { OnDivineShieldUpdatedInput } from '../../../keywords/divine-shield';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { OnDivineShieldUpdatedCard } from '../../card.interface';\r\n\r\nexport const TimewarpedGreaseBot: OnDivineShieldUpdatedCard = {\r\n\tcardIds: [CardIds.TimewarpedGreaseBot_BG34_Giant_656, CardIds.TimewarpedGreaseBot_BG34_Giant_656_G],\r\n\tonDivineShieldUpdated: (minion: BoardEntity, input: OnDivineShieldUpdatedInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedGreaseBot_BG34_Giant_656_G ? 2 : 1;\r\n\t\taddStatsToBoard(input.target, input.board, input.hero, 2 * mult, 2 * mult, input.gameState);\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-grease-bot.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-grease-bot.ts"],"names":[],"mappings":";;;AAGA,0CAAiD;AAGpC,QAAA,mBAAmB,GAA8B;IAC7D,OAAO,EAAE,sCAA0F;IACnG,qBAAqB,EAAE,CAAC,MAAmB,EAAE,KAAiC,EAAE,EAAE;QACjF,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACpB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAiD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpF,IAAA,uBAAe,EAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC5F;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { OnDivineShieldUpdatedInput } from '../../../keywords/divine-shield';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { OnDivineShieldUpdatedCard } from '../../card.interface';\r\n\r\nexport const TimewarpedGreaseBot: OnDivineShieldUpdatedCard = {\r\n\tcardIds: [CardIds.TimewarpedGreaseBot_BG34_Giant_656, CardIds.TimewarpedGreaseBot_BG34_Giant_656_G],\r\n\tonDivineShieldUpdated: (minion: BoardEntity, input: OnDivineShieldUpdatedInput) => {\r\n\t\tif (!input.newValue) {\r\n\t\t\tconst mult = minion.cardId === CardIds.TimewarpedGreaseBot_BG34_Giant_656_G ? 2 : 1;\r\n\t\t\taddStatsToBoard(input.target, input.board, input.hero, 3 * mult, 3 * mult, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -5,8 +5,10 @@ const utils_1 = require("../../../utils");
5
5
  exports.TimewarpedHootail = {
6
6
  cardIds: ["BG34_Giant_015", "BG34_Giant_015_G"],
7
7
  onTavernSpellCast: (entity, input) => {
8
- const mult = entity.cardId === "BG34_Giant_015_G" ? 2 : 1;
9
- (0, utils_1.addStatsToBoard)(entity, input.board, input.hero, 2 * mult, 2 * mult, input.gameState);
8
+ const loops = entity.cardId === "BG34_Giant_015_G" ? 2 : 1;
9
+ for (let i = 0; i < loops; i++) {
10
+ (0, utils_1.addStatsToBoard)(entity, input.board, input.hero, 2, 2, input.gameState);
11
+ }
10
12
  },
11
13
  };
12
14
  //# sourceMappingURL=timewarped-hooktail.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-hooktail.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-hooktail.ts"],"names":[],"mappings":";;;AAEA,0CAAiD;AAGpC,QAAA,iBAAiB,GAA0B;IACvD,OAAO,EAAE,sCAAwF;IACjG,iBAAiB,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,IAAA,uBAAe,EAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACvF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { CastSpellInput, OnTavernSpellCastCard } from '../../card.interface';\r\n\r\nexport const TimewarpedHootail: OnTavernSpellCastCard = {\r\n\tcardIds: [CardIds.TimewarpedHooktail_BG34_Giant_015, CardIds.TimewarpedHooktail_BG34_Giant_015_G],\r\n\tonTavernSpellCast: (entity: BoardEntity, input: CastSpellInput) => {\r\n\t\tconst mult = entity.cardId === CardIds.TimewarpedHooktail_BG34_Giant_015_G ? 2 : 1;\r\n\t\taddStatsToBoard(entity, input.board, input.hero, 2 * mult, 2 * mult, input.gameState);\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-hooktail.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-hooktail.ts"],"names":[],"mappings":";;;AAEA,0CAAiD;AAGpC,QAAA,iBAAiB,GAA0B;IACvD,OAAO,EAAE,sCAAwF;IACjG,iBAAiB,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACjE,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC/B,IAAA,uBAAe,EAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACxE;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { addStatsToBoard } from '../../../utils';\r\nimport { CastSpellInput, OnTavernSpellCastCard } from '../../card.interface';\r\n\r\nexport const TimewarpedHootail: OnTavernSpellCastCard = {\r\n\tcardIds: [CardIds.TimewarpedHooktail_BG34_Giant_015, CardIds.TimewarpedHooktail_BG34_Giant_015_G],\r\n\tonTavernSpellCast: (entity: BoardEntity, input: CastSpellInput) => {\r\n\t\tconst loops = entity.cardId === CardIds.TimewarpedHooktail_BG34_Giant_015_G ? 2 : 1;\r\n\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\taddStatsToBoard(entity, input.board, input.hero, 2, 2, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -10,7 +10,7 @@ exports.TimewarpedHyena = {
10
10
  const mult = minion.cardId === "BG34_Giant_581_G" ? 2 : 1;
11
11
  for (const deadEntity of input.deadEntities) {
12
12
  if ((0, utils_1.hasCorrectTribe)(deadEntity, input.hero, reference_data_1.Race.BEAST, input.gameState.anomalies, input.gameState.allCards)) {
13
- (0, stats_1.modifyStats)(minion, minion, 2 * mult, 1 * mult, input.board, input.hero, input.gameState);
13
+ (0, stats_1.modifyStats)(minion, minion, 2 * mult, 2 * mult, input.board, input.hero, input.gameState);
14
14
  }
15
15
  }
16
16
  },
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-hyena.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-hyena.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qDAAwD;AACxD,0CAAiD;AAGpC,QAAA,eAAe,GAAqB;IAChD,OAAO,EAAE,sCAAkF;IAC3F,YAAY,EAAE,CAAC,MAAmB,EAAE,KAAwB,EAAE,EAAE;QAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA6C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,YAAY,EAAE;YAC5C,IACC,IAAA,uBAAe,EAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EACvG;gBACD,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;aAC1F;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterDeathInput } from '../../../simulation/attack';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { OnAfterDeathCard } from '../../card.interface';\r\n\r\nexport const TimewarpedHyena: OnAfterDeathCard = {\r\n\tcardIds: [CardIds.TimewarpedHyena_BG34_Giant_581, CardIds.TimewarpedHyena_BG34_Giant_581_G],\r\n\tonAfterDeath: (minion: BoardEntity, input: OnAfterDeathInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedHyena_BG34_Giant_581_G ? 2 : 1;\r\n\t\tfor (const deadEntity of input.deadEntities) {\r\n\t\t\tif (\r\n\t\t\t\thasCorrectTribe(deadEntity, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards)\r\n\t\t\t) {\r\n\t\t\t\tmodifyStats(minion, minion, 2 * mult, 1 * mult, input.board, input.hero, input.gameState);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-hyena.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-hyena.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qDAAwD;AACxD,0CAAiD;AAGpC,QAAA,eAAe,GAAqB;IAChD,OAAO,EAAE,sCAAkF;IAC3F,YAAY,EAAE,CAAC,MAAmB,EAAE,KAAwB,EAAE,EAAE;QAC/D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA6C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,YAAY,EAAE;YAC5C,IACC,IAAA,uBAAe,EAAC,UAAU,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EACvG;gBACD,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;aAC1F;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterDeathInput } from '../../../simulation/attack';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { OnAfterDeathCard } from '../../card.interface';\r\n\r\nexport const TimewarpedHyena: OnAfterDeathCard = {\r\n\tcardIds: [CardIds.TimewarpedHyena_BG34_Giant_581, CardIds.TimewarpedHyena_BG34_Giant_581_G],\r\n\tonAfterDeath: (minion: BoardEntity, input: OnAfterDeathInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedHyena_BG34_Giant_581_G ? 2 : 1;\r\n\t\tfor (const deadEntity of input.deadEntities) {\r\n\t\t\tif (\r\n\t\t\t\thasCorrectTribe(deadEntity, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards)\r\n\t\t\t) {\r\n\t\t\t\tmodifyStats(minion, minion, 2 * mult, 2 * mult, input.board, input.hero, input.gameState);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -11,7 +11,7 @@ exports.TimewarpedMurcules = {
11
11
  const mult = minion.cardId === "BG34_Giant_207_G" ? 2 : 1;
12
12
  const murculesTarget = input.attackingHero.hand.filter((e) => !!(e === null || e === void 0 ? void 0 : e.cardId) && !!e.maxHealth)[0];
13
13
  if (murculesTarget) {
14
- (0, stats_1.modifyStats)(murculesTarget, minion, 3 * mult, 3 * mult, input.attackingBoard, input.attackingHero, input.gameState);
14
+ (0, stats_1.modifyStats)(murculesTarget, minion, 4 * mult, 4 * mult, input.attackingBoard, input.attackingHero, input.gameState);
15
15
  }
16
16
  return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
17
17
  },
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-murcules.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-murcules.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AAG3C,QAAA,kBAAkB,GAAuB;IACrD,OAAO,EAAE,sCAAwF;IACjG,cAAc,EAAE,CAAC,MAAmB,EAAE,KAA0B,EAAE,EAAE;QACnE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;YAC5B,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,MAAM,CAAA,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,cAAc,EAAE;YACnB,IAAA,mBAAW,EACV,cAAc,EACd,MAAM,EACN,CAAC,GAAG,IAAI,EACR,CAAC,GAAG,IAAI,EACR,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnMinionKilledInput } from '../../../simulation/attack';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnMinionKilledCard } from '../../card.interface';\r\n\r\nexport const TimewarpedMurcules: OnMinionKilledCard = {\r\n\tcardIds: [CardIds.TimewarpedMurcules_BG34_Giant_207, CardIds.TimewarpedMurcules_BG34_Giant_207_G],\r\n\tonMinionKilled: (minion: BoardEntity, input: OnMinionKilledInput) => {\r\n\t\tif (input.killer !== minion) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedMurcules_BG34_Giant_207_G ? 2 : 1;\r\n\t\tconst murculesTarget = input.attackingHero.hand.filter((e) => !!e?.cardId && !!e.maxHealth)[0];\r\n\t\tif (murculesTarget) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tmurculesTarget,\r\n\t\t\t\tminion,\r\n\t\t\t\t3 * mult,\r\n\t\t\t\t3 * mult,\r\n\t\t\t\tinput.attackingBoard,\r\n\t\t\t\tinput.attackingHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-murcules.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-murcules.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AAG3C,QAAA,kBAAkB,GAAuB;IACrD,OAAO,EAAE,sCAAwF;IACjG,cAAc,EAAE,CAAC,MAAmB,EAAE,KAA0B,EAAE,EAAE;QACnE,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE;YAC5B,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,MAAM,CAAA,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/F,IAAI,cAAc,EAAE;YACnB,IAAA,mBAAW,EACV,cAAc,EACd,MAAM,EACN,CAAC,GAAG,IAAI,EACR,CAAC,GAAG,IAAI,EACR,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnMinionKilledInput } from '../../../simulation/attack';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnMinionKilledCard } from '../../card.interface';\r\n\r\nexport const TimewarpedMurcules: OnMinionKilledCard = {\r\n\tcardIds: [CardIds.TimewarpedMurcules_BG34_Giant_207, CardIds.TimewarpedMurcules_BG34_Giant_207_G],\r\n\tonMinionKilled: (minion: BoardEntity, input: OnMinionKilledInput) => {\r\n\t\tif (input.killer !== minion) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedMurcules_BG34_Giant_207_G ? 2 : 1;\r\n\t\tconst murculesTarget = input.attackingHero.hand.filter((e) => !!e?.cardId && !!e.maxHealth)[0];\r\n\t\tif (murculesTarget) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\tmurculesTarget,\r\n\t\t\t\tminion,\r\n\t\t\t\t4 * mult,\r\n\t\t\t\t4 * mult,\r\n\t\t\t\tinput.attackingBoard,\r\n\t\t\t\tinput.attackingHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
@@ -4,7 +4,7 @@ exports.TimewarpedPrimscale = void 0;
4
4
  const cards_in_hand_1 = require("../../../simulation/cards-in-hand");
5
5
  exports.TimewarpedPrimscale = {
6
6
  cardIds: ["BG34_PreMadeChamp_022", "BG34_PreMadeChamp_022_G"],
7
- baseAvengeValue: (cardId) => 3,
7
+ baseAvengeValue: (cardId) => 2,
8
8
  avenge: (minion, input) => {
9
9
  const mult = minion.cardId === "BG34_PreMadeChamp_022_G" ? 2 : 1;
10
10
  const cardsToAdd = Array.from({ length: mult }).map(() => "BG28_169");
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-primscale.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-primscale.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAGtD,QAAA,mBAAmB,GAAe;IAC9C,OAAO,EAAE,oDAA0G;IACnH,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,8BAAyD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,WAAoC,CAAC,CAAC;QAC/F,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const TimewarpedPrimscale: AvengeCard = {\r\n\tcardIds: [CardIds.TimewarpedPrismscale_BG34_PreMadeChamp_022, CardIds.TimewarpedPrismscale_BG34_PreMadeChamp_022_G],\r\n\tbaseAvengeValue: (cardId: string) => 3,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedPrismscale_BG34_PreMadeChamp_022_G ? 2 : 1;\r\n\t\tconst cardsToAdd = Array.from({ length: mult }).map(() => CardIds.AzeriteEmpowerment_BG28_169);\r\n\t\taddCardsInHand(input.hero, input.board, cardsToAdd, input.gameState);\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-primscale.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-primscale.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAGtD,QAAA,mBAAmB,GAAe;IAC9C,OAAO,EAAE,oDAA0G;IACnH,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,8BAAyD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,WAAoC,CAAC,CAAC;QAC/F,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const TimewarpedPrimscale: AvengeCard = {\r\n\tcardIds: [CardIds.TimewarpedPrismscale_BG34_PreMadeChamp_022, CardIds.TimewarpedPrismscale_BG34_PreMadeChamp_022_G],\r\n\tbaseAvengeValue: (cardId: string) => 2,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedPrismscale_BG34_PreMadeChamp_022_G ? 2 : 1;\r\n\t\tconst cardsToAdd = Array.from({ length: mult }).map(() => CardIds.AzeriteEmpowerment_BG28_169);\r\n\t\taddCardsInHand(input.hero, input.board, cardsToAdd, input.gameState);\r\n\t},\r\n};\r\n"]}
@@ -1,2 +1,2 @@
1
- import { OnAfterMagnetizeCard } from '../../card.interface';
2
- export declare const TimewarpedProbius: OnAfterMagnetizeCard;
1
+ import { OnAfterMagnetizeSelfCard } from '../../card.interface';
2
+ export declare const TimewarpedProbius: OnAfterMagnetizeSelfCard;
@@ -6,7 +6,7 @@ const golden_1 = require("../../../simulation/utils/golden");
6
6
  const utils_1 = require("../../../utils");
7
7
  exports.TimewarpedProbius = {
8
8
  cardIds: ["BG34_Giant_121", "BG34_Giant_121_G"],
9
- onAfterMagnetize: (entity, input) => {
9
+ onAfterMagnetizeSelf: (entity, input) => {
10
10
  if ((0, utils_1.hasCorrectTribe)(input.magnetizeTarget, input.hero, reference_data_1.Race.MECH, input.gameState.anomalies, input.gameState.allCards)) {
11
11
  (0, golden_1.makeMinionGolden)(input.magnetizeTarget, entity, input.board, input.hero, input.otherBoard, input.otherHero, input.gameState);
12
12
  input.gameState.spectator.registerPowerTarget(entity, input.magnetizeTarget, input.board, input.hero, input.otherHero);
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-probius.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-probius.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,6DAAoE;AACpE,0CAAiD;AAGpC,QAAA,iBAAiB,GAAyB;IACtD,OAAO,EAAE,sCAAsF;IAC/F,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAA4B,EAAE,EAAE;QACvE,IACC,IAAA,uBAAe,EACd,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,IAAI,EACV,qBAAI,CAAC,IAAI,EACT,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,EACA;YACD,IAAA,yBAAgB,EACf,KAAK,CAAC,eAAe,EACrB,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,CACf,CAAC;YACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;SACF;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterMagnetizeInput } from '../../../simulation/magnetize';\r\nimport { makeMinionGolden } from '../../../simulation/utils/golden';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { OnAfterMagnetizeCard } from '../../card.interface';\r\n\r\nexport const TimewarpedProbius: OnAfterMagnetizeCard = {\r\n\tcardIds: [CardIds.TimewarpedProbius_BG34_Giant_121, CardIds.TimewarpedProbius_BG34_Giant_121_G],\r\n\tonAfterMagnetize: (entity: BoardEntity, input: OnAfterMagnetizeInput) => {\r\n\t\tif (\r\n\t\t\thasCorrectTribe(\r\n\t\t\t\tinput.magnetizeTarget,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tRace.MECH,\r\n\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\tinput.gameState.allCards,\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\tmakeMinionGolden(\r\n\t\t\t\tinput.magnetizeTarget,\r\n\t\t\t\tentity,\r\n\t\t\t\tinput.board,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tinput.otherBoard,\r\n\t\t\t\tinput.otherHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\tentity,\r\n\t\t\t\tinput.magnetizeTarget,\r\n\t\t\t\tinput.board,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tinput.otherHero,\r\n\t\t\t);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-probius.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-probius.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,6DAAoE;AACpE,0CAAiD;AAGpC,QAAA,iBAAiB,GAA6B;IAC1D,OAAO,EAAE,sCAAsF;IAC/F,oBAAoB,EAAE,CAAC,MAAmB,EAAE,KAA4B,EAAE,EAAE;QAC3E,IACC,IAAA,uBAAe,EACd,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,IAAI,EACV,qBAAI,CAAC,IAAI,EACT,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,EACA;YACD,IAAA,yBAAgB,EACf,KAAK,CAAC,eAAe,EACrB,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,CACf,CAAC;YACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,KAAK,CAAC,eAAe,EACrB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;SACF;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterMagnetizeInput } from '../../../simulation/magnetize';\r\nimport { makeMinionGolden } from '../../../simulation/utils/golden';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { OnAfterMagnetizeSelfCard } from '../../card.interface';\r\n\r\nexport const TimewarpedProbius: OnAfterMagnetizeSelfCard = {\r\n\tcardIds: [CardIds.TimewarpedProbius_BG34_Giant_121, CardIds.TimewarpedProbius_BG34_Giant_121_G],\r\n\tonAfterMagnetizeSelf: (entity: BoardEntity, input: OnAfterMagnetizeInput) => {\r\n\t\tif (\r\n\t\t\thasCorrectTribe(\r\n\t\t\t\tinput.magnetizeTarget,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tRace.MECH,\r\n\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\tinput.gameState.allCards,\r\n\t\t\t)\r\n\t\t) {\r\n\t\t\tmakeMinionGolden(\r\n\t\t\t\tinput.magnetizeTarget,\r\n\t\t\t\tentity,\r\n\t\t\t\tinput.board,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tinput.otherBoard,\r\n\t\t\t\tinput.otherHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\tentity,\r\n\t\t\t\tinput.magnetizeTarget,\r\n\t\t\t\tinput.board,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tinput.otherHero,\r\n\t\t\t);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -1,2 +1,2 @@
1
- import { OnAfterMagnetizeSelfCard } from '../../card.interface';
2
- export declare const TimewarpedWargear: OnAfterMagnetizeSelfCard;
1
+ import { OnAfterMagnetizeToSelfCard } from '../../card.interface';
2
+ export declare const TimewarpedWargear: OnAfterMagnetizeToSelfCard;
@@ -4,7 +4,7 @@ exports.TimewarpedWargear = void 0;
4
4
  const stats_1 = require("../../../simulation/stats");
5
5
  exports.TimewarpedWargear = {
6
6
  cardIds: ["BG34_Giant_677", "BG34_Giant_677_G"],
7
- onAfterMagnetizeSelf: (minion, input) => {
7
+ onAfterMagnetizeToSelf: (minion, input) => {
8
8
  const mult = minion.cardId === "BG34_Giant_677_G" ? 2 : 1;
9
9
  (0, stats_1.modifyStats)(input.magnetizeTarget, minion, input.magnetizeTarget.attack * mult, input.magnetizeTarget.health * mult, input.board, input.hero, input.gameState);
10
10
  },
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-wargear.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-wargear.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AAG3C,QAAA,iBAAiB,GAA6B;IAC1D,OAAO,EAAE,sCAAsF;IAC/F,oBAAoB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC/E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAElF,IAAA,mBAAW,EACV,KAAK,CAAC,eAAe,EACrB,MAAM,EACN,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,EACnC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,EACnC,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterMagnetizeSelfInput } from '../../../simulation/magnetize';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnAfterMagnetizeSelfCard } from '../../card.interface';\r\n\r\nexport const TimewarpedWargear: OnAfterMagnetizeSelfCard = {\r\n\tcardIds: [CardIds.TimewarpedWargear_BG34_Giant_677, CardIds.TimewarpedWargear_BG34_Giant_677_G],\r\n\tonAfterMagnetizeSelf: (minion: BoardEntity, input: OnAfterMagnetizeSelfInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedWargear_BG34_Giant_677_G ? 2 : 1;\r\n\t\t// Never sure whether to use setEntityStats or modifyStats here (ie aura reapply or not)\r\n\t\tmodifyStats(\r\n\t\t\tinput.magnetizeTarget,\r\n\t\t\tminion,\r\n\t\t\tinput.magnetizeTarget.attack * mult,\r\n\t\t\tinput.magnetizeTarget.health * mult,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-wargear.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-wargear.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AAG3C,QAAA,iBAAiB,GAA+B;IAC5D,OAAO,EAAE,sCAAsF;IAC/F,sBAAsB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QACjF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAElF,IAAA,mBAAW,EACV,KAAK,CAAC,eAAe,EACrB,MAAM,EACN,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,EACnC,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,IAAI,EACnC,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterMagnetizeSelfInput } from '../../../simulation/magnetize';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnAfterMagnetizeToSelfCard } from '../../card.interface';\r\n\r\nexport const TimewarpedWargear: OnAfterMagnetizeToSelfCard = {\r\n\tcardIds: [CardIds.TimewarpedWargear_BG34_Giant_677, CardIds.TimewarpedWargear_BG34_Giant_677_G],\r\n\tonAfterMagnetizeToSelf: (minion: BoardEntity, input: OnAfterMagnetizeSelfInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedWargear_BG34_Giant_677_G ? 2 : 1;\r\n\t\t// Never sure whether to use setEntityStats or modifyStats here (ie aura reapply or not)\r\n\t\tmodifyStats(\r\n\t\t\tinput.magnetizeTarget,\r\n\t\t\tminion,\r\n\t\t\tinput.magnetizeTarget.attack * mult,\r\n\t\t\tinput.magnetizeTarget.health * mult,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
@@ -5,7 +5,7 @@ const cards_in_hand_1 = require("../../../simulation/cards-in-hand");
5
5
  exports.DivineSignet = {
6
6
  cardIds: ["BG32_MagicItem_171"],
7
7
  onDivineShieldUpdated: (trinket, input) => {
8
- if (trinket.scriptDataNum1 > 0) {
8
+ if (!input.newValue && trinket.scriptDataNum1 > 0) {
9
9
  (0, cards_in_hand_1.addCardsInHand)(input.hero, input.board, [input.gameState.cardsData.getRandomTavernSpell()], input.gameState);
10
10
  trinket.scriptDataNum1--;
11
11
  }
@@ -1 +1 @@
1
- {"version":3,"file":"divine-signet.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/divine-signet.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAGtD,QAAA,YAAY,GAA8B;IACtD,OAAO,EAAE,sBAAyC;IAClD,qBAAqB,EAAE,CAAC,OAAqB,EAAE,KAAiC,EAAE,EAAE;QACnF,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE;YAC/B,IAAA,8BAAc,EACb,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,KAAK,EACX,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,EAClD,KAAK,CAAC,SAAS,CACf,CAAC;YACF,OAAO,CAAC,cAAc,EAAE,CAAC;SACzB;IACF,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '../../../services/card-ids';\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { OnDivineShieldUpdatedInput } from '../../../keywords/divine-shield';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { OnDivineShieldUpdatedCard } from '../../card.interface';\r\n\r\nexport const DivineSignet: OnDivineShieldUpdatedCard = {\r\n\tcardIds: [CardIds.DivineSignet_BG32_MagicItem_171],\r\n\tonDivineShieldUpdated: (trinket: BoardTrinket, input: OnDivineShieldUpdatedInput) => {\r\n\t\tif (trinket.scriptDataNum1 > 0) {\r\n\t\t\taddCardsInHand(\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tinput.board,\r\n\t\t\t\t[input.gameState.cardsData.getRandomTavernSpell()],\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t\ttrinket.scriptDataNum1--;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"divine-signet.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/divine-signet.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAGtD,QAAA,YAAY,GAA8B;IACtD,OAAO,EAAE,sBAAyC;IAClD,qBAAqB,EAAE,CAAC,OAAqB,EAAE,KAAiC,EAAE,EAAE;QACnF,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,EAAE;YAClD,IAAA,8BAAc,EACb,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,KAAK,EACX,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,EAClD,KAAK,CAAC,SAAS,CACf,CAAC;YACF,OAAO,CAAC,cAAc,EAAE,CAAC;SACzB;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { OnDivineShieldUpdatedInput } from '../../../keywords/divine-shield';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { OnDivineShieldUpdatedCard } from '../../card.interface';\r\n\r\nexport const DivineSignet: OnDivineShieldUpdatedCard = {\r\n\tcardIds: [CardIds.DivineSignet_BG32_MagicItem_171],\r\n\tonDivineShieldUpdated: (trinket: BoardTrinket, input: OnDivineShieldUpdatedInput) => {\r\n\t\tif (!input.newValue && trinket.scriptDataNum1 > 0) {\r\n\t\t\taddCardsInHand(\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tinput.board,\r\n\t\t\t\t[input.gameState.cardsData.getRandomTavernSpell()],\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t\ttrinket.scriptDataNum1--;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -13,11 +13,13 @@ export declare const debugState: {
13
13
  forcedRandomPicks: {
14
14
  source: ForcedFaceOffEntity;
15
15
  target: ForcedFaceOffEntity;
16
+ chosenCardId?: string;
16
17
  }[];
17
18
  isCorrectEntity: (proposedEntity: ForcedFaceOffEntity, actualEntity: BoardEntity) => boolean;
18
19
  forcedRandomPicksBase: {
19
20
  source: ForcedFaceOffEntity;
20
21
  target: ForcedFaceOffEntity;
22
+ chosenCardId?: string;
21
23
  }[];
22
24
  onBattleStart: () => void;
23
25
  };
@@ -1 +1 @@
1
- {"version":3,"file":"debug-state.js","sourceRoot":"","sources":["../src/debug-state.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAG;IACzB,MAAM,EAAE,KAAK;IACb,qBAAqB,EAAE,IAAqB;IAC5C,aAAa,EAAE,EAAwE;IACvF,iBAAiB,EAAE,EAAwE;IAE3F,iBAAiB,EAAE,EAAoE;IACvF,eAAe,EAAE,CAAC,cAAmC,EAAE,YAAyB,EAAW,EAAE;QAC5F,IAAI,cAAc,CAAC,QAAQ,EAAE;YAC5B,OAAO,cAAc,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,CAAC;SACzD;QACD,IAAI,cAAc,CAAC,MAAM,EAAE;YAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;YAClE,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,EAAE;gBACnE,OAAO,WAAW,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;aACrH;YACD,OAAO,WAAW,CAAC;SACnB;QACD,OAAO,CACN,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;YAC7C,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAC7C,CAAC;IACH,CAAC;IACD,qBAAqB,EAAE,EAAoE;IAC3F,aAAa,EAAE,GAAG,EAAE;QACnB,kBAAU,CAAC,aAAa,GAAG,CAAC,GAAG,kBAAU,CAAC,iBAAiB,CAAC,CAAC;QAC7D,kBAAU,CAAC,iBAAiB,GAAG,CAAC,GAAG,kBAAU,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from './board-entity';\n\nexport const debugState = {\n\tactive: false,\n\tforcedCurrentAttacker: null as number | null,\n\tforcedFaceOff: [] as { attacker: ForcedFaceOffEntity; defender: ForcedFaceOffEntity }[],\n\tforcedFaceOffBase: [] as { attacker: ForcedFaceOffEntity; defender: ForcedFaceOffEntity }[],\n\t/** Forced random picks: source -> target. Matched by source entity (like face-offs match by attacker). */\n\tforcedRandomPicks: [] as { source: ForcedFaceOffEntity; target: ForcedFaceOffEntity }[],\n\tisCorrectEntity: (proposedEntity: ForcedFaceOffEntity, actualEntity: BoardEntity): boolean => {\n\t\tif (proposedEntity.entityId) {\n\t\t\treturn proposedEntity.entityId === actualEntity.entityId;\n\t\t}\n\t\tif (proposedEntity.cardId) {\n\t\t\tconst cardMatches = proposedEntity.cardId === actualEntity.cardId;\n\t\t\tif (proposedEntity.attack != null && proposedEntity.health != null) {\n\t\t\t\treturn cardMatches && proposedEntity.attack === actualEntity.attack && proposedEntity.health === actualEntity.health;\n\t\t\t}\n\t\t\treturn cardMatches;\n\t\t}\n\t\treturn (\n\t\t\tproposedEntity.attack === actualEntity.attack &&\n\t\t\tproposedEntity.health === actualEntity.health\n\t\t);\n\t},\n\tforcedRandomPicksBase: [] as { source: ForcedFaceOffEntity; target: ForcedFaceOffEntity }[],\n\tonBattleStart: () => {\n\t\tdebugState.forcedFaceOff = [...debugState.forcedFaceOffBase];\n\t\tdebugState.forcedRandomPicks = [...debugState.forcedRandomPicksBase];\n\t},\n};\n\nexport interface ForcedFaceOffEntity {\n\tentityId?: number;\n\tcardId?: string;\n\tattack?: number;\n\thealth?: number;\n}\n"]}
1
+ {"version":3,"file":"debug-state.js","sourceRoot":"","sources":["../src/debug-state.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAG;IACzB,MAAM,EAAE,KAAK;IACb,qBAAqB,EAAE,IAAqB;IAC5C,aAAa,EAAE,EAAwE;IACvF,iBAAiB,EAAE,EAAwE;IAE3F,iBAAiB,EAAE,EAA2F;IAC9G,eAAe,EAAE,CAAC,cAAmC,EAAE,YAAyB,EAAW,EAAE;QAC5F,IAAI,cAAc,CAAC,QAAQ,EAAE;YAC5B,OAAO,cAAc,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,CAAC;SACzD;QACD,IAAI,cAAc,CAAC,MAAM,EAAE;YAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;YAClE,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,EAAE;gBACnE,OAAO,WAAW,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;aACrH;YACD,OAAO,WAAW,CAAC;SACnB;QACD,OAAO,CACN,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;YAC7C,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAC7C,CAAC;IACH,CAAC;IACD,qBAAqB,EAAE,EAA2F;IAClH,aAAa,EAAE,GAAG,EAAE;QACnB,kBAAU,CAAC,aAAa,GAAG,CAAC,GAAG,kBAAU,CAAC,iBAAiB,CAAC,CAAC;QAC7D,kBAAU,CAAC,iBAAiB,GAAG,CAAC,GAAG,kBAAU,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from './board-entity';\n\nexport const debugState = {\n\tactive: false,\n\tforcedCurrentAttacker: null as number | null,\n\tforcedFaceOff: [] as { attacker: ForcedFaceOffEntity; defender: ForcedFaceOffEntity }[],\n\tforcedFaceOffBase: [] as { attacker: ForcedFaceOffEntity; defender: ForcedFaceOffEntity }[],\n\t/** Forced random picks: source -> target. Matched by source entity (like face-offs match by attacker). Optional chosenCardId for card-pool picks (e.g. Apexis Guardian Volumizer). */\n\tforcedRandomPicks: [] as { source: ForcedFaceOffEntity; target: ForcedFaceOffEntity; chosenCardId?: string }[],\n\tisCorrectEntity: (proposedEntity: ForcedFaceOffEntity, actualEntity: BoardEntity): boolean => {\n\t\tif (proposedEntity.entityId) {\n\t\t\treturn proposedEntity.entityId === actualEntity.entityId;\n\t\t}\n\t\tif (proposedEntity.cardId) {\n\t\t\tconst cardMatches = proposedEntity.cardId === actualEntity.cardId;\n\t\t\tif (proposedEntity.attack != null && proposedEntity.health != null) {\n\t\t\t\treturn cardMatches && proposedEntity.attack === actualEntity.attack && proposedEntity.health === actualEntity.health;\n\t\t\t}\n\t\t\treturn cardMatches;\n\t\t}\n\t\treturn (\n\t\t\tproposedEntity.attack === actualEntity.attack &&\n\t\t\tproposedEntity.health === actualEntity.health\n\t\t);\n\t},\n\tforcedRandomPicksBase: [] as { source: ForcedFaceOffEntity; target: ForcedFaceOffEntity; chosenCardId?: string }[],\n\tonBattleStart: () => {\n\t\tdebugState.forcedFaceOff = [...debugState.forcedFaceOffBase];\n\t\tdebugState.forcedRandomPicks = [...debugState.forcedRandomPicksBase];\n\t},\n};\n\nexport interface ForcedFaceOffEntity {\n\tentityId?: number;\n\tcardId?: string;\n\tattack?: number;\n\thealth?: number;\n}\n"]}
@@ -9,6 +9,10 @@ const stats_1 = require("../simulation/stats");
9
9
  const utils_2 = require("../utils");
10
10
  const updateDivineShield = (entity, board, hero, otherHero, newValue, gameState) => {
11
11
  var _a;
12
+ if (newValue === entity.divineShield) {
13
+ return;
14
+ }
15
+ const previousValue = entity.divineShield;
12
16
  entity.hadDivineShield = newValue || entity.divineShield || entity.hadDivineShield;
13
17
  if (entity.strongDivineShield && newValue === false) {
14
18
  entity.strongDivineShield = false;
@@ -28,6 +32,34 @@ const updateDivineShield = (entity, board, hero, otherHero, newValue, gameState)
28
32
  12 * boardForDrake.filter((e) => e.cardId === "BG25_043_G").length;
29
33
  entity.attack -= statsBonus;
30
34
  }
35
+ for (const trinket of (_a = hero.trinkets) !== null && _a !== void 0 ? _a : []) {
36
+ const onDivineShieldUpdatedImpl = _card_mappings_1.cardMappings[trinket.cardId];
37
+ if ((0, card_interface_1.hasOnDivineShieldUpdated)(onDivineShieldUpdatedImpl)) {
38
+ onDivineShieldUpdatedImpl.onDivineShieldUpdated(trinket, {
39
+ board: board,
40
+ hero: hero,
41
+ otherHero: otherHero,
42
+ gameState: gameState,
43
+ target: entity,
44
+ newValue: newValue,
45
+ previousValue: previousValue,
46
+ });
47
+ }
48
+ }
49
+ for (const boardEntity of board) {
50
+ const onDivineShieldUpdatedImpl = _card_mappings_1.cardMappings[boardEntity.cardId];
51
+ if ((0, card_interface_1.hasOnDivineShieldUpdated)(onDivineShieldUpdatedImpl)) {
52
+ onDivineShieldUpdatedImpl.onDivineShieldUpdated(boardEntity, {
53
+ board: board,
54
+ hero: hero,
55
+ otherHero: otherHero,
56
+ gameState: gameState,
57
+ target: entity,
58
+ newValue: newValue,
59
+ previousValue: previousValue,
60
+ });
61
+ }
62
+ }
31
63
  if (entity.hadDivineShield && !entity.divineShield) {
32
64
  const adapter = hero.trinkets
33
65
  .filter((t) => t.cardId === "BG30_MagicItem_910")
@@ -36,34 +68,6 @@ const updateDivineShield = (entity, board, hero, otherHero, newValue, gameState)
36
68
  (0, exports.updateDivineShield)(entity, board, hero, otherHero, true, gameState);
37
69
  adapter.scriptDataNum1--;
38
70
  }
39
- for (const trinket of (_a = hero.trinkets) !== null && _a !== void 0 ? _a : []) {
40
- const onDivineShieldUpdatedImpl = _card_mappings_1.cardMappings[trinket.cardId];
41
- if ((0, card_interface_1.hasOnDivineShieldUpdated)(onDivineShieldUpdatedImpl)) {
42
- onDivineShieldUpdatedImpl.onDivineShieldUpdated(trinket, {
43
- board: board,
44
- hero: hero,
45
- otherHero: otherHero,
46
- gameState: gameState,
47
- target: entity,
48
- newValue: false,
49
- previousValue: true,
50
- });
51
- }
52
- }
53
- for (const boardEntity of board) {
54
- const onDivineShieldUpdatedImpl = _card_mappings_1.cardMappings[boardEntity.cardId];
55
- if ((0, card_interface_1.hasOnDivineShieldUpdated)(onDivineShieldUpdatedImpl)) {
56
- onDivineShieldUpdatedImpl.onDivineShieldUpdated(boardEntity, {
57
- board: board,
58
- hero: hero,
59
- otherHero: otherHero,
60
- gameState: gameState,
61
- target: entity,
62
- newValue: false,
63
- previousValue: true,
64
- });
65
- }
66
- }
67
71
  for (let i = 0; i < board.length; i++) {
68
72
  if (board[i].cardId === "ICC_858") {
69
73
  (0, stats_1.modifyStats)(board[i], board[i], 2, 0, board, hero, gameState);
@@ -1 +1 @@
1
- {"version":3,"file":"divine-shield.js","sourceRoot":"","sources":["../../src/keywords/divine-shield.ts"],"names":[],"mappings":"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","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnDivineShieldUpdated } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { pickRandom } from '../services/utils';\r\nimport { FullGameState } from '../simulation/internal-game-state';\r\nimport { modifyStats } from '../simulation/stats';\r\nimport { hasCorrectTribe } from '../utils';\r\n\r\nexport const updateDivineShield = (\r\n\tentity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherHero: BgsPlayerEntity,\r\n\tnewValue: boolean,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tentity.hadDivineShield = newValue || entity.divineShield || entity.hadDivineShield;\r\n\tif (entity.strongDivineShield && newValue === false) {\r\n\t\tentity.strongDivineShield = false;\r\n\t} else {\r\n\t\tentity.divineShield = newValue;\r\n\t}\r\n\tif (entity.divineShield && newValue) {\r\n\t\tconst boardForDrake = board;\r\n\t\tconst statsBonus =\r\n\t\t\t6 * boardForDrake.filter((e) => e.cardId === CardIds.CyborgDrake_BG25_043).length +\r\n\t\t\t12 * boardForDrake.filter((e) => e.cardId === CardIds.CyborgDrake_BG25_043_G).length;\r\n\t\t// Don't trigger all \"on attack changed\" effects, since it's an aura\r\n\t\tentity.attack += statsBonus;\r\n\t} else if (!entity.divineShield) {\r\n\t\t// Also consider itself\r\n\t\tconst boardForDrake = board;\r\n\t\tconst statsBonus =\r\n\t\t\t6 * boardForDrake.filter((e) => e.cardId === CardIds.CyborgDrake_BG25_043).length +\r\n\t\t\t12 * boardForDrake.filter((e) => e.cardId === CardIds.CyborgDrake_BG25_043_G).length;\r\n\t\tentity.attack -= statsBonus;\r\n\t}\r\n\r\n\t// Lost divine shield\r\n\tif (entity.hadDivineShield && !entity.divineShield) {\r\n\t\tconst adapter = hero.trinkets\r\n\t\t\t.filter((t) => t.cardId === CardIds.MechagonAdapter_BG30_MagicItem_910)\r\n\t\t\t.filter((t) => t.scriptDataNum1 > 0)[0];\r\n\t\tif (!!adapter && hasCorrectTribe(entity, hero, Race.MECH, gameState.anomalies, gameState.allCards)) {\r\n\t\t\tupdateDivineShield(entity, board, hero, otherHero, true, gameState);\r\n\t\t\tadapter.scriptDataNum1--;\r\n\t\t}\r\n\r\n\t\tfor (const trinket of hero.trinkets ?? []) {\r\n\t\t\tconst onDivineShieldUpdatedImpl = cardMappings[trinket.cardId];\r\n\t\t\tif (hasOnDivineShieldUpdated(onDivineShieldUpdatedImpl)) {\r\n\t\t\t\tonDivineShieldUpdatedImpl.onDivineShieldUpdated(trinket, {\r\n\t\t\t\t\tboard: board,\r\n\t\t\t\t\thero: hero,\r\n\t\t\t\t\totherHero: otherHero,\r\n\t\t\t\t\tgameState: gameState,\r\n\t\t\t\t\ttarget: entity,\r\n\t\t\t\t\tnewValue: false,\r\n\t\t\t\t\tpreviousValue: true,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (const boardEntity of board) {\r\n\t\t\tconst onDivineShieldUpdatedImpl = cardMappings[boardEntity.cardId];\r\n\t\t\tif (hasOnDivineShieldUpdated(onDivineShieldUpdatedImpl)) {\r\n\t\t\t\tonDivineShieldUpdatedImpl.onDivineShieldUpdated(boardEntity, {\r\n\t\t\t\t\tboard: board,\r\n\t\t\t\t\thero: hero,\r\n\t\t\t\t\totherHero: otherHero,\r\n\t\t\t\t\tgameState: gameState,\r\n\t\t\t\t\ttarget: entity,\r\n\t\t\t\t\tnewValue: false,\r\n\t\t\t\t\tpreviousValue: true,\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < board.length; i++) {\r\n\t\t\tif (board[i].cardId === CardIds.BolvarFireblood_ICC_858) {\r\n\t\t\t\tmodifyStats(board[i], board[i], 2, 0, board, hero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(board[i], board[i], board, hero, otherHero);\r\n\t\t\t\t// } else if (board[i].cardId === CardIds.BolvarFireblood_TB_BaconUps_047) {\r\n\t\t\t\t// \tmodifyStats(board[i], board[i], 4, 0, board, hero, gameState);\r\n\t\t\t\t// \tgameState.spectator.registerPowerTarget(board[i], board[i], board, hero, otherHero);\r\n\t\t\t\t// } else if (board[i].cardId === CardIds.DrakonidEnforcer_BGS_067) {\r\n\t\t\t\t// \tmodifyStats(board[i], board[i], 2, 2, board, hero, gameState);\r\n\t\t\t\t// \tgameState.spectator.registerPowerTarget(board[i], board[i], board, hero, otherHero);\r\n\t\t\t\t// } else if (board[i].cardId === CardIds.DrakonidEnforcer_TB_BaconUps_117) {\r\n\t\t\t\t// \tmodifyStats(board[i], board[i], 4, 4, board, hero, gameState);\r\n\t\t\t\t// \tgameState.spectator.registerPowerTarget(board[i], board[i], board, hero, otherHero);\r\n\t\t\t}\r\n\t\t\t// } else if (\r\n\t\t\t// \tboard[i].cardId === CardIds.CogworkCopter_BG24_008 ||\r\n\t\t\t// \tboard[i].cardId === CardIds.CogworkCopter_BG24_008_G\r\n\t\t\t// ) {\r\n\t\t\t// When it's the opponent, the game state already contains all the buffs\r\n\t\t\t// if (board[i]?.friendly) {\r\n\t\t\t// \tconst buff = 1; //board[i].cardId === CardIds.CogworkCopter_BG24_008_G ? 2 : 1;\r\n\t\t\t// \tgrantRandomStats(\r\n\t\t\t// \t\tboard[i],\r\n\t\t\t// \t\thero.hand.filter(\r\n\t\t\t// \t\t\t(e) =>\r\n\t\t\t// \t\t\t\tgameState.allCards.getCard(e.cardId).type?.toUpperCase() === CardType[CardType.MINION],\r\n\t\t\t// \t\t),\r\n\t\t\t// \t\thero,\r\n\t\t\t// \t\tbuff,\r\n\t\t\t// \t\tbuff,\r\n\t\t\t// \t\tnull,\r\n\t\t\t// \t\ttrue,\r\n\t\t\t// \t\tgameState,\r\n\t\t\t// \t);\r\n\t\t\t// }\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const grantRandomDivineShield = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst elligibleEntities = board\r\n\t\t.filter((entity) => !entity.divineShield)\r\n\t\t.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\tif (elligibleEntities.length > 0) {\r\n\t\tconst chosen = pickRandom(elligibleEntities);\r\n\t\tupdateDivineShield(chosen, board, hero, otherHero, true, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, chosen, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantDivineShieldToLeftmostMinions = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tquantity: number,\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tfor (let i = 0; i < Math.min(quantity, board.length); i++) {\r\n\t\tupdateDivineShield(board[i], board, hero, otherHero, true, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, board[i], board, null, null);\r\n\t}\r\n};\r\n\r\nexport interface OnDivineShieldUpdatedInput {\r\n\tboard: BoardEntity[];\r\n\thero: BgsPlayerEntity;\r\n\totherHero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n\ttarget: BoardEntity;\r\n\tnewValue: boolean;\r\n\tpreviousValue: boolean;\r\n}\r\n"]}
1
+ {"version":3,"file":"divine-shield.js","sourceRoot":"","sources":["../../src/keywords/divine-shield.ts"],"names":[],"mappings":"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","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnDivineShieldUpdated } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { pickRandom } from '../services/utils';\r\nimport { FullGameState } from '../simulation/internal-game-state';\r\nimport { modifyStats } from '../simulation/stats';\r\nimport { hasCorrectTribe } from '../utils';\r\n\r\nexport const updateDivineShield = (\r\n\tentity: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherHero: BgsPlayerEntity,\r\n\tnewValue: boolean,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (newValue === entity.divineShield) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst previousValue = entity.divineShield;\r\n\tentity.hadDivineShield = newValue || entity.divineShield || entity.hadDivineShield;\r\n\tif (entity.strongDivineShield && newValue === false) {\r\n\t\tentity.strongDivineShield = false;\r\n\t} else {\r\n\t\tentity.divineShield = newValue;\r\n\t}\r\n\tif (entity.divineShield && newValue) {\r\n\t\tconst boardForDrake = board;\r\n\t\tconst statsBonus =\r\n\t\t\t6 * boardForDrake.filter((e) => e.cardId === CardIds.CyborgDrake_BG25_043).length +\r\n\t\t\t12 * boardForDrake.filter((e) => e.cardId === CardIds.CyborgDrake_BG25_043_G).length;\r\n\t\t// Don't trigger all \"on attack changed\" effects, since it's an aura\r\n\t\tentity.attack += statsBonus;\r\n\t} else if (!entity.divineShield) {\r\n\t\t// Also consider itself\r\n\t\tconst boardForDrake = board;\r\n\t\tconst statsBonus =\r\n\t\t\t6 * boardForDrake.filter((e) => e.cardId === CardIds.CyborgDrake_BG25_043).length +\r\n\t\t\t12 * boardForDrake.filter((e) => e.cardId === CardIds.CyborgDrake_BG25_043_G).length;\r\n\t\tentity.attack -= statsBonus;\r\n\t}\r\n\r\n\tfor (const trinket of hero.trinkets ?? []) {\r\n\t\tconst onDivineShieldUpdatedImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasOnDivineShieldUpdated(onDivineShieldUpdatedImpl)) {\r\n\t\t\tonDivineShieldUpdatedImpl.onDivineShieldUpdated(trinket, {\r\n\t\t\t\tboard: board,\r\n\t\t\t\thero: hero,\r\n\t\t\t\totherHero: otherHero,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t\ttarget: entity,\r\n\t\t\t\tnewValue: newValue,\r\n\t\t\t\tpreviousValue: previousValue,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const boardEntity of board) {\r\n\t\tconst onDivineShieldUpdatedImpl = cardMappings[boardEntity.cardId];\r\n\t\tif (hasOnDivineShieldUpdated(onDivineShieldUpdatedImpl)) {\r\n\t\t\tonDivineShieldUpdatedImpl.onDivineShieldUpdated(boardEntity, {\r\n\t\t\t\tboard: board,\r\n\t\t\t\thero: hero,\r\n\t\t\t\totherHero: otherHero,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t\ttarget: entity,\r\n\t\t\t\tnewValue: newValue,\r\n\t\t\t\tpreviousValue: previousValue,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\t// Lost divine shield\r\n\tif (entity.hadDivineShield && !entity.divineShield) {\r\n\t\tconst adapter = hero.trinkets\r\n\t\t\t.filter((t) => t.cardId === CardIds.MechagonAdapter_BG30_MagicItem_910)\r\n\t\t\t.filter((t) => t.scriptDataNum1 > 0)[0];\r\n\t\tif (!!adapter && hasCorrectTribe(entity, hero, Race.MECH, gameState.anomalies, gameState.allCards)) {\r\n\t\t\tupdateDivineShield(entity, board, hero, otherHero, true, gameState);\r\n\t\t\tadapter.scriptDataNum1--;\r\n\t\t}\r\n\r\n\t\tfor (let i = 0; i < board.length; i++) {\r\n\t\t\tif (board[i].cardId === CardIds.BolvarFireblood_ICC_858) {\r\n\t\t\t\tmodifyStats(board[i], board[i], 2, 0, board, hero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(board[i], board[i], board, hero, otherHero);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const grantRandomDivineShield = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst elligibleEntities = board\r\n\t\t.filter((entity) => !entity.divineShield)\r\n\t\t.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\tif (elligibleEntities.length > 0) {\r\n\t\tconst chosen = pickRandom(elligibleEntities);\r\n\t\tupdateDivineShield(chosen, board, hero, otherHero, true, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, chosen, board, null, null);\r\n\t}\r\n};\r\n\r\nexport const grantDivineShieldToLeftmostMinions = (\r\n\tsource: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tquantity: number,\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tfor (let i = 0; i < Math.min(quantity, board.length); i++) {\r\n\t\tupdateDivineShield(board[i], board, hero, otherHero, true, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(source, board[i], board, null, null);\r\n\t}\r\n};\r\n\r\nexport interface OnDivineShieldUpdatedInput {\r\n\tboard: BoardEntity[];\r\n\thero: BgsPlayerEntity;\r\n\totherHero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n\ttarget: BoardEntity;\r\n\tnewValue: boolean;\r\n\tpreviousValue: boolean;\r\n}\r\n"]}
@@ -38,7 +38,9 @@ function pickRandom(array, sourceEntity) {
38
38
  const forced = debug_state_1.debugState.forcedRandomPicks.find((p) => debug_state_1.debugState.isCorrectEntity(p.source, sourceEntity));
39
39
  if (forced) {
40
40
  const match = array.find((c) => debug_state_1.debugState.isCorrectEntity(forced.target, c));
41
- debug_state_1.debugState.forcedRandomPicks = debug_state_1.debugState.forcedRandomPicks.filter((p) => p !== forced);
41
+ if (!forced.chosenCardId) {
42
+ debug_state_1.debugState.forcedRandomPicks = debug_state_1.debugState.forcedRandomPicks.filter((p) => p !== forced);
43
+ }
42
44
  if (match) {
43
45
  return match;
44
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoardEntity } from '../board-entity';\r\nimport { debugState } from '../debug-state';\r\n\r\nfunction partitionArray<T>(array: readonly T[], partitionSize: number): readonly T[][] {\r\n\tconst workingCopy: T[] = [...array];\r\n\tconst result: T[][] = [];\r\n\twhile (workingCopy.length) {\r\n\t\tresult.push(workingCopy.splice(0, partitionSize));\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nasync function sleep(ms) {\r\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport const groupByFunction =\r\n\t<T>(keyExtractor: (obj: T) => string | number) =>\r\n\t(array: readonly T[]): { [key: string]: readonly T[] } => {\r\n\t\treturn (array ?? []).reduce((objectsByKeyValue, obj) => {\r\n\t\t\tconst value = keyExtractor(obj);\r\n\t\t\tobjectsByKeyValue[value] = objectsByKeyValue[value] ?? [];\r\n\t\t\t// Using push instead of concat is thousands of times faster on big arrays\r\n\t\t\tobjectsByKeyValue[value].push(obj);\r\n\t\t\treturn objectsByKeyValue;\r\n\t\t}, {});\r\n\t};\r\n\r\nexport { partitionArray, sleep };\r\n\r\nexport function pickRandom<T>(array: readonly T[]): T;\r\nexport function pickRandom<T extends BoardEntity>(array: readonly T[], sourceEntity: BoardEntity): T;\r\nexport function pickRandom<T>(array: readonly T[], sourceEntity?: BoardEntity): T {\r\n\tif (!array?.length) {\r\n\t\treturn null;\r\n\t}\r\n\tif (\r\n\t\tsourceEntity &&\r\n\t\tdebugState.active &&\r\n\t\tarray.length > 0 &&\r\n\t\ttypeof array[0] === 'object' &&\r\n\t\tarray[0] != null &&\r\n\t\t'entityId' in array[0]\r\n\t) {\r\n\t\tconst forced = debugState.forcedRandomPicks.find((p) => debugState.isCorrectEntity(p.source, sourceEntity));\r\n\t\tif (forced) {\r\n\t\t\tconst match = (array as unknown as BoardEntity[]).find((c) => debugState.isCorrectEntity(forced.target, c));\r\n\t\t\t// Always consume when we have a matching source - each trigger gets its own pick (e.g. Titus doubles Warghoul)\r\n\t\t\tdebugState.forcedRandomPicks = debugState.forcedRandomPicks.filter((p) => p !== forced);\r\n\t\t\tif (match) {\r\n\t\t\t\treturn match as T;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn array[Math.floor(Math.random() * array.length)];\r\n}\r\n\r\nexport const pickMultipleRandom = <T>(array: readonly T[], quantity: number): T[] => {\r\n\tconst picked: T[] = [];\r\n\tfor (let i = 0; i < quantity; i++) {\r\n\t\tconst target = array.filter((e) => !picked.includes(e));\r\n\t\tconst chosenEntity = pickRandom(target);\r\n\t\tif (!!chosenEntity) {\r\n\t\t\tpicked.push(chosenEntity);\r\n\t\t}\r\n\t}\r\n\treturn picked;\r\n};\r\n\r\nexport const pickRandomAlive = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst chosenEntity = pickRandom(targetBoard);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickMultipleRandomAlive = (board: BoardEntity[], quantity: number): BoardEntity[] => {\r\n\tconst picked: BoardEntity[] = [];\r\n\tfor (let i = 0; i < quantity; i++) {\r\n\t\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead).filter((e) => !picked.includes(e));\r\n\t\tconst chosenEntity = pickRandom(targetBoard);\r\n\t\tif (!!chosenEntity) {\r\n\t\t\tpicked.push(chosenEntity);\r\n\t\t}\r\n\t}\r\n\treturn picked;\r\n};\r\n\r\nexport const pickRandomLowestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst lowestHealth = Math.min(...targetBoard.map((e) => e.health));\r\n\tconst entitiesWithLowestHealth = targetBoard.filter((e) => e.health === lowestHealth);\r\n\tconst chosenEntity = pickRandom(entitiesWithLowestHealth);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomLowestAttack = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst lowestAttack = Math.min(...targetBoard.map((e) => e.attack));\r\n\tconst entitiesWithLowestAttack = targetBoard.filter((e) => e.attack === lowestAttack);\r\n\tconst chosenEntity = pickRandom(entitiesWithLowestAttack);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomHighestAttack = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst highestAttack = Math.max(...targetBoard.map((e) => e.attack));\r\n\tconst entitiesWithHighestAttack = targetBoard.filter((e) => e.attack === highestAttack);\r\n\tconst chosenEntity = pickRandom(entitiesWithHighestAttack);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst highestHealth = Math.max(...targetBoard.map((e) => e.health));\r\n\tconst entitiesWithHighestHealth = targetBoard.filter((e) => e.health === highestHealth);\r\n\tconst chosenEntity = pickRandom(entitiesWithHighestHealth);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const encode = (input: string): string => {\r\n\t// return compressToEncodedURIComponent(input);\r\n\tconst buff = Buffer.from(input, 'utf-8');\r\n\tconst base64 = buff.toString('base64');\r\n\treturn base64;\r\n};\r\n\r\nexport const decode = (base64: string): string => {\r\n\tconst buff = Buffer.from(base64, 'base64');\r\n\tconst str = buff.toString('utf-8');\r\n\treturn str;\r\n};\r\n\r\nexport const pickMultipleRandomDifferent = <T>(list: T[], n: number): T[] => {\r\n\tconst shuffled = shuffleArray([...list]);\r\n\treturn shuffled.slice(0, n);\r\n};\r\n\r\n// https://stackoverflow.com/a/2450976/548701\r\nexport const shuffleArray = <T>(array: T[]): T[] => {\r\n\tlet currentIndex = array.length;\r\n\tlet randomIndex = 0;\r\n\r\n\t// While there remain elements to shuffle...\r\n\twhile (currentIndex != 0) {\r\n\t\t// Pick a remaining element...\r\n\t\trandomIndex = Math.floor(Math.random() * currentIndex);\r\n\t\tcurrentIndex--;\r\n\r\n\t\t// And swap it with the current element.\r\n\t\t[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];\r\n\t}\r\n\r\n\treturn array;\r\n};\r\n\r\nexport const findLast = <T>(\r\n\tarray: readonly T[],\r\n\tpredicate: (value: T, index: number, obj: readonly T[]) => unknown,\r\n): T => {\r\n\tconst filtred = array.filter(predicate);\r\n\tif (!filtred?.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst last = filtred[filtred.length - 1];\r\n\treturn last;\r\n};\r\n\r\nexport type Mutable<T> = {\r\n\t-readonly [P in keyof T]: T[P];\r\n};\r\n"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoardEntity } from '../board-entity';\r\nimport { debugState } from '../debug-state';\r\n\r\nfunction partitionArray<T>(array: readonly T[], partitionSize: number): readonly T[][] {\r\n\tconst workingCopy: T[] = [...array];\r\n\tconst result: T[][] = [];\r\n\twhile (workingCopy.length) {\r\n\t\tresult.push(workingCopy.splice(0, partitionSize));\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nasync function sleep(ms) {\r\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport const groupByFunction =\r\n\t<T>(keyExtractor: (obj: T) => string | number) =>\r\n\t(array: readonly T[]): { [key: string]: readonly T[] } => {\r\n\t\treturn (array ?? []).reduce((objectsByKeyValue, obj) => {\r\n\t\t\tconst value = keyExtractor(obj);\r\n\t\t\tobjectsByKeyValue[value] = objectsByKeyValue[value] ?? [];\r\n\t\t\t// Using push instead of concat is thousands of times faster on big arrays\r\n\t\t\tobjectsByKeyValue[value].push(obj);\r\n\t\t\treturn objectsByKeyValue;\r\n\t\t}, {});\r\n\t};\r\n\r\nexport { partitionArray, sleep };\r\n\r\nexport function pickRandom<T>(array: readonly T[]): T;\r\nexport function pickRandom<T extends BoardEntity>(array: readonly T[], sourceEntity: BoardEntity): T;\r\nexport function pickRandom<T>(array: readonly T[], sourceEntity?: BoardEntity): T {\r\n\tif (!array?.length) {\r\n\t\treturn null;\r\n\t}\r\n\tif (\r\n\t\tsourceEntity &&\r\n\t\tdebugState.active &&\r\n\t\tarray.length > 0 &&\r\n\t\ttypeof array[0] === 'object' &&\r\n\t\tarray[0] != null &&\r\n\t\t'entityId' in array[0]\r\n\t) {\r\n\t\tconst forced = debugState.forcedRandomPicks.find((p) => debugState.isCorrectEntity(p.source, sourceEntity));\r\n\t\tif (forced) {\r\n\t\t\tconst match = (array as unknown as BoardEntity[]).find((c) => debugState.isCorrectEntity(forced.target, c));\r\n\t\t\t// Defer consumption when pick has chosenCardId - getRandomMagneticVolumizer will consume (e.g. Apexis Guardian)\r\n\t\t\tif (!forced.chosenCardId) {\r\n\t\t\t\tdebugState.forcedRandomPicks = debugState.forcedRandomPicks.filter((p) => p !== forced);\r\n\t\t\t}\r\n\t\t\tif (match) {\r\n\t\t\t\treturn match as T;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn array[Math.floor(Math.random() * array.length)];\r\n}\r\n\r\nexport const pickMultipleRandom = <T>(array: readonly T[], quantity: number): T[] => {\r\n\tconst picked: T[] = [];\r\n\tfor (let i = 0; i < quantity; i++) {\r\n\t\tconst target = array.filter((e) => !picked.includes(e));\r\n\t\tconst chosenEntity = pickRandom(target);\r\n\t\tif (!!chosenEntity) {\r\n\t\t\tpicked.push(chosenEntity);\r\n\t\t}\r\n\t}\r\n\treturn picked;\r\n};\r\n\r\nexport const pickRandomAlive = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst chosenEntity = pickRandom(targetBoard);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickMultipleRandomAlive = (board: BoardEntity[], quantity: number): BoardEntity[] => {\r\n\tconst picked: BoardEntity[] = [];\r\n\tfor (let i = 0; i < quantity; i++) {\r\n\t\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead).filter((e) => !picked.includes(e));\r\n\t\tconst chosenEntity = pickRandom(targetBoard);\r\n\t\tif (!!chosenEntity) {\r\n\t\t\tpicked.push(chosenEntity);\r\n\t\t}\r\n\t}\r\n\treturn picked;\r\n};\r\n\r\nexport const pickRandomLowestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst lowestHealth = Math.min(...targetBoard.map((e) => e.health));\r\n\tconst entitiesWithLowestHealth = targetBoard.filter((e) => e.health === lowestHealth);\r\n\tconst chosenEntity = pickRandom(entitiesWithLowestHealth);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomLowestAttack = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst lowestAttack = Math.min(...targetBoard.map((e) => e.attack));\r\n\tconst entitiesWithLowestAttack = targetBoard.filter((e) => e.attack === lowestAttack);\r\n\tconst chosenEntity = pickRandom(entitiesWithLowestAttack);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomHighestAttack = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst highestAttack = Math.max(...targetBoard.map((e) => e.attack));\r\n\tconst entitiesWithHighestAttack = targetBoard.filter((e) => e.attack === highestAttack);\r\n\tconst chosenEntity = pickRandom(entitiesWithHighestAttack);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst highestHealth = Math.max(...targetBoard.map((e) => e.health));\r\n\tconst entitiesWithHighestHealth = targetBoard.filter((e) => e.health === highestHealth);\r\n\tconst chosenEntity = pickRandom(entitiesWithHighestHealth);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const encode = (input: string): string => {\r\n\t// return compressToEncodedURIComponent(input);\r\n\tconst buff = Buffer.from(input, 'utf-8');\r\n\tconst base64 = buff.toString('base64');\r\n\treturn base64;\r\n};\r\n\r\nexport const decode = (base64: string): string => {\r\n\tconst buff = Buffer.from(base64, 'base64');\r\n\tconst str = buff.toString('utf-8');\r\n\treturn str;\r\n};\r\n\r\nexport const pickMultipleRandomDifferent = <T>(list: T[], n: number): T[] => {\r\n\tconst shuffled = shuffleArray([...list]);\r\n\treturn shuffled.slice(0, n);\r\n};\r\n\r\n// https://stackoverflow.com/a/2450976/548701\r\nexport const shuffleArray = <T>(array: T[]): T[] => {\r\n\tlet currentIndex = array.length;\r\n\tlet randomIndex = 0;\r\n\r\n\t// While there remain elements to shuffle...\r\n\twhile (currentIndex != 0) {\r\n\t\t// Pick a remaining element...\r\n\t\trandomIndex = Math.floor(Math.random() * currentIndex);\r\n\t\tcurrentIndex--;\r\n\r\n\t\t// And swap it with the current element.\r\n\t\t[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];\r\n\t}\r\n\r\n\treturn array;\r\n};\r\n\r\nexport const findLast = <T>(\r\n\tarray: readonly T[],\r\n\tpredicate: (value: T, index: number, obj: readonly T[]) => unknown,\r\n): T => {\r\n\tconst filtred = array.filter(predicate);\r\n\tif (!filtred?.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst last = filtred[filtred.length - 1];\r\n\treturn last;\r\n};\r\n\r\nexport type Mutable<T> = {\r\n\t-readonly [P in keyof T]: T[P];\r\n};\r\n"]}
@@ -41,7 +41,7 @@ exports.default = async (event) => {
41
41
  return response;
42
42
  };
43
43
  const simulateBattle = function* (battleInput, cards, cardsData) {
44
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
44
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
45
45
  if (!((_a = cards === null || cards === void 0 ? void 0 : cards.getCards()) === null || _a === void 0 ? void 0 : _a.length)) {
46
46
  console.error('[simulate-bgs-battle] reference cards are empty, cannot simulate battle', cards);
47
47
  return null;
@@ -82,17 +82,15 @@ const simulateBattle = function* (battleInput, cards, cardsData) {
82
82
  attacker: { ...f.attacker },
83
83
  defender: { ...f.defender },
84
84
  }));
85
- const rawPicks = (_p = (_m = battleInput.debugState.forcedRandomPicks) !== null && _m !== void 0 ? _m : (_o = battleInput.debugState.forcedTimewarpedWarghoulTargets) === null || _o === void 0 ? void 0 : _o.map((target) => ({
86
- source: { cardId: 'BG34_Giant_331' },
87
- target,
88
- }))) !== null && _p !== void 0 ? _p : [];
85
+ const rawPicks = (_m = battleInput.debugState.forcedRandomPicks) !== null && _m !== void 0 ? _m : [];
89
86
  debug_state_1.debugState.forcedRandomPicksBase = rawPicks.map((p) => ({
90
87
  source: { ...p.source },
91
88
  target: { ...p.target },
89
+ ...(p.chosenCardId && { chosenCardId: p.chosenCardId }),
92
90
  }));
93
91
  }
94
92
  try {
95
- !((_q = battleInput.options) === null || _q === void 0 ? void 0 : _q.skipInfoLogs) && console.time('simulation');
93
+ !((_o = battleInput.options) === null || _o === void 0 ? void 0 : _o.skipInfoLogs) && console.time('simulation');
96
94
  const outcomes = {};
97
95
  for (let i = 0; i < numberOfSimulations; i++) {
98
96
  const input = (0, input_clone_1.cloneInput3)(inputReady);
@@ -149,7 +147,7 @@ const simulateBattle = function* (battleInput, cards, cardsData) {
149
147
  simulationResult.lost++;
150
148
  simulationResult.damageLost += battleResult.damageDealt;
151
149
  simulationResult.damageLosts.push(battleResult.damageDealt);
152
- outcomes[battleResult.damageDealt] = ((_r = outcomes[battleResult.damageDealt]) !== null && _r !== void 0 ? _r : 0) + 1;
150
+ outcomes[battleResult.damageDealt] = ((_p = outcomes[battleResult.damageDealt]) !== null && _p !== void 0 ? _p : 0) + 1;
153
151
  if (battleInput.playerBoard.player.hpLeft &&
154
152
  battleResult.damageDealt >= battleInput.playerBoard.player.hpLeft) {
155
153
  simulationResult.lostLethal++;
@@ -165,7 +163,7 @@ const simulateBattle = function* (battleInput, cards, cardsData) {
165
163
  }
166
164
  }
167
165
  updateSimulationResult(simulationResult, inputReady, damageConfidence);
168
- !((_s = battleInput.options) === null || _s === void 0 ? void 0 : _s.skipInfoLogs) && console.timeEnd('simulation');
166
+ !((_q = battleInput.options) === null || _q === void 0 ? void 0 : _q.skipInfoLogs) && console.timeEnd('simulation');
169
167
  spectator.prune();
170
168
  simulationResult.outcomeSamples = spectator.buildOutcomeSamples(battleInput.gameState);
171
169
  simulationResult.damageWons = [];