@firestone-hs/simulate-bgs-battle 1.1.587 → 1.1.588

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.
@@ -40,6 +40,8 @@ export interface BoardEntity {
40
40
  timing: number;
41
41
  repeats: number;
42
42
  memory?: any;
43
+ scriptDataNum1?: number;
44
+ scriptDataNum2?: number;
43
45
  }[];
44
46
  deathrattleRepeats?: number;
45
47
  damageMultiplier?: number;
@@ -54,6 +56,7 @@ export interface BoardEntity {
54
56
  hadDivineShield?: boolean;
55
57
  abiityChargesLeft?: number;
56
58
  indexFromLeftAtTimeOfDeath?: number;
59
+ spawnIndexFromRight?: number;
57
60
  tavernTier?: number;
58
61
  memory?: any;
59
62
  onCanceledSummon?: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"board-entity.js","sourceRoot":"","sources":["../src/board-entity.ts"],"names":[],"mappings":"","sourcesContent":["export interface BoardEntity {\r\n\tentityId: number;\r\n\tcardId: string;\r\n\tattack: number;\r\n\thealth: number;\r\n\r\n\tmaxHealth?: number;\r\n\tmaxAttack?: number;\r\n\tavengeCurrent?: number;\r\n\tavengeDefault?: number;\r\n\tfrenzyChargesLeft?: number;\r\n\tdefinitelyDead?: boolean;\r\n\ttaunt?: boolean;\r\n\tdivineShield?: boolean;\r\n\tpoisonous?: boolean;\r\n\tvenomous?: boolean;\r\n\treborn?: boolean;\r\n\trebornFromEntityId?: number;\r\n\tcleave?: boolean;\r\n\twindfury?: boolean;\r\n\tstealth?: boolean;\r\n\tenchantments?: {\r\n\t\tcardId: string;\r\n\t\toriginEntityId?: number;\r\n\t\ttagScriptDataNum1?: number;\r\n\t\ttagScriptDataNum2?: number;\r\n\t\ttiming: number;\r\n\t\trepeats?: number;\r\n\t\tvalue?: number;\r\n\t}[];\r\n\tpendingAttackBuffs?: number[];\r\n\tscriptDataNum1?: number;\r\n\tscriptDataNum2?: number;\r\n\tinInitialState?: boolean;\r\n\t// For Build-An-Undead and Zilliax\r\n\tadditionalCards?: readonly string[] | null;\r\n\ttags?: { [tag: number]: number };\r\n\r\n\t// We only store the card id, because we want all the attack and other data to be computed at runtime, based on the\r\n\t// current stats of the Fish\r\n\trememberedDeathrattles?: { cardId: string; timing: number; repeats: number; memory?: any }[];\r\n\tdeathrattleRepeats?: number;\r\n\tdamageMultiplier?: number;\r\n\tlocked?: boolean;\r\n\tfriendly?: boolean;\r\n\tcantAttack?: boolean;\r\n\thasAttacked?: number;\r\n\timmuneWhenAttackCharges?: number;\r\n\tattackImmediately?: boolean;\r\n\t// Used only to handle murkeye aura?\r\n\tpreviousAttack?: number;\r\n\tlastAffectedByEntity?: BoardEntity;\r\n\t// attacking?: boolean;\r\n\t// Did it have divine shield at least once? (for Sinrunner Blanchy)\r\n\thadDivineShield?: boolean;\r\n\tabiityChargesLeft?: number;\r\n\tindexFromLeftAtTimeOfDeath?: number;\r\n\r\n\t// permanentAttack?: number;\r\n\t// permanentHealth?: number;\r\n\ttavernTier?: number;\r\n\r\n\tmemory?: any;\r\n\r\n\tonCanceledSummon?: () => void;\r\n}\r\n"]}
