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

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 (69) hide show
  1. package/dist/cards/impl/_card-mappings.js +8 -0
  2. package/dist/cards/impl/_card-mappings.js.map +1 -1
  3. package/dist/cards/impl/enchantments/deaths-embrace.d.ts +2 -0
  4. package/dist/cards/impl/enchantments/deaths-embrace.js +14 -0
  5. package/dist/cards/impl/enchantments/deaths-embrace.js.map +1 -0
  6. package/dist/cards/impl/enchantments/offensive-sacrifice.js +4 -2
  7. package/dist/cards/impl/enchantments/offensive-sacrifice.js.map +1 -1
  8. package/dist/cards/impl/enchantments/resistance.js +1 -1
  9. package/dist/cards/impl/enchantments/resistance.js.map +1 -1
  10. package/dist/cards/impl/enchantments/toreths-blessing.d.ts +1 -0
  11. package/dist/cards/impl/enchantments/toreths-blessing.js +2 -4
  12. package/dist/cards/impl/enchantments/toreths-blessing.js.map +1 -1
  13. package/dist/cards/impl/hero-power/runic-empowerment.d.ts +5 -0
  14. package/dist/cards/impl/hero-power/runic-empowerment.js +24 -0
  15. package/dist/cards/impl/hero-power/runic-empowerment.js.map +1 -0
  16. package/dist/cards/impl/minion/cage-gnawer.d.ts +2 -2
  17. package/dist/cards/impl/minion/cage-gnawer.js +13 -6
  18. package/dist/cards/impl/minion/cage-gnawer.js.map +1 -1
  19. package/dist/cards/impl/minion/deathstrider.d.ts +2 -2
  20. package/dist/cards/impl/minion/deathstrider.js +1 -1
  21. package/dist/cards/impl/minion/deathstrider.js.map +1 -1
  22. package/dist/cards/impl/minion/flourishing-frostling.js +0 -2
  23. package/dist/cards/impl/minion/flourishing-frostling.js.map +1 -1
  24. package/dist/cards/impl/minion/glowing-cinder.js +1 -1
  25. package/dist/cards/impl/minion/glowing-cinder.js.map +1 -1
  26. package/dist/cards/impl/minion/polarizing-beatboxer.js +2 -1
  27. package/dist/cards/impl/minion/polarizing-beatboxer.js.map +1 -1
  28. package/dist/cards/impl/minion/ravaging-scorpid.d.ts +2 -2
  29. package/dist/cards/impl/minion/ravaging-scorpid.js +17 -10
  30. package/dist/cards/impl/minion/ravaging-scorpid.js.map +1 -1
  31. package/dist/cards/impl/minion/timewarped-boar.d.ts +2 -0
  32. package/dist/cards/impl/minion/timewarped-boar.js +43 -0
  33. package/dist/cards/impl/minion/timewarped-boar.js.map +1 -0
  34. package/dist/cards/impl/minion/timewarped-henchman.d.ts +2 -0
  35. package/dist/cards/impl/minion/timewarped-henchman.js +21 -0
  36. package/dist/cards/impl/minion/timewarped-henchman.js.map +1 -0
  37. package/dist/cards/impl/trinket/blood-golem-sticker.js +0 -2
  38. package/dist/cards/impl/trinket/blood-golem-sticker.js.map +1 -1
  39. package/dist/cards/impl/trinket/deathtouch-apple.d.ts +2 -2
  40. package/dist/cards/impl/trinket/deathtouch-apple.js +0 -1
  41. package/dist/cards/impl/trinket/deathtouch-apple.js.map +1 -1
  42. package/dist/services/utils.d.ts +1 -1
  43. package/dist/services/utils.js +2 -2
  44. package/dist/services/utils.js.map +1 -1
  45. package/dist/simulation/after-attack.d.ts +1 -1
  46. package/dist/simulation/after-attack.js +21 -3
  47. package/dist/simulation/after-attack.js.map +1 -1
  48. package/dist/simulation/attack.d.ts +1 -1
  49. package/dist/simulation/attack.js +5 -4
  50. package/dist/simulation/attack.js.map +1 -1
  51. package/dist/simulation/auras.js +9 -6
  52. package/dist/simulation/auras.js.map +1 -1
  53. package/dist/simulation/deathrattle-on-trigger.js +9 -3
  54. package/dist/simulation/deathrattle-on-trigger.js.map +1 -1
  55. package/dist/simulation/magnetize.d.ts +2 -3
  56. package/dist/simulation/magnetize.js +15 -16
  57. package/dist/simulation/magnetize.js.map +1 -1
  58. package/dist/simulation/minion-death.js +2 -0
  59. package/dist/simulation/minion-death.js.map +1 -1
  60. package/dist/simulation/remove-minion-from-board.js.map +1 -1
  61. package/dist/simulation/spectator/spectator.d.ts +2 -2
  62. package/dist/simulation/spectator/spectator.js +2 -1
  63. package/dist/simulation/spectator/spectator.js.map +1 -1
  64. package/dist/simulation/stats.d.ts +2 -2
  65. package/dist/simulation/stats.js +4 -5
  66. package/dist/simulation/stats.js.map +1 -1
  67. package/dist/utils.js +6 -0
  68. package/dist/utils.js.map +1 -1
  69. package/package.json +1 -1
