@firestone-hs/simulate-bgs-battle 1.1.733 → 1.1.734

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 (40) hide show
  1. package/dist/cards/impl/enchantments/offensive-sacrifice.js +4 -2
  2. package/dist/cards/impl/enchantments/offensive-sacrifice.js.map +1 -1
  3. package/dist/cards/impl/enchantments/resistance.js +1 -1
  4. package/dist/cards/impl/enchantments/resistance.js.map +1 -1
  5. package/dist/cards/impl/enchantments/toreths-blessing.js +1 -0
  6. package/dist/cards/impl/enchantments/toreths-blessing.js.map +1 -1
  7. package/dist/cards/impl/minion/deathstrider.d.ts +2 -2
  8. package/dist/cards/impl/minion/deathstrider.js +1 -1
  9. package/dist/cards/impl/minion/deathstrider.js.map +1 -1
  10. package/dist/cards/impl/minion/flourishing-frostling.js +0 -2
  11. package/dist/cards/impl/minion/flourishing-frostling.js.map +1 -1
  12. package/dist/cards/impl/minion/glowing-cinder.js +1 -1
  13. package/dist/cards/impl/minion/glowing-cinder.js.map +1 -1
  14. package/dist/cards/impl/minion/polarizing-beatboxer.js +2 -1
  15. package/dist/cards/impl/minion/polarizing-beatboxer.js.map +1 -1
  16. package/dist/cards/impl/trinket/deathtouch-apple.d.ts +2 -2
  17. package/dist/cards/impl/trinket/deathtouch-apple.js +0 -1
  18. package/dist/cards/impl/trinket/deathtouch-apple.js.map +1 -1
  19. package/dist/services/utils.d.ts +1 -1
  20. package/dist/services/utils.js +2 -2
  21. package/dist/services/utils.js.map +1 -1
  22. package/dist/simulation/after-attack.d.ts +1 -1
  23. package/dist/simulation/after-attack.js +21 -3
  24. package/dist/simulation/after-attack.js.map +1 -1
  25. package/dist/simulation/attack.d.ts +1 -1
  26. package/dist/simulation/attack.js +5 -4
  27. package/dist/simulation/attack.js.map +1 -1
  28. package/dist/simulation/auras.js +9 -6
  29. package/dist/simulation/auras.js.map +1 -1
  30. package/dist/simulation/magnetize.d.ts +2 -3
  31. package/dist/simulation/magnetize.js +15 -16
  32. package/dist/simulation/magnetize.js.map +1 -1
  33. package/dist/simulation/remove-minion-from-board.js.map +1 -1
  34. package/dist/simulation/spectator/spectator.d.ts +2 -2
  35. package/dist/simulation/spectator/spectator.js +2 -1
  36. package/dist/simulation/spectator/spectator.js.map +1 -1
  37. package/dist/simulation/stats.d.ts +2 -2
  38. package/dist/simulation/stats.js +4 -5
  39. package/dist/simulation/stats.js.map +1 -1
  40. package/package.json +1 -1