1
+ {"version":3,"file":"board-entity.js","sourceRoot":"","sources":["../src/board-entity.ts"],"names":[],"mappings":"","sourcesContent":["export interface BoardEntity {\r\n\tentityId: number;\r\n\tcardId: string;\r\n\tattack: number;\r\n\thealth: number;\r\n\r\n\tmaxHealth?: number;\r\n\tmaxAttack?: number;\r\n\tavengeCurrent?: number;\r\n\tavengeDefault?: number;\r\n\tfrenzyChargesLeft?: number;\r\n\tdefinitelyDead?: boolean;\r\n\ttaunt?: boolean;\r\n\tdivineShield?: boolean;\r\n\tpoisonous?: boolean;\r\n\tvenomous?: boolean;\r\n\treborn?: boolean;\r\n\trebornFromEntityId?: number;\r\n\tcleave?: boolean;\r\n\twindfury?: boolean;\r\n\tstealth?: boolean;\r\n\tenchantments?: {\r\n\t\tcardId: string;\r\n\t\toriginEntityId?: number;\r\n\t\ttagScriptDataNum1?: number;\r\n\t\ttagScriptDataNum2?: number;\r\n\t\ttiming: number;\r\n\t\trepeats?: number;\r\n\t\tvalue?: number;\r\n\t}[];\r\n\tpendingAttackBuffs?: number[];\r\n\tscriptDataNum1?: number;\r\n\tscriptDataNum2?: number;\r\n\tinInitialState?: boolean;\r\n\t// For Build-An-Undead and Zilliax\r\n\tadditionalCards?: readonly string[] | null;\r\n\ttags?: { [tag: number]: number };\r\n\r\n\t// We only store the card id, because we want all the attack and other data to be computed at runtime, based on the\r\n\t// current stats of the Fish\r\n\trememberedDeathrattles?: {\r\n\t\tcardId: string;\r\n\t\ttiming: number;\r\n\t\trepeats: number;\r\n\t\tmemory?: any;\r\n\t\tscriptDataNum1?: number;\r\n\t\tscriptDataNum2?: number;\r\n\t}[];\r\n\tdeathrattleRepeats?: number;\r\n\tdamageMultiplier?: number;\r\n\tlocked?: boolean;\r\n\tfriendly?: boolean;\r\n\tcantAttack?: boolean;\r\n\thasAttacked?: number;\r\n\timmuneWhenAttackCharges?: number;\r\n\tattackImmediately?: boolean;\r\n\t// Used only to handle murkeye aura?\r\n\tpreviousAttack?: number;\r\n\tlastAffectedByEntity?: BoardEntity;\r\n\t// attacking?: boolean;\r\n\t// Did it have divine shield at least once? (for Sinrunner Blanchy)\r\n\thadDivineShield?: boolean;\r\n\tabiityChargesLeft?: number;\r\n\tindexFromLeftAtTimeOfDeath?: number;\r\n\tspawnIndexFromRight?: number;\r\n\r\n\t// permanentAttack?: number;\r\n\t// permanentHealth?: number;\r\n\ttavernTier?: number;\r\n\r\n\tmemory?: any;\r\n\r\n\tonCanceledSummon?: () => void;\r\n}\r\n"]}
@@ -8,12 +8,12 @@ const utils_2 = require("../../../utils");
8
8
  exports.BattleHorn = {
9
9
  cardIds: ["BG32_MagicItem_415"],
10
10
  baseAvengeValue: (cardId) => 2,
11
- avenge: (minion, input) => {
11
+ avenge: (trinket, input) => {
12
12
  const battlecries = input.board.filter((e) => (0, utils_2.hasMechanic)(input.gameState.allCards.getCard(e.cardId), reference_data_1.GameTag[reference_data_1.GameTag.BATTLECRY]));
13
13
  const candidate = (0, utils_1.pickRandom)(battlecries);
14
14
  if (!!candidate) {
15
15
  (0, battlecries_1.triggerBattlecry)(input.board, input.hero, candidate, input.otherBoard, input.otherHero, input.gameState);
16
- input.gameState.spectator.registerPowerTarget(minion, candidate, input.board, input.hero, input.otherHero);
16
+ input.gameState.spectator.registerPowerTarget(trinket, candidate, input.board, input.hero, input.otherHero);
17
17
  }
18
18
  },
19
19
  };
@@ -1 +1 @@
1
- {"version":3,"file":"battle-horn.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/battle-horn.ts"],"names":[],"mappings":";;;AAAA,iEAAgE;AAEhE,mDAAqD;AAErD,iEAAmE;AACnE,0CAA6C;AAGhC,QAAA,UAAU,GAAe;IACrC,OAAO,EAAE,sBAAuC;IAChD,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,IAAA,mBAAW,EAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,wBAAO,CAAC,wBAAO,CAAC,SAAS,CAAC,CAAC,CACnF,CAAC;QACF,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,SAAS,EAAE;YAChB,IAAA,8BAAgB,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACzG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC3G;IACF,CAAC;CACD,CAAC","sourcesContent":["import { CardIds, GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { pickRandom } from '../../../services/utils';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { triggerBattlecry } from '../../../simulation/battlecries';\r\nimport { hasMechanic } from '../../../utils';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const BattleHorn: AvengeCard = {\r\n\tcardIds: [CardIds.BattleHorn_BG32_MagicItem_415],\r\n\tbaseAvengeValue: (cardId: string) => 2,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst battlecries = input.board.filter((e) =>\r\n\t\t\thasMechanic(input.gameState.allCards.getCard(e.cardId), GameTag[GameTag.BATTLECRY]),\r\n\t\t);\r\n\t\tconst candidate = pickRandom(battlecries);\r\n\t\tif (!!candidate) {\r\n\t\t\ttriggerBattlecry(input.board, input.hero, candidate, input.otherBoard, input.otherHero, input.gameState);\r\n\t\t\tinput.gameState.spectator.registerPowerTarget(minion, candidate, input.board, input.hero, input.otherHero);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"battle-horn.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/battle-horn.ts"],"names":[],"mappings":";;;AAAA,iEAAgE;AAEhE,mDAAqD;AAErD,iEAAmE;AACnE,0CAA6C;AAGhC,QAAA,UAAU,GAAe;IACrC,OAAO,EAAE,sBAAuC;IAChD,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,OAAqB,EAAE,KAAkB,EAAE,EAAE;QACrD,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,IAAA,mBAAW,EAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,wBAAO,CAAC,wBAAO,CAAC,SAAS,CAAC,CAAC,CACnF,CAAC;QACF,MAAM,SAAS,GAAG,IAAA,kBAAU,EAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,CAAC,SAAS,EAAE;YAChB,IAAA,8BAAgB,EAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACzG,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC5G;IACF,CAAC;CACD,CAAC","sourcesContent":["import { CardIds, GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { pickRandom } from '../../../services/utils';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { triggerBattlecry } from '../../../simulation/battlecries';\r\nimport { hasMechanic } from '../../../utils';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const BattleHorn: AvengeCard = {\r\n\tcardIds: [CardIds.BattleHorn_BG32_MagicItem_415],\r\n\tbaseAvengeValue: (cardId: string) => 2,\r\n\tavenge: (trinket: BoardTrinket, input: AvengeInput) => {\r\n\t\tconst battlecries = input.board.filter((e) =>\r\n\t\t\thasMechanic(input.gameState.allCards.getCard(e.cardId), GameTag[GameTag.BATTLECRY]),\r\n\t\t);\r\n\t\tconst candidate = pickRandom(battlecries);\r\n\t\tif (!!candidate) {\r\n\t\t\ttriggerBattlecry(input.board, input.hero, candidate, input.otherBoard, input.otherHero, input.gameState);\r\n\t\t\tinput.gameState.spectator.registerPowerTarget(trinket, candidate, input.board, input.hero, input.otherHero);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BeetleBand = void 0;
4
4
  const taunt_1 = require("../../../keywords/taunt");
5
5
  const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
6
- const spawns_1 = require("../../../simulation/spawns");
7
6
  exports.BeetleBand = {
8
7
  cardIds: ["BG32_MagicItem_860", "BG32_MagicItem_860t"],
9
8
  baseAvengeValue: (cardId) => (cardId === "BG32_MagicItem_860" ? 5 : 6),
@@ -12,9 +11,9 @@ exports.BeetleBand = {
12
11
  const spawns = (0, deathrattle_spawns_1.spawnEntities)("BG28_603t", number, input.board, input.hero, input.otherBoard, input.otherHero, input.gameState, input.hero.friendly, false);
13
12
  spawns.forEach((spawn) => {
14
13
  (0, taunt_1.updateTaunt)(spawn, true, input.board, input.hero, input.otherHero, input.gameState);
14
+ spawn.spawnIndexFromRight = 0;
15
15
  });
16
- (0, spawns_1.performEntitySpawns)(spawns, input.board, input.hero, trinket, 0, input.otherBoard, input.otherHero, input.gameState);
17
- return [];
16
+ return spawns;
18
17
  },
19
18
  };
20
19
  //# sourceMappingURL=beetle-band.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"beetle-band.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/beetle-band.ts"],"names":[],"mappings":";;;AAEA,mDAAsD;AAEtD,+EAAuE;AACvE,uDAAiE;AAGpD,QAAA,UAAU,GAAe;IACrC,OAAO,EAAE,6CAA+F;IACxG,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,MAAM,yBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,EAAE,CAAC,OAAoB,EAAE,KAAkB,EAA0B,EAAE;QAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,yBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,IAAA,kCAAa,eAE3B,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,IAAI,CAAC,QAAQ,EACnB,KAAK,CACL,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,IAAA,mBAAW,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAGH,IAAA,4BAAmB,EAClB,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,OAAO,EACP,CAAC,EACD,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,CACf,CAAC;QACF,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { updateTaunt } from '../../../keywords/taunt';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const BeetleBand: AvengeCard = {\r\n\tcardIds: [CardIds.BeetleBand_BG32_MagicItem_860, CardIds.BeetleBand_BeetleBandToken_BG32_MagicItem_860t],\r\n\tbaseAvengeValue: (cardId: string) => (cardId === CardIds.BeetleBand_BG32_MagicItem_860 ? 5 : 6),\r\n\tavenge: (trinket: BoardEntity, input: AvengeInput): readonly BoardEntity[] => {\r\n\t\tconst number = trinket.cardId === CardIds.BeetleBand_BG32_MagicItem_860 ? 1 : 2;\r\n\t\tconst spawns = spawnEntities(\r\n\t\t\tCardIds.BoonOfBeetles_BeetleToken_BG28_603t,\r\n\t\t\tnumber,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.otherBoard,\r\n\t\t\tinput.otherHero,\r\n\t\t\tinput.gameState,\r\n\t\t\tinput.hero.friendly,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t\tspawns.forEach((spawn) => {\r\n\t\t\tupdateTaunt(spawn, true, input.board, input.hero, input.otherHero, input.gameState);\r\n\t\t});\r\n\r\n\t\t// Because they spawn to the right, we handle them here instead of higher up\r\n\t\tperformEntitySpawns(\r\n\t\t\tspawns,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\ttrinket,\r\n\t\t\t0,\r\n\t\t\tinput.otherBoard,\r\n\t\t\tinput.otherHero,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
1
+ {"version":3,"file":"beetle-band.js","sourceRoot":"","sources":["../../../../src/cards/impl/trinket/beetle-band.ts"],"names":[],"mappings":";;;AAEA,mDAAsD;AAEtD,+EAAuE;AAG1D,QAAA,UAAU,GAAe;IACrC,OAAO,EAAE,6CAA+F;IACxG,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,MAAM,yBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F,MAAM,EAAE,CAAC,OAAoB,EAAE,KAAkB,EAA0B,EAAE;QAC5E,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,yBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,MAAM,GAAG,IAAA,kCAAa,eAE3B,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,IAAI,CAAC,QAAQ,EACnB,KAAK,CACL,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,IAAA,mBAAW,EAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACpF,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;QAaH,OAAO,MAAM,CAAC;IACf,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { updateTaunt } from '../../../keywords/taunt';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const BeetleBand: AvengeCard = {\r\n\tcardIds: [CardIds.BeetleBand_BG32_MagicItem_860, CardIds.BeetleBand_BeetleBandToken_BG32_MagicItem_860t],\r\n\tbaseAvengeValue: (cardId: string) => (cardId === CardIds.BeetleBand_BG32_MagicItem_860 ? 5 : 6),\r\n\tavenge: (trinket: BoardEntity, input: AvengeInput): readonly BoardEntity[] => {\r\n\t\tconst number = trinket.cardId === CardIds.BeetleBand_BG32_MagicItem_860 ? 1 : 2;\r\n\t\tconst spawns = spawnEntities(\r\n\t\t\tCardIds.BoonOfBeetles_BeetleToken_BG28_603t,\r\n\t\t\tnumber,\r\n\t\t\tinput.board,\r\n\t\t\tinput.hero,\r\n\t\t\tinput.otherBoard,\r\n\t\t\tinput.otherHero,\r\n\t\t\tinput.gameState,\r\n\t\t\tinput.hero.friendly,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t\tspawns.forEach((spawn) => {\r\n\t\t\tupdateTaunt(spawn, true, input.board, input.hero, input.otherHero, input.gameState);\r\n\t\t\tspawn.spawnIndexFromRight = 0;\r\n\t\t});\r\n\r\n\t\t// Because they spawn to the right, we handle them here instead of higher up\r\n\t\t// performEntitySpawns(\r\n\t\t// \tspawns,\r\n\t\t// \tinput.board,\r\n\t\t// \tinput.hero,\r\n\t\t// \ttrinket,\r\n\t\t// \t0,\r\n\t\t// \tinput.otherBoard,\r\n\t\t// \tinput.otherHero,\r\n\t\t// \tinput.gameState,\r\n\t\t// );\r\n\t\treturn spawns;\r\n\t},\r\n};\r\n"]}
@@ -2,6 +2,7 @@ import { BgsPlayerEntity } from '../bgs-player-entity';
2
2
  import { BoardEntity } from '../board-entity';
3
3
  import { FullGameState } from './internal-game-state';
4
4
  export declare const applyAfterAttackEffects: (attackingEntity: BoardEntity, attackingBoard: BoardEntity[], attackingBoardHero: BgsPlayerEntity, defendingEntity: BoardEntity, defendingBoard: BoardEntity[], defendingBoardHero: BgsPlayerEntity, damageDoneByAttacker: number, damageDoneByDefender: number, gameState: FullGameState) => void;
5
+ export declare const applyAfterAttackTrinkets: (attackingEntity: BoardEntity, attackingBoard: BoardEntity[], attackingBoardHero: BgsPlayerEntity, defendingEntity: BoardEntity, defendingBoard: BoardEntity[], defendingBoardHero: BgsPlayerEntity, damageDoneByAttacker: number, damageDoneByDefender: number, gameState: FullGameState) => void;
5
6
  export interface OnAfterAttackInput {
6
7
  attacker: BoardEntity;
7
8
  attackingHero: BgsPlayerEntity;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.applyAfterAttackEffects = void 0;
3
+ exports.applyAfterAttackTrinkets = exports.applyAfterAttackEffects = void 0;
4
4
  const reference_data_1 = require("@firestone-hs/reference-data");
5
5
  const card_interface_1 = require("../cards/card.interface");
6
6
  const _card_mappings_1 = require("../cards/impl/_card-mappings");
@@ -10,7 +10,7 @@ const blood_gems_1 = require("./blood-gems");
10
10
  const quest_1 = require("./quest");
11
11
  const stats_1 = require("./stats");
12
12
  const applyAfterAttackEffects = (attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState) => {
13
- var _a, _b, _c;
13
+ var _a, _b;
14
14
  (0, stealth_1.updateStealth)(attackingEntity, false, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);
15
15
  const onAfterAttackImpl = _card_mappings_1.cardMappings[attackingEntity.cardId];
16
16
  if ((0, card_interface_1.hasOnAfterAttack)(onAfterAttackImpl)) {
@@ -40,29 +40,6 @@ const applyAfterAttackEffects = (attackingEntity, attackingBoard, attackingBoard
40
40
  });
41
41
  }
42
42
  }
43
- const trinkets = (_a = attackingBoardHero.trinkets) !== null && _a !== void 0 ? _a : [];
44
- for (const trinket of trinkets) {
45
- switch (trinket.cardId) {
46
- case "BG30_MagicItem_546":
47
- trinket.scriptDataNum1--;
48
- if (trinket.scriptDataNum1 <= 0) {
49
- for (const entity of attackingBoard.filter((e) => (0, utils_1.hasCorrectTribe)(e, attackingBoardHero, reference_data_1.Race.QUILBOAR, gameState.anomalies, gameState.allCards))) {
50
- (0, blood_gems_1.playBloodGemsOn)(trinket, entity, 1, attackingBoard, attackingBoardHero, gameState);
51
- gameState.spectator.registerPowerTarget(trinket, entity, attackingBoard, attackingBoardHero, attackingBoardHero);
52
- }
53
- trinket.scriptDataNum1 = gameState.cardsData.defaultScriptDataNum(trinket.cardId);
54
- }
55
- break;
56
- }
57
- }
58
- let secretTriggered = null;
59
- if ((secretTriggered = (_b = defendingBoardHero.secrets) === null || _b === void 0 ? void 0 : _b.find((secret) => !secret.triggered && (secret === null || secret === void 0 ? void 0 : secret.cardId) === "TB_Bacon_Secrets_14")) != null) {
60
- if (damageDoneByAttacker >= 3 && !(attackingEntity.health <= 0 || attackingEntity.definitelyDead)) {
61
- secretTriggered.triggered = true;
62
- attackingEntity.definitelyDead = true;
63
- gameState.spectator.registerPowerTarget(secretTriggered, attackingEntity, attackingBoard, defendingBoardHero, attackingBoardHero);
64
- }
65
- }
66
43
  if (attackingEntity.cardId === "BG23_350" || attackingEntity.cardId === "BG23_350_G") {
67
44
  const modifier = attackingEntity.cardId === "BG23_350_G" ? 2 : 1;
68
45
  (0, utils_1.grantStatsToMinionsOfEachType)(attackingEntity, attackingBoard, attackingBoardHero, modifier * 1, modifier * 2, gameState);
@@ -71,7 +48,7 @@ const applyAfterAttackEffects = (attackingEntity, attackingBoard, attackingBoard
71
48
  attackingEntity.cardId === "BG26_RLK_117_G") {
72
49
  attackingEntity.definitelyDead = true;
73
50
  }
74
- else if ((_c = attackingEntity.additionalCards) === null || _c === void 0 ? void 0 : _c.includes("BG26_RLK_117")) {
51
+ else if ((_a = attackingEntity.additionalCards) === null || _a === void 0 ? void 0 : _a.includes("BG26_RLK_117")) {
75
52
  attackingEntity.definitelyDead = true;
76
53
  }
77
54
  attackingBoard
@@ -79,9 +56,36 @@ const applyAfterAttackEffects = (attackingEntity, attackingBoard, attackingBoard
79
56
  .forEach((e) => {
80
57
  (0, stats_1.modifyStats)(e, e, 1, 0, attackingBoard, attackingBoardHero, gameState);
81
58
  });
59
+ let secretTriggered = null;
60
+ if ((secretTriggered = (_b = defendingBoardHero.secrets) === null || _b === void 0 ? void 0 : _b.find((secret) => !secret.triggered && (secret === null || secret === void 0 ? void 0 : secret.cardId) === "TB_Bacon_Secrets_14")) != null) {
61
+ if (damageDoneByAttacker >= 3 && !(attackingEntity.health <= 0 || attackingEntity.definitelyDead)) {
62
+ secretTriggered.triggered = true;
63
+ attackingEntity.definitelyDead = true;
64
+ gameState.spectator.registerPowerTarget(secretTriggered, attackingEntity, attackingBoard, defendingBoardHero, attackingBoardHero);
65
+ }
66
+ }
82
67
  applyOnAttackQuest(attackingEntity, attackingBoard, attackingBoardHero, gameState);
83
68
  };
84
69
  exports.applyAfterAttackEffects = applyAfterAttackEffects;
70
+ const applyAfterAttackTrinkets = (attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState) => {
71
+ var _a;
72
+ const trinkets = (_a = attackingBoardHero.trinkets) !== null && _a !== void 0 ? _a : [];
73
+ for (const trinket of trinkets) {
74
+ switch (trinket.cardId) {
75
+ case "BG30_MagicItem_546":
76
+ trinket.scriptDataNum1--;
77
+ if (trinket.scriptDataNum1 <= 0) {
78
+ for (const entity of attackingBoard.filter((e) => (0, utils_1.hasCorrectTribe)(e, attackingBoardHero, reference_data_1.Race.QUILBOAR, gameState.anomalies, gameState.allCards))) {
79
+ (0, blood_gems_1.playBloodGemsOn)(trinket, entity, 1, attackingBoard, attackingBoardHero, gameState);
80
+ gameState.spectator.registerPowerTarget(trinket, entity, attackingBoard, attackingBoardHero, attackingBoardHero);
81
+ }
82
+ trinket.scriptDataNum1 = gameState.cardsData.defaultScriptDataNum(trinket.cardId);
83
+ }
84
+ break;
85
+ }
86
+ }
87
+ };
88
+ exports.applyAfterAttackTrinkets = applyAfterAttackTrinkets;
85
89
  const applyOnAttackQuest = (attackingEntity, attackingBoard, attackingBoardHero, gameState) => {
86
90
  var _a;
87
91
  const quests = (_a = attackingBoardHero.questEntities) !== null && _a !== void 0 ? _a : [];
@@ -1 +1 @@
1
- {"version":3,"file":"after-attack.js","sourceRoot":"","sources":["../../src/simulation/after-attack.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnAfterAttack } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateStealth } from '../keywords/stealth';\r\nimport { grantStatsToMinionsOfEachType, hasCorrectTribe } from '../utils';\r\nimport { playBloodGemsOn } from './blood-gems';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const applyAfterAttackEffects = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageDoneByAttacker: number,\r\n\tdamageDoneByDefender: number,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// https://replays.firestoneapp.com/?reviewId=9c3ba0f2-d049-4f79-8ec2-7b20ec8d0f68&turn=11&action=5\r\n\t// It looks like Stealth is removed only once the damage is dealt?\r\n\tupdateStealth(attackingEntity, false, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);\r\n\r\n\tconst onAfterAttackImpl = cardMappings[attackingEntity.cardId];\r\n\tif (hasOnAfterAttack(onAfterAttackImpl)) {\r\n\t\tonAfterAttackImpl.onAnyMinionAfterAttack(attackingEntity, {\r\n\t\t\tattacker: attackingEntity,\r\n\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\tattackingBoard: attackingBoard,\r\n\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t});\r\n\t}\r\n\tfor (const boardEntity of attackingBoard.filter((e) => e.entityId !== attackingEntity.entityId)) {\r\n\t\tconst onAfterAttackImpl = cardMappings[boardEntity.cardId];\r\n\t\tif (hasOnAfterAttack(onAfterAttackImpl)) {\r\n\t\t\tonAfterAttackImpl.onAnyMinionAfterAttack(boardEntity, {\r\n\t\t\t\tattacker: attackingEntity,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tconst trinkets = attackingBoardHero.trinkets ?? [];\r\n\tfor (const trinket of trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.JarOGems_BG30_MagicItem_546:\r\n\t\t\t\ttrinket.scriptDataNum1--;\r\n\t\t\t\tif (trinket.scriptDataNum1 <= 0) {\r\n\t\t\t\t\tfor (const entity of attackingBoard.filter((e) =>\r\n\t\t\t\t\t\thasCorrectTribe(e, attackingBoardHero, Race.QUILBOAR, gameState.anomalies, gameState.allCards),\r\n\t\t\t\t\t)) {\r\n\t\t\t\t\t\tplayBloodGemsOn(trinket, entity, 1, attackingBoard, attackingBoardHero, gameState);\r\n\t\t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\t\ttrinket,\r\n\t\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttrinket.scriptDataNum1 = gameState.cardsData.defaultScriptDataNum(trinket.cardId);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tlet secretTriggered = null;\r\n\tif (\r\n\t\t(secretTriggered = defendingBoardHero.secrets?.find(\r\n\t\t\t(secret) => !secret.triggered && secret?.cardId === CardIds.Reckoning_TB_Bacon_Secrets_14,\r\n\t\t)) != null\r\n\t) {\r\n\t\t// console.log('triggering secret?', damageDoneByAttacker, stringifySimpleCard(attackingEntity, allCards));\r\n\t\tif (damageDoneByAttacker >= 3 && !(attackingEntity.health <= 0 || attackingEntity.definitelyDead)) {\r\n\t\t\tsecretTriggered.triggered = true;\r\n\t\t\tattackingEntity.definitelyDead = true;\r\n\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\tsecretTriggered,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tif (attackingEntity.cardId === CardIds.Yrel_BG23_350 || attackingEntity.cardId === CardIds.Yrel_BG23_350_G) {\r\n\t\tconst modifier = attackingEntity.cardId === CardIds.Yrel_BG23_350_G ? 2 : 1;\r\n\t\tgrantStatsToMinionsOfEachType(\r\n\t\t\tattackingEntity,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tmodifier * 1,\r\n\t\t\tmodifier * 2,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t} else if (\r\n\t\tattackingEntity.cardId === CardIds.IncorporealCorporal_BG26_RLK_117 ||\r\n\t\tattackingEntity.cardId === CardIds.IncorporealCorporal_BG26_RLK_117_G\r\n\t) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\t// Putricide-only\r\n\telse if (attackingEntity.additionalCards?.includes(CardIds.IncorporealCorporal_BG26_RLK_117)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\r\n\tattackingBoard\r\n\t\t.filter((e) => e.additionalCards?.includes(CardIds.FesterootHulk_BG_GIL_655))\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyStats(e, e, 1, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t});\r\n\r\n\tapplyOnAttackQuest(attackingEntity, attackingBoard, attackingBoardHero, gameState);\r\n};\r\n\r\nconst applyOnAttackQuest = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst quests = attackingBoardHero.questEntities ?? [];\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.CrackTheCase:\r\n\t\t\t\tonQuestProgressUpdated(attackingBoardHero, quest, attackingBoard, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport interface OnAfterAttackInput {\r\n\tattacker: BoardEntity;\r\n\tattackingHero: BgsPlayerEntity;\r\n\tattackingBoard: BoardEntity[];\r\n\tdefendingEntity: BoardEntity;\r\n\tdefendingBoard: BoardEntity[];\r\n\tdefendingHero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n\tplayerIsFriendly: boolean;\r\n}\r\n"]}
1
+ {"version":3,"file":"after-attack.js","sourceRoot":"","sources":["../../src/simulation/after-attack.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnAfterAttack } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateStealth } from '../keywords/stealth';\r\nimport { grantStatsToMinionsOfEachType, hasCorrectTribe } from '../utils';\r\nimport { playBloodGemsOn } from './blood-gems';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const applyAfterAttackEffects = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageDoneByAttacker: number,\r\n\tdamageDoneByDefender: number,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\t// https://replays.firestoneapp.com/?reviewId=9c3ba0f2-d049-4f79-8ec2-7b20ec8d0f68&turn=11&action=5\r\n\t// It looks like Stealth is removed only once the damage is dealt?\r\n\tupdateStealth(attackingEntity, false, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);\r\n\r\n\tconst onAfterAttackImpl = cardMappings[attackingEntity.cardId];\r\n\tif (hasOnAfterAttack(onAfterAttackImpl)) {\r\n\t\tonAfterAttackImpl.onAnyMinionAfterAttack(attackingEntity, {\r\n\t\t\tattacker: attackingEntity,\r\n\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\tattackingBoard: attackingBoard,\r\n\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t});\r\n\t}\r\n\tfor (const boardEntity of attackingBoard.filter((e) => e.entityId !== attackingEntity.entityId)) {\r\n\t\tconst onAfterAttackImpl = cardMappings[boardEntity.cardId];\r\n\t\tif (hasOnAfterAttack(onAfterAttackImpl)) {\r\n\t\t\tonAfterAttackImpl.onAnyMinionAfterAttack(boardEntity, {\r\n\t\t\t\tattacker: attackingEntity,\r\n\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tif (attackingEntity.cardId === CardIds.Yrel_BG23_350 || attackingEntity.cardId === CardIds.Yrel_BG23_350_G) {\r\n\t\tconst modifier = attackingEntity.cardId === CardIds.Yrel_BG23_350_G ? 2 : 1;\r\n\t\tgrantStatsToMinionsOfEachType(\r\n\t\t\tattackingEntity,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tmodifier * 1,\r\n\t\t\tmodifier * 2,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t} else if (\r\n\t\tattackingEntity.cardId === CardIds.IncorporealCorporal_BG26_RLK_117 ||\r\n\t\tattackingEntity.cardId === CardIds.IncorporealCorporal_BG26_RLK_117_G\r\n\t) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\t// Putricide-only\r\n\telse if (attackingEntity.additionalCards?.includes(CardIds.IncorporealCorporal_BG26_RLK_117)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\r\n\tattackingBoard\r\n\t\t.filter((e) => e.additionalCards?.includes(CardIds.FesterootHulk_BG_GIL_655))\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyStats(e, e, 1, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t});\r\n\r\n\tlet secretTriggered = null;\r\n\tif (\r\n\t\t(secretTriggered = defendingBoardHero.secrets?.find(\r\n\t\t\t(secret) => !secret.triggered && secret?.cardId === CardIds.Reckoning_TB_Bacon_Secrets_14,\r\n\t\t)) != null\r\n\t) {\r\n\t\t// console.log('triggering secret?', damageDoneByAttacker, stringifySimpleCard(attackingEntity, allCards));\r\n\t\tif (damageDoneByAttacker >= 3 && !(attackingEntity.health <= 0 || attackingEntity.definitelyDead)) {\r\n\t\t\tsecretTriggered.triggered = true;\r\n\t\t\tattackingEntity.definitelyDead = true;\r\n\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\tsecretTriggered,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\tapplyOnAttackQuest(attackingEntity, attackingBoard, attackingBoardHero, gameState);\r\n};\r\n\r\nexport const applyAfterAttackTrinkets = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageDoneByAttacker: number,\r\n\tdamageDoneByDefender: number,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst trinkets = attackingBoardHero.trinkets ?? [];\r\n\tfor (const trinket of trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.JarOGems_BG30_MagicItem_546:\r\n\t\t\t\ttrinket.scriptDataNum1--;\r\n\t\t\t\tif (trinket.scriptDataNum1 <= 0) {\r\n\t\t\t\t\tfor (const entity of attackingBoard.filter((e) =>\r\n\t\t\t\t\t\thasCorrectTribe(e, attackingBoardHero, Race.QUILBOAR, gameState.anomalies, gameState.allCards),\r\n\t\t\t\t\t)) {\r\n\t\t\t\t\t\tplayBloodGemsOn(trinket, entity, 1, attackingBoard, attackingBoardHero, gameState);\r\n\t\t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\t\ttrinket,\r\n\t\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t\ttrinket.scriptDataNum1 = gameState.cardsData.defaultScriptDataNum(trinket.cardId);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst applyOnAttackQuest = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst quests = attackingBoardHero.questEntities ?? [];\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.CrackTheCase:\r\n\t\t\t\tonQuestProgressUpdated(attackingBoardHero, quest, attackingBoard, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nexport interface OnAfterAttackInput {\r\n\tattacker: BoardEntity;\r\n\tattackingHero: BgsPlayerEntity;\r\n\tattackingBoard: BoardEntity[];\r\n\tdefendingEntity: BoardEntity;\r\n\tdefendingBoard: BoardEntity[];\r\n\tdefendingHero: BgsPlayerEntity;\r\n\tgameState: FullGameState;\r\n\tplayerIsFriendly: boolean;\r\n}\r\n"]}
@@ -65,8 +65,9 @@ const doFullAttack = (attackingEntity, attackingBoard, attackingBoardHero, defen
65
65
  const { damageDoneByAttacker: damageDoneByAttacker2, damageDoneByDefender: damageDoneByDefender2 } = performAttack(attackingEntity, defendingEntity, attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState);
66
66
  const damageDoneByAttacker = damageDoneByAttacker1 + damageDoneByAttacker2;
67
67
  const damageDoneByDefender = damageDoneByDefender1 + damageDoneByDefender2;
68
- (0, exports.processMinionDeath)(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState, isAttackingImmediately);
69
68
  (0, after_attack_1.applyAfterAttackEffects)(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState);
69
+ (0, exports.processMinionDeath)(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState, isAttackingImmediately);
70
+ (0, after_attack_1.applyAfterAttackTrinkets)(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState);
70
71
  (0, stats_1.applyAfterStatsUpdate)(gameState);
71
72
  attackingEntity.immuneWhenAttackCharges = Math.max(0, ((_a = attackingEntity.immuneWhenAttackCharges) !== null && _a !== void 0 ? _a : 0) - 1);
72
73
  if (defendingEntity.health > 0 &&