@firestone-hs/simulate-bgs-battle 1.1.745 → 1.1.746

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 (42) hide show
  1. package/dist/bgs-player-entity.d.ts +1 -0
  2. package/dist/bgs-player-entity.js.map +1 -1
  3. package/dist/cards/impl/bg-spell/misplaced-tea-set.js +1 -1
  4. package/dist/cards/impl/bg-spell/misplaced-tea-set.js.map +1 -1
  5. package/dist/cards/impl/enchantments/deaths-embrace.js +11 -7
  6. package/dist/cards/impl/enchantments/deaths-embrace.js.map +1 -1
  7. package/dist/cards/impl/hero-power/wax-warband.d.ts +0 -3
  8. package/dist/cards/impl/hero-power/wax-warband.js +3 -46
  9. package/dist/cards/impl/hero-power/wax-warband.js.map +1 -1
  10. package/dist/cards/impl/minion/diremuck-forager.js +5 -5
  11. package/dist/cards/impl/minion/diremuck-forager.js.map +1 -1
  12. package/dist/cards/impl/minion/elder-taggawag.js +1 -1
  13. package/dist/cards/impl/minion/elder-taggawag.js.map +1 -1
  14. package/dist/cards/impl/minion/lightfang-enforcer.js +1 -1
  15. package/dist/cards/impl/minion/lightfang-enforcer.js.map +1 -1
  16. package/dist/cards/impl/minion/sanguine-refiner.js +1 -1
  17. package/dist/cards/impl/minion/sanguine-refiner.js.map +1 -1
  18. package/dist/cards/impl/minion/timewarped-mythraw.js +1 -1
  19. package/dist/cards/impl/minion/timewarped-mythraw.js.map +1 -1
  20. package/dist/cards/impl/trinket/eclectic-shrine.js +1 -15
  21. package/dist/cards/impl/trinket/eclectic-shrine.js.map +1 -1
  22. package/dist/cards/impl/trinket/jar-o-gems.js +4 -1
  23. package/dist/cards/impl/trinket/jar-o-gems.js.map +1 -1
  24. package/dist/cards/impl/trinket/myrmidon-sticker.js +1 -1
  25. package/dist/cards/impl/trinket/myrmidon-sticker.js.map +1 -1
  26. package/dist/debug-state.d.ts +4 -1
  27. package/dist/debug-state.js.map +1 -1
  28. package/dist/services/utils.d.ts +5 -1
  29. package/dist/services/utils.js +4 -2
  30. package/dist/services/utils.js.map +1 -1
  31. package/dist/simulation/add-minion-to-board.js +2 -2
  32. package/dist/simulation/add-minion-to-board.js.map +1 -1
  33. package/dist/simulation/auras.js +1 -2
  34. package/dist/simulation/auras.js.map +1 -1
  35. package/dist/simulation/blood-gems.js +1 -1
  36. package/dist/simulation/blood-gems.js.map +1 -1
  37. package/dist/simulation/summon-when-space.js +1 -1
  38. package/dist/simulation/summon-when-space.js.map +1 -1
  39. package/dist/utils.d.ts +2 -1
  40. package/dist/utils.js +66 -29
  41. package/dist/utils.js.map +1 -1
  42. package/package.json +2 -2
@@ -119,6 +119,7 @@ export interface BgsPlayerGlobalInfo {
119
119
  DiremuckPendingSummons?: {
120
120
  foragerEntityId: number;
121
121
  remaining: number;
122
+ spawnRight: boolean;
122
123
  }[];
123
124
  }