@@ -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,QAAA,SAAS,GAAG,CAAC,CAAC;AAEd,QAAA,eAAe,GAAsB;IACjD,OAAO,EAAE,8BAA+E;IACxF,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QAKvD,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\nexport const 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\t// minion.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\t// minion.divineShield = true;\r\n\t\t// return false;\r\n\t\treturn false;\r\n\t},\r\n};\r\n"]}
@@ -0,0 +1,5 @@
1
+ import { BgsHeroPower, BgsPlayerEntity } from '../../../bgs-player-entity';
2
+ import { BoardEntity } from '../../../board-entity';
3
+ import { Card } from '../../card.interface';
4
+ export declare const RunicEmpowerment: Card;
5
+ export declare const applyRunicEmpowermentOnFriendlyDeath: (heroPower: BgsHeroPower, boardHero: BgsPlayerEntity, deadEntity: BoardEntity) => void;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyRunicEmpowermentOnFriendlyDeath = exports.RunicEmpowerment = void 0;
4
+ exports.RunicEmpowerment = {
5
+ cardIds: ["TB_BaconShop_HP_702"],
6
+ };
7
+ const applyRunicEmpowermentOnFriendlyDeath = (heroPower, boardHero, deadEntity) => {
8
+ if (heroPower.cardId !== "TB_BaconShop_HP_702") {
9
+ return;
10
+ }
11
+ if (deadEntity.friendly !== boardHero.friendly) {
12
+ return;
13
+ }
14
+ let left = typeof heroPower.info === 'number' && heroPower.info > 0 ? heroPower.info : 5;
15
+ left--;
16
+ if (left <= 0) {
17
+ const currentBuff = typeof heroPower.info2 === 'number' && heroPower.info2 > 0 ? heroPower.info2 : 1;
18
+ heroPower.info2 = currentBuff + 1;
19
+ left = 5;
20
+ }
21
+ heroPower.info = left;
22
+ };
23
+ exports.applyRunicEmpowermentOnFriendlyDeath = applyRunicEmpowermentOnFriendlyDeath;
24
+ //# sourceMappingURL=runic-empowerment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runic-empowerment.js","sourceRoot":"","sources":["../../../../src/cards/impl/hero-power/runic-empowerment.ts"],"names":[],"mappings":";;;AAea,QAAA,gBAAgB,GAAS;IACrC,OAAO,EAAE,uBAA0B;CACnC,CAAC;AAEK,MAAM,oCAAoC,GAAG,CACnD,SAAuB,EACvB,SAA0B,EAC1B,UAAuB,EAChB,EAAE;IACT,IAAI,SAAS,CAAC,MAAM,0BAA6B,EAAE;QAClD,OAAO;KACP;IACD,IAAI,UAAU,CAAC,QAAQ,KAAK,SAAS,CAAC,QAAQ,EAAE;QAC/C,OAAO;KACP;IAED,IAAI,IAAI,GAAG,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACzF,IAAI,EAAE,CAAC;IACP,IAAI,IAAI,IAAI,CAAC,EAAE;QACd,MAAM,WAAW,GAAG,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrG,SAAS,CAAC,KAAK,GAAG,WAAW,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,CAAC,CAAC;KACT;IACD,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;AACvB,CAAC,CAAC;AApBW,QAAA,oCAAoC,wCAoB/C","sourcesContent":["import { BgsHeroPower, BgsPlayerEntity } from '../../../bgs-player-entity';\nimport { BoardEntity } from '../../../board-entity';\nimport { CardIds } from '../../../services/card-ids';\nimport { Card } from '../../card.interface';\n\n/**\n * Runic Empowerment (The Jailer)\n * TB_BaconShop_HP_702: Give a minion +1/+{1}. Improves after five friendly minions die. (5 left!)\n *\n * Combat half: count friendly deaths and improve TAG_SCRIPT_DATA_NUM_2 (info2).\n * The +1/+X buff itself is a recruit-phase targeted HP use.\n *\n * info = TAG_SCRIPT_DATA_NUM_1 (deaths remaining until next improve; default 5)\n * info2 = TAG_SCRIPT_DATA_NUM_2 (health buff amount; starts at 1)\n */\nexport const RunicEmpowerment: Card = {\n\tcardIds: [CardIds.RunicEmpowerment],\n};\n\nexport const applyRunicEmpowermentOnFriendlyDeath = (\n\theroPower: BgsHeroPower,\n\tboardHero: BgsPlayerEntity,\n\tdeadEntity: BoardEntity,\n): void => {\n\tif (heroPower.cardId !== CardIds.RunicEmpowerment) {\n\t\treturn;\n\t}\n\tif (deadEntity.friendly !== boardHero.friendly) {\n\t\treturn;\n\t}\n\n\tlet left = typeof heroPower.info === 'number' && heroPower.info > 0 ? heroPower.info : 5;\n\tleft--;\n\tif (left <= 0) {\n\t\tconst currentBuff = typeof heroPower.info2 === 'number' && heroPower.info2 > 0 ? heroPower.info2 : 1;\n\t\theroPower.info2 = currentBuff + 1;\n\t\tleft = 5;\n\t}\n\theroPower.info = left;\n};\n"]}
@@ -1,2 +1,2 @@
1
- import { OnWheneverAnotherMinionAttacksCard } from '../../card.interface';
2
- export declare const CageGnawer: OnWheneverAnotherMinionAttacksCard;
1
+ import { OnWheneverAnotherMinionAttacksCard, RallyCard } from '../../card.interface';
2
+ export declare const CageGnawer: OnWheneverAnotherMinionAttacksCard & RallyCard;
@@ -8,13 +8,20 @@ const healthBuff = 1;
8
8
  exports.CageGnawer = {
9
9
  cardIds: ["BG36_211", "BG36_211_G"],
10
10
  onWheneverAnotherMinionAttacks: (minion, input) => {
11
- const attackerIsBeast = (0, utils_1.hasCorrectTribe)(input.attacker, input.attackingHero, reference_data_1.Race.BEAST, input.gameState.anomalies, input.gameState.allCards);
12
- if (!attackerIsBeast) {
13
- return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
14
- }
15
- const mult = minion.cardId === "BG36_211_G" ? 2 : 1;
16
- (0, utils_1.addStatsToBoard)(minion, input.attackingBoard, input.attackingHero, attackBuff * mult, healthBuff * mult, input.gameState, reference_data_1.Race[reference_data_1.Race.BEAST]);
11
+ doStuff(minion, input);
17
12
  return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
18
13
  },
14
+ rally: (minion, input) => {
15
+ doStuff(minion, input);
16
+ return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
17
+ },
18
+ };
19
+ const doStuff = (minion, input) => {
20
+ const attackerIsBeast = (0, utils_1.hasCorrectTribe)(input.attacker, input.attackingHero, reference_data_1.Race.BEAST, input.gameState.anomalies, input.gameState.allCards);
21
+ if (!attackerIsBeast) {
22
+ return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
23
+ }
24
+ const mult = minion.cardId === "BG36_211_G" ? 2 : 1;
25
+ (0, utils_1.addStatsToBoard)(minion, input.attackingBoard, input.attackingHero, attackBuff * mult, healthBuff * mult, input.gameState, reference_data_1.Race[reference_data_1.Race.BEAST]);
19
26
  };
