@firestone-hs/simulate-bgs-battle 1.1.759 → 1.1.762

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/board-entity.d.ts +1 -0
  2. package/dist/board-entity.js.map +1 -1
  3. package/dist/cards/cards-data.d.ts +1 -0
  4. package/dist/cards/cards-data.js +5 -0
  5. package/dist/cards/cards-data.js.map +1 -1
  6. package/dist/cards/impl/bg-spell/brood-of-nozdormu.js +1 -1
  7. package/dist/cards/impl/bg-spell/brood-of-nozdormu.js.map +1 -1
  8. package/dist/cards/impl/enchantments/deaths-embrace.js +1 -3
  9. package/dist/cards/impl/enchantments/deaths-embrace.js.map +1 -1
  10. package/dist/cards/impl/enchantments/doppelganger.js +1 -1
  11. package/dist/cards/impl/enchantments/doppelganger.js.map +1 -1
  12. package/dist/cards/impl/enchantments/spell-siphon.d.ts +2 -2
  13. package/dist/cards/impl/enchantments/spell-siphon.js +46 -5
  14. package/dist/cards/impl/enchantments/spell-siphon.js.map +1 -1
  15. package/dist/cards/impl/minion/bramble-tunneler.js +1 -1
  16. package/dist/cards/impl/minion/bramble-tunneler.js.map +1 -1
  17. package/dist/cards/impl/minion/drustfallen-butcher.js +1 -1
  18. package/dist/cards/impl/minion/drustfallen-butcher.js.map +1 -1
  19. package/dist/cards/impl/minion/faceless-converter.js +4 -2
  20. package/dist/cards/impl/minion/faceless-converter.js.map +1 -1
  21. package/dist/cards/impl/minion/joyous.js +2 -3
  22. package/dist/cards/impl/minion/joyous.js.map +1 -1
  23. package/dist/cards/impl/minion/lurking-leviathan.js +2 -1
  24. package/dist/cards/impl/minion/lurking-leviathan.js.map +1 -1
  25. package/dist/cards/impl/minion/relentless-deflector.js +3 -0
  26. package/dist/cards/impl/minion/relentless-deflector.js.map +1 -1
  27. package/dist/cards/impl/minion/sinrunner-blanchy.js +1 -0
  28. package/dist/cards/impl/minion/sinrunner-blanchy.js.map +1 -1
  29. package/dist/cards/impl/minion/tasty-lobster.js +3 -1
  30. package/dist/cards/impl/minion/tasty-lobster.js.map +1 -1
  31. package/dist/cards/impl/minion/the-shadow-of-doubt.js +3 -2
  32. package/dist/cards/impl/minion/the-shadow-of-doubt.js.map +1 -1
  33. package/dist/cards/impl/minion/underrot-spawn.js +1 -1
  34. package/dist/cards/impl/minion/underrot-spawn.js.map +1 -1
  35. package/dist/cards/impl/minion/vicious-mindslasher.js +3 -2
  36. package/dist/cards/impl/minion/vicious-mindslasher.js.map +1 -1
  37. package/dist/cards/impl/minion/wildfire-elemental.js +2 -1
  38. package/dist/cards/impl/minion/wildfire-elemental.js.map +1 -1
  39. package/dist/cards/impl/trinket/hammer-of-twilight.js +10 -3
  40. package/dist/cards/impl/trinket/hammer-of-twilight.js.map +1 -1
  41. package/dist/input-sanitation.js +1 -0
  42. package/dist/input-sanitation.js.map +1 -1
  43. package/dist/simulation/death-effects.js +3 -0
  44. package/dist/simulation/death-effects.js.map +1 -1
  45. package/dist/simulation/deathrattle-orchestration.js +2 -1
  46. package/dist/simulation/deathrattle-orchestration.js.map +1 -1
  47. package/dist/simulation/minion-death.js +5 -1
  48. package/dist/simulation/minion-death.js.map +1 -1
  49. package/dist/simulation/simulator.js +5 -11
  50. package/dist/simulation/simulator.js.map +1 -1
  51. package/dist/simulation/start-of-combat/soc-action-processor.d.ts +1 -1
  52. package/dist/simulation/start-of-combat/soc-action-processor.js +10 -8
  53. package/dist/simulation/start-of-combat/soc-action-processor.js.map +1 -1
  54. package/dist/simulation/start-of-combat/soc-minion.js +3 -12
  55. package/dist/simulation/start-of-combat/soc-minion.js.map +1 -1
  56. package/dist/simulation/summon-when-space.js +1 -0
  57. package/dist/simulation/summon-when-space.js.map +1 -1
  58. package/package.json +2 -2
@@ -15,6 +15,7 @@ export interface BoardEntity {
15
15
  extraDivineShieldCharges?: number;
16
16
  poisonous?: boolean;
17
17
  hadVenomous?: boolean;
18
+ hadStealth?: boolean;
18
19
  venomous?: boolean;
19
20
  reborn?: boolean;
20
21
  rebornFromEntityId?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"board-entity.js","sourceRoot":"","sources":["../src/board-entity.ts"],"names":[],"mappings":"","sourcesContent":["export interface BoardEntity {\r\n\tentityId: number;\r\n\tcardId: string;\r\n\tattack: number;\r\n\thealth: number;\r\n\r\n\tmaxHealth?: number;\r\n\tmaxAttack?: number;\r\n\tavengeCurrent?: number;\r\n\tavengeDefault?: number;\r\n\tfrenzyChargesLeft?: number;\r\n\tdefinitelyDead?: boolean;\r\n\ttaunt?: boolean;\r\n\tdivineShield?: boolean;\r\n\tstrongDivineShield?: boolean;\r\n\t// Number of times the Divine Shield survives being popped, on top of `strongDivineShield`\r\n\textraDivineShieldCharges?: number;\r\n\tpoisonous?: boolean;\r\n\t// Used for Persisting Horror\r\n\thadVenomous?: boolean;\r\n\tvenomous?: boolean;\r\n\treborn?: boolean;\r\n\trebornFromEntityId?: number;\r\n\tcleave?: boolean;\r\n\twindfury?: boolean;\r\n\tstealth?: boolean;\r\n\tenchantments?: BoardEnchantment[];\r\n\tpendingAttackBuffs?: number[];\r\n\tscriptDataNum1?: number;\r\n\tscriptDataNum2?: number;\r\n\tscriptDataNum3?: number;\r\n\tscriptDataNum4?: number;\r\n\tscriptDataNum5?: number;\r\n\tscriptDataNum6?: number;\r\n\tinInitialState?: boolean;\r\n\t// For Build-An-Undead and Zilliax\r\n\tadditionalCards?: readonly string[] | null;\r\n\tdynamicInfo?: readonly any[] | null;\r\n\ttags?: { [tag: number]: number };\r\n\r\n\t// When using this as a remembered deathrattle\r\n\toriginalCardId?: string;\r\n\r\n\t// We only store the card id, because we want all the attack and other data to be computed at runtime, based on the\r\n\t// current stats of the Fish\r\n\trememberedDeathrattles?: BoardEnchantment[];\r\n\tdeathrattleRepeats?: number;\r\n\tdamageMultiplier?: number;\r\n\tlocked?: boolean;\r\n\tfriendly?: boolean;\r\n\tcantAttack?: boolean;\r\n\thasAttacked?: number;\r\n\timmuneWhenAttackCharges?: number;\r\n\tattackImmediately?: boolean;\r\n\t// Used only to handle murkeye aura?\r\n\tpreviousAttack?: number;\r\n\tlastAffectedByEntity?: BoardEntity;\r\n\t// attacking?: boolean;\r\n\t// Did it have divine shield at least once? (for Sinrunner Blanchy)\r\n\thadDivineShield?: boolean;\r\n\tabiityChargesLeft?: number;\r\n\tindexFromLeftAtTimeOfDeath?: number;\r\n\tspawnIndexFromRight?: number;\r\n\r\n\t// permanentAttack?: number;\r\n\t// permanentHealth?: number;\r\n\ttavernTier?: number;\r\n\r\n\tmemory?: any;\r\n\tgildedInCombat?: boolean;\r\n\r\n\tonCanceledSummon?: () => void;\r\n\tonResolve?: (() => void)[];\r\n}\r\n\r\nexport interface BoardEnchantment {\r\n\tcardId: string;\r\n\toriginEntityId?: number;\r\n\ttagScriptDataNum1?: number;\r\n\ttagScriptDataNum2?: number;\r\n\ttiming: number;\r\n\trepeats?: number;\r\n\tvalue?: number;\r\n\tmemory?: any;\r\n}\r\n"]}