124
125
  export interface BgsQuestEntity {
@@ -1 +1 @@
1
- {"version":3,"file":"bgs-player-entity.js","sourceRoot":"","sources":["../src/bgs-player-entity.ts"],"names":[],"mappings":"","sourcesContent":["import { GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardEnchantment, BoardEntity } from './board-entity';\r\nimport { BoardSecret } from './board-secret';\r\n\r\nexport interface BgsPlayerEntity {\r\n\tcardId: string;\r\n\t// readonly nonGhostCardId?: string;\r\n\thpLeft: number;\r\n\treadonly tavernTier: number;\r\n\theroPowers: readonly BgsHeroPower[];\r\n\r\n\t/** @deprecated */\r\n\theroPowerId?: string | undefined | null;\r\n\t/** @deprecated */\r\n\treadonly heroPowerEntityId?: number;\r\n\t/** @deprecated */\r\n\treadonly heroPowerUsed?: boolean;\r\n\t/** @deprecated */\r\n\treadonly heroPowerInfo?: number | string;\r\n\t/** @deprecated */\r\n\theroPowerInfo2?: number;\r\n\t/** @deprecated */\r\n\tavengeCurrent?: number;\r\n\t/** @deprecated */\r\n\tavengeDefault?: number;\r\n\t// For Ozumat\r\n\t/** @deprecated */\r\n\theroPowerActivated?: boolean;\r\n\r\n\tfriendly?: boolean;\r\n\tentityId?: number;\r\n\tquestEntities: BgsQuestEntity[];\r\n\tquestRewards?: string[];\r\n\tquestRewardEntities?: {\r\n\t\tcardId: string;\r\n\t\tentityId: number;\r\n\t\tavengeDefault?: number;\r\n\t\tavengeCurrent?: number;\r\n\t\tscriptDataNum1: number;\r\n\t}[];\r\n\thand?: BoardEntity[];\r\n\tsecrets?: BoardSecret[];\r\n\ttrinkets?: BoardTrinket[];\r\n\tglobalInfo?: BgsPlayerGlobalInfo;\r\n\tstartOfCombatDone?: boolean;\r\n\t// Not really used, but needed for compatibility with BoardEntity\r\n\tenchantments?: BoardEnchantment[];\r\n\r\n\tdeadEyeDamageDone?: number;\r\n\trapidReanimationMinion?: BoardEntity;\r\n\trapidReanimationIndexFromLeft?: number;\r\n\trapidReanimationIndexFromRight?: number;\r\n}\r\n\r\nexport interface BgsHeroPower {\r\n\tcardId: string;\r\n\tentityId: number;\r\n\tused: boolean;\r\n\tinfo: number | string | BoardEntity;\r\n\tinfo2: number;\r\n\tinfo3: number;\r\n\tinfo4: number;\r\n\tinfo5: number;\r\n\tinfo6: number;\r\n\tscoreValue1?: number;\r\n\tscoreValue2?: number;\r\n\tscoreValue3?: number;\r\n\tavengeCurrent?: number;\r\n\tavengeDefault?: number;\r\n\tlocked?: number;\r\n\t// Always false when coming from the input, we set it in the appropriate place\r\n\tready?: boolean;\r\n\t// For Ozumat's Tentacular\r\n\tactivated?: boolean;\r\n}\r\n\r\nexport interface BgsPlayerGlobalInfo {\r\n\tEternalKnightsDeadThisGame?: number;\r\n\t// Flat buff carried over between combats, from Eternal Portrait. Unlike EternalKnightsDeadThisGame,\r\n\t// this is not doubled for golden Eternal Knights\r\n\tEternalKnightAttackBuff?: number;\r\n\tEternalKnightHealthBuff?: number;\r\n\tSanlaynScribesDeadThisGame?: number;\r\n\tUndeadAttackBonus?: number;\r\n\tUndeadHealthBonus?: number;\r\n\tHauntedCarapaceAttackBonus?: number;\r\n\tHauntedCarapaceHealthBonus?: number;\r\n\tFrostlingBonus?: number;\r\n\tBloodGemAttackBonus?: number;\r\n\tBloodGemHealthBonus?: number;\r\n\tGoldrinnBuffAtk?: number;\r\n\tGoldrinnBuffHealth?: number;\r\n\tSpellsCastThisGame?: number;\r\n\tTavernSpellsCastThisGame?: number;\r\n\t/** Resets each recruit turn (client or future sim hook). */\r\n\tTavernSpellsCastThisTurn?: number;\r\n\t/** Minions and tavern spells played this recruit turn (for Brazen Buccaneer, etc.). */\r\n\tCardsPlayedThisTurn?: number;\r\n\tElementalsPlayedThisTurn?: number;\r\n\tHighestTavernMinionAttack?: number;\r\n\tHighestTavernMinionHealth?: number;\r\n\tBackToBackCastThisGame?: number;\r\n\t/** Mama Mrrglton / Papa Mrrglton plays this game (both IDs count). */\r\n\tMrrgltonsPlayedThisGame?: number;\r\n\tPiratesPlayedThisGame?: number;\r\n\tBeastsSummonedThisGame?: number;\r\n\tBeastsSummonedThisCombat?: number;\r\n\tMagnetizedThisGame?: number;\r\n\tPiratesSummonedThisGame?: number;\r\n\tPirateAttackBonus?: number;\r\n\tMechAttackBonus?: number;\r\n\tAstralAutomatonsSummonedThisGame?: number;\r\n\tChoralAttackBuff?: number;\r\n\tChoralHealthBuff?: number;\r\n\tBeetleAttackBuff?: number;\r\n\tBeetleHealthBuff?: number;\r\n\t// There is some naming confusion. This is \"elementals grant more stats\", not \"elementals have more stats\"\r\n\tElementalAttackBuff?: number;\r\n\tElementalHealthBuff?: number;\r\n\t// Same for these pirates\r\n\tPirateAttackBuff?: number;\r\n\tPirateHealthBuff?: number;\r\n\tTavernSpellHealthBuff?: number;\r\n\tTavernSpellAttackBuff?: number;\r\n\tGoldSpentThisGame?: number;\r\n\tVolumizerHealthBuff?: number;\r\n\tVolumizerAttackBuff?: number;\r\n\tWhelpAttackBuff?: number;\r\n\tWhelpHealthBuff?: number;\r\n\tDeepBluesPlayed?: number;\r\n\tTastyLobstersBuff?: number;\r\n\tGoldenMinionsPlayedThisGame?: number;\r\n\r\n\tMutatedLasherAttackBuff?: number;\r\n\tMutatedLasherHealthBuff?: number;\r\n\tBattlecriesTriggeredThisGame?: number;\r\n\t/** Falling Sky Golem and similar; incremented when a deathrattle effect resolves for this hero's board. */\r\n\tDeathrattlesTriggeredThisGame?: number;\r\n\tFriendlyMinionsDeadLastCombat?: number;\r\n\tAdditionalAttack?: number;\r\n\t/**\r\n\t * Friendly minions with Rally that attacked this combat (once per attack action).\r\n\t * Full-env writes this back for Herding Horn free-Refresh grants.\r\n\t */\r\n\tRallyMinionAttacksThisCombat?: number;\r\n\t/** Fresh Perspective (and similar): free refreshes earned from combat deathrattles. */\r\n\tFreeRefreshesGainedThisCombat?: number;\r\n\t/** Demonology / Laboratory Assistant: Fodder injected into the next N refreshes. */\r\n\tfodderRefreshes?: number;\r\n\tfodderPerRefresh?: number;\r\n\t/**\r\n\t * Extra maximum gold next recruit turn (Timewarped Recycler Avenge, etc.).\r\n\t * Full-env copies this via combat globalInfo writeback.\r\n\t */\r\n\tmaxGoldBonus?: number;\r\n\r\n\t// --- BG 35.2 shop-adjacent (client may set; minion modules read where applicable) ---\r\n\t/** Cataclysmic Harbinger: last tavern spell card ID you cast (set in cast-tavern-spell). */\r\n\tLastTavernSpellCardId?: string;\r\n\t/** Diremuck Forager: how many hand summons are still owed when space opens (targets picked at resolve time). */\r\n\tDiremuckPendingSummons?: { foragerEntityId: number; remaining: number }[];\r\n}\r\n\r\nexport interface BgsQuestEntity {\r\n\tCardId: string;\r\n\tRewardDbfId: number;\r\n\tProgressCurrent: number;\r\n\tProgressTotal: number;\r\n}\r\n\r\nexport interface BoardTrinket {\r\n\tcardId: string;\r\n\tentityId: number;\r\n\tscriptDataNum1: number;\r\n\tscriptDataNum2?: number;\r\n\tscriptDataNum6?: number;\r\n\ttags?: {\r\n\t\t[key in GameTag]?: number;\r\n\t};\r\n\trememberedMinions?: BoardEntity[];\r\n\tavengeDefault?: number;\r\n\tavengeCurrent?: number;\r\n}\r\n"]}
1
+ {"version":3,"file":"bgs-player-entity.js","sourceRoot":"","sources":["../src/bgs-player-entity.ts"],"names":[],"mappings":"","sourcesContent":["import { GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardEnchantment, BoardEntity } from './board-entity';\r\nimport { BoardSecret } from './board-secret';\r\n\r\nexport interface BgsPlayerEntity {\r\n\tcardId: string;\r\n\t// readonly nonGhostCardId?: string;\r\n\thpLeft: number;\r\n\treadonly tavernTier: number;\r\n\theroPowers: readonly BgsHeroPower[];\r\n\r\n\t/** @deprecated */\r\n\theroPowerId?: string | undefined | null;\r\n\t/** @deprecated */\r\n\treadonly heroPowerEntityId?: number;\r\n\t/** @deprecated */\r\n\treadonly heroPowerUsed?: boolean;\r\n\t/** @deprecated */\r\n\treadonly heroPowerInfo?: number | string;\r\n\t/** @deprecated */\r\n\theroPowerInfo2?: number;\r\n\t/** @deprecated */\r\n\tavengeCurrent?: number;\r\n\t/** @deprecated */\r\n\tavengeDefault?: number;\r\n\t// For Ozumat\r\n\t/** @deprecated */\r\n\theroPowerActivated?: boolean;\r\n\r\n\tfriendly?: boolean;\r\n\tentityId?: number;\r\n\tquestEntities: BgsQuestEntity[];\r\n\tquestRewards?: string[];\r\n\tquestRewardEntities?: {\r\n\t\tcardId: string;\r\n\t\tentityId: number;\r\n\t\tavengeDefault?: number;\r\n\t\tavengeCurrent?: number;\r\n\t\tscriptDataNum1: number;\r\n\t}[];\r\n\thand?: BoardEntity[];\r\n\tsecrets?: BoardSecret[];\r\n\ttrinkets?: BoardTrinket[];\r\n\tglobalInfo?: BgsPlayerGlobalInfo;\r\n\tstartOfCombatDone?: boolean;\r\n\t// Not really used, but needed for compatibility with BoardEntity\r\n\tenchantments?: BoardEnchantment[];\r\n\r\n\tdeadEyeDamageDone?: number;\r\n\trapidReanimationMinion?: BoardEntity;\r\n\trapidReanimationIndexFromLeft?: number;\r\n\trapidReanimationIndexFromRight?: number;\r\n}\r\n\r\nexport interface BgsHeroPower {\r\n\tcardId: string;\r\n\tentityId: number;\r\n\tused: boolean;\r\n\tinfo: number | string | BoardEntity;\r\n\tinfo2: number;\r\n\tinfo3: number;\r\n\tinfo4: number;\r\n\tinfo5: number;\r\n\tinfo6: number;\r\n\tscoreValue1?: number;\r\n\tscoreValue2?: number;\r\n\tscoreValue3?: number;\r\n\tavengeCurrent?: number;\r\n\tavengeDefault?: number;\r\n\tlocked?: number;\r\n\t// Always false when coming from the input, we set it in the appropriate place\r\n\tready?: boolean;\r\n\t// For Ozumat's Tentacular\r\n\tactivated?: boolean;\r\n}\r\n\r\nexport interface BgsPlayerGlobalInfo {\r\n\tEternalKnightsDeadThisGame?: number;\r\n\t// Flat buff carried over between combats, from Eternal Portrait. Unlike EternalKnightsDeadThisGame,\r\n\t// this is not doubled for golden Eternal Knights\r\n\tEternalKnightAttackBuff?: number;\r\n\tEternalKnightHealthBuff?: number;\r\n\tSanlaynScribesDeadThisGame?: number;\r\n\tUndeadAttackBonus?: number;\r\n\tUndeadHealthBonus?: number;\r\n\tHauntedCarapaceAttackBonus?: number;\r\n\tHauntedCarapaceHealthBonus?: number;\r\n\tFrostlingBonus?: number;\r\n\tBloodGemAttackBonus?: number;\r\n\tBloodGemHealthBonus?: number;\r\n\tGoldrinnBuffAtk?: number;\r\n\tGoldrinnBuffHealth?: number;\r\n\tSpellsCastThisGame?: number;\r\n\tTavernSpellsCastThisGame?: number;\r\n\t/** Resets each recruit turn (client or future sim hook). */\r\n\tTavernSpellsCastThisTurn?: number;\r\n\t/** Minions and tavern spells played this recruit turn (for Brazen Buccaneer, etc.). */\r\n\tCardsPlayedThisTurn?: number;\r\n\tElementalsPlayedThisTurn?: number;\r\n\tHighestTavernMinionAttack?: number;\r\n\tHighestTavernMinionHealth?: number;\r\n\tBackToBackCastThisGame?: number;\r\n\t/** Mama Mrrglton / Papa Mrrglton plays this game (both IDs count). */\r\n\tMrrgltonsPlayedThisGame?: number;\r\n\tPiratesPlayedThisGame?: number;\r\n\tBeastsSummonedThisGame?: number;\r\n\tBeastsSummonedThisCombat?: number;\r\n\tMagnetizedThisGame?: number;\r\n\tPiratesSummonedThisGame?: number;\r\n\tPirateAttackBonus?: number;\r\n\tMechAttackBonus?: number;\r\n\tAstralAutomatonsSummonedThisGame?: number;\r\n\tChoralAttackBuff?: number;\r\n\tChoralHealthBuff?: number;\r\n\tBeetleAttackBuff?: number;\r\n\tBeetleHealthBuff?: number;\r\n\t// There is some naming confusion. This is \"elementals grant more stats\", not \"elementals have more stats\"\r\n\tElementalAttackBuff?: number;\r\n\tElementalHealthBuff?: number;\r\n\t// Same for these pirates\r\n\tPirateAttackBuff?: number;\r\n\tPirateHealthBuff?: number;\r\n\tTavernSpellHealthBuff?: number;\r\n\tTavernSpellAttackBuff?: number;\r\n\tGoldSpentThisGame?: number;\r\n\tVolumizerHealthBuff?: number;\r\n\tVolumizerAttackBuff?: number;\r\n\tWhelpAttackBuff?: number;\r\n\tWhelpHealthBuff?: number;\r\n\tDeepBluesPlayed?: number;\r\n\tTastyLobstersBuff?: number;\r\n\tGoldenMinionsPlayedThisGame?: number;\r\n\r\n\tMutatedLasherAttackBuff?: number;\r\n\tMutatedLasherHealthBuff?: number;\r\n\tBattlecriesTriggeredThisGame?: number;\r\n\t/** Falling Sky Golem and similar; incremented when a deathrattle effect resolves for this hero's board. */\r\n\tDeathrattlesTriggeredThisGame?: number;\r\n\tFriendlyMinionsDeadLastCombat?: number;\r\n\tAdditionalAttack?: number;\r\n\t/**\r\n\t * Friendly minions with Rally that attacked this combat (once per attack action).\r\n\t * Full-env writes this back for Herding Horn free-Refresh grants.\r\n\t */\r\n\tRallyMinionAttacksThisCombat?: number;\r\n\t/** Fresh Perspective (and similar): free refreshes earned from combat deathrattles. */\r\n\tFreeRefreshesGainedThisCombat?: number;\r\n\t/** Demonology / Laboratory Assistant: Fodder injected into the next N refreshes. */\r\n\tfodderRefreshes?: number;\r\n\tfodderPerRefresh?: number;\r\n\t/**\r\n\t * Extra maximum gold next recruit turn (Timewarped Recycler Avenge, etc.).\r\n\t * Full-env copies this via combat globalInfo writeback.\r\n\t */\r\n\tmaxGoldBonus?: number;\r\n\r\n\t// --- BG 35.2 shop-adjacent (client may set; minion modules read where applicable) ---\r\n\t/** Cataclysmic Harbinger: last tavern spell card ID you cast (set in cast-tavern-spell). */\r\n\tLastTavernSpellCardId?: string;\r\n\t/** Diremuck Forager: how many hand summons are still owed when space opens (targets picked at resolve time). */\r\n\tDiremuckPendingSummons?: { foragerEntityId: number; remaining: number; spawnRight: boolean }[];\r\n}\r\n\r\nexport interface BgsQuestEntity {\r\n\tCardId: string;\r\n\tRewardDbfId: number;\r\n\tProgressCurrent: number;\r\n\tProgressTotal: number;\r\n}\r\n\r\nexport interface BoardTrinket {\r\n\tcardId: string;\r\n\tentityId: number;\r\n\tscriptDataNum1: number;\r\n\tscriptDataNum2?: number;\r\n\tscriptDataNum6?: number;\r\n\ttags?: {\r\n\t\t[key in GameTag]?: number;\r\n\t};\r\n\trememberedMinions?: BoardEntity[];\r\n\tavengeDefault?: number;\r\n\tavengeCurrent?: number;\r\n}\r\n"]}
@@ -7,7 +7,7 @@ exports.MisplacedTeaSet = {
7
7
  cardIds: ["BG28_888"],
8
8
  castTavernSpell: (_spellCardId, input) => {
9
9
  const { attack, health } = (0, utils_1.withTavernSpellStatBuff)(input.hero, 4, 4, input.gameState.allCards, input.spellCardId);
10
- const targets = (0, utils_1.getMinionsOfDifferentTypes)(input.board, input.hero, input.gameState);
10
+ const targets = (0, utils_1.getMinionsOfDifferentTypes)(input.board, input.hero, input.gameState, true, 99, input.source);
11
11
  for (const target of targets) {
12
12
  (0, stats_1.modifyStats)(target, input.source, attack, health, input.board, input.hero, input.gameState);
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"misplaced-tea-set.js","sourceRoot":"","sources":["../../../../src/cards/impl/bg-spell/misplaced-tea-set.ts"],"names":[],"mappings":";;;AAKA,qDAAwD;AACxD,0CAAqF;AAGxE,QAAA,eAAe,GAAoB;IAC/C,OAAO,EAAE,YAAkC;IAC3C,eAAe,EAAE,CAAC,YAAoB,EAAE,KAAqB,EAAE,EAAE;QAChE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,+BAAuB,EACjD,KAAK,CAAC,IAAI,EACV,CAAC,EACD,CAAC,EACD,KAAK,CAAC,SAAS,CAAC,QAAQ,EACxB,KAAK,CAAC,WAAW,CACjB,CAAC;QACF,MAAM,OAAO,GAAG,IAAA,kCAA0B,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACrF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC5F;IACF,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Misplaced Tea Set (3 gold)\r\n * Give a friendly minion of each type +4/+4.\r\n */\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getMinionsOfDifferentTypes, withTavernSpellStatBuff } from '../../../utils';\r\nimport { CastSpellInput, TavernSpellCard } from '../../card.interface';\r\n\r\nexport const MisplacedTeaSet: TavernSpellCard = {\r\n\tcardIds: [CardIds.MisplacedTeaSet_BG28_888],\r\n\tcastTavernSpell: (_spellCardId: string, input: CastSpellInput) => {\r\n\t\tconst { attack, health } = withTavernSpellStatBuff(\r\n\t\t\tinput.hero,\r\n\t\t\t4,\r\n\t\t\t4,\r\n\t\t\tinput.gameState.allCards,\r\n\t\t\tinput.spellCardId,\r\n\t\t);\r\n\t\tconst targets = getMinionsOfDifferentTypes(input.board, input.hero, input.gameState);\r\n\t\tfor (const target of targets) {\r\n\t\t\tmodifyStats(target, input.source, attack, health, input.board, input.hero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"misplaced-tea-set.js","sourceRoot":"","sources":["../../../../src/cards/impl/bg-spell/misplaced-tea-set.ts"],"names":[],"mappings":";;;AAKA,qDAAwD;AACxD,0CAAqF;AAGxE,QAAA,eAAe,GAAoB;IAC/C,OAAO,EAAE,YAAkC;IAC3C,eAAe,EAAE,CAAC,YAAoB,EAAE,KAAqB,EAAE,EAAE;QAChE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,+BAAuB,EACjD,KAAK,CAAC,IAAI,EACV,CAAC,EACD,CAAC,EACD,KAAK,CAAC,SAAS,CAAC,QAAQ,EACxB,KAAK,CAAC,WAAW,CACjB,CAAC;QACF,MAAM,OAAO,GAAG,IAAA,kCAA0B,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7G,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC5F;IACF,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Misplaced Tea Set (3 gold)\r\n * Give a friendly minion of each type +4/+4.\r\n */\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getMinionsOfDifferentTypes, withTavernSpellStatBuff } from '../../../utils';\r\nimport { CastSpellInput, TavernSpellCard } from '../../card.interface';\r\n\r\nexport const MisplacedTeaSet: TavernSpellCard = {\r\n\tcardIds: [CardIds.MisplacedTeaSet_BG28_888],\r\n\tcastTavernSpell: (_spellCardId: string, input: CastSpellInput) => {\r\n\t\tconst { attack, health } = withTavernSpellStatBuff(\r\n\t\t\tinput.hero,\r\n\t\t\t4,\r\n\t\t\t4,\r\n\t\t\tinput.gameState.allCards,\r\n\t\t\tinput.spellCardId,\r\n\t\t);\r\n\t\tconst targets = getMinionsOfDifferentTypes(input.board, input.hero, input.gameState, true, 99, input.source);\r\n\t\tfor (const target of targets) {\r\n\t\t\tmodifyStats(target, input.source, attack, health, input.board, input.hero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -1,15 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DeathsEmbrace = void 0;
4
- const atkBuff = 2;
5
- const healthBuff = 2;
4
+ const atkBuff = 1;
5
+ const healthBuff = 1;
6
6
  exports.DeathsEmbrace = {
7
- cardIds: ["BG36_MidGameEffect_000t29e"],
7
+ cardIds: [
8
+ "BG36_MidGameEffect_000t29te",
9
+ "BG36_MidGameEffect_000t29e",
10
+ ],
8
11
  onDeathrattleTriggered: (minion, input) => {
9
- minion.attack += atkBuff;
10
- minion.maxAttack += atkBuff;
11
- minion.health += healthBuff;
12
- minion.maxHealth += healthBuff;
12
+ const mult = minion.cardId === "BG36_MidGameEffect_000t29e" ? 2 : 1;
13
+ minion.attack += mult * atkBuff;
14
+ minion.maxAttack += mult * atkBuff;
15
+ minion.health += mult * healthBuff;
16
+ minion.maxHealth += mult * healthBuff;
13
17
  return [];
14
18
  },
15
19
  };
@@ -1 +1 @@
1
- {"version":3,"file":"deaths-embrace.js","sourceRoot":"","sources":["../../../../src/cards/impl/enchantments/deaths-embrace.ts"],"names":[],"mappings":";;;AASA,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,UAAU,GAAG,CAAC,CAAC;AAER,QAAA,aAAa,GAA6B;IACtD,OAAO,EAAE,8BAA2E;IACpF,sBAAsB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAiB,EAAE;QAChG,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC;QACzB,MAAM,CAAC,SAAS,IAAI,OAAO,CAAC;QAC5B,MAAM,CAAC,MAAM,IAAI,UAAU,CAAC;QAC5B,MAAM,CAAC,SAAS,IAAI,UAAU,CAAC;QAC/B,OAAO,EAAE,CAAC;IACX,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 { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { DeathrattleTriggeredCard } from '../../card.interface';\r\n\r\nconst atkBuff = 2;\r\nconst healthBuff = 2;\r\n\r\nexport const DeathsEmbrace: DeathrattleTriggeredCard = {\r\n\tcardIds: [CardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e],\r\n\tonDeathrattleTriggered: (minion: BoardEntity, input: DeathrattleTriggeredInput): BoardEntity[] => {\r\n\t\tminion.attack += atkBuff;\r\n\t\tminion.maxAttack += atkBuff;\r\n\t\tminion.health += healthBuff;\r\n\t\tminion.maxHealth += healthBuff;\r\n\t\treturn [];\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":";;;AASA,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,UAAU,GAAG,CAAC,CAAC;AAER,QAAA,aAAa,GAA6B;IACtD,OAAO,EAAE;;;KAGR;IACD,sBAAsB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAiB,EAAE;QAChG,MAAM,IAAI,GACT,MAAM,CAAC,MAAM,iCAA8E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrG,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,OAAO,CAAC;QAChC,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,OAAO,CAAC;QACnC,MAAM,CAAC,MAAM,IAAI,IAAI,GAAG,UAAU,CAAC;QACnC,MAAM,CAAC,SAAS,IAAI,IAAI,GAAG,UAAU,CAAC;QACtC,OAAO,EAAE,CAAC;IACX,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 { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { DeathrattleTriggeredCard } from '../../card.interface';\r\n\r\nconst atkBuff = 1;\r\nconst healthBuff = 1;\r\n\r\nexport const DeathsEmbrace: DeathrattleTriggeredCard = {\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\tonDeathrattleTriggered: (minion: BoardEntity, input: DeathrattleTriggeredInput): BoardEntity[] => {\r\n\t\tconst mult =\r\n\t\t\tminion.cardId === CardIds.DeathsEmbrace_DeathsEmbraceEnchantment_BG36_MidGameEffect_000t29e ? 2 : 1;\r\n\t\tminion.attack += mult * atkBuff;\r\n\t\tminion.maxAttack += mult * atkBuff;\r\n\t\tminion.health += mult * healthBuff;\r\n\t\tminion.maxHealth += mult * healthBuff;\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
@@ -1,5 +1,2 @@
1
- import { AllCardsService, Race } from '@firestone-hs/reference-data';
2
- import { BoardEntity } from '../../../board-entity';
3
1
  import { StartOfCombatCard } from '../../card.interface';
4
2
  export declare const WaxWarband: StartOfCombatCard;
5
- export declare const selectMinions: (minions: BoardEntity[], tribes: Race[], allCards: AllCardsService) => BoardEntity[];
@@ -1,10 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.selectMinions = exports.WaxWarband = void 0;
4
- const reference_data_1 = require("@firestone-hs/reference-data");
5
- const utils_1 = require("../../../services/utils");
3
+ exports.WaxWarband = void 0;
6
4
  const stats_1 = require("../../../simulation/stats");
7
- const utils_2 = require("../../../utils");
5
+ const utils_1 = require("../../../utils");
8
6
  exports.WaxWarband = {
9
7
  startOfCombatTiming: 'pre-combat',
10
8
  cardIds: ["TB_BaconShop_HP_037a"],
@@ -12,19 +10,7 @@ exports.WaxWarband = {
12
10
  for (const heroPower of input.playerEntity.heroPowers) {
13
11
  if (exports.WaxWarband.cardIds.includes(heroPower.cardId) && heroPower.used) {
14
12
  if (input.playerBoard.length > 0) {
15
- const boardWithTribes = input.playerBoard.filter((e) => !!(0, utils_2.getEffectiveTribesForEntity)(e, input.playerEntity, input.gameState.anomalies, input.gameState.allCards).length);
16
- const boardWithoutAll = boardWithTribes.filter((e) => {
17
- var _a;
18
- return !((_a = (0, utils_2.getEffectiveTribesForEntity)(e, input.playerEntity, input.gameState.anomalies, input.gameState.allCards)) === null || _a === void 0 ? void 0 : _a.includes(reference_data_1.Race.ALL));
19
- });
20
- const selectedMinions = (0, exports.selectMinions)(boardWithoutAll, reference_data_1.ALL_BG_RACES, input.gameState.allCards);
21
- const allMinions = [
22
- ...selectedMinions,
23
- ...boardWithTribes.filter((e) => {
24
- var _a;
25
- return (_a = (0, utils_2.getEffectiveTribesForEntity)(e, input.playerEntity, input.gameState.anomalies, input.gameState.allCards)) === null || _a === void 0 ? void 0 : _a.includes(reference_data_1.Race.ALL);
26
- }),
27
- ];
13
+ const allMinions = (0, utils_1.getMinionsOfDifferentTypes)(input.playerBoard, input.playerEntity, input.gameState, true, 99, heroPower);
28
14
  allMinions.forEach((e) => {
29
15
  var _a, _b, _c;
30
16
  const buff = typeof heroPower.info3 === 'number' && heroPower.info3 > 0
@@ -38,33 +24,4 @@ exports.WaxWarband = {
38
24
  }
39
25
  },
40
26
  };
41
- const selectMinions = (minions, tribes, allCards) => {
42
- var _a, _b;
43
- const minionsByTribe = {};
44
- for (const minion of minions) {
45
- for (const tribe of (_a = allCards.getCard(minion.cardId).races) !== null && _a !== void 0 ? _a : []) {
46
- if (!minionsByTribe[tribe]) {
47
- minionsByTribe[tribe] = [];
48
- }
49
- minionsByTribe[tribe].push(minion);
50
- }
51
- }
52
- for (const tribe of reference_data_1.ALL_BG_RACES) {
53
- minionsByTribe[tribe] = (0, utils_1.shuffleArray)((_b = minionsByTribe[reference_data_1.Race[tribe]]) !== null && _b !== void 0 ? _b : []);
54
- }
55
- const selectedMinions = [];
56
- for (const tribe of tribes) {
57
- if (minionsByTribe[tribe]) {
58
- minionsByTribe[tribe].sort((a, b) => allCards.getCard(a.cardId).races.length - allCards.getCard(b.cardId).races.length);
59
- for (const minion of minionsByTribe[tribe]) {
60
- if (!selectedMinions.includes(minion)) {
61
- selectedMinions.push(minion);
62
- break;
63
- }
64
- }
65
- }
66
- }
67
- return selectedMinions;
68
- };
69
- exports.selectMinions = selectMinions;
70
27
  //# sourceMappingURL=wax-warband.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"wax-warband.js","sourceRoot":"","sources":["../../../../src/cards/impl/hero-power/wax-warband.ts"],"names":[],"mappings":"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","sourcesContent":["import { ALL_BG_RACES, AllCardsService, Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { shuffleArray } from '../../../services/utils';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getEffectiveTribesForEntity } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const WaxWarband: StartOfCombatCard = {\r\n\tstartOfCombatTiming: 'pre-combat',\r\n\tcardIds: [CardIds.WaxWarband],\r\n\tstartOfCombat: (trinket: BoardTrinket, input: SoCInput) => {\r\n\t\tfor (const heroPower of input.playerEntity.heroPowers) {\r\n\t\t\tif (WaxWarband.cardIds.includes(heroPower.cardId) && heroPower.used) {\r\n\t\t\t\tif (input.playerBoard.length > 0) {\r\n\t\t\t\t\tconst boardWithTribes = input.playerBoard.filter(\r\n\t\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\t\t!!getEffectiveTribesForEntity(\r\n\t\t\t\t\t\t\t\te,\r\n\t\t\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t\t\t\t).length,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tconst boardWithoutAll = boardWithTribes.filter(\r\n\t\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\t\t!getEffectiveTribesForEntity(\r\n\t\t\t\t\t\t\t\te,\r\n\t\t\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t\t\t\t)?.includes(Race.ALL),\r\n\t\t\t\t\t);\r\n\t\t\t\t\tconst selectedMinions = selectMinions(boardWithoutAll, ALL_BG_RACES, input.gameState.allCards);\r\n\t\t\t\t\tconst allMinions = [\r\n\t\t\t\t\t\t...selectedMinions,\r\n\t\t\t\t\t\t...boardWithTribes.filter((e) =>\r\n\t\t\t\t\t\t\tgetEffectiveTribesForEntity(\r\n\t\t\t\t\t\t\t\te,\r\n\t\t\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t\t\t\t)?.includes(Race.ALL),\r\n\t\t\t\t\t\t),\r\n\t\t\t\t\t];\r\n\t\t\t\t\tallMinions.forEach((e) => {\r\n\t\t\t\t\t\t// Entity often omits TAG_SCRIPT_DATA_NUM_3 while still at the card default (1).\r\n\t\t\t\t\t\tconst buff =\r\n\t\t\t\t\t\t\ttypeof heroPower.info3 === 'number' && heroPower.info3 > 0\r\n\t\t\t\t\t\t\t\t? heroPower.info3\r\n\t\t\t\t\t\t\t\t: input.gameState.allCards.getCard(heroPower.cardId)?.tags?.[\r\n\t\t\t\t\t\t\t\t\t\t'TAG_SCRIPT_DATA_NUM_3'\r\n\t\t\t\t\t\t\t\t ] ?? 1;\r\n\t\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\t\te,\r\n\t\t\t\t\t\t\ttrinket,\r\n\t\t\t\t\t\t\t+buff,\r\n\t\t\t\t\t\t\t+buff,\r\n\t\t\t\t\t\t\tinput.playerBoard,\r\n\t\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\t\tinput.gameState,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n\r\n// Not perfect, as I don't think this solves the issue where some cards are mutually exclusive\r\nexport const selectMinions = (minions: BoardEntity[], tribes: Race[], allCards: AllCardsService): BoardEntity[] => {\r\n\t// Step 1\r\n\tconst minionsByTribe: { [tribe: string]: BoardEntity[] } = {};\r\n\tfor (const minion of minions) {\r\n\t\tfor (const tribe of allCards.getCard(minion.cardId).races ?? []) {\r\n\t\t\tif (!minionsByTribe[tribe]) {\r\n\t\t\t\tminionsByTribe[tribe] = [];\r\n\t\t\t}\r\n\t\t\tminionsByTribe[tribe].push(minion);\r\n\t\t}\r\n\t}\r\n\tfor (const tribe of ALL_BG_RACES) {\r\n\t\tminionsByTribe[tribe] = shuffleArray(minionsByTribe[Race[tribe]] ?? []);\r\n\t}\r\n\r\n\tconst selectedMinions: BoardEntity[] = [];\r\n\r\n\t// Step 3\r\n\tfor (const tribe of tribes) {\r\n\t\tif (minionsByTribe[tribe]) {\r\n\t\t\tminionsByTribe[tribe].sort(\r\n\t\t\t\t(a, b) => allCards.getCard(a.cardId).races.length - allCards.getCard(b.cardId).races.length,\r\n\t\t\t);\r\n\t\t\tfor (const minion of minionsByTribe[tribe]) {\r\n\t\t\t\tif (!selectedMinions.includes(minion)) {\r\n\t\t\t\t\tselectedMinions.push(minion);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Step 4\r\n\treturn selectedMinions;\r\n};\r\n"]}
1
+ {"version":3,"file":"wax-warband.js","sourceRoot":"","sources":["../../../../src/cards/impl/hero-power/wax-warband.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AACxD,0CAA4D;AAG/C,QAAA,UAAU,GAAsB;IAC5C,mBAAmB,EAAE,YAAY;IACjC,OAAO,EAAE,wBAAoB;IAC7B,aAAa,EAAE,CAAC,OAAqB,EAAE,KAAe,EAAE,EAAE;QACzD,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE;YACtD,IAAI,kBAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE;gBACpE,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;oBACjC,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAC5C,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,EACf,IAAI,EACJ,EAAE,EACF,SAAS,CACT,CAAC;oBACF,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;;wBAExB,MAAM,IAAI,GACT,OAAO,SAAS,CAAC,KAAK,KAAK,QAAQ,IAAI,SAAS,CAAC,KAAK,GAAG,CAAC;4BACzD,CAAC,CAAC,SAAS,CAAC,KAAK;4BACjB,CAAC,CAAC,MAAA,MAAA,MAAA,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,0CAAE,IAAI,0CAAG,uBAAuB,CAAC,mCACnF,CAAC,CAAC;wBACN,IAAA,mBAAW,EAAC,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC/F,CAAC,CAAC,CAAC;oBACH,OAAO,IAAI,CAAC;iBACZ;aACD;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\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 { getMinionsOfDifferentTypes } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const WaxWarband: StartOfCombatCard = {\r\n\tstartOfCombatTiming: 'pre-combat',\r\n\tcardIds: [CardIds.WaxWarband],\r\n\tstartOfCombat: (trinket: BoardTrinket, input: SoCInput) => {\r\n\t\tfor (const heroPower of input.playerEntity.heroPowers) {\r\n\t\t\tif (WaxWarband.cardIds.includes(heroPower.cardId) && heroPower.used) {\r\n\t\t\t\tif (input.playerBoard.length > 0) {\r\n\t\t\t\t\tconst allMinions = getMinionsOfDifferentTypes(\r\n\t\t\t\t\t\tinput.playerBoard,\r\n\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\tinput.gameState,\r\n\t\t\t\t\t\ttrue,\r\n\t\t\t\t\t\t99,\r\n\t\t\t\t\t\theroPower,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tallMinions.forEach((e) => {\r\n\t\t\t\t\t\t// Entity often omits TAG_SCRIPT_DATA_NUM_3 while still at the card default (1).\r\n\t\t\t\t\t\tconst buff =\r\n\t\t\t\t\t\t\ttypeof heroPower.info3 === 'number' && heroPower.info3 > 0\r\n\t\t\t\t\t\t\t\t? heroPower.info3\r\n\t\t\t\t\t\t\t\t: input.gameState.allCards.getCard(heroPower.cardId)?.tags?.['TAG_SCRIPT_DATA_NUM_3'] ??\r\n\t\t\t\t\t\t\t\t 1;\r\n\t\t\t\t\t\tmodifyStats(e, trinket, +buff, +buff, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\t\t\t\t});\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -7,7 +7,7 @@ const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
7
7
  const spawns_1 = require("../../../simulation/spawns");
8
8
  const utils_1 = require("../../../utils");
9
9
  const handMinionPredicate = (allCards) => (e) => !!e.maxHealth && (0, hand_minion_priority_1.isHandMinionCandidate)(e, (id) => { var _a; return (_a = allCards.getCard(id).type) === null || _a === void 0 ? void 0 : _a.toUpperCase(); });
10
- const summonHandMinionFromDiremuck = (forager, handTarget, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState) => {
10
+ const summonHandMinionFromDiremuck = (forager, handTarget, spawnRight, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState) => {
11
11
  var _a;
12
12
  handTarget.locked = true;
13
13
  const friendly = (_a = forager === null || forager === void 0 ? void 0 : forager.friendly) !== null && _a !== void 0 ? _a : playerEntity.friendly;
@@ -16,7 +16,7 @@ const summonHandMinionFromDiremuck = (forager, handTarget, playerBoard, playerEn
16
16
  s.onCanceledSummon = () => (handTarget.locked = false);
17
17
  }
18
18
  const spawnSource = forager !== null && forager !== void 0 ? forager : playerEntity;
19
- const indexFromRight = 0;
19
+ const indexFromRight = !spawnRight ? playerBoard.length - (playerBoard.indexOf(forager) + 1) : 0;
20
20
  (0, spawns_1.performEntitySpawns)(newMinions, playerBoard, playerEntity, spawnSource, indexFromRight, opponentBoard, opponentEntity, gameState);
21
21
  };
22
22
  const handleDiremuckPendingSummons = (playerBoard, playerEntity, opponentBoard, opponentEntity, gameState) => {
@@ -37,11 +37,11 @@ const handleDiremuckPendingSummons = (playerBoard, playerEntity, opponentBoard,
37
37
  if (!(handTarget === null || handTarget === void 0 ? void 0 : handTarget.cardId) || handTarget.locked) {
38
38
  break;
39
39
  }
40
- summonHandMinionFromDiremuck(forager, handTarget, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
40
+ summonHandMinionFromDiremuck(forager, handTarget, entry.spawnRight, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
41
41
  remaining--;
42
42
  }
43
43
  if (remaining > 0) {
44
- nextQueue.push({ foragerEntityId: entry.foragerEntityId, remaining });
44
+ nextQueue.push({ foragerEntityId: entry.foragerEntityId, remaining, spawnRight: entry.spawnRight });
45
45
  }
46
46
  }
47
47
  playerEntity.globalInfo.DiremuckPendingSummons = nextQueue.length ? nextQueue : undefined;
@@ -55,7 +55,7 @@ exports.DiremuckForager = {
55
55
  const totalWanted = minion.cardId === "BG27_556_G" ? 2 : 1;
56
56
  input.playerEntity.globalInfo.DiremuckPendingSummons = [
57
57
  ...((_a = input.playerEntity.globalInfo.DiremuckPendingSummons) !== null && _a !== void 0 ? _a : []),
58
- { foragerEntityId: minion.entityId, remaining: totalWanted },
58
+ { foragerEntityId: minion.entityId, remaining: totalWanted, spawnRight: input.playerBoard.length >= 7 },
59
59
  ];
60
60
  return true;
61
61
  },
@@ -1 +1 @@
1
- {"version":3,"file":"diremuck-forager.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/diremuck-forager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Diremuck Forager (Tier 4, 5/6)\r\n * Start of Combat: When you have space, summon the highest-Attack minion from your hand for this combat only.\r\n *\r\n * Golden Diremuck Forager (Tier 4, 10/12)\r\n * Start of Combat: When you have space, summon the two highest-Attack minions from your hand for this combat only.\r\n */\r\nimport { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { getHighestAttackHandMinions, isHandMinionCandidate } from '../../../services/hand-minion-priority';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { FullGameState } from '../../../simulation/internal-game-state';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nconst handMinionPredicate = (allCards: FullGameState['allCards']) => (e: BoardEntity) =>\r\n\t!!e.maxHealth && isHandMinionCandidate(e, (id) => allCards.getCard(id).type?.toUpperCase());\r\n\r\n/** If the Forager died after SOC, pass `null` — summons still resolve (spawn source = hero, index from right = 0). */\r\nconst summonHandMinionFromDiremuck = (\r\n\tforager: BoardEntity | null,\r\n\thandTarget: BoardEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\thandTarget.locked = true;\r\n\tconst friendly = forager?.friendly ?? playerEntity.friendly;\r\n\tconst newMinions = spawnEntities(\r\n\t\thandTarget.cardId,\r\n\t\t1,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t\tfriendly,\r\n\t\tfalse,\r\n\t\tfalse,\r\n\t\ttrue,\r\n\t\t{ ...handTarget } as BoardEntity,\r\n\t);\r\n\tfor (const s of newMinions) {\r\n\t\ts.onCanceledSummon = () => (handTarget.locked = false);\r\n\t}\r\n\tconst spawnSource = forager ?? playerEntity;\r\n\t// const indexFromRight = 0;\r\n\t// 2026-04-25: https://replays.firestoneapp.com/?reviewId=b498d69f-bf1b-4bc0-8902-3643434394d5&turn=23&action=3\r\n\t// Spawns right of the Forager, if it's on the board\r\n\t// const indexFromRight =\r\n\t// \tforager != null && playerBoard.includes(forager) ? playerBoard.length - (playerBoard.indexOf(forager) + 1) : 0;\r\n\t// UPDATE 2026-08-26: looks like that's not true anymore, it always spawns to the right\r\n\t// https://replays.firestoneapp.com/?reviewId=1d34f5b4-7e04-4b17-bcc0-353698abaed3&turn=25&action=1\r\n\tconst indexFromRight = 0;\r\n\tperformEntitySpawns(\r\n\t\tnewMinions,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\tspawnSource,\r\n\t\tindexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\n/** Called from `summon-when-space` when board space opens during start-of-combat. */\r\nexport const handleDiremuckPendingSummons = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst raw = playerEntity.globalInfo?.DiremuckPendingSummons;\r\n\tif (!raw?.length) {\r\n\t\treturn;\r\n\t}\r\n\tconst allCards = gameState.allCards;\r\n\tconst nextQueue: { foragerEntityId: number; remaining: number }[] = [];\r\n\r\n\tfor (const entry of raw) {\r\n\t\tlet remaining = entry.remaining;\r\n\t\tconst forager = playerBoard.find((e) => e.entityId === entry.foragerEntityId) ?? null;\r\n\t\twhile (playerBoard.length < 7 && remaining > 0) {\r\n\t\t\tconst candidates = playerEntity.hand.filter((e) =>\r\n\t\t\t\thasCorrectTribe(e, playerEntity, Race.MURLOC, gameState.anomalies, gameState.allCards),\r\n\t\t\t);\r\n\t\t\tconst targets = getHighestAttackHandMinions(candidates, 1, (e) => handMinionPredicate(allCards)(e));\r\n\t\t\tconst handTarget = targets[0];\r\n\t\t\tif (!handTarget?.cardId || handTarget.locked) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tsummonHandMinionFromDiremuck(\r\n\t\t\t\tforager,\r\n\t\t\t\thandTarget,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tremaining--;\r\n\t\t}\r\n\t\tif (remaining > 0) {\r\n\t\t\tnextQueue.push({ foragerEntityId: entry.foragerEntityId, remaining });\r\n\t\t}\r\n\t}\r\n\tplayerEntity.globalInfo.DiremuckPendingSummons = nextQueue.length ? nextQueue : undefined;\r\n};\r\n\r\nexport const DiremuckForager: StartOfCombatCard = {\r\n\tcardIds: [CardIds.DiremuckForager_BG27_556, CardIds.DiremuckForager_BG27_556_G],\r\n\tstartOfCombatTiming: 'start-of-combat',\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\t// Don't clear the info, as multiple Diremuck Foragers can be on the board at the same time,\r\n\t\t// and they stack\r\n\t\t// input.playerEntity.globalInfo.DiremuckPendingSummons = undefined;\r\n\t\tconst totalWanted = minion.cardId === CardIds.DiremuckForager_BG27_556_G ? 2 : 1;\r\n\t\tinput.playerEntity.globalInfo.DiremuckPendingSummons = [\r\n\t\t\t...(input.playerEntity.globalInfo.DiremuckPendingSummons ?? []),\r\n\t\t\t{ foragerEntityId: minion.entityId, remaining: totalWanted },\r\n\t\t];\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"diremuck-forager.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/diremuck-forager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\r\n * Diremuck Forager (Tier 4, 5/6)\r\n * Start of Combat: When you have space, summon the highest-Attack minion from your hand for this combat only.\r\n *\r\n * Golden Diremuck Forager (Tier 4, 10/12)\r\n * Start of Combat: When you have space, summon the two highest-Attack minions from your hand for this combat only.\r\n */\r\nimport { Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../../bgs-player-entity';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { getHighestAttackHandMinions, isHandMinionCandidate } from '../../../services/hand-minion-priority';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { FullGameState } from '../../../simulation/internal-game-state';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nconst handMinionPredicate = (allCards: FullGameState['allCards']) => (e: BoardEntity) =>\r\n\t!!e.maxHealth && isHandMinionCandidate(e, (id) => allCards.getCard(id).type?.toUpperCase());\r\n\r\n/** If the Forager died after SOC, pass `null` — summons still resolve (spawn source = hero, index from right = 0). */\r\nconst summonHandMinionFromDiremuck = (\r\n\tforager: BoardEntity | null,\r\n\thandTarget: BoardEntity,\r\n\tspawnRight: boolean,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\thandTarget.locked = true;\r\n\tconst friendly = forager?.friendly ?? playerEntity.friendly;\r\n\tconst newMinions = spawnEntities(\r\n\t\thandTarget.cardId,\r\n\t\t1,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t\tfriendly,\r\n\t\tfalse,\r\n\t\tfalse,\r\n\t\ttrue,\r\n\t\t{ ...handTarget } as BoardEntity,\r\n\t);\r\n\tfor (const s of newMinions) {\r\n\t\ts.onCanceledSummon = () => (handTarget.locked = false);\r\n\t}\r\n\tconst spawnSource = forager ?? playerEntity;\r\n\t// Current theory:\r\n\t// - spawns next to the Forager, if the board isn't full at start of combat\r\n\t// https://replays.firestoneapp.com/?reviewId=1d34f5b4-7e04-4b17-bcc0-353698abaed3&turn=25&action=1\r\n\t// - spawns to the right, if the board is full at start of combat\r\n\t// https://replays.firestoneapp.com/?reviewId=b498d69f-bf1b-4bc0-8902-3643434394d5&turn=23&action=3\r\n\tconst indexFromRight = !spawnRight ? playerBoard.length - (playerBoard.indexOf(forager) + 1) : 0;\r\n\tperformEntitySpawns(\r\n\t\tnewMinions,\r\n\t\tplayerBoard,\r\n\t\tplayerEntity,\r\n\t\tspawnSource,\r\n\t\tindexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\n/** Called from `summon-when-space` when board space opens during start-of-combat. */\r\nexport const handleDiremuckPendingSummons = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst raw = playerEntity.globalInfo?.DiremuckPendingSummons;\r\n\tif (!raw?.length) {\r\n\t\treturn;\r\n\t}\r\n\tconst allCards = gameState.allCards;\r\n\tconst nextQueue: { foragerEntityId: number; remaining: number; spawnRight: boolean }[] = [];\r\n\r\n\tfor (const entry of raw) {\r\n\t\tlet remaining = entry.remaining;\r\n\t\tconst forager = playerBoard.find((e) => e.entityId === entry.foragerEntityId) ?? null;\r\n\t\twhile (playerBoard.length < 7 && remaining > 0) {\r\n\t\t\tconst candidates = playerEntity.hand.filter((e) =>\r\n\t\t\t\thasCorrectTribe(e, playerEntity, Race.MURLOC, gameState.anomalies, gameState.allCards),\r\n\t\t\t);\r\n\t\t\tconst targets = getHighestAttackHandMinions(candidates, 1, (e) => handMinionPredicate(allCards)(e));\r\n\t\t\tconst handTarget = targets[0];\r\n\t\t\tif (!handTarget?.cardId || handTarget.locked) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tsummonHandMinionFromDiremuck(\r\n\t\t\t\tforager,\r\n\t\t\t\thandTarget,\r\n\t\t\t\tentry.spawnRight,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tremaining--;\r\n\t\t}\r\n\t\tif (remaining > 0) {\r\n\t\t\tnextQueue.push({ foragerEntityId: entry.foragerEntityId, remaining, spawnRight: entry.spawnRight });\r\n\t\t}\r\n\t}\r\n\tplayerEntity.globalInfo.DiremuckPendingSummons = nextQueue.length ? nextQueue : undefined;\r\n};\r\n\r\nexport const DiremuckForager: StartOfCombatCard = {\r\n\tcardIds: [CardIds.DiremuckForager_BG27_556, CardIds.DiremuckForager_BG27_556_G],\r\n\tstartOfCombatTiming: 'start-of-combat',\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\t// Don't clear the info, as multiple Diremuck Foragers can be on the board at the same time,\r\n\t\t// and they stack\r\n\t\t// input.playerEntity.globalInfo.DiremuckPendingSummons = undefined;\r\n\t\tconst totalWanted = minion.cardId === CardIds.DiremuckForager_BG27_556_G ? 2 : 1;\r\n\t\tinput.playerEntity.globalInfo.DiremuckPendingSummons = [\r\n\t\t\t...(input.playerEntity.globalInfo.DiremuckPendingSummons ?? []),\r\n\t\t\t{ foragerEntityId: minion.entityId, remaining: totalWanted, spawnRight: input.playerBoard.length >= 7 },\r\n\t\t];\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
@@ -6,7 +6,7 @@ const utils_1 = require("../../../utils");
6
6
  exports.ElderTaggawag = {
7
7
  cardIds: ["TB_BaconShop_HERO_14_Buddy", "TB_BaconShop_HERO_14_Buddy_G"],
8
8
  startOfCombat: (minion, input) => {
9
- const minionsOfDifferentTypes = (0, utils_1.getMinionsOfDifferentTypes)(input.playerBoard, input.playerEntity, input.gameState);
9
+ const minionsOfDifferentTypes = (0, utils_1.getMinionsOfDifferentTypes)(input.playerBoard, input.playerEntity, input.gameState, true, 99, minion);
10
10
  if (minionsOfDifferentTypes.length >= 4) {
11
11
  const highestAttackOnBoard = Math.max(...input.playerBoard.map((entity) => entity.attack));
12
12
  const highestHealthOnBoard = Math.max(...input.playerBoard.map((entity) => entity.health));
@@ -1 +1 @@
1
- {"version":3,"file":"elder-taggawag.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/elder-taggawag.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AACxD,0CAA4D;AAG/C,QAAA,aAAa,GAAsB;IAC/C,OAAO,EAAE,8DAAsG;IAC/G,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,MAAM,uBAAuB,GAAG,IAAA,kCAA0B,EACzD,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;QACF,IAAI,uBAAuB,CAAC,MAAM,IAAI,CAAC,EAAE;YACxC,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3F,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,mCAAuD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChG,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,oBAAoB,GAAG,UAAU,EACjC,oBAAoB,GAAG,UAAU,EACjC,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '../../../services/card-ids';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getMinionsOfDifferentTypes } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const ElderTaggawag: StartOfCombatCard = {\r\n\tcardIds: [CardIds.ElderTaggawag_TB_BaconShop_HERO_14_Buddy, CardIds.ElderTaggawag_TB_BaconShop_HERO_14_Buddy_G],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tconst minionsOfDifferentTypes = getMinionsOfDifferentTypes(\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t\tif (minionsOfDifferentTypes.length >= 4) {\r\n\t\t\tconst highestAttackOnBoard = Math.max(...input.playerBoard.map((entity) => entity.attack));\r\n\t\t\tconst highestHealthOnBoard = Math.max(...input.playerBoard.map((entity) => entity.health));\r\n\t\t\tconst multiplier = minion.cardId === CardIds.ElderTaggawag_TB_BaconShop_HERO_14_Buddy_G ? 2 : 1;\r\n\t\t\tmodifyStats(\r\n\t\t\t\tminion,\r\n\t\t\t\tminion,\r\n\t\t\t\thighestAttackOnBoard * multiplier,\r\n\t\t\t\thighestHealthOnBoard * multiplier,\r\n\t\t\t\tinput.playerBoard,\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"elder-taggawag.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/elder-taggawag.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AACxD,0CAA4D;AAG/C,QAAA,aAAa,GAAsB;IAC/C,OAAO,EAAE,8DAAsG;IAC/G,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,MAAM,uBAAuB,GAAG,IAAA,kCAA0B,EACzD,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,EACf,IAAI,EACJ,EAAE,EACF,MAAM,CACN,CAAC;QACF,IAAI,uBAAuB,CAAC,MAAM,IAAI,CAAC,EAAE;YACxC,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3F,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,mCAAuD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChG,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,oBAAoB,GAAG,UAAU,EACjC,oBAAoB,GAAG,UAAU,EACjC,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '../../../services/card-ids';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getMinionsOfDifferentTypes } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const ElderTaggawag: StartOfCombatCard = {\r\n\tcardIds: [CardIds.ElderTaggawag_TB_BaconShop_HERO_14_Buddy, CardIds.ElderTaggawag_TB_BaconShop_HERO_14_Buddy_G],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tconst minionsOfDifferentTypes = getMinionsOfDifferentTypes(\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tinput.gameState,\r\n\t\t\ttrue,\r\n\t\t\t99,\r\n\t\t\tminion,\r\n\t\t);\r\n\t\tif (minionsOfDifferentTypes.length >= 4) {\r\n\t\t\tconst highestAttackOnBoard = Math.max(...input.playerBoard.map((entity) => entity.attack));\r\n\t\t\tconst highestHealthOnBoard = Math.max(...input.playerBoard.map((entity) => entity.health));\r\n\t\t\tconst multiplier = minion.cardId === CardIds.ElderTaggawag_TB_BaconShop_HERO_14_Buddy_G ? 2 : 1;\r\n\t\t\tmodifyStats(\r\n\t\t\t\tminion,\r\n\t\t\t\tminion,\r\n\t\t\t\thighestAttackOnBoard * multiplier,\r\n\t\t\t\thighestHealthOnBoard * multiplier,\r\n\t\t\t\tinput.playerBoard,\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
@@ -7,7 +7,7 @@ exports.LightfangEnforcer = {
7
7
  cardIds: ["BGS_009", "TB_BaconUps_082"],
8
8
  endOfTurn: (minion, input) => {
9
9
  const mult = minion.cardId === "TB_BaconUps_082" ? 2 : 1;
10
- const targets = (0, utils_1.getMinionsOfDifferentTypes)(input.board, input.hero, input.gameState);
10
+ const targets = (0, utils_1.getMinionsOfDifferentTypes)(input.board, input.hero, input.gameState, true, 99, minion);
11
11
  for (const entity of targets) {
12
12
  (0, stats_1.modifyStats)(entity, minion, 4 * mult, 4 * mult, input.board, input.hero, input.gameState);
13
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lightfang-enforcer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/lightfang-enforcer.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AACxD,0CAA4D;AAG/C,QAAA,iBAAiB,GAAkB;IAC/C,OAAO,EAAE,8BAA8E;IACvF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,sBAA8C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,IAAA,kCAA0B,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACrF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1F;IACF,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '../../../services/card-ids';\nimport { BoardEntity } from '../../../board-entity';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getMinionsOfDifferentTypes } from '../../../utils';\r\nimport { EndOfTurnCard, EndOfTurnInput } from '../../card.interface';\r\n\r\nexport const LightfangEnforcer: EndOfTurnCard = {\r\n\tcardIds: [CardIds.LightfangEnforcer_BGS_009, CardIds.LightfangEnforcer_TB_BaconUps_082],\r\n\tendOfTurn: (minion: BoardEntity, input: EndOfTurnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.LightfangEnforcer_TB_BaconUps_082 ? 2 : 1;\r\n\t\tconst targets = getMinionsOfDifferentTypes(input.board, input.hero, input.gameState);\r\n\t\tfor (const entity of targets) {\r\n\t\t\tmodifyStats(entity, minion, 4 * mult, 4 * mult, input.board, input.hero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"lightfang-enforcer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/lightfang-enforcer.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AACxD,0CAA4D;AAG/C,QAAA,iBAAiB,GAAkB;IAC/C,OAAO,EAAE,8BAA8E;IACvF,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,sBAA8C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,OAAO,GAAG,IAAA,kCAA0B,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACvG,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1F;IACF,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '../../../services/card-ids';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getMinionsOfDifferentTypes } from '../../../utils';\r\nimport { EndOfTurnCard, EndOfTurnInput } from '../../card.interface';\r\n\r\nexport const LightfangEnforcer: EndOfTurnCard = {\r\n\tcardIds: [CardIds.LightfangEnforcer_BGS_009, CardIds.LightfangEnforcer_TB_BaconUps_082],\r\n\tendOfTurn: (minion: BoardEntity, input: EndOfTurnInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.LightfangEnforcer_TB_BaconUps_082 ? 2 : 1;\r\n\t\tconst targets = getMinionsOfDifferentTypes(input.board, input.hero, input.gameState, true, 99, minion);\r\n\t\tfor (const entity of targets) {\r\n\t\t\tmodifyStats(entity, minion, 4 * mult, 4 * mult, input.board, input.hero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -6,7 +6,7 @@ exports.SanguineRefiner = {
6
6
  rally: (minion, input) => {
7
7
  const mult = minion.cardId === "BG33_885_G" ? 2 : 1;
8
8
  input.attackingHero.globalInfo.BloodGemAttackBonus += 1 * mult;
9
- input.attackingHero.globalInfo.BloodGemHealthBonus += 2 * mult;
9
+ input.attackingHero.globalInfo.BloodGemHealthBonus += 1 * mult;
10
10
  return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
11
11
  },
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"sanguine-refiner.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/sanguine-refiner.ts"],"names":[],"mappings":";;;AAMa,QAAA,eAAe,GAAc;IACzC,OAAO,EAAE,0BAAsE;IAC/E,KAAK,EAAE,CAAC,MAAqD,EAAE,KAAoB,EAAE,EAAE;QACtF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/D,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/D,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { RallyCard } from '../../card.interface';\r\n\r\nexport const SanguineRefiner: RallyCard = {\r\n\tcardIds: [CardIds.SanguineRefiner_BG33_885, CardIds.SanguineRefiner_BG33_885_G],\r\n\trally: (minion: BoardEntity | BoardTrinket | BoardEnchantment, input: OnAttackInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.SanguineRefiner_BG33_885_G ? 2 : 1;\r\n\t\tinput.attackingHero.globalInfo.BloodGemAttackBonus += 1 * mult;\r\n\t\tinput.attackingHero.globalInfo.BloodGemHealthBonus += 2 * mult;\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"sanguine-refiner.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/sanguine-refiner.ts"],"names":[],"mappings":";;;AAMa,QAAA,eAAe,GAAc;IACzC,OAAO,EAAE,0BAAsE;IAC/E,KAAK,EAAE,CAAC,MAAqD,EAAE,KAAoB,EAAE,EAAE;QACtF,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAuC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1E,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/D,KAAK,CAAC,aAAa,CAAC,UAAU,CAAC,mBAAmB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC/D,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { RallyCard } from '../../card.interface';\r\n\r\nexport const SanguineRefiner: RallyCard = {\r\n\tcardIds: [CardIds.SanguineRefiner_BG33_885, CardIds.SanguineRefiner_BG33_885_G],\r\n\trally: (minion: BoardEntity | BoardTrinket | BoardEnchantment, input: OnAttackInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.SanguineRefiner_BG33_885_G ? 2 : 1;\r\n\t\tinput.attackingHero.globalInfo.BloodGemAttackBonus += 1 * mult;\r\n\t\tinput.attackingHero.globalInfo.BloodGemHealthBonus += 1 * mult;\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
@@ -9,7 +9,7 @@ exports.TimewarpedMythrax = {
9
9
  startOfCombat: (minion, input) => {
10
10
  const mult = minion.cardId === "BG34_Giant_684_G" ? 2 : 1;
11
11
  for (let i = 0; i < mult; i++) {
12
- const candidates = (0, utils_2.getMinionsOfDifferentTypes)(input.playerBoard.filter((e) => !exports.TimewarpedMythrax.cardIds.includes(e.cardId)), input.playerEntity, input.gameState);
12
+ const candidates = (0, utils_2.getMinionsOfDifferentTypes)(input.playerBoard.filter((e) => !exports.TimewarpedMythrax.cardIds.includes(e.cardId)), input.playerEntity, input.gameState, true, 99, minion);
13
13
  const targets = (0, utils_1.pickMultipleRandomDifferent)(candidates, 3);
14
14
  const totalAttack = targets.reduce((acc, target) => { var _a; return acc + ((_a = target.attack) !== null && _a !== void 0 ? _a : 0); }, 0);
15
15
  const totalHealth = targets.reduce((acc, target) => { var _a; return acc + ((_a = target.health) !== null && _a !== void 0 ? _a : 0); }, 0);
@@ -1 +1 @@
1
- {"version":3,"file":"timewarped-mythraw.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-mythraw.ts"],"names":[],"mappings":";;;AAEA,mDAAsE;AAEtE,qDAAwD;AACxD,0CAA4D;AAG/C,QAAA,iBAAiB,GAAsB;IACnD,OAAO,EAAE,sCAAsF;IAC/F,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAC5C,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,yBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAC9E,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;YACF,MAAM,OAAO,GAAG,IAAA,mCAA2B,EAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,WAAC,OAAA,GAAG,GAAG,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC,CAAA,EAAA,EAAE,CAAC,CAAC,CAAC;YACnF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,WAAC,OAAA,GAAG,GAAG,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC,CAAA,EAAA,EAAE,CAAC,CAAC,CAAC;YACnF,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,WAAW,EACX,WAAW,EACX,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { pickMultipleRandomDifferent } from '../../../services/utils';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getMinionsOfDifferentTypes } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const TimewarpedMythrax: StartOfCombatCard = {\r\n\tcardIds: [CardIds.TimewarpedMythrax_BG34_Giant_684, CardIds.TimewarpedMythrax_BG34_Giant_684_G],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedMythrax_BG34_Giant_684_G ? 2 : 1;\r\n\t\tfor (let i = 0; i < mult; i++) {\r\n\t\t\tconst candidates = getMinionsOfDifferentTypes(\r\n\t\t\t\tinput.playerBoard.filter((e) => !TimewarpedMythrax.cardIds.includes(e.cardId)),\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t\tconst targets = pickMultipleRandomDifferent(candidates, 3);\r\n\t\t\tconst totalAttack = targets.reduce((acc, target) => acc + (target.attack ?? 0), 0);\r\n\t\t\tconst totalHealth = targets.reduce((acc, target) => acc + (target.health ?? 0), 0);\r\n\t\t\tmodifyStats(\r\n\t\t\t\tminion,\r\n\t\t\t\tminion,\r\n\t\t\t\ttotalAttack,\r\n\t\t\t\ttotalHealth,\r\n\t\t\t\tinput.playerBoard,\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"timewarped-mythraw.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-mythraw.ts"],"names":[],"mappings":";;;AAEA,mDAAsE;AAEtE,qDAAwD;AACxD,0CAA4D;AAG/C,QAAA,iBAAiB,GAAsB;IACnD,OAAO,EAAE,sCAAsF;IAC/F,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAC5C,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,yBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAC9E,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,EACf,IAAI,EACJ,EAAE,EACF,MAAM,CACN,CAAC;YACF,MAAM,OAAO,GAAG,IAAA,mCAA2B,EAAC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC3D,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,WAAC,OAAA,GAAG,GAAG,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC,CAAA,EAAA,EAAE,CAAC,CAAC,CAAC;YACnF,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,WAAC,OAAA,GAAG,GAAG,CAAC,MAAA,MAAM,CAAC,MAAM,mCAAI,CAAC,CAAC,CAAA,EAAA,EAAE,CAAC,CAAC,CAAC;YACnF,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,WAAW,EACX,WAAW,EACX,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { pickMultipleRandomDifferent } from '../../../services/utils';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getMinionsOfDifferentTypes } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const TimewarpedMythrax: StartOfCombatCard = {\r\n\tcardIds: [CardIds.TimewarpedMythrax_BG34_Giant_684, CardIds.TimewarpedMythrax_BG34_Giant_684_G],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedMythrax_BG34_Giant_684_G ? 2 : 1;\r\n\t\tfor (let i = 0; i < mult; i++) {\r\n\t\t\tconst candidates = getMinionsOfDifferentTypes(\r\n\t\t\t\tinput.playerBoard.filter((e) => !TimewarpedMythrax.cardIds.includes(e.cardId)),\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t\ttrue,\r\n\t\t\t\t99,\r\n\t\t\t\tminion,\r\n\t\t\t);\r\n\t\t\tconst targets = pickMultipleRandomDifferent(candidates, 3);\r\n\t\t\tconst totalAttack = targets.reduce((acc, target) => acc + (target.attack ?? 0), 0);\r\n\t\t\tconst totalHealth = targets.reduce((acc, target) => acc + (target.health ?? 0), 0);\r\n\t\t\tmodifyStats(\r\n\t\t\t\tminion,\r\n\t\t\t\tminion,\r\n\t\t\t\ttotalAttack,\r\n\t\t\t\ttotalHealth,\r\n\t\t\t\tinput.playerBoard,\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
@@ -1,29 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.EclecticShrine = void 0;
4
- const reference_data_1 = require("@firestone-hs/reference-data");
5
4
  const stats_1 = require("../../../simulation/stats");
6
5
  const utils_1 = require("../../../utils");
7
- const wax_warband_1 = require("../hero-power/wax-warband");
8
6
  exports.EclecticShrine = {
9
7
  startOfCombatTiming: 'pre-combat',
10
8
  cardIds: ["BG32_MagicItem_280"],
11
9
  startOfCombat: (trinket, input) => {
12
10
  var _a, _b;
13
11
  if (input.playerBoard.length > 0) {
14
- const boardWithTribes = input.playerBoard.filter((e) => !!(0, utils_1.getEffectiveTribesForEntity)(e, input.playerEntity, input.gameState.anomalies, input.gameState.allCards).length);
15
- const boardWithoutAll = boardWithTribes.filter((e) => {
16
- var _a;
17
- return !((_a = (0, utils_1.getEffectiveTribesForEntity)(e, input.playerEntity, input.gameState.anomalies, input.gameState.allCards)) === null || _a === void 0 ? void 0 : _a.includes(reference_data_1.Race.ALL));
18
- });
19
- const selectedMinions = (0, wax_warband_1.selectMinions)(boardWithoutAll, reference_data_1.ALL_BG_RACES, input.gameState.allCards);
20
- const allMinions = [
21
- ...selectedMinions,
22
- ...boardWithTribes.filter((e) => {
23
- var _a;
24
- return (_a = (0, utils_1.getEffectiveTribesForEntity)(e, input.playerEntity, input.gameState.anomalies, input.gameState.allCards)) === null || _a === void 0 ? void 0 : _a.includes(reference_data_1.Race.ALL);
25
- }),
26
- ];
12
+ const allMinions = (0, utils_1.getMinionsOfDifferentTypes)(input.playerBoard, input.playerEntity, input.gameState, true, 99, trinket);
27
13
  const atk = (_a = trinket.scriptDataNum1) !== null && _a !== void 0 ? _a : 3;
28
14
  const health = (_b = trinket.scriptDataNum2) !== null && _b !== void 0 ? _b : 2;
29
15
  allMinions.forEach((e) => {
@@ -1 +1 @@
1
- {"version":3,"file":"eclectic-shrine.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/eclectic-shrine.ts"],"names":[],"mappings":";;;AACA,iEAAkE;AAGlE,qDAAwD;AACxD,0CAA6D;AAE7D,2DAA0D;AAE7C,QAAA,cAAc,GAAsB;IAChD,mBAAmB,EAAE,YAAY;IACjC,OAAO,EAAE,sBAA2C;IACpD,aAAa,EAAE,CAAC,OAAqB,EAAE,KAAe,EAAE,EAAE;;QACzD,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,MAAM,eAAe,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAC/C,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,CAAC,IAAA,mCAA2B,EAC5B,CAAC,EACD,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,CAAC,MAAM,CACT,CAAC;YACF,MAAM,eAAe,GAAG,eAAe,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,EAAE;;gBACL,OAAA,CAAC,CAAA,MAAA,IAAA,mCAA2B,EAC3B,CAAC,EACD,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,0CAAE,QAAQ,CAAC,qBAAI,CAAC,GAAG,CAAC,CAAA,CAAA;aAAA,CACtB,CAAC;YACF,MAAM,eAAe,GAAG,IAAA,2BAAa,EAAC,eAAe,EAAE,6BAAY,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC/F,MAAM,UAAU,GAAG;gBAClB,GAAG,eAAe;gBAClB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;;oBAC/B,OAAA,MAAA,IAAA,mCAA2B,EAC1B,CAAC,EACD,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,0CAAE,QAAQ,CAAC,qBAAI,CAAC,GAAG,CAAC,CAAA;iBAAA,CACrB;aACD,CAAC;YACF,MAAM,GAAG,GAAG,MAAA,OAAO,CAAC,cAAc,mCAAI,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,cAAc,mCAAI,CAAC,CAAC;YAC3C,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACxB,IAAA,mBAAW,EAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;SACZ;IACF,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '../../../services/card-ids';\nimport { ALL_BG_RACES, Race } from '@firestone-hs/reference-data';\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getEffectiveTribesForEntity } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\nimport { selectMinions } from '../hero-power/wax-warband';\r\n\r\nexport const EclecticShrine: StartOfCombatCard = {\r\n\tstartOfCombatTiming: 'pre-combat',\r\n\tcardIds: [CardIds.EclecticShrine_BG32_MagicItem_280],\r\n\tstartOfCombat: (trinket: BoardTrinket, input: SoCInput) => {\r\n\t\tif (input.playerBoard.length > 0) {\r\n\t\t\tconst boardWithTribes = input.playerBoard.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\t!!getEffectiveTribesForEntity(\r\n\t\t\t\t\t\te,\r\n\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t\t).length,\r\n\t\t\t);\r\n\t\t\tconst boardWithoutAll = boardWithTribes.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\t!getEffectiveTribesForEntity(\r\n\t\t\t\t\t\te,\r\n\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t\t)?.includes(Race.ALL),\r\n\t\t\t);\r\n\t\t\tconst selectedMinions = selectMinions(boardWithoutAll, ALL_BG_RACES, input.gameState.allCards);\r\n\t\t\tconst allMinions = [\r\n\t\t\t\t...selectedMinions,\r\n\t\t\t\t...boardWithTribes.filter((e) =>\r\n\t\t\t\t\tgetEffectiveTribesForEntity(\r\n\t\t\t\t\t\te,\r\n\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t\t)?.includes(Race.ALL),\r\n\t\t\t\t),\r\n\t\t\t];\r\n\t\t\tconst atk = trinket.scriptDataNum1 ?? 3;\r\n\t\t\tconst health = trinket.scriptDataNum2 ?? 2;\r\n\t\t\tallMinions.forEach((e) => {\r\n\t\t\t\tmodifyStats(e, trinket, atk, health, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\t\t});\r\n\t\t\ttrinket.scriptDataNum1++;\r\n\t\t\ttrinket.scriptDataNum2++;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"eclectic-shrine.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/eclectic-shrine.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AACxD,0CAA4D;AAG/C,QAAA,cAAc,GAAsB;IAChD,mBAAmB,EAAE,YAAY;IACjC,OAAO,EAAE,sBAA2C;IACpD,aAAa,EAAE,CAAC,OAAqB,EAAE,KAAe,EAAE,EAAE;;QACzD,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;YACjC,MAAM,UAAU,GAAG,IAAA,kCAA0B,EAC5C,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,EACf,IAAI,EACJ,EAAE,EACF,OAAO,CACP,CAAC;YACF,MAAM,GAAG,GAAG,MAAA,OAAO,CAAC,cAAc,mCAAI,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,cAAc,mCAAI,CAAC,CAAC;YAC3C,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACxB,IAAA,mBAAW,EAAC,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YAC9F,CAAC,CAAC,CAAC;YACH,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;SACZ;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardTrinket } from '../../../bgs-player-entity';\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 { getMinionsOfDifferentTypes } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const EclecticShrine: StartOfCombatCard = {\r\n\tstartOfCombatTiming: 'pre-combat',\r\n\tcardIds: [CardIds.EclecticShrine_BG32_MagicItem_280],\r\n\tstartOfCombat: (trinket: BoardTrinket, input: SoCInput) => {\r\n\t\tif (input.playerBoard.length > 0) {\r\n\t\t\tconst allMinions = getMinionsOfDifferentTypes(\r\n\t\t\t\tinput.playerBoard,\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t\ttrue,\r\n\t\t\t\t99,\r\n\t\t\t\ttrinket,\r\n\t\t\t);\r\n\t\t\tconst atk = trinket.scriptDataNum1 ?? 3;\r\n\t\t\tconst health = trinket.scriptDataNum2 ?? 2;\r\n\t\t\tallMinions.forEach((e) => {\r\n\t\t\t\tmodifyStats(e, trinket, atk, health, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\t\t});\r\n\t\t\ttrinket.scriptDataNum1++;\r\n\t\t\ttrinket.scriptDataNum2++;\r\n\t\t\treturn true;\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -11,7 +11,10 @@ exports.JarOGems = {
11
11
  const t = trinket;
12
12
  t.scriptDataNum1--;
13
13
  if (t.scriptDataNum1 <= 0) {
14
- for (const entity of input.attackingBoard.filter((e) => (0, utils_1.hasCorrectTribe)(e, input.attackingHero, reference_data_1.Race.QUILBOAR, input.gameState.anomalies, input.gameState.allCards))) {
14
+ const targets = input.attackingBoard.filter((e) => e.health > 0 &&
15
+ !e.definitelyDead &&
16
+ (0, utils_1.hasCorrectTribe)(e, input.attackingHero, reference_data_1.Race.QUILBOAR, input.gameState.anomalies, input.gameState.allCards));
17
+ for (const entity of targets) {
15
18
  (0, blood_gems_1.playBloodGemsOn)(t, entity, 1, input.attackingBoard, input.attackingHero, input.defendingBoard, input.defendingHero, input.gameState);
16
19
  input.gameState.spectator.registerPowerTarget(t, entity, input.attackingBoard, input.attackingHero, input.defendingHero);
17
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jar-o-gems.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/jar-o-gems.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,+DAAiE;AAEjE,0CAAiD;AAGpC,QAAA,QAAQ,GAA6D;IACjF,OAAO,EAAE,sBAAqC;IAC9C,oBAAoB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IAC3C,yBAAyB,EAAE,CAAC,OAAsD,EAAE,KAAoB,EAAE,EAAE;QAC3G,MAAM,CAAC,GAAG,OAAuB,CAAC;QAClC,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,EAAE;YAC1B,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACtD,IAAA,uBAAe,EACd,CAAC,EACD,KAAK,CAAC,aAAa,EACnB,qBAAI,CAAC,QAAQ,EACb,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,CACD,EAAE;gBACF,IAAA,4BAAe,EACd,CAAC,EACD,MAAM,EACN,CAAC,EACD,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,CAAC,EACD,MAAM,EACN,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,aAAa,CACnB,CAAC;aACF;YACD,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SAC5E;QACD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { playBloodGemsOn } from '../../../simulation/blood-gems';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { AfterAnotherMinionAttacksCard, DefaultScriptDataNumCard } from '../../card.interface';\r\n\r\nexport const JarOGems: AfterAnotherMinionAttacksCard & DefaultScriptDataNumCard = {\r\n\tcardIds: [CardIds.JarOGems_BG30_MagicItem_546],\r\n\tdefaultScriptDataNum: (cardId: string) => 2,\r\n\tafterAnotherMinionAttacks: (trinket: BoardEntity | BoardTrinket | BoardEnchantment, input: OnAttackInput) => {\r\n\t\tconst t = trinket as BoardTrinket;\r\n\t\tt.scriptDataNum1--;\r\n\t\tif (t.scriptDataNum1 <= 0) {\r\n\t\t\tfor (const entity of input.attackingBoard.filter((e) =>\r\n\t\t\t\thasCorrectTribe(\r\n\t\t\t\t\te,\r\n\t\t\t\t\tinput.attackingHero,\r\n\t\t\t\t\tRace.QUILBOAR,\r\n\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t),\r\n\t\t\t)) {\r\n\t\t\t\tplayBloodGemsOn(\r\n\t\t\t\t\tt,\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tinput.attackingBoard,\r\n\t\t\t\t\tinput.attackingHero,\r\n\t\t\t\t\tinput.defendingBoard,\r\n\t\t\t\t\tinput.defendingHero,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tt,\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tinput.attackingBoard,\r\n\t\t\t\t\tinput.attackingHero,\r\n\t\t\t\t\tinput.defendingHero,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tt.scriptDataNum1 = input.gameState.cardsData.defaultScriptDataNum(t.cardId);\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"jar-o-gems.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/jar-o-gems.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAIpD,+DAAiE;AAEjE,0CAAiD;AAGpC,QAAA,QAAQ,GAA6D;IACjF,OAAO,EAAE,sBAAqC;IAC9C,oBAAoB,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IAC3C,yBAAyB,EAAE,CAAC,OAAsD,EAAE,KAAoB,EAAE,EAAE;QAC3G,MAAM,CAAC,GAAG,OAAuB,CAAC;QAClC,CAAC,CAAC,cAAc,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,cAAc,IAAI,CAAC,EAAE;YAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAEL,CAAC,CAAC,MAAM,GAAG,CAAC;gBACZ,CAAC,CAAC,CAAC,cAAc;gBACjB,IAAA,uBAAe,EACd,CAAC,EACD,KAAK,CAAC,aAAa,EACnB,qBAAI,CAAC,QAAQ,EACb,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,CACF,CAAC;YACF,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC7B,IAAA,4BAAe,EACd,CAAC,EACD,MAAM,EACN,CAAC,EACD,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,CAAC,EACD,MAAM,EACN,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,aAAa,CACnB,CAAC;aACF;YACD,CAAC,CAAC,cAAc,GAAG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;SAC5E;QACD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { BoardEnchantment, BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { playBloodGemsOn } from '../../../simulation/blood-gems';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { AfterAnotherMinionAttacksCard, DefaultScriptDataNumCard } from '../../card.interface';\r\n\r\nexport const JarOGems: AfterAnotherMinionAttacksCard & DefaultScriptDataNumCard = {\r\n\tcardIds: [CardIds.JarOGems_BG30_MagicItem_546],\r\n\tdefaultScriptDataNum: (cardId: string) => 2,\r\n\tafterAnotherMinionAttacks: (trinket: BoardEntity | BoardTrinket | BoardEnchantment, input: OnAttackInput) => {\r\n\t\tconst t = trinket as BoardTrinket;\r\n\t\tt.scriptDataNum1--;\r\n\t\tif (t.scriptDataNum1 <= 0) {\r\n\t\t\tconst targets = input.attackingBoard.filter(\r\n\t\t\t\t(e) =>\r\n\t\t\t\t\t// https://replays.firestoneapp.com/?reviewId=8d9921f3-5346-4ed3-b6ad-9248422875c1&turn=19&action=12\r\n\t\t\t\t\te.health > 0 &&\r\n\t\t\t\t\t!e.definitelyDead &&\r\n\t\t\t\t\thasCorrectTribe(\r\n\t\t\t\t\t\te,\r\n\t\t\t\t\t\tinput.attackingHero,\r\n\t\t\t\t\t\tRace.QUILBOAR,\r\n\t\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t\t),\r\n\t\t\t);\r\n\t\t\tfor (const entity of targets) {\r\n\t\t\t\tplayBloodGemsOn(\r\n\t\t\t\t\tt,\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tinput.attackingBoard,\r\n\t\t\t\t\tinput.attackingHero,\r\n\t\t\t\t\tinput.defendingBoard,\r\n\t\t\t\t\tinput.defendingHero,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tt,\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tinput.attackingBoard,\r\n\t\t\t\t\tinput.attackingHero,\r\n\t\t\t\t\tinput.defendingHero,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tt.scriptDataNum1 = input.gameState.cardsData.defaultScriptDataNum(t.cardId);\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n};\r\n"]}
@@ -13,7 +13,7 @@ exports.MyrmidonSticker = {
13
13
  const rightMost = (0, utils_1.findLast)(input.playerBoard, isNaga);
14
14
  const targets = new Set([leftMost, rightMost].filter((e) => !!e));
15
15
  for (const target of targets) {
16
- (0, stats_1.modifyStats)(target, trinket, target.attack, target.health, input.playerBoard, input.playerEntity, input.gameState);
16
+ (0, stats_1.setEntityStats)(target, 2 * target.attack, 2 * target.health, input.playerBoard, input.playerEntity, input.gameState);
17
17
  }
18
18
  return true;
19
19
  },
@@ -1 +1 @@
1
- {"version":3,"file":"myrmidon-sticker.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/myrmidon-sticker.ts"],"names":[],"mappings":";;;AAIA,iEAAoD;AAEpD,mDAAmD;AAEnD,qDAAwD;AACxD,0CAAiD;AAIpC,QAAA,eAAe,GAAsB;IACjD,OAAO,EAAE,sBAA4C;IACrD,aAAa,EAAE,CAAC,OAAqB,EAAE,KAAe,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CACpB,IAAA,uBAAe,EAAC,CAAC,EAAE,KAAK,CAAC,YAAY,EAAE,qBAAI,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxG,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EACV,MAAM,EACN,OAAO,EACP,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,MAAM,EACb,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Myrmidon Sticker (1 gold)\r\n * Start of Combat: Double your left and right-most Naga's stats.\r\n */\r\nimport { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { findLast } from '../../../services/utils';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\nimport { CardIds } from '../../../services/card-ids';\r\n\r\nexport const MyrmidonSticker: StartOfCombatCard = {\r\n\tcardIds: [CardIds.MyrmidonSticker_BG36_MagicItem_361],\r\n\tstartOfCombat: (trinket: BoardTrinket, input: SoCInput) => {\r\n\t\tconst isNaga = (e) =>\r\n\t\t\thasCorrectTribe(e, input.playerEntity, Race.NAGA, input.gameState.anomalies, input.gameState.allCards);\r\n\t\tconst leftMost = input.playerBoard.find(isNaga);\r\n\t\tconst rightMost = findLast(input.playerBoard, isNaga);\r\n\t\t// Left- and right-most are the same minion when there is only one Naga on the board\r\n\t\tconst targets = new Set([leftMost, rightMost].filter((e) => !!e));\r\n\t\tfor (const target of targets) {\r\n\t\t\tmodifyStats(\r\n\t\t\t\ttarget,\r\n\t\t\t\ttrinket,\r\n\t\t\t\ttarget.attack,\r\n\t\t\t\ttarget.health,\r\n\t\t\t\tinput.playerBoard,\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"myrmidon-sticker.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/myrmidon-sticker.ts"],"names":[],"mappings":";;;AAIA,iEAAoD;AAGpD,mDAAmD;AAEnD,qDAA2D;AAC3D,0CAAiD;AAGpC,QAAA,eAAe,GAAsB;IACjD,OAAO,EAAE,sBAA4C;IACrD,aAAa,EAAE,CAAC,OAAqB,EAAE,KAAe,EAAE,EAAE;QACzD,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,EAAE,CACpB,IAAA,uBAAe,EAAC,CAAC,EAAE,KAAK,CAAC,YAAY,EAAE,qBAAI,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACxG,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,IAAA,gBAAQ,EAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAG7B,IAAA,sBAAc,EACb,MAAM,EACN,CAAC,GAAG,MAAM,CAAC,MAAM,EACjB,CAAC,GAAG,MAAM,CAAC,MAAM,EACjB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["/**\r\n * Myrmidon Sticker (1 gold)\r\n * Start of Combat: Double your left and right-most Naga's stats.\r\n */\r\nimport { Race } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { findLast } from '../../../services/utils';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { setEntityStats } from '../../../simulation/stats';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const MyrmidonSticker: StartOfCombatCard = {\r\n\tcardIds: [CardIds.MyrmidonSticker_BG36_MagicItem_361],\r\n\tstartOfCombat: (trinket: BoardTrinket, input: SoCInput) => {\r\n\t\tconst isNaga = (e) =>\r\n\t\t\thasCorrectTribe(e, input.playerEntity, Race.NAGA, input.gameState.anomalies, input.gameState.allCards);\r\n\t\tconst leftMost = input.playerBoard.find(isNaga);\r\n\t\tconst rightMost = findLast(input.playerBoard, isNaga);\r\n\t\t// Left- and right-most are the same minion when there is only one Naga on the board\r\n\t\tconst targets = new Set([leftMost, rightMost].filter((e) => !!e));\r\n\t\tfor (const target of targets) {\r\n\t\t\t// It's a setStats, not a modifyStats\r\n\t\t\t// https://replays.firestoneapp.com/?reviewId=448df3c5-fb44-4049-bb50-f4ccd7c42bf1&turn=15&action=1\r\n\t\t\tsetEntityStats(\r\n\t\t\t\ttarget,\r\n\t\t\t\t2 * target.attack,\r\n\t\t\t\t2 * target.health,\r\n\t\t\t\tinput.playerBoard,\r\n\t\t\t\tinput.playerEntity,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
@@ -17,7 +17,10 @@ export declare const debugState: {
17
17
  target: ForcedFaceOffEntity;
18
18
  chosenCardId?: string;
19
19
  }[];
20
- isCorrectEntity: (proposedEntity: ForcedFaceOffEntity, actualEntity: BoardEntity | BoardSecret | BoardTrinket) => boolean;
20
+ isCorrectEntity: (proposedEntity: ForcedFaceOffEntity, actualEntity: BoardEntity | BoardSecret | BoardTrinket | {
21
+ entityId?: number;
22
+ cardId?: string;
23
+ }) => boolean;
21
24
  forcedRandomPicksBase: {
22
25
  source: ForcedFaceOffEntity;
23
26
  target: ForcedFaceOffEntity;
@@ -1 +1 @@
1
- {"version":3,"file":"debug-state.js","sourceRoot":"","sources":["../src/debug-state.ts"],"names":[],"mappings":";;;AAIa,QAAA,UAAU,GAAG;IACzB,MAAM,EAAE,KAAK;IACb,qBAAqB,EAAE,IAAqB;IAC5C,aAAa,EAAE,EAAwE;IACvF,iBAAiB,EAAE,EAAwE;IAE3F,iBAAiB,EAAE,EAA2F;IAC9G,eAAe,EAAE,CAAC,cAAmC,EAAE,YAAsD,EAAW,EAAE;QACzH,IAAI,cAAc,CAAC,QAAQ,EAAE;YAC5B,OAAO,cAAc,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,CAAC;SACzD;QAED,IAAI,cAAc,CAAC,MAAM,EAAE;YAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;YAClE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;gBACjC,OAAO,WAAW,CAAC;aACnB;YACD,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,EAAE;gBACnE,OAAO,WAAW,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;aACrH;YACD,OAAO,WAAW,CAAC;SACnB;QACD,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;YACjC,OAAO,KAAK,CAAC;SACb;QACD,OAAO,CACN,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;YAC7C,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAC7C,CAAC;IACH,CAAC;IACD,qBAAqB,EAAE,EAA2F;IAClH,aAAa,EAAE,GAAG,EAAE;QACnB,kBAAU,CAAC,aAAa,GAAG,CAAC,GAAG,kBAAU,CAAC,iBAAiB,CAAC,CAAC;QAC7D,kBAAU,CAAC,iBAAiB,GAAG,CAAC,GAAG,kBAAU,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC;CACD,CAAC;AASF,MAAM,aAAa,GAAG,CAAC,MAAgD,EAAyB,EAAE,CACjG,QAAQ,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,CAAC","sourcesContent":["import { BoardTrinket } from './bgs-player-entity';\nimport { BoardEntity } from './board-entity';\nimport { BoardSecret } from './board-secret';\n\nexport const debugState = {\n\tactive: false,\n\tforcedCurrentAttacker: null as number | null,\n\tforcedFaceOff: [] as { attacker: ForcedFaceOffEntity; defender: ForcedFaceOffEntity }[],\n\tforcedFaceOffBase: [] as { attacker: ForcedFaceOffEntity; defender: ForcedFaceOffEntity }[],\n\t/** Forced random picks: source -> target. Matched by source entity (like face-offs match by attacker). Optional chosenCardId for card-pool picks (e.g. Apexis Guardian Volumizer). */\n\tforcedRandomPicks: [] as { source: ForcedFaceOffEntity; target: ForcedFaceOffEntity; chosenCardId?: string }[],\n\tisCorrectEntity: (proposedEntity: ForcedFaceOffEntity, actualEntity: BoardEntity | BoardSecret | BoardTrinket): boolean => {\n\t\tif (proposedEntity.entityId) {\n\t\t\treturn proposedEntity.entityId === actualEntity.entityId;\n\t\t}\n\n\t\tif (proposedEntity.cardId) {\n\t\t\tconst cardMatches = proposedEntity.cardId === actualEntity.cardId;\n\t\t\tif (!isBoardEntity(actualEntity)) {\n\t\t\t\treturn cardMatches;\n\t\t\t}\n\t\t\tif (proposedEntity.attack != null && proposedEntity.health != null) {\n\t\t\t\treturn cardMatches && proposedEntity.attack === actualEntity.attack && proposedEntity.health === actualEntity.health;\n\t\t\t}\n\t\t\treturn cardMatches;\n\t\t}\n\t\tif (!isBoardEntity(actualEntity)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tproposedEntity.attack === actualEntity.attack &&\n\t\t\tproposedEntity.health === actualEntity.health\n\t\t);\n\t},\n\tforcedRandomPicksBase: [] as { source: ForcedFaceOffEntity; target: ForcedFaceOffEntity; chosenCardId?: string }[],\n\tonBattleStart: () => {\n\t\tdebugState.forcedFaceOff = [...debugState.forcedFaceOffBase];\n\t\tdebugState.forcedRandomPicks = [...debugState.forcedRandomPicksBase];\n\t},\n};\n\nexport interface ForcedFaceOffEntity {\n\tentityId?: number;\n\tcardId?: string;\n\tattack?: number;\n\thealth?: number;\n}\n\nconst isBoardEntity = (entity: BoardEntity | BoardSecret | BoardTrinket): entity is BoardEntity =>\n\t'attack' in entity && 'health' in entity;\n"]}
1
+ {"version":3,"file":"debug-state.js","sourceRoot":"","sources":["../src/debug-state.ts"],"names":[],"mappings":";;;AAIa,QAAA,UAAU,GAAG;IACzB,MAAM,EAAE,KAAK;IACb,qBAAqB,EAAE,IAAqB;IAC5C,aAAa,EAAE,EAAwE;IACvF,iBAAiB,EAAE,EAAwE;IAE3F,iBAAiB,EAAE,EAA2F;IAC9G,eAAe,EAAE,CAChB,cAAmC,EACnC,YAA+F,EACrF,EAAE;QACZ,IAAI,cAAc,CAAC,QAAQ,EAAE;YAC5B,OAAO,cAAc,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,CAAC;SACzD;QAED,IAAI,cAAc,CAAC,MAAM,EAAE;YAC1B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;YAClE,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;gBACjC,OAAO,WAAW,CAAC;aACnB;YACD,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,IAAI,IAAI,EAAE;gBACnE,OAAO,WAAW,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,IAAI,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAAC;aACrH;YACD,OAAO,WAAW,CAAC;SACnB;QACD,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE;YACjC,OAAO,KAAK,CAAC;SACb;QACD,OAAO,CACN,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM;YAC7C,cAAc,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,CAC7C,CAAC;IACH,CAAC;IACD,qBAAqB,EAAE,EAA2F;IAClH,aAAa,EAAE,GAAG,EAAE;QACnB,kBAAU,CAAC,aAAa,GAAG,CAAC,GAAG,kBAAU,CAAC,iBAAiB,CAAC,CAAC;QAC7D,kBAAU,CAAC,iBAAiB,GAAG,CAAC,GAAG,kBAAU,CAAC,qBAAqB,CAAC,CAAC;IACtE,CAAC;CACD,CAAC;AASF,MAAM,aAAa,GAAG,CACrB,MAAyF,EACjE,EAAE,CAAC,QAAQ,IAAI,MAAM,IAAI,QAAQ,IAAI,MAAM,CAAC","sourcesContent":["import { BoardTrinket } from './bgs-player-entity';\nimport { BoardEntity } from './board-entity';\nimport { BoardSecret } from './board-secret';\n\nexport const debugState = {\n\tactive: false,\n\tforcedCurrentAttacker: null as number | null,\n\tforcedFaceOff: [] as { attacker: ForcedFaceOffEntity; defender: ForcedFaceOffEntity }[],\n\tforcedFaceOffBase: [] as { attacker: ForcedFaceOffEntity; defender: ForcedFaceOffEntity }[],\n\t/** Forced random picks: source -> target. Matched by source entity (like face-offs match by attacker). Optional chosenCardId for card-pool picks (e.g. Apexis Guardian Volumizer). */\n\tforcedRandomPicks: [] as { source: ForcedFaceOffEntity; target: ForcedFaceOffEntity; chosenCardId?: string }[],\n\tisCorrectEntity: (\n\t\tproposedEntity: ForcedFaceOffEntity,\n\t\tactualEntity: BoardEntity | BoardSecret | BoardTrinket | { entityId?: number; cardId?: string },\n\t): boolean => {\n\t\tif (proposedEntity.entityId) {\n\t\t\treturn proposedEntity.entityId === actualEntity.entityId;\n\t\t}\n\n\t\tif (proposedEntity.cardId) {\n\t\t\tconst cardMatches = proposedEntity.cardId === actualEntity.cardId;\n\t\t\tif (!isBoardEntity(actualEntity)) {\n\t\t\t\treturn cardMatches;\n\t\t\t}\n\t\t\tif (proposedEntity.attack != null && proposedEntity.health != null) {\n\t\t\t\treturn cardMatches && proposedEntity.attack === actualEntity.attack && proposedEntity.health === actualEntity.health;\n\t\t\t}\n\t\t\treturn cardMatches;\n\t\t}\n\t\tif (!isBoardEntity(actualEntity)) {\n\t\t\treturn false;\n\t\t}\n\t\treturn (\n\t\t\tproposedEntity.attack === actualEntity.attack &&\n\t\t\tproposedEntity.health === actualEntity.health\n\t\t);\n\t},\n\tforcedRandomPicksBase: [] as { source: ForcedFaceOffEntity; target: ForcedFaceOffEntity; chosenCardId?: string }[],\n\tonBattleStart: () => {\n\t\tdebugState.forcedFaceOff = [...debugState.forcedFaceOffBase];\n\t\tdebugState.forcedRandomPicks = [...debugState.forcedRandomPicksBase];\n\t},\n};\n\nexport interface ForcedFaceOffEntity {\n\tentityId?: number;\n\tcardId?: string;\n\tattack?: number;\n\thealth?: number;\n}\n\nconst isBoardEntity = (\n\tentity: BoardEntity | BoardSecret | BoardTrinket | { entityId?: number; cardId?: string },\n): entity is BoardEntity => 'attack' in entity && 'health' in entity;\n"]}
@@ -7,8 +7,12 @@ export declare const groupByFunction: <T>(keyExtractor: (obj: T) => string | num
7
7
  [key: string]: readonly T[];
8
8
  };
9
9
  export { partitionArray, sleep };
10
+ export type RandomPickSource = BoardEntity | BoardSecret | BoardTrinket | {
11
+ entityId?: number;
12
+ cardId?: string;
13
+ };
10
14
  export declare function pickRandom<T>(array: readonly T[]): T;
11
- export declare function pickRandom<T extends BoardEntity>(array: readonly T[], sourceEntity: BoardEntity | BoardSecret | BoardTrinket): T;
15
+ export declare function pickRandom<T extends BoardEntity>(array: readonly T[], sourceEntity: RandomPickSource): T;
12
16
  export declare const pickMultipleRandom: <T>(array: readonly T[], quantity: number) => T[];
13
17
  export declare const pickRandomAlive: (board: BoardEntity[], sourceEntity?: BoardEntity | BoardSecret | BoardTrinket) => BoardEntity;
14
18
  export declare const pickMultipleRandomAlive: (board: BoardEntity[], quantity: number, sourceEntity?: BoardEntity | BoardSecret | BoardTrinket) => BoardEntity[];
@@ -36,9 +36,11 @@ function pickRandom(array, sourceEntity) {
36
36
  typeof array[0] === 'object' &&
37
37
  array[0] != null &&
38
38
  'entityId' in array[0]) {
39
- const forced = debug_state_1.debugState.forcedRandomPicks.find((p) => debug_state_1.debugState.isCorrectEntity(p.source, sourceEntity));
39
+ const pool = array;
40
+ const forced = debug_state_1.debugState.forcedRandomPicks.find((p) => debug_state_1.debugState.isCorrectEntity(p.source, sourceEntity) &&
41
+ pool.some((c) => debug_state_1.debugState.isCorrectEntity(p.target, c)));
40
42
  if (forced) {
41
- const match = array.find((c) => debug_state_1.debugState.isCorrectEntity(forced.target, c));
43
+ const match = pool.find((c) => debug_state_1.debugState.isCorrectEntity(forced.target, c));
42
44
  if (!forced.chosenCardId) {
43
45
  debug_state_1.debugState.forcedRandomPicks = debug_state_1.debugState.forcedRandomPicks.filter((p) => p !== forced);
44
46
  }