20
27
  //# sourceMappingURL=cage-gnawer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cage-gnawer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/cage-gnawer.ts"],"names":[],"mappings":";;;AAOA,iEAAoD;AAGpD,0CAAkE;AAIlE,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,UAAU,GAAG,CAAC,CAAC;AAER,QAAA,UAAU,GAAuC;IAC7D,OAAO,EAAE,0BAA4D;IACrE,8BAA8B,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QAC7E,MAAM,eAAe,GAAG,IAAA,uBAAe,EACtC,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,aAAa,EACnB,qBAAI,CAAC,KAAK,EACV,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,CAAC;QACF,IAAI,CAAC,eAAe,EAAE;YACrB,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,UAAU,GAAG,IAAI,EACjB,UAAU,GAAG,IAAI,EACjB,KAAK,CAAC,SAAS,EACf,qBAAI,CAAC,qBAAI,CAAC,KAAK,CAAC,CAChB,CAAC;QACF,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Cage Gnawer (Tier 4, 2/7)\r\n * Whenever a friendly Beast attacks, give your Beasts +2/+1.\r\n *\r\n * Golden Cage Gnawer (Tier 4, 4/14)\r\n * Whenever a friendly Beast attacks, give your Beasts +4/+2.\r\n */\r\nimport { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { addStatsToBoard, hasCorrectTribe } from '../../../utils';\r\nimport { OnWheneverAnotherMinionAttacksCard } from '../../card.interface';\r\nimport { CardIds } from '../../../services/card-ids';\r\n\r\nconst attackBuff = 2;\r\nconst healthBuff = 1;\r\n\r\nexport const CageGnawer: OnWheneverAnotherMinionAttacksCard = {\r\n\tcardIds: [CardIds.CageGnawer_BG36_211, CardIds.CageGnawer_BG36_211_G],\r\n\tonWheneverAnotherMinionAttacks: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tconst attackerIsBeast = hasCorrectTribe(\r\n\t\t\tinput.attacker,\r\n\t\t\tinput.attackingHero,\r\n\t\t\tRace.BEAST,\r\n\t\t\tinput.gameState.anomalies,\r\n\t\t\tinput.gameState.allCards,\r\n\t\t);\r\n\t\tif (!attackerIsBeast) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst mult = minion.cardId === CardIds.CageGnawer_BG36_211_G ? 2 : 1;\r\n\t\taddStatsToBoard(\r\n\t\t\tminion,\r\n\t\t\tinput.attackingBoard,\r\n\t\t\tinput.attackingHero,\r\n\t\t\tattackBuff * mult,\r\n\t\t\thealthBuff * mult,\r\n\t\t\tinput.gameState,\r\n\t\t\tRace[Race.BEAST],\r\n\t\t);\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"cage-gnawer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/cage-gnawer.ts"],"names":[],"mappings":";;;AAOA,iEAAoD;AAIpD,0CAAkE;AAGlE,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,UAAU,GAAG,CAAC,CAAC;AAER,QAAA,UAAU,GAAmD;IACzE,OAAO,EAAE,0BAA4D;IACrE,8BAA8B,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QAC7E,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvB,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,KAAK,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QACpD,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvB,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;IAC7D,MAAM,eAAe,GAAG,IAAA,uBAAe,EACtC,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,aAAa,EACnB,qBAAI,CAAC,KAAK,EACV,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,CAAC;IACF,IAAI,CAAC,eAAe,EAAE;QACrB,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;KACtD;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAkC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,UAAU,GAAG,IAAI,EACjB,UAAU,GAAG,IAAI,EACjB,KAAK,CAAC,SAAS,EACf,qBAAI,CAAC,qBAAI,CAAC,KAAK,CAAC,CAChB,CAAC;AACH,CAAC,CAAC","sourcesContent":["/**\r\n * Cage Gnawer (Tier 4, 2/7)\r\n * Whenever a friendly Beast attacks, give your Beasts +2/+1.\r\n *\r\n * Golden Cage Gnawer (Tier 4, 4/14)\r\n * Whenever a friendly Beast attacks, give your Beasts +4/+2.\r\n */\r\nimport { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { addStatsToBoard, hasCorrectTribe } from '../../../utils';\r\nimport { OnWheneverAnotherMinionAttacksCard, RallyCard } from '../../card.interface';\r\n\r\nconst attackBuff = 2;\r\nconst healthBuff = 1;\r\n\r\nexport const CageGnawer: OnWheneverAnotherMinionAttacksCard & RallyCard = {\r\n\tcardIds: [CardIds.CageGnawer_BG36_211, CardIds.CageGnawer_BG36_211_G],\r\n\tonWheneverAnotherMinionAttacks: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tdoStuff(minion, input);\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n\trally: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tdoStuff(minion, input);\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n\r\nconst doStuff = (minion: BoardEntity, input: OnAttackInput) => {\r\n\tconst attackerIsBeast = hasCorrectTribe(\r\n\t\tinput.attacker,\r\n\t\tinput.attackingHero,\r\n\t\tRace.BEAST,\r\n\t\tinput.gameState.anomalies,\r\n\t\tinput.gameState.allCards,\r\n\t);\r\n\tif (!attackerIsBeast) {\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t}\r\n\r\n\tconst mult = minion.cardId === CardIds.CageGnawer_BG36_211_G ? 2 : 1;\r\n\taddStatsToBoard(\r\n\t\tminion,\r\n\t\tinput.attackingBoard,\r\n\t\tinput.attackingHero,\r\n\t\tattackBuff * mult,\r\n\t\thealthBuff * mult,\r\n\t\tinput.gameState,\r\n\t\tRace[Race.BEAST],\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 { DeathrattleSpawnCard, OnWheneverAnotherMinionAttacksCard } from '../../card.interface';
2
- export declare const RavagingScorpid: OnWheneverAnotherMinionAttacksCard & DeathrattleSpawnCard;
1
+ import { AfterAnotherMinionAttacksCard, DeathrattleSpawnCard, RallyCard } from '../../card.interface';
2
+ export declare const RavagingScorpid: AfterAnotherMinionAttacksCard & RallyCard & DeathrattleSpawnCard;
@@ -6,16 +6,12 @@ const stats_1 = require("../../../simulation/stats");
6
6
  const beetleBuff = 3;
