@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.
- package/dist/cards/impl/_card-mappings.js +8 -0
- package/dist/cards/impl/_card-mappings.js.map +1 -1
- package/dist/cards/impl/enchantments/deaths-embrace.d.ts +2 -0
- package/dist/cards/impl/enchantments/deaths-embrace.js +14 -0
- package/dist/cards/impl/enchantments/deaths-embrace.js.map +1 -0
- package/dist/cards/impl/enchantments/offensive-sacrifice.js +4 -2
- package/dist/cards/impl/enchantments/offensive-sacrifice.js.map +1 -1
- package/dist/cards/impl/enchantments/resistance.js +1 -1
- package/dist/cards/impl/enchantments/resistance.js.map +1 -1
- package/dist/cards/impl/enchantments/toreths-blessing.d.ts +1 -0
- package/dist/cards/impl/enchantments/toreths-blessing.js +2 -4
- package/dist/cards/impl/enchantments/toreths-blessing.js.map +1 -1
- package/dist/cards/impl/hero-power/runic-empowerment.d.ts +5 -0
- package/dist/cards/impl/hero-power/runic-empowerment.js +24 -0
- package/dist/cards/impl/hero-power/runic-empowerment.js.map +1 -0
- package/dist/cards/impl/minion/cage-gnawer.d.ts +2 -2
- package/dist/cards/impl/minion/cage-gnawer.js +13 -6
- package/dist/cards/impl/minion/cage-gnawer.js.map +1 -1
- package/dist/cards/impl/minion/deathstrider.d.ts +2 -2
- package/dist/cards/impl/minion/deathstrider.js +1 -1
- package/dist/cards/impl/minion/deathstrider.js.map +1 -1
- package/dist/cards/impl/minion/flourishing-frostling.js +0 -2
- package/dist/cards/impl/minion/flourishing-frostling.js.map +1 -1
- package/dist/cards/impl/minion/glowing-cinder.js +1 -1
- package/dist/cards/impl/minion/glowing-cinder.js.map +1 -1
- package/dist/cards/impl/minion/polarizing-beatboxer.js +2 -1
- package/dist/cards/impl/minion/polarizing-beatboxer.js.map +1 -1
- package/dist/cards/impl/minion/ravaging-scorpid.d.ts +2 -2
- package/dist/cards/impl/minion/ravaging-scorpid.js +17 -10
- package/dist/cards/impl/minion/ravaging-scorpid.js.map +1 -1
- package/dist/cards/impl/minion/timewarped-boar.d.ts +2 -0
- package/dist/cards/impl/minion/timewarped-boar.js +43 -0
- package/dist/cards/impl/minion/timewarped-boar.js.map +1 -0
- package/dist/cards/impl/minion/timewarped-henchman.d.ts +2 -0
- package/dist/cards/impl/minion/timewarped-henchman.js +21 -0
- package/dist/cards/impl/minion/timewarped-henchman.js.map +1 -0
- package/dist/cards/impl/trinket/blood-golem-sticker.js +0 -2
- package/dist/cards/impl/trinket/blood-golem-sticker.js.map +1 -1
- package/dist/cards/impl/trinket/deathtouch-apple.d.ts +2 -2
- package/dist/cards/impl/trinket/deathtouch-apple.js +0 -1
- package/dist/cards/impl/trinket/deathtouch-apple.js.map +1 -1
- package/dist/services/utils.d.ts +1 -1
- package/dist/services/utils.js +2 -2
- package/dist/services/utils.js.map +1 -1
- package/dist/simulation/after-attack.d.ts +1 -1
- package/dist/simulation/after-attack.js +21 -3
- package/dist/simulation/after-attack.js.map +1 -1
- package/dist/simulation/attack.d.ts +1 -1
- package/dist/simulation/attack.js +5 -4
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/auras.js +9 -6
- package/dist/simulation/auras.js.map +1 -1
- package/dist/simulation/deathrattle-on-trigger.js +9 -3
- package/dist/simulation/deathrattle-on-trigger.js.map +1 -1
- package/dist/simulation/magnetize.d.ts +2 -3
- package/dist/simulation/magnetize.js +15 -16
- package/dist/simulation/magnetize.js.map +1 -1
- package/dist/simulation/minion-death.js +2 -0
- package/dist/simulation/minion-death.js.map +1 -1
- package/dist/simulation/remove-minion-from-board.js.map +1 -1
- package/dist/simulation/spectator/spectator.d.ts +2 -2
- package/dist/simulation/spectator/spectator.js +2 -1
- package/dist/simulation/spectator/spectator.js.map +1 -1
- package/dist/simulation/stats.d.ts +2 -2
- package/dist/simulation/stats.js +4 -5
- package/dist/simulation/stats.js.map +1 -1
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -1
- 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":";;;
|
|
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
|
-
|
|
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;
|
|
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 {
|
|
2
|
-
export declare const Deathstrider:
|
|
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
|
-
|
|
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;
|
|
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":";;;AAWA,qDAAwD;AAGxD,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,eAAe,GAAG,CAAC,CAAC;AAEb,QAAA,oBAAoB,GAA8D;IAC9F,OAAO,EAAE,0BAAgF;IACzF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAmB,EAAE,EAAE;QACvD,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QACvF,IAAA,mBAAW,EACV,MAAM,EACN,IAAI,EACJ,KAAK,CAAC,gBAAgB;YACrB,CAAC,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,mBAAmB;YACrF,CAAC,CAAC,CAAC,EACJ,KAAK,CAAC,gBAAgB;YACrB,CAAC,CAAC,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,mBAAmB;YACrF,CAAC,CAAC,CAAC,EACJ,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,EACf,KAAK,CACL,CAAC;IACH,CAAC;IACD,WAAW,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QAC3D,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9F,MAAM,mBAAmB,GAAG,mBAAmB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QACvF,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,MAAM,CAAC,MAAM,GAAG,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG,mBAAmB,CACnG,CAAC;
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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,
|
|
2
|
-
export declare const RavagingScorpid:
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
input
|
|
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,
|
|
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,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,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,
|
|
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
|
|
2
|
-
export declare const DeathtouchApple: AfterRebornCard
|
|
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,
|
|
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"]}
|
package/dist/services/utils.d.ts
CHANGED
|
@@ -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;
|
package/dist/services/utils.js
CHANGED
|
@@ -62,9 +62,9 @@ const pickMultipleRandom = (array, quantity) => {
|
|
|
62
62
|
return picked;
|
|
63
63
|
};
|
|
64
64
|
exports.pickMultipleRandom = pickMultipleRandom;
|
|
65
|
-
const pickRandomAlive = (board) => {
|
|
65
|
+
const pickRandomAlive = (board, sourceEntity) => {
|
|
66
66
|
const targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);
|
|
67
|
-
const chosenEntity = pickRandom(targetBoard);
|
|
67
|
+
const chosenEntity = pickRandom(targetBoard, sourceEntity);
|
|
68
68
|
return chosenEntity;
|
|
69
69
|
};
|
|
70
70
|
exports.pickRandomAlive = pickRandomAlive;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoardTrinket } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { BoardSecret } from '../board-secret';\r\nimport { debugState } from '../debug-state';\r\nimport { random } from './rng';\r\n\r\nfunction partitionArray<T>(array: readonly T[], partitionSize: number): readonly T[][] {\r\n\tconst workingCopy: T[] = [...array];\r\n\tconst result: T[][] = [];\r\n\twhile (workingCopy.length) {\r\n\t\tresult.push(workingCopy.splice(0, partitionSize));\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nasync function sleep(ms) {\r\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport const groupByFunction =\r\n\t<T>(keyExtractor: (obj: T) => string | number) =>\r\n\t(array: readonly T[]): { [key: string]: readonly T[] } => {\r\n\t\treturn (array ?? []).reduce((objectsByKeyValue, obj) => {\r\n\t\t\tconst value = keyExtractor(obj);\r\n\t\t\tobjectsByKeyValue[value] = objectsByKeyValue[value] ?? [];\r\n\t\t\t// Using push instead of concat is thousands of times faster on big arrays\r\n\t\t\tobjectsByKeyValue[value].push(obj);\r\n\t\t\treturn objectsByKeyValue;\r\n\t\t}, {});\r\n\t};\r\n\r\nexport { partitionArray, sleep };\r\n\r\nexport function pickRandom<T>(array: readonly T[]): T;\r\nexport function pickRandom<T extends BoardEntity>(\r\n\tarray: readonly T[],\r\n\tsourceEntity: BoardEntity | BoardSecret | BoardTrinket,\r\n): T;\r\nexport function pickRandom<T>(array: readonly T[], sourceEntity?: BoardEntity | BoardSecret | BoardTrinket): T {\r\n\tif (!array?.length) {\r\n\t\treturn null;\r\n\t}\r\n\tif (\r\n\t\tsourceEntity &&\r\n\t\tdebugState.active &&\r\n\t\tarray.length > 0 &&\r\n\t\ttypeof array[0] === 'object' &&\r\n\t\tarray[0] != null &&\r\n\t\t'entityId' in array[0]\r\n\t) {\r\n\t\tconst forced = debugState.forcedRandomPicks.find((p) => debugState.isCorrectEntity(p.source, sourceEntity));\r\n\t\tif (forced) {\r\n\t\t\tconst match = (array as unknown as BoardEntity[]).find((c) => debugState.isCorrectEntity(forced.target, c));\r\n\t\t\t// Defer consumption when pick has chosenCardId - getRandomMagneticVolumizer will consume (e.g. Apexis Guardian)\r\n\t\t\tif (!forced.chosenCardId) {\r\n\t\t\t\tdebugState.forcedRandomPicks = debugState.forcedRandomPicks.filter((p) => p !== forced);\r\n\t\t\t}\r\n\t\t\tif (match) {\r\n\t\t\t\treturn match as T;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn array[Math.floor(random() * array.length)];\r\n}\r\n\r\nexport const pickMultipleRandom = <T>(array: readonly T[], quantity: number): T[] => {\r\n\tconst picked: T[] = [];\r\n\tfor (let i = 0; i < quantity; i++) {\r\n\t\tconst target = array.filter((e) => !picked.includes(e));\r\n\t\tconst chosenEntity = pickRandom(target);\r\n\t\tif (!!chosenEntity) {\r\n\t\t\tpicked.push(chosenEntity);\r\n\t\t}\r\n\t}\r\n\treturn picked;\r\n};\r\n\r\nexport const pickRandomAlive = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst chosenEntity = pickRandom(targetBoard);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickMultipleRandomAlive = (board: BoardEntity[], quantity: number): BoardEntity[] => {\r\n\tconst picked: BoardEntity[] = [];\r\n\tfor (let i = 0; i < quantity; i++) {\r\n\t\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead).filter((e) => !picked.includes(e));\r\n\t\tconst chosenEntity = pickRandom(targetBoard);\r\n\t\tif (!!chosenEntity) {\r\n\t\t\tpicked.push(chosenEntity);\r\n\t\t}\r\n\t}\r\n\treturn picked;\r\n};\r\n\r\nexport const pickRandomLowestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst lowestHealth = Math.min(...targetBoard.map((e) => e.health));\r\n\tconst entitiesWithLowestHealth = targetBoard.filter((e) => e.health === lowestHealth);\r\n\tconst chosenEntity = pickRandom(entitiesWithLowestHealth);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomLowestAttack = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst lowestAttack = Math.min(...targetBoard.map((e) => e.attack));\r\n\tconst entitiesWithLowestAttack = targetBoard.filter((e) => e.attack === lowestAttack);\r\n\tconst chosenEntity = pickRandom(entitiesWithLowestAttack);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomHighestAttack = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst highestAttack = Math.max(...targetBoard.map((e) => e.attack));\r\n\tconst entitiesWithHighestAttack = targetBoard.filter((e) => e.attack === highestAttack);\r\n\tconst chosenEntity = pickRandom(entitiesWithHighestAttack);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst highestHealth = Math.max(...targetBoard.map((e) => e.health));\r\n\tconst entitiesWithHighestHealth = targetBoard.filter((e) => e.health === highestHealth);\r\n\tconst chosenEntity = pickRandom(entitiesWithHighestHealth);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const encode = (input: string): string => {\r\n\t// return compressToEncodedURIComponent(input);\r\n\tconst buff = Buffer.from(input, 'utf-8');\r\n\tconst base64 = buff.toString('base64');\r\n\treturn base64;\r\n};\r\n\r\nexport const decode = (base64: string): string => {\r\n\tconst buff = Buffer.from(base64, 'base64');\r\n\tconst str = buff.toString('utf-8');\r\n\treturn str;\r\n};\r\n\r\nexport const pickMultipleRandomDifferent = <T>(list: T[], n: number): T[] => {\r\n\tconst shuffled = shuffleArray([...list]);\r\n\treturn shuffled.slice(0, n);\r\n};\r\n\r\n// https://stackoverflow.com/a/2450976/548701\r\nexport const shuffleArray = <T>(array: T[]): T[] => {\r\n\tlet currentIndex = array.length;\r\n\tlet randomIndex = 0;\r\n\r\n\t// While there remain elements to shuffle...\r\n\twhile (currentIndex != 0) {\r\n\t\t// Pick a remaining element...\r\n\t\trandomIndex = Math.floor(random() * currentIndex);\r\n\t\tcurrentIndex--;\r\n\r\n\t\t// And swap it with the current element.\r\n\t\t[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];\r\n\t}\r\n\r\n\treturn array;\r\n};\r\n\r\nexport const findLast = <T>(\r\n\tarray: readonly T[],\r\n\tpredicate: (value: T, index: number, obj: readonly T[]) => unknown,\r\n): T => {\r\n\tconst filtred = array.filter(predicate);\r\n\tif (!filtred?.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst last = filtred[filtred.length - 1];\r\n\treturn last;\r\n};\r\n\r\nexport type Mutable<T> = {\r\n\t-readonly [P in keyof T]: T[P];\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/services/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { BoardTrinket } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { BoardSecret } from '../board-secret';\r\nimport { debugState } from '../debug-state';\r\nimport { random } from './rng';\r\n\r\nfunction partitionArray<T>(array: readonly T[], partitionSize: number): readonly T[][] {\r\n\tconst workingCopy: T[] = [...array];\r\n\tconst result: T[][] = [];\r\n\twhile (workingCopy.length) {\r\n\t\tresult.push(workingCopy.splice(0, partitionSize));\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nasync function sleep(ms) {\r\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\r\n}\r\n\r\nexport const groupByFunction =\r\n\t<T>(keyExtractor: (obj: T) => string | number) =>\r\n\t(array: readonly T[]): { [key: string]: readonly T[] } => {\r\n\t\treturn (array ?? []).reduce((objectsByKeyValue, obj) => {\r\n\t\t\tconst value = keyExtractor(obj);\r\n\t\t\tobjectsByKeyValue[value] = objectsByKeyValue[value] ?? [];\r\n\t\t\t// Using push instead of concat is thousands of times faster on big arrays\r\n\t\t\tobjectsByKeyValue[value].push(obj);\r\n\t\t\treturn objectsByKeyValue;\r\n\t\t}, {});\r\n\t};\r\n\r\nexport { partitionArray, sleep };\r\n\r\nexport function pickRandom<T>(array: readonly T[]): T;\r\nexport function pickRandom<T extends BoardEntity>(\r\n\tarray: readonly T[],\r\n\tsourceEntity: BoardEntity | BoardSecret | BoardTrinket,\r\n): T;\r\nexport function pickRandom<T>(array: readonly T[], sourceEntity?: BoardEntity | BoardSecret | BoardTrinket): T {\r\n\tif (!array?.length) {\r\n\t\treturn null;\r\n\t}\r\n\tif (\r\n\t\tsourceEntity &&\r\n\t\tdebugState.active &&\r\n\t\tarray.length > 0 &&\r\n\t\ttypeof array[0] === 'object' &&\r\n\t\tarray[0] != null &&\r\n\t\t'entityId' in array[0]\r\n\t) {\r\n\t\tconst forced = debugState.forcedRandomPicks.find((p) => debugState.isCorrectEntity(p.source, sourceEntity));\r\n\t\tif (forced) {\r\n\t\t\tconst match = (array as unknown as BoardEntity[]).find((c) => debugState.isCorrectEntity(forced.target, c));\r\n\t\t\t// Defer consumption when pick has chosenCardId - getRandomMagneticVolumizer will consume (e.g. Apexis Guardian)\r\n\t\t\tif (!forced.chosenCardId) {\r\n\t\t\t\tdebugState.forcedRandomPicks = debugState.forcedRandomPicks.filter((p) => p !== forced);\r\n\t\t\t}\r\n\t\t\tif (match) {\r\n\t\t\t\treturn match as T;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn array[Math.floor(random() * array.length)];\r\n}\r\n\r\nexport const pickMultipleRandom = <T>(array: readonly T[], quantity: number): T[] => {\r\n\tconst picked: T[] = [];\r\n\tfor (let i = 0; i < quantity; i++) {\r\n\t\tconst target = array.filter((e) => !picked.includes(e));\r\n\t\tconst chosenEntity = pickRandom(target);\r\n\t\tif (!!chosenEntity) {\r\n\t\t\tpicked.push(chosenEntity);\r\n\t\t}\r\n\t}\r\n\treturn picked;\r\n};\r\n\r\nexport const pickRandomAlive = (\r\n\tboard: BoardEntity[],\r\n\tsourceEntity?: BoardEntity | BoardSecret | BoardTrinket,\r\n): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst chosenEntity = pickRandom(targetBoard, sourceEntity);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickMultipleRandomAlive = (board: BoardEntity[], quantity: number): BoardEntity[] => {\r\n\tconst picked: BoardEntity[] = [];\r\n\tfor (let i = 0; i < quantity; i++) {\r\n\t\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead).filter((e) => !picked.includes(e));\r\n\t\tconst chosenEntity = pickRandom(targetBoard);\r\n\t\tif (!!chosenEntity) {\r\n\t\t\tpicked.push(chosenEntity);\r\n\t\t}\r\n\t}\r\n\treturn picked;\r\n};\r\n\r\nexport const pickRandomLowestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst lowestHealth = Math.min(...targetBoard.map((e) => e.health));\r\n\tconst entitiesWithLowestHealth = targetBoard.filter((e) => e.health === lowestHealth);\r\n\tconst chosenEntity = pickRandom(entitiesWithLowestHealth);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomLowestAttack = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst lowestAttack = Math.min(...targetBoard.map((e) => e.attack));\r\n\tconst entitiesWithLowestAttack = targetBoard.filter((e) => e.attack === lowestAttack);\r\n\tconst chosenEntity = pickRandom(entitiesWithLowestAttack);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomHighestAttack = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst highestAttack = Math.max(...targetBoard.map((e) => e.attack));\r\n\tconst entitiesWithHighestAttack = targetBoard.filter((e) => e.attack === highestAttack);\r\n\tconst chosenEntity = pickRandom(entitiesWithHighestAttack);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const pickRandomHighestHealth = (board: BoardEntity[]): BoardEntity => {\r\n\tconst targetBoard = board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst highestHealth = Math.max(...targetBoard.map((e) => e.health));\r\n\tconst entitiesWithHighestHealth = targetBoard.filter((e) => e.health === highestHealth);\r\n\tconst chosenEntity = pickRandom(entitiesWithHighestHealth);\r\n\treturn chosenEntity;\r\n};\r\n\r\nexport const encode = (input: string): string => {\r\n\t// return compressToEncodedURIComponent(input);\r\n\tconst buff = Buffer.from(input, 'utf-8');\r\n\tconst base64 = buff.toString('base64');\r\n\treturn base64;\r\n};\r\n\r\nexport const decode = (base64: string): string => {\r\n\tconst buff = Buffer.from(base64, 'base64');\r\n\tconst str = buff.toString('utf-8');\r\n\treturn str;\r\n};\r\n\r\nexport const pickMultipleRandomDifferent = <T>(list: T[], n: number): T[] => {\r\n\tconst shuffled = shuffleArray([...list]);\r\n\treturn shuffled.slice(0, n);\r\n};\r\n\r\n// https://stackoverflow.com/a/2450976/548701\r\nexport const shuffleArray = <T>(array: T[]): T[] => {\r\n\tlet currentIndex = array.length;\r\n\tlet randomIndex = 0;\r\n\r\n\t// While there remain elements to shuffle...\r\n\twhile (currentIndex != 0) {\r\n\t\t// Pick a remaining element...\r\n\t\trandomIndex = Math.floor(random() * currentIndex);\r\n\t\tcurrentIndex--;\r\n\r\n\t\t// And swap it with the current element.\r\n\t\t[array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]];\r\n\t}\r\n\r\n\treturn array;\r\n};\r\n\r\nexport const findLast = <T>(\r\n\tarray: readonly T[],\r\n\tpredicate: (value: T, index: number, obj: readonly T[]) => unknown,\r\n): T => {\r\n\tconst filtred = array.filter(predicate);\r\n\tif (!filtred?.length) {\r\n\t\treturn null;\r\n\t}\r\n\tconst last = filtred[filtred.length - 1];\r\n\treturn last;\r\n};\r\n\r\nexport type Mutable<T> = {\r\n\t-readonly [P in keyof T]: T[P];\r\n};\r\n"]}
|
|
@@ -2,7 +2,7 @@ import { BgsPlayerEntity } from '../bgs-player-entity';
|
|
|
2
2
|
import { BoardEntity } from '../board-entity';
|
|
3
3
|
import { FullGameState } from './internal-game-state';
|
|
4
4
|
export declare const applyAfterAttackEffects: (attackingEntity: BoardEntity, attackingBoard: BoardEntity[], attackingBoardHero: BgsPlayerEntity, defendingEntity: BoardEntity, defendingBoard: BoardEntity[], defendingBoardHero: BgsPlayerEntity, damageDoneByAttacker: number, damageDoneByDefender: number, gameState: FullGameState) => void;
|
|
5
|
-
export declare const
|
|
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;
|