@firestone-hs/simulate-bgs-battle 1.1.721 → 1.1.723
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/card.interface.d.ts +4 -0
- package/dist/cards/card.interface.js +4 -2
- package/dist/cards/card.interface.js.map +1 -1
- package/dist/cards/impl/_card-mappings.js +2 -0
- package/dist/cards/impl/_card-mappings.js.map +1 -1
- package/dist/cards/impl/hero-power/lightning-invocation.js +4 -1
- package/dist/cards/impl/hero-power/lightning-invocation.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/sanguine-refiner.js +1 -1
- package/dist/cards/impl/minion/sanguine-refiner.js.map +1 -1
- package/dist/cards/impl/minion/silky-shimmermoth.js +5 -3
- package/dist/cards/impl/minion/silky-shimmermoth.js.map +1 -1
- package/dist/cards/impl/minion/timewarped-embalmer.d.ts +2 -2
- package/dist/cards/impl/minion/timewarped-embalmer.js +5 -1
- package/dist/cards/impl/minion/timewarped-embalmer.js.map +1 -1
- package/dist/cards/impl/minion/timewarped-pagle.d.ts +2 -0
- package/dist/cards/impl/minion/timewarped-pagle.js +15 -0
- package/dist/cards/impl/minion/timewarped-pagle.js.map +1 -0
- package/dist/cards/impl/minion/vinespeaker.js +1 -1
- package/dist/cards/impl/minion/vinespeaker.js.map +1 -1
- package/dist/cards/impl/trinket/archaic-scroll.js +3 -2
- package/dist/cards/impl/trinket/archaic-scroll.js.map +1 -1
- package/dist/cards/impl/trinket/beetle-band.js +1 -1
- package/dist/cards/impl/trinket/beetle-band.js.map +1 -1
- package/dist/cards/impl/trinket/bubble-crown.js +2 -1
- package/dist/cards/impl/trinket/bubble-crown.js.map +1 -1
- package/dist/cards/impl/trinket/deathtouch-apple.js.map +1 -1
- package/dist/cards/impl/trinket/quilligraphy-set.js +1 -1
- package/dist/cards/impl/trinket/quilligraphy-set.js.map +1 -1
- package/dist/input-clone.d.ts +1 -0
- package/dist/input-clone.js +13 -1
- package/dist/input-clone.js.map +1 -1
- package/dist/mechanics/rally.js +14 -12
- package/dist/mechanics/rally.js.map +1 -1
- package/dist/mechanics/tavern-spell-repeat.js +3 -4
- package/dist/mechanics/tavern-spell-repeat.js.map +1 -1
- package/dist/simulate-bgs-battle.d.ts +1 -1
- package/dist/simulate-bgs-battle.js +80 -77
- package/dist/simulate-bgs-battle.js.map +1 -1
- package/dist/simulation/add-minion-to-board.js +3 -3
- package/dist/simulation/add-minion-to-board.js.map +1 -1
- package/dist/simulation/attack.js +3 -3
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/avenge.js +2 -2
- package/dist/simulation/avenge.js.map +1 -1
- package/dist/simulation/deathrattle-effects.js +48 -14
- package/dist/simulation/deathrattle-effects.js.map +1 -1
- package/dist/simulation/deathrattle-spawns.js +19 -12
- package/dist/simulation/deathrattle-spawns.js.map +1 -1
- package/dist/simulation/deathrattle-utils.d.ts +1 -0
- package/dist/simulation/deathrattle-utils.js +45 -5
- package/dist/simulation/deathrattle-utils.js.map +1 -1
- package/dist/simulation/on-attack.js +13 -14
- package/dist/simulation/on-attack.js.map +1 -1
- package/dist/simulation/reborn.js +11 -0
- package/dist/simulation/reborn.js.map +1 -1
- package/dist/simulation/simulator.d.ts +1 -0
- package/dist/simulation/simulator.js +39 -74
- package/dist/simulation/simulator.js.map +1 -1
- package/dist/simulation/spectator/resolve-trinket-hero-power.js +11 -2
- package/dist/simulation/spectator/resolve-trinket-hero-power.js.map +1 -1
- package/dist/simulation/spectator/spectator.d.ts +4 -0
- package/dist/simulation/spectator/spectator.js +39 -19
- package/dist/simulation/spectator/spectator.js.map +1 -1
- package/dist/simulation/stats.js +95 -66
- package/dist/simulation/stats.js.map +1 -1
- package/dist/simulation/summon-when-space.js +24 -21
- package/dist/simulation/summon-when-space.js.map +1 -1
- package/dist/utils.js +89 -48
- package/dist/utils.js.map +1 -1
- package/package.json +3 -2
|
@@ -9,7 +9,10 @@ exports.LightningInvocation = {
|
|
|
9
9
|
for (const heroPower of input.playerEntity.heroPowers) {
|
|
10
10
|
if (exports.LightningInvocation.cardIds.includes(heroPower.cardId) && heroPower.used) {
|
|
11
11
|
(0, deathrattle_effects_1.applyLightningInvocationEnchantment)(input.playerBoard, input.playerEntity, input.playerEntity, input.opponentBoard, input.opponentEntity, input.gameState);
|
|
12
|
-
return
|
|
12
|
+
return {
|
|
13
|
+
hasTriggered: true,
|
|
14
|
+
shouldRecomputeCurrentAttacker: true,
|
|
15
|
+
};
|
|
13
16
|
}
|
|
14
17
|
}
|
|
15
18
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lightning-invocation.js","sourceRoot":"","sources":["../../../../src/cards/impl/hero-power/lightning-invocation.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"lightning-invocation.js","sourceRoot":"","sources":["../../../../src/cards/impl/hero-power/lightning-invocation.ts"],"names":[],"mappings":";;;AAIA,iFAA8F;AAIjF,QAAA,mBAAmB,GAAsB;IACrD,mBAAmB,EAAE,iBAAiB;IACtC,OAAO,EAAE,4CAA+D;IACxE,aAAa,EAAE,CAAC,OAAmE,EAAE,KAAe,EAAE,EAAE;QACvG,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE;YACtD,IAAI,2BAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE;gBAC7E,IAAA,yDAAmC,EAClC,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,CACf,CAAC;gBAGF,OAAO;oBACN,YAAY,EAAE,IAAI;oBAClB,8BAA8B,EAAE,IAAI;iBACpC,CAAC;aACF;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BgsPlayerEntity, BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { BoardSecret } from '../../../board-secret';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { applyLightningInvocationEnchantment } from '../../../simulation/deathrattle-effects';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const LightningInvocation: StartOfCombatCard = {\r\n\tstartOfCombatTiming: 'start-of-combat',\r\n\tcardIds: [CardIds.LightningInvocationToken, CardIds.LightningInvocation],\r\n\tstartOfCombat: (trinket: BoardTrinket | BoardEntity | BgsPlayerEntity | BoardSecret, input: SoCInput) => {\r\n\t\tfor (const heroPower of input.playerEntity.heroPowers) {\r\n\t\t\tif (LightningInvocation.cardIds.includes(heroPower.cardId) && heroPower.used) {\r\n\t\t\t\tapplyLightningInvocationEnchantment(\r\n\t\t\t\t\tinput.playerBoard,\r\n\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\tinput.opponentBoard,\r\n\t\t\t\t\tinput.opponentEntity,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\t// See https://replays.firestoneapp.com/?reviewId=09b7ace7-cbe1-4533-bf58-c26d04fa15e9&turn=11&action=8\r\n\t\t\t\t// 2 vs 4 minions, and the 2 side attacks after it becoems 2 vs 2\r\n\t\t\t\treturn {\r\n\t\t\t\t\thasTriggered: true,\r\n\t\t\t\t\tshouldRecomputeCurrentAttacker: true,\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -5,7 +5,7 @@ exports.GlowingCinder = {
|
|
|
5
5
|
cardIds: ["BG32_842", "BG32_842_G"],
|
|
6
6
|
deathrattleSpawn: (minion, input) => {
|
|
7
7
|
const mult = minion.cardId === "BG32_842_G" ? 2 : 1;
|
|
8
|
-
input.boardWithDeadEntityHero.globalInfo.ElementalAttackBuff +=
|
|
8
|
+
input.boardWithDeadEntityHero.globalInfo.ElementalAttackBuff += 2 * mult;
|
|
9
9
|
return [];
|
|
10
10
|
},
|
|
11
11
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glowing-cinder.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/glowing-cinder.ts"],"names":[],"mappings":";;;AAKa,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,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QACzE,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"glowing-cinder.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/glowing-cinder.ts"],"names":[],"mappings":";;;AAKa,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,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QACzE,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 { 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\tinput.boardWithDeadEntityHero.globalInfo.ElementalAttackBuff += 2 * mult;\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
|
|
@@ -6,7 +6,7 @@ exports.SanguineRefiner = {
|
|
|
6
6
|
rally: (minion, input) => {
|
|
7
7
|
const mult = minion.cardId === "BG33_885_G" ? 2 : 1;
|
|
8
8
|
input.attackingHero.globalInfo.BloodGemAttackBonus += 1 * mult;
|
|
9
|
-
input.attackingHero.globalInfo.BloodGemHealthBonus +=
|
|
9
|
+
input.attackingHero.globalInfo.BloodGemHealthBonus += 2 * mult;
|
|
10
10
|
return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
|
|
11
11
|
},
|
|
12
12
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanguine-refiner.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/sanguine-refiner.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"sanguine-refiner.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/sanguine-refiner.ts"],"names":[],"mappings":";;;AAMa,QAAA,eAAe,GAAc;IACzC,OAAO,EAAE,0BAAsE;IAC/E,KAAK,EAAE,CAAC,MAAqD,EAAE,KAAoB,EAAE,EAAE;QACtF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/D,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/D,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { RallyCard } from '../../card.interface';\r\n\r\nexport const SanguineRefiner: RallyCard = {\r\n\tcardIds: [CardIds.SanguineRefiner_BG33_885, CardIds.SanguineRefiner_BG33_885_G],\r\n\trally: (minion: BoardEntity | BoardTrinket | BoardEnchantment, input: OnAttackInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.SanguineRefiner_BG33_885_G ? 2 : 1;\r\n\t\tinput.attackingHero.globalInfo.BloodGemAttackBonus += 1 * mult;\r\n\t\tinput.attackingHero.globalInfo.BloodGemHealthBonus += 2 * mult;\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SilkyShimmermoth = void 0;
|
|
4
4
|
const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
|
|
5
5
|
const stats_1 = require("../../../simulation/stats");
|
|
6
|
+
const attackBuff = 2;
|
|
7
|
+
const healthBuff = 2;
|
|
6
8
|
exports.SilkyShimmermoth = {
|
|
7
9
|
cardIds: ["BG32_204", "BG32_204_G"],
|
|
8
10
|
onDamaged: (minion, input) => {
|
|
@@ -10,12 +12,12 @@ exports.SilkyShimmermoth = {
|
|
|
10
12
|
return;
|
|
11
13
|
}
|
|
12
14
|
const mult = minion.cardId === "BG32_204" ? 1 : 2;
|
|
13
|
-
input.hero.globalInfo.BeetleAttackBuff +=
|
|
14
|
-
input.hero.globalInfo.BeetleHealthBuff +=
|
|
15
|
+
input.hero.globalInfo.BeetleAttackBuff += attackBuff * mult;
|
|
16
|
+
input.hero.globalInfo.BeetleHealthBuff += healthBuff * mult;
|
|
15
17
|
input.board
|
|
16
18
|
.filter((e) => ["BG28_603t", "BG28_603t_G"].includes(e.cardId))
|
|
17
19
|
.forEach((e) => {
|
|
18
|
-
(0, stats_1.modifyStats)(e, minion,
|
|
20
|
+
(0, stats_1.modifyStats)(e, minion, attackBuff * mult, healthBuff * mult, input.board, input.hero, input.gameState);
|
|
19
21
|
});
|
|
20
22
|
},
|
|
21
23
|
deathrattleSpawn: (minion, input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silky-shimmermoth.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/silky-shimmermoth.ts"],"names":[],"mappings":";;;AAGA,+EAAiF;AACjF,qDAAwD;
|
|
1
|
+
{"version":3,"file":"silky-shimmermoth.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/silky-shimmermoth.ts"],"names":[],"mappings":";;;AAGA,+EAAiF;AACjF,qDAAwD;AAGxD,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,UAAU,GAAG,CAAC,CAAC;AAER,QAAA,gBAAgB,GAAyC;IACrE,OAAO,EAAE,0BAAwE;IACjF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,IAAI,KAAK,CAAC,aAAa,KAAK,MAAM,EAAE;YACnC,OAAO;SACP;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,eAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,UAAU,GAAG,IAAI,CAAC;QAC5D,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,IAAI,UAAU,GAAG,IAAI,CAAC;QAC5D,KAAK,CAAC,KAAK;aACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,4BAAyE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,CACvG;aACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,IAAA,mBAAW,EAAC,CAAC,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACxG,CAAC,CAAC,CAAC;IACL,CAAC;IACD,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAA0B,EAAE;QACnG,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,eAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,OAAO,IAAA,4CAAuB,eAA8C,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC;IAC9F,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 { simplifiedSpawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { DeathrattleSpawnCard, OnDamagedCard, OnDamagedInput } from '../../card.interface';\r\n\r\nconst attackBuff = 2;\r\nconst healthBuff = 2;\r\n\r\nexport const SilkyShimmermoth: OnDamagedCard & DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.SilkyShimmermoth_BG32_204, CardIds.SilkyShimmermoth_BG32_204_G],\r\n\tonDamaged: (minion: BoardEntity, input: OnDamagedInput) => {\r\n\t\tif (input.damagedEntity !== minion) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst mult = minion.cardId === CardIds.SilkyShimmermoth_BG32_204 ? 1 : 2;\r\n\t\tinput.hero.globalInfo.BeetleAttackBuff += attackBuff * mult;\r\n\t\tinput.hero.globalInfo.BeetleHealthBuff += healthBuff * mult;\r\n\t\tinput.board\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[CardIds.BoonOfBeetles_BeetleToken_BG28_603t, CardIds.Beetle_BG28_603t_G].includes(e.cardId as CardIds),\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tmodifyStats(e, minion, attackBuff * mult, healthBuff * mult, input.board, input.hero, input.gameState);\r\n\t\t\t});\r\n\t},\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput): readonly BoardEntity[] => {\r\n\t\tconst mult = minion.cardId === CardIds.SilkyShimmermoth_BG32_204 ? 1 : 2;\r\n\t\treturn simplifiedSpawnEntities(CardIds.BoonOfBeetles_BeetleToken_BG28_603t, 1 * mult, input);\r\n\t},\r\n};\r\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { DefaultChargesCard, OnOtherSpawnedCard } from '../../card.interface';
|
|
2
|
-
export declare const TimewarpedEmbalmer: OnOtherSpawnedCard & DefaultChargesCard;
|
|
1
|
+
import { BeforeRebornSelfEffectCard, DefaultChargesCard, OnOtherSpawnedCard } from '../../card.interface';
|
|
2
|
+
export declare const TimewarpedEmbalmer: OnOtherSpawnedCard & DefaultChargesCard & BeforeRebornSelfEffectCard;
|
|
@@ -6,11 +6,15 @@ exports.TimewarpedEmbalmer = {
|
|
|
6
6
|
cardIds: ["BG34_Giant_332", "BG34_Giant_332_G"],
|
|
7
7
|
defaultCharges: (entity) => entity.scriptDataNum1,
|
|
8
8
|
onOtherSpawned: (minion, input) => {
|
|
9
|
-
if (minion.abiityChargesLeft > 0) {
|
|
9
|
+
if (minion.abiityChargesLeft > 0 && !input.spawned.reborn) {
|
|
10
10
|
minion.abiityChargesLeft--;
|
|
11
11
|
const target = input.spawned;
|
|
12
12
|
(0, reborn_1.updateReborn)(target, true, input.board, input.hero, input.otherHero, input.gameState);
|
|
13
13
|
}
|
|
14
14
|
},
|
|
15
|
+
beforeRebornSelfEffect: (minion, input) => {
|
|
16
|
+
minion.scriptDataNum1 = 2;
|
|
17
|
+
minion.abiityChargesLeft = 2;
|
|
18
|
+
},
|
|
15
19
|
};
|
|
16
20
|
//# sourceMappingURL=timewarped-embalmer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timewarped-embalmer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-embalmer.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"timewarped-embalmer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-embalmer.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AAM3C,QAAA,kBAAkB,GAAyE;IACvG,OAAO,EAAE,sCAAwF;IAEjG,cAAc,EAAE,CAAC,MAAmB,EAAE,EAAE,CAEvC,MAAM,CAAC,cAAc;IACtB,cAAc,EAAE,CAAC,MAAkC,EAAE,KAAwB,EAAE,EAAE;QAChF,IAAK,MAAsB,CAAC,iBAAiB,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;YAC1E,MAAsB,CAAC,iBAAiB,EAAE,CAAC;YAC5C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC;YAC7B,IAAA,qBAAY,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACtF;IACF,CAAC;IACD,sBAAsB,EAAE,CAAC,MAAkC,EAAE,KAAwB,EAAE,EAAE;QACvF,MAAsB,CAAC,cAAc,GAAG,CAAC,CAAC;QAC1C,MAAsB,CAAC,iBAAiB,GAAG,CAAC,CAAC;IAC/C,CAAC;CACD,CAAC","sourcesContent":["import { 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 { OnOtherSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { RebornEffectInput } from '../../../simulation/reborn';\r\nimport { BeforeRebornSelfEffectCard, DefaultChargesCard, OnOtherSpawnedCard } from '../../card.interface';\r\n\r\nexport const TimewarpedEmbalmer: OnOtherSpawnedCard & DefaultChargesCard & BeforeRebornSelfEffectCard = {\r\n\tcardIds: [CardIds.TimewarpedEmbalmer_BG34_Giant_332, CardIds.TimewarpedEmbalmer_BG34_Giant_332_G],\r\n\t// It only resets at the start of the shop phase, so we need to rely on the value from the board state\r\n\tdefaultCharges: (entity: BoardEntity) =>\r\n\t\t// Some charges can be used during the shop phase\r\n\t\tentity.scriptDataNum1,\r\n\tonOtherSpawned: (minion: BoardEntity | BoardTrinket, input: OnOtherSpawnInput) => {\r\n\t\tif ((minion as BoardEntity).abiityChargesLeft > 0 && !input.spawned.reborn) {\r\n\t\t\t(minion as BoardEntity).abiityChargesLeft--;\r\n\t\t\tconst target = input.spawned;\r\n\t\t\tupdateReborn(target, true, input.board, input.hero, input.otherHero, input.gameState);\r\n\t\t}\r\n\t},\r\n\tbeforeRebornSelfEffect: (minion: BoardEntity | BoardTrinket, input: RebornEffectInput) => {\r\n\t\t(minion as BoardEntity).scriptDataNum1 = 2;\r\n\t\t(minion as BoardEntity).abiityChargesLeft = 2;\r\n\t},\r\n};\r\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimewarpedPagle = void 0;
|
|
4
|
+
const cards_in_hand_1 = require("../../../simulation/cards-in-hand");
|
|
5
|
+
exports.TimewarpedPagle = {
|
|
6
|
+
cardIds: ["BG34_Giant_208", "BG34_Giant_208_G"],
|
|
7
|
+
onMinionKilled: (_entity, input) => {
|
|
8
|
+
if (input.killer !== _entity || !input.killerIsAttacking) {
|
|
9
|
+
return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
|
|
10
|
+
}
|
|
11
|
+
(0, cards_in_hand_1.addCardsInHand)(input.attackingHero, input.attackingBoard, ["TB_BaconShop_Triples_01"], input.gameState);
|
|
12
|
+
return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=timewarped-pagle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timewarped-pagle.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-pagle.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAGtD,QAAA,eAAe,GAAuB;IAClD,OAAO,EAAE,sCAAkF;IAC3F,cAAc,EAAE,CAAC,OAAoB,EAAE,KAA0B,EAAE,EAAE;QACpE,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;YACzD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QACD,IAAA,8BAAc,EAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,EAAE,2BAAsB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACnG,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnMinionKilledInput } from '../../../simulation/attack';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { OnMinionKilledCard } from '../../card.interface';\r\n\r\nexport const TimewarpedPagle: OnMinionKilledCard = {\r\n\tcardIds: [CardIds.TimewarpedPagle_BG34_Giant_208, CardIds.TimewarpedPagle_BG34_Giant_208_G],\r\n\tonMinionKilled: (_entity: BoardEntity, input: OnMinionKilledInput) => {\r\n\t\tif (input.killer !== _entity || !input.killerIsAttacking) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\t\taddCardsInHand(input.attackingHero, input.attackingBoard, [CardIds.TripleReward], input.gameState);\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
|
|
@@ -10,7 +10,7 @@ exports.Vinespeaker = {
|
|
|
10
10
|
return;
|
|
11
11
|
}
|
|
12
12
|
const mult = minion.cardId === "BG35_437_G" ? 2 : 1;
|
|
13
|
-
input.hero.globalInfo.BloodGemAttackBonus +=
|
|
13
|
+
input.hero.globalInfo.BloodGemAttackBonus += 2 * mult;
|
|
14
14
|
const portraits = input.hero.trinkets.filter((t) => t.cardId === "BG35_MagicItem_433");
|
|
15
15
|
if (portraits.length > 0) {
|
|
16
16
|
input.hero.globalInfo.BloodGemHealthBonus += 1 * mult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vinespeaker.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/vinespeaker.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;
|
|
1
|
+
{"version":3,"file":"vinespeaker.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/vinespeaker.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;AAKvD,0CAAmD;AAGtC,QAAA,WAAW,GAAmC;IAC1D,OAAO,EAAE,0BAA8D;IACvE,0BAA0B,EAAE,CAAC,MAAkC,EAAE,KAAsC,EAAE,EAAE;QAC1G,IAAI,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,UAAU,EAAE,wBAAO,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE;YACxF,OAAO;SACP;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QACtD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC3C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,yBAAmD,CAClE,CAAC;QACF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;YACzB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;SACtD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterFriendlyMinionDeathInput } from '../../../simulation/attack';\r\nimport { hasEntityMechanic } from '../../../utils';\r\nimport { OnAfterFriendlyMinionDeathCard } from '../../card.interface';\r\n\r\nexport const Vinespeaker: OnAfterFriendlyMinionDeathCard = {\r\n\tcardIds: [CardIds.Vinespeaker_BG35_437, CardIds.Vinespeaker_BG35_437_G],\r\n\tonAfterFriendlyMinionDeath: (minion: BoardEntity | BoardTrinket, input: OnAfterFriendlyMinionDeathInput) => {\r\n\t\tif (!hasEntityMechanic(input.deadEntity, GameTag.DEATHRATTLE, input.gameState.allCards)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst mult = minion.cardId === CardIds.Vinespeaker_BG35_437_G ? 2 : 1;\r\n\t\tinput.hero.globalInfo.BloodGemAttackBonus += 2 * mult;\r\n\t\tconst portraits = input.hero.trinkets.filter(\r\n\t\t\t(t) => t.cardId === CardIds.VinespeakerPortrait_BG35_MagicItem_433,\r\n\t\t);\r\n\t\tif (portraits.length > 0) {\r\n\t\t\tinput.hero.globalInfo.BloodGemHealthBonus += 1 * mult;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -3,13 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ArchaicScroll = void 0;
|
|
4
4
|
const reference_data_1 = require("@firestone-hs/reference-data");
|
|
5
5
|
const cards_in_hand_1 = require("../../../simulation/cards-in-hand");
|
|
6
|
+
const spellsToCast = 7;
|
|
6
7
|
exports.ArchaicScroll = {
|
|
7
8
|
cardIds: ["BG32_MagicItem_930"],
|
|
8
9
|
afterTavernSpellCast: (trinket, input) => {
|
|
9
10
|
var _a, _b;
|
|
10
|
-
trinket.scriptDataNum1 = ((_a = trinket.scriptDataNum1) !== null && _a !== void 0 ? _a :
|
|
11
|
+
trinket.scriptDataNum1 = ((_a = trinket.scriptDataNum1) !== null && _a !== void 0 ? _a : spellsToCast) - 1;
|
|
11
12
|
if (trinket.scriptDataNum1 <= 0) {
|
|
12
|
-
trinket.scriptDataNum1 =
|
|
13
|
+
trinket.scriptDataNum1 = spellsToCast;
|
|
13
14
|
const tier = (_b = input.hero.tavernTier) !== null && _b !== void 0 ? _b : 6;
|
|
14
15
|
const cardId = input.gameState.cardsData.getRandomMinionForTribe(reference_data_1.Race.NAGA, tier, []);
|
|
15
16
|
if (cardId) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archaic-scroll.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/archaic-scroll.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;
|
|
1
|
+
{"version":3,"file":"archaic-scroll.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/archaic-scroll.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qEAAmE;AAGnE,MAAM,YAAY,GAAG,CAAC,CAAC;AAEV,QAAA,aAAa,GAA6B;IACtD,OAAO,EAAE,sBAA0C;IACnD,oBAAoB,EAAE,CAAC,OAAmC,EAAE,KAAqB,EAAE,EAAE;;QACpF,OAAO,CAAC,cAAc,GAAG,CAAC,MAAA,OAAO,CAAC,cAAc,mCAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QACtE,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,EAAE;YAChC,OAAO,CAAC,cAAc,GAAG,YAAY,CAAC;YACtC,MAAM,IAAI,GAAG,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,mCAAI,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,uBAAuB,CAAC,qBAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YACtF,IAAI,MAAM,EAAE;gBACX,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;aACnE;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 { CardIds } from '../../../services/card-ids';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { AfterTavernSpellCastCard, CastSpellInput } from '../../card.interface';\r\n\r\nconst spellsToCast = 7;\r\n\r\nexport const ArchaicScroll: AfterTavernSpellCastCard = {\r\n\tcardIds: [CardIds.ArchaicScroll_BG32_MagicItem_930],\r\n\tafterTavernSpellCast: (trinket: BoardTrinket | BoardEntity, input: CastSpellInput) => {\r\n\t\ttrinket.scriptDataNum1 = (trinket.scriptDataNum1 ?? spellsToCast) - 1;\r\n\t\tif (trinket.scriptDataNum1 <= 0) {\r\n\t\t\ttrinket.scriptDataNum1 = spellsToCast;\r\n\t\t\tconst tier = input.hero.tavernTier ?? 6;\r\n\t\t\tconst cardId = input.gameState.cardsData.getRandomMinionForTribe(Race.NAGA, tier, []);\r\n\t\t\tif (cardId) {\r\n\t\t\t\taddCardsInHand(input.hero, input.board, [cardId], input.gameState);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -5,7 +5,7 @@ const taunt_1 = require("../../../keywords/taunt");
|
|
|
5
5
|
const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
|
|
6
6
|
exports.BeetleBand = {
|
|
7
7
|
cardIds: ["BG32_MagicItem_860", "BG32_MagicItem_860t"],
|
|
8
|
-
baseAvengeValue: (cardId) => (cardId === "BG32_MagicItem_860" ? 5 :
|
|
8
|
+
baseAvengeValue: (cardId) => (cardId === "BG32_MagicItem_860" ? 5 : 7),
|
|
9
9
|
avenge: (trinket, input) => {
|
|
10
10
|
const number = trinket.cardId === "BG32_MagicItem_860" ? 1 : 2;
|
|
11
11
|
const spawns = (0, deathrattle_spawns_1.spawnEntities)("BG28_603t", number, input.board, input.hero, input.otherBoard, input.otherHero, input.gameState, input.hero.friendly, false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beetle-band.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/beetle-band.ts"],"names":[],"mappings":";;;AAEA,mDAAsD;
|
|
1
|
+
{"version":3,"file":"beetle-band.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/beetle-band.ts"],"names":[],"mappings":";;;AAEA,mDAAsD;AAGtD,+EAAuE;AAG1D,QAAA,UAAU,GAAe;IACrC,OAAO,EAAE,6CAA+F;IACxG,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,MAAM,yBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,EAAE,CAAC,OAAmC,EAAE,KAAkB,EAA0B,EAAE;QAC3F,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,yBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,IAAA,kCAAa,eAE3B,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,IAAI,CAAC,QAAQ,EACnB,KAAK,CACL,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,IAAA,mBAAW,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACpF,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAaH,OAAO,MAAM,CAAC;IACf,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { updateTaunt } from '../../../keywords/taunt';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const BeetleBand: AvengeCard = {\r\n\tcardIds: [CardIds.BeetleBand_BG32_MagicItem_860, CardIds.BeetleBand_BeetleBandToken_BG32_MagicItem_860t],\r\n\tbaseAvengeValue: (cardId: string) => (cardId === CardIds.BeetleBand_BG32_MagicItem_860 ? 5 : 7),\r\n\tavenge: (trinket: BoardEntity | BoardTrinket, input: AvengeInput): readonly BoardEntity[] => {\r\n\t\tconst number = trinket.cardId === CardIds.BeetleBand_BG32_MagicItem_860 ? 1 : 2;\r\n\t\tconst spawns = spawnEntities(\r\n\t\t\tCardIds.BoonOfBeetles_BeetleToken_BG28_603t,\r\n\t\t\tnumber,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.otherBoard,\r\n\t\t\tinput.otherHero,\r\n\t\t\tinput.gameState,\r\n\t\t\tinput.hero.friendly,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t\tspawns.forEach((spawn) => {\r\n\t\t\tupdateTaunt(spawn, true, input.board, input.hero, input.otherHero, input.gameState);\r\n\t\t\tspawn.spawnIndexFromRight = 0;\r\n\t\t});\r\n\r\n\t\t// Because they spawn to the right, we handle them here instead of higher up\r\n\t\t// performEntitySpawns(\r\n\t\t// \tspawns,\r\n\t\t// \tinput.board,\r\n\t\t// \tinput.hero,\r\n\t\t// \ttrinket,\r\n\t\t// \t0,\r\n\t\t// \tinput.otherBoard,\r\n\t\t// \tinput.otherHero,\r\n\t\t// \tinput.gameState,\r\n\t\t// );\r\n\t\treturn spawns;\r\n\t},\r\n};\r\n"]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.BubbleCrown = void 0;
|
|
4
4
|
const reference_data_1 = require("@firestone-hs/reference-data");
|
|
5
|
+
const spellsToCast = 12;
|
|
5
6
|
exports.BubbleCrown = {
|
|
6
7
|
cardIds: ["BG35_MagicItem_920"],
|
|
7
8
|
onBeforeTavernSpellCast: (trinket, input) => {
|
|
@@ -11,7 +12,7 @@ exports.BubbleCrown = {
|
|
|
11
12
|
}
|
|
12
13
|
trinket.scriptDataNum1 = ((_b = trinket.scriptDataNum1) !== null && _b !== void 0 ? _b : 0) - 1;
|
|
13
14
|
if (trinket.scriptDataNum1 <= 0) {
|
|
14
|
-
trinket.scriptDataNum1 =
|
|
15
|
+
trinket.scriptDataNum1 = spellsToCast;
|
|
15
16
|
input.hero.globalInfo.TavernSpellAttackBuff += 4;
|
|
16
17
|
input.hero.globalInfo.TavernSpellHealthBuff += 4;
|
|
17
18
|
trinket.tags[reference_data_1.GameTag.TRIGGER_VISUAL] = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bubble-crown.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/bubble-crown.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;
|
|
1
|
+
{"version":3,"file":"bubble-crown.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/bubble-crown.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;AAMvD,MAAM,YAAY,GAAG,EAAE,CAAC;AAEX,QAAA,WAAW,GAAgC;IACvD,OAAO,EAAE,sBAAwC;IAGjD,uBAAuB,EAAE,CAAC,OAAmC,EAAE,KAAqB,EAAE,EAAE;;QAEvF,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAG,wBAAO,CAAC,cAAc,CAAC,MAAK,CAAC,EAAE;YACjD,OAAO;SACP;QAgBD,OAAO,CAAC,cAAc,GAAG,CAAC,MAAA,OAAO,CAAC,cAAc,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,EAAE;YAChC,OAAO,CAAC,cAAc,GAAG,YAAY,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,IAAI,CAAC,CAAC;YACjD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,IAAI,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,wBAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;SACzC;IACF,CAAC;CACD,CAAC","sourcesContent":["import { GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { CastSpellInput, OnBeforeTavernSpellCastCard } from '../../card.interface';\r\n\r\nconst spellsToCast = 12;\r\n\r\nexport const BubbleCrown: OnBeforeTavernSpellCastCard = {\r\n\tcardIds: [CardIds.BubbleCrown_BG35_MagicItem_920],\r\n\t// This seems to trigger before the first spell is cast\r\n\t// https://replays.firestoneapp.com/?reviewId=2503f562-e0e1-4564-8218-d36cbf09cbb0&turn=17&action=2\r\n\tonBeforeTavernSpellCast: (trinket: BoardTrinket | BoardEntity, input: CastSpellInput) => {\r\n\t\t// It has already triggered once\r\n\t\tif (trinket.tags?.[GameTag.TRIGGER_VISUAL] === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// When we get the board state from the opponent, sometimes we have the trinket at 0, and this seems to mean that\r\n\t\t// it will proc on the next spell (eg https://replays.firestoneapp.com/?reviewId=0cff125a-7419-40c6-8c50-edfba59d1559&turn=17&action=4)\r\n\t\t/*\r\n\t\t\tD 20:39:27.1063034 PowerTaskList.DebugPrintPower() - SHOW_ENTITY - Updating Entity=[entityName=泡泡王冠 id=6141 zone=SETASIDE zonePos=0 cardId=BG35_MagicItem_920 player=4] CardID=BG35_MagicItem_920\r\n\t\t\tD 20:39:27.1063034 PowerTaskList.DebugPrintPower() - tag=TAG_SCRIPT_DATA_NUM_1 value=0\r\n\t\t\t...\r\n\t\t\tD 20:39:27.1643122 GameState.DebugPrintPower() - BLOCK_START BlockType=TRIGGER Entity=[entityName=赶潮纳迦 id=6449 zone=PLAY zonePos=5 cardId=BG34_920 player=12] EffectCardId=System.Collections.Generic.List`1[System.String] EffectIndex=0 Target=0 SubOption=-1 TriggerKeyword=DEATHRATTLE\r\n\t\t\t...\r\n\t\t\tD 20:39:27.1643122 GameState.DebugPrintPower() - BLOCK_START BlockType=TRIGGER Entity=[entityName=泡泡王冠 id=6141 zone=PLAY zonePos=0 cardId=BG35_MagicItem_920 player=12] EffectCardId=System.Collections.Generic.List`1[System.String] EffectIndex=0 Target=0 SubOption=-1 TriggerKeyword=TRIGGER_VISUAL\r\n\t\t\t...\r\n\t\t\tD 20:39:27.1643122 GameState.DebugPrintPower() - TAG_CHANGE Entity=wellwelc tag=TAVERN_SPELL_ATTACK_INCREASE value=5 \r\n\t\t\tD 20:39:27.1643122 GameState.DebugPrintPower() - TAG_CHANGE Entity=wellwelc tag=TAVERN_SPELL_HEALTH_INCREASE value=5 \r\n\t\t\t...\r\n\t\t*/\r\n\t\t// I'm not yet sure if this only happens under specific conditions\r\n\t\ttrinket.scriptDataNum1 = (trinket.scriptDataNum1 ?? 0) - 1;\r\n\t\tif (trinket.scriptDataNum1 <= 0) {\r\n\t\t\ttrinket.scriptDataNum1 = spellsToCast;\r\n\t\t\tinput.hero.globalInfo.TavernSpellAttackBuff += 4;\r\n\t\t\tinput.hero.globalInfo.TavernSpellHealthBuff += 4;\r\n\t\t\ttrinket.tags[GameTag.TRIGGER_VISUAL] = 0;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deathtouch-apple.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/deathtouch-apple.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;
|
|
1
|
+
{"version":3,"file":"deathtouch-apple.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/deathtouch-apple.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,qDAAwD;AAGxD,0CAAiD;AAGpC,QAAA,eAAe,GAA+C;IAC1E,OAAO,EAAE,sBAA4C;IACrD,oBAAoB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IAC3C,WAAW,EAAE,CAAC,OAAmC,EAAE,KAAwB,EAAE,EAAE;QAC9E,IAAI,OAAO,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE;YAC7D,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC;YAClC,IACC,IAAA,uBAAe,EACd,MAAM,EACN,KAAK,CAAC,yBAAyB,EAC/B,qBAAI,CAAC,MAAM,EACX,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,EACA;gBACD,IAAA,qBAAY,EACX,MAAM,EACN,IAAI,EACJ,KAAK,CAAC,qBAAqB,EAC3B,KAAK,CAAC,yBAAyB,EAC/B,KAAK,CAAC,iBAAiB,EACvB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,OAAO,EACP,MAAM,EACN,KAAK,CAAC,qBAAqB,EAC3B,KAAK,CAAC,yBAAyB,EAC/B,KAAK,CAAC,iBAAiB,CACvB,CAAC;gBACF,OAAO,CAAC,cAAc,EAAE,CAAC;aACzB;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { updateReborn } from '../../../keywords/reborn';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { RebornEffectInput } from '../../../simulation/reborn';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { AfterRebornCard, DefaultScriptDataNumCard } from '../../card.interface';\r\n\r\nexport const DeathtouchApple: AfterRebornCard & DefaultScriptDataNumCard = {\r\n\tcardIds: [CardIds.DeathtouchApple_BG35_MagicItem_731],\r\n\tdefaultScriptDataNum: (cardId: string) => 3,\r\n\tafterReborn: (trinket: BoardTrinket | BoardEntity, input: RebornEffectInput) => {\r\n\t\tif (trinket.scriptDataNum1 > 0 && !input.rebornEntity.reborn) {\r\n\t\t\tconst target = input.rebornEntity;\r\n\t\t\tif (\r\n\t\t\t\thasCorrectTribe(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tRace.UNDEAD,\r\n\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t)\r\n\t\t\t) {\r\n\t\t\t\tupdateReborn(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tinput.boardWithKilledMinion,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tinput.opponentBoardHero,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\ttrinket,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tinput.boardWithKilledMinion,\r\n\t\t\t\t\tinput.boardWithKilledMinionHero,\r\n\t\t\t\t\tinput.opponentBoardHero,\r\n\t\t\t\t);\r\n\t\t\t\ttrinket.scriptDataNum1--;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.QuilligraphySetToken = exports.QuilligraphySet = void 0;
|
|
4
4
|
exports.QuilligraphySet = {
|
|
5
5
|
cardIds: ["BG30_MagicItem_410"],
|
|
6
|
-
baseAvengeValue: () =>
|
|
6
|
+
baseAvengeValue: () => 3,
|
|
7
7
|
avenge: (_entity, input) => {
|
|
8
8
|
input.hero.globalInfo.BloodGemHealthBonus += 1;
|
|
9
9
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quilligraphy-set.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/quilligraphy-set.ts"],"names":[],"mappings":";;;AAMa,QAAA,eAAe,GAAe;IAC1C,OAAO,EAAE,sBAA4C;IACrD,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,OAAmC,EAAE,KAAkB,EAAE,EAAE;QACnE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,CAAC;IAChD,CAAC;CACD,CAAC;AAEW,QAAA,oBAAoB,GAAe;IAC/C,OAAO,EAAE,wBAAmE;IAC5E,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,OAAmC,EAAE,KAAkB,EAAE,EAAE;QACnE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,CAAC;IAChD,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 { AvengeInput } from '../../../simulation/avenge';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const QuilligraphySet: AvengeCard = {\r\n\tcardIds: [CardIds.QuilligraphySet_BG30_MagicItem_410],\r\n\tbaseAvengeValue: () =>
|
|
1
|
+
{"version":3,"file":"quilligraphy-set.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/quilligraphy-set.ts"],"names":[],"mappings":";;;AAMa,QAAA,eAAe,GAAe;IAC1C,OAAO,EAAE,sBAA4C;IACrD,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,OAAmC,EAAE,KAAkB,EAAE,EAAE;QACnE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,CAAC;IAChD,CAAC;CACD,CAAC;AAEW,QAAA,oBAAoB,GAAe;IAC/C,OAAO,EAAE,wBAAmE;IAC5E,eAAe,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,OAAmC,EAAE,KAAkB,EAAE,EAAE;QACnE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,CAAC;IAChD,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 { AvengeInput } from '../../../simulation/avenge';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const QuilligraphySet: AvengeCard = {\r\n\tcardIds: [CardIds.QuilligraphySet_BG30_MagicItem_410],\r\n\tbaseAvengeValue: () => 3,\r\n\tavenge: (_entity: BoardEntity | BoardTrinket, input: AvengeInput) => {\r\n\t\tinput.hero.globalInfo.BloodGemHealthBonus += 1;\r\n\t},\r\n};\r\n\r\nexport const QuilligraphySetToken: AvengeCard = {\r\n\tcardIds: [CardIds.QuilligraphySet_QuilligraphySetToken_BG30_MagicItem_410t2],\r\n\tbaseAvengeValue: () => 4,\r\n\tavenge: (_entity: BoardEntity | BoardTrinket, input: AvengeInput) => {\r\n\t\tinput.hero.globalInfo.BloodGemAttackBonus += 1;\r\n\t\tinput.hero.globalInfo.BloodGemHealthBonus += 1;\r\n\t},\r\n};\r\n"]}
|
package/dist/input-clone.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BgsBattleInfo } from './bgs-battle-info';
|
|
2
2
|
import { BgsBoardInfo } from './bgs-board-info';
|
|
3
|
+
export declare const buildTemplateCloner: (template: BgsBattleInfo) => (() => BgsBattleInfo);
|
|
3
4
|
export declare const cloneInput3: (input: BgsBattleInfo) => BgsBattleInfo;
|
|
4
5
|
export declare const cloneBoard: (board: BgsBoardInfo) => BgsBoardInfo;
|
package/dist/input-clone.js
CHANGED
|
@@ -1,6 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.cloneBoard = exports.cloneInput3 = void 0;
|
|
3
|
+
exports.cloneBoard = exports.cloneInput3 = exports.buildTemplateCloner = void 0;
|
|
4
|
+
const buildTemplateCloner = (template) => {
|
|
5
|
+
const str = JSON.stringify(template);
|
|
6
|
+
if (!str.includes('"__proto__"')) {
|
|
7
|
+
try {
|
|
8
|
+
return new Function(`return ${str};`);
|
|
9
|
+
}
|
|
10
|
+
catch (e) {
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
return () => JSON.parse(str);
|
|
14
|
+
};
|
|
15
|
+
exports.buildTemplateCloner = buildTemplateCloner;
|
|
4
16
|
const cloneInput3 = (input) => {
|
|
5
17
|
const result = {
|
|
6
18
|
gameState: {
|
package/dist/input-clone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input-clone.js","sourceRoot":"","sources":["../src/input-clone.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"input-clone.js","sourceRoot":"","sources":["../src/input-clone.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsBattleInfo } from './bgs-battle-info';\r\nimport { BgsBoardInfo } from './bgs-board-info';\r\nimport { BoardEntity } from './board-entity';\r\n\r\n// const cloneInput = (input: BgsBattleInfo): BgsBattleInfo => {\r\n// \treturn structuredClone(input);\r\n// };\r\n// const cloneInput2 = (input: string): BgsBattleInfo => {\r\n// \treturn JSON.parse(input);\r\n// };\r\n\r\n/**\r\n * Builds a function that returns a fresh deep copy of the template on every call.\r\n *\r\n * The template is serialized once, and compiled into a function body that rebuilds it as a\r\n * plain object literal. V8 parses that literal a single time, so each subsequent call only\r\n * allocates the objects, which is much faster than re-parsing JSON on every simulation\r\n * iteration (measured ~0.02ms/clone vs ~0.12ms for JSON.parse on a 7v7 board).\r\n */\r\nexport const buildTemplateCloner = (template: BgsBattleInfo): (() => BgsBattleInfo) => {\r\n\tconst str = JSON.stringify(template);\r\n\t// In an object literal (unlike JSON.parse), a \"__proto__\" key would set the prototype\r\n\t// instead of creating an own property. Our input shape never contains that key, but if\r\n\t// it ever does, fall back to the safe path\r\n\tif (!str.includes('\"__proto__\"')) {\r\n\t\ttry {\r\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-implied-eval\r\n\t\t\treturn new Function(`return ${str};`) as () => BgsBattleInfo;\r\n\t\t} catch (e) {\r\n\t\t\t// Code generation from strings can be disallowed (e.g. by a CSP when this runs\r\n\t\t\t// inside the app); JSON.parse is the fallback\r\n\t\t}\r\n\t}\r\n\treturn () => JSON.parse(str);\r\n};\r\n\r\nexport const cloneInput3 = (input: BgsBattleInfo): BgsBattleInfo => {\r\n\tconst result: BgsBattleInfo = {\r\n\t\tgameState: {\r\n\t\t\tcurrentTurn: input.gameState.currentTurn,\r\n\t\t\tanomalies: input.gameState.anomalies,\r\n\t\t\tvalidTribes: input.gameState.validTribes,\r\n\t\t},\r\n\t\theroHasDied: input.heroHasDied,\r\n\t\tplayerBoard: cloneBoard(input.playerBoard),\r\n\t\topponentBoard: cloneBoard(input.opponentBoard),\r\n\t\tplayerTeammateBoard: cloneBoard(input.playerTeammateBoard),\r\n\t\topponentTeammateBoard: cloneBoard(input.opponentTeammateBoard),\r\n\t\toptions: null,\r\n\t};\r\n\treturn result;\r\n};\r\n\r\nexport const cloneBoard = (board: BgsBoardInfo): BgsBoardInfo => {\r\n\tif (!board) {\r\n\t\treturn null;\r\n\t}\r\n\tconst result: BgsBoardInfo = {\r\n\t\tplayer: {\r\n\t\t\t...board.player,\r\n\t\t\tquestEntities: board.player.questEntities?.map((quest) => ({ ...quest })),\r\n\t\t\tquestRewardEntities: board.player.questRewardEntities?.map((reward) => ({ ...reward })),\r\n\t\t\tquestRewards: board.player.questRewards?.map((reward) => reward),\r\n\t\t\thand: board.player.hand?.map((entity) => cloneEntity(entity)),\r\n\t\t\tsecrets: board.player.secrets?.map((secret) => ({ ...secret })).sort((a, b) => a.entityId - b.entityId),\r\n\t\t\ttrinkets: board.player.trinkets?.map((trinket) => ({ ...trinket, tags: { ...trinket.tags } })),\r\n\t\t\tglobalInfo: { ...board.player.globalInfo },\r\n\t\t\theroPowers: board.player.heroPowers?.map((heroPower) => ({ ...heroPower })),\r\n\t\t},\r\n\t\tboard: board.board.map((entity) => cloneEntity(entity)),\r\n\t};\r\n\treturn result;\r\n};\r\n\r\nconst cloneEntity = (entity: BoardEntity): BoardEntity => {\r\n\tconst result: BoardEntity = {\r\n\t\t...entity,\r\n\t\tenchantments: entity.enchantments.map((enchant) => ({ ...enchant })),\r\n\t\tpendingAttackBuffs: [],\r\n\t\tadditionalCards: entity.additionalCards?.map((card) => card),\r\n\t\trememberedDeathrattles: [],\r\n\t};\r\n\treturn result;\r\n};\r\n"]}
|
package/dist/mechanics/rally.js
CHANGED
|
@@ -13,18 +13,20 @@ const triggerRally = (attackingBoard, attackingBoardHero, attacker, defendingBoa
|
|
|
13
13
|
let damageDoneByAttacker = 0;
|
|
14
14
|
let damageDoneByDefender = 0;
|
|
15
15
|
const isAttackerRallying = (0, utils_1.hasEntityMechanic)(attacker, reference_data_1.GameTag.BACON_RALLY, gameState.allCards);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
?
|
|
24
|
-
:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
16
|
+
let rallyLoops = 1;
|
|
17
|
+
if (isAttackerRallying) {
|
|
18
|
+
const cardIds = [
|
|
19
|
+
...attackingBoard.map((e) => e.cardId),
|
|
20
|
+
...((_b = (_a = attackingBoardHero.secrets) === null || _a === void 0 ? void 0 : _a.map((e) => e.cardId)) !== null && _b !== void 0 ? _b : []),
|
|
21
|
+
];
|
|
22
|
+
const triggerMult = cardIds.some((cardId) => TRIPLE_RALLY_CARD_IDS.includes(cardId))
|
|
23
|
+
? 3
|
|
24
|
+
: cardIds.some((cardId) => DOUBLE_RALLY_CARD_IDS.includes(cardId))
|
|
25
|
+
? 2
|
|
26
|
+
: 1;
|
|
27
|
+
const numberOfRallyingCries = (_d = (_c = attackingBoardHero.questRewardEntities) === null || _c === void 0 ? void 0 : _c.filter((r) => r.cardId === "BG33_Reward_021").length) !== null && _d !== void 0 ? _d : 0;
|
|
28
|
+
rallyLoops = triggerMult + numberOfRallyingCries;
|
|
29
|
+
}
|
|
28
30
|
for (let i = 0; i < rallyLoops; i++) {
|
|
29
31
|
const onAttackImpl = _card_mappings_1.cardMappings[attacker.cardId];
|
|
30
32
|
if ((0, card_interface_1.hasRally)(onAttackImpl)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rally.js","sourceRoot":"","sources":["../../src/mechanics/rally.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;AAGvD,4DAAmD;AACnD,iEAA4D;AAE5D,6DAA6D;AAE7D,oCAA6C;AAE7C,MAAM,qBAAqB,GAAa,kBAAwC,CAAC;AACjF,MAAM,qBAAqB,GAAa,oBAA0C,CAAC;AAE5E,MAAM,YAAY,GAAG,CAC3B,cAA6B,EAC7B,kBAAmC,EACnC,QAAqB,EACrB,cAA6B,EAC7B,kBAAmC,EACnC,eAA4B,EAC5B,SAAwB,EACmC,EAAE;;IAC7D,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,MAAM,kBAAkB,GAAG,IAAA,yBAAiB,EAAC,QAAQ,EAAE,wBAAO,CAAC,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"rally.js","sourceRoot":"","sources":["../../src/mechanics/rally.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;AAGvD,4DAAmD;AACnD,iEAA4D;AAE5D,6DAA6D;AAE7D,oCAA6C;AAE7C,MAAM,qBAAqB,GAAa,kBAAwC,CAAC;AACjF,MAAM,qBAAqB,GAAa,oBAA0C,CAAC;AAE5E,MAAM,YAAY,GAAG,CAC3B,cAA6B,EAC7B,kBAAmC,EACnC,QAAqB,EACrB,cAA6B,EAC7B,kBAAmC,EACnC,eAA4B,EAC5B,SAAwB,EACmC,EAAE;;IAC7D,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,MAAM,kBAAkB,GAAG,IAAA,yBAAiB,EAAC,QAAQ,EAAE,wBAAO,CAAC,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;IAGhG,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,kBAAkB,EAAE;QACvB,MAAM,OAAO,GAAG;YACf,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YACtC,GAAG,CAAC,MAAA,MAAA,kBAAkB,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,mCAAI,EAAE,CAAC;SAC3D,CAAC;QACF,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAClE,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,CAAC,CAAC;QACL,MAAM,qBAAqB,GAC1B,MAAA,MAAA,kBAAkB,CAAC,mBAAmB,0CAAE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,sBAAwC,EACpG,MAAM,mCAAI,CAAC,CAAC;QACf,UAAU,GAAG,WAAW,GAAG,qBAAqB,CAAC;KACjD;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,YAAY,GAAG,6BAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnD,IAAI,IAAA,yBAAQ,EAAC,YAAY,CAAC,EAAE;YAC3B,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAC7E,QAAQ,EAAE,QAAQ;gBAClB,aAAa,EAAE,kBAAkB;gBACjC,cAAc,EAAE,cAAc;gBAC9B,eAAe,EAAE,eAAe;gBAChC,aAAa,EAAE,kBAAkB;gBACjC,cAAc,EAAE,cAAc;gBAC9B,SAAS;gBACT,gBAAgB,EAAE,kBAAkB,CAAC,QAAQ;aAC7C,CAAC,CAAC;YACH,oBAAoB,IAAI,iBAAiB,CAAC;YAC1C,oBAAoB,IAAI,iBAAiB,CAAC;SAC1C;QACD,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC;QAC3C,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;YACvC,MAAM,YAAY,GAAG,6BAAY,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,IAAA,yBAAQ,EAAC,YAAY,CAAC,EAAE;gBAC3B,IAAI,mBAAmB,GAAgB;oBACtC,GAAG,WAAW;oBACd,QAAQ,EAAE,QAAQ,CAAC,QAAQ;oBAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,SAAS,EAAE,QAAQ,CAAC,SAAS;oBAC7B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;iBAC7C,CAAC;gBACF,mBAAmB,GAAG,IAAA,8BAAe,EAAC,mBAAmB,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC/E,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,mBAAmB,EAAE;oBACxF,QAAQ,EAAE,QAAQ;oBAClB,aAAa,EAAE,kBAAkB;oBACjC,cAAc,EAAE,cAAc;oBAC9B,eAAe,EAAE,eAAe;oBAChC,aAAa,EAAE,kBAAkB;oBACjC,cAAc,EAAE,cAAc;oBAC9B,SAAS;oBACT,gBAAgB,EAAE,kBAAkB,CAAC,QAAQ;iBAC7C,CAAC,CAAC;gBACH,oBAAoB,IAAI,iBAAiB,CAAC;gBAC1C,oBAAoB,IAAI,iBAAiB,CAAC;aAC1C;SACD;KACD;IACD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,CAAC;AAC7F,CAAC,CAAC;AA7EW,QAAA,YAAY,gBA6EvB","sourcesContent":["import { GameTag } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasRally } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { fixEnchantments } from '../simulation/enchantments';\r\nimport { FullGameState } from '../simulation/internal-game-state';\r\nimport { hasEntityMechanic } from '../utils';\r\n\r\nconst DOUBLE_RALLY_CARD_IDS: string[] = [CardIds.TimewarpedDeios_BG34_Giant_376];\r\nconst TRIPLE_RALLY_CARD_IDS: string[] = [CardIds.TimewarpedDeios_BG34_Giant_376_G];\r\n\r\nexport const triggerRally = (\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tattacker: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tgameState: FullGameState,\r\n): { dmgDoneByAttacker: number; dmgDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\tconst isAttackerRallying = hasEntityMechanic(attacker, GameTag.BACON_RALLY, gameState.allCards);\r\n\r\n\t// Only compute the multiplier when the attacker actually rallies, as this is a hot path\r\n\tlet rallyLoops = 1;\r\n\tif (isAttackerRallying) {\r\n\t\tconst cardIds = [\r\n\t\t\t...attackingBoard.map((e) => e.cardId),\r\n\t\t\t...(attackingBoardHero.secrets?.map((e) => e.cardId) ?? []),\r\n\t\t];\r\n\t\tconst triggerMult = cardIds.some((cardId) => TRIPLE_RALLY_CARD_IDS.includes(cardId))\r\n\t\t\t? 3\r\n\t\t\t: cardIds.some((cardId) => DOUBLE_RALLY_CARD_IDS.includes(cardId))\r\n\t\t\t? 2\r\n\t\t\t: 1;\r\n\t\tconst numberOfRallyingCries =\r\n\t\t\tattackingBoardHero.questRewardEntities?.filter((r) => r.cardId === CardIds.RallyingCry_BG33_Reward_021)\r\n\t\t\t\t.length ?? 0;\r\n\t\trallyLoops = triggerMult + numberOfRallyingCries;\r\n\t}\r\n\r\n\tfor (let i = 0; i < rallyLoops; i++) {\r\n\t\tconst onAttackImpl = cardMappings[attacker.cardId];\r\n\t\tif (hasRally(onAttackImpl)) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(attacker, {\r\n\t\t\t\tattacker: attacker,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tconst enchantments = attacker.enchantments;\r\n\t\tfor (const enchantment of enchantments) {\r\n\t\t\tconst onAttackImpl = cardMappings[enchantment.cardId];\r\n\t\t\tif (hasRally(onAttackImpl)) {\r\n\t\t\t\tlet enchantmentToMinion: BoardEntity = {\r\n\t\t\t\t\t...enchantment,\r\n\t\t\t\t\tentityId: attacker.entityId,\r\n\t\t\t\t\tattack: attacker.attack,\r\n\t\t\t\t\thealth: attacker.health,\r\n\t\t\t\t\tmaxHealth: attacker.maxHealth,\r\n\t\t\t\t\tmaxAttack: attacker.maxAttack,\r\n\t\t\t\t\tabiityChargesLeft: attacker.abiityChargesLeft,\r\n\t\t\t\t};\r\n\t\t\t\tenchantmentToMinion = fixEnchantments(enchantmentToMinion, gameState.allCards);\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(enchantmentToMinion, {\r\n\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t});\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn { dmgDoneByAttacker: damageDoneByAttacker, dmgDoneByDefender: damageDoneByDefender };\r\n};\r\n"]}
|
|
@@ -26,15 +26,14 @@ const getTavernSpellEffectRepeatCount = (input) => {
|
|
|
26
26
|
repeats += proudPrivateerExtra;
|
|
27
27
|
}
|
|
28
28
|
const cathedrals = input.hero.trinkets.filter((t) => {
|
|
29
|
-
var _a
|
|
29
|
+
var _a;
|
|
30
30
|
return t.cardId === "BG30_MagicItem_434" &&
|
|
31
|
-
t.
|
|
32
|
-
((_b = (_a = t.tags) === null || _a === void 0 ? void 0 : _a[reference_data_1.GameTag.TRIGGER_VISUAL]) !== null && _b !== void 0 ? _b : 0) > 0;
|
|
31
|
+
!((_a = t.tags) === null || _a === void 0 ? void 0 : _a[reference_data_1.GameTag.TAG_SCRIPT_DATA_NUM_6]);
|
|
33
32
|
});
|
|
34
33
|
repeats += cathedrals.length;
|
|
35
34
|
for (const cathedral of cathedrals) {
|
|
36
35
|
cathedral.tags = (_b = cathedral.tags) !== null && _b !== void 0 ? _b : {};
|
|
37
|
-
cathedral.tags[reference_data_1.GameTag.
|
|
36
|
+
cathedral.tags[reference_data_1.GameTag.TAG_SCRIPT_DATA_NUM_6] = 1;
|
|
38
37
|
}
|
|
39
38
|
return repeats;
|
|
40
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tavern-spell-repeat.js","sourceRoot":"","sources":["../../src/mechanics/tavern-spell-repeat.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;AAQhD,MAAM,+BAA+B,GAAG,CAAC,KAAqB,EAAU,EAAE;;IAChF,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE;QAChC,OAAO,CAAC,CAAC;KACT;IACD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iBAA0C,CAAC,CAAC;IACrG,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAwC,CAAC,CAAC;IACnG,IACC,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;QACtC,KAAK,CAAC,MAAM;QACZ,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC5D;QACD,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACnC;IACD,MAAM,cAAc,GACnB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAuC,CAAC,CAAC,MAAM;QACjF,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iBAAyC,CAAC,CAAC,MAAM,CAAC;IACzF,OAAO,IAAI,cAAc,CAAC;IAE1B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,0CAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAErE,IAAI,aAAa,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE;QACjD,MAAM,mBAAmB,GACxB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAoC,CAAC,CAAC,MAAM;YAC9E,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iBAAsC,CAAC,CAAC,MAAM,CAAC;QACtF,OAAO,IAAI,mBAAmB,CAAC;KAC/B;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,EAAE;;QACL,OAAA,CAAC,CAAC,MAAM,yBAAgD;
|
|
1
|
+
{"version":3,"file":"tavern-spell-repeat.js","sourceRoot":"","sources":["../../src/mechanics/tavern-spell-repeat.ts"],"names":[],"mappings":";;;AAAA,iEAAuD;AAQhD,MAAM,+BAA+B,GAAG,CAAC,KAAqB,EAAU,EAAE;;IAChF,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE;QAChC,OAAO,CAAC,CAAC;KACT;IACD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iBAA0C,CAAC,CAAC;IACrG,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAwC,CAAC,CAAC;IACnG,IACC,CAAC,gBAAgB,IAAI,gBAAgB,CAAC;QACtC,KAAK,CAAC,MAAM;QACZ,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC5D;QACD,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KACnC;IACD,MAAM,cAAc,GACnB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAuC,CAAC,CAAC,MAAM;QACjF,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iBAAyC,CAAC,CAAC,MAAM,CAAC;IACzF,OAAO,IAAI,cAAc,CAAC;IAE1B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,MAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,SAAS,0CAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;IAErE,IAAI,aAAa,IAAI,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE;QACjD,MAAM,mBAAmB,GACxB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAoC,CAAC,CAAC,MAAM;YAC9E,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iBAAsC,CAAC,CAAC,MAAM,CAAC;QACtF,OAAO,IAAI,mBAAmB,CAAC;KAC/B;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC5C,CAAC,CAAC,EAAE,EAAE;;QACL,OAAA,CAAC,CAAC,MAAM,yBAAgD;YAexD,CAAC,CAAA,MAAA,CAAC,CAAC,IAAI,0CAAG,wBAAO,CAAC,qBAAqB,CAAC,CAAA,CAAA;KAAA,CACzC,CAAC;IACF,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC;IAC7B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;QACnC,SAAS,CAAC,IAAI,GAAG,MAAA,SAAS,CAAC,IAAI,mCAAI,EAAE,CAAC;QACtC,SAAS,CAAC,IAAI,CAAC,wBAAO,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC;KAClD;IAED,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC;AAvDW,QAAA,+BAA+B,mCAuD1C","sourcesContent":["import { GameTag } from '@firestone-hs/reference-data';\r\nimport { CastSpellInput } from '../cards/card.interface';\r\nimport { CardIds } from '../services/card-ids';\r\n\r\n/**\r\n * Balinda Stonehearth: extra spell effect resolutions for spells you cast that target a friendly board minion.\r\n * Maelstrom Emergent: each copy adds +1 extra resolution (golden +2) for tavern spells you cast; stacks additively with Balinda.\r\n */\r\nexport const getTavernSpellEffectRepeatCount = (input: CastSpellInput): number => {\r\n\tif (input.source !== input.hero) {\r\n\t\treturn 1;\r\n\t}\r\n\tlet repeats = 1;\r\n\tconst hasGoldenBalinda = input.board.some((e) => e.cardId === CardIds.BalindaStonehearth_BG35_883_G);\r\n\tconst hasNormalBalinda = input.board.some((e) => e.cardId === CardIds.BalindaStonehearth_BG35_883);\r\n\tif (\r\n\t\t(hasGoldenBalinda || hasNormalBalinda) &&\r\n\t\tinput.target &&\r\n\t\tinput.board.some((e) => e.entityId === input.target.entityId)\r\n\t) {\r\n\t\trepeats = hasGoldenBalinda ? 3 : 2;\r\n\t}\r\n\tconst maelstromExtra =\r\n\t\tinput.board.filter((e) => e.cardId === CardIds.MaelstromEmergent_BG34_922).length +\r\n\t\t2 * input.board.filter((e) => e.cardId === CardIds.MaelstromEmergent_BG34_922_G).length;\r\n\trepeats += maelstromExtra;\r\n\r\n\tconst spellCard = input.gameState.allCards.getCard(input.spellCardId);\r\n\tconst isBountySpell = spellCard?.mechanics?.includes('BACON_BOUNTY');\r\n\t// Proud Privateer only affects bounties *you* (the hero) cast — same as Balinda / onTavernSpellCast.\r\n\tif (isBountySpell && input.source === input.hero) {\r\n\t\tconst proudPrivateerExtra =\r\n\t\t\tinput.board.filter((e) => e.cardId === CardIds.ProudPrivateer_BG33_825).length +\r\n\t\t\t2 * input.board.filter((e) => e.cardId === CardIds.ProudPrivateer_BG33_825_G).length;\r\n\t\trepeats += proudPrivateerExtra;\r\n\t}\r\n\r\n\tconst cathedrals = input.hero.trinkets.filter(\r\n\t\t(t) =>\r\n\t\t\tt.cardId === CardIds.ReplicaCathedral_BG30_MagicItem_434 &&\r\n\t\t\t// 2026-04-25:https://replays.firestoneapp.com/?reviewId=f7d1d5ec-b83d-49f5-9669-b063a3debc79&turn=15&action=1\r\n\t\t\t// It triggered during shop, and doesn't re-trigger during combat\r\n\t\t\t/**\r\n\t\t\t * \t{\r\n\t\t\t\t\t\"cardId\": \"BG30_MagicItem_434\",\r\n\t\t\t\t\t\"entityId\": 306,\r\n\t\t\t\t\t\"scriptDataNum1\": 1,\r\n\t\t\t\t\t\"scriptDataNum2\": 0,\r\n\t\t\t\t\t\"scriptDataNum6\": 1\r\n\t\t\t\t},\r\n\t\t\t */\r\n\t\t\t// 2026-07-22: This is not relevant. I had the case where TRIGGER_VISUAL was 1 but it wouln't re-trigger\r\n\t\t\t// (t.tags?.[GameTag.TRIGGER_VISUAL] ?? 0) > 0,\r\n\t\t\t// Next try is SCRIPT_DATA_NUM_6, assuming 1 meaning it can't trigger\r\n\t\t\t!t.tags?.[GameTag.TAG_SCRIPT_DATA_NUM_6],\r\n\t);\r\n\trepeats += cathedrals.length;\r\n\tfor (const cathedral of cathedrals) {\r\n\t\tcathedral.tags = cathedral.tags ?? {};\r\n\t\tcathedral.tags[GameTag.TAG_SCRIPT_DATA_NUM_6] = 1;\r\n\t}\r\n\r\n\treturn repeats;\r\n};\r\n"]}
|
|
@@ -2,8 +2,8 @@ import { AllCardsService } from '@firestone-hs/reference-data';
|
|
|
2
2
|
import { BgsBattleInfo } from './bgs-battle-info';
|
|
3
3
|
import { CardsData } from './cards/cards-data';
|
|
4
4
|
import { SimulationResult } from './simulation-result';
|
|
5
|
+
export { isValidDeathrattleEnchantment } from './simulation/deathrattle-utils';
|
|
5
6
|
export declare const assignCards: (cards: AllCardsService) => void;
|
|
6
7
|
declare const _default: (event: any) => Promise<any>;
|
|
7
8
|
export default _default;
|
|
8
9
|
export declare const simulateBattle: (battleInput: BgsBattleInfo, cards: AllCardsService, cardsData: CardsData) => Generator<SimulationResult, SimulationResult, void>;
|
|
9
|
-
export declare const isValidDeathrattleEnchantment: (cardId: string) => boolean;
|