@firestone-hs/simulate-bgs-battle 1.1.765 → 1.1.767
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/board-entity.d.ts +1 -0
- package/dist/board-entity.js.map +1 -1
- package/dist/cards/card.interface.d.ts +7 -3
- package/dist/cards/card.interface.js +4 -2
- package/dist/cards/card.interface.js.map +1 -1
- package/dist/cards/impl/_card-mappings.js +6 -0
- package/dist/cards/impl/_card-mappings.js.map +1 -1
- package/dist/cards/impl/bg-spell/boon-of-beetles.js +3 -2
- package/dist/cards/impl/bg-spell/boon-of-beetles.js.map +1 -1
- package/dist/cards/impl/enchantments/booming.d.ts +2 -0
- package/dist/cards/impl/enchantments/booming.js +44 -0
- package/dist/cards/impl/enchantments/booming.js.map +1 -0
- package/dist/cards/impl/enchantments/golemancy.js +1 -1
- package/dist/cards/impl/enchantments/golemancy.js.map +1 -1
- package/dist/cards/impl/enchantments/set-sail.d.ts +2 -0
- package/dist/cards/impl/enchantments/set-sail.js +39 -0
- package/dist/cards/impl/enchantments/set-sail.js.map +1 -0
- package/dist/cards/impl/enchantments/spell-siphon.js +5 -7
- package/dist/cards/impl/enchantments/spell-siphon.js.map +1 -1
- package/dist/cards/impl/hero-power/mechgyver.d.ts +2 -0
- package/dist/cards/impl/hero-power/mechgyver.js +27 -0
- package/dist/cards/impl/hero-power/mechgyver.js.map +1 -0
- package/dist/cards/impl/minion/cthun.js.map +1 -1
- package/dist/cards/impl/minion/diremuck-forager.js +4 -1
- package/dist/cards/impl/minion/diremuck-forager.js.map +1 -1
- package/dist/cards/impl/minion/expert-aviator.js +3 -1
- package/dist/cards/impl/minion/expert-aviator.js.map +1 -1
- package/dist/cards/impl/minion/faceless-converter.d.ts +2 -2
- package/dist/cards/impl/minion/faceless-converter.js +38 -5
- package/dist/cards/impl/minion/faceless-converter.js.map +1 -1
- package/dist/cards/impl/minion/hopebringer.js +10 -6
- package/dist/cards/impl/minion/hopebringer.js.map +1 -1
- package/dist/cards/impl/minion/jailbird-juggernaut.js +7 -14
- package/dist/cards/impl/minion/jailbird-juggernaut.js.map +1 -1
- package/dist/cards/impl/minion/sinrunner-blanchy.d.ts +1 -1
- package/dist/cards/impl/minion/sinrunner-blanchy.js +3 -1
- package/dist/cards/impl/minion/sinrunner-blanchy.js.map +1 -1
- package/dist/cards/impl/minion/wildfire-elemental.js +1 -1
- package/dist/cards/impl/minion/wildfire-elemental.js.map +1 -1
- package/dist/cards/impl/minion/yshaarj.js +6 -4
- package/dist/cards/impl/minion/yshaarj.js.map +1 -1
- package/dist/cards/impl/trinket/artisanal-urn.js +3 -2
- package/dist/cards/impl/trinket/artisanal-urn.js.map +1 -1
- package/dist/cards/impl/trinket/blood-golem-sticker.d.ts +2 -2
- package/dist/cards/impl/trinket/blood-golem-sticker.js +2 -2
- package/dist/cards/impl/trinket/blood-golem-sticker.js.map +1 -1
- package/dist/cards/impl/trinket/miniature-ship.js +21 -1
- package/dist/cards/impl/trinket/miniature-ship.js.map +1 -1
- package/dist/cards/impl/trinket/soul-fermenter.js +4 -1
- package/dist/cards/impl/trinket/soul-fermenter.js.map +1 -1
- package/dist/input-clone.js +8 -2
- package/dist/input-clone.js.map +1 -1
- package/dist/mechanics/tavern-spell-repeat.js +4 -4
- package/dist/mechanics/tavern-spell-repeat.js.map +1 -1
- package/dist/simulation/add-minion-to-board.js +5 -2
- package/dist/simulation/add-minion-to-board.js.map +1 -1
- package/dist/simulation/attack.js +8 -1
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/auras.js +8 -5
- package/dist/simulation/auras.js.map +1 -1
- package/dist/simulation/death-effects.js +21 -4
- package/dist/simulation/death-effects.js.map +1 -1
- package/dist/simulation/deathrattle-effects.js +8 -1
- package/dist/simulation/deathrattle-effects.js.map +1 -1
- package/dist/simulation/deathrattle-orchestration.js +2 -6
- package/dist/simulation/deathrattle-orchestration.js.map +1 -1
- package/dist/simulation/deathrattle-spawns.d.ts +3 -1
- package/dist/simulation/deathrattle-spawns.js +32 -2
- package/dist/simulation/deathrattle-spawns.js.map +1 -1
- package/dist/simulation/deity.d.ts +6 -1
- package/dist/simulation/deity.js +23 -13
- package/dist/simulation/deity.js.map +1 -1
- package/dist/simulation/reborn.d.ts +10 -0
- package/dist/simulation/reborn.js +75 -8
- package/dist/simulation/reborn.js.map +1 -1
- package/dist/simulation/shared-state.d.ts +1 -0
- package/dist/simulation/shared-state.js +1 -0
- package/dist/simulation/shared-state.js.map +1 -1
- package/dist/simulation/start-of-combat/soc-illidan-hero-power.js +5 -2
- package/dist/simulation/start-of-combat/soc-illidan-hero-power.js.map +1 -1
- package/dist/simulation/start-of-combat/soc-minion.js +1 -1
- package/dist/simulation/start-of-combat/soc-minion.js.map +1 -1
- package/dist/simulation/start-of-combat/soc-trinket.js +35 -17
- package/dist/simulation/start-of-combat/soc-trinket.js.map +1 -1
- package/dist/simulation/start-of-combat/start-of-combat.js.map +1 -1
- package/dist/simulation/stats.js +8 -6
- package/dist/simulation/stats.js.map +1 -1
- package/dist/simulation/summon-when-space.js +13 -1
- package/dist/simulation/summon-when-space.js.map +1 -1
- package/package.json +10 -2
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SetSail = void 0;
|
|
4
|
+
const storedBonus = (value) => (value != null && value > 0 ? value : 0);
|
|
5
|
+
const addBonus = (minion, attack, health) => {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
if (attack) {
|
|
8
|
+
minion.attack += attack;
|
|
9
|
+
minion.maxAttack = ((_a = minion.maxAttack) !== null && _a !== void 0 ? _a : minion.attack - attack) + attack;
|
|
10
|
+
}
|
|
11
|
+
if (health) {
|
|
12
|
+
minion.health += health;
|
|
13
|
+
minion.maxHealth = ((_b = minion.maxHealth) !== null && _b !== void 0 ? _b : minion.health - health) + health;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
const removeBonus = (minion, attack, health) => {
|
|
17
|
+
if (attack) {
|
|
18
|
+
minion.attack -= attack;
|
|
19
|
+
if (minion.maxAttack != null) {
|
|
20
|
+
minion.maxAttack -= attack;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (health) {
|
|
24
|
+
minion.health -= health;
|
|
25
|
+
if (minion.maxHealth != null) {
|
|
26
|
+
minion.maxHealth -= health;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.SetSail = {
|
|
31
|
+
cardIds: ["BG35_MagicItem_710e"],
|
|
32
|
+
onSpawnedEnchantment: (minion, enchantment, input) => {
|
|
33
|
+
addBonus(minion, input.applyAttackAuras ? storedBonus(enchantment.tagScriptDataNum1) : 0, input.applyHealthAuras ? storedBonus(enchantment.tagScriptDataNum2) : 0);
|
|
34
|
+
},
|
|
35
|
+
onDespawnedEnchantment: (minion, enchantment, input) => {
|
|
36
|
+
removeBonus(minion, input.applyAttackAuras ? storedBonus(enchantment.tagScriptDataNum1) : 0, input.applyHealthAuras ? storedBonus(enchantment.tagScriptDataNum2) : 0);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=set-sail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set-sail.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/set-sail.ts"],"names":[],"mappings":";;;AAcA,MAAM,WAAW,GAAG,CAAC,KAAyB,EAAU,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEpG,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;;IACxE,IAAI,MAAM,EAAE;QACX,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;QACxB,MAAM,CAAC,SAAS,GAAG,CAAC,MAAA,MAAM,CAAC,SAAS,mCAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;KACzE;IACD,IAAI,MAAM,EAAE;QACX,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;QACxB,MAAM,CAAC,SAAS,GAAG,CAAC,MAAA,MAAM,CAAC,SAAS,mCAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC;KACzE;AACF,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,MAAmB,EAAE,MAAc,EAAE,MAAc,EAAE,EAAE;IAC3E,IAAI,MAAM,EAAE;QACX,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;QACxB,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE;YAC7B,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;SAC3B;KACD;IACD,IAAI,MAAM,EAAE;QACX,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC;QACxB,IAAI,MAAM,CAAC,SAAS,IAAI,IAAI,EAAE;YAC7B,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC;SAC3B;KACD;AACF,CAAC,CAAC;AAEW,QAAA,OAAO,GAA0D;IAC7E,OAAO,EAAE,uBAA8D;IACvE,oBAAoB,EAAE,CAAC,MAAmB,EAAE,WAA6B,EAAE,KAAmB,EAAE,EAAE;QACjG,QAAQ,CACP,MAAM,EACN,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,EACvE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CACvE,CAAC;IACH,CAAC;IACD,sBAAsB,EAAE,CAAC,MAAmB,EAAE,WAA6B,EAAE,KAAqB,EAAE,EAAE;QACrG,WAAW,CACV,MAAM,EACN,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,EACvE,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CACvE,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Set Sail (Miniature Ship)\r\n * After you cast a Tavern spell, give your Pirates +3/+3.\r\n *\r\n * The bonus already on the minion is an aura. Stat sets strip it and put it back,\r\n * so Hostility and Resistance double the current total and then add Set Sail again.\r\n * Each enchantment stores its own bonus: tagScriptDataNum1 is attack, tagScriptDataNum2\r\n * is health. A minion can carry more than one.\r\n */\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { OnDespawnedEnchantmentCard, OnSpawnedEnchantmentCard } from '../../card.interface';\r\n\r\nconst storedBonus = (value: number | undefined): number => (value != null && value > 0 ? value : 0);\r\n\r\nconst addBonus = (minion: BoardEntity, attack: number, health: number) => {\r\n\tif (attack) {\r\n\t\tminion.attack += attack;\r\n\t\tminion.maxAttack = (minion.maxAttack ?? minion.attack - attack) + attack;\r\n\t}\r\n\tif (health) {\r\n\t\tminion.health += health;\r\n\t\tminion.maxHealth = (minion.maxHealth ?? minion.health - health) + health;\r\n\t}\r\n};\r\n\r\nconst removeBonus = (minion: BoardEntity, attack: number, health: number) => {\r\n\tif (attack) {\r\n\t\tminion.attack -= attack;\r\n\t\tif (minion.maxAttack != null) {\r\n\t\t\tminion.maxAttack -= attack;\r\n\t\t}\r\n\t}\r\n\tif (health) {\r\n\t\tminion.health -= health;\r\n\t\tif (minion.maxHealth != null) {\r\n\t\t\tminion.maxHealth -= health;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport const SetSail: OnSpawnedEnchantmentCard & OnDespawnedEnchantmentCard = {\r\n\tcardIds: [CardIds.MiniatureShip_SetSailEnchantment_BG35_MagicItem_710e],\r\n\tonSpawnedEnchantment: (minion: BoardEntity, enchantment: BoardEnchantment, input: OnSpawnInput) => {\r\n\t\taddBonus(\r\n\t\t\tminion,\r\n\t\t\tinput.applyAttackAuras ? storedBonus(enchantment.tagScriptDataNum1) : 0,\r\n\t\t\tinput.applyHealthAuras ? storedBonus(enchantment.tagScriptDataNum2) : 0,\r\n\t\t);\r\n\t},\r\n\tonDespawnedEnchantment: (minion: BoardEntity, enchantment: BoardEnchantment, input: OnDespawnInput) => {\r\n\t\tremoveBonus(\r\n\t\t\tminion,\r\n\t\t\tinput.applyAttackAuras ? storedBonus(enchantment.tagScriptDataNum1) : 0,\r\n\t\t\tinput.applyHealthAuras ? storedBonus(enchantment.tagScriptDataNum2) : 0,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
|
|
@@ -39,7 +39,8 @@ exports.SpellSiphon = {
|
|
|
39
39
|
onSpawnedEnchantment: (minion, enchantment, input) => {
|
|
40
40
|
var _a;
|
|
41
41
|
const spells = (_a = input.hero.globalInfo.TavernSpellsCastThisGame) !== null && _a !== void 0 ? _a : 0;
|
|
42
|
-
|
|
42
|
+
const already = appliedSpellCount(enchantment, 0);
|
|
43
|
+
addBonus(minion, bonusPerSpell(enchantment) * (spells - already), input.applyAttackAuras, input.applyHealthAuras);
|
|
43
44
|
enchantment.tagScriptDataNum2 = spells;
|
|
44
45
|
},
|
|
45
46
|
onDespawnedEnchantment: (minion, enchantment, input) => {
|
|
@@ -48,15 +49,12 @@ exports.SpellSiphon = {
|
|
|
48
49
|
const bonus = bonusPerSpell(enchantment) * spells;
|
|
49
50
|
if (input.applyAttackAuras) {
|
|
50
51
|
minion.attack -= bonus;
|
|
51
|
-
if (minion.maxAttack != null) {
|
|
52
|
-
minion.maxAttack -= bonus;
|
|
53
|
-
}
|
|
54
52
|
}
|
|
55
53
|
if (input.applyHealthAuras) {
|
|
56
54
|
minion.health -= bonus;
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
55
|
+
}
|
|
56
|
+
if (input.applyAttackAuras && input.applyHealthAuras) {
|
|
57
|
+
enchantment.tagScriptDataNum2 = 0;
|
|
60
58
|
}
|
|
61
59
|
},
|
|
62
60
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spell-siphon.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/spell-siphon.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"spell-siphon.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/spell-siphon.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Spell Siphon (Dark Gift)\r\n * Has +3/+3 (+2/+2) for each Tavern spell you've cast this game.\r\n * The bonus is an aura: \"set attack/health\" effects (Brood of Nozdormu) replace the base stats,\r\n * then this enchantment is applied again on top.\r\n *\r\n * tagScriptDataNum2 is how many spells are already in the minion's stats. A copy from hand\r\n * keeps the count from when the gift was last updated, so summoning it adds only the spells\r\n * cast since then. Clearing the tag on despawn lets the next spawn put the full aura back.\r\n */\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { OnGlobalInfoUpdatedInput } from '../../../mechanics/player-global-effects';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnDespawnInput, OnSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport {\r\n\tOnDespawnedEnchantmentCard,\r\n\tOnGlobalInfoUpdatedEnchantmentCard,\r\n\tOnSpawnedEnchantmentCard,\r\n} from '../../card.interface';\r\n\r\nconst bonusPerSpell = (enchantment: BoardEnchantment): number =>\r\n\tenchantment.cardId === CardIds.SpellSiphon_SpellSiphonEnchantment_BG36_MidGameEffect_000t30e ? 3 : 2;\r\n\r\nconst appliedSpellCount = (enchantment: BoardEnchantment, fallback: number): number => {\r\n\tconst stored = enchantment.tagScriptDataNum2;\r\n\treturn stored != null && stored >= 0 ? stored : fallback;\r\n};\r\n\r\nconst addBonus = (minion: BoardEntity, bonus: number, applyAttack: boolean, applyHealth: boolean) => {\r\n\tif (!bonus) {\r\n\t\treturn;\r\n\t}\r\n\tif (applyAttack) {\r\n\t\tminion.attack += bonus;\r\n\t\tminion.maxAttack = (minion.maxAttack ?? minion.attack - bonus) + bonus;\r\n\t}\r\n\tif (applyHealth) {\r\n\t\tminion.health += bonus;\r\n\t\tminion.maxHealth = (minion.maxHealth ?? minion.health - bonus) + bonus;\r\n\t}\r\n};\r\n\r\nexport const SpellSiphon: OnGlobalInfoUpdatedEnchantmentCard &\r\n\tOnSpawnedEnchantmentCard &\r\n\tOnDespawnedEnchantmentCard = {\r\n\tcardIds: [\r\n\t\tCardIds.SpellSiphon_SpellSiphonEnchantment_BG36_MidGameEffect_000t30te,\r\n\t\tCardIds.SpellSiphon_SpellSiphonEnchantment_BG36_MidGameEffect_000t30e,\r\n\t],\r\n\tonGlobalInfoUpdatedEnchantment: (\r\n\t\tminion: BoardEntity,\r\n\t\tenchantment: BoardEnchantment,\r\n\t\tinput: OnGlobalInfoUpdatedInput,\r\n\t) => {\r\n\t\tconst base = bonusPerSpell(enchantment);\r\n\t\tfor (const value of input.values) {\r\n\t\t\tif (value.type === 'TavernSpellsCastThisGame') {\r\n\t\t\t\tconst delta = value.newValue - value.oldValue;\r\n\t\t\t\taddBonus(minion, delta * base, true, true);\r\n\t\t\t\tconst stored = enchantment.tagScriptDataNum2;\r\n\t\t\t\tenchantment.tagScriptDataNum2 = stored != null && stored >= 0 ? stored + delta : value.newValue;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\tonSpawnedEnchantment: (minion: BoardEntity, enchantment: BoardEnchantment, input: OnSpawnInput) => {\r\n\t\tconst spells = input.hero.globalInfo.TavernSpellsCastThisGame ?? 0;\r\n\t\tconst already = appliedSpellCount(enchantment, 0);\r\n\t\taddBonus(\r\n\t\t\tminion,\r\n\t\t\tbonusPerSpell(enchantment) * (spells - already),\r\n\t\t\tinput.applyAttackAuras,\r\n\t\t\tinput.applyHealthAuras,\r\n\t\t);\r\n\t\tenchantment.tagScriptDataNum2 = spells;\r\n\t},\r\n\tonDespawnedEnchantment: (minion: BoardEntity, enchantment: BoardEnchantment, input: OnDespawnInput) => {\r\n\t\tconst spells = appliedSpellCount(enchantment, input.hero.globalInfo.TavernSpellsCastThisGame ?? 0);\r\n\t\tconst bonus = bonusPerSpell(enchantment) * spells;\r\n\t\t// Current stats lose the aura. maxAttack and maxHealth stay, the same way\r\n\t\t// Deaths Embrace and Hammer of Twilight remember the bonus after despawn.\r\n\t\t// Y'Shaarj summons from those maximums.\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack -= bonus;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health -= bonus;\r\n\t\t}\r\n\t\tif (input.applyAttackAuras && input.applyHealthAuras) {\r\n\t\t\tenchantment.tagScriptDataNum2 = 0;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MechGyver = 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 deathsPerMech = 9;
|
|
7
|
+
exports.MechGyver = {
|
|
8
|
+
cardIds: ["BG22_HERO_200p"],
|
|
9
|
+
onAfterFriendlyMinionDeath: (listener, input) => {
|
|
10
|
+
var _a;
|
|
11
|
+
const heroPower = listener;
|
|
12
|
+
if (input.deadEntity.friendly !== input.hero.friendly) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
let left = typeof heroPower.info === 'number' && heroPower.info > 0 ? heroPower.info : deathsPerMech;
|
|
16
|
+
left--;
|
|
17
|
+
if (left <= 0) {
|
|
18
|
+
const randomMech = input.gameState.cardsData.getRandomMinionForTribe(reference_data_1.Race.MECH, (_a = input.hero.tavernTier) !== null && _a !== void 0 ? _a : 1, []);
|
|
19
|
+
if (randomMech) {
|
|
20
|
+
(0, cards_in_hand_1.addCardsInHand)(input.hero, input.board, [randomMech], input.gameState);
|
|
21
|
+
}
|
|
22
|
+
left = deathsPerMech;
|
|
23
|
+
}
|
|
24
|
+
heroPower.info = left;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=mechgyver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mechgyver.js","sourceRoot":"","sources":["../../../../src/cards/impl/hero-power/mechgyver.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qEAAmE;AASnE,MAAM,aAAa,GAAG,CAAC,CAAC;AAEX,QAAA,SAAS,GAAmC;IACxD,OAAO,EAAE,kBAAgC;IACzC,0BAA0B,EAAE,CAAC,QAAQ,EAAE,KAAsC,EAAE,EAAE;;QAChF,MAAM,SAAS,GAAG,QAAwB,CAAC;QAC3C,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;YACtD,OAAO;SACP;QAED,IAAI,IAAI,GAAG,OAAO,SAAS,CAAC,IAAI,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC;QACrG,IAAI,EAAE,CAAC;QACP,IAAI,IAAI,IAAI,CAAC,EAAE;YACd,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,uBAAuB,CACnE,qBAAI,CAAC,IAAI,EACT,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,mCAAI,CAAC,EAC1B,EAAE,CACF,CAAC;YACF,IAAI,UAAU,EAAE;gBACf,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;aACvE;YACD,IAAI,GAAG,aAAa,CAAC;SACrB;QACD,SAAS,CAAC,IAAI,GAAG,IAAI,CAAC;IACvB,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BgsHeroPower } from '../../../bgs-player-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAfterFriendlyMinionDeathInput } from '../../../simulation/attack';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { OnAfterFriendlyMinionDeathCard } from '../../card.interface';\r\n\r\n/**\r\n * MechGyver (Ini Stormcoil)\r\n * After 9 friendly minions die, get a random Mech.\r\n *\r\n * info = TAG_SCRIPT_DATA_NUM_1 (deaths remaining until the next Mech; default 9)\r\n */\r\nconst deathsPerMech = 9;\r\n\r\nexport const MechGyver: OnAfterFriendlyMinionDeathCard = {\r\n\tcardIds: [CardIds.IniStormcoil_Mechgyver],\r\n\tonAfterFriendlyMinionDeath: (listener, input: OnAfterFriendlyMinionDeathInput) => {\r\n\t\tconst heroPower = listener as BgsHeroPower;\r\n\t\tif (input.deadEntity.friendly !== input.hero.friendly) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet left = typeof heroPower.info === 'number' && heroPower.info > 0 ? heroPower.info : deathsPerMech;\r\n\t\tleft--;\r\n\t\tif (left <= 0) {\r\n\t\t\tconst randomMech = input.gameState.cardsData.getRandomMinionForTribe(\r\n\t\t\t\tRace.MECH,\r\n\t\t\t\tinput.hero.tavernTier ?? 1,\r\n\t\t\t\t[],\r\n\t\t\t);\r\n\t\t\tif (randomMech) {\r\n\t\t\t\taddCardsInHand(input.hero, input.board, [randomMech], input.gameState);\r\n\t\t\t}\r\n\t\t\tleft = deathsPerMech;\r\n\t\t}\r\n\t\theroPower.info = left;\r\n\t},\r\n};\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cthun.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/cthun.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"cthun.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/cthun.ts"],"names":[],"mappings":";;;AAYA,mDAAqD;AACrD,qDAAwD;AAG3C,QAAA,KAAK,GAAc;IAC/B,OAAO,EAAE,4BAAoD;IAC7D,QAAQ,EAAE,CAAC,MAAmB,EAAE,KAAuB,EAAE,EAAE;;QAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC9G,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;YACnB,OAAO;SACP;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,kBAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChF,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACvC,IAAA,mBAAW,EAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC3G;IACF,CAAC;CACD,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,OAAsB,EAAE,MAAmB,EAAY,EAAE;IAC5F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,IAAI,SAAS,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,eAAe,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;IACrC,OAAO,SAAS,GAAG,CAAC,IAAI,eAAe,CAAC,MAAM,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;QACrC,eAAe,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,SAAS,EAAE,CAAC;KACZ;IACD,OAAO,MAAM,CAAC;AACf,CAAC,CAAC","sourcesContent":["/**\r\n * C'Thun (Tier 3, 1/1)\r\n * Deity. After this awakens, give this minion's stats split amongst your other minions.\r\n *\r\n * Golden C'Thun (Tier 3, 2/2)\r\n * Deity. After this awakens, give double this minion's stats split amongst your other minions.\r\n *\r\n * Only fires on BG_OldGod awaken, not generic spawn / reborn.\r\n * The trigger runs after summon auras, so \"this minion's stats\" includes them.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { pickRandom } from '../../../services/utils';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { DeityAwakenInput, DeityCard } from '../../card.interface';\r\n\r\nexport const CThun: DeityCard = {\r\n\tcardIds: [CardIds.Cthun_BGFYM_000, CardIds.Cthun_BGFYM_000_G],\r\n\tonAwaken: (minion: BoardEntity, input: DeityAwakenInput) => {\r\n\t\tconst others = input.board.filter((e) => e.entityId !== minion.entityId && e.health > 0 && !e.definitelyDead);\r\n\t\tif (!others.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst double = minion.cardId === CardIds.Cthun_BGFYM_000_G ? 2 : 1;\r\n\t\tconst attackShares = splitEvenly((minion.attack ?? 0) * double, others, minion);\r\n\t\tconst healthShares = splitEvenly((minion.health ?? 0) * double, others, minion);\r\n\t\tfor (let i = 0; i < others.length; i++) {\r\n\t\t\tmodifyStats(others[i], minion, attackShares[i], healthShares[i], input.board, input.hero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n\r\nconst splitEvenly = (total: number, targets: BoardEntity[], source: BoardEntity): number[] => {\r\n\tconst base = Math.floor(total / targets.length);\r\n\tlet remaining = total - base * targets.length;\r\n\tconst shares = targets.map(() => base);\r\n\tconst leftoverTargets = [...targets];\r\n\twhile (remaining > 0 && leftoverTargets.length) {\r\n\t\tconst target = pickRandom(leftoverTargets, source);\r\n\t\tshares[targets.indexOf(target)] += 1;\r\n\t\tleftoverTargets.splice(leftoverTargets.indexOf(target), 1);\r\n\t\tremaining--;\r\n\t}\r\n\treturn shares;\r\n};\r\n"]}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DiremuckForager = exports.handleDiremuckPendingSummons = void 0;
|
|
4
4
|
const reference_data_1 = require("@firestone-hs/reference-data");
|
|
5
5
|
const hand_minion_priority_1 = require("../../../services/hand-minion-priority");
|
|
6
|
+
const add_minion_to_board_1 = require("../../../simulation/add-minion-to-board");
|
|
6
7
|
const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
|
|
7
8
|
const spawns_1 = require("../../../simulation/spawns");
|
|
8
9
|
const utils_1 = require("../../../utils");
|
|
@@ -11,7 +12,9 @@ const summonHandMinionFromDiremuck = (forager, handTarget, spawnRight, playerBoa
|
|
|
11
12
|
var _a;
|
|
12
13
|
handTarget.locked = true;
|
|
13
14
|
const friendly = (_a = forager === null || forager === void 0 ? void 0 : forager.friendly) !== null && _a !== void 0 ? _a : playerEntity.friendly;
|
|
14
|
-
const
|
|
15
|
+
const clone = (0, utils_1.copyEntity)(handTarget);
|
|
16
|
+
(0, add_minion_to_board_1.removeAurasFromSelf)(clone, playerBoard, playerEntity, gameState, true, true, false);
|
|
17
|
+
const newMinions = (0, deathrattle_spawns_1.spawnEntities)(handTarget.cardId, 1, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState, friendly, false, false, true, clone);
|
|
15
18
|
for (const s of newMinions) {
|
|
16
19
|
s.onCanceledSummon = () => (handTarget.locked = false);
|
|
17
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diremuck-forager.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/diremuck-forager.ts"],"names":[],"mappings":";;;AAOA,iEAAoD;AAIpD,iFAA4G;AAC5G,+EAAuE;AAEvE,uDAAiE;AAEjE,0CAAiD;AAGjD,MAAM,mBAAmB,GAAG,CAAC,QAAmC,EAAE,EAAE,CAAC,CAAC,CAAc,EAAE,EAAE,CACvF,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,IAAA,4CAAqB,EAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,WAAC,OAAA,MAAA,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,0CAAE,WAAW,EAAE,CAAA,EAAA,CAAC,CAAC;AAG7F,MAAM,4BAA4B,GAAG,CACpC,OAA2B,EAC3B,UAAuB,EACvB,UAAmB,EACnB,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACjB,EAAE;;IACT,UAAU,CAAC,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,mCAAI,YAAY,CAAC,QAAQ,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAA,kCAAa,EAC/B,UAAU,CAAC,MAAM,EACjB,CAAC,EACD,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,EACT,QAAQ,EACR,KAAK,EACL,KAAK,EACL,IAAI,EACJ,EAAE,GAAG,UAAU,EAAiB,CAChC,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE;QAC3B,CAAC,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;KACvD;IACD,MAAM,WAAW,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,YAAY,CAAC;IAM5C,MAAM,cAAc,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjG,IAAA,4BAAmB,EAClB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,SAAS,CACT,CAAC;AACH,CAAC,CAAC;AAGK,MAAM,4BAA4B,GAAG,CAC3C,WAA0B,EAC1B,YAA6B,EAC7B,aAA4B,EAC5B,cAA+B,EAC/B,SAAwB,EACjB,EAAE;;IACT,MAAM,GAAG,GAAG,MAAA,YAAY,CAAC,UAAU,0CAAE,sBAAsB,CAAC;IAC5D,IAAI,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,MAAM,CAAA,EAAE;QACjB,OAAO;KACP;IACD,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IACpC,MAAM,SAAS,GAA0E,EAAE,CAAC;IAE5F,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE;QACxB,IAAI,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAChC,MAAM,OAAO,GAAG,MAAA,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,eAAe,CAAC,mCAAI,IAAI,CAAC;QACtF,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE;YAC/C,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACjD,IAAA,uBAAe,EAAC,CAAC,EAAE,YAAY,EAAE,qBAAI,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC,QAAQ,CAAC,CACtF,CAAC;YACF,MAAM,OAAO,GAAG,IAAA,kDAA2B,EAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpG,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,CAAC,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,CAAA,IAAI,UAAU,CAAC,MAAM,EAAE;gBAC7C,MAAM;aACN;YACD,4BAA4B,CAC3B,OAAO,EACP,UAAU,EACV,KAAK,CAAC,UAAU,EAChB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,CACT,CAAC;YACF,SAAS,EAAE,CAAC;SACZ;QACD,IAAI,SAAS,GAAG,CAAC,EAAE;YAClB,SAAS,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;SACpG;KACD;IACD,YAAY,CAAC,UAAU,CAAC,sBAAsB,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AAC3F,CAAC,CAAC;AA3CW,QAAA,4BAA4B,gCA2CvC;AAEW,QAAA,eAAe,GAAsB;IACjD,OAAO,EAAE,0BAAsE;IAC/E,mBAAmB,EAAE,iBAAiB;IACtC,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;;QAIvD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAGjF,MAAM,UAAU,GACf,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC;YAC7B,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5F,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,sBAAsB,GAAG;YACtD,GAAG,CAAC,MAAA,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,sBAAsB,mCAAI,EAAE,CAAC;YAC/D,EAAE,eAAe,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE;SACxE,CAAC;QACF,OAAO;YACN,YAAY,EAAE,IAAI;YAClB,8BAA8B,EAAE,CAAC,UAAU;SAC3C,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Diremuck Forager (Tier 4, 5/6)\r\n * Start of Combat: When you have space, summon the highest-Attack minion from your hand for this combat only.\r\n *\r\n * Golden Diremuck Forager (Tier 4, 10/12)\r\n * Start of Combat: When you have space, summon the two highest-Attack minions from your hand for this combat only.\r\n */\r\nimport { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { getHighestAttackHandMinions, isHandMinionCandidate } from '../../../services/hand-minion-priority';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { FullGameState } from '../../../simulation/internal-game-state';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nconst handMinionPredicate = (allCards: FullGameState['allCards']) => (e: BoardEntity) =>\r\n\t!!e.maxHealth && isHandMinionCandidate(e, (id) => allCards.getCard(id).type?.toUpperCase());\r\n\r\n/** If the Forager died after SOC, pass `null` — summons still resolve (spawn source = hero, index from right = 0). */\r\nconst summonHandMinionFromDiremuck = (\r\n\tforager: BoardEntity | null,\r\n\thandTarget: BoardEntity,\r\n\tspawnRight: boolean,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\thandTarget.locked = true;\r\n\tconst friendly = forager?.friendly ?? playerEntity.friendly;\r\n\tconst newMinions = spawnEntities(\r\n\t\thandTarget.cardId,\r\n\t\t1,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t\tfriendly,\r\n\t\tfalse,\r\n\t\tfalse,\r\n\t\ttrue,\r\n\t\t{ ...handTarget } as BoardEntity,\r\n\t);\r\n\tfor (const s of newMinions) {\r\n\t\ts.onCanceledSummon = () => (handTarget.locked = false);\r\n\t}\r\n\tconst spawnSource = forager ?? playerEntity;\r\n\t// Current theory:\r\n\t// - spawns next to the Forager, if the board isn't full at start of combat\r\n\t// https://replays.firestoneapp.com/?reviewId=1d34f5b4-7e04-4b17-bcc0-353698abaed3&turn=25&action=1\r\n\t// - spawns to the right, if the board is full at start of combat\r\n\t// https://replays.firestoneapp.com/?reviewId=b498d69f-bf1b-4bc0-8902-3643434394d5&turn=23&action=3\r\n\tconst indexFromRight = !spawnRight ? playerBoard.length - (playerBoard.indexOf(forager) + 1) : 0;\r\n\tperformEntitySpawns(\r\n\t\tnewMinions,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\tspawnSource,\r\n\t\tindexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\n/** Called from `summon-when-space` when board space opens during start-of-combat. */\r\nexport const handleDiremuckPendingSummons = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst raw = playerEntity.globalInfo?.DiremuckPendingSummons;\r\n\tif (!raw?.length) {\r\n\t\treturn;\r\n\t}\r\n\tconst allCards = gameState.allCards;\r\n\tconst nextQueue: { foragerEntityId: number; remaining: number; spawnRight: boolean }[] = [];\r\n\r\n\tfor (const entry of raw) {\r\n\t\tlet remaining = entry.remaining;\r\n\t\tconst forager = playerBoard.find((e) => e.entityId === entry.foragerEntityId) ?? null;\r\n\t\twhile (playerBoard.length < 7 && remaining > 0) {\r\n\t\t\tconst candidates = playerEntity.hand.filter((e) =>\r\n\t\t\t\thasCorrectTribe(e, playerEntity, Race.MURLOC, gameState.anomalies, gameState.allCards),\r\n\t\t\t);\r\n\t\t\tconst targets = getHighestAttackHandMinions(candidates, 1, (e) => handMinionPredicate(allCards)(e));\r\n\t\t\tconst handTarget = targets[0];\r\n\t\t\tif (!handTarget?.cardId || handTarget.locked) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tsummonHandMinionFromDiremuck(\r\n\t\t\t\tforager,\r\n\t\t\t\thandTarget,\r\n\t\t\t\tentry.spawnRight,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tremaining--;\r\n\t\t}\r\n\t\tif (remaining > 0) {\r\n\t\t\tnextQueue.push({ foragerEntityId: entry.foragerEntityId, remaining, spawnRight: entry.spawnRight });\r\n\t\t}\r\n\t}\r\n\tplayerEntity.globalInfo.DiremuckPendingSummons = nextQueue.length ? nextQueue : undefined;\r\n};\r\n\r\nexport const DiremuckForager: StartOfCombatCard = {\r\n\tcardIds: [CardIds.DiremuckForager_BG27_556, CardIds.DiremuckForager_BG27_556_G],\r\n\tstartOfCombatTiming: 'start-of-combat',\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\t// Don't clear the info, as multiple Diremuck Foragers can be on the board at the same time,\r\n\t\t// and they stack\r\n\t\t// input.playerEntity.globalInfo.DiremuckPendingSummons = undefined;\r\n\t\tconst totalWanted = minion.cardId === CardIds.DiremuckForager_BG27_556_G ? 2 : 1;\r\n\t\t// Not sure this is the right rule, but so far it looks like that if it can't spawn during start of combat,\r\n\t\t// then it will spawn to the right side of the board\r\n\t\tconst spawnRight =\r\n\t\t\tinput.playerBoard.length >= 7 ||\r\n\t\t\tinput.playerEntity.hand.filter(handMinionPredicate(input.gameState.allCards)).length === 0;\r\n\t\tinput.playerEntity.globalInfo.DiremuckPendingSummons = [\r\n\t\t\t...(input.playerEntity.globalInfo.DiremuckPendingSummons ?? []),\r\n\t\t\t{ foragerEntityId: minion.entityId, remaining: totalWanted, spawnRight },\r\n\t\t];\r\n\t\treturn {\r\n\t\t\thasTriggered: true,\r\n\t\t\tshouldRecomputeCurrentAttacker: !spawnRight,\r\n\t\t};\r\n\t},\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"diremuck-forager.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/diremuck-forager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Diremuck Forager (Tier 4, 5/6)\r\n * Start of Combat: When you have space, summon the highest-Attack minion from your hand for this combat only.\r\n *\r\n * Golden Diremuck Forager (Tier 4, 10/12)\r\n * Start of Combat: When you have space, summon the two highest-Attack minions from your hand for this combat only.\r\n */\r\nimport { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { getHighestAttackHandMinions, isHandMinionCandidate } from '../../../services/hand-minion-priority';\r\nimport { removeAurasFromSelf } from '../../../simulation/add-minion-to-board';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { FullGameState } from '../../../simulation/internal-game-state';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { copyEntity, hasCorrectTribe } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nconst handMinionPredicate = (allCards: FullGameState['allCards']) => (e: BoardEntity) =>\r\n\t!!e.maxHealth && isHandMinionCandidate(e, (id) => allCards.getCard(id).type?.toUpperCase());\r\n\r\n/** If the Forager died after SOC, pass `null` — summons still resolve (spawn source = hero, index from right = 0). */\r\nconst summonHandMinionFromDiremuck = (\r\n\tforager: BoardEntity | null,\r\n\thandTarget: BoardEntity,\r\n\tspawnRight: boolean,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\thandTarget.locked = true;\r\n\tconst friendly = forager?.friendly ?? playerEntity.friendly;\r\n\t// The hand copy already includes its self auras. Strip them first and let the summon\r\n\t// write them back from the current counters, so a 15/15 Dark Paradox stays 15/15.\r\n\tconst clone = copyEntity(handTarget);\r\n\tremoveAurasFromSelf(clone, playerBoard, playerEntity, gameState, true, true, false);\r\n\tconst newMinions = spawnEntities(\r\n\t\thandTarget.cardId,\r\n\t\t1,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t\tfriendly,\r\n\t\tfalse,\r\n\t\tfalse,\r\n\t\ttrue,\r\n\t\tclone,\r\n\t);\r\n\tfor (const s of newMinions) {\r\n\t\ts.onCanceledSummon = () => (handTarget.locked = false);\r\n\t}\r\n\tconst spawnSource = forager ?? playerEntity;\r\n\t// Current theory:\r\n\t// - spawns next to the Forager, if the board isn't full at start of combat\r\n\t// https://replays.firestoneapp.com/?reviewId=1d34f5b4-7e04-4b17-bcc0-353698abaed3&turn=25&action=1\r\n\t// - spawns to the right, if the board is full at start of combat\r\n\t// https://replays.firestoneapp.com/?reviewId=b498d69f-bf1b-4bc0-8902-3643434394d5&turn=23&action=3\r\n\tconst indexFromRight = !spawnRight ? playerBoard.length - (playerBoard.indexOf(forager) + 1) : 0;\r\n\tperformEntitySpawns(\r\n\t\tnewMinions,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\tspawnSource,\r\n\t\tindexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\n/** Called from `summon-when-space` when board space opens during start-of-combat. */\r\nexport const handleDiremuckPendingSummons = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst raw = playerEntity.globalInfo?.DiremuckPendingSummons;\r\n\tif (!raw?.length) {\r\n\t\treturn;\r\n\t}\r\n\tconst allCards = gameState.allCards;\r\n\tconst nextQueue: { foragerEntityId: number; remaining: number; spawnRight: boolean }[] = [];\r\n\r\n\tfor (const entry of raw) {\r\n\t\tlet remaining = entry.remaining;\r\n\t\tconst forager = playerBoard.find((e) => e.entityId === entry.foragerEntityId) ?? null;\r\n\t\twhile (playerBoard.length < 7 && remaining > 0) {\r\n\t\t\tconst candidates = playerEntity.hand.filter((e) =>\r\n\t\t\t\thasCorrectTribe(e, playerEntity, Race.MURLOC, gameState.anomalies, gameState.allCards),\r\n\t\t\t);\r\n\t\t\tconst targets = getHighestAttackHandMinions(candidates, 1, (e) => handMinionPredicate(allCards)(e));\r\n\t\t\tconst handTarget = targets[0];\r\n\t\t\tif (!handTarget?.cardId || handTarget.locked) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tsummonHandMinionFromDiremuck(\r\n\t\t\t\tforager,\r\n\t\t\t\thandTarget,\r\n\t\t\t\tentry.spawnRight,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tremaining--;\r\n\t\t}\r\n\t\tif (remaining > 0) {\r\n\t\t\tnextQueue.push({ foragerEntityId: entry.foragerEntityId, remaining, spawnRight: entry.spawnRight });\r\n\t\t}\r\n\t}\r\n\tplayerEntity.globalInfo.DiremuckPendingSummons = nextQueue.length ? nextQueue : undefined;\r\n};\r\n\r\nexport const DiremuckForager: StartOfCombatCard = {\r\n\tcardIds: [CardIds.DiremuckForager_BG27_556, CardIds.DiremuckForager_BG27_556_G],\r\n\tstartOfCombatTiming: 'start-of-combat',\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\t// Don't clear the info, as multiple Diremuck Foragers can be on the board at the same time,\r\n\t\t// and they stack\r\n\t\t// input.playerEntity.globalInfo.DiremuckPendingSummons = undefined;\r\n\t\tconst totalWanted = minion.cardId === CardIds.DiremuckForager_BG27_556_G ? 2 : 1;\r\n\t\t// Not sure this is the right rule, but so far it looks like that if it can't spawn during start of combat,\r\n\t\t// then it will spawn to the right side of the board\r\n\t\tconst spawnRight =\r\n\t\t\tinput.playerBoard.length >= 7 ||\r\n\t\t\tinput.playerEntity.hand.filter(handMinionPredicate(input.gameState.allCards)).length === 0;\r\n\t\tinput.playerEntity.globalInfo.DiremuckPendingSummons = [\r\n\t\t\t...(input.playerEntity.globalInfo.DiremuckPendingSummons ?? []),\r\n\t\t\t{ foragerEntityId: minion.entityId, remaining: totalWanted, spawnRight },\r\n\t\t];\r\n\t\treturn {\r\n\t\t\thasTriggered: true,\r\n\t\t\tshouldRecomputeCurrentAttacker: !spawnRight,\r\n\t\t};\r\n\t},\r\n};\r\n"]}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ExpertAviator = void 0;
|
|
4
4
|
const reference_data_1 = require("@firestone-hs/reference-data");
|
|
5
5
|
const hand_minion_priority_1 = require("../../../services/hand-minion-priority");
|
|
6
|
+
const add_minion_to_board_1 = require("../../../simulation/add-minion-to-board");
|
|
6
7
|
const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
|
|
7
8
|
const spawns_1 = require("../../../simulation/spawns");
|
|
8
9
|
const utils_1 = require("../../../utils");
|
|
@@ -19,6 +20,7 @@ exports.ExpertAviator = {
|
|
|
19
20
|
}
|
|
20
21
|
target.locked = true;
|
|
21
22
|
const clone = (0, utils_1.copyEntity)(target);
|
|
23
|
+
(0, add_minion_to_board_1.removeAurasFromSelf)(clone, input.attackingBoard, input.attackingHero, input.gameState, true, true, false);
|
|
22
24
|
const spawnInput = {
|
|
23
25
|
boardWithDeadEntity: input.attackingBoard,
|
|
24
26
|
boardWithDeadEntityHero: input.attackingHero,
|
|
@@ -31,7 +33,7 @@ exports.ExpertAviator = {
|
|
|
31
33
|
for (const s of spawns) {
|
|
32
34
|
s.onCanceledSummon = () => (target.locked = false);
|
|
33
35
|
}
|
|
34
|
-
(0, spawns_1.performEntitySpawns)(spawns, spawnInput.boardWithDeadEntity, spawnInput.boardWithDeadEntityHero, minion, input.attackingBoard.length - input.attackingBoard.indexOf(minion) - 1, spawnInput.otherBoard, spawnInput.otherBoardHero, input.gameState
|
|
36
|
+
(0, spawns_1.performEntitySpawns)(spawns, spawnInput.boardWithDeadEntity, spawnInput.boardWithDeadEntityHero, minion, input.attackingBoard.length - input.attackingBoard.indexOf(minion) - 1, spawnInput.otherBoard, spawnInput.otherBoardHero, input.gameState);
|
|
35
37
|
}
|
|
36
38
|
return {
|
|
37
39
|
dmgDoneByAttacker: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expert-aviator.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/expert-aviator.ts"],"names":[],"mappings":";;;AAOA,iEAAoD;AAGpD,iFAA4G;
|
|
1
|
+
{"version":3,"file":"expert-aviator.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/expert-aviator.ts"],"names":[],"mappings":";;;AAOA,iEAAoD;AAGpD,iFAA4G;AAC5G,iFAA8E;AAE9E,+EAAiF;AAEjF,uDAAiE;AACjE,0CAA6D;AAGhD,QAAA,aAAa,GAAc;IACvC,OAAO,EAAE,0BAAkE;IAC3E,KAAK,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAA4D,EAAE;QAC9G,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAqC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC;QAC1C,MAAM,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACxD,IAAA,uBAAe,EAAC,CAAC,EAAE,KAAK,CAAC,aAAa,EAAE,qBAAI,CAAC,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CACzG,CAAC;QACF,MAAM,OAAO,GAAG,IAAA,kDAA2B,EAC1C,UAAU,EACV,IAAI,EACJ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,IAAA,4CAAqB,EAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,WAAC,OAAA,MAAA,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,0CAAE,WAAW,EAAE,CAAA,EAAA,CAAC,CAClG,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAI,MAAM,CAAC,MAAM,EAAE;gBAClB,SAAS;aACT;YACD,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,MAAM,KAAK,GAAG,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;YAKjC,IAAA,yCAAmB,EAClB,KAAK,EACL,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,EACf,IAAI,EACJ,IAAI,EACJ,KAAK,CACL,CAAC;YACF,MAAM,UAAU,GAA8B;gBAC7C,mBAAmB,EAAE,KAAK,CAAC,cAAc;gBACzC,uBAAuB,EAAE,KAAK,CAAC,aAAa;gBAC5C,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,UAAU,EAAE,MAAM;gBAClB,UAAU,EAAE,KAAK,CAAC,cAAc;gBAChC,cAAc,EAAE,KAAK,CAAC,aAAa;aACnC,CAAC;YACF,MAAM,MAAM,GAAG,IAAA,4CAAuB,EAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAC3E,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;gBACvB,CAAC,CAAC,gBAAgB,GAAG,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;aACnD;YACD,IAAA,4BAAmB,EAClB,MAAM,EACN,UAAU,CAAC,mBAAmB,EAC9B,UAAU,CAAC,uBAAuB,EAClC,MAAM,EACN,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,EACtE,UAAU,CAAC,UAAU,EACrB,UAAU,CAAC,cAAc,EACzB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO;YACN,iBAAiB,EAAE,CAAC;YACpB,iBAAiB,EAAE,CAAC;SACpB,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Expert Aviator (Tier 2, 3/4)\r\n * Rally: Summon the highest-Attack minion from your hand for this combat only.\r\n *\r\n * Golden Expert Aviator (Tier 2, 6/8)\r\n * Rally: Summon the two highest-Attack minions from your hand for this combat only.\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 { getHighestAttackHandMinions, isHandMinionCandidate } from '../../../services/hand-minion-priority';\r\nimport { removeAurasFromSelf } from '../../../simulation/add-minion-to-board';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { simplifiedSpawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { copyEntity, hasCorrectTribe } from '../../../utils';\r\nimport { RallyCard } from '../../card.interface';\r\n\r\nexport const ExpertAviator: RallyCard = {\r\n\tcardIds: [CardIds.ExpertAviator_BG34_140, CardIds.ExpertAviator_BG34_140_G],\r\n\trally: (minion: BoardEntity, input: OnAttackInput): { dmgDoneByAttacker: number; dmgDoneByDefender: number } => {\r\n\t\tconst mult = minion.cardId === CardIds.ExpertAviator_BG34_140_G ? 2 : 1;\r\n\t\tconst allCards = input.gameState.allCards;\r\n\t\tconst candidates = input.attackingHero.hand.filter((e) =>\r\n\t\t\thasCorrectTribe(e, input.attackingHero, Race.MURLOC, input.gameState.anomalies, input.gameState.allCards),\r\n\t\t);\r\n\t\tconst targets = getHighestAttackHandMinions(\r\n\t\t\tcandidates,\r\n\t\t\tmult,\r\n\t\t\t(e) => !!e.maxHealth && isHandMinionCandidate(e, (id) => allCards.getCard(id).type?.toUpperCase()),\r\n\t\t);\r\n\t\tfor (const target of targets) {\r\n\t\t\tif (target.locked) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\ttarget.locked = true;\r\n\t\t\tconst clone = copyEntity(target);\r\n\t\t\t// The hand copy already includes its self auras. Strip them first (off-board, so\r\n\t\t\t// Automaton uses the full summoned count) and let the summon write them back from\r\n\t\t\t// the current counters. That keeps a 9/8 Automaton at 9/8, and lets Spell Siphon\r\n\t\t\t// catch up to Tavern spells cast since the gift was stored.\r\n\t\t\tremoveAurasFromSelf(\r\n\t\t\t\tclone,\r\n\t\t\t\tinput.attackingBoard,\r\n\t\t\t\tinput.attackingHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t\ttrue,\r\n\t\t\t\ttrue,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tconst spawnInput: DeathrattleTriggeredInput = {\r\n\t\t\t\tboardWithDeadEntity: input.attackingBoard,\r\n\t\t\t\tboardWithDeadEntityHero: input.attackingHero,\r\n\t\t\t\tgameState: input.gameState,\r\n\t\t\t\tdeadEntity: minion,\r\n\t\t\t\totherBoard: input.defendingBoard,\r\n\t\t\t\totherBoardHero: input.defendingHero,\r\n\t\t\t};\r\n\t\t\tconst spawns = simplifiedSpawnEntities(clone.cardId, 1, spawnInput, clone);\r\n\t\t\tfor (const s of spawns) {\r\n\t\t\t\ts.onCanceledSummon = () => (target.locked = false);\r\n\t\t\t}\r\n\t\t\tperformEntitySpawns(\r\n\t\t\t\tspawns,\r\n\t\t\t\tspawnInput.boardWithDeadEntity,\r\n\t\t\t\tspawnInput.boardWithDeadEntityHero,\r\n\t\t\t\tminion,\r\n\t\t\t\tinput.attackingBoard.length - input.attackingBoard.indexOf(minion) - 1,\r\n\t\t\t\tspawnInput.otherBoard,\r\n\t\t\t\tspawnInput.otherBoardHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn {\r\n\t\t\tdmgDoneByAttacker: 0,\r\n\t\t\tdmgDoneByDefender: 0,\r\n\t\t};\r\n\t},\r\n};\r\n"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { DeathrattleEffectCard } from '../../card.interface';
|
|
2
|
-
export declare const FacelessConverter: DeathrattleEffectCard;
|
|
1
|
+
import { DeathrattleEffectCard, OnGlobalInfoUpdatedCard, RebornSelfAttributeTransferCard } from '../../card.interface';
|
|
2
|
+
export declare const FacelessConverter: DeathrattleEffectCard & OnGlobalInfoUpdatedCard & RebornSelfAttributeTransferCard;
|
|
@@ -2,14 +2,47 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FacelessConverter = void 0;
|
|
4
4
|
const deity_1 = require("../../../simulation/deity");
|
|
5
|
+
const baseBuff = (minion) => {
|
|
6
|
+
const mult = minion.cardId === "BG36_318_G" ? 2 : 1;
|
|
7
|
+
return { attack: 2 * mult, health: 1 * mult };
|
|
8
|
+
};
|
|
9
|
+
const deathrattleBuff = (minion, tavernSpells) => {
|
|
10
|
+
var _a, _b;
|
|
11
|
+
const base = baseBuff(minion);
|
|
12
|
+
if (((_a = minion.scriptDataNum1) !== null && _a !== void 0 ? _a : 0) > 0) {
|
|
13
|
+
return {
|
|
14
|
+
attack: minion.scriptDataNum1,
|
|
15
|
+
health: ((_b = minion.scriptDataNum2) !== null && _b !== void 0 ? _b : 0) > 0 ? minion.scriptDataNum2 : base.health,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const steps = 1 + (tavernSpells !== null && tavernSpells !== void 0 ? tavernSpells : 0);
|
|
19
|
+
return { attack: base.attack * steps, health: base.health * steps };
|
|
20
|
+
};
|
|
5
21
|
exports.FacelessConverter = {
|
|
6
22
|
cardIds: ["BG36_318", "BG36_318_G"],
|
|
23
|
+
rebornSelfAttributeTransfer: ['scriptDataNum1', 'scriptDataNum2'],
|
|
7
24
|
deathrattleEffect: (minion, input) => {
|
|
8
|
-
const
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
25
|
+
const { attack, health } = deathrattleBuff(minion, input.boardWithDeadEntityHero.globalInfo.TavernSpellsCastThisGame);
|
|
26
|
+
(0, deity_1.buffYourDeity)(input.boardWithDeadEntityHero, input.boardWithDeadEntity, minion, attack, health, input.gameState);
|
|
27
|
+
},
|
|
28
|
+
onGlobalInfoUpdated: (entity, input) => {
|
|
29
|
+
var _a, _b;
|
|
30
|
+
if (!(((_a = entity.scriptDataNum1) !== null && _a !== void 0 ? _a : 0) > 0)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const base = baseBuff(entity);
|
|
34
|
+
for (const value of input.values) {
|
|
35
|
+
if (value.type !== 'TavernSpellsCastThisGame') {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
const delta = value.newValue - value.oldValue;
|
|
39
|
+
if (!delta) {
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
entity.scriptDataNum1 += base.attack * delta;
|
|
43
|
+
const health = ((_b = entity.scriptDataNum2) !== null && _b !== void 0 ? _b : 0) > 0 ? entity.scriptDataNum2 : base.health;
|
|
44
|
+
entity.scriptDataNum2 = health + base.health * delta;
|
|
45
|
+
}
|
|
13
46
|
},
|
|
14
47
|
};
|
|
15
48
|
//# sourceMappingURL=faceless-converter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"faceless-converter.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/faceless-converter.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"faceless-converter.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/faceless-converter.ts"],"names":[],"mappings":";;;AAgBA,qDAA0D;AAG1D,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAAsC,EAAE;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,MAAmB,EAAE,YAAoB,EAAsC,EAAE;;IACzG,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,CAAC,CAAC,GAAG,CAAC,EAAE;QACrC,OAAO;YACN,MAAM,EAAE,MAAM,CAAC,cAAc;YAC7B,MAAM,EAAE,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM;SAC9E,CAAC;KACF;IACD,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,CAAC,CAAC,CAAC;IACtC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;AACrE,CAAC,CAAC;AAEW,QAAA,iBAAiB,GAEK;IAClC,OAAO,EAAE,0BAA0E;IACnF,2BAA2B,EAAE,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IACjE,iBAAiB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC5E,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CACzC,MAAM,EACN,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,wBAAwB,CACjE,CAAC;QACF,IAAA,qBAAa,EAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAClH,CAAC;IACD,mBAAmB,EAAE,CAAC,MAAmB,EAAE,KAA+B,EAAE,EAAE;;QAG7E,IAAI,CAAC,CAAC,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE;YACxC,OAAO;SACP;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE;gBAC9C,SAAS;aACT;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE;gBACX,SAAS;aACT;YACD,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAC7C,MAAM,MAAM,GAAG,CAAC,MAAA,MAAM,CAAC,cAAc,mCAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;YACtF,MAAM,CAAC,cAAc,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;SACrD;IACF,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Faceless Converter (Tier 5, 5/5)\r\n * Deathrattle: Give your Deity +2/+1 (improved by each Tavern spell you've cast this game).\r\n *\r\n * Golden Faceless Converter (Tier 5, 10/10)\r\n * Deathrattle: Give your Deity +4/+2 (improved by each Tavern spell you've cast this game).\r\n *\r\n * The improved amounts live on scriptDataNum1 / scriptDataNum2 (+2/+1 per spell, doubled if golden).\r\n * Combat payloads often leave TavernSpellsCastThisGame at 0, so the stored values are the buff.\r\n * A tavern spell cast in combat adds another step to a copy that already has them.\r\n * Reborn clears scriptDataNum1, so the stored buff is copied onto the new body.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { OnGlobalInfoUpdatedInput } from '../../../mechanics/player-global-effects';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { buffYourDeity } from '../../../simulation/deity';\r\nimport { DeathrattleEffectCard, OnGlobalInfoUpdatedCard, RebornSelfAttributeTransferCard } from '../../card.interface';\r\n\r\nconst baseBuff = (minion: BoardEntity): { attack: number; health: number } => {\r\n\tconst mult = minion.cardId === CardIds.FacelessConverter_BG36_318_G ? 2 : 1;\r\n\treturn { attack: 2 * mult, health: 1 * mult };\r\n};\r\n\r\nconst deathrattleBuff = (minion: BoardEntity, tavernSpells: number): { attack: number; health: number } => {\r\n\tconst base = baseBuff(minion);\r\n\tif ((minion.scriptDataNum1 ?? 0) > 0) {\r\n\t\treturn {\r\n\t\t\tattack: minion.scriptDataNum1,\r\n\t\t\thealth: (minion.scriptDataNum2 ?? 0) > 0 ? minion.scriptDataNum2 : base.health,\r\n\t\t};\r\n\t}\r\n\tconst steps = 1 + (tavernSpells ?? 0);\r\n\treturn { attack: base.attack * steps, health: base.health * steps };\r\n};\r\n\r\nexport const FacelessConverter: DeathrattleEffectCard &\r\n\tOnGlobalInfoUpdatedCard &\r\n\tRebornSelfAttributeTransferCard = {\r\n\tcardIds: [CardIds.FacelessConverter_BG36_318, CardIds.FacelessConverter_BG36_318_G],\r\n\trebornSelfAttributeTransfer: ['scriptDataNum1', 'scriptDataNum2'],\r\n\tdeathrattleEffect: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst { attack, health } = deathrattleBuff(\r\n\t\t\tminion,\r\n\t\t\tinput.boardWithDeadEntityHero.globalInfo.TavernSpellsCastThisGame,\r\n\t\t);\r\n\t\tbuffYourDeity(input.boardWithDeadEntityHero, input.boardWithDeadEntity, minion, attack, health, input.gameState);\r\n\t},\r\n\tonGlobalInfoUpdated: (entity: BoardEntity, input: OnGlobalInfoUpdatedInput) => {\r\n\t\t// An unset copy still uses the spell counter in the deathrattle. Writing a partial\r\n\t\t// step here would hide the base +2/+1.\r\n\t\tif (!((entity.scriptDataNum1 ?? 0) > 0)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst base = baseBuff(entity);\r\n\t\tfor (const value of input.values) {\r\n\t\t\tif (value.type !== 'TavernSpellsCastThisGame') {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tconst delta = value.newValue - value.oldValue;\r\n\t\t\tif (!delta) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tentity.scriptDataNum1 += base.attack * delta;\r\n\t\t\tconst health = (entity.scriptDataNum2 ?? 0) > 0 ? entity.scriptDataNum2 : base.health;\r\n\t\t\tentity.scriptDataNum2 = health + base.health * delta;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -2,12 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Hopebringer = void 0;
|
|
4
4
|
const stats_1 = require("../../../simulation/stats");
|
|
5
|
+
const baseBuff = (minion) => {
|
|
6
|
+
const mult = minion.cardId === "BG36_364_G" ? 2 : 1;
|
|
7
|
+
return { attack: 4 * mult, health: 3 * mult };
|
|
8
|
+
};
|
|
5
9
|
exports.Hopebringer = {
|
|
6
10
|
cardIds: ["BG36_364", "BG36_364_G"],
|
|
7
11
|
startOfCombat: (minion, input) => {
|
|
8
|
-
const
|
|
9
|
-
const atk =
|
|
10
|
-
const hp =
|
|
12
|
+
const base = baseBuff(minion);
|
|
13
|
+
const atk = minion.scriptDataNum1 > 0 ? minion.scriptDataNum1 : base.attack;
|
|
14
|
+
const hp = minion.scriptDataNum2 > 0 ? minion.scriptDataNum2 : base.health;
|
|
11
15
|
for (const target of input.playerBoard) {
|
|
12
16
|
(0, stats_1.modifyStats)(target, minion, atk, hp, input.playerBoard, input.playerEntity, input.gameState);
|
|
13
17
|
}
|
|
@@ -17,9 +21,9 @@ exports.Hopebringer = {
|
|
|
17
21
|
if (input.newValue) {
|
|
18
22
|
return;
|
|
19
23
|
}
|
|
20
|
-
const
|
|
21
|
-
const atk = (minion.scriptDataNum1 ||
|
|
22
|
-
const hp = (minion.scriptDataNum2 ||
|
|
24
|
+
const base = baseBuff(minion);
|
|
25
|
+
const atk = (minion.scriptDataNum1 || base.attack) + base.attack;
|
|
26
|
+
const hp = (minion.scriptDataNum2 || base.health) + base.health;
|
|
23
27
|
minion.scriptDataNum1 = atk;
|
|
24
28
|
minion.scriptDataNum2 = hp;
|
|
25
29
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hopebringer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/hopebringer.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"hopebringer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/hopebringer.ts"],"names":[],"mappings":";;;AAcA,qDAAwD;AAGxD,MAAM,QAAQ,GAAG,CAAC,MAAmB,EAAsC,EAAE;IAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC;AAC/C,CAAC,CAAC;AAEW,QAAA,WAAW,GAAkD;IACzE,OAAO,EAAE,0BAA8D;IACvE,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC5E,MAAM,EAAE,GAAG,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3E,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,WAAW,EAAE;YACvC,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC7F;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,qBAAqB,EAAE,CAAC,MAAmB,EAAE,KAAiC,EAAE,EAAE;QACjF,IAAI,KAAK,CAAC,QAAQ,EAAE;YACnB,OAAO;SACP;QACD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QACjE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;QAChE,MAAM,CAAC,cAAc,GAAG,GAAG,CAAC;QAC5B,MAAM,CAAC,cAAc,GAAG,EAAE,CAAC;IAC5B,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Hopebringer (Tier 5, 3/3)\r\n * Start of Combat: Give your minions +4/+3.\r\n * Permanently improves by that amount after a friendly minion loses Divine Shield.\r\n * The current amounts are stored on scriptDataNum1 / scriptDataNum2.\r\n *\r\n * Golden Hopebringer (Tier 5, 6/6)\r\n * Start of Combat: Give your minions +8/+6, then the same permanent improvement.\r\n * A scaled copy already has the golden amounts stored, so combat does not double them again.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { OnDivineShieldUpdatedInput } from '../../../keywords/divine-shield';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnDivineShieldUpdatedCard, StartOfCombatCard } from '../../card.interface';\r\n\r\nconst baseBuff = (minion: BoardEntity): { attack: number; health: number } => {\r\n\tconst mult = minion.cardId === CardIds.Hopebringer_BG36_364_G ? 2 : 1;\r\n\treturn { attack: 4 * mult, health: 3 * mult };\r\n};\r\n\r\nexport const Hopebringer: StartOfCombatCard & OnDivineShieldUpdatedCard = {\r\n\tcardIds: [CardIds.Hopebringer_BG36_364, CardIds.Hopebringer_BG36_364_G],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tconst base = baseBuff(minion);\r\n\t\t// scriptDataNum1/2 are the improved values. 0 means this copy has not been scaled yet.\r\n\t\tconst atk = minion.scriptDataNum1 > 0 ? minion.scriptDataNum1 : base.attack;\r\n\t\tconst hp = minion.scriptDataNum2 > 0 ? minion.scriptDataNum2 : base.health;\r\n\t\tfor (const target of input.playerBoard) {\r\n\t\t\tmodifyStats(target, minion, atk, hp, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\tonDivineShieldUpdated: (minion: BoardEntity, input: OnDivineShieldUpdatedInput) => {\r\n\t\tif (input.newValue) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst base = baseBuff(minion);\r\n\t\tconst atk = (minion.scriptDataNum1 || base.attack) + base.attack;\r\n\t\tconst hp = (minion.scriptDataNum2 || base.health) + base.health;\r\n\t\tminion.scriptDataNum1 = atk;\r\n\t\tminion.scriptDataNum2 = hp;\r\n\t},\r\n};\r\n"]}
|
|
@@ -3,22 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.JailbirdJuggernaut = void 0;
|
|
4
4
|
const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
|
|
5
5
|
const spawns_1 = require("../../../simulation/spawns");
|
|
6
|
-
const BLOOD_GEM_ENCHANTMENTS = ["BG20_GEMe", "BG20_GEMe2"];
|
|
7
|
-
const getBloodGemStats = (minion) => {
|
|
8
|
-
var _a;
|
|
9
|
-
const enchantments = ((_a = minion.enchantments) !== null && _a !== void 0 ? _a : []).filter((e) => BLOOD_GEM_ENCHANTMENTS.includes(e.cardId));
|
|
10
|
-
return {
|
|
11
|
-
attack: Math.max(0, ...enchantments.map((e) => { var _a; return (_a = e.tagScriptDataNum1) !== null && _a !== void 0 ? _a : 0; })),
|
|
12
|
-
health: Math.max(0, ...enchantments.map((e) => { var _a; return (_a = e.tagScriptDataNum2) !== null && _a !== void 0 ? _a : 0; })),
|
|
13
|
-
};
|
|
14
|
-
};
|
|
15
6
|
exports.JailbirdJuggernaut = {
|
|
16
7
|
cardIds: ["BG36_333", "BG36_333_G"],
|
|
17
8
|
rally: (minion, input) => {
|
|
18
9
|
if (!input.defendingEntity) {
|
|
19
10
|
return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
|
|
20
11
|
}
|
|
21
|
-
const
|
|
12
|
+
const attack = input.attacker.attack;
|
|
13
|
+
const health = input.attacker.health;
|
|
22
14
|
const mult = minion.cardId === "BG36_333_G" ? 2 : 1;
|
|
23
15
|
const spawnInput = {
|
|
24
16
|
boardWithDeadEntity: input.attackingBoard,
|
|
@@ -36,10 +28,11 @@ exports.JailbirdJuggernaut = {
|
|
|
36
28
|
spawn.maxHealth = health * mult;
|
|
37
29
|
spawn.attackImmediately = true;
|
|
38
30
|
});
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
31
|
+
(0, spawns_1.performEntitySpawns)(spawns, input.attackingBoard, input.attackingHero, input.attacker, input.attackingBoard.length - input.attackingBoard.indexOf(input.attacker) - 1, input.defendingBoard, input.defendingHero, input.gameState, true, input.defendingEntity);
|
|
32
|
+
const defender = input.defendingEntity;
|
|
33
|
+
if (spawns.length > 0 && (defender.health <= 0 || defender.definitelyDead)) {
|
|
34
|
+
input.attacker.skipAttackDamage = true;
|
|
35
|
+
}
|
|
43
36
|
return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
|
|
44
37
|
},
|
|
45
38
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jailbird-juggernaut.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/jailbird-juggernaut.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"jailbird-juggernaut.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/jailbird-juggernaut.ts"],"names":[],"mappings":";;;AAcA,+EAAiF;AAEjF,uDAAiE;AAGpD,QAAA,kBAAkB,GAAc;IAC5C,OAAO,EAAE,0BAA4E;IACrF,KAAK,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QACpD,IAAI,CAAC,KAAK,CAAC,eAAe,EAAE;YAC3B,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,UAAU,GAA8B;YAC7C,mBAAmB,EAAE,KAAK,CAAC,cAAc;YACzC,uBAAuB,EAAE,KAAK,CAAC,aAAa;YAC5C,UAAU,EAAE,KAAK,CAAC,QAAQ;YAC1B,UAAU,EAAE,KAAK,CAAC,cAAc;YAChC,cAAc,EAAE,KAAK,CAAC,aAAa;YACnC,SAAS,EAAE,KAAK,CAAC,SAAS;SAC1B,CAAC;QACF,MAAM,MAAM,GAAG,IAAA,4CAAuB,yBAErC,CAAC,EACD,UAAU,CACV,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;YAC7B,KAAK,CAAC,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;YAChC,KAAK,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;YAC7B,KAAK,CAAC,SAAS,GAAG,MAAM,GAAG,IAAI,CAAC;YAChC,KAAK,CAAC,iBAAiB,GAAG,IAAI,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,IAAA,4BAAmB,EAClB,MAAM,EACN,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,QAAQ,EACd,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAC9E,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,EACf,IAAI,EACJ,KAAK,CAAC,eAAe,CACrB,CAAC;QAGF,MAAM,QAAQ,GAAG,KAAK,CAAC,eAAe,CAAC;QACvC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,QAAQ,CAAC,cAAc,CAAC,EAAE;YAC3E,KAAK,CAAC,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC;SACvC;QACD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Jailbird Juggernaut (Tier 5, 6/15)\r\n * Rally: Summon a Golem with this minion's stats to attack the target first.\r\n *\r\n * Golden Jailbird Juggernaut\r\n * Rally: Summon a Golem with double this minion's stats to attack the target first.\r\n *\r\n * The golem copies current attack and health, attacks the target, and is exhausted.\r\n * If that target is still alive, Jailbird's own damage exchange still happens,\r\n * including when the golem died on its attack. The swing still counts.\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 { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { RallyCard } from '../../card.interface';\r\n\r\nexport const JailbirdJuggernaut: RallyCard = {\r\n\tcardIds: [CardIds.JailbirdJuggernaut_BG36_333, CardIds.JailbirdJuggernaut_BG36_333_G],\r\n\trally: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tif (!input.defendingEntity) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst attack = input.attacker.attack;\r\n\t\tconst health = input.attacker.health;\r\n\t\tconst mult = minion.cardId === CardIds.JailbirdJuggernaut_BG36_333_G ? 2 : 1;\r\n\t\tconst spawnInput: DeathrattleTriggeredInput = {\r\n\t\t\tboardWithDeadEntity: input.attackingBoard,\r\n\t\t\tboardWithDeadEntityHero: input.attackingHero,\r\n\t\t\tdeadEntity: input.attacker,\r\n\t\t\totherBoard: input.defendingBoard,\r\n\t\t\totherBoardHero: input.defendingHero,\r\n\t\t\tgameState: input.gameState,\r\n\t\t};\r\n\t\tconst spawns = simplifiedSpawnEntities(\r\n\t\t\tCardIds.BloodGolemSticker_BloodGolemToken_BG30_MagicItem_442t,\r\n\t\t\t1,\r\n\t\t\tspawnInput,\r\n\t\t);\r\n\t\tspawns.forEach((spawn) => {\r\n\t\t\tspawn.attack = attack * mult;\r\n\t\t\tspawn.maxAttack = attack * mult;\r\n\t\t\tspawn.health = health * mult;\r\n\t\t\tspawn.maxHealth = health * mult;\r\n\t\t\tspawn.attackImmediately = true;\r\n\t\t});\r\n\t\tperformEntitySpawns(\r\n\t\t\tspawns,\r\n\t\t\tinput.attackingBoard,\r\n\t\t\tinput.attackingHero,\r\n\t\t\tinput.attacker,\r\n\t\t\tinput.attackingBoard.length - input.attackingBoard.indexOf(input.attacker) - 1,\r\n\t\t\tinput.defendingBoard,\r\n\t\t\tinput.defendingHero,\r\n\t\t\tinput.gameState,\r\n\t\t\ttrue,\r\n\t\t\tinput.defendingEntity,\r\n\t\t);\r\n\t\t// The golem's attack already resolved. Jailbird still trades when the target\r\n\t\t// survived, including when the golem died. A dead target ends the swing.\r\n\t\tconst defender = input.defendingEntity;\r\n\t\tif (spawns.length > 0 && (defender.health <= 0 || defender.definitelyDead)) {\r\n\t\t\tinput.attacker.skipAttackDamage = true;\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { BoardEntity } from '../../../board-entity';
|
|
2
|
-
export declare const buildSinrunnerBlanchyRebornEntity: (deadEntity: BoardEntity) => BoardEntity;
|
|
2
|
+
export declare const buildSinrunnerBlanchyRebornEntity: (deadEntity: BoardEntity, keepEnchantments?: boolean) => BoardEntity;
|
|
3
3
|
export declare const isSinrunnerBlanchy: (cardId: string) => boolean;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.isSinrunnerBlanchy = exports.buildSinrunnerBlanchyRebornEntity = void 0;
|
|
4
|
-
const buildSinrunnerBlanchyRebornEntity = (deadEntity) => {
|
|
4
|
+
const buildSinrunnerBlanchyRebornEntity = (deadEntity, keepEnchantments = false) => {
|
|
5
|
+
var _a;
|
|
5
6
|
return {
|
|
6
7
|
...deadEntity,
|
|
7
8
|
hasAttacked: undefined,
|
|
@@ -10,6 +11,7 @@ const buildSinrunnerBlanchyRebornEntity = (deadEntity) => {
|
|
|
10
11
|
reborn: false,
|
|
11
12
|
venomous: deadEntity.venomous || deadEntity.hadVenomous,
|
|
12
13
|
stealth: deadEntity.stealth || deadEntity.hadStealth,
|
|
14
|
+
enchantments: keepEnchantments ? [...((_a = deadEntity.enchantments) !== null && _a !== void 0 ? _a : [])] : [],
|
|
13
15
|
};
|
|
14
16
|
};
|
|
15
17
|
exports.buildSinrunnerBlanchyRebornEntity = buildSinrunnerBlanchyRebornEntity;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sinrunner-blanchy.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/sinrunner-blanchy.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"sinrunner-blanchy.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/sinrunner-blanchy.ts"],"names":[],"mappings":";;;AAQO,MAAM,iCAAiC,GAAG,CAChD,UAAuB,EACvB,gBAAgB,GAAG,KAAK,EACV,EAAE;;IAChB,OAAO;QACN,GAAG,UAAU;QACb,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,UAAU,CAAC,SAAS;QAC5B,YAAY,EAAE,UAAU,CAAC,eAAe;QACxC,MAAM,EAAE,KAAK;QACb,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,WAAW;QACvD,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,UAAU;QACpD,YAAY,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAA,UAAU,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;KAC1E,CAAC;AACH,CAAC,CAAC;AAdW,QAAA,iCAAiC,qCAc5C;AAEK,MAAM,kBAAkB,GAAG,CAAC,MAAc,EAAW,EAAE,CAC7D,MAAM,eAAsC,IAAI,MAAM,iBAAwC,CAAC;AADnF,QAAA,kBAAkB,sBACiE","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\n\r\n/**\r\n * Reborn with full stats and bonus keywords.\r\n * Keyword flags stay on the entity. Deathrattle and other enchantments do not,\r\n * except Ultra-Capacitor, which reborns with its enchantments.\r\n */\r\nexport const buildSinrunnerBlanchyRebornEntity = (\r\n\tdeadEntity: BoardEntity,\r\n\tkeepEnchantments = false,\r\n): BoardEntity => {\r\n\treturn {\r\n\t\t...deadEntity,\r\n\t\thasAttacked: undefined,\r\n\t\thealth: deadEntity.maxHealth,\r\n\t\tdivineShield: deadEntity.hadDivineShield,\r\n\t\treborn: false,\r\n\t\tvenomous: deadEntity.venomous || deadEntity.hadVenomous,\r\n\t\tstealth: deadEntity.stealth || deadEntity.hadStealth,\r\n\t\tenchantments: keepEnchantments ? [...(deadEntity.enchantments ?? [])] : [],\r\n\t};\r\n};\r\n\r\nexport const isSinrunnerBlanchy = (cardId: string): boolean =>\r\n\tcardId === CardIds.SinrunnerBlanchy_BG24_005 || cardId === CardIds.SinrunnerBlanchy_BG24_005_G;\r\n"]}
|
|
@@ -10,7 +10,7 @@ exports.WildfireElemental = {
|
|
|
10
10
|
return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
|
|
11
11
|
}
|
|
12
12
|
const hadVenomous = input.hadVenomous;
|
|
13
|
-
const excessDamage = -input.minionKilled.health;
|
|
13
|
+
const excessDamage = Math.max(0, -input.minionKilled.health);
|
|
14
14
|
let damageDoneByAttacker = 0;
|
|
15
15
|
if (input.defenderNeighbours.length > 0) {
|
|
16
16
|
if (minion.cardId === "BGS_126") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wildfire-elemental.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/wildfire-elemental.ts"],"names":[],"mappings":";;;AAEA,mDAAqD;AACrD,uDAAqF;AAGxE,QAAA,iBAAiB,GAAuB;IACpD,OAAO,EAAE,8BAA8E;IACvF,cAAc,EAAE,CACf,MAAmB,EACnB,KAA0B,EACiC,EAAE;QAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;YACxD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"wildfire-elemental.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/wildfire-elemental.ts"],"names":[],"mappings":";;;AAEA,mDAAqD;AACrD,uDAAqF;AAGxE,QAAA,iBAAiB,GAAuB;IACpD,OAAO,EAAE,8BAA8E;IACvF,cAAc,EAAE,CACf,MAAmB,EACnB,KAA0B,EACiC,EAAE;QAC7D,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,iBAAiB,EAAE;YACxD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAItC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC7D,IAAI,oBAAoB,GAAG,CAAC,CAAC;QAE7B,IAAI,KAAK,CAAC,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE;YACxC,IAAI,MAAM,CAAC,MAAM,cAAsC,EAAE;gBACxD,MAAM,YAAY,GAAG,IAAA,kBAAU,EAAC,KAAK,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;gBAClE,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,QAAQ,GAAG,WAAW,CAAC;gBAC/D,oBAAoB,IAAI,IAAA,2BAAkB,EACzC,YAAY,EACZ,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CAAC,oBAAoB,EACvC,YAAY,EACZ,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,QAAQ,GAAG,KAAK,CAAC;aACzD;iBAAM;gBACN,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,kBAAkB,EAAE;oBACjD,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,QAAQ,GAAG,WAAW,CAAC;oBAC/D,oBAAoB,IAAI,IAAA,2BAAkB,EACzC,SAAS,EACT,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CAAC,oBAAoB,EACvC,YAAY,EACZ,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,CACf,CAAC;oBACF,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,QAAQ,GAAG,KAAK,CAAC;iBACzD;aACD;SACD;QACD,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IAC1E,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { pickRandom } from '../../../services/utils';\r\nimport { dealDamageToMinion, OnMinionKilledInput } from '../../../simulation/attack';\r\nimport { OnMinionKilledCard } from '../../card.interface';\r\n\r\nexport const WildfireElemental: OnMinionKilledCard = {\r\n\tcardIds: [CardIds.WildfireElemental_BGS_126, CardIds.WildfireElemental_TB_BaconUps_166],\r\n\tonMinionKilled: (\r\n\t\tminion: BoardEntity,\r\n\t\tinput: OnMinionKilledInput,\r\n\t): { dmgDoneByAttacker: number; dmgDoneByDefender: number } => {\r\n\t\tif (input.killer !== minion || !input.killerIsAttacking) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst hadVenomous = input.hadVenomous;\r\n\t\t// Venomous and Poisonous leave health positive when they kill without overkill.\r\n\t\t// Negative \"excess\" still counts as an attack, so the splash would apply Venomous\r\n\t\t// to a neighbour that took no damage.\r\n\t\tconst excessDamage = Math.max(0, -input.minionKilled.health);\r\n\t\tlet damageDoneByAttacker = 0;\r\n\t\t// console.log('neighbours', stringifySimple(neighbours, allCards));\r\n\t\tif (input.defenderNeighbours.length > 0) {\r\n\t\t\tif (minion.cardId === CardIds.WildfireElemental_BGS_126) {\r\n\t\t\t\tconst randomTarget = pickRandom(input.defenderNeighbours, minion);\r\n\t\t\t\tinput.minionKilled.lastAffectedByEntity.venomous = hadVenomous;\r\n\t\t\t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t\t\t\t\trandomTarget,\r\n\t\t\t\t\tinput.defendingBoard,\r\n\t\t\t\t\tinput.defendingHero,\r\n\t\t\t\t\tinput.minionKilled.lastAffectedByEntity,\r\n\t\t\t\t\texcessDamage,\r\n\t\t\t\t\tinput.attackingBoard,\r\n\t\t\t\t\tinput.attackingHero,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tinput.minionKilled.lastAffectedByEntity.venomous = false;\r\n\t\t\t} else {\r\n\t\t\t\tfor (const neighbour of input.defenderNeighbours) {\r\n\t\t\t\t\tinput.minionKilled.lastAffectedByEntity.venomous = hadVenomous;\r\n\t\t\t\t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t\t\t\t\t\tneighbour,\r\n\t\t\t\t\t\tinput.defendingBoard,\r\n\t\t\t\t\t\tinput.defendingHero,\r\n\t\t\t\t\t\tinput.minionKilled.lastAffectedByEntity,\r\n\t\t\t\t\t\texcessDamage,\r\n\t\t\t\t\t\tinput.attackingBoard,\r\n\t\t\t\t\t\tinput.attackingHero,\r\n\t\t\t\t\t\tinput.gameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tinput.minionKilled.lastAffectedByEntity.venomous = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: damageDoneByAttacker, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
|