1
+ {"version":3,"file":"board-entity.js","sourceRoot":"","sources":["../src/board-entity.ts"],"names":[],"mappings":"","sourcesContent":["export interface BoardEntity {\r\n\tentityId: number;\r\n\tcardId: string;\r\n\tattack: number;\r\n\thealth: number;\r\n\r\n\tmaxHealth?: number;\r\n\tmaxAttack?: number;\r\n\tavengeCurrent?: number;\r\n\tavengeDefault?: number;\r\n\tfrenzyChargesLeft?: number;\r\n\tdefinitelyDead?: boolean;\r\n\ttaunt?: boolean;\r\n\tdivineShield?: boolean;\r\n\tstrongDivineShield?: boolean;\r\n\t// Number of times the Divine Shield survives being popped, on top of `strongDivineShield`\r\n\textraDivineShieldCharges?: number;\r\n\tpoisonous?: boolean;\r\n\t// Used for Persisting Horror\r\n\thadVenomous?: boolean;\r\n\thadStealth?: boolean;\r\n\tvenomous?: boolean;\r\n\treborn?: boolean;\r\n\trebornFromEntityId?: number;\r\n\tcleave?: boolean;\r\n\twindfury?: boolean;\r\n\tstealth?: boolean;\r\n\tenchantments?: BoardEnchantment[];\r\n\tpendingAttackBuffs?: number[];\r\n\tscriptDataNum1?: number;\r\n\tscriptDataNum2?: number;\r\n\tscriptDataNum3?: number;\r\n\tscriptDataNum4?: number;\r\n\tscriptDataNum5?: number;\r\n\tscriptDataNum6?: number;\r\n\tinInitialState?: boolean;\r\n\t// For Build-An-Undead and Zilliax\r\n\tadditionalCards?: readonly string[] | null;\r\n\tdynamicInfo?: readonly any[] | null;\r\n\ttags?: { [tag: number]: number };\r\n\r\n\t// When using this as a remembered deathrattle\r\n\toriginalCardId?: string;\r\n\r\n\t// We only store the card id, because we want all the attack and other data to be computed at runtime, based on the\r\n\t// current stats of the Fish\r\n\trememberedDeathrattles?: BoardEnchantment[];\r\n\tdeathrattleRepeats?: number;\r\n\tdamageMultiplier?: number;\r\n\tlocked?: boolean;\r\n\tfriendly?: boolean;\r\n\tcantAttack?: boolean;\r\n\thasAttacked?: number;\r\n\timmuneWhenAttackCharges?: number;\r\n\tattackImmediately?: boolean;\r\n\t// Used only to handle murkeye aura?\r\n\tpreviousAttack?: number;\r\n\tlastAffectedByEntity?: BoardEntity;\r\n\t// attacking?: boolean;\r\n\t// Did it have divine shield at least once? (for Sinrunner Blanchy)\r\n\thadDivineShield?: boolean;\r\n\tabiityChargesLeft?: number;\r\n\tindexFromLeftAtTimeOfDeath?: number;\r\n\tspawnIndexFromRight?: number;\r\n\r\n\t// permanentAttack?: number;\r\n\t// permanentHealth?: number;\r\n\ttavernTier?: number;\r\n\r\n\tmemory?: any;\r\n\tgildedInCombat?: boolean;\r\n\r\n\tonCanceledSummon?: () => void;\r\n\tonResolve?: (() => void)[];\r\n}\r\n\r\nexport interface BoardEnchantment {\r\n\tcardId: string;\r\n\toriginEntityId?: number;\r\n\ttagScriptDataNum1?: number;\r\n\ttagScriptDataNum2?: number;\r\n\ttiming: number;\r\n\trepeats?: number;\r\n\tvalue?: number;\r\n\tmemory?: any;\r\n}\r\n"]}
@@ -36,6 +36,7 @@ export declare class CardsData {
36
36
  getRandomMagneticVolumizer(playerEntity: BgsPlayerEntity, anomalies: readonly string[], tavernLimitUpper: number, sourceEntity?: BoardEntity, targetEntity?: BoardEntity): string;
37
37
  getRandomDivineShield(tavernLimitUpper: number): string;
38
38
  getRandomRally(tavernLimitUpper: number): string;
39
+ getRandomChooseOneCard(): string;
39
40
  getRandomMinionForTribe(tribe: Race, tavernLimitUpper: number, excludedCards?: readonly string[]): string;
40
41
  getRandomMinionWithType(): string;
41
42
  getRandomProtossMinion(tavernLimitUpper: number): string;
@@ -280,6 +280,11 @@ class CardsData {
280
280
  const pool = targetPool.filter((m) => m.techLevel <= tavernLimitUpper);
281
281
  return (_a = (0, utils_1.pickRandom)(pool)) === null || _a === void 0 ? void 0 : _a.id;
282
282
  }
283
+ getRandomChooseOneCard() {
284
+ var _a;
285
+ const pool = this.pool.filter((m) => (0, utils_2.hasMechanic)(m, reference_data_1.GameTag.CHOOSE_ONE));
286
+ return (_a = (0, utils_1.pickRandom)(pool)) === null || _a === void 0 ? void 0 : _a.id;
287
+ }
283
288
  getRandomMinionForTribe(tribe, tavernLimitUpper, excludedCards = []) {
284
289
  var _a;
285
290
  const pool = this.pool
@@ -1 +1 @@
1
- {"version":3,"file":"cards-data.js","sourceRoot":"","sources":["../../src/cards/cards-data.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n\tAllCardsService,\r\n\tCardType,\r\n\tGameTag,\r\n\tisBattlegroundsCard,\r\n\tRace,\r\n\tReferenceCard,\r\n\tSpellSchool,\r\n} from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { debugState } from '../debug-state';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { getRaceEnum, hasMechanic, isCorrectTribe, isVolumizer } from '../utils';\r\nimport { hasAvenge, hasDefaultScriptDataNum } from './card.interface';\r\nimport { cardMappings } from './impl/_card-mappings';\r\n\r\n/** `getCards()` copies the full DB; intern per card service. */\r\nconst allCardsListCache = new WeakMap<AllCardsService, readonly ReferenceCard[]>();\r\nconst baconMinionsCache = new WeakMap<AllCardsService, readonly ReferenceCard[]>();\r\nconst tribeIndependentCache = new WeakMap<\r\n\tAllCardsService,\r\n\t{\r\n\t\tspellcraftPool: readonly ReferenceCard[];\r\n\t\tbountyTavernSpellIds: readonly string[];\r\n\t\tputricidePool1: readonly string[];\r\n\t\tputricidePool2: readonly string[];\r\n\t\tputridicePool2ForEternalSummoner: readonly string[];\r\n\t}\r\n>();\r\n\r\nconst allCardsList = (allCards: AllCardsService): readonly ReferenceCard[] => {\r\n\tconst hit = allCardsListCache.get(allCards);\r\n\tif (hit) {\r\n\t\treturn hit;\r\n\t}\r\n\tconst list = allCards.getCards();\r\n\tallCardsListCache.set(allCards, list);\r\n\treturn list;\r\n};\r\n\r\nconst baconMinions = (allCards: AllCardsService): readonly ReferenceCard[] => {\r\n\tconst hit = baconMinionsCache.get(allCards);\r\n\tif (hit) {\r\n\t\treturn hit;\r\n\t}\r\n\tconst list = allCardsList(allCards)\r\n\t\t.filter((card) => isBattlegroundsCard(card))\r\n\t\t.filter((card) => card.isBaconPool || allCards.getCard(card.battlegroundsNormalDbfId)?.isBaconPool)\r\n\t\t.filter((card) => card.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t.filter((card) => !hasMechanic(card, GameTag.BACON_BUDDY))\r\n\t\t.filter((card) => card.set !== 'Vanilla');\r\n\tbaconMinionsCache.set(allCards, list);\r\n\treturn list;\r\n};\r\n\r\nconst tribeIndependentLists = (allCards: AllCardsService) => {\r\n\tconst hit = tribeIndependentCache.get(allCards);\r\n\tif (hit) {\r\n\t\treturn hit;\r\n\t}\r\n\tconst all = allCardsList(allCards);\r\n\tconst next = {\r\n\t\tspellcraftPool: all\r\n\t\t\t.filter((c) => c.spellSchool === SpellSchool[SpellSchool.SPELLCRAFT])\r\n\t\t\t.filter((c) => !c.premium)\r\n\t\t\t.filter((c) => c.set === 'Battlegrounds')\r\n\t\t\t.filter((c) => cardMappings[c.id] != null),\r\n\t\tbountyTavernSpellIds: all\r\n\t\t\t.filter((c) => c.set === 'Battlegrounds' && !c.premium)\r\n\t\t\t.filter((c) => c.type?.toUpperCase() === CardType[CardType.SPELL])\r\n\t\t\t.filter((c) => c.mechanics?.includes('BACON_BOUNTY'))\r\n\t\t\t.filter((c) => cardMappings[c.id] != null)\r\n\t\t\t.map((c) => c.id),\r\n\t\tputricidePool1: all.filter((card) => card.battlegroundsPutridicePool1).map((card) => card.id),\r\n\t\tputricidePool2: all.filter((card) => card.battlegroundsPutridicePool2).map((card) => card.id),\r\n\t\tputridicePool2ForEternalSummoner: all\r\n\t\t\t.filter((card) => card.battlegroundsPutridicePool2)\r\n\t\t\t.filter((card) => !card.battlegroundsPutridiceSummonerExclusion)\r\n\t\t\t.map((card) => card.id),\r\n\t};\r\n\ttribeIndependentCache.set(allCards, next);\r\n\treturn next;\r\n};\r\n\r\nexport const isWhelp = (cardId: string, allCards: AllCardsService): boolean => {\r\n\treturn allCards.getCard(cardId).mechanics?.includes(GameTag[GameTag.WHELP]);\r\n};\r\n\r\nexport const validBonusKeywords = [\r\n\tGameTag.TAUNT,\r\n\tGameTag.DIVINE_SHIELD,\r\n\tGameTag.VENOMOUS,\r\n\tGameTag.POISONOUS,\r\n\tGameTag.WINDFURY,\r\n\tGameTag.STEALTH,\r\n\tGameTag.REBORN,\r\n];\r\n\r\nexport const hasKeyword = (entity: BoardEntity, keyword: GameTag) => {\r\n\tswitch (keyword) {\r\n\t\tcase GameTag.TAUNT:\r\n\t\t\treturn entity.taunt;\r\n\t\tcase GameTag.DIVINE_SHIELD:\r\n\t\t\treturn entity.divineShield;\r\n\t\tcase GameTag.VENOMOUS:\r\n\t\t\treturn entity.venomous;\r\n\t\tcase GameTag.WINDFURY:\r\n\t\t\treturn entity.windfury;\r\n\t\tcase GameTag.STEALTH:\r\n\t\t\treturn entity.stealth;\r\n\t\tcase GameTag.REBORN:\r\n\t\t\treturn entity.reborn;\r\n\t\tdefault:\r\n\t\t\treturn false;\r\n\t}\r\n};\r\n\r\nexport class CardsData {\r\n\tpublic ghastcoilerSpawns: readonly string[];\r\n\tpublic impMamaSpawns: readonly string[];\r\n\tpublic demonSpawns: readonly string[];\r\n\tpublic gentleDjinniSpawns: readonly string[];\r\n\tpublic kilrekSpawns: readonly string[];\r\n\tpublic battlecryMinions: readonly string[];\r\n\tpublic deathrattleMinions: readonly string[];\r\n\tpublic pirateSpawns: readonly string[];\r\n\tpublic beastSpawns: readonly string[];\r\n\tpublic scrapScraperSpawns: readonly string[];\r\n\t/** Tavern spells with BACON_BOUNTY (Proud Privateer, Lost City Looter). */\r\n\tpublic bountyTavernSpellIds: readonly string[];\r\n\tpublic endOfTurnMinions: readonly string[];\r\n\tpublic magneticMinions: readonly ReferenceCard[];\r\n\tpublic spellcraftPool: readonly ReferenceCard[];\r\n\r\n\tpublic putricidePool1: readonly string[];\r\n\tpublic putricidePool2: readonly string[];\r\n\tpublic putridicePool2ForEternalSummoner: readonly string[];\r\n\r\n\tprivate pool: readonly ReferenceCard[];\r\n\tprivate minionsForTier: { [key: string]: readonly ReferenceCard[] };\r\n\r\n\tconstructor(private readonly allCards: AllCardsService, init = true) {\r\n\t\tif (init) {\r\n\t\t\tthis.inititialize();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic inititialize(validTribes?: readonly Race[], anomalies?: readonly string[]): void {\r\n\t\tconst poolWithGolden = baconMinions(this.allCards).filter((card) =>\r\n\t\t\tanomalies?.includes(CardIds.BigLeague_BG27_Anomaly_100)\r\n\t\t\t\t? card.techLevel >= 3\r\n\t\t\t\t: anomalies?.includes(CardIds.LittleLeague_BG27_Anomaly_800)\r\n\t\t\t\t? card.techLevel <= 4\r\n\t\t\t\t: true,\r\n\t\t);\r\n\t\tthis.pool = poolWithGolden\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.races))\r\n\t\t\t.filter((card) =>\r\n\t\t\t\tanomalies?.includes(CardIds.TheGoldenArena_BG27_Anomaly_801)\r\n\t\t\t\t\t? this.isGolden(card)\r\n\t\t\t\t\t: !this.isGolden(card),\r\n\t\t\t);\r\n\t\tthis.minionsForTier = groupByFunction((card: ReferenceCard) => card.techLevel)(this.pool);\r\n\t\tthis.ghastcoilerSpawns = this.pool\r\n\t\t\t.filter((card) => card.id !== 'BGS_008')\r\n\t\t\t.filter((card) => hasMechanic(card, GameTag.DEATHRATTLE))\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.races))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.demonSpawns = this.pool.filter((card) => isCorrectTribe(card.races, Race.DEMON)).map((card) => card.id);\r\n\t\tthis.impMamaSpawns = this.demonSpawns.filter((cardId) => cardId !== CardIds.ImpMama_BGS_044);\r\n\t\tthis.gentleDjinniSpawns = this.pool\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.ELEMENTAL))\r\n\t\t\t.filter((card) => card.id !== CardIds.GentleDjinni_BGS_121)\r\n\t\t\t.map((card) => card.id);\r\n\t\t// FIXME: just spawn a random undead instead of an Undead Creation\r\n\t\t// this.festergutSpawns = pool\r\n\t\t// \t.filter((card) => !this.isGolden(card))\r\n\t\t// \t.filter((card) => isCorrectTribe(card.races, Race.UNDEAD))\r\n\t\t// \t.filter((card) => card.id !== CardIds.Festergut_BG25_HERO_100_Buddy)\r\n\t\t// \t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t// \t.map((card) => card.id);\r\n\t\tthis.kilrekSpawns = this.pool\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.DEMON))\r\n\t\t\t.filter((card) => card.id !== CardIds.Kilrek_TB_BaconShop_HERO_37_Buddy)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.battlecryMinions = this.pool.filter((card) => hasMechanic(card, GameTag.BATTLECRY)).map((card) => card.id);\r\n\t\tthis.deathrattleMinions = this.pool\r\n\t\t\t.filter((card) => hasMechanic(card, GameTag.DEATHRATTLE))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.pirateSpawns = this.pool.filter((card) => isCorrectTribe(card.races, Race.PIRATE)).map((card) => card.id);\r\n\t\tthis.beastSpawns = this.pool.filter((card) => isCorrectTribe(card.races, Race.BEAST)).map((card) => card.id);\r\n\t\tthis.scrapScraperSpawns = this.pool\r\n\t\t\t.filter((card) => hasMechanic(card, GameTag.MAGNETIC))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.endOfTurnMinions = this.pool\r\n\t\t\t.filter((card) => hasMechanic(card, GameTag.END_OF_TURN))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.magneticMinions = this.pool.filter((card) => hasMechanic(card, GameTag.MAGNETIC));\r\n\t\tconst shared = tribeIndependentLists(this.allCards);\r\n\t\tthis.spellcraftPool = shared.spellcraftPool;\r\n\t\tthis.bountyTavernSpellIds = shared.bountyTavernSpellIds;\r\n\t\tthis.putricidePool1 = shared.putricidePool1;\r\n\t\tthis.putricidePool2 = shared.putricidePool2;\r\n\t\tthis.putridicePool2ForEternalSummoner = shared.putridicePool2ForEternalSummoner;\r\n\t}\r\n\r\n\tpublic avengeValue(cardId: string): number {\r\n\t\tconst avengeImpl = cardMappings[cardId];\r\n\t\tif (hasAvenge(avengeImpl)) {\r\n\t\t\treturn avengeImpl.baseAvengeValue(cardId);\r\n\t\t}\r\n\t\tswitch (cardId) {\r\n\t\t\tcase CardIds.HungeringAbomination_BG25_014:\r\n\t\t\tcase CardIds.HungeringAbomination_BG25_014_G:\r\n\t\t\t\t// case CardIds.IceSickle:\r\n\t\t\t\treturn 1;\r\n\t\t\tcase CardIds.MechanoTank_BG21_023:\r\n\t\t\tcase CardIds.MechanoTank_BG21_023_G:\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001_G:\r\n\t\t\tcase CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy:\r\n\t\t\tcase CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy_G:\r\n\t\t\tcase CardIds.Bristlebach_BG26_157:\r\n\t\t\tcase CardIds.Bristlebach_BG26_157_G:\r\n\t\t\t\treturn 2;\r\n\t\t\tcase CardIds.BoomSquad_BG27_Reward_502:\r\n\t\t\tcase CardIds.TremblingTrolley_BG28_967:\r\n\t\t\tcase CardIds.TremblingTrolley_BG28_967_G:\r\n\t\t\t\treturn 3;\r\n\t\t\tcase CardIds.Onyxia_Broodmother:\r\n\t\t\tcase CardIds.ImpatientDoomsayer_BG21_007:\r\n\t\t\tcase CardIds.ImpatientDoomsayer_BG21_007_G:\r\n\t\t\t// case CardIds.Sisefin_BG21_009:\r\n\t\t\t// case CardIds.Sisefin_BG21_009_G:\r\n\t\t\t// case CardIds.TonyTwoTusk_BG21_031:\r\n\t\t\t// case CardIds.TonyTwoTusk_BG21_031_G:\r\n\t\t\t// case CardIds.ScrapScraper_BG26_148:\r\n\t\t\t// case CardIds.ScrapScraper_BG26_148_G:\r\n\t\t\tcase CardIds.RelentlessSentry_BG25_003:\r\n\t\t\tcase CardIds.RelentlessSentry_BG25_003_G:\r\n\t\t\tcase CardIds.PhaerixWrathOfTheSun_BG28_403:\r\n\t\t\tcase CardIds.PhaerixWrathOfTheSun_BG28_403_G:\r\n\t\t\tcase CardIds.TumblingDisaster_BG28_Reward_505:\r\n\t\t\tcase CardIds.CycleOfEnergy_BG28_Reward_504:\r\n\t\t\tcase CardIds.AugmentedLaborer_BG28_740:\r\n\t\t\tcase CardIds.AugmentedLaborer_BG28_740_G:\r\n\t\t\tcase CardIds.MurglMkIi_BG29_991:\r\n\t\t\tcase CardIds.MurglMkIi_BG29_991_G:\r\n\t\t\t\treturn 4;\r\n\t\t\tcase CardIds.RelentlessMurghoul_BG27_010:\r\n\t\t\tcase CardIds.RelentlessMurghoul_BG27_010_G:\r\n\t\t\tcase CardIds.StaffOfTheScourge_BG30_MagicItem_437:\r\n\t\t\t\treturn 5;\r\n\t\t\tcase CardIds.StableAmalgamation_BG28_Reward_518:\r\n\t\t\t\treturn 7;\r\n\t\t\tcase CardIds.BleedingHeart_BG30_MagicItem_713:\r\n\t\t\t\treturn 8;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tpublic defaultScriptDataNum(cardId: string): number {\r\n\t\tconst defaultScriptDataNumImpl = cardMappings[cardId];\r\n\t\tif (hasDefaultScriptDataNum(defaultScriptDataNumImpl)) {\r\n\t\t\treturn defaultScriptDataNumImpl.defaultScriptDataNum(cardId);\r\n\t\t}\r\n\t\tswitch (cardId) {\r\n\t\t\tcase CardIds.TumblingDisaster_BG28_Reward_505:\r\n\t\t\tcase CardIds.TwinSkyLanterns_BG30_MagicItem_822:\r\n\t\t\tcase CardIds.TwinSkyLanterns_TwinSkyLanternsToken_BG30_MagicItem_822t2:\r\n\t\t\tcase CardIds.BoomController_BG30_MagicItem_440:\r\n\t\t\tcase CardIds.AllianceKeychain_BG30_MagicItem_433:\r\n\t\t\tcase CardIds.AllianceKeychain_AllianceKeychainToken_BG30_MagicItem_433t:\r\n\t\t\tcase CardIds.DeathlyPhylactery_BG30_MagicItem_700:\r\n\t\t\tcase CardIds.PromoPortrait_BG30_MagicItem_918:\r\n\t\t\t\treturn 1;\r\n\t\t\tcase CardIds.BloodGolemSticker_BG30_MagicItem_442:\r\n\t\t\tcase CardIds.MechagonAdapter_BG30_MagicItem_910:\r\n\t\t\tcase CardIds.FaerieDragonScale_BG32_MagicItem_363:\r\n\t\t\t\treturn 3;\r\n\t\t\tdefault:\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getTavernLevel(cardId: string): number {\r\n\t\treturn this.allCards.getCard(cardId).techLevel ?? 1;\r\n\t}\r\n\r\n\tpublic getRandomMinionForTavernTier(tavernTier: number): string {\r\n\t\t// Tzvern tier can be undefined for hero-power specific tokens, like the Amalgam, or when\r\n\t\t// for some reason tokens end up in the shop. For now, defaulting to 1 for tavern\r\n\t\t// level seems to work in all cases\r\n\t\tconst minionsForTier = this.minionsForTier[tavernTier ?? 1];\r\n\t\tif (!minionsForTier?.length) {\r\n\t\t\tconsole.error('incorrect minions for tier', tavernTier);\r\n\t\t}\r\n\t\treturn pickRandom(minionsForTier)?.id;\r\n\t}\r\n\r\n\tpublic getRandomMinionForMinTavernTier(tavernTier: number): string {\r\n\t\tconst minionsForTier = this.pool.filter((m) => m.techLevel >= tavernTier);\r\n\t\tif (!minionsForTier?.length) {\r\n\t\t\tconsole.error('incorrect minions for tier', tavernTier);\r\n\t\t}\r\n\t\treturn pickRandom(minionsForTier)?.id;\r\n\t}\r\n\r\n\tpublic getRandomMechToMagnetize(tavernLimitUpper: number): string {\r\n\t\tconst magneticMechs = this.pool\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => hasMechanic(m, GameTag.MODULAR));\r\n\t\tconst pool = magneticMechs.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomMagneticVolumizer(\r\n\t\tplayerEntity: BgsPlayerEntity,\r\n\t\tanomalies: readonly string[],\r\n\t\ttavernLimitUpper: number,\r\n\t\tsourceEntity?: BoardEntity,\r\n\t\ttargetEntity?: BoardEntity,\r\n\t): string {\r\n\t\tconst magneticVolumizers = this.magneticMinions.filter((m) =>\r\n\t\t\tisVolumizer(m.id, playerEntity, anomalies, this.allCards),\r\n\t\t);\r\n\t\tconst pool = magneticVolumizers.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\r\n\t\tif (sourceEntity && targetEntity && debugState.active && debugState.forcedRandomPicks.length > 0) {\r\n\t\t\tconst forced = debugState.forcedRandomPicks.find(\r\n\t\t\t\t(p) =>\r\n\t\t\t\t\tdebugState.isCorrectEntity(p.source, sourceEntity) &&\r\n\t\t\t\t\tdebugState.isCorrectEntity(p.target, targetEntity),\r\n\t\t\t);\r\n\t\t\tif (forced?.chosenCardId) {\r\n\t\t\t\tconst inPool = pool.some((m) => m.id === forced.chosenCardId);\r\n\t\t\t\tif (inPool) {\r\n\t\t\t\t\tdebugState.forcedRandomPicks = debugState.forcedRandomPicks.filter((p) => p !== forced);\r\n\t\t\t\t\treturn forced.chosenCardId;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst result = pickRandom(pool)?.id;\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic getRandomDivineShield(tavernLimitUpper: number) {\r\n\t\tconst divineShieldPool = this.pool\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => hasMechanic(m, GameTag.DIVINE_SHIELD));\r\n\t\tconst pool = divineShieldPool.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomRally(tavernLimitUpper: number) {\r\n\t\tconst targetPool = this.pool\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => hasMechanic(m, GameTag.BACON_RALLY));\r\n\t\tconst pool = targetPool.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomMinionForTribe(\r\n\t\ttribe: Race,\r\n\t\ttavernLimitUpper: number,\r\n\t\texcludedCards: readonly string[] = [],\r\n\t): string {\r\n\t\tconst pool = this.pool\r\n\t\t\t.filter((m) => this.isValidTribe([tribe], m.races, false))\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => m.techLevel <= tavernLimitUpper)\r\n\t\t\t.filter((m) => !excludedCards.includes(m.id));\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\t/** Random tavern-pool minion that has a minion type (not Neutral). All tiers. */\r\n\tpublic getRandomMinionWithType(): string {\r\n\t\tconst pool = this.pool.filter((m) => !!m.races?.length);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomProtossMinion(tavernLimitUpper: number): string {\r\n\t\tconst pool = this.pool\r\n\t\t\t.filter((m) => m.mechanics?.includes(GameTag[GameTag.PROTOSS]))\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\t/** Minor Timewarp = BACON_TIMEWARPED with techLevel ≤ 4 (Major is 5). */\r\n\tpublic getRandomMinorTimewarpCard(cost = 1): string {\r\n\t\tconst pool = allCardsList(this.allCards)\r\n\t\t\t.filter((c) => !c.premium)\r\n\t\t\t.filter((c) => hasMechanic(c, GameTag.BACON_TIMEWARPED))\r\n\t\t\t.filter((c) => (c.techLevel ?? 3) <= 4)\r\n\t\t\t.filter((c) => (c.cost ?? 1) === cost);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomSpellcraft(options: { maxTavernTier?: number }): string {\r\n\t\tconst pool = this.spellcraftPool.filter((c) =>\r\n\t\t\toptions.maxTavernTier ? c.techLevel <= options.maxTavernTier : true,\r\n\t\t);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic isGolden(card: ReferenceCard): boolean {\r\n\t\treturn card.premium;\r\n\t}\r\n\r\n\tprivate isValidTribe(validTribes: readonly Race[], cardRaces: readonly string[], allowEmptyRaces = true): boolean {\r\n\t\tif (!cardRaces?.length && allowEmptyRaces) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn (cardRaces ?? [])\r\n\t\t\t.map((race) => getRaceEnum(race))\r\n\t\t\t.some((raceEnum) => raceEnum === Race.ALL || !validTribes?.length || validTribes.includes(raceEnum));\r\n\t}\r\n\r\n\tpublic getRandomTavernSpell(options?: { exactTavernTier?: number; maxTavernTier?: number }): string {\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/** BG 2-cost spells that have simulator support (cardMappings). */\r\n\tpublic getTwoCostBattlegroundsSpellIdsImplemented(): string[] {\r\n\t\treturn allCardsList(this.allCards)\r\n\t\t\t.filter(\r\n\t\t\t\t(c) =>\r\n\t\t\t\t\tc.set === 'Battlegrounds' &&\r\n\t\t\t\t\t!c.premium &&\r\n\t\t\t\t\t(c.cost ?? 0) === 2 &&\r\n\t\t\t\t\tc.type?.toUpperCase() === CardType[CardType.SPELL] &&\r\n\t\t\t\t\tcardMappings[c.id] != null,\r\n\t\t\t)\r\n\t\t\t.map((c) => c.id);\r\n\t}\r\n}\r\n"]}
1
+ {"version":3,"file":"cards-data.js","sourceRoot":"","sources":["../../src/cards/cards-data.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n\tAllCardsService,\r\n\tCardType,\r\n\tGameTag,\r\n\tisBattlegroundsCard,\r\n\tRace,\r\n\tReferenceCard,\r\n\tSpellSchool,\r\n} from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { debugState } from '../debug-state';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { getRaceEnum, hasMechanic, isCorrectTribe, isVolumizer } from '../utils';\r\nimport { hasAvenge, hasDefaultScriptDataNum } from './card.interface';\r\nimport { cardMappings } from './impl/_card-mappings';\r\n\r\n/** `getCards()` copies the full DB; intern per card service. */\r\nconst allCardsListCache = new WeakMap<AllCardsService, readonly ReferenceCard[]>();\r\nconst baconMinionsCache = new WeakMap<AllCardsService, readonly ReferenceCard[]>();\r\nconst tribeIndependentCache = new WeakMap<\r\n\tAllCardsService,\r\n\t{\r\n\t\tspellcraftPool: readonly ReferenceCard[];\r\n\t\tbountyTavernSpellIds: readonly string[];\r\n\t\tputricidePool1: readonly string[];\r\n\t\tputricidePool2: readonly string[];\r\n\t\tputridicePool2ForEternalSummoner: readonly string[];\r\n\t}\r\n>();\r\n\r\nconst allCardsList = (allCards: AllCardsService): readonly ReferenceCard[] => {\r\n\tconst hit = allCardsListCache.get(allCards);\r\n\tif (hit) {\r\n\t\treturn hit;\r\n\t}\r\n\tconst list = allCards.getCards();\r\n\tallCardsListCache.set(allCards, list);\r\n\treturn list;\r\n};\r\n\r\nconst baconMinions = (allCards: AllCardsService): readonly ReferenceCard[] => {\r\n\tconst hit = baconMinionsCache.get(allCards);\r\n\tif (hit) {\r\n\t\treturn hit;\r\n\t}\r\n\tconst list = allCardsList(allCards)\r\n\t\t.filter((card) => isBattlegroundsCard(card))\r\n\t\t.filter((card) => card.isBaconPool || allCards.getCard(card.battlegroundsNormalDbfId)?.isBaconPool)\r\n\t\t.filter((card) => card.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t.filter((card) => !hasMechanic(card, GameTag.BACON_BUDDY))\r\n\t\t.filter((card) => card.set !== 'Vanilla');\r\n\tbaconMinionsCache.set(allCards, list);\r\n\treturn list;\r\n};\r\n\r\nconst tribeIndependentLists = (allCards: AllCardsService) => {\r\n\tconst hit = tribeIndependentCache.get(allCards);\r\n\tif (hit) {\r\n\t\treturn hit;\r\n\t}\r\n\tconst all = allCardsList(allCards);\r\n\tconst next = {\r\n\t\tspellcraftPool: all\r\n\t\t\t.filter((c) => c.spellSchool === SpellSchool[SpellSchool.SPELLCRAFT])\r\n\t\t\t.filter((c) => !c.premium)\r\n\t\t\t.filter((c) => c.set === 'Battlegrounds')\r\n\t\t\t.filter((c) => cardMappings[c.id] != null),\r\n\t\tbountyTavernSpellIds: all\r\n\t\t\t.filter((c) => c.set === 'Battlegrounds' && !c.premium)\r\n\t\t\t.filter((c) => c.type?.toUpperCase() === CardType[CardType.SPELL])\r\n\t\t\t.filter((c) => c.mechanics?.includes('BACON_BOUNTY'))\r\n\t\t\t.filter((c) => cardMappings[c.id] != null)\r\n\t\t\t.map((c) => c.id),\r\n\t\tputricidePool1: all.filter((card) => card.battlegroundsPutridicePool1).map((card) => card.id),\r\n\t\tputricidePool2: all.filter((card) => card.battlegroundsPutridicePool2).map((card) => card.id),\r\n\t\tputridicePool2ForEternalSummoner: all\r\n\t\t\t.filter((card) => card.battlegroundsPutridicePool2)\r\n\t\t\t.filter((card) => !card.battlegroundsPutridiceSummonerExclusion)\r\n\t\t\t.map((card) => card.id),\r\n\t};\r\n\ttribeIndependentCache.set(allCards, next);\r\n\treturn next;\r\n};\r\n\r\nexport const isWhelp = (cardId: string, allCards: AllCardsService): boolean => {\r\n\treturn allCards.getCard(cardId).mechanics?.includes(GameTag[GameTag.WHELP]);\r\n};\r\n\r\nexport const validBonusKeywords = [\r\n\tGameTag.TAUNT,\r\n\tGameTag.DIVINE_SHIELD,\r\n\tGameTag.VENOMOUS,\r\n\tGameTag.POISONOUS,\r\n\tGameTag.WINDFURY,\r\n\tGameTag.STEALTH,\r\n\tGameTag.REBORN,\r\n];\r\n\r\nexport const hasKeyword = (entity: BoardEntity, keyword: GameTag) => {\r\n\tswitch (keyword) {\r\n\t\tcase GameTag.TAUNT:\r\n\t\t\treturn entity.taunt;\r\n\t\tcase GameTag.DIVINE_SHIELD:\r\n\t\t\treturn entity.divineShield;\r\n\t\tcase GameTag.VENOMOUS:\r\n\t\t\treturn entity.venomous;\r\n\t\tcase GameTag.WINDFURY:\r\n\t\t\treturn entity.windfury;\r\n\t\tcase GameTag.STEALTH:\r\n\t\t\treturn entity.stealth;\r\n\t\tcase GameTag.REBORN:\r\n\t\t\treturn entity.reborn;\r\n\t\tdefault:\r\n\t\t\treturn false;\r\n\t}\r\n};\r\n\r\nexport class CardsData {\r\n\tpublic ghastcoilerSpawns: readonly string[];\r\n\tpublic impMamaSpawns: readonly string[];\r\n\tpublic demonSpawns: readonly string[];\r\n\tpublic gentleDjinniSpawns: readonly string[];\r\n\tpublic kilrekSpawns: readonly string[];\r\n\tpublic battlecryMinions: readonly string[];\r\n\tpublic deathrattleMinions: readonly string[];\r\n\tpublic pirateSpawns: readonly string[];\r\n\tpublic beastSpawns: readonly string[];\r\n\tpublic scrapScraperSpawns: readonly string[];\r\n\t/** Tavern spells with BACON_BOUNTY (Proud Privateer, Lost City Looter). */\r\n\tpublic bountyTavernSpellIds: readonly string[];\r\n\tpublic endOfTurnMinions: readonly string[];\r\n\tpublic magneticMinions: readonly ReferenceCard[];\r\n\tpublic spellcraftPool: readonly ReferenceCard[];\r\n\r\n\tpublic putricidePool1: readonly string[];\r\n\tpublic putricidePool2: readonly string[];\r\n\tpublic putridicePool2ForEternalSummoner: readonly string[];\r\n\r\n\tprivate pool: readonly ReferenceCard[];\r\n\tprivate minionsForTier: { [key: string]: readonly ReferenceCard[] };\r\n\r\n\tconstructor(private readonly allCards: AllCardsService, init = true) {\r\n\t\tif (init) {\r\n\t\t\tthis.inititialize();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic inititialize(validTribes?: readonly Race[], anomalies?: readonly string[]): void {\r\n\t\tconst poolWithGolden = baconMinions(this.allCards).filter((card) =>\r\n\t\t\tanomalies?.includes(CardIds.BigLeague_BG27_Anomaly_100)\r\n\t\t\t\t? card.techLevel >= 3\r\n\t\t\t\t: anomalies?.includes(CardIds.LittleLeague_BG27_Anomaly_800)\r\n\t\t\t\t? card.techLevel <= 4\r\n\t\t\t\t: true,\r\n\t\t);\r\n\t\tthis.pool = poolWithGolden\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.races))\r\n\t\t\t.filter((card) =>\r\n\t\t\t\tanomalies?.includes(CardIds.TheGoldenArena_BG27_Anomaly_801)\r\n\t\t\t\t\t? this.isGolden(card)\r\n\t\t\t\t\t: !this.isGolden(card),\r\n\t\t\t);\r\n\t\tthis.minionsForTier = groupByFunction((card: ReferenceCard) => card.techLevel)(this.pool);\r\n\t\tthis.ghastcoilerSpawns = this.pool\r\n\t\t\t.filter((card) => card.id !== 'BGS_008')\r\n\t\t\t.filter((card) => hasMechanic(card, GameTag.DEATHRATTLE))\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.races))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.demonSpawns = this.pool.filter((card) => isCorrectTribe(card.races, Race.DEMON)).map((card) => card.id);\r\n\t\tthis.impMamaSpawns = this.demonSpawns.filter((cardId) => cardId !== CardIds.ImpMama_BGS_044);\r\n\t\tthis.gentleDjinniSpawns = this.pool\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.ELEMENTAL))\r\n\t\t\t.filter((card) => card.id !== CardIds.GentleDjinni_BGS_121)\r\n\t\t\t.map((card) => card.id);\r\n\t\t// FIXME: just spawn a random undead instead of an Undead Creation\r\n\t\t// this.festergutSpawns = pool\r\n\t\t// \t.filter((card) => !this.isGolden(card))\r\n\t\t// \t.filter((card) => isCorrectTribe(card.races, Race.UNDEAD))\r\n\t\t// \t.filter((card) => card.id !== CardIds.Festergut_BG25_HERO_100_Buddy)\r\n\t\t// \t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t// \t.map((card) => card.id);\r\n\t\tthis.kilrekSpawns = this.pool\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.DEMON))\r\n\t\t\t.filter((card) => card.id !== CardIds.Kilrek_TB_BaconShop_HERO_37_Buddy)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.battlecryMinions = this.pool.filter((card) => hasMechanic(card, GameTag.BATTLECRY)).map((card) => card.id);\r\n\t\tthis.deathrattleMinions = this.pool\r\n\t\t\t.filter((card) => hasMechanic(card, GameTag.DEATHRATTLE))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.pirateSpawns = this.pool.filter((card) => isCorrectTribe(card.races, Race.PIRATE)).map((card) => card.id);\r\n\t\tthis.beastSpawns = this.pool.filter((card) => isCorrectTribe(card.races, Race.BEAST)).map((card) => card.id);\r\n\t\tthis.scrapScraperSpawns = this.pool\r\n\t\t\t.filter((card) => hasMechanic(card, GameTag.MAGNETIC))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.endOfTurnMinions = this.pool\r\n\t\t\t.filter((card) => hasMechanic(card, GameTag.END_OF_TURN))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.magneticMinions = this.pool.filter((card) => hasMechanic(card, GameTag.MAGNETIC));\r\n\t\tconst shared = tribeIndependentLists(this.allCards);\r\n\t\tthis.spellcraftPool = shared.spellcraftPool;\r\n\t\tthis.bountyTavernSpellIds = shared.bountyTavernSpellIds;\r\n\t\tthis.putricidePool1 = shared.putricidePool1;\r\n\t\tthis.putricidePool2 = shared.putricidePool2;\r\n\t\tthis.putridicePool2ForEternalSummoner = shared.putridicePool2ForEternalSummoner;\r\n\t}\r\n\r\n\tpublic avengeValue(cardId: string): number {\r\n\t\tconst avengeImpl = cardMappings[cardId];\r\n\t\tif (hasAvenge(avengeImpl)) {\r\n\t\t\treturn avengeImpl.baseAvengeValue(cardId);\r\n\t\t}\r\n\t\tswitch (cardId) {\r\n\t\t\tcase CardIds.HungeringAbomination_BG25_014:\r\n\t\t\tcase CardIds.HungeringAbomination_BG25_014_G:\r\n\t\t\t\t// case CardIds.IceSickle:\r\n\t\t\t\treturn 1;\r\n\t\t\tcase CardIds.MechanoTank_BG21_023:\r\n\t\t\tcase CardIds.MechanoTank_BG21_023_G:\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001_G:\r\n\t\t\tcase CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy:\r\n\t\t\tcase CardIds.StormpikeLieutenant_BG22_HERO_003_Buddy_G:\r\n\t\t\tcase CardIds.Bristlebach_BG26_157:\r\n\t\t\tcase CardIds.Bristlebach_BG26_157_G:\r\n\t\t\t\treturn 2;\r\n\t\t\tcase CardIds.BoomSquad_BG27_Reward_502:\r\n\t\t\tcase CardIds.TremblingTrolley_BG28_967:\r\n\t\t\tcase CardIds.TremblingTrolley_BG28_967_G:\r\n\t\t\t\treturn 3;\r\n\t\t\tcase CardIds.Onyxia_Broodmother:\r\n\t\t\tcase CardIds.ImpatientDoomsayer_BG21_007:\r\n\t\t\tcase CardIds.ImpatientDoomsayer_BG21_007_G:\r\n\t\t\t// case CardIds.Sisefin_BG21_009:\r\n\t\t\t// case CardIds.Sisefin_BG21_009_G:\r\n\t\t\t// case CardIds.TonyTwoTusk_BG21_031:\r\n\t\t\t// case CardIds.TonyTwoTusk_BG21_031_G:\r\n\t\t\t// case CardIds.ScrapScraper_BG26_148:\r\n\t\t\t// case CardIds.ScrapScraper_BG26_148_G:\r\n\t\t\tcase CardIds.RelentlessSentry_BG25_003:\r\n\t\t\tcase CardIds.RelentlessSentry_BG25_003_G:\r\n\t\t\tcase CardIds.PhaerixWrathOfTheSun_BG28_403:\r\n\t\t\tcase CardIds.PhaerixWrathOfTheSun_BG28_403_G:\r\n\t\t\tcase CardIds.TumblingDisaster_BG28_Reward_505:\r\n\t\t\tcase CardIds.CycleOfEnergy_BG28_Reward_504:\r\n\t\t\tcase CardIds.AugmentedLaborer_BG28_740:\r\n\t\t\tcase CardIds.AugmentedLaborer_BG28_740_G:\r\n\t\t\tcase CardIds.MurglMkIi_BG29_991:\r\n\t\t\tcase CardIds.MurglMkIi_BG29_991_G:\r\n\t\t\t\treturn 4;\r\n\t\t\tcase CardIds.RelentlessMurghoul_BG27_010:\r\n\t\t\tcase CardIds.RelentlessMurghoul_BG27_010_G:\r\n\t\t\tcase CardIds.StaffOfTheScourge_BG30_MagicItem_437:\r\n\t\t\t\treturn 5;\r\n\t\t\tcase CardIds.StableAmalgamation_BG28_Reward_518:\r\n\t\t\t\treturn 7;\r\n\t\t\tcase CardIds.BleedingHeart_BG30_MagicItem_713:\r\n\t\t\t\treturn 8;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tpublic defaultScriptDataNum(cardId: string): number {\r\n\t\tconst defaultScriptDataNumImpl = cardMappings[cardId];\r\n\t\tif (hasDefaultScriptDataNum(defaultScriptDataNumImpl)) {\r\n\t\t\treturn defaultScriptDataNumImpl.defaultScriptDataNum(cardId);\r\n\t\t}\r\n\t\tswitch (cardId) {\r\n\t\t\tcase CardIds.TumblingDisaster_BG28_Reward_505:\r\n\t\t\tcase CardIds.TwinSkyLanterns_BG30_MagicItem_822:\r\n\t\t\tcase CardIds.TwinSkyLanterns_TwinSkyLanternsToken_BG30_MagicItem_822t2:\r\n\t\t\tcase CardIds.BoomController_BG30_MagicItem_440:\r\n\t\t\tcase CardIds.AllianceKeychain_BG30_MagicItem_433:\r\n\t\t\tcase CardIds.AllianceKeychain_AllianceKeychainToken_BG30_MagicItem_433t:\r\n\t\t\tcase CardIds.DeathlyPhylactery_BG30_MagicItem_700:\r\n\t\t\tcase CardIds.PromoPortrait_BG30_MagicItem_918:\r\n\t\t\t\treturn 1;\r\n\t\t\tcase CardIds.BloodGolemSticker_BG30_MagicItem_442:\r\n\t\t\tcase CardIds.MechagonAdapter_BG30_MagicItem_910:\r\n\t\t\tcase CardIds.FaerieDragonScale_BG32_MagicItem_363:\r\n\t\t\t\treturn 3;\r\n\t\t\tdefault:\r\n\t\t\t\treturn 0;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic getTavernLevel(cardId: string): number {\r\n\t\treturn this.allCards.getCard(cardId).techLevel ?? 1;\r\n\t}\r\n\r\n\tpublic getRandomMinionForTavernTier(tavernTier: number): string {\r\n\t\t// Tzvern tier can be undefined for hero-power specific tokens, like the Amalgam, or when\r\n\t\t// for some reason tokens end up in the shop. For now, defaulting to 1 for tavern\r\n\t\t// level seems to work in all cases\r\n\t\tconst minionsForTier = this.minionsForTier[tavernTier ?? 1];\r\n\t\tif (!minionsForTier?.length) {\r\n\t\t\tconsole.error('incorrect minions for tier', tavernTier);\r\n\t\t}\r\n\t\treturn pickRandom(minionsForTier)?.id;\r\n\t}\r\n\r\n\tpublic getRandomMinionForMinTavernTier(tavernTier: number): string {\r\n\t\tconst minionsForTier = this.pool.filter((m) => m.techLevel >= tavernTier);\r\n\t\tif (!minionsForTier?.length) {\r\n\t\t\tconsole.error('incorrect minions for tier', tavernTier);\r\n\t\t}\r\n\t\treturn pickRandom(minionsForTier)?.id;\r\n\t}\r\n\r\n\tpublic getRandomMechToMagnetize(tavernLimitUpper: number): string {\r\n\t\tconst magneticMechs = this.pool\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => hasMechanic(m, GameTag.MODULAR));\r\n\t\tconst pool = magneticMechs.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomMagneticVolumizer(\r\n\t\tplayerEntity: BgsPlayerEntity,\r\n\t\tanomalies: readonly string[],\r\n\t\ttavernLimitUpper: number,\r\n\t\tsourceEntity?: BoardEntity,\r\n\t\ttargetEntity?: BoardEntity,\r\n\t): string {\r\n\t\tconst magneticVolumizers = this.magneticMinions.filter((m) =>\r\n\t\t\tisVolumizer(m.id, playerEntity, anomalies, this.allCards),\r\n\t\t);\r\n\t\tconst pool = magneticVolumizers.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\r\n\t\tif (sourceEntity && targetEntity && debugState.active && debugState.forcedRandomPicks.length > 0) {\r\n\t\t\tconst forced = debugState.forcedRandomPicks.find(\r\n\t\t\t\t(p) =>\r\n\t\t\t\t\tdebugState.isCorrectEntity(p.source, sourceEntity) &&\r\n\t\t\t\t\tdebugState.isCorrectEntity(p.target, targetEntity),\r\n\t\t\t);\r\n\t\t\tif (forced?.chosenCardId) {\r\n\t\t\t\tconst inPool = pool.some((m) => m.id === forced.chosenCardId);\r\n\t\t\t\tif (inPool) {\r\n\t\t\t\t\tdebugState.forcedRandomPicks = debugState.forcedRandomPicks.filter((p) => p !== forced);\r\n\t\t\t\t\treturn forced.chosenCardId;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst result = pickRandom(pool)?.id;\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic getRandomDivineShield(tavernLimitUpper: number) {\r\n\t\tconst divineShieldPool = this.pool\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => hasMechanic(m, GameTag.DIVINE_SHIELD));\r\n\t\tconst pool = divineShieldPool.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomRally(tavernLimitUpper: number) {\r\n\t\tconst targetPool = this.pool\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => hasMechanic(m, GameTag.BACON_RALLY));\r\n\t\tconst pool = targetPool.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomChooseOneCard(): string {\r\n\t\tconst pool = this.pool.filter((m) => hasMechanic(m, GameTag.CHOOSE_ONE));\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomMinionForTribe(\r\n\t\ttribe: Race,\r\n\t\ttavernLimitUpper: number,\r\n\t\texcludedCards: readonly string[] = [],\r\n\t): string {\r\n\t\tconst pool = this.pool\r\n\t\t\t.filter((m) => this.isValidTribe([tribe], m.races, false))\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => m.techLevel <= tavernLimitUpper)\r\n\t\t\t.filter((m) => !excludedCards.includes(m.id));\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\t/** Random tavern-pool minion that has a minion type (not Neutral). All tiers. */\r\n\tpublic getRandomMinionWithType(): string {\r\n\t\tconst pool = this.pool.filter((m) => !!m.races?.length);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomProtossMinion(tavernLimitUpper: number): string {\r\n\t\tconst pool = this.pool\r\n\t\t\t.filter((m) => m.mechanics?.includes(GameTag[GameTag.PROTOSS]))\r\n\t\t\t.filter((m) => m.type?.toUpperCase() === CardType[CardType.MINION])\r\n\t\t\t.filter((m) => m.techLevel <= tavernLimitUpper);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\t/** Minor Timewarp = BACON_TIMEWARPED with techLevel ≤ 4 (Major is 5). */\r\n\tpublic getRandomMinorTimewarpCard(cost = 1): string {\r\n\t\tconst pool = allCardsList(this.allCards)\r\n\t\t\t.filter((c) => !c.premium)\r\n\t\t\t.filter((c) => hasMechanic(c, GameTag.BACON_TIMEWARPED))\r\n\t\t\t.filter((c) => (c.techLevel ?? 3) <= 4)\r\n\t\t\t.filter((c) => (c.cost ?? 1) === cost);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic getRandomSpellcraft(options: { maxTavernTier?: number }): string {\r\n\t\tconst pool = this.spellcraftPool.filter((c) =>\r\n\t\t\toptions.maxTavernTier ? c.techLevel <= options.maxTavernTier : true,\r\n\t\t);\r\n\t\treturn pickRandom(pool)?.id;\r\n\t}\r\n\r\n\tpublic isGolden(card: ReferenceCard): boolean {\r\n\t\treturn card.premium;\r\n\t}\r\n\r\n\tprivate isValidTribe(validTribes: readonly Race[], cardRaces: readonly string[], allowEmptyRaces = true): boolean {\r\n\t\tif (!cardRaces?.length && allowEmptyRaces) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn (cardRaces ?? [])\r\n\t\t\t.map((race) => getRaceEnum(race))\r\n\t\t\t.some((raceEnum) => raceEnum === Race.ALL || !validTribes?.length || validTribes.includes(raceEnum));\r\n\t}\r\n\r\n\tpublic getRandomTavernSpell(options?: { exactTavernTier?: number; maxTavernTier?: number }): string {\r\n\t\treturn null;\r\n\t}\r\n\r\n\t/** BG 2-cost spells that have simulator support (cardMappings). */\r\n\tpublic getTwoCostBattlegroundsSpellIdsImplemented(): string[] {\r\n\t\treturn allCardsList(this.allCards)\r\n\t\t\t.filter(\r\n\t\t\t\t(c) =>\r\n\t\t\t\t\tc.set === 'Battlegrounds' &&\r\n\t\t\t\t\t!c.premium &&\r\n\t\t\t\t\t(c.cost ?? 0) === 2 &&\r\n\t\t\t\t\tc.type?.toUpperCase() === CardType[CardType.SPELL] &&\r\n\t\t\t\t\tcardMappings[c.id] != null,\r\n\t\t\t)\r\n\t\t\t.map((c) => c.id);\r\n\t}\r\n}\r\n"]}
@@ -8,7 +8,7 @@ exports.BroodOfNozdormu = {
8
8
  startOfCombat: (secret, input) => {
9
9
  const target = input.playerBoard[0];
10
10
  if (!!target) {
11
- (0, stats_1.modifyStats)(target, secret, target.attack, 0, input.playerBoard, input.playerEntity, input.gameState);
11
+ (0, stats_1.setEntityStats)(target, 2 * target.attack, null, input.playerBoard, input.playerEntity, input.gameState);
12
12
  }
13
13
  return true;
14
14
  },
@@ -1 +1 @@
1
- {"version":3,"file":"brood-of-nozdormu.js","sourceRoot":"","sources":["../../../../src/cards/impl/bg-spell/brood-of-nozdormu.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AAG3C,QAAA,eAAe,GAAsB;IACjD,OAAO,EAAE,YAAkC;IAC3C,mBAAmB,EAAE,iBAAiB;IACtC,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,MAAM,EAAE;YACb,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACtG;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import { BoardSecret } from '../../../board-secret';\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 { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const BroodOfNozdormu: StartOfCombatCard = {\r\n\tcardIds: [CardIds.BroodOfNozdormu_BG34_889],\r\n\tstartOfCombatTiming: 'start-of-combat',\r\n\tstartOfCombat: (secret: BoardSecret, input: SoCInput) => {\r\n\t\tconst target = input.playerBoard[0];\r\n\t\tif (!!target) {\r\n\t\t\tmodifyStats(target, secret, target.attack, 0, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"brood-of-nozdormu.js","sourceRoot":"","sources":["../../../../src/cards/impl/bg-spell/brood-of-nozdormu.ts"],"names":[],"mappings":";;;AAGA,qDAA2D;AAG9C,QAAA,eAAe,GAAsB;IACjD,OAAO,EAAE,YAAkC;IAC3C,mBAAmB,EAAE,iBAAiB;IACtC,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,CAAC,MAAM,EAAE;YACb,IAAA,sBAAc,EAAC,MAAM,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACxG;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import { BoardSecret } from '../../../board-secret';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { setEntityStats } from '../../../simulation/stats';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const BroodOfNozdormu: StartOfCombatCard = {\r\n\tcardIds: [CardIds.BroodOfNozdormu_BG34_889],\r\n\tstartOfCombatTiming: 'start-of-combat',\r\n\tstartOfCombat: (secret: BoardSecret, input: SoCInput) => {\r\n\t\tconst target = input.playerBoard[0];\r\n\t\tif (!!target) {\r\n\t\t\tsetEntityStats(target, 2 * target.attack, null, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
@@ -9,9 +9,7 @@ exports.DeathsEmbrace = {
9
9
  "BG36_MidGameEffect_000t29e",
10
10
  ],
11
11
  onDeathrattleTriggeredEnchantment: (enchantedMinion, enchantment, input) => {
12
- const mult = input.deadEntity.cardId === "BG36_MidGameEffect_000t29e"
13
- ? 2
14
- : 1;
12
+ const mult = enchantment.cardId === "BG36_MidGameEffect_000t29e" ? 2 : 1;
15
13
  enchantedMinion.attack += mult * atkBuff;
16
14
  enchantedMinion.maxAttack += mult * atkBuff;
17
15
  enchantedMinion.health += mult * healthBuff;
@@ -1 +1 @@
1
- {"version":3,"file":"deaths-embrace.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/deaths-embrace.ts"],"names":[],"mappings":";;;AAcA,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,UAAU,GAAG,CAAC,CAAC;AAKR,QAAA,aAAa,GAEI;IAC7B,OAAO,EAAE;;;KAGR;IACD,iCAAiC,EAAE,CAClC,eAA4B,EAC5B,WAA6B,EAC7B,KAAgC,EAChB,EAAE;QAClB,MAAM,IAAI,GACT,KAAK,CAAC,UAAU,CAAC,MAAM,iCAA8E;YACpG,CAAC,CAAC,CAAC;YACH,CAAC,CAAC,CAAC,CAAC;QACN,eAAe,CAAC,MAAM,IAAI,IAAI,GAAG,OAAO,CAAC;QACzC,eAAe,CAAC,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC;QAC5C,eAAe,CAAC,MAAM,IAAI,IAAI,GAAG,UAAU,CAAC;QAC5C,eAAe,CAAC,SAAS,IAAI,IAAI,GAAG,UAAU,CAAC;QAC/C,WAAW,CAAC,iBAAiB,IAAI,CAAC,CAAC;QACnC,OAAO,EAAE,CAAC;IACX,CAAC;IAGD,oBAAoB,EAAE,CAAC,MAAmB,EAAE,WAA6B,EAAE,KAAmB,EAAE,EAAE;QACjG,MAAM,IAAI,GACT,WAAW,CAAC,MAAM,iCAA8E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC;QACjE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;YACvC,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;SAC1C;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;YAC1C,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;SAC7C;QACD,WAAW,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACtC,CAAC;IACD,sBAAsB,EAAE,CAAC,MAAmB,EAAE,WAA6B,EAAE,KAAqB,EAAE,EAAE;;QACrG,MAAM,IAAI,GACT,WAAW,CAAC,MAAM,iCAA8E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,MAAA,WAAW,CAAC,iBAAiB,mCAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC;QAClG,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;SAEvC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;SAE1C;IACF,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Defensive Sacrifice (Dark Gift)\r\n * Deathrattle: Give this minion's max Health to another friendly minion.\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 { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport {\r\n\tDeathrattleTriggeredEnchantmentCard,\r\n\tOnDespawnedEnchantmentCard,\r\n\tOnSpawnedEnchantmentCard,\r\n} from '../../card.interface';\r\n\r\nconst atkBuff = 1;\r\nconst healthBuff = 1;\r\n\r\n// We use the tagScriptDataNum2 to try and better handle the case where the minion is in hand - it starts\r\n// the combat with a certain value (stored in the tag), but it doesn't get increased as more deathrattles are triggered.\r\n// So when we summon it, we need to remove the stats from the tag (already processed) to not over-remove\r\nexport const DeathsEmbrace: DeathrattleTriggeredEnchantmentCard &\r\n\tOnSpawnedEnchantmentCard &\r\n\tOnDespawnedEnchantmentCard = {\r\n\tcardIds: [\r\n\t\tCardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29te,\r\n\t\tCardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e,\r\n\t],\r\n\tonDeathrattleTriggeredEnchantment: (\r\n\t\tenchantedMinion: BoardEntity,\r\n\t\tenchantment: BoardEnchantment,\r\n\t\tinput: DeathrattleTriggeredInput,\r\n\t): BoardEntity[] => {\r\n\t\tconst mult =\r\n\t\t\tinput.deadEntity.cardId === CardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e\r\n\t\t\t\t? 2\r\n\t\t\t\t: 1;\r\n\t\tenchantedMinion.attack += mult * atkBuff;\r\n\t\tenchantedMinion.maxAttack += mult * atkBuff;\r\n\t\tenchantedMinion.health += mult * healthBuff;\r\n\t\tenchantedMinion.maxHealth += mult * healthBuff;\r\n\t\tenchantment.tagScriptDataNum2 += 1;\r\n\t\treturn [];\r\n\t},\r\n\t// I still have some doubts about whether, when spawned from hand, it really loses the existing enchantment, or if\r\n\t// it simply gains it again\r\n\tonSpawnedEnchantment: (minion: BoardEntity, enchantment: BoardEnchantment, input: OnSpawnInput) => {\r\n\t\tconst mult =\r\n\t\t\tenchantment.cardId === CardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e ? 2 : 1;\r\n\t\tconst base = input.hero.globalInfo.DeathrattlesTriggeredThisGame;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack += mult * atkBuff * base;\r\n\t\t\tminion.maxAttack += mult * atkBuff * base;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health += mult * healthBuff * base;\r\n\t\t\tminion.maxHealth += mult * healthBuff * base;\r\n\t\t}\r\n\t\tenchantment.tagScriptDataNum2 = base;\r\n\t},\r\n\tonDespawnedEnchantment: (minion: BoardEntity, enchantment: BoardEnchantment, input: OnDespawnInput) => {\r\n\t\tconst mult =\r\n\t\t\tenchantment.cardId === CardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e ? 2 : 1;\r\n\t\tconst base = enchantment.tagScriptDataNum2 ?? input.hero.globalInfo.DeathrattlesTriggeredThisGame;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack -= mult * atkBuff * base;\r\n\t\t\t// minion.maxAttack -= mult * atkBuff * base;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health -= mult * healthBuff * base;\r\n\t\t\t// minion.maxHealth -= mult * healthBuff * base;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"deaths-embrace.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/deaths-embrace.ts"],"names":[],"mappings":";;;AAcA,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,UAAU,GAAG,CAAC,CAAC;AAKR,QAAA,aAAa,GAEI;IAC7B,OAAO,EAAE;;;KAGR;IACD,iCAAiC,EAAE,CAClC,eAA4B,EAC5B,WAA6B,EAC7B,KAAgC,EAChB,EAAE;QAClB,MAAM,IAAI,GACT,WAAW,CAAC,MAAM,iCAA8E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,eAAe,CAAC,MAAM,IAAI,IAAI,GAAG,OAAO,CAAC;QACzC,eAAe,CAAC,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC;QAC5C,eAAe,CAAC,MAAM,IAAI,IAAI,GAAG,UAAU,CAAC;QAC5C,eAAe,CAAC,SAAS,IAAI,IAAI,GAAG,UAAU,CAAC;QAC/C,WAAW,CAAC,iBAAiB,IAAI,CAAC,CAAC;QACnC,OAAO,EAAE,CAAC;IACX,CAAC;IAGD,oBAAoB,EAAE,CAAC,MAAmB,EAAE,WAA6B,EAAE,KAAmB,EAAE,EAAE;QACjG,MAAM,IAAI,GACT,WAAW,CAAC,MAAM,iCAA8E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC;QACjE,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;YACvC,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;SAC1C;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;YAC1C,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;SAC7C;QACD,WAAW,CAAC,iBAAiB,GAAG,IAAI,CAAC;IACtC,CAAC;IACD,sBAAsB,EAAE,CAAC,MAAmB,EAAE,WAA6B,EAAE,KAAqB,EAAE,EAAE;;QACrG,MAAM,IAAI,GACT,WAAW,CAAC,MAAM,iCAA8E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1G,MAAM,IAAI,GAAG,MAAA,WAAW,CAAC,iBAAiB,mCAAI,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,6BAA6B,CAAC;QAClG,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,OAAO,GAAG,IAAI,CAAC;SAEvC;QACD,IAAI,KAAK,CAAC,gBAAgB,EAAE;YAC3B,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,UAAU,GAAG,IAAI,CAAC;SAE1C;IACF,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Defensive Sacrifice (Dark Gift)\r\n * Deathrattle: Give this minion's max Health to another friendly minion.\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 { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport {\r\n\tDeathrattleTriggeredEnchantmentCard,\r\n\tOnDespawnedEnchantmentCard,\r\n\tOnSpawnedEnchantmentCard,\r\n} from '../../card.interface';\r\n\r\nconst atkBuff = 1;\r\nconst healthBuff = 1;\r\n\r\n// We use the tagScriptDataNum2 to try and better handle the case where the minion is in hand - it starts\r\n// the combat with a certain value (stored in the tag), but it doesn't get increased as more deathrattles are triggered.\r\n// So when we summon it, we need to remove the stats from the tag (already processed) to not over-remove\r\nexport const DeathsEmbrace: DeathrattleTriggeredEnchantmentCard &\r\n\tOnSpawnedEnchantmentCard &\r\n\tOnDespawnedEnchantmentCard = {\r\n\tcardIds: [\r\n\t\tCardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29te,\r\n\t\tCardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e,\r\n\t],\r\n\tonDeathrattleTriggeredEnchantment: (\r\n\t\tenchantedMinion: BoardEntity,\r\n\t\tenchantment: BoardEnchantment,\r\n\t\tinput: DeathrattleTriggeredInput,\r\n\t): BoardEntity[] => {\r\n\t\tconst mult =\r\n\t\t\tenchantment.cardId === CardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e ? 2 : 1;\r\n\t\tenchantedMinion.attack += mult * atkBuff;\r\n\t\tenchantedMinion.maxAttack += mult * atkBuff;\r\n\t\tenchantedMinion.health += mult * healthBuff;\r\n\t\tenchantedMinion.maxHealth += mult * healthBuff;\r\n\t\tenchantment.tagScriptDataNum2 += 1;\r\n\t\treturn [];\r\n\t},\r\n\t// I still have some doubts about whether, when spawned from hand, it really loses the existing enchantment, or if\r\n\t// it simply gains it again\r\n\tonSpawnedEnchantment: (minion: BoardEntity, enchantment: BoardEnchantment, input: OnSpawnInput) => {\r\n\t\tconst mult =\r\n\t\t\tenchantment.cardId === CardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e ? 2 : 1;\r\n\t\tconst base = input.hero.globalInfo.DeathrattlesTriggeredThisGame;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack += mult * atkBuff * base;\r\n\t\t\tminion.maxAttack += mult * atkBuff * base;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health += mult * healthBuff * base;\r\n\t\t\tminion.maxHealth += mult * healthBuff * base;\r\n\t\t}\r\n\t\tenchantment.tagScriptDataNum2 = base;\r\n\t},\r\n\tonDespawnedEnchantment: (minion: BoardEntity, enchantment: BoardEnchantment, input: OnDespawnInput) => {\r\n\t\tconst mult =\r\n\t\t\tenchantment.cardId === CardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e ? 2 : 1;\r\n\t\tconst base = enchantment.tagScriptDataNum2 ?? input.hero.globalInfo.DeathrattlesTriggeredThisGame;\r\n\t\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack -= mult * atkBuff * base;\r\n\t\t\t// minion.maxAttack -= mult * atkBuff * base;\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health -= mult * healthBuff * base;\r\n\t\t\t// minion.maxHealth -= mult * healthBuff * base;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -20,7 +20,7 @@ exports.Doppelganger = {
20
20
  return false;
21
21
  }
22
22
  input.gameState.spectator.registerPowerTarget(minion, copy, input.playerBoard, input.playerEntity, input.opponentEntity);
23
- return true;
23
+ return { hasTriggered: true, shouldRecomputeCurrentAttacker: true };
24
24
  },
25
25
  };
26
26
  //# sourceMappingURL=doppelganger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"doppelganger.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/doppelganger.ts"],"names":[],"mappings":";;;AAMA,iFAA8E;AAC9E,+EAAuE;AACvE,uDAAiE;AAEjE,0CAA4C;AAG/B,QAAA,YAAY,GAAsB;IAC9C,OAAO,EAAE,8BAAyE;IAClF,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE;YAC/D,OAAO,KAAK,CAAC;SACb;QACD,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;QAChC,IAAA,yCAAmB,EAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,IAAA,kCAAa,EAC/B,IAAI,CAAC,MAAM,EACX,CAAC,EACD,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,EACf,MAAM,CAAC,QAAQ,EACf,IAAI,EACJ,KAAK,EACL,KAAK,EACL,IAAI,CACJ,CAAC;QACF,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1F,MAAM,YAAY,GAAG,IAAA,4BAAmB,EACvC,UAAU,EACV,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,MAAM,EACN,cAAc,EACd,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,CACf,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACzB,OAAO,KAAK,CAAC;SACb;QACD,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,IAAI,EACJ,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,cAAc,CACpB,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Doppelganger (Dark Gift)\r\n * Start of Combat: Summon a copy of this.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { removeAurasFromSelf } from '../../../simulation/add-minion-to-board';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { copyEntity } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const Doppelganger: StartOfCombatCard = {\r\n\tcardIds: [CardIds.Doppelganger_DoppelgangerEnchantment_BG36_MidGameEffect_000t90e],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tif (!input.playerBoard.length || input.playerBoard.length >= 7) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst copy = copyEntity(minion);\r\n\t\tremoveAurasFromSelf(copy, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\tconst newMinions = spawnEntities(\r\n\t\t\tcopy.cardId,\r\n\t\t\t1,\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tinput.opponentBoard,\r\n\t\t\tinput.opponentEntity,\r\n\t\t\tinput.gameState,\r\n\t\t\tminion.friendly,\r\n\t\t\ttrue,\r\n\t\t\tfalse,\r\n\t\t\tfalse,\r\n\t\t\tcopy,\r\n\t\t);\r\n\t\tconst indexFromRight = input.playerBoard.length - (input.playerBoard.indexOf(minion) + 1);\r\n\t\tconst actualSpawns = performEntitySpawns(\r\n\t\t\tnewMinions,\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tminion,\r\n\t\t\tindexFromRight,\r\n\t\t\tinput.opponentBoard,\r\n\t\t\tinput.opponentEntity,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t\tif (!actualSpawns.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\tminion,\r\n\t\t\tcopy,\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tinput.opponentEntity,\r\n\t\t);\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"doppelganger.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/doppelganger.ts"],"names":[],"mappings":";;;AAMA,iFAA8E;AAC9E,+EAAuE;AACvE,uDAAiE;AAEjE,0CAA4C;AAG/B,QAAA,YAAY,GAAsB;IAC9C,OAAO,EAAE,8BAAyE;IAClF,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,EAAE;YAC/D,OAAO,KAAK,CAAC;SACb;QACD,MAAM,IAAI,GAAG,IAAA,kBAAU,EAAC,MAAM,CAAC,CAAC;QAChC,IAAA,yCAAmB,EAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,IAAA,kCAAa,EAC/B,IAAI,CAAC,MAAM,EACX,CAAC,EACD,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,EACf,MAAM,CAAC,QAAQ,EACf,IAAI,EACJ,KAAK,EACL,KAAK,EACL,IAAI,CACJ,CAAC;QACF,MAAM,cAAc,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1F,MAAM,YAAY,GAAG,IAAA,4BAAmB,EACvC,UAAU,EACV,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,MAAM,EACN,cAAc,EACd,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,CACf,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE;YACzB,OAAO,KAAK,CAAC;SACb;QACD,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,IAAI,EACJ,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,cAAc,CACpB,CAAC;QACF,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,CAAC;IACrE,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Doppelganger (Dark Gift)\r\n * Start of Combat: Summon a copy of this.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { removeAurasFromSelf } from '../../../simulation/add-minion-to-board';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { copyEntity } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const Doppelganger: StartOfCombatCard = {\r\n\tcardIds: [CardIds.Doppelganger_DoppelgangerEnchantment_BG36_MidGameEffect_000t90e],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tif (!input.playerBoard.length || input.playerBoard.length >= 7) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst copy = copyEntity(minion);\r\n\t\tremoveAurasFromSelf(copy, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\tconst newMinions = spawnEntities(\r\n\t\t\tcopy.cardId,\r\n\t\t\t1,\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tinput.opponentBoard,\r\n\t\t\tinput.opponentEntity,\r\n\t\t\tinput.gameState,\r\n\t\t\tminion.friendly,\r\n\t\t\ttrue,\r\n\t\t\tfalse,\r\n\t\t\tfalse,\r\n\t\t\tcopy,\r\n\t\t);\r\n\t\tconst indexFromRight = input.playerBoard.length - (input.playerBoard.indexOf(minion) + 1);\r\n\t\tconst actualSpawns = performEntitySpawns(\r\n\t\t\tnewMinions,\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tminion,\r\n\t\t\tindexFromRight,\r\n\t\t\tinput.opponentBoard,\r\n\t\t\tinput.opponentEntity,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t\tif (!actualSpawns.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\tminion,\r\n\t\t\tcopy,\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tinput.opponentEntity,\r\n\t\t);\r\n\t\treturn { hasTriggered: true, shouldRecomputeCurrentAttacker: true };\r\n\t},\r\n};\r\n"]}
@@ -1,2 +1,2 @@
1
- import { OnGlobalInfoUpdatedEnchantmentCard } from '../../card.interface';
2
- export declare const SpellSiphon: OnGlobalInfoUpdatedEnchantmentCard;
1
+ import { OnDespawnedEnchantmentCard, OnGlobalInfoUpdatedEnchantmentCard, OnSpawnedEnchantmentCard } from '../../card.interface';
2
+ export declare const SpellSiphon: OnGlobalInfoUpdatedEnchantmentCard & OnSpawnedEnchantmentCard & OnDespawnedEnchantmentCard;
@@ -1,20 +1,61 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SpellSiphon = void 0;
4
+ const bonusPerSpell = (enchantment) => enchantment.cardId === "BG36_MidGameEffect_000t30e" ? 3 : 2;
5
+ const appliedSpellCount = (enchantment, fallback) => {
6
+ const stored = enchantment.tagScriptDataNum2;
7
+ return stored != null && stored >= 0 ? stored : fallback;
8
+ };
9
+ const addBonus = (minion, bonus, applyAttack, applyHealth) => {
10
+ var _a, _b;
11
+ if (!bonus) {
12
+ return;
13
+ }
14
+ if (applyAttack) {
15
+ minion.attack += bonus;
16
+ minion.maxAttack = ((_a = minion.maxAttack) !== null && _a !== void 0 ? _a : minion.attack - bonus) + bonus;
17
+ }
18
+ if (applyHealth) {
19
+ minion.health += bonus;
20
+ minion.maxHealth = ((_b = minion.maxHealth) !== null && _b !== void 0 ? _b : minion.health - bonus) + bonus;
21
+ }
22
+ };
4
23
  exports.SpellSiphon = {
5
24
  cardIds: [
6
25
  "BG36_MidGameEffect_000t30te",
7
26
  "BG36_MidGameEffect_000t30e",
8
27
  ],
9
28
  onGlobalInfoUpdatedEnchantment: (minion, enchantment, input) => {
10
- const base = enchantment.cardId === "BG36_MidGameEffect_000t30e" ? 3 : 2;
29
+ const base = bonusPerSpell(enchantment);
11
30
  for (const value of input.values) {
12
31
  if (value.type === 'TavernSpellsCastThisGame') {
13
32
  const delta = value.newValue - value.oldValue;
14
- minion.attack += delta * base;
15
- minion.maxAttack = minion.attack;
16
- minion.health += delta * base;
17
- minion.maxHealth = Math.max(minion.maxHealth, minion.health);
33
+ addBonus(minion, delta * base, true, true);
34
+ const stored = enchantment.tagScriptDataNum2;
35
+ enchantment.tagScriptDataNum2 = stored != null && stored >= 0 ? stored + delta : value.newValue;
36
+ }
37
+ }
38
+ },
39
+ onSpawnedEnchantment: (minion, enchantment, input) => {
40
+ var _a;
41
+ const spells = (_a = input.hero.globalInfo.TavernSpellsCastThisGame) !== null && _a !== void 0 ? _a : 0;
42
+ addBonus(minion, bonusPerSpell(enchantment) * spells, input.applyAttackAuras, input.applyHealthAuras);
43
+ enchantment.tagScriptDataNum2 = spells;
44
+ },
45
+ onDespawnedEnchantment: (minion, enchantment, input) => {
46
+ var _a;
47
+ const spells = appliedSpellCount(enchantment, (_a = input.hero.globalInfo.TavernSpellsCastThisGame) !== null && _a !== void 0 ? _a : 0);
48
+ const bonus = bonusPerSpell(enchantment) * spells;
49
+ if (input.applyAttackAuras) {
50
+ minion.attack -= bonus;
51
+ if (minion.maxAttack != null) {
52
+ minion.maxAttack -= bonus;
53
+ }
54
+ }
55
+ if (input.applyHealthAuras) {
56
+ minion.health -= bonus;
57
+ if (minion.maxHealth != null) {
58
+ minion.maxHealth -= bonus;
18
59
  }
19
60
  }
20
61
  },
@@ -1 +1 @@
1
- {"version":3,"file":"spell-siphon.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/spell-siphon.ts"],"names":[],"mappings":";;;AASa,QAAA,WAAW,GAAuC;IAC9D,OAAO,EAAE;;;KAGR;IACD,8BAA8B,EAAE,CAC/B,MAAmB,EACnB,WAA6B,EAC7B,KAA+B,EAC9B,EAAE;QACH,MAAM,IAAI,GACT,WAAW,CAAC,MAAM,iCAA0E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtG,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;YACjC,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE;gBAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;gBAC9C,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC;gBAC9B,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;gBACjC,MAAM,CAAC,MAAM,IAAI,KAAK,GAAG,IAAI,CAAC;gBAC9B,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;aAC7D;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Golemancy (Dark Gift)\r\n * Deathrattle: Summon a Golem with this minion's stats.\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 { OnGlobalInfoUpdatedEnchantmentCard } from '../../card.interface';\r\n\r\nexport const SpellSiphon: OnGlobalInfoUpdatedEnchantmentCard = {\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 =\r\n\t\t\tenchantment.cardId === CardIds.SpellSiphon_SpellSiphonEnchantment_BG36_MidGameEffect_000t30e ? 3 : 2;\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\tminion.attack += delta * base;\r\n\t\t\t\tminion.maxAttack = minion.attack;\r\n\t\t\t\tminion.health += delta * base;\r\n\t\t\t\tminion.maxHealth = Math.max(minion.maxHealth, minion.health);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"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\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\taddBonus(minion, bonusPerSpell(enchantment) * spells, input.applyAttackAuras, input.applyHealthAuras);\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\tif (input.applyAttackAuras) {\r\n\t\t\tminion.attack -= bonus;\r\n\t\t\tif (minion.maxAttack != null) {\r\n\t\t\t\tminion.maxAttack -= bonus;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (input.applyHealthAuras) {\r\n\t\t\tminion.health -= bonus;\r\n\t\t\tif (minion.maxHealth != null) {\r\n\t\t\t\tminion.maxHealth -= bonus;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -6,7 +6,7 @@ exports.BrambleTunneler = {
6
6
  cardIds: ["BG36_331", "BG36_331_G"],
7
7
  rally: (minion, input) => {
8
8
  const mult = minion.cardId === "BG36_331_G" ? 2 : 1;
9
- const cardsToAdd = Array(mult).fill(null);
9
+ const cardsToAdd = [...Array(mult)].map(() => input.gameState.cardsData.getRandomChooseOneCard());
10
10
  (0, cards_in_hand_1.addCardsInHand)(input.attackingHero, input.attackingBoard, cardsToAdd, input.gameState);
11
11
  return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
12
12
  },
@@ -1 +1 @@
1
- {"version":3,"file":"bramble-tunneler.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/bramble-tunneler.ts"],"names":[],"mappings":";;;AAUA,qEAAmE;AAKtD,QAAA,eAAe,GAAc;IACzC,OAAO,EAAE,0BAAsE;IAC/E,KAAK,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAA,8BAAc,EAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACvF,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Bramble Tunneler (Tier 4, 3/6)\r\n * Rally: Get a random Choose One card.\r\n *\r\n * Golden Bramble Tunneler (Tier 4, 6/12)\r\n * Rally: Get 2 random Choose One cards.\r\n *\r\n * Choose One cards themselves are tavern-only; the combat impact is the cards-in-hand trigger.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { RallyCard } from '../../card.interface';\r\nimport { CardIds } from '../../../services/card-ids';\r\n\r\nexport const BrambleTunneler: RallyCard = {\r\n\tcardIds: [CardIds.BrambleTunneler_BG36_331, CardIds.BrambleTunneler_BG36_331_G],\r\n\trally: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.BrambleTunneler_BG36_331_G ? 2 : 1;\r\n\t\tconst cardsToAdd = Array(mult).fill(null);\r\n\t\taddCardsInHand(input.attackingHero, input.attackingBoard, cardsToAdd, input.gameState);\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"bramble-tunneler.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/bramble-tunneler.ts"],"names":[],"mappings":";;;AAWA,qEAAmE;AAItD,QAAA,eAAe,GAAc;IACzC,OAAO,EAAE,0BAAsE;IAC/E,KAAK,EAAE,CAAC,MAAmB,EAAE,KAAoB,EAAE,EAAE;QACpD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,UAAU,GAAa,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,sBAAsB,EAAE,CAAC,CAAC;QAC5G,IAAA,8BAAc,EAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,cAAc,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACvF,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Bramble Tunneler (Tier 4, 3/6)\r\n * Rally: Get a random Choose One card.\r\n *\r\n * Golden Bramble Tunneler (Tier 4, 6/12)\r\n * Rally: Get 2 random Choose One cards.\r\n *\r\n * Choose One cards themselves are tavern-only; the combat impact is the cards-in-hand trigger.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { RallyCard } from '../../card.interface';\r\n\r\nexport const BrambleTunneler: RallyCard = {\r\n\tcardIds: [CardIds.BrambleTunneler_BG36_331, CardIds.BrambleTunneler_BG36_331_G],\r\n\trally: (minion: BoardEntity, input: OnAttackInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.BrambleTunneler_BG36_331_G ? 2 : 1;\r\n\t\tconst cardsToAdd: string[] = [...Array(mult)].map(() => input.gameState.cardsData.getRandomChooseOneCard());\r\n\t\taddCardsInHand(input.attackingHero, input.attackingBoard, cardsToAdd, input.gameState);\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
@@ -4,7 +4,7 @@ exports.DrustfallenButcher = void 0;
4
4
  const cards_in_hand_1 = require("../../../simulation/cards-in-hand");
5
5
  exports.DrustfallenButcher = {
6
6
  cardIds: ["BG32_324", "BG32_324_G"],
7
- baseAvengeValue: (cardId) => 3,
7
+ baseAvengeValue: (cardId) => 4,
8
8
  avenge: (minion, input) => {
9
9
  const mult = minion.cardId === "BG32_324_G" ? 2 : 1;
10
10
  const cardsToAdd = Array(mult).fill("BG28_604");
@@ -1 +1 @@
1
- {"version":3,"file":"drustfallen-butcher.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/drustfallen-butcher.ts"],"names":[],"mappings":";;;AAUA,qEAAmE;AAGtD,QAAA,kBAAkB,GAAe;IAC7C,OAAO,EAAE,0BAA4E;IACrF,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,YAA6B,CAAC;QACjE,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Drustfallen Butcher\r\n * Avenge (4): Get a Butchering.\r\n *\r\n * Golden Drustfallen Butcher\r\n * Avenge (4): Get 2 Butcherings.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const DrustfallenButcher: AvengeCard = {\r\n\tcardIds: [CardIds.DrustfallenButcher_BG32_324, CardIds.DrustfallenButcher_BG32_324_G],\r\n\tbaseAvengeValue: (cardId: string) => 3,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.DrustfallenButcher_BG32_324_G ? 2 : 1;\r\n\t\tconst cardsToAdd = Array(mult).fill(CardIds.Butchering_BG28_604);\r\n\t\taddCardsInHand(input.hero, input.board, cardsToAdd, input.gameState);\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"drustfallen-butcher.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/drustfallen-butcher.ts"],"names":[],"mappings":";;;AAUA,qEAAmE;AAGtD,QAAA,kBAAkB,GAAe;IAC7C,OAAO,EAAE,0BAA4E;IACrF,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,YAA6B,CAAC;QACjE,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Drustfallen Butcher\r\n * Avenge (4): Get a Butchering.\r\n *\r\n * Golden Drustfallen Butcher\r\n * Avenge (4): Get 2 Butcherings.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const DrustfallenButcher: AvengeCard = {\r\n\tcardIds: [CardIds.DrustfallenButcher_BG32_324, CardIds.DrustfallenButcher_BG32_324_G],\r\n\tbaseAvengeValue: (cardId: string) => 4,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.DrustfallenButcher_BG32_324_G ? 2 : 1;\r\n\t\tconst cardsToAdd = Array(mult).fill(CardIds.Butchering_BG28_604);\r\n\t\taddCardsInHand(input.hero, input.board, cardsToAdd, input.gameState);\r\n\t},\r\n};\r\n"]}
@@ -6,8 +6,10 @@ exports.FacelessConverter = {
6
6
  cardIds: ["BG36_318", "BG36_318_G"],
7
7
  deathrattleEffect: (minion, input) => {
8
8
  const mult = minion.cardId === "BG36_318_G" ? 2 : 1;
9
- const amount = mult * 2 * (1 + input.boardWithDeadEntityHero.globalInfo.TavernSpellsCastThisGame);
10
- (0, deity_1.buffYourDeity)(input.boardWithDeadEntityHero, input.boardWithDeadEntity, minion, amount, amount, input.gameState);
9
+ const base = 1 + input.boardWithDeadEntityHero.globalInfo.TavernSpellsCastThisGame;
10
+ const atk = 2 * mult * base;
11
+ const hp = 1 * mult * base;
12
+ (0, deity_1.buffYourDeity)(input.boardWithDeadEntityHero, input.boardWithDeadEntity, minion, atk, hp, input.gameState);
11
13
  },
12
14
  };
13
15
  //# 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":";;;AAUA,qDAA0D;AAG7C,QAAA,iBAAiB,GAA0B;IACvD,OAAO,EAAE,0BAA0E;IACnF,iBAAiB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,wBAAwB,CAAC,CAAC;QAClG,IAAA,qBAAa,EACZ,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,mBAAmB,EACzB,MAAM,EACN,MAAM,EACN,MAAM,EACN,KAAK,CAAC,SAAS,CACf,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Faceless Converter (Tier 5, 5/5)\r\n * Deathrattle: Give your Deity +1/+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 +2/+2 (improved by each Tavern spell you've cast this game).\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 { buffYourDeity } from '../../../simulation/deity';\r\nimport { DeathrattleEffectCard } from '../../card.interface';\r\n\r\nexport const FacelessConverter: DeathrattleEffectCard = {\r\n\tcardIds: [CardIds.FacelessConverter_BG36_318, CardIds.FacelessConverter_BG36_318_G],\r\n\tdeathrattleEffect: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.FacelessConverter_BG36_318_G ? 2 : 1;\r\n\t\tconst amount = mult * 2 * (1 + input.boardWithDeadEntityHero.globalInfo.TavernSpellsCastThisGame);\r\n\t\tbuffYourDeity(\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tminion,\r\n\t\t\tamount,\r\n\t\t\tamount,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"faceless-converter.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/faceless-converter.ts"],"names":[],"mappings":";;;AAUA,qDAA0D;AAG7C,QAAA,iBAAiB,GAA0B;IACvD,OAAO,EAAE,0BAA0E;IACnF,iBAAiB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,wBAAwB,CAAC;QACnF,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QAC3B,IAAA,qBAAa,EAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,mBAAmB,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC3G,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Faceless Converter (Tier 5, 5/5)\r\n * Deathrattle: Give your Deity +1/+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 +2/+2 (improved by each Tavern spell you've cast this game).\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 { buffYourDeity } from '../../../simulation/deity';\r\nimport { DeathrattleEffectCard } from '../../card.interface';\r\n\r\nexport const FacelessConverter: DeathrattleEffectCard = {\r\n\tcardIds: [CardIds.FacelessConverter_BG36_318, CardIds.FacelessConverter_BG36_318_G],\r\n\tdeathrattleEffect: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.FacelessConverter_BG36_318_G ? 2 : 1;\r\n\t\tconst base = 1 + input.boardWithDeadEntityHero.globalInfo.TavernSpellsCastThisGame;\r\n\t\tconst atk = 2 * mult * base;\r\n\t\tconst hp = 1 * mult * base;\r\n\t\tbuffYourDeity(input.boardWithDeadEntityHero, input.boardWithDeadEntity, minion, atk, hp, input.gameState);\r\n\t},\r\n};\r\n"]}
@@ -5,9 +5,8 @@ const deity_1 = require("../../../simulation/deity");
5
5
  exports.Joyous = {
6
6
  cardIds: ["BG36_110", "BG36_110_G"],
7
7
  battlecry: (minion, input) => {
8
- const atk = minion.scriptDataNum1 || (minion.cardId === "BG36_110_G" ? 4 : 2);
9
- const hp = minion.scriptDataNum2 || atk;
10
- (0, deity_1.buffYourDeity)(input.hero, input.board, minion, atk, hp, input.gameState);
8
+ const mult = minion.cardId === "BG36_110_G" ? 2 : 1;
9
+ (0, deity_1.buffYourDeity)(input.hero, input.board, minion, 2 * mult, 1 * mult, input.gameState);
11
10
  return true;
12
11
  },
13
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"joyous.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/joyous.ts"],"names":[],"mappings":";;;AAUA,qDAA0D;AAG7C,QAAA,MAAM,GAAkB;IACpC,OAAO,EAAE,0BAAoD;IAC7D,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,MAAM,iBAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,MAAM,EAAE,GAAG,MAAM,CAAC,cAAc,IAAI,GAAG,CAAC;QACxC,IAAA,qBAAa,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Joyous (Tier 1, 2/3)\r\n * Battlecry: Give your Deity +2/+2.\r\n *\r\n * Golden Joyous (Tier 1, 4/6)\r\n * Battlecry: Give your Deity +4/+4.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { BattlecryInput } from '../../../simulation/battlecries';\r\nimport { buffYourDeity } from '../../../simulation/deity';\r\nimport { BattlecryCard } from '../../card.interface';\r\n\r\nexport const Joyous: BattlecryCard = {\r\n\tcardIds: [CardIds.Joyous_BG36_110, CardIds.Joyous_BG36_110_G],\r\n\tbattlecry: (minion: BoardEntity, input: BattlecryInput) => {\r\n\t\tconst atk = minion.scriptDataNum1 || (minion.cardId === CardIds.Joyous_BG36_110_G ? 4 : 2);\r\n\t\tconst hp = minion.scriptDataNum2 || atk;\r\n\t\tbuffYourDeity(input.hero, input.board, minion, atk, hp, input.gameState);\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"joyous.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/joyous.ts"],"names":[],"mappings":";;;AAUA,qDAA0D;AAG7C,QAAA,MAAM,GAAkB;IACpC,OAAO,EAAE,0BAAoD;IAC7D,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA8B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,IAAA,qBAAa,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACpF,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Joyous (Tier 1, 2/3)\r\n * Battlecry: Give your Deity +2/+2.\r\n *\r\n * Golden Joyous (Tier 1, 4/6)\r\n * Battlecry: Give your Deity +4/+4.\r\n */\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { BattlecryInput } from '../../../simulation/battlecries';\r\nimport { buffYourDeity } from '../../../simulation/deity';\r\nimport { BattlecryCard } from '../../card.interface';\r\n\r\nexport const Joyous: BattlecryCard = {\r\n\tcardIds: [CardIds.Joyous_BG36_110, CardIds.Joyous_BG36_110_G],\r\n\tbattlecry: (minion: BoardEntity, input: BattlecryInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.Joyous_BG36_110_G ? 2 : 1;\r\n\t\tbuffYourDeity(input.hero, input.board, minion, 2 * mult, 1 * mult, input.gameState);\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
@@ -13,7 +13,8 @@ exports.LurkingLeviathan = {
13
13
  if (!(0, utils_1.hasCorrectTribe)(input.spawned, input.hero, reference_data_1.Race.BEAST, input.gameState.anomalies, input.gameState.allCards)) {
14
14
  return;
15
15
  }
16
- const inc = minion.cardId === "BG35_602_G" ? 4 : 2;
16
+ const mult = minion.cardId === "BG35_602_G" ? 2 : 1;
17
+ const inc = 3 * mult;
17
18
  const atkBonus = minion.scriptDataNum1 || inc;
18
19
  (0, stats_1.modifyStats)(input.spawned, minion, atkBonus, 0, input.board, input.hero, input.gameState);
19
20
  minion.scriptDataNum1 = atkBonus + inc;
@@ -1 +1 @@
1
- {"version":3,"file":"lurking-leviathan.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/lurking-leviathan.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qDAAwD;AACxD,0CAAiD;AAGpC,QAAA,gBAAgB,GAAuB;IACnD,OAAO,EAAE,0BAAwE;IACjF,cAAc,EAAE,CAAC,MAAmB,EAAE,KAAwB,EAAE,EAAE;QACjE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;YAC/C,OAAO;SACP;QACD,IACC,CAAC,IAAA,uBAAe,EAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAC3G;YACD,OAAO;SACP;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,iBAAwC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,GAAG,CAAC;QAC9C,IAAA,mBAAW,EAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1F,MAAM,CAAC,cAAc,GAAG,QAAQ,GAAG,GAAG,CAAC;IACxC,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnOtherSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { OnOtherSpawnedCard } from '../../card.interface';\r\n\r\nexport const LurkingLeviathan: OnOtherSpawnedCard = {\r\n\tcardIds: [CardIds.LurkingLeviathan_BG35_602, CardIds.LurkingLeviathan_BG35_602_G],\r\n\tonOtherSpawned: (minion: BoardEntity, input: OnOtherSpawnInput) => {\r\n\t\tif (input.spawned.entityId === minion.entityId) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (\r\n\t\t\t!hasCorrectTribe(input.spawned, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards)\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst inc = minion.cardId === CardIds.LurkingLeviathan_BG35_602_G ? 4 : 2;\r\n\t\tconst atkBonus = minion.scriptDataNum1 || inc;\r\n\t\tmodifyStats(input.spawned, minion, atkBonus, 0, input.board, input.hero, input.gameState);\r\n\t\tminion.scriptDataNum1 = atkBonus + inc;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"lurking-leviathan.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/lurking-leviathan.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,qDAAwD;AACxD,0CAAiD;AAGpC,QAAA,gBAAgB,GAAuB;IACnD,OAAO,EAAE,0BAAwE;IACjF,cAAc,EAAE,CAAC,MAAmB,EAAE,KAAwB,EAAE,EAAE;QACjE,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,EAAE;YAC/C,OAAO;SACP;QACD,IACC,CAAC,IAAA,uBAAe,EAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,qBAAI,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAC3G;YACD,OAAO;SACP;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAwC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,GAAG,CAAC;QAC9C,IAAA,mBAAW,EAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1F,MAAM,CAAC,cAAc,GAAG,QAAQ,GAAG,GAAG,CAAC;IACxC,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnOtherSpawnInput } from '../../../simulation/add-minion-to-board';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { OnOtherSpawnedCard } from '../../card.interface';\r\n\r\nexport const LurkingLeviathan: OnOtherSpawnedCard = {\r\n\tcardIds: [CardIds.LurkingLeviathan_BG35_602, CardIds.LurkingLeviathan_BG35_602_G],\r\n\tonOtherSpawned: (minion: BoardEntity, input: OnOtherSpawnInput) => {\r\n\t\tif (input.spawned.entityId === minion.entityId) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (\r\n\t\t\t!hasCorrectTribe(input.spawned, input.hero, Race.BEAST, input.gameState.anomalies, input.gameState.allCards)\r\n\t\t) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst mult = minion.cardId === CardIds.LurkingLeviathan_BG35_602_G ? 2 : 1;\r\n\t\tconst inc = 3 * mult;\r\n\t\tconst atkBonus = minion.scriptDataNum1 || inc;\r\n\t\tmodifyStats(input.spawned, minion, atkBonus, 0, input.board, input.hero, input.gameState);\r\n\t\tminion.scriptDataNum1 = atkBonus + inc;\r\n\t},\r\n};\r\n"]}
@@ -13,6 +13,9 @@ exports.RelentlessDeflector = {
13
13
  if (input.target === minion && input.newValue) {
14
14
  (0, taunt_1.updateTaunt)(minion, true, input.board, input.hero, input.otherHero, input.gameState);
15
15
  }
16
+ else if (input.target === minion && !input.newValue) {
17
+ (0, taunt_1.updateTaunt)(minion, false, input.board, input.hero, input.otherHero, input.gameState);
18
+ }
16
19
  },
17
20
  };
18
21
  //# sourceMappingURL=relentless-deflector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"relentless-deflector.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/relentless-deflector.ts"],"names":[],"mappings":";;;AACA,mEAAiG;AACjG,mDAAsD;AAKzC,QAAA,mBAAmB,GAA2C;IAC1E,OAAO,EAAE,0BAA8E;IACvF,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,IAAA,kCAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7F,CAAC;IACD,qBAAqB,EAAE,CAAC,MAAmB,EAAE,KAAiC,EAAE,EAAE;QACjF,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE;YAC9C,IAAA,mBAAW,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACrF;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { OnDivineShieldUpdatedInput, updateDivineShield } from '../../../keywords/divine-shield';\r\nimport { updateTaunt } from '../../../keywords/taunt';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { AvengeCard, OnDivineShieldUpdatedCard } from '../../card.interface';\r\n\r\nexport const RelentlessDeflector: AvengeCard & OnDivineShieldUpdatedCard = {\r\n\tcardIds: [CardIds.RelentlessDeflector_BG34_405, CardIds.RelentlessDeflector_BG34_405_G],\r\n\tbaseAvengeValue: (cardId: string) => 3,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tupdateDivineShield(minion, input.board, input.hero, input.otherHero, true, input.gameState);\r\n\t},\r\n\tonDivineShieldUpdated: (minion: BoardEntity, input: OnDivineShieldUpdatedInput) => {\r\n\t\tif (input.target === minion && input.newValue) {\r\n\t\t\tupdateTaunt(minion, true, input.board, input.hero, input.otherHero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"relentless-deflector.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/relentless-deflector.ts"],"names":[],"mappings":";;;AACA,mEAAiG;AACjG,mDAAsD;AAKzC,QAAA,mBAAmB,GAA2C;IAC1E,OAAO,EAAE,0BAA8E;IACvF,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,IAAA,kCAAkB,EAAC,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAC7F,CAAC;IACD,qBAAqB,EAAE,CAAC,MAAmB,EAAE,KAAiC,EAAE,EAAE;QACjF,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE;YAC9C,IAAA,mBAAW,EAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACrF;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YACtD,IAAA,mBAAW,EAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACtF;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { OnDivineShieldUpdatedInput, updateDivineShield } from '../../../keywords/divine-shield';\r\nimport { updateTaunt } from '../../../keywords/taunt';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { AvengeCard, OnDivineShieldUpdatedCard } from '../../card.interface';\r\n\r\nexport const RelentlessDeflector: AvengeCard & OnDivineShieldUpdatedCard = {\r\n\tcardIds: [CardIds.RelentlessDeflector_BG34_405, CardIds.RelentlessDeflector_BG34_405_G],\r\n\tbaseAvengeValue: (cardId: string) => 3,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tupdateDivineShield(minion, input.board, input.hero, input.otherHero, true, input.gameState);\r\n\t},\r\n\tonDivineShieldUpdated: (minion: BoardEntity, input: OnDivineShieldUpdatedInput) => {\r\n\t\tif (input.target === minion && input.newValue) {\r\n\t\t\tupdateTaunt(minion, true, input.board, input.hero, input.otherHero, input.gameState);\r\n\t\t} else if (input.target === minion && !input.newValue) {\r\n\t\t\tupdateTaunt(minion, false, input.board, input.hero, input.otherHero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -9,6 +9,7 @@ const buildSinrunnerBlanchyRebornEntity = (deadEntity) => {
9
9
  divineShield: deadEntity.hadDivineShield,
10
10
  reborn: false,
11
11
  venomous: deadEntity.venomous || deadEntity.hadVenomous,
12
+ stealth: deadEntity.stealth || deadEntity.hadStealth,
12
13
  };
13
14
  };
14
15
  exports.buildSinrunnerBlanchyRebornEntity = buildSinrunnerBlanchyRebornEntity;
@@ -1 +1 @@
1
- {"version":3,"file":"sinrunner-blanchy.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/sinrunner-blanchy.ts"],"names":[],"mappings":";;;AAIO,MAAM,iCAAiC,GAAG,CAAC,UAAuB,EAAe,EAAE;IACzF,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;KACvD,CAAC;AACH,CAAC,CAAC;AATW,QAAA,iCAAiC,qCAS5C;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/** Reborn with full stats and bonus keywords (enchantments stripped by spread + fresh entity). */\r\nexport const buildSinrunnerBlanchyRebornEntity = (deadEntity: BoardEntity): 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};\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"]}
1
+ {"version":3,"file":"sinrunner-blanchy.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/sinrunner-blanchy.ts"],"names":[],"mappings":";;;AAIO,MAAM,iCAAiC,GAAG,CAAC,UAAuB,EAAe,EAAE;IACzF,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;KACpD,CAAC;AACH,CAAC,CAAC;AAVW,QAAA,iCAAiC,qCAU5C;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/** Reborn with full stats and bonus keywords (enchantments stripped by spread + fresh entity). */\r\nexport const buildSinrunnerBlanchyRebornEntity = (deadEntity: BoardEntity): 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};\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"]}
@@ -14,7 +14,9 @@ exports.TastyLobster = {
14
14
  const base = minion.cardId === "BG36_202_G" ? 2 : 1;
15
15
  const atkBuff = base * exports.lobsterBaseAttackBuff * (1 + input.boardWithDeadEntityHero.globalInfo.TastyLobstersBuff);
16
16
  const healthBuff = base * exports.lobsterBaseHealthBuff * (1 + input.boardWithDeadEntityHero.globalInfo.TastyLobstersBuff);
17
- const candidates = input.boardWithDeadEntity.filter((e) => (0, utils_2.hasCorrectTribe)(e, input.boardWithDeadEntityHero, reference_data_1.Race.BEAST, input.gameState.anomalies, input.gameState.allCards));
17
+ const candidates = input.boardWithDeadEntity.filter((e) => e.health > 0 &&
18
+ !e.definitelyDead &&
19
+ (0, utils_2.hasCorrectTribe)(e, input.boardWithDeadEntityHero, reference_data_1.Race.BEAST, input.gameState.anomalies, input.gameState.allCards));
18
20
  const targets = (0, utils_1.pickMultipleRandomAlive)(candidates, numberOfTargets);
19
21
  for (const target of targets) {
20
22
  (0, stats_1.modifyStats)(target, minion, atkBuff, healthBuff, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);