7
7
  exports.RavagingScorpid = {
8
8
  cardIds: ["BG36_209", "BG36_209_G"],
9
- onWheneverAnotherMinionAttacks: (minion, input) => {
10
- const mult = minion.cardId === "BG36_209_G" ? 2 : 1;
11
- const buff = beetleBuff * mult;
12
- input.attackingHero.globalInfo.BeetleAttackBuff += buff;
13
- input.attackingHero.globalInfo.BeetleHealthBuff += buff;
14
- input.attackingBoard
15
- .filter((e) => ["BG28_603t", "BG28_603t_G"].includes(e.cardId))
16
- .forEach((e) => {
17
- (0, stats_1.modifyStats)(e, minion, buff, buff, input.attackingBoard, input.attackingHero, input.gameState);
18
- });
9
+ afterAnotherMinionAttacks: (minion, input) => {
10
+ doStuff(minion, input);
11
+ return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
12
+ },
13
+ rally: (minion, input) => {
14
+ doStuff(minion, input);
19
15
  return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
20
16
  },
21
17
  deathrattleSpawn: (minion, input) => {
@@ -23,4 +19,15 @@ exports.RavagingScorpid = {
23
19
  return (0, deathrattle_spawns_1.simplifiedSpawnEntities)("BG28_603t", numberOfSpawns, input);
24
20
  },
25
21
  };
22
+ const doStuff = (minion, input) => {
23
+ const mult = minion.cardId === "BG36_209_G" ? 2 : 1;
24
+ const buff = beetleBuff * mult;
25
+ input.attackingHero.globalInfo.BeetleAttackBuff += buff;
26
+ input.attackingHero.globalInfo.BeetleHealthBuff += buff;
27
+ input.attackingBoard
28
+ .filter((e) => ["BG28_603t", "BG28_603t_G"].includes(e.cardId))
29
+ .forEach((e) => {
30
+ (0, stats_1.modifyStats)(e, minion, buff, buff, input.attackingBoard, input.attackingHero, input.gameState);
31
+ });
32
+ };
26
33
  //# sourceMappingURL=ravaging-scorpid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ravaging-scorpid.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/ravaging-scorpid.ts"],"names":[],"mappings":";;;AAUA,+EAAiF;AAEjF,qDAAwD;AAGxD,MAAM,UAAU,GAAG,CAAC,CAAC;AAER,QAAA,eAAe,GAA8D;IACzF,OAAO,EAAE,0BAAsE;IAC/E,8BAA8B,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;QAC/B,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACxD,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,IAAI,IAAI,CAAC;QACxD,KAAK,CAAC,cAAc;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,4BAAyE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,CACvG;aACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,IAAA,mBAAW,EAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAChG,CAAC,CAAC,CAAC;QACJ,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC3E,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,IAAA,4CAAuB,eAA8C,cAAc,EAAE,KAAK,CAAC,CAAC;IACpG,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Ravaging Scorpid (Tier 6, 7/8)\r\n * After a friendly minion attacks, your Beetles have +3/+3 this game. Deathrattle: Summon a 2/2 Beetle.\r\n *\r\n * Golden Ravaging Scorpid (Tier 6, 14/16)\r\n * After a friendly minion attacks, your Beetles have +6/+6 this game. Deathrattle: Summon two 2/2 Beetles.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { simplifiedSpawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { DeathrattleSpawnCard, OnWheneverAnotherMinionAttacksCard } from '../../card.interface';\r\n\r\nconst beetleBuff = 3;\r\n\r\nexport const RavagingScorpid: OnWheneverAnotherMinionAttacksCard & DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.RavagingScorpid_BG36_209, CardIds.RavagingScorpid_BG36_209_G],\r\n\tonWheneverAnotherMinionAttacks: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.RavagingScorpid_BG36_209_G ? 2 : 1;\r\n\t\tconst buff = beetleBuff * mult;\r\n\t\tinput.attackingHero.globalInfo.BeetleAttackBuff += buff;\r\n\t\tinput.attackingHero.globalInfo.BeetleHealthBuff += buff;\r\n\t\tinput.attackingBoard\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[CardIds.BoonOfBeetles_BeetleToken_BG28_603t, CardIds.Beetle_BG28_603t_G].includes(e.cardId as CardIds),\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tmodifyStats(e, minion, buff, buff, input.attackingBoard, input.attackingHero, input.gameState);\r\n\t\t\t});\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst numberOfSpawns = minion.cardId === CardIds.RavagingScorpid_BG36_209_G ? 2 : 1;\r\n\t\treturn simplifiedSpawnEntities(CardIds.BoonOfBeetles_BeetleToken_BG28_603t, numberOfSpawns, input);\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"ravaging-scorpid.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/ravaging-scorpid.ts"],"names":[],"mappings":";;;AAUA,+EAAiF;AAEjF,qDAAwD;AAGxD,MAAM,UAAU,GAAG,CAAC,CAAC;AAER,QAAA,eAAe,GAAqE;IAChG,OAAO,EAAE,0BAAsE;IAC/E,yBAAyB,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QACxE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvB,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,KAAK,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QACpD,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACvB,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC3E,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,IAAA,4CAAuB,eAA8C,cAAc,EAAE,KAAK,CAAC,CAAC;IACpG,CAAC;CACD,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;IAC7D,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;IAC/B,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACxD,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACxD,KAAK,CAAC,cAAc;SAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,4BAAyE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,CACvG;SACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACd,IAAA,mBAAW,EAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAChG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["/**\r\n * Ravaging Scorpid (Tier 6, 7/8)\r\n * After a friendly minion attacks, your Beetles have +3/+3 this game. Deathrattle: Summon a 2/2 Beetle.\r\n *\r\n * Golden Ravaging Scorpid (Tier 6, 14/16)\r\n * After a friendly minion attacks, your Beetles have +6/+6 this game. Deathrattle: Summon two 2/2 Beetles.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { simplifiedSpawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { AfterAnotherMinionAttacksCard, DeathrattleSpawnCard, RallyCard } from '../../card.interface';\r\n\r\nconst beetleBuff = 3;\r\n\r\nexport const RavagingScorpid: AfterAnotherMinionAttacksCard & RallyCard & DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.RavagingScorpid_BG36_209, CardIds.RavagingScorpid_BG36_209_G],\r\n\tafterAnotherMinionAttacks: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tdoStuff(minion, input);\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n\trally: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tdoStuff(minion, input);\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst numberOfSpawns = minion.cardId === CardIds.RavagingScorpid_BG36_209_G ? 2 : 1;\r\n\t\treturn simplifiedSpawnEntities(CardIds.BoonOfBeetles_BeetleToken_BG28_603t, numberOfSpawns, input);\r\n\t},\r\n};\r\n\r\nconst doStuff = (minion: BoardEntity, input: OnAttackInput) => {\r\n\tconst mult = minion.cardId === CardIds.RavagingScorpid_BG36_209_G ? 2 : 1;\r\n\tconst buff = beetleBuff * mult;\r\n\tinput.attackingHero.globalInfo.BeetleAttackBuff += buff;\r\n\tinput.attackingHero.globalInfo.BeetleHealthBuff += buff;\r\n\tinput.attackingBoard\r\n\t\t.filter((e) =>\r\n\t\t\t[CardIds.BoonOfBeetles_BeetleToken_BG28_603t, CardIds.Beetle_BG28_603t_G].includes(e.cardId as CardIds),\r\n\t\t)\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyStats(e, minion, buff, buff, input.attackingBoard, input.attackingHero, input.gameState);\r\n\t\t});\r\n};\r\n"]}
@@ -0,0 +1,2 @@
1
+ import { OnDeathCard } from '../../card.interface';
2
+ export declare const TimewarpedBoar: OnDeathCard;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TimewarpedBoar = void 0;
4
+ const reference_data_1 = require("@firestone-hs/reference-data");
5
+ const cards_in_hand_1 = require("../../../simulation/cards-in-hand");
6
+ const PLAYER_ENCH = "BG34_Giant_201pe";
7
+ exports.TimewarpedBoar = {
8
+ cardIds: ["BG34_Giant_201", "BG34_Giant_201_G"],
9
+ onDeath: (minion, input) => {
10
+ var _a, _b, _c;
11
+ if (!input.hero.enchantments) {
12
+ input.hero.enchantments = [];
13
+ }
14
+ let ench = input.hero.enchantments.find((e) => e.cardId === PLAYER_ENCH);
15
+ if (!ench) {
16
+ ench = {
17
+ cardId: PLAYER_ENCH,
18
+ timing: input.gameState.sharedState.currentEntityId++,
19
+ tagScriptDataNum1: 0,
20
+ };
21
+ input.hero.enchantments.push(ench);
22
+ }
23
+ ench.tagScriptDataNum1 = ((_a = ench.tagScriptDataNum1) !== null && _a !== void 0 ? _a : 0) + 1;
24
+ if (ench.tagScriptDataNum1 % 3 !== 0) {
25
+ return;
26
+ }
27
+ const mult = minion.cardId === "BG34_Giant_201_G" ? 2 : 1;
28
+ const cardsToAdd = [];
29
+ for (let i = 0; i < mult; i++) {
30
+ const beastId = input.gameState.cardsData.getRandomMinionForTribe(reference_data_1.Race.BEAST, (_b = input.hero.tavernTier) !== null && _b !== void 0 ? _b : 6, []);
31
+ if (!beastId) {
32
+ continue;
33
+ }
34
+ const premiumDbfId = input.gameState.allCards.getCard(beastId).battlegroundsPremiumDbfId;
35
+ const goldenId = premiumDbfId ? (_c = input.gameState.allCards.getCardFromDbfId(premiumDbfId)) === null || _c === void 0 ? void 0 : _c.id : null;
36
+ cardsToAdd.push(goldenId || beastId);
37
+ }
38
+ if (cardsToAdd.length) {
39
+ (0, cards_in_hand_1.addCardsInHand)(input.hero, input.board, cardsToAdd, input.gameState);
40
+ }
41
+ },
42
+ };
43
+ //# sourceMappingURL=timewarped-boar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timewarped-boar.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-boar.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qEAAmE;AAGnE,MAAM,WAAW,qBAAkE,CAAC;AASvE,QAAA,cAAc,GAAgB;IAC1C,OAAO,EAAE,sCAAgF;IACzF,OAAO,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;;QACrD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE;YAC7B,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;SAC7B;QACD,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAiC,CAAC;QACzG,IAAI,CAAC,IAAI,EAAE;YACV,IAAI,GAAG;gBACN,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE;gBACrD,iBAAiB,EAAE,CAAC;aACpB,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACnC;QACD,IAAI,CAAC,iBAAiB,GAAG,CAAC,MAAA,IAAI,CAAC,iBAAiB,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,iBAAiB,GAAG,CAAC,KAAK,CAAC,EAAE;YACrC,OAAO;SACP;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,uBAAuB,CAChE,qBAAI,CAAC,KAAK,EACV,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,mCAAI,CAAC,EAC1B,EAAE,CACF,CAAC;YACF,IAAI,CAAC,OAAO,EAAE;gBACb,SAAS;aACT;YACD,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,yBAAyB,CAAC;YACzF,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,MAAA,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,CAAC,YAAY,CAAC,0CAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YACnG,UAAU,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;SACrC;QACD,IAAI,UAAU,CAAC,MAAM,EAAE;YACtB,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACrE;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\nimport { CardIds } from '../../../services/card-ids';\nimport { OnDeathInput } from '../../../simulation/attack';\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\nimport { OnDeathCard } from '../../card.interface';\n\nconst PLAYER_ENCH = CardIds.TimewarpedBoarPlayerEnchDntEnchantment_BG34_Giant_201pe;\n\n/**\n * Timewarped Boar\n * BG34_Giant_201: Whenever every third friendly Timewarped Boar dies, get a random Golden Beast.\n * BG34_Giant_201_G: Whenever every third friendly Timewarped Boar dies, get 2 random Golden Beasts.\n *\n * Shared death counter lives on the player enchantment BG34_Giant_201pe (or is created mid-combat).\n */\nexport const TimewarpedBoar: OnDeathCard = {\n\tcardIds: [CardIds.TimewarpedBoar_BG34_Giant_201, CardIds.TimewarpedBoar_BG34_Giant_201_G],\n\tonDeath: (minion: BoardEntity, input: OnDeathInput) => {\n\t\tif (!input.hero.enchantments) {\n\t\t\tinput.hero.enchantments = [];\n\t\t}\n\t\tlet ench = input.hero.enchantments.find((e) => e.cardId === PLAYER_ENCH) as BoardEnchantment | undefined;\n\t\tif (!ench) {\n\t\t\tench = {\n\t\t\t\tcardId: PLAYER_ENCH,\n\t\t\t\ttiming: input.gameState.sharedState.currentEntityId++,\n\t\t\t\ttagScriptDataNum1: 0,\n\t\t\t};\n\t\t\tinput.hero.enchantments.push(ench);\n\t\t}\n\t\tench.tagScriptDataNum1 = (ench.tagScriptDataNum1 ?? 0) + 1;\n\t\tif (ench.tagScriptDataNum1 % 3 !== 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst mult = minion.cardId === CardIds.TimewarpedBoar_BG34_Giant_201_G ? 2 : 1;\n\t\tconst cardsToAdd: string[] = [];\n\t\tfor (let i = 0; i < mult; i++) {\n\t\t\tconst beastId = input.gameState.cardsData.getRandomMinionForTribe(\n\t\t\t\tRace.BEAST,\n\t\t\t\tinput.hero.tavernTier ?? 6,\n\t\t\t\t[],\n\t\t\t);\n\t\t\tif (!beastId) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst premiumDbfId = input.gameState.allCards.getCard(beastId).battlegroundsPremiumDbfId;\n\t\t\tconst goldenId = premiumDbfId ? input.gameState.allCards.getCardFromDbfId(premiumDbfId)?.id : null;\n\t\t\tcardsToAdd.push(goldenId || beastId);\n\t\t}\n\t\tif (cardsToAdd.length) {\n\t\t\taddCardsInHand(input.hero, input.board, cardsToAdd, input.gameState);\n\t\t}\n\t},\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import { OnMinionKilledCard } from '../../card.interface';
2
+ export declare const TimewarpedHenchman: OnMinionKilledCard;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TimewarpedHenchman = void 0;
4
+ const cards_in_hand_1 = require("../../../simulation/cards-in-hand");
5
+ exports.TimewarpedHenchman = {
6
+ cardIds: ["BG34_Giant_593", "BG34_Giant_593_G"],
7
+ onMinionKilled: (minion, input) => {
8
+ var _a;
9
+ if (input.killer.friendly === input.minionKilled.friendly) {
10
+ return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
11
+ }
12
+ const kills = ((_a = minion.memory) !== null && _a !== void 0 ? _a : 0) + 1;
13
+ minion.memory = kills;
14
+ if (kills === 2) {
15
+ const mult = minion.cardId === "BG34_Giant_593_G" ? 2 : 1;
16
+ (0, cards_in_hand_1.addCardsInHand)(input.attackingHero, input.attackingBoard, Array(mult).fill(input.minionKilled.cardId), input.gameState);
17
+ }
18
+ return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
19
+ },
20
+ };
21
+ //# sourceMappingURL=timewarped-henchman.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timewarped-henchman.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-henchman.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAQtD,QAAA,kBAAkB,GAAuB;IACrD,OAAO,EAAE,sCAAwF;IACjG,cAAc,EAAE,CAAC,MAAmB,EAAE,KAA0B,EAAE,EAAE;;QACnE,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,KAAK,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE;YAC1D,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QACD,MAAM,KAAK,GAAG,CAAC,MAAC,MAAM,CAAC,MAAiB,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC;QACtB,IAAI,KAAK,KAAK,CAAC,EAAE;YAChB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAAgD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnF,IAAA,8BAAc,EACb,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,EAC3C,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';\nimport { CardIds } from '../../../services/card-ids';\nimport { OnMinionKilledInput } from '../../../simulation/attack';\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\nimport { OnMinionKilledCard } from '../../card.interface';\n\n/**\n * Timewarped Henchman\n * BG34_Giant_593: After you kill a second minion each combat, get a plain copy of it.\n * BG34_Giant_593_G: After you kill a second minion each combat, get 2 plain copies of it.\n */\nexport const TimewarpedHenchman: OnMinionKilledCard = {\n\tcardIds: [CardIds.TimewarpedHenchman_BG34_Giant_593, CardIds.TimewarpedHenchman_BG34_Giant_593_G],\n\tonMinionKilled: (minion: BoardEntity, input: OnMinionKilledInput) => {\n\t\tif (input.killer.friendly === input.minionKilled.friendly) {\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\n\t\t}\n\t\tconst kills = ((minion.memory as number) ?? 0) + 1;\n\t\tminion.memory = kills;\n\t\tif (kills === 2) {\n\t\t\tconst mult = minion.cardId === CardIds.TimewarpedHenchman_BG34_Giant_593_G ? 2 : 1;\n\t\t\taddCardsInHand(\n\t\t\t\tinput.attackingHero,\n\t\t\t\tinput.attackingBoard,\n\t\t\t\tArray(mult).fill(input.minionKilled.cardId),\n\t\t\t\tinput.gameState,\n\t\t\t);\n\t\t}\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\n\t},\n};\n"]}
@@ -12,7 +12,6 @@ exports.BloodGolemSticker = {
12
12
  const { hero, gameState, board, otherBoard, otherHero } = input;
13
13
  for (const deadEntity of input.deadEntities) {
14
14
  if (deadEntity.friendly === hero.friendly &&
15
- trinket.scriptDataNum1 > 0 &&
16
15
  (0, utils_1.hasCorrectTribe)(deadEntity, hero, reference_data_1.Race.QUILBOAR, gameState.anomalies, gameState.allCards)) {
17
16
  const indexFromRight = input.deadEntitiesIndexesFromRight[input.deadEntities.indexOf(deadEntity)] + 1;
18
17
  let bloodGemEnchantments = deadEntity.enchantments.filter((e) => e.cardId === "BG20_GEMe2");
@@ -34,7 +33,6 @@ exports.BloodGolemSticker = {
34
33
  b.hasAttacked = deadEntity.hasAttacked;
35
34
  });
36
35
  (0, spawns_1.performEntitySpawns)(spawns, board, hero, deadEntity, indexFromRight, otherBoard, otherHero, gameState);
37
- trinket.scriptDataNum1--;
38
36
  }
39
37
  }
40
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"blood-golem-sticker.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/blood-golem-sticker.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,+EAAuE;AACvE,uDAAiE;AACjE,0CAAiD;AAKpC,QAAA,iBAAiB,GAAgD;IAC7E,OAAO,EAAE,sBAA8C;IACvD,oBAAoB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI;IAC9C,YAAY,EAAE,CAAC,OAAqB,EAAE,KAAwB,EAAE,EAAE;QACjE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAChE,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,YAAY,EAAE;YAC5C,IACC,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;gBACrC,OAAO,CAAC,cAAc,GAAG,CAAC;gBAC1B,IAAA,uBAAe,EAAC,UAAU,EAAE,IAAI,EAAE,qBAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EACxF;gBAED,MAAM,cAAc,GAAG,KAAK,CAAC,4BAA4B,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtG,IAAI,oBAAoB,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iBAA0C,CACzD,CAAC;gBACF,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,MAAK,CAAC,EAAE;oBACvC,oBAAoB,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,gBAAyC,CACxD,CAAC;iBACF;gBACD,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;oBACrC,MAAM,cAAc,GAAG,oBAAoB;yBACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,CAAC,iBAAiB,mCAAI,CAAC,CAAA,EAAA,CAAC;yBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7B,MAAM,cAAc,GAAG,oBAAoB;yBACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,CAAC,iBAAiB,mCAAI,CAAC,CAAA,EAAA,CAAC;yBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7B,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE;wBAC7C,MAAM,MAAM,GAAG,IAAA,kCAAa,yBAE3B,CAAC,EACD,KAAK,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,CAAC,QAAQ,EACnB,KAAK,CACL,CAAC;wBACF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;4BACpB,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC;4BAC1B,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC;4BAC1B,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;wBACxC,CAAC,CAAC,CAAC;wBACH,IAAA,4BAAmB,EAClB,MAAM,EACN,KAAK,EACL,IAAI,EACJ,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACT,SAAS,CACT,CAAC;wBACF,OAAO,CAAC,cAAc,EAAE,CAAC;qBACzB;iBACD;aACD;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterDeathInput } from '../../../simulation/attack';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { DefaultScriptDataNumCard, OnAfterDeathCard } from '../../card.interface';\r\n\r\n// 2026-04-17: Deathrattles trigger before the Sticker\r\n// https://replays.firestoneapp.com/?reviewId=99605623-18e1-45ad-a7a1-daf7ef29adcb&turn=23&action=7\r\nexport const BloodGolemSticker: OnAfterDeathCard & DefaultScriptDataNumCard = {\r\n\tcardIds: [CardIds.BloodGolemSticker_BG30_MagicItem_442],\r\n\tdefaultScriptDataNum: (cardId: string) => 9999, // Unlimited, just easier to update\r\n\tonAfterDeath: (trinket: BoardTrinket, input: OnAfterDeathInput) => {\r\n\t\tconst { hero, gameState, board, otherBoard, otherHero } = input;\r\n\t\tfor (const deadEntity of input.deadEntities) {\r\n\t\t\tif (\r\n\t\t\t\tdeadEntity.friendly === hero.friendly &&\r\n\t\t\t\ttrinket.scriptDataNum1 > 0 &&\r\n\t\t\t\thasCorrectTribe(deadEntity, hero, Race.QUILBOAR, gameState.anomalies, gameState.allCards)\r\n\t\t\t) {\r\n\t\t\t\t// -1 because the minion is already removed from the board\r\n\t\t\t\tconst indexFromRight = input.deadEntitiesIndexesFromRight[input.deadEntities.indexOf(deadEntity)] + 1;\r\n\t\t\t\tlet bloodGemEnchantments = deadEntity.enchantments.filter(\r\n\t\t\t\t\t(e) => e.cardId === CardIds.BloodGem_BloodGemsEnchantment,\r\n\t\t\t\t);\r\n\t\t\t\tif (bloodGemEnchantments?.length === 0) {\r\n\t\t\t\t\tbloodGemEnchantments = deadEntity.enchantments.filter(\r\n\t\t\t\t\t\t(e) => e.cardId === CardIds.BloodGem_BloodGemEnchantment,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tif (bloodGemEnchantments?.length > 0) {\r\n\t\t\t\t\tconst bloodGemAttack = bloodGemEnchantments\r\n\t\t\t\t\t\t.map((e) => e.tagScriptDataNum1 ?? 0)\r\n\t\t\t\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\t\t\t\tconst bloodGemHealth = bloodGemEnchantments\r\n\t\t\t\t\t\t.map((e) => e.tagScriptDataNum2 ?? 0)\r\n\t\t\t\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\t\t\t\tif (bloodGemAttack > 0 || bloodGemHealth > 0) {\r\n\t\t\t\t\t\tconst spawns = spawnEntities(\r\n\t\t\t\t\t\t\tCardIds.BloodGolemSticker_BloodGolemToken_BG30_MagicItem_442t,\r\n\t\t\t\t\t\t\t1,\r\n\t\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\t\thero,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherHero,\r\n\t\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\t\tdeadEntity.friendly,\r\n\t\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tspawns.forEach((b) => {\r\n\t\t\t\t\t\t\tb.attack = bloodGemAttack;\r\n\t\t\t\t\t\t\tb.health = bloodGemHealth;\r\n\t\t\t\t\t\t\tb.hasAttacked = deadEntity.hasAttacked;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tperformEntitySpawns(\r\n\t\t\t\t\t\t\tspawns,\r\n\t\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\t\thero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\tindexFromRight,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherHero,\r\n\t\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\ttrinket.scriptDataNum1--;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"blood-golem-sticker.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/blood-golem-sticker.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,+EAAuE;AACvE,uDAAiE;AACjE,0CAAiD;AAKpC,QAAA,iBAAiB,GAAgD;IAC7E,OAAO,EAAE,sBAA8C;IACvD,oBAAoB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,IAAI;IAC9C,YAAY,EAAE,CAAC,OAAqB,EAAE,KAAwB,EAAE,EAAE;QACjE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;QAChE,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,YAAY,EAAE;YAC5C,IACC,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;gBACrC,IAAA,uBAAe,EAAC,UAAU,EAAE,IAAI,EAAE,qBAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,EACxF;gBAED,MAAM,cAAc,GAAG,KAAK,CAAC,4BAA4B,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC;gBACtG,IAAI,oBAAoB,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iBAA0C,CACzD,CAAC;gBACF,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,MAAK,CAAC,EAAE;oBACvC,oBAAoB,GAAG,UAAU,CAAC,YAAY,CAAC,MAAM,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,gBAAyC,CACxD,CAAC;iBACF;gBACD,IAAI,CAAA,oBAAoB,aAApB,oBAAoB,uBAApB,oBAAoB,CAAE,MAAM,IAAG,CAAC,EAAE;oBACrC,MAAM,cAAc,GAAG,oBAAoB;yBACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,CAAC,iBAAiB,mCAAI,CAAC,CAAA,EAAA,CAAC;yBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7B,MAAM,cAAc,GAAG,oBAAoB;yBACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,MAAA,CAAC,CAAC,iBAAiB,mCAAI,CAAC,CAAA,EAAA,CAAC;yBACpC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;oBAC7B,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,GAAG,CAAC,EAAE;wBAC7C,MAAM,MAAM,GAAG,IAAA,kCAAa,yBAE3B,CAAC,EACD,KAAK,EACL,IAAI,EACJ,UAAU,EACV,SAAS,EACT,SAAS,EACT,UAAU,CAAC,QAAQ,EACnB,KAAK,CACL,CAAC;wBACF,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;4BACpB,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC;4BAC1B,CAAC,CAAC,MAAM,GAAG,cAAc,CAAC;4BAC1B,CAAC,CAAC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;wBACxC,CAAC,CAAC,CAAC;wBACH,IAAA,4BAAmB,EAClB,MAAM,EACN,KAAK,EACL,IAAI,EACJ,UAAU,EACV,cAAc,EACd,UAAU,EACV,SAAS,EACT,SAAS,CACT,CAAC;qBACF;iBACD;aACD;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterDeathInput } from '../../../simulation/attack';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { DefaultScriptDataNumCard, OnAfterDeathCard } from '../../card.interface';\r\n\r\n// 2026-04-17: Deathrattles trigger before the Sticker\r\n// https://replays.firestoneapp.com/?reviewId=99605623-18e1-45ad-a7a1-daf7ef29adcb&turn=23&action=7\r\nexport const BloodGolemSticker: OnAfterDeathCard & DefaultScriptDataNumCard = {\r\n\tcardIds: [CardIds.BloodGolemSticker_BG30_MagicItem_442],\r\n\tdefaultScriptDataNum: (cardId: string) => 9999, // Unlimited, just easier to update\r\n\tonAfterDeath: (trinket: BoardTrinket, input: OnAfterDeathInput) => {\r\n\t\tconst { hero, gameState, board, otherBoard, otherHero } = input;\r\n\t\tfor (const deadEntity of input.deadEntities) {\r\n\t\t\tif (\r\n\t\t\t\tdeadEntity.friendly === hero.friendly &&\r\n\t\t\t\thasCorrectTribe(deadEntity, hero, Race.QUILBOAR, gameState.anomalies, gameState.allCards)\r\n\t\t\t) {\r\n\t\t\t\t// -1 because the minion is already removed from the board\r\n\t\t\t\tconst indexFromRight = input.deadEntitiesIndexesFromRight[input.deadEntities.indexOf(deadEntity)] + 1;\r\n\t\t\t\tlet bloodGemEnchantments = deadEntity.enchantments.filter(\r\n\t\t\t\t\t(e) => e.cardId === CardIds.BloodGem_BloodGemsEnchantment,\r\n\t\t\t\t);\r\n\t\t\t\tif (bloodGemEnchantments?.length === 0) {\r\n\t\t\t\t\tbloodGemEnchantments = deadEntity.enchantments.filter(\r\n\t\t\t\t\t\t(e) => e.cardId === CardIds.BloodGem_BloodGemEnchantment,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tif (bloodGemEnchantments?.length > 0) {\r\n\t\t\t\t\tconst bloodGemAttack = bloodGemEnchantments\r\n\t\t\t\t\t\t.map((e) => e.tagScriptDataNum1 ?? 0)\r\n\t\t\t\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\t\t\t\tconst bloodGemHealth = bloodGemEnchantments\r\n\t\t\t\t\t\t.map((e) => e.tagScriptDataNum2 ?? 0)\r\n\t\t\t\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\t\t\t\tif (bloodGemAttack > 0 || bloodGemHealth > 0) {\r\n\t\t\t\t\t\tconst spawns = spawnEntities(\r\n\t\t\t\t\t\t\tCardIds.BloodGolemSticker_BloodGolemToken_BG30_MagicItem_442t,\r\n\t\t\t\t\t\t\t1,\r\n\t\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\t\thero,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherHero,\r\n\t\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\t\tdeadEntity.friendly,\r\n\t\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t\tspawns.forEach((b) => {\r\n\t\t\t\t\t\t\tb.attack = bloodGemAttack;\r\n\t\t\t\t\t\t\tb.health = bloodGemHealth;\r\n\t\t\t\t\t\t\tb.hasAttacked = deadEntity.hasAttacked;\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tperformEntitySpawns(\r\n\t\t\t\t\t\t\tspawns,\r\n\t\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\t\thero,\r\n\t\t\t\t\t\t\tdeadEntity,\r\n\t\t\t\t\t\t\tindexFromRight,\r\n\t\t\t\t\t\t\totherBoard,\r\n\t\t\t\t\t\t\totherHero,\r\n\t\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\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":";;;AAGA,gDAA4C;AAC5C,+BAA+B;AAE/B,SAAS,cAAc,CAAI,KAAmB,EAAE,aAAqB;IACpE,MAAM,WAAW,GAAQ,CAAC,GAAG,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,OAAO,WAAW,CAAC,MAAM,EAAE;QAC1B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;KAClD;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAkBQ,wCAAc;AAhBvB,KAAK,UAAU,KAAK,CAAC,EAAE;IACtB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1D,CAAC;AAcwB,sBAAK;AAZvB,MAAM,eAAe,GAC3B,CAAI,YAAyC,EAAE,EAAE,CACjD,CAAC,KAAmB,EAAmC,EAAE;IACxD,OAAO,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,GAAG,EAAE,EAAE;;QACtD,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,iBAAiB,CAAC,KAAK,CAAC,GAAG,MAAA,iBAAiB,CAAC,KAAK,CAAC,mCAAI,EAAE,CAAC;QAE1D,iBAAiB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,iBAAiB,CAAC;IAC1B,CAAC,EAAE,EAAE,CAAC,CAAC;AACR,CAAC,CAAC;AAVU,QAAA,eAAe,mBAUzB;AASH,SAAgB,UAAU,CAAI,KAAmB,EAAE,YAAuD;IACzG,IAAI,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,CAAA,EAAE;QACnB,OAAO,IAAI,CAAC;KACZ;IACD,IACC,YAAY;QACZ,wBAAU,CAAC,MAAM;QACjB,KAAK,CAAC,MAAM,GAAG,CAAC;QAChB,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;QAC5B,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI;QAChB,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,EACrB;QACD,MAAM,MAAM,GAAG,wBAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAU,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5G,IAAI,MAAM,EAAE;YACX,MAAM,KAAK,GAAI,KAAkC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAU,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAE5G,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;gBACzB,wBAAU,CAAC,iBAAiB,GAAG,wBAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC;aACxF;YACD,IAAI,KAAK,EAAE;gBACV,OAAO,KAAU,CAAC;aAClB;SACD;KACD;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAA,YAAM,GAAE,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;AACnD,CAAC;AAzBD,gCAyBC;AAEM,MAAM,kBAAkB,GAAG,CAAI,KAAmB,EAAE,QAAgB,EAAO,EAAE;IACnF,MAAM,MAAM,GAAQ,EAAE,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,CAAC,YAAY,EAAE;YACnB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC1B;KACD;IACD,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAVW,QAAA,kBAAkB,sBAU7B;AAEK,MAAM,eAAe,GAAG,CAC9B,KAAoB,EACpB,YAAuD,EACzC,EAAE;IAChB,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC3D,OAAO,YAAY,CAAC;AACrB,CAAC,CAAC;AAPW,QAAA,eAAe,mBAO1B;AAEK,MAAM,uBAAuB,GAAG,CAAC,KAAoB,EAAE,QAAgB,EAAiB,EAAE;IAChG,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9G,MAAM,YAAY,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,YAAY,EAAE;YACnB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC1B;KACD;IACD,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AAVW,QAAA,uBAAuB,2BAUlC;AAEK,MAAM,sBAAsB,GAAG,CAAC,KAAoB,EAAe,EAAE;IAC3E,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,MAAM,wBAAwB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;IACtF,MAAM,YAAY,GAAG,UAAU,CAAC,wBAAwB,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC;AACrB,CAAC,CAAC;AANW,QAAA,sBAAsB,0BAMjC;AAEK,MAAM,sBAAsB,GAAG,CAAC,KAAoB,EAAe,EAAE;IAC3E,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,MAAM,wBAAwB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;IACtF,MAAM,YAAY,GAAG,UAAU,CAAC,wBAAwB,CAAC,CAAC;IAC1D,OAAO,YAAY,CAAC;AACrB,CAAC,CAAC;AANW,QAAA,sBAAsB,0BAMjC;AAEK,MAAM,uBAAuB,GAAG,CAAC,KAAoB,EAAe,EAAE;IAC5E,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,yBAAyB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;IACxF,MAAM,YAAY,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAC3D,OAAO,YAAY,CAAC;AACrB,CAAC,CAAC;AANW,QAAA,uBAAuB,2BAMlC;AAEK,MAAM,uBAAuB,GAAG,CAAC,KAAoB,EAAe,EAAE;IAC5E,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,MAAM,yBAAyB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC;IACxF,MAAM,YAAY,GAAG,UAAU,CAAC,yBAAyB,CAAC,CAAC;IAC3D,OAAO,YAAY,CAAC;AACrB,CAAC,CAAC;AANW,QAAA,uBAAuB,2BAMlC;AAEK,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE;IAE/C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC;AACf,CAAC,CAAC;AALW,QAAA,MAAM,UAKjB;AAEK,MAAM,MAAM,GAAG,CAAC,MAAc,EAAU,EAAE;IAChD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAJW,QAAA,MAAM,UAIjB;AAEK,MAAM,2BAA2B,GAAG,CAAI,IAAS,EAAE,CAAS,EAAO,EAAE;IAC3E,MAAM,QAAQ,GAAG,IAAA,oBAAY,EAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACzC,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC,CAAC;AAHW,QAAA,2BAA2B,+BAGtC;AAGK,MAAM,YAAY,GAAG,CAAI,KAAU,EAAO,EAAE;IAClD,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC;IAChC,IAAI,WAAW,GAAG,CAAC,CAAC;IAGpB,OAAO,YAAY,IAAI,CAAC,EAAE;QAEzB,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,YAAM,GAAE,GAAG,YAAY,CAAC,CAAC;QAClD,YAAY,EAAE,CAAC;QAGf,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;KACtF;IAED,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAfW,QAAA,YAAY,gBAevB;AAEK,MAAM,QAAQ,GAAG,CACvB,KAAmB,EACnB,SAAkE,EAC9D,EAAE;IACN,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAA,EAAE;QACrB,OAAO,IAAI,CAAC;KACZ;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzC,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAVW,QAAA,QAAQ,YAUnB","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;