@@ -8,9 +8,11 @@ exports.OffensiveSacrifice = {
8
8
  deathrattleSpawnEnchantmentEffect: (enchantment, minion, input) => {
9
9
  var _a;
10
10
  const buff = (_a = minion.maxAttack) !== null && _a !== void 0 ? _a : minion.attack;
11
- const target = buff > 0 ? (0, utils_1.pickRandomAlive)(input.boardWithDeadEntity.filter((e) => e !== minion)) : null;
11
+ const target = buff > 0
12
+ ? (0, utils_1.pickRandomAlive)(input.boardWithDeadEntity.filter((e) => e !== minion), minion)
13
+ : null;
12
14
  if (!!target) {
13
- (0, stats_1.modifyStats)(target, minion, buff, 0, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);
15
+ (0, stats_1.modifyStats)(target, enchantment, buff, 0, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);
14
16
  }
15
17
  return [];
16
18
  },
@@ -1 +1 @@
1
- {"version":3,"file":"offensive-sacrifice.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/offensive-sacrifice.ts"],"names":[],"mappings":";;;AAMA,mDAA0D;AAE1D,qDAAwD;AAG3C,QAAA,kBAAkB,GAAoC;IAClE,OAAO,EAAE,6BAAoF;IAC7F,iCAAiC,EAAE,CAClC,WAA6B,EAC7B,MAAmB,EACnB,KAAgC,EAC/B,EAAE;;QACH,MAAM,IAAI,GAAG,MAAA,MAAM,CAAC,SAAS,mCAAI,MAAM,CAAC,MAAM,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAA,uBAAe,EAAC,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACxG,IAAI,CAAC,CAAC,MAAM,EAAE;YACb,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,IAAI,EACJ,CAAC,EACD,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Offensive Sacrifice (Dark Gift)\r\n * Deathrattle: Give this minion's Attack to another friendly minion.\r\n */\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { pickRandomAlive } from '../../../services/utils';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { DeathrattleSpawnEnchantmentCard } from '../../card.interface';\r\n\r\nexport const OffensiveSacrifice: DeathrattleSpawnEnchantmentCard = {\r\n\tcardIds: [CardIds.OffensiveSacrifice_OffensiveSacrificeEnchantment_BG36_MidGameEffect_000te2],\r\n\tdeathrattleSpawnEnchantmentEffect: (\r\n\t\tenchantment: BoardEnchantment,\r\n\t\tminion: BoardEntity,\r\n\t\tinput: DeathrattleTriggeredInput,\r\n\t) => {\r\n\t\tconst buff = minion.maxAttack ?? minion.attack;\r\n\t\tconst target = buff > 0 ? pickRandomAlive(input.boardWithDeadEntity.filter((e) => e !== minion)) : null;\r\n\t\tif (!!target) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\ttarget,\r\n\t\t\t\tminion,\r\n\t\t\t\tbuff,\r\n\t\t\t\t0,\r\n\t\t\t\tinput.boardWithDeadEntity,\r\n\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"offensive-sacrifice.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/offensive-sacrifice.ts"],"names":[],"mappings":";;;AAMA,mDAA0D;AAE1D,qDAAwD;AAG3C,QAAA,kBAAkB,GAAoC;IAClE,OAAO,EAAE,6BAAoF;IAC7F,iCAAiC,EAAE,CAClC,WAA6B,EAC7B,MAAmB,EACnB,KAAgC,EAC/B,EAAE;;QACH,MAAM,IAAI,GAAG,MAAA,MAAM,CAAC,SAAS,mCAAI,MAAM,CAAC,MAAM,CAAC;QAC/C,MAAM,MAAM,GACX,IAAI,GAAG,CAAC;YACP,CAAC,CAAC,IAAA,uBAAe,EACf,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,EACrD,MAAM,CACL;YACH,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,CAAC,CAAC,MAAM,EAAE;YACb,IAAA,mBAAW,EACV,MAAM,EACN,WAAW,EACX,IAAI,EACJ,CAAC,EACD,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Offensive Sacrifice (Dark Gift)\r\n * Deathrattle: Give this minion's Attack to another friendly minion.\r\n */\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { pickRandomAlive } from '../../../services/utils';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { DeathrattleSpawnEnchantmentCard } from '../../card.interface';\r\n\r\nexport const OffensiveSacrifice: DeathrattleSpawnEnchantmentCard = {\r\n\tcardIds: [CardIds.OffensiveSacrifice_OffensiveSacrificeEnchantment_BG36_MidGameEffect_000te2],\r\n\tdeathrattleSpawnEnchantmentEffect: (\r\n\t\tenchantment: BoardEnchantment,\r\n\t\tminion: BoardEntity,\r\n\t\tinput: DeathrattleTriggeredInput,\r\n\t) => {\r\n\t\tconst buff = minion.maxAttack ?? minion.attack;\r\n\t\tconst target =\r\n\t\t\tbuff > 0\r\n\t\t\t\t? pickRandomAlive(\r\n\t\t\t\t\t\tinput.boardWithDeadEntity.filter((e) => e !== minion),\r\n\t\t\t\t\t\tminion,\r\n\t\t\t\t )\r\n\t\t\t\t: null;\r\n\t\tif (!!target) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\ttarget,\r\n\t\t\t\tenchantment,\r\n\t\t\t\tbuff,\r\n\t\t\t\t0,\r\n\t\t\t\tinput.boardWithDeadEntity,\r\n\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
@@ -5,7 +5,7 @@ const stats_1 = require("../../../simulation/stats");
5
5
  exports.Resistance = {
6
6
  cardIds: ["BG36_MidGameEffect_000t7e2"],
7
7
  startOfCombat: (minion, input) => {
8
- (0, stats_1.modifyStats)(minion, minion, 0, minion.health, input.playerBoard, input.playerEntity, input.gameState);
8
+ (0, stats_1.setEntityStats)(minion, null, 2 * minion.health, input.playerBoard, input.playerEntity, input.gameState);
9
9
  return true;
10
10
  },
11
11
  };
@@ -1 +1 @@
1
- {"version":3,"file":"resistance.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/resistance.ts"],"names":[],"mappings":";;;AAMA,qDAAwD;AAI3C,QAAA,UAAU,GAAsB;IAC5C,OAAO,EAAE,8BAAqE;IAC9E,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACtG,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Resistance (Dark Gift)\r\n * Start of Combat: Double this minion's Health.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\nimport { CardIds } from '../../../services/card-ids';\r\n\r\nexport const Resistance: StartOfCombatCard = {\r\n\tcardIds: [CardIds.Resistance_ResistanceEnchantment_BG36_MidGameEffect_000t7e2],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tmodifyStats(minion, minion, 0, minion.health, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"resistance.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/resistance.ts"],"names":[],"mappings":";;;AAOA,qDAA2D;AAG9C,QAAA,UAAU,GAAsB;IAC5C,OAAO,EAAE,8BAAqE;IAC9E,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,IAAA,sBAAc,EAAC,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACxG,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Resistance (Dark Gift)\r\n * Start of Combat: Double this minion's Health.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { setEntityStats } from '../../../simulation/stats';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const Resistance: StartOfCombatCard = {\r\n\tcardIds: [CardIds.Resistance_ResistanceEnchantment_BG36_MidGameEffect_000t7e2],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tsetEntityStats(minion, null, 2 * minion.health, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
@@ -7,6 +7,7 @@ exports.TorethsBlessing = {
7
7
  startOfCombat: (minion, input) => {
8
8
  var _a;
9
9
  minion.extraDivineShieldCharges = ((_a = minion.extraDivineShieldCharges) !== null && _a !== void 0 ? _a : 0) + extraHits;
10
+ minion.divineShield = true;
10
11
  return false;
11
12
  },
12
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"toreths-blessing.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/toreths-blessing.ts"],"names":[],"mappings":";;;AASA,MAAM,SAAS,GAAG,CAAC,CAAC;AAEP,QAAA,eAAe,GAAsB;IACjD,OAAO,EAAE,8BAA+E;IACxF,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;;QACvD,MAAM,CAAC,wBAAwB,GAAG,CAAC,MAAA,MAAM,CAAC,wBAAwB,mCAAI,CAAC,CAAC,GAAG,SAAS,CAAC;QACrF,OAAO,KAAK,CAAC;IACd,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Toreth's Blessing (Dark Gift)\r\n * Divine Shield. This minion's Divine Shield takes 2 more hits to break.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\nimport { CardIds } from '../../../services/card-ids';\r\n\r\nconst extraHits = 2;\r\n\r\nexport const TorethsBlessing: StartOfCombatCard = {\r\n\tcardIds: [CardIds.TorethsBlessing_TorethsBlessingEnchantment_BG36_MidGameEffect_000t15e],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tminion.extraDivineShieldCharges = (minion.extraDivineShieldCharges ?? 0) + extraHits;\r\n\t\treturn false;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"toreths-blessing.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/toreths-blessing.ts"],"names":[],"mappings":";;;AASA,MAAM,SAAS,GAAG,CAAC,CAAC;AAEP,QAAA,eAAe,GAAsB;IACjD,OAAO,EAAE,8BAA+E;IACxF,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;;QACvD,MAAM,CAAC,wBAAwB,GAAG,CAAC,MAAA,MAAM,CAAC,wBAAwB,mCAAI,CAAC,CAAC,GAAG,SAAS,CAAC;QAErF,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC;QAC3B,OAAO,KAAK,CAAC;IACd,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Toreth's Blessing (Dark Gift)\r\n * Divine Shield. This minion's Divine Shield takes 2 more hits to break.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nconst extraHits = 2;\r\n\r\nexport const TorethsBlessing: StartOfCombatCard = {\r\n\tcardIds: [CardIds.TorethsBlessing_TorethsBlessingEnchantment_BG36_MidGameEffect_000t15e],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tminion.extraDivineShieldCharges = (minion.extraDivineShieldCharges ?? 0) + extraHits;\r\n\t\t// A crutch, since sometimes it looks like the correct flag is not sent back correctly\r\n\t\tminion.divineShield = true;\r\n\t\treturn false;\r\n\t},\r\n};\r\n"]}
@@ -1,2 +1,2 @@
1
- import { OnWheneverAnotherMinionAttacksCard } from '../../card.interface';
2
- export declare const Deathstrider: OnWheneverAnotherMinionAttacksCard;
1
+ import { AfterAnotherMinionAttacksCard } from '../../card.interface';
2
+ export declare const Deathstrider: AfterAnotherMinionAttacksCard;
@@ -7,7 +7,7 @@ const deathrattle_utils_1 = require("../../../simulation/deathrattle-utils");
7
7
  const utils_1 = require("../../../utils");
8
8
  exports.Deathstrider = {
9
9
  cardIds: ["BG36_208", "BG36_208_G"],
10
- onWheneverAnotherMinionAttacks: (minion, input) => {
10
+ afterAnotherMinionAttacks: (minion, input) => {
11
11
  if (!(0, utils_1.hasEntityMechanic)(input.attacker, reference_data_1.GameTag.BACON_RALLY, input.gameState.allCards)) {
12
12
  return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"deathstrider.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/deathstrider.ts"],"names":[],"mappings":";;;AAOA,iEAAuD;AAEvD,6FAA4F;AAC5F,6EAA6E;AAE7E,0CAAmD;AAItC,QAAA,YAAY,GAAuC;IAC/D,OAAO,EAAE,0BAAgE;IACzE,8BAA8B,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QAC7E,IAAI,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,QAAQ,EAAE,wBAAO,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;YACtF,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,mBAAmB,GAAG,IAAA,wCAAoB,EAC/C,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,CACf,CAAC,CAAC,CAAC,CAAC;QACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC/B,IAAI,CAAC,mBAAmB,EAAE;gBACzB,MAAM;aACN;YACD,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,mBAAmB,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,aAAa,CACnB,CAAC;YACF,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7G,IAAA,uDAA2B,EAC1B,mBAAmB,EACnB,cAAc,EACd,CAAC,mBAAmB,CAAC,EACrB,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EACpG,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EACpG,KAAK,CAAC,SAAS,EACf,KAAK,CACL,CAAC;SACF;QACD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Deathstrider (Tier 6, 10/11)\r\n * After a friendly Rally minion attacks, trigger your left-most Deathrattle.\r\n *\r\n * Golden Deathstrider (Tier 6, 20/22)\r\n * After a friendly Rally minion attacks, trigger your left-most Deathrattle twice.\r\n */\r\nimport { GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { processDeathrattleForMinion } from '../../../simulation/deathrattle-orchestration';\r\nimport { getValidDeathrattles } from '../../../simulation/deathrattle-utils';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { hasEntityMechanic } from '../../../utils';\r\nimport { OnWheneverAnotherMinionAttacksCard } from '../../card.interface';\r\nimport { CardIds } from '../../../services/card-ids';\r\n\r\nexport const Deathstrider: OnWheneverAnotherMinionAttacksCard = {\r\n\tcardIds: [CardIds.Deathstrider_BG36_208, CardIds.Deathstrider_BG36_208_G],\r\n\tonWheneverAnotherMinionAttacks: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tif (!hasEntityMechanic(input.attacker, GameTag.BACON_RALLY, input.gameState.allCards)) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst loops = minion.cardId === CardIds.Deathstrider_BG36_208_G ? 2 : 1;\r\n\t\tconst leftMostDeathrattle = getValidDeathrattles(\r\n\t\t\tinput.attackingBoard,\r\n\t\t\tinput.attackingHero,\r\n\t\t\tinput.gameState,\r\n\t\t)[0];\r\n\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\tif (!leftMostDeathrattle) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\tminion,\r\n\t\t\t\tleftMostDeathrattle,\r\n\t\t\t\tinput.attackingBoard,\r\n\t\t\t\tinput.attackingHero,\r\n\t\t\t\tinput.defendingHero,\r\n\t\t\t);\r\n\t\t\tconst indexFromRight = input.attackingBoard.length - (input.attackingBoard.indexOf(leftMostDeathrattle) + 1);\r\n\t\t\tprocessDeathrattleForMinion(\r\n\t\t\t\tleftMostDeathrattle,\r\n\t\t\t\tindexFromRight,\r\n\t\t\t\t[leftMostDeathrattle],\r\n\t\t\t\tleftMostDeathrattle.friendly ? input.gameState.gameState.player : input.gameState.gameState.opponent,\r\n\t\t\t\tleftMostDeathrattle.friendly ? input.gameState.gameState.opponent : input.gameState.gameState.player,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t\tfalse,\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":"deathstrider.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/deathstrider.ts"],"names":[],"mappings":";;;AAOA,iEAAuD;AAGvD,6FAA4F;AAC5F,6EAA6E;AAE7E,0CAAmD;AAGtC,QAAA,YAAY,GAAkC;IAC1D,OAAO,EAAE,0BAAgE;IACzE,yBAAyB,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QACxE,IAAI,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,QAAQ,EAAE,wBAAO,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;YACtF,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,mBAAmB,GAAG,IAAA,wCAAoB,EAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAChH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC/B,IAAI,CAAC,mBAAmB,EAAE;gBACzB,MAAM;aACN;YACD,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,mBAAmB,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,aAAa,CACnB,CAAC;YACF,MAAM,cAAc,GACnB,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;YACvF,IAAA,uDAA2B,EAC1B,mBAAmB,EACnB,cAAc,EACd,CAAC,mBAAmB,CAAC,EACrB,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,EACpG,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EACpG,KAAK,CAAC,SAAS,EACf,KAAK,CACL,CAAC;SACF;QACD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Deathstrider (Tier 6, 10/11)\r\n * After a friendly Rally minion attacks, trigger your left-most Deathrattle.\r\n *\r\n * Golden Deathstrider (Tier 6, 20/22)\r\n * After a friendly Rally minion attacks, trigger your left-most Deathrattle twice.\r\n */\r\nimport { GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { processDeathrattleForMinion } from '../../../simulation/deathrattle-orchestration';\r\nimport { getValidDeathrattles } from '../../../simulation/deathrattle-utils';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { hasEntityMechanic } from '../../../utils';\r\nimport { AfterAnotherMinionAttacksCard } from '../../card.interface';\r\n\r\nexport const Deathstrider: AfterAnotherMinionAttacksCard = {\r\n\tcardIds: [CardIds.Deathstrider_BG36_208, CardIds.Deathstrider_BG36_208_G],\r\n\tafterAnotherMinionAttacks: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tif (!hasEntityMechanic(input.attacker, GameTag.BACON_RALLY, input.gameState.allCards)) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst loops = minion.cardId === CardIds.Deathstrider_BG36_208_G ? 2 : 1;\r\n\t\tconst leftMostDeathrattle = getValidDeathrattles(input.attackingBoard, input.attackingHero, input.gameState)[0];\r\n\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\tif (!leftMostDeathrattle) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\tminion,\r\n\t\t\t\tleftMostDeathrattle,\r\n\t\t\t\tinput.attackingBoard,\r\n\t\t\t\tinput.attackingHero,\r\n\t\t\t\tinput.defendingHero,\r\n\t\t\t);\r\n\t\t\tconst indexFromRight =\r\n\t\t\t\tinput.attackingBoard.length - (input.attackingBoard.indexOf(leftMostDeathrattle) + 1);\r\n\t\t\tprocessDeathrattleForMinion(\r\n\t\t\t\tleftMostDeathrattle,\r\n\t\t\t\tindexFromRight,\r\n\t\t\t\t[leftMostDeathrattle],\r\n\t\t\t\tleftMostDeathrattle.friendly ? input.gameState.gameState.player : input.gameState.gameState.opponent,\r\n\t\t\t\tleftMostDeathrattle.friendly ? input.gameState.gameState.opponent : input.gameState.gameState.player,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
@@ -20,11 +20,9 @@ exports.FlourishingFrostling = {
20
20
  const statsBonusFrostling = multiplierFrostling * input.hero.globalInfo.FrostlingBonus;
21
21
  if (input.applyAttackAuras) {
22
22
  minion.attack = Math.max(0, minion.attack - (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling);
23
- minion.maxAttack = Math.max(0, minion.maxAttack - (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling);
24
23
  }
25
24
  if (input.applyHealthAuras) {
26
25
  minion.health = Math.max(1, minion.health - (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling);
27
- minion.maxHealth = Math.max(1, minion.maxHealth - (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling);
28
26
  }
29
27
  },
30
28
  onGlobalInfoUpdated: (minion, input) => {
@@ -1 +1 @@
1
- {"version":3,"file":"flourishing-frostling.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/flourishing-frostling.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Glim Guardian (Tier 3, 1/4)\r\n * Rally: Gain +2 Attack.\r\n *\r\n * Golden Glim Guardian (Tier 3, 2/8)\r\n * Rally: Gain +4 Attack.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { OnGlobalInfoUpdatedInput } from '../../../mechanics/player-global-effects';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnDespawnedCard, OnGlobalInfoUpdatedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nconst attackBaseValue = 2;\r\nconst healthBaseValue = 1;\r\n\r\nexport const FlourishingFrostling: OnSpawnedCard & OnDespawnedCard & OnGlobalInfoUpdatedCard = {\r\n\tcardIds: [CardIds.FlourishingFrostling_BG26_537, CardIds.FlourishingFrostling_BG26_537_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tconst multiplierFrostling = minion.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\tconst statsBonusFrostling = multiplierFrostling * input.hero.globalInfo.FrostlingBonus;\r\n\t\tmodifyStats(\r\n\t\t\tminion,\r\n\t\t\tnull,\r\n\t\t\tinput.applyAttackAuras\r\n\t\t\t\t? (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling\r\n\t\t\t\t: 0,\r\n\t\t\tinput.applyHealthAuras\r\n\t\t\t\t? (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling\r\n\t\t\t\t: 0,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.gameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst multiplierFrostling = minion.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\tconst statsBonusFrostling = multiplierFrostling * input.hero.globalInfo.FrostlingBonus;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tminion.attack - (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling,\r\n\t\t\t);\r\n\t\t\tminion.maxAttack = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tminion.maxAttack - (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health = Math.max(\r\n\t\t\t\t1,\r\n\t\t\t\tminion.health - (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling,\r\n\t\t\t);\r\n\t\t\tminion.maxHealth = Math.max(\r\n\t\t\t\t1,\r\n\t\t\t\tminion.maxHealth - (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling,\r\n\t\t\t);\r\n\t\t}\r\n\t},\r\n\tonGlobalInfoUpdated: (minion: BoardEntity, input: OnGlobalInfoUpdatedInput) => {\r\n\t\tconst multiplierFrostling = minion.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\tconst statsBonusFrostling = multiplierFrostling * input.hero.globalInfo.FrostlingBonus;\r\n\t\tfor (const value of input.values) {\r\n\t\t\tif (value.type === 'ElementalAttackBuff') {\r\n\t\t\t\tconst delta = value.newValue - value.oldValue;\r\n\t\t\t\tminion.attack += delta * statsBonusFrostling;\r\n\t\t\t\tminion.maxAttack = minion.attack;\r\n\t\t\t}\r\n\t\t\tif (value.type === 'ElementalHealthBuff') {\r\n\t\t\t\tconst delta = value.newValue - value.oldValue;\r\n\t\t\t\tminion.health += delta * statsBonusFrostling;\r\n\t\t\t\tminion.maxHealth = Math.max(minion.maxHealth, minion.health);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"flourishing-frostling.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/flourishing-frostling.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Glim Guardian (Tier 3, 1/4)\r\n * Rally: Gain +2 Attack.\r\n *\r\n * Golden Glim Guardian (Tier 3, 2/8)\r\n * Rally: Gain +4 Attack.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { OnGlobalInfoUpdatedInput } from '../../../mechanics/player-global-effects';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnDespawnedCard, OnGlobalInfoUpdatedCard, OnSpawnedCard } from '../../card.interface';\r\n\r\nconst attackBaseValue = 2;\r\nconst healthBaseValue = 1;\r\n\r\nexport const FlourishingFrostling: OnSpawnedCard & OnDespawnedCard & OnGlobalInfoUpdatedCard = {\r\n\tcardIds: [CardIds.FlourishingFrostling_BG26_537, CardIds.FlourishingFrostling_BG26_537_G],\r\n\tonSpawned: (minion: BoardEntity, input: OnSpawnInput) => {\r\n\t\tconst multiplierFrostling = minion.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\tconst statsBonusFrostling = multiplierFrostling * input.hero.globalInfo.FrostlingBonus;\r\n\t\tmodifyStats(\r\n\t\t\tminion,\r\n\t\t\tnull,\r\n\t\t\tinput.applyAttackAuras\r\n\t\t\t\t? (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling\r\n\t\t\t\t: 0,\r\n\t\t\tinput.applyHealthAuras\r\n\t\t\t\t? (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling\r\n\t\t\t\t: 0,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.gameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t},\r\n\tonDespawned: (minion: BoardEntity, input: OnDespawnInput) => {\r\n\t\tconst multiplierFrostling = minion.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\tconst statsBonusFrostling = multiplierFrostling * input.hero.globalInfo.FrostlingBonus;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack = Math.max(\r\n\t\t\t\t0,\r\n\t\t\t\tminion.attack - (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling,\r\n\t\t\t);\r\n\t\t\t// We need to keep track of the max attack even after death, in case stats need to be given\r\n\t\t\t// minion.maxAttack = Math.max(\r\n\t\t\t// \t0,\r\n\t\t\t// \tminion.maxAttack - (attackBaseValue + input.hero.globalInfo.ElementalAttackBuff) * statsBonusFrostling,\r\n\t\t\t// );\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health = Math.max(\r\n\t\t\t\t1,\r\n\t\t\t\tminion.health - (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling,\r\n\t\t\t);\r\n\t\t\t// minion.maxHealth = Math.max(\r\n\t\t\t// \t1,\r\n\t\t\t// \tminion.maxHealth - (healthBaseValue + input.hero.globalInfo.ElementalHealthBuff) * statsBonusFrostling,\r\n\t\t\t// );\r\n\t\t}\r\n\t},\r\n\tonGlobalInfoUpdated: (minion: BoardEntity, input: OnGlobalInfoUpdatedInput) => {\r\n\t\tconst multiplierFrostling = minion.cardId === CardIds.FlourishingFrostling_BG26_537_G ? 2 : 1;\r\n\t\tconst statsBonusFrostling = multiplierFrostling * input.hero.globalInfo.FrostlingBonus;\r\n\t\tfor (const value of input.values) {\r\n\t\t\tif (value.type === 'ElementalAttackBuff') {\r\n\t\t\t\tconst delta = value.newValue - value.oldValue;\r\n\t\t\t\tminion.attack += delta * statsBonusFrostling;\r\n\t\t\t\tminion.maxAttack = minion.attack;\r\n\t\t\t}\r\n\t\t\tif (value.type === 'ElementalHealthBuff') {\r\n\t\t\t\tconst delta = value.newValue - value.oldValue;\r\n\t\t\t\tminion.health += delta * statsBonusFrostling;\r\n\t\t\t\tminion.maxHealth = Math.max(minion.maxHealth, minion.health);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -6,7 +6,7 @@ exports.GlowingCinder = {
6
6
  cardIds: ["BG32_842", "BG32_842_G"],
7
7
  deathrattleSpawn: (minion, input) => {
8
8
  const mult = minion.cardId === "BG32_842_G" ? 2 : 1;
9
- (0, global_info_helpers_1.updateElementalStatsBuff)(minion, input.boardWithDeadEntity, input.boardWithDeadEntityHero, 2 * mult, 0, input.gameState);
9
+ (0, global_info_helpers_1.updateElementalStatsBuff)(minion, input.boardWithDeadEntity, input.boardWithDeadEntityHero, 0, 2 * mult, input.gameState);
10
10
  return [];
11
11
  },
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"glowing-cinder.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/glowing-cinder.ts"],"names":[],"mappings":";;;AAGA,iFAAmF;AAGtE,QAAA,aAAa,GAAyB;IAClD,OAAO,EAAE,0BAAkE;IAC3E,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAA,8CAAwB,EACvB,MAAM,EACN,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,CAAC,GAAG,IAAI,EACR,CAAC,EACD,KAAK,CAAC,SAAS,CACf,CAAC;QACF,OAAO,EAAE,CAAC;IACX,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 { updateElementalStatsBuff } from '../../../simulation/global-info-helpers';\r\nimport { DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nexport const GlowingCinder: DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.GlowingCinder_BG32_842, CardIds.GlowingCinder_BG32_842_G],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.GlowingCinder_BG32_842_G ? 2 : 1;\r\n\t\tupdateElementalStatsBuff(\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\t0,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"glowing-cinder.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/glowing-cinder.ts"],"names":[],"mappings":";;;AAGA,iFAAmF;AAGtE,QAAA,aAAa,GAAyB;IAClD,OAAO,EAAE,0BAAkE;IAC3E,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,IAAA,8CAAwB,EACvB,MAAM,EACN,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,CAAC,EACD,CAAC,GAAG,IAAI,EACR,KAAK,CAAC,SAAS,CACf,CAAC;QACF,OAAO,EAAE,CAAC;IACX,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 { updateElementalStatsBuff } from '../../../simulation/global-info-helpers';\r\nimport { DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nexport const GlowingCinder: DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.GlowingCinder_BG32_842, CardIds.GlowingCinder_BG32_842_G],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.GlowingCinder_BG32_842_G ? 2 : 1;\r\n\t\tupdateElementalStatsBuff(\r\n\t\t\tminion,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t0,\r\n\t\t\t2 * mult,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
@@ -10,7 +10,8 @@ exports.PolarizingBeatboxer = {
10
10
  }
11
11
  const mult = entity.cardId === "BG26_149_G" ? 2 : 1;
12
12
  for (let i = 0; i < mult; i++) {
13
- (0, magnetize_1.magnetizeToTarget)([entity], entity, [input.magnetizedCard], input.board, input.hero, input.otherBoard, input.otherHero, input.gameState, false);
13
+ const cardsToMagnetize = [input.magnetizedCard.cardId];
14
+ (0, magnetize_1.magnetizeToTarget)([entity], entity, cardsToMagnetize, input.board, input.hero, input.otherBoard, input.otherHero, input.gameState, false);
14
15
  input.gameState.spectator.registerPowerTarget(entity, input.magnetizeTarget, input.board, input.hero, input.otherHero);
15
16
  }
16
17
  },
@@ -1 +1 @@
1
- {"version":3,"file":"polarizing-beatboxer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/polarizing-beatboxer.ts"],"names":[],"mappings":";;;AAGA,6DAAyF;AAG5E,QAAA,mBAAmB,GAAyB;IACxD,OAAO,EAAE,0BAA8E;IACvF,gBAAgB,EAAE,CAAC,MAAkC,EAAE,KAA4B,EAAE,EAAE;QACtF,IAAI,2BAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAC9D,OAAO;SACP;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA2C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,IAAA,6BAAiB,EAChB,CAAC,MAAqB,CAAC,EACvB,MAAM,EACN,CAAC,KAAK,CAAC,cAAc,CAAC,EACtB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,EAEf,KAAK,CACL,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 { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { magnetizeToTarget, OnAfterMagnetizeInput } from '../../../simulation/magnetize';\r\nimport { OnAfterMagnetizeCard } from '../../card.interface';\r\n\r\nexport const PolarizingBeatboxer: OnAfterMagnetizeCard = {\r\n\tcardIds: [CardIds.PolarizingBeatboxer_BG26_149, CardIds.PolarizingBeatboxer_BG26_149_G],\r\n\tonAfterMagnetize: (entity: BoardEntity | BoardTrinket, input: OnAfterMagnetizeInput) => {\r\n\t\tif (PolarizingBeatboxer.cardIds.includes(input.source.cardId)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst mult = entity.cardId === CardIds.PolarizingBeatboxer_BG26_149_G ? 2 : 1;\r\n\t\tfor (let i = 0; i < mult; i++) {\r\n\t\t\tmagnetizeToTarget(\r\n\t\t\t\t[entity as BoardEntity],\r\n\t\t\t\tentity,\r\n\t\t\t\t[input.magnetizedCard],\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\t// Don't retrigger effects that say \"the first time you magnetize this\"\r\n\t\t\t\tfalse,\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":"polarizing-beatboxer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/polarizing-beatboxer.ts"],"names":[],"mappings":";;;AAGA,6DAAyF;AAG5E,QAAA,mBAAmB,GAAyB;IACxD,OAAO,EAAE,0BAA8E;IACvF,gBAAgB,EAAE,CAAC,MAAkC,EAAE,KAA4B,EAAE,EAAE;QACtF,IAAI,2BAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;YAC9D,OAAO;SACP;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA2C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,gBAAgB,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YACvD,IAAA,6BAAiB,EAChB,CAAC,MAAqB,CAAC,EACvB,MAAM,EACN,gBAAgB,EAChB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,EAEf,KAAK,CACL,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 { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { magnetizeToTarget, OnAfterMagnetizeInput } from '../../../simulation/magnetize';\r\nimport { OnAfterMagnetizeCard } from '../../card.interface';\r\n\r\nexport const PolarizingBeatboxer: OnAfterMagnetizeCard = {\r\n\tcardIds: [CardIds.PolarizingBeatboxer_BG26_149, CardIds.PolarizingBeatboxer_BG26_149_G],\r\n\tonAfterMagnetize: (entity: BoardEntity | BoardTrinket, input: OnAfterMagnetizeInput) => {\r\n\t\tif (PolarizingBeatboxer.cardIds.includes(input.source.cardId)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst mult = entity.cardId === CardIds.PolarizingBeatboxer_BG26_149_G ? 2 : 1;\r\n\t\tfor (let i = 0; i < mult; i++) {\r\n\t\t\tconst cardsToMagnetize = [input.magnetizedCard.cardId];\r\n\t\t\tmagnetizeToTarget(\r\n\t\t\t\t[entity as BoardEntity],\r\n\t\t\t\tentity,\r\n\t\t\t\tcardsToMagnetize,\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\t// Don't retrigger effects that say \"the first time you magnetize this\"\r\n\t\t\t\tfalse,\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 { AfterRebornCard, DefaultScriptDataNumCard } from '../../card.interface';
2
- export declare const DeathtouchApple: AfterRebornCard & DefaultScriptDataNumCard;
1
+ import { AfterRebornCard } from '../../card.interface';
2
+ export declare const DeathtouchApple: AfterRebornCard;
@@ -6,7 +6,6 @@ const reborn_1 = require("../../../keywords/reborn");
6
6
  const utils_1 = require("../../../utils");
7
7
  exports.DeathtouchApple = {
8
8
  cardIds: ["BG35_MagicItem_731"],
9
- defaultScriptDataNum: (cardId) => 3,
10
9
  afterReborn: (trinket, input) => {
11
10
  if (trinket.scriptDataNum1 > 0 && !input.rebornEntity.reborn) {
12
11
  const target = input.rebornEntity;
@@ -1 +1 @@
1
- {"version":3,"file":"deathtouch-apple.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/deathtouch-apple.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,qDAAwD;AAGxD,0CAAiD;AAGpC,QAAA,eAAe,GAA+C;IAC1E,OAAO,EAAE,sBAA4C;IACrD,oBAAoB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,OAAmC,EAAE,KAAwB,EAAE,EAAE;QAC9E,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE;YAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YAClC,IACC,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,yBAAyB,EAC/B,qBAAI,CAAC,MAAM,EACX,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,EACA;gBACD,IAAA,qBAAY,EACX,MAAM,EACN,IAAI,EACJ,KAAK,CAAC,qBAAqB,EAC3B,KAAK,CAAC,yBAAyB,EAC/B,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,OAAO,EACP,MAAM,EACN,KAAK,CAAC,qBAAqB,EAC3B,KAAK,CAAC,yBAAyB,EAC/B,KAAK,CAAC,iBAAiB,CACvB,CAAC;gBACF,OAAO,CAAC,cAAc,EAAE,CAAC;aACzB;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { updateReborn } from '../../../keywords/reborn';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { RebornEffectInput } from '../../../simulation/reborn';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { AfterRebornCard, DefaultScriptDataNumCard } from '../../card.interface';\r\n\r\nexport const DeathtouchApple: AfterRebornCard & DefaultScriptDataNumCard = {\r\n\tcardIds: [CardIds.DeathtouchApple_BG35_MagicItem_731],\r\n\tdefaultScriptDataNum: (cardId: string) => 3,\r\n\tafterReborn: (trinket: BoardTrinket | BoardEntity, input: RebornEffectInput) => {\r\n\t\tif (trinket.scriptDataNum1 > 0 && !input.rebornEntity.reborn) {\r\n\t\t\tconst target = input.rebornEntity;\r\n\t\t\tif (\r\n\t\t\t\thasCorrectTribe(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tRace.UNDEAD,\r\n\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t)\r\n\t\t\t) {\r\n\t\t\t\tupdateReborn(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tinput.boardWithKilledMinion,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tinput.opponentBoardHero,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\ttrinket,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tinput.boardWithKilledMinion,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tinput.opponentBoardHero,\r\n\t\t\t\t);\r\n\t\t\t\ttrinket.scriptDataNum1--;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"deathtouch-apple.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/deathtouch-apple.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,qDAAwD;AAGxD,0CAAiD;AAGpC,QAAA,eAAe,GAAoB;IAC/C,OAAO,EAAE,sBAA4C;IAGrD,WAAW,EAAE,CAAC,OAAmC,EAAE,KAAwB,EAAE,EAAE;QAC9E,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE;YAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YAClC,IACC,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,yBAAyB,EAC/B,qBAAI,CAAC,MAAM,EACX,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,EACA;gBACD,IAAA,qBAAY,EACX,MAAM,EACN,IAAI,EACJ,KAAK,CAAC,qBAAqB,EAC3B,KAAK,CAAC,yBAAyB,EAC/B,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,OAAO,EACP,MAAM,EACN,KAAK,CAAC,qBAAqB,EAC3B,KAAK,CAAC,yBAAyB,EAC/B,KAAK,CAAC,iBAAiB,CACvB,CAAC;gBACF,OAAO,CAAC,cAAc,EAAE,CAAC;aACzB;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { updateReborn } from '../../../keywords/reborn';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { RebornEffectInput } from '../../../simulation/reborn';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { AfterRebornCard } from '../../card.interface';\r\n\r\nexport const DeathtouchApple: AfterRebornCard = {\r\n\tcardIds: [CardIds.DeathtouchApple_BG35_MagicItem_731],\r\n\t// We carry over the info from the shop state, as this only reset at the beginning of the turn (not combat)\r\n\t// defaultScriptDataNum: (cardId: string) => 3,\r\n\tafterReborn: (trinket: BoardTrinket | BoardEntity, input: RebornEffectInput) => {\r\n\t\tif (trinket.scriptDataNum1 > 0 && !input.rebornEntity.reborn) {\r\n\t\t\tconst target = input.rebornEntity;\r\n\t\t\tif (\r\n\t\t\t\thasCorrectTribe(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tRace.UNDEAD,\r\n\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t)\r\n\t\t\t) {\r\n\t\t\t\tupdateReborn(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tinput.boardWithKilledMinion,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tinput.opponentBoardHero,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\ttrinket,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tinput.boardWithKilledMinion,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tinput.opponentBoardHero,\r\n\t\t\t\t);\r\n\t\t\t\ttrinket.scriptDataNum1--;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -10,7 +10,7 @@ export { partitionArray, sleep };
10
10
  export declare function pickRandom<T>(array: readonly T[]): T;
11
11
  export declare function pickRandom<T extends BoardEntity>(array: readonly T[], sourceEntity: BoardEntity | BoardSecret | BoardTrinket): T;
12
12
  export declare const pickMultipleRandom: <T>(array: readonly T[], quantity: number) => T[];
13
- export declare const pickRandomAlive: (board: BoardEntity[]) => BoardEntity;
13
+ export declare const pickRandomAlive: (board: BoardEntity[], sourceEntity?: BoardEntity | BoardSecret | BoardTrinket) => BoardEntity;
14
14
  export declare const pickMultipleRandomAlive: (board: BoardEntity[], quantity: number) => BoardEntity[];
15
15
  export declare const pickRandomLowestHealth: (board: BoardEntity[]) => BoardEntity;
16
16
  export declare const pickRandomLowestAttack: (board: BoardEntity[]) => BoardEntity;
@@ -62,9 +62,9 @@ const pickMultipleRandom = (array, quantity) => {
62
62
  return picked;
63
63
  };
64
64
  exports.pickMultipleRandom = pickMultipleRandom;
65
- const pickRandomAlive = (board) => {
65
+ const pickRandomAlive = (board, sourceEntity) => {
66
66
  const targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);
67
- const chosenEntity = pickRandom(targetBoard);
67
+ const chosenEntity = pickRandom(targetBoard, sourceEntity);
68
68
  return chosenEntity;
69
69
  };
70
70
  exports.pickRandomAlive = pickRandomAlive;
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoardTrinket } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { BoardSecret } from '../board-secret';\r\nimport { debugState } from '../debug-state';\r\nimport { random } from './rng';\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>(\r\n\tarray: readonly T[],\r\n\tsourceEntity: BoardEntity | BoardSecret | BoardTrinket,\r\n): T;\r\nexport function pickRandom<T>(array: readonly T[], sourceEntity?: BoardEntity | BoardSecret | BoardTrinket): 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(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(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 { BoardTrinket } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { BoardSecret } from '../board-secret';\r\nimport { debugState } from '../debug-state';\r\nimport { random } from './rng';\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>(\r\n\tarray: readonly T[],\r\n\tsourceEntity: BoardEntity | BoardSecret | BoardTrinket,\r\n): T;\r\nexport function pickRandom<T>(array: readonly T[], sourceEntity?: BoardEntity | BoardSecret | BoardTrinket): 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(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 = (\r\n\tboard: BoardEntity[],\r\n\tsourceEntity?: BoardEntity | BoardSecret | BoardTrinket,\r\n): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst chosenEntity = pickRandom(targetBoard, sourceEntity);\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(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"]}
@@ -2,7 +2,7 @@ import { BgsPlayerEntity } from '../bgs-player-entity';
2
2
  import { BoardEntity } from '../board-entity';
3
3
  import { FullGameState } from './internal-game-state';
4
4
  export declare const applyAfterAttackEffects: (attackingEntity: BoardEntity, attackingBoard: BoardEntity[], attackingBoardHero: BgsPlayerEntity, defendingEntity: BoardEntity, defendingBoard: BoardEntity[], defendingBoardHero: BgsPlayerEntity, damageDoneByAttacker: number, damageDoneByDefender: number, gameState: FullGameState) => void;
5
- export declare const applyAfterAttackTrinkets: (attackingEntity: BoardEntity, attackingBoard: BoardEntity[], attackingBoardHero: BgsPlayerEntity, defendingEntity: BoardEntity, defendingBoard: BoardEntity[], defendingBoardHero: BgsPlayerEntity, damageDoneByAttacker: number, damageDoneByDefender: number, gameState: FullGameState) => void;
5
+ export declare const applyAfterAttackTrinketsAndBoard: (attackingEntity: BoardEntity, attackingBoard: BoardEntity[], attackingBoardHero: BgsPlayerEntity, defendingEntity: BoardEntity, defendingBoard: BoardEntity[], defendingBoardHero: BgsPlayerEntity, damageDoneByAttacker: number, damageDoneByDefender: number, gameState: FullGameState) => void;
6
6
  export interface OnAfterAttackInput {
7
7
  attacker: BoardEntity;
8
8
  attackingHero: BgsPlayerEntity;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applyAfterAttackTrinkets = exports.applyAfterAttackEffects = void 0;
3
+ exports.applyAfterAttackTrinketsAndBoard = exports.applyAfterAttackEffects = void 0;
4
4
  const card_interface_1 = require("../cards/card.interface");
5
5
  const _card_mappings_1 = require("../cards/impl/_card-mappings");
6
6
  const stealth_1 = require("../keywords/stealth");
@@ -34,7 +34,7 @@ const applyAfterAttackEffects = (attackingEntity, attackingBoard, attackingBoard
34
34
  (0, pending_effects_1.resolvePendingEffects)(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState);
35
35
  };
36
36
  exports.applyAfterAttackEffects = applyAfterAttackEffects;
37
- const applyAfterAttackTrinkets = (attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState) => {
37
+ const applyAfterAttackTrinketsAndBoard = (attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState) => {
38
38
  var _a;
39
39
  const trinkets = (_a = attackingBoardHero.trinkets) !== null && _a !== void 0 ? _a : [];
40
40
  for (const trinket of trinkets) {
@@ -52,8 +52,26 @@ const applyAfterAttackTrinkets = (attackingEntity, attackingBoard, attackingBoar
52
52
  });
53
53
  }
54
54
  }
55
+ for (const minion of attackingBoard) {
56
+ if (minion === attackingEntity) {
57
+ continue;
58
+ }
59
+ const afterAttackImpl = _card_mappings_1.cardMappings[minion.cardId];
60
+ if ((0, card_interface_1.hasAfterAnotherMinionAttacks)(afterAttackImpl)) {
61
+ afterAttackImpl.afterAnotherMinionAttacks(minion, {
62
+ attacker: attackingEntity,
63
+ attackingBoard: attackingBoard,
64
+ attackingHero: attackingBoardHero,
65
+ defendingEntity: defendingEntity,
66
+ defendingBoard: defendingBoard,
67
+ defendingHero: defendingBoardHero,
68
+ gameState: gameState,
69
+ playerIsFriendly: attackingBoardHero.friendly,
70
+ });
71
+ }
72
+ }
55
73
  };
56
- exports.applyAfterAttackTrinkets = applyAfterAttackTrinkets;
74
+ exports.applyAfterAttackTrinketsAndBoard = applyAfterAttackTrinketsAndBoard;
57
75
  const applyOnAttackQuest = (attackingEntity, attackingBoard, attackingBoardHero, gameState) => {
58
76
  var _a;
59
77
  const quests = (_a = attackingBoardHero.questEntities) !== null && _a !== void 0 ? _a : [];
@@ -1 +1 @@
1
- {"version":3,"file":"after-attack.js","sourceRoot":"","sources":["../../src/simulation/after-attack.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasAfterAnotherMinionAttacks } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateStealth } from '../keywords/stealth';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { resolvePendingEffects } from './pending-effects';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const applyAfterAttackEffects = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageDoneByAttacker: number,\r\n\tdamageDoneByDefender: number,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// https://replays.firestoneapp.com/?reviewId=9c3ba0f2-d049-4f79-8ec2-7b20ec8d0f68&turn=11&action=5\r\n\t// It looks like Stealth is removed only once the damage is dealt?\r\n\tupdateStealth(attackingEntity, false, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);\r\n\r\n\tif (\r\n\t\tattackingEntity.cardId === CardIds.IncorporealCorporal_BG26_RLK_117 ||\r\n\t\tattackingEntity.cardId === CardIds.IncorporealCorporal_BG26_RLK_117_G\r\n\t) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\t// Putricide-only\r\n\telse if (attackingEntity.additionalCards?.includes(CardIds.IncorporealCorporal_BG26_RLK_117)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\r\n\tattackingBoard\r\n\t\t.filter((e) => e.additionalCards?.includes(CardIds.FesterootHulk_BG_GIL_655))\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyStats(e, e, 1, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t});\r\n\r\n\tlet secretTriggered = null;\r\n\tif (\r\n\t\t(secretTriggered = defendingBoardHero.secrets?.find(\r\n\t\t\t(secret) => !secret.triggered && secret?.cardId === CardIds.Reckoning_TB_Bacon_Secrets_14,\r\n\t\t)) != null\r\n\t) {\r\n\t\t// console.log('triggering secret?', damageDoneByAttacker, stringifySimpleCard(attackingEntity, allCards));\r\n\t\tif (damageDoneByAttacker >= 3 && !(attackingEntity.health <= 0 || attackingEntity.definitelyDead)) {\r\n\t\t\tsecretTriggered.triggered = true;\r\n\t\t\tattackingEntity.definitelyDead = true;\r\n\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\tsecretTriggered,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tapplyOnAttackQuest(attackingEntity, attackingBoard, attackingBoardHero, gameState);\r\n\r\n\tresolvePendingEffects(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState);\r\n};\r\n\r\nexport const applyAfterAttackTrinkets = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageDoneByAttacker: number,\r\n\tdamageDoneByDefender: number,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst trinkets = attackingBoardHero.trinkets ?? [];\r\n\tfor (const trinket of trinkets) {\r\n\t\tconst afterAttackImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasAfterAnotherMinionAttacks(afterAttackImpl)) {\r\n\t\t\tafterAttackImpl.afterAnotherMinionAttacks(trinket, {\r\n\t\t\t\tattacker: attackingEntity,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst applyOnAttackQuest = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst quests = attackingBoardHero.questEntities ?? [];\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.CrackTheCase:\r\n\t\t\t\tonQuestProgressUpdated(attackingBoardHero, quest, attackingBoard, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport interface OnAfterAttackInput {\r\n\tattacker: BoardEntity;\r\n\tattackingHero: BgsPlayerEntity;\r\n\tattackingBoard: BoardEntity[];\r\n\tdefendingEntity: BoardEntity;\r\n\tdefendingBoard: BoardEntity[];\r\n\tdefendingHero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n\tplayerIsFriendly: boolean;\r\n}\r\n"]}
1
+ {"version":3,"file":"after-attack.js","sourceRoot":"","sources":["../../src/simulation/after-attack.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasAfterAnotherMinionAttacks } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateStealth } from '../keywords/stealth';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { resolvePendingEffects } from './pending-effects';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const applyAfterAttackEffects = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageDoneByAttacker: number,\r\n\tdamageDoneByDefender: number,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// https://replays.firestoneapp.com/?reviewId=9c3ba0f2-d049-4f79-8ec2-7b20ec8d0f68&turn=11&action=5\r\n\t// It looks like Stealth is removed only once the damage is dealt?\r\n\tupdateStealth(attackingEntity, false, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);\r\n\r\n\tif (\r\n\t\tattackingEntity.cardId === CardIds.IncorporealCorporal_BG26_RLK_117 ||\r\n\t\tattackingEntity.cardId === CardIds.IncorporealCorporal_BG26_RLK_117_G\r\n\t) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\t// Putricide-only\r\n\telse if (attackingEntity.additionalCards?.includes(CardIds.IncorporealCorporal_BG26_RLK_117)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\r\n\tattackingBoard\r\n\t\t.filter((e) => e.additionalCards?.includes(CardIds.FesterootHulk_BG_GIL_655))\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyStats(e, e, 1, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t});\r\n\r\n\tlet secretTriggered = null;\r\n\tif (\r\n\t\t(secretTriggered = defendingBoardHero.secrets?.find(\r\n\t\t\t(secret) => !secret.triggered && secret?.cardId === CardIds.Reckoning_TB_Bacon_Secrets_14,\r\n\t\t)) != null\r\n\t) {\r\n\t\t// console.log('triggering secret?', damageDoneByAttacker, stringifySimpleCard(attackingEntity, allCards));\r\n\t\tif (damageDoneByAttacker >= 3 && !(attackingEntity.health <= 0 || attackingEntity.definitelyDead)) {\r\n\t\t\tsecretTriggered.triggered = true;\r\n\t\t\tattackingEntity.definitelyDead = true;\r\n\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\tsecretTriggered,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tapplyOnAttackQuest(attackingEntity, attackingBoard, attackingBoardHero, gameState);\r\n\r\n\tresolvePendingEffects(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState);\r\n};\r\n\r\nexport const applyAfterAttackTrinketsAndBoard = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageDoneByAttacker: number,\r\n\tdamageDoneByDefender: number,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst trinkets = attackingBoardHero.trinkets ?? [];\r\n\tfor (const trinket of trinkets) {\r\n\t\tconst afterAttackImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasAfterAnotherMinionAttacks(afterAttackImpl)) {\r\n\t\t\tafterAttackImpl.afterAnotherMinionAttacks(trinket, {\r\n\t\t\t\tattacker: attackingEntity,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const minion of attackingBoard) {\r\n\t\tif (minion === attackingEntity) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tconst afterAttackImpl = cardMappings[minion.cardId];\r\n\t\tif (hasAfterAnotherMinionAttacks(afterAttackImpl)) {\r\n\t\t\tafterAttackImpl.afterAnotherMinionAttacks(minion, {\r\n\t\t\t\tattacker: attackingEntity,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst applyOnAttackQuest = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst quests = attackingBoardHero.questEntities ?? [];\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.CrackTheCase:\r\n\t\t\t\tonQuestProgressUpdated(attackingBoardHero, quest, attackingBoard, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport interface OnAfterAttackInput {\r\n\tattacker: BoardEntity;\r\n\tattackingHero: BgsPlayerEntity;\r\n\tattackingBoard: BoardEntity[];\r\n\tdefendingEntity: BoardEntity;\r\n\tdefendingBoard: BoardEntity[];\r\n\tdefendingHero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n\tplayerIsFriendly: boolean;\r\n}\r\n"]}
@@ -16,7 +16,7 @@ export declare const dealDamageToRandomEnemy: (boardToBeDamaged: BoardEntity[],
16
16
  export declare const dealDamageToMinion: (target: BoardEntity, board: BoardEntity[], hero: BgsPlayerEntity, damageSource: BoardEntity | BgsPlayerEntity, damage: number, otherBoard: BoardEntity[], otherHero: BgsPlayerEntity, gameState: FullGameState) => number;
17
17
  export declare const dealDamageToMinions: (targets: BoardEntity[], board: BoardEntity[], hero: BgsPlayerEntity, damageSource: BoardEntity | BgsPlayerEntity, damage: number, otherBoard: BoardEntity[], otherHero: BgsPlayerEntity, gameState: FullGameState) => number;
18
18
  export declare const getDefendingEntity: (defendingBoard: BoardEntity[], attackingEntity: BoardEntity, ignoreTaunts?: boolean) => BoardEntity;
19
- export declare const bumpEntities: (entity: BoardEntity, bumpInto: BoardEntity, entityBoard: BoardEntity[], entityBoardHero: BgsPlayerEntity, otherBoard: BoardEntity[], otherHero: BgsPlayerEntity, gameState: FullGameState, applyVenomous?: boolean) => number;
19
+ export declare const bumpEntities: (entity: BoardEntity, bumpInto: BoardEntity, entityBoard: BoardEntity[], entityBoardHero: BgsPlayerEntity, otherBoard: BoardEntity[], otherHero: BgsPlayerEntity, gameState: FullGameState, applyVenomous?: boolean, forceVenomous?: boolean) => number;
20
20
  export declare const processMinionDeath: (board1: BoardEntity[], board1Hero: BgsPlayerEntity, board2: BoardEntity[], board2Hero: BgsPlayerEntity, gameState: FullGameState, skipSummonWhenSpace?: boolean) => void;
21
21
  export interface OnDeathInput {
22
22
  readonly hero: BgsPlayerEntity;
@@ -71,7 +71,7 @@ const doFullAttack = (attackingEntity, attackingBoard, attackingBoardHero, defen
71
71
  const damageDoneByDefender = damageDoneByDefender1 + damageDoneByDefender2;
72
72
  (0, after_attack_1.applyAfterAttackEffects)(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState);
73
73
  (0, exports.processMinionDeath)(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState, (options === null || options === void 0 ? void 0 : options.skipSummonWhenSpace) || isAttackingImmediately);
74
- (0, after_attack_1.applyAfterAttackTrinkets)(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState);
74
+ (0, after_attack_1.applyAfterAttackTrinketsAndBoard)(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState);
75
75
  (0, stats_1.applyAfterStatsUpdate)(gameState);
76
76
  attackingEntity.immuneWhenAttackCharges = Math.max(0, ((_a = attackingEntity.immuneWhenAttackCharges) !== null && _a !== void 0 ? _a : 0) - 1);
77
77
  };
@@ -79,6 +79,7 @@ exports.doFullAttack = doFullAttack;
79
79
  const performAttack = (attackingEntity, defendingEntity, attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState) => {
80
80
  let damageDoneByAttacker = 0;
81
81
  let damageDoneByDefender = 0;
82
+ const hadVenomous = attackingEntity.venomous;
82
83
  if (["BG22_001", "BG22_001_G"].includes(attackingEntity.cardId)) {
83
84
  const spawns = (0, deathrattle_spawns_1.spawnEntities)(attackingEntity.cardId === "BG22_001_G"
84
85
  ? "BG22_001_G"
@@ -127,7 +128,7 @@ const performAttack = (attackingEntity, defendingEntity, attackingBoard, attacki
127
128
  }
128
129
  if (attackingEntity.cleave) {
129
130
  for (const neighbour of defenderNeighbours) {
130
- const thisAttackDamage = (0, exports.bumpEntities)(neighbour, attackingEntity, defendingBoard, defendingBoardHero, attackingBoard, attackingBoardHero, gameState);
131
+ const thisAttackDamage = (0, exports.bumpEntities)(neighbour, attackingEntity, defendingBoard, defendingBoardHero, attackingBoard, attackingBoardHero, gameState, true, hadVenomous);
131
132
  damageDoneByAttacker += thisAttackDamage;
132
133
  if (attackingEntity.attack > 0 && neighbour.divineShield) {
133
134
  (0, divine_shield_1.updateDivineShield)(neighbour, defendingBoard, defendingBoardHero, attackingBoardHero, false, gameState);
@@ -359,7 +360,7 @@ const getDefendingEntity = (defendingBoard, attackingEntity, ignoreTaunts = fals
359
360
  return chosenDefender;
360
361
  };
361
362
  exports.getDefendingEntity = getDefendingEntity;
362
- const bumpEntities = (entity, bumpInto, entityBoard, entityBoardHero, otherBoard, otherHero, gameState, applyVenomous = true) => {
363
+ const bumpEntities = (entity, bumpInto, entityBoard, entityBoardHero, otherBoard, otherHero, gameState, applyVenomous = true, forceVenomous = false) => {
363
364
  const debug = bumpInto.cardId === 'BG26_888';
364
365
  if (bumpInto.attack === 0) {
365
366
  return 0;
@@ -395,7 +396,7 @@ const bumpEntities = (entity, bumpInto, entityBoard, entityBoardHero, otherBoard
395
396
  if (bumpInto.poisonous) {
396
397
  entity.definitelyDead = true;
397
398
  }
398
- if (bumpInto.venomous && applyVenomous) {
399
+ if ((bumpInto.venomous || forceVenomous) && applyVenomous) {
399
400
  entity.definitelyDead = true;
400
401
  (0, venomous_1.updateVenomous)(bumpInto, false, otherBoard, otherHero, entityBoardHero, gameState);
401
402
  }