@firestone-hs/simulate-bgs-battle 1.1.734 → 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/toreths-blessing.d.ts +1 -0
- package/dist/cards/impl/enchantments/toreths-blessing.js +2 -5
- 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/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/simulation/deathrattle-on-trigger.js +9 -3
- package/dist/simulation/deathrattle-on-trigger.js.map +1 -1
- package/dist/simulation/minion-death.js +2 -0
- package/dist/simulation/minion-death.js.map +1 -1
- package/dist/utils.js +6 -0
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -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 { 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"]}
|
|
@@ -5,20 +5,26 @@ const card_interface_1 = require("../cards/card.interface");
|
|
|
5
5
|
const _card_mappings_1 = require("../cards/impl/_card-mappings");
|
|
6
6
|
const quest_1 = require("./quest");
|
|
7
7
|
const onDeathrattleTriggered = (input) => {
|
|
8
|
-
var _a, _b;
|
|
8
|
+
var _a, _b, _c;
|
|
9
9
|
for (const boardEntity of input.boardWithDeadEntity) {
|
|
10
10
|
const onDeathrattleTriggered = _card_mappings_1.cardMappings[boardEntity.cardId];
|
|
11
11
|
if ((0, card_interface_1.hasOnDeathrattleTriggered)(onDeathrattleTriggered)) {
|
|
12
12
|
onDeathrattleTriggered.onDeathrattleTriggered(boardEntity, input);
|
|
13
13
|
}
|
|
14
|
+
for (const enchantment of (_a = boardEntity.enchantments) !== null && _a !== void 0 ? _a : []) {
|
|
15
|
+
const onDeathrattleTriggered = _card_mappings_1.cardMappings[enchantment.cardId];
|
|
16
|
+
if ((0, card_interface_1.hasOnDeathrattleTriggered)(onDeathrattleTriggered)) {
|
|
17
|
+
onDeathrattleTriggered.onDeathrattleTriggered(boardEntity, input);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
14
20
|
}
|
|
15
|
-
for (const trinket of (
|
|
21
|
+
for (const trinket of (_b = input.boardWithDeadEntityHero.trinkets) !== null && _b !== void 0 ? _b : []) {
|
|
16
22
|
const onDeathrattleTriggered = _card_mappings_1.cardMappings[trinket.cardId];
|
|
17
23
|
if ((0, card_interface_1.hasOnDeathrattleTriggered)(onDeathrattleTriggered)) {
|
|
18
24
|
onDeathrattleTriggered.onDeathrattleTriggered(trinket, input);
|
|
19
25
|
}
|
|
20
26
|
}
|
|
21
|
-
const quests = (
|
|
27
|
+
const quests = (_c = input.boardWithDeadEntityHero.questEntities) !== null && _c !== void 0 ? _c : [];
|
|
22
28
|
for (const quest of quests) {
|
|
23
29
|
switch (quest.CardId) {
|
|
24
30
|
case "BG24_Quest_320":
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deathrattle-on-trigger.js","sourceRoot":"","sources":["../../src/simulation/deathrattle-on-trigger.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"deathrattle-on-trigger.js","sourceRoot":"","sources":["../../src/simulation/deathrattle-on-trigger.ts"],"names":[],"mappings":";;;AAEA,4DAAoE;AACpE,iEAA4D;AAG5D,mCAAiD;AAY1C,MAAM,sBAAsB,GAAG,CAAC,KAAgC,EAAE,EAAE;;IAC1E,KAAK,MAAM,WAAW,IAAI,KAAK,CAAC,mBAAmB,EAAE;QACpD,MAAM,sBAAsB,GAAG,6BAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAChE,IAAI,IAAA,0CAAyB,EAAC,sBAAsB,CAAC,EAAE;YACtD,sBAAsB,CAAC,sBAAsB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;SAClE;QACD,KAAK,MAAM,WAAW,IAAI,MAAA,WAAW,CAAC,YAAY,mCAAI,EAAE,EAAE;YACzD,MAAM,sBAAsB,GAAG,6BAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAChE,IAAI,IAAA,0CAAyB,EAAC,sBAAsB,CAAC,EAAE;gBACtD,sBAAsB,CAAC,sBAAsB,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;aAClE;SACD;KACD;IACD,KAAK,MAAM,OAAO,IAAI,MAAA,KAAK,CAAC,uBAAuB,CAAC,QAAQ,mCAAI,EAAE,EAAE;QACnE,MAAM,sBAAsB,GAAG,6BAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5D,IAAI,IAAA,0CAAyB,EAAC,sBAAsB,CAAC,EAAE;YACtD,sBAAsB,CAAC,sBAAsB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;SAC9D;KACD;IAED,MAAM,MAAM,GAAG,MAAA,KAAK,CAAC,uBAAuB,CAAC,aAAa,mCAAI,EAAE,CAAC;IACjE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC3B,QAAQ,KAAK,CAAC,MAAM,EAAE;YACrB;gBACC,IAAA,8BAAsB,EACrB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,EACL,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,MAAM;SACP;KACD;IAED,KAAK,CAAC,uBAAuB,CAAC,QAAQ;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,yBAAiD,CAAC;SACxE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACd,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAvCW,QAAA,sBAAsB,0BAuCjC","sourcesContent":["import { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnDeathrattleTriggered } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\n\r\nexport interface DeathrattleTriggeredInput {\r\n\treadonly boardWithDeadEntity: BoardEntity[];\r\n\treadonly boardWithDeadEntityHero: BgsPlayerEntity;\r\n\treadonly deadEntity: BoardEntity;\r\n\treadonly otherBoard: BoardEntity[];\r\n\treadonly otherBoardHero: BgsPlayerEntity;\r\n\treadonly deadEntityIndexFromRight?: number;\r\n\treadonly gameState: FullGameState;\r\n}\r\n\r\nexport const onDeathrattleTriggered = (input: DeathrattleTriggeredInput) => {\r\n\tfor (const boardEntity of input.boardWithDeadEntity) {\r\n\t\tconst onDeathrattleTriggered = cardMappings[boardEntity.cardId];\r\n\t\tif (hasOnDeathrattleTriggered(onDeathrattleTriggered)) {\r\n\t\t\tonDeathrattleTriggered.onDeathrattleTriggered(boardEntity, input);\r\n\t\t}\r\n\t\tfor (const enchantment of boardEntity.enchantments ?? []) {\r\n\t\t\tconst onDeathrattleTriggered = cardMappings[enchantment.cardId];\r\n\t\t\tif (hasOnDeathrattleTriggered(onDeathrattleTriggered)) {\r\n\t\t\t\tonDeathrattleTriggered.onDeathrattleTriggered(boardEntity, input);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tfor (const trinket of input.boardWithDeadEntityHero.trinkets ?? []) {\r\n\t\tconst onDeathrattleTriggered = cardMappings[trinket.cardId];\r\n\t\tif (hasOnDeathrattleTriggered(onDeathrattleTriggered)) {\r\n\t\t\tonDeathrattleTriggered.onDeathrattleTriggered(trinket, input);\r\n\t\t}\r\n\t}\r\n\r\n\tconst quests = input.boardWithDeadEntityHero.questEntities ?? [];\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.ExhumeTheBones:\r\n\t\t\t\tonQuestProgressUpdated(\r\n\t\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\t\tquest,\r\n\t\t\t\t\tinput.boardWithDeadEntity,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tinput.boardWithDeadEntityHero.trinkets\r\n\t\t.filter((t) => t.cardId === CardIds.DeathlyPhylactery_BG30_MagicItem_700)\r\n\t\t.forEach((t) => {\r\n\t\t\tt.scriptDataNum1 = 0;\r\n\t\t});\r\n};\r\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.onMinionDeadQuest = exports.onMinionDeadHeroPower = exports.makeMinionsDie = void 0;
|
|
4
|
+
const runic_empowerment_1 = require("../cards/impl/hero-power/runic-empowerment");
|
|
4
5
|
const utils_1 = require("../services/utils");
|
|
5
6
|
const utils_2 = require("../utils");
|
|
6
7
|
const avenge_1 = require("./avenge");
|
|
@@ -54,6 +55,7 @@ const onMinionDeadHeroPower = (board, boardHero, deadEntity, gameState) => {
|
|
|
54
55
|
(0, cards_in_hand_1.addCardsInHand)(boardHero, board, [deadEntity.cardId], gameState);
|
|
55
56
|
heroPower.info2 = 1;
|
|
56
57
|
}
|
|
58
|
+
(0, runic_empowerment_1.applyRunicEmpowermentOnFriendlyDeath)(heroPower, boardHero, deadEntity);
|
|
57
59
|
}
|
|
58
60
|
};
|
|
59
61
|
exports.onMinionDeadHeroPower = onMinionDeadHeroPower;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"minion-death.js","sourceRoot":"","sources":["../../src/simulation/minion-death.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { pickMultipleRandomAlive } from '../services/utils';\r\nimport { getEffectiveTribesForEntity } from '../utils';\r\nimport { updateAvengeCounters } from './avenge';\r\nimport { addCardsInHand } from './cards-in-hand';\r\nimport { handleWheneverMinionsKillEffect } from './deathrattle-effects';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { removeMinionFromBoard } from './remove-minion-from-board';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const makeMinionsDie = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): [number[], number[], BoardEntity[]] => {\r\n\t// Because entities spawn to the left, so the right index is unchanged\r\n\tconst deadMinionIndexesFromLeft: number[] = [];\r\n\tconst deadMinionIndexesFromRight: number[] = [];\r\n\tconst deadEntities: BoardEntity[] = [];\r\n\tconst initialBoardLength = board.length;\r\n\r\n\thandleWheneverMinionsKillEffect(board, boardHero, otherBoard, otherBoardHero, gameState);\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].health <= 0 || board[i].definitelyDead) {\r\n\t\t\tdeadMinionIndexesFromLeft.push(i);\r\n\t\t\tdeadMinionIndexesFromRight.push(initialBoardLength - (i + 1));\r\n\t\t\tdeadEntities.push(board[i]);\r\n\t\t\t// console.log(\r\n\t\t\t// \t'\\tflagging dead minion 0',\r\n\t\t\t// \tstringifySimpleCard(board[i], allCards),\r\n\t\t\t// \tstringifySimple(board, allCards),\r\n\t\t\t// \tinitialBoardLength,\r\n\t\t\t// \ti,\r\n\t\t\t// \tdeadMinionIndexesFromRight,\r\n\t\t\t// );\r\n\t\t}\r\n\t}\r\n\r\n\t// These will always be processed from left to right afterwards\r\n\t// We compute the indexes as they will be once the new board is effective. For a\r\n\t// board of length N, having an indexFromRight at N means it will spawn at the very left\r\n\t// of the board (first minion)\r\n\tlet indexesFromRightAfterDeath = [];\r\n\tfor (let i = deadMinionIndexesFromRight.length - 1; i >= 0; i--) {\r\n\t\tconst newIndex = deadMinionIndexesFromRight[i] - indexesFromRightAfterDeath.length;\r\n\t\tindexesFromRightAfterDeath.push(newIndex);\r\n\t}\r\n\tindexesFromRightAfterDeath = indexesFromRightAfterDeath.reverse();\r\n\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].health <= 0 || board[i].definitelyDead) {\r\n\t\t\t// console.log('\\tflagging dead minion', stringifySimpleCard(board[i], allCards), deadMinionIndexesFromRight);\r\n\t\t\tremoveMinionFromBoard(board, boardHero, i, gameState);\r\n\t\t\t// We modify the original array, so we need to update teh current index accordingly\r\n\t\t\ti--;\r\n\t\t}\r\n\t}\r\n\r\n\t// console.debug('dead entities', stringifySimple(deadEntities, allCards));\r\n\t// Update the avenge counters as soon as minions die. If we wait until the \"avenge\" phase, we might\r\n\t// update the counters for entities that have been spawned after the death of the original entity\r\n\t// ISSUE: deaths are actually processed one by one. Once a minion dies, its DR triggers, then the next, etc.\r\n\t// This means that if you have a minion that summons another one, it can progress and complete and quest\r\n\t// and the next minion dying could count towards that quest progress\r\n\t// See http://replays.firestoneapp.com/?reviewId=0ce4db9c-3269-4704-b662-8a8c31f5afe1&turn=16&action=27\r\n\tfor (const deadEntity of deadEntities) {\r\n\t\tconst indexFromRight = indexesFromRightAfterDeath[deadEntities.indexOf(deadEntity)];\r\n\t\tupdateAvengeCounters(board, boardHero);\r\n\t\tonMinionDeadHeroPower(board, boardHero, deadEntity, gameState);\r\n\t\tonMinionDeadHeroPower(otherBoard, otherBoardHero, deadEntity, gameState);\r\n\t\tonMinionDeadQuest(deadEntity, indexFromRight, board, boardHero, otherBoard, otherBoardHero, gameState);\r\n\t\tonMinionDeadQuest(deadEntity, indexFromRight, otherBoard, otherBoardHero, board, boardHero, gameState);\r\n\t}\r\n\r\n\treturn [deadMinionIndexesFromLeft, indexesFromRightAfterDeath, deadEntities];\r\n};\r\n\r\nexport const onMinionDeadHeroPower = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tfor (const heroPower of boardHero.heroPowers) {\r\n\t\tif (\r\n\t\t\theroPower.cardId === CardIds.IllTakeThat &&\r\n\t\t\theroPower.used &&\r\n\t\t\theroPower.info2 <= 0 &&\r\n\t\t\tdeadEntity.friendly !== boardHero.friendly\r\n\t\t) {\r\n\t\t\taddCardsInHand(boardHero, board, [deadEntity.cardId], gameState);\r\n\t\t\theroPower.info2 = 1;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const onMinionDeadQuest = (\r\n\tdeadEntity: BoardEntity,\r\n\tindexFromRight: number,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst quests = boardHero.questEntities ?? [];\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.ReenactTheMurder:\r\n\t\t\t\tif (deadEntity.friendly === boardHero.friendly) {\r\n\t\t\t\t\tonQuestProgressUpdated(boardHero, quest, board, gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.RoundUpTheSuspects:\r\n\t\t\t\tif (deadEntity.friendly !== boardHero.friendly) {\r\n\t\t\t\t\tonQuestProgressUpdated(boardHero, quest, board, gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const trinket of boardHero.trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.AllianceKeychain_BG30_MagicItem_433:\r\n\t\t\tcase CardIds.AllianceKeychain_AllianceKeychainToken_BG30_MagicItem_433t:\r\n\t\t\t\tif (trinket.scriptDataNum1 > 0 && deadEntity.friendly === boardHero.friendly) {\r\n\t\t\t\t\tconst quantity = trinket.cardId === CardIds.AllianceKeychain_BG30_MagicItem_433 ? 1 : 2;\r\n\t\t\t\t\tconst targets = pickMultipleRandomAlive(board, quantity);\r\n\t\t\t\t\tfor (const target of targets) {\r\n\t\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\t\ttarget,\r\n\t\t\t\t\t\t\tboardHero,\r\n\t\t\t\t\t\t\tdeadEntity.maxAttack,\r\n\t\t\t\t\t\t\tdeadEntity.maxHealth,\r\n\t\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\t\tboardHero,\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\ttrinket.scriptDataNum1--;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.TheEyeOfDalaran_BG30_MagicItem_981:\r\n\t\t\t\tif (\r\n\t\t\t\t\tdeadEntity.friendly === boardHero.friendly &&\r\n\t\t\t\t\tgetEffectiveTribesForEntity(deadEntity, boardHero, gameState.anomalies, gameState.allCards)\r\n\t\t\t\t\t\t.length === 0\r\n\t\t\t\t) {\r\n\t\t\t\t\taddCardsInHand(boardHero, board, [null], gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"minion-death.js","sourceRoot":"","sources":["../../src/simulation/minion-death.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { applyRunicEmpowermentOnFriendlyDeath } from '../cards/impl/hero-power/runic-empowerment';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { pickMultipleRandomAlive } from '../services/utils';\r\nimport { getEffectiveTribesForEntity } from '../utils';\r\nimport { updateAvengeCounters } from './avenge';\r\nimport { addCardsInHand } from './cards-in-hand';\r\nimport { handleWheneverMinionsKillEffect } from './deathrattle-effects';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { removeMinionFromBoard } from './remove-minion-from-board';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const makeMinionsDie = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): [number[], number[], BoardEntity[]] => {\r\n\t// Because entities spawn to the left, so the right index is unchanged\r\n\tconst deadMinionIndexesFromLeft: number[] = [];\r\n\tconst deadMinionIndexesFromRight: number[] = [];\r\n\tconst deadEntities: BoardEntity[] = [];\r\n\tconst initialBoardLength = board.length;\r\n\r\n\thandleWheneverMinionsKillEffect(board, boardHero, otherBoard, otherBoardHero, gameState);\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].health <= 0 || board[i].definitelyDead) {\r\n\t\t\tdeadMinionIndexesFromLeft.push(i);\r\n\t\t\tdeadMinionIndexesFromRight.push(initialBoardLength - (i + 1));\r\n\t\t\tdeadEntities.push(board[i]);\r\n\t\t\t// console.log(\r\n\t\t\t// \t'\\tflagging dead minion 0',\r\n\t\t\t// \tstringifySimpleCard(board[i], allCards),\r\n\t\t\t// \tstringifySimple(board, allCards),\r\n\t\t\t// \tinitialBoardLength,\r\n\t\t\t// \ti,\r\n\t\t\t// \tdeadMinionIndexesFromRight,\r\n\t\t\t// );\r\n\t\t}\r\n\t}\r\n\r\n\t// These will always be processed from left to right afterwards\r\n\t// We compute the indexes as they will be once the new board is effective. For a\r\n\t// board of length N, having an indexFromRight at N means it will spawn at the very left\r\n\t// of the board (first minion)\r\n\tlet indexesFromRightAfterDeath = [];\r\n\tfor (let i = deadMinionIndexesFromRight.length - 1; i >= 0; i--) {\r\n\t\tconst newIndex = deadMinionIndexesFromRight[i] - indexesFromRightAfterDeath.length;\r\n\t\tindexesFromRightAfterDeath.push(newIndex);\r\n\t}\r\n\tindexesFromRightAfterDeath = indexesFromRightAfterDeath.reverse();\r\n\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].health <= 0 || board[i].definitelyDead) {\r\n\t\t\t// console.log('\\tflagging dead minion', stringifySimpleCard(board[i], allCards), deadMinionIndexesFromRight);\r\n\t\t\tremoveMinionFromBoard(board, boardHero, i, gameState);\r\n\t\t\t// We modify the original array, so we need to update teh current index accordingly\r\n\t\t\ti--;\r\n\t\t}\r\n\t}\r\n\r\n\t// console.debug('dead entities', stringifySimple(deadEntities, allCards));\r\n\t// Update the avenge counters as soon as minions die. If we wait until the \"avenge\" phase, we might\r\n\t// update the counters for entities that have been spawned after the death of the original entity\r\n\t// ISSUE: deaths are actually processed one by one. Once a minion dies, its DR triggers, then the next, etc.\r\n\t// This means that if you have a minion that summons another one, it can progress and complete and quest\r\n\t// and the next minion dying could count towards that quest progress\r\n\t// See http://replays.firestoneapp.com/?reviewId=0ce4db9c-3269-4704-b662-8a8c31f5afe1&turn=16&action=27\r\n\tfor (const deadEntity of deadEntities) {\r\n\t\tconst indexFromRight = indexesFromRightAfterDeath[deadEntities.indexOf(deadEntity)];\r\n\t\tupdateAvengeCounters(board, boardHero);\r\n\t\tonMinionDeadHeroPower(board, boardHero, deadEntity, gameState);\r\n\t\tonMinionDeadHeroPower(otherBoard, otherBoardHero, deadEntity, gameState);\r\n\t\tonMinionDeadQuest(deadEntity, indexFromRight, board, boardHero, otherBoard, otherBoardHero, gameState);\r\n\t\tonMinionDeadQuest(deadEntity, indexFromRight, otherBoard, otherBoardHero, board, boardHero, gameState);\r\n\t}\r\n\r\n\treturn [deadMinionIndexesFromLeft, indexesFromRightAfterDeath, deadEntities];\r\n};\r\n\r\nexport const onMinionDeadHeroPower = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tfor (const heroPower of boardHero.heroPowers) {\r\n\t\tif (\r\n\t\t\theroPower.cardId === CardIds.IllTakeThat &&\r\n\t\t\theroPower.used &&\r\n\t\t\theroPower.info2 <= 0 &&\r\n\t\t\tdeadEntity.friendly !== boardHero.friendly\r\n\t\t) {\r\n\t\t\taddCardsInHand(boardHero, board, [deadEntity.cardId], gameState);\r\n\t\t\theroPower.info2 = 1;\r\n\t\t}\r\n\t\tapplyRunicEmpowermentOnFriendlyDeath(heroPower, boardHero, deadEntity);\r\n\t}\r\n};\r\n\r\nexport const onMinionDeadQuest = (\r\n\tdeadEntity: BoardEntity,\r\n\tindexFromRight: number,\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst quests = boardHero.questEntities ?? [];\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.ReenactTheMurder:\r\n\t\t\t\tif (deadEntity.friendly === boardHero.friendly) {\r\n\t\t\t\t\tonQuestProgressUpdated(boardHero, quest, board, gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.RoundUpTheSuspects:\r\n\t\t\t\tif (deadEntity.friendly !== boardHero.friendly) {\r\n\t\t\t\t\tonQuestProgressUpdated(boardHero, quest, board, gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const trinket of boardHero.trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.AllianceKeychain_BG30_MagicItem_433:\r\n\t\t\tcase CardIds.AllianceKeychain_AllianceKeychainToken_BG30_MagicItem_433t:\r\n\t\t\t\tif (trinket.scriptDataNum1 > 0 && deadEntity.friendly === boardHero.friendly) {\r\n\t\t\t\t\tconst quantity = trinket.cardId === CardIds.AllianceKeychain_BG30_MagicItem_433 ? 1 : 2;\r\n\t\t\t\t\tconst targets = pickMultipleRandomAlive(board, quantity);\r\n\t\t\t\t\tfor (const target of targets) {\r\n\t\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\t\ttarget,\r\n\t\t\t\t\t\t\tboardHero,\r\n\t\t\t\t\t\t\tdeadEntity.maxAttack,\r\n\t\t\t\t\t\t\tdeadEntity.maxHealth,\r\n\t\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\t\tboardHero,\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\ttrinket.scriptDataNum1--;\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.TheEyeOfDalaran_BG30_MagicItem_981:\r\n\t\t\t\tif (\r\n\t\t\t\t\tdeadEntity.friendly === boardHero.friendly &&\r\n\t\t\t\t\tgetEffectiveTribesForEntity(deadEntity, boardHero, gameState.anomalies, gameState.allCards)\r\n\t\t\t\t\t\t.length === 0\r\n\t\t\t\t) {\r\n\t\t\t\t\taddCardsInHand(boardHero, board, [null], gameState);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n"]}
|
package/dist/utils.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.isDead = exports.copyEntity = exports.getPlayerInitialState = exports.ge
|
|
|
4
4
|
const reference_data_1 = require("@firestone-hs/reference-data");
|
|
5
5
|
const card_interface_1 = require("./cards/card.interface");
|
|
6
6
|
const _card_mappings_1 = require("./cards/impl/_card-mappings");
|
|
7
|
+
const toreths_blessing_1 = require("./cards/impl/enchantments/toreths-blessing");
|
|
7
8
|
const utils_1 = require("./services/utils");
|
|
8
9
|
const stats_1 = require("./simulation/stats");
|
|
9
10
|
const CLEAVE_IDS = [
|
|
@@ -439,11 +440,16 @@ const TWO_CHARGES_IDS = [
|
|
|
439
440
|
"BG30_111_G",
|
|
440
441
|
];
|
|
441
442
|
const addImpliedMechanics = (entity, cardsData) => {
|
|
443
|
+
var _a, _b;
|
|
442
444
|
const cleave = CLEAVE_IDS.indexOf(entity.cardId) !== -1;
|
|
443
445
|
const cantAttack = CANT_ATTACK_IDS.indexOf(entity.cardId) !== -1;
|
|
444
446
|
entity.cleave = cleave;
|
|
445
447
|
entity.cantAttack = cantAttack;
|
|
446
448
|
entity.divineShield = entity.divineShield || entity.hadDivineShield;
|
|
449
|
+
if ((_a = entity.enchantments) === null || _a === void 0 ? void 0 : _a.some((e) => e.cardId === "BG36_MidGameEffect_000t15e")) {
|
|
450
|
+
entity.divineShield = true;
|
|
451
|
+
entity.extraDivineShieldCharges = ((_b = entity.extraDivineShieldCharges) !== null && _b !== void 0 ? _b : 0) + toreths_blessing_1.extraHits;
|
|
452
|
+
}
|
|
447
453
|
entity.immuneWhenAttackCharges = IMMUNE_WHEN_ATTACK_IDS.includes(entity.cardId) ? 99999 : null;
|
|
448
454
|
entity.frenzyChargesLeft =
|
|
449
455
|
entity.cardId === "BG20_204_G"
|