@firestone-hs/simulate-bgs-battle 1.1.474 → 1.1.476
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/simulation/after-attack.d.ts +4 -0
- package/dist/simulation/after-attack.js +86 -0
- package/dist/simulation/after-attack.js.map +1 -0
- package/dist/simulation/attack.js +2 -91
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/deathrattle-effects.js +30 -28
- package/dist/simulation/deathrattle-effects.js.map +1 -1
- package/dist/simulation/minion-death.js +3 -0
- package/dist/simulation/minion-death.js.map +1 -1
- package/dist/simulation/quest.js +1 -1
- package/dist/simulation/quest.js.map +1 -1
- package/dist/simulation/start-of-combat.js +80 -84
- package/dist/simulation/start-of-combat.js.map +1 -1
- package/dist/simulation/stats.js +1 -0
- package/dist/simulation/stats.js.map +1 -1
- package/dist/utils.js +1 -1
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../board-entity';
|
|
3
|
+
import { FullGameState } from './internal-game-state';
|
|
4
|
+
export declare const applyAfterAttackEffects: (attackingEntity: BoardEntity, attackingBoard: BoardEntity[], attackingBoardHero: BgsPlayerEntity, defendingEntity: BoardEntity, defendingBoardHero: BgsPlayerEntity, damageDoneByAttacker: number, damageDoneByDefender: number, gameState: FullGameState) => void;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyAfterAttackEffects = void 0;
|
|
4
|
+
const reference_data_1 = require("@firestone-hs/reference-data");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
const blood_gems_1 = require("./blood-gems");
|
|
7
|
+
const cards_in_hand_1 = require("./cards-in-hand");
|
|
8
|
+
const deathrattle_orchestration_1 = require("./deathrattle-orchestration");
|
|
9
|
+
const deathrattle_utils_1 = require("./deathrattle-utils");
|
|
10
|
+
const quest_1 = require("./quest");
|
|
11
|
+
const stats_1 = require("./stats");
|
|
12
|
+
const applyAfterAttackEffects = (attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState) => {
|
|
13
|
+
var _a, _b;
|
|
14
|
+
let secretTriggered = null;
|
|
15
|
+
if ((secretTriggered = (_a = defendingBoardHero.secrets) === null || _a === void 0 ? void 0 : _a.find((secret) => !secret.triggered && (secret === null || secret === void 0 ? void 0 : secret.cardId) === "TB_Bacon_Secrets_14")) != null) {
|
|
16
|
+
if (damageDoneByAttacker >= 3 && !(attackingEntity.health <= 0 || attackingEntity.definitelyDead)) {
|
|
17
|
+
secretTriggered.triggered = true;
|
|
18
|
+
attackingEntity.definitelyDead = true;
|
|
19
|
+
gameState.spectator.registerPowerTarget(secretTriggered, attackingEntity, attackingBoard, defendingBoardHero, attackingBoardHero);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (attackingEntity.cardId === "BG20_104" || attackingEntity.cardId === "BG20_104_G") {
|
|
23
|
+
const quantity = attackingEntity.cardId === "BG20_104_G" ? 2 : 1;
|
|
24
|
+
const cards = quantity === 1 ? ["BG20_GEM"] : ["BG20_GEM", "BG20_GEM"];
|
|
25
|
+
(0, cards_in_hand_1.addCardsInHand)(attackingBoardHero, attackingBoard, cards, gameState);
|
|
26
|
+
}
|
|
27
|
+
else if (attackingEntity.cardId === "BG23_350" || attackingEntity.cardId === "BG23_350_G") {
|
|
28
|
+
const modifier = attackingEntity.cardId === "BG23_350_G" ? 2 : 1;
|
|
29
|
+
(0, utils_1.grantStatsToMinionsOfEachType)(attackingEntity, attackingBoard, attackingBoardHero, modifier * 1, modifier * 2, gameState);
|
|
30
|
+
}
|
|
31
|
+
else if (attackingEntity.cardId === "BG26_RLK_117" ||
|
|
32
|
+
attackingEntity.cardId === "BG26_RLK_117_G") {
|
|
33
|
+
attackingEntity.definitelyDead = true;
|
|
34
|
+
}
|
|
35
|
+
else if (attackingEntity.cardId === "BGS_078" ||
|
|
36
|
+
attackingEntity.cardId === "TB_BaconUps_135") {
|
|
37
|
+
const loops = attackingEntity.cardId === "TB_BaconUps_135" ? 2 : 1;
|
|
38
|
+
const validDeathrattles = (0, deathrattle_utils_1.getValidDeathrattles)(attackingBoard.filter((e) => e.entityId !== attackingEntity.entityId), gameState);
|
|
39
|
+
const leftMost = validDeathrattles[0];
|
|
40
|
+
if (!!leftMost) {
|
|
41
|
+
for (let i = 0; i < loops; i++) {
|
|
42
|
+
gameState.spectator.registerPowerTarget(attackingEntity, leftMost, attackingBoard, attackingBoardHero, defendingBoardHero);
|
|
43
|
+
const indexFromRight = attackingBoard.length - (attackingBoard.indexOf(leftMost) + 1);
|
|
44
|
+
(0, deathrattle_orchestration_1.processDeathrattleForMinion)(leftMost, indexFromRight, [leftMost], leftMost.friendly ? gameState.gameState.player : gameState.gameState.opponent, leftMost.friendly ? gameState.gameState.opponent : gameState.gameState.player, gameState, false);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
else if ((_b = attackingEntity.additionalCards) === null || _b === void 0 ? void 0 : _b.includes("BG26_RLK_117")) {
|
|
49
|
+
attackingEntity.definitelyDead = true;
|
|
50
|
+
}
|
|
51
|
+
attackingBoard
|
|
52
|
+
.filter((e) => { var _a; return (_a = e.additionalCards) === null || _a === void 0 ? void 0 : _a.includes("BG_GIL_655"); })
|
|
53
|
+
.forEach((e) => {
|
|
54
|
+
(0, stats_1.modifyStats)(e, 1, 0, attackingBoard, attackingBoardHero, gameState);
|
|
55
|
+
});
|
|
56
|
+
attackingEntity.stealth = false;
|
|
57
|
+
applyOnAttackQuest(attackingEntity, attackingBoard, attackingBoardHero, gameState);
|
|
58
|
+
};
|
|
59
|
+
exports.applyAfterAttackEffects = applyAfterAttackEffects;
|
|
60
|
+
const applyOnAttackQuest = (attackingEntity, attackingBoard, attackingBoardHero, gameState) => {
|
|
61
|
+
var _a, _b;
|
|
62
|
+
const quests = (_a = attackingBoardHero.questEntities) !== null && _a !== void 0 ? _a : [];
|
|
63
|
+
for (const quest of quests) {
|
|
64
|
+
switch (quest.CardId) {
|
|
65
|
+
case "BG24_Quest_352":
|
|
66
|
+
(0, quest_1.onQuestProgressUpdated)(attackingBoardHero, quest, attackingBoard, gameState);
|
|
67
|
+
break;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const trinkets = (_b = attackingBoardHero.trinkets) !== null && _b !== void 0 ? _b : [];
|
|
71
|
+
for (const trinket of trinkets) {
|
|
72
|
+
switch (trinket.cardId) {
|
|
73
|
+
case "BG30_MagicItem_546":
|
|
74
|
+
trinket.scriptDataNum1--;
|
|
75
|
+
if (trinket.scriptDataNum1 <= 0) {
|
|
76
|
+
for (const entity of attackingBoard.filter((e) => (0, utils_1.hasCorrectTribe)(e, attackingBoardHero, reference_data_1.Race.QUILBOAR, gameState.allCards))) {
|
|
77
|
+
(0, blood_gems_1.playBloodGemsOn)(trinket, entity, 1, attackingBoard, attackingBoardHero, gameState);
|
|
78
|
+
gameState.spectator.registerPowerTarget(trinket, entity, attackingBoard, attackingBoardHero, attackingBoardHero);
|
|
79
|
+
}
|
|
80
|
+
trinket.scriptDataNum1 = gameState.cardsData.defaultScriptDataNum(trinket.cardId);
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=after-attack.js.map
|
|
@@ -0,0 +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 { grantStatsToMinionsOfEachType, hasCorrectTribe } from '../utils';\r\nimport { playBloodGemsOn } from './blood-gems';\r\nimport { addCardsInHand } from './cards-in-hand';\r\nimport { processDeathrattleForMinion } from './deathrattle-orchestration';\r\nimport { getValidDeathrattles } from './deathrattle-utils';\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\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageDoneByAttacker: number,\r\n\tdamageDoneByDefender: number,\r\n\tgameState: FullGameState,\r\n): void => {\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.Bonker_BG20_104 || attackingEntity.cardId === CardIds.Bonker_BG20_104_G) {\r\n\t\tconst quantity = attackingEntity.cardId === CardIds.Bonker_BG20_104_G ? 2 : 1;\r\n\t\tconst cards = quantity === 1 ? [CardIds.BloodGem] : [CardIds.BloodGem, CardIds.BloodGem];\r\n\t\taddCardsInHand(attackingBoardHero, attackingBoard, cards, gameState);\r\n\t} else if (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} else if (\r\n\t\tattackingEntity.cardId === CardIds.MonstrousMacaw_BGS_078 ||\r\n\t\tattackingEntity.cardId === CardIds.MonstrousMacaw_TB_BaconUps_135\r\n\t) {\r\n\t\tconst loops = attackingEntity.cardId === CardIds.MonstrousMacaw_TB_BaconUps_135 ? 2 : 1;\r\n\t\tconst validDeathrattles = getValidDeathrattles(\r\n\t\t\tattackingBoard.filter((e) => e.entityId !== attackingEntity.entityId),\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tconst leftMost = validDeathrattles[0];\r\n\t\tif (!!leftMost) {\r\n\t\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\tleftMost,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t);\r\n\t\t\t\tconst indexFromRight = attackingBoard.length - (attackingBoard.indexOf(leftMost) + 1);\r\n\t\t\t\tprocessDeathrattleForMinion(\r\n\t\t\t\t\tleftMost,\r\n\t\t\t\t\tindexFromRight,\r\n\t\t\t\t\t[leftMost],\r\n\t\t\t\t\tleftMost.friendly ? gameState.gameState.player : gameState.gameState.opponent,\r\n\t\t\t\t\tleftMost.friendly ? gameState.gameState.opponent : gameState.gameState.player,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\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, 1, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t});\r\n\r\n\tattackingEntity.stealth = false;\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\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.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"]}
|
|
@@ -5,19 +5,16 @@ const reference_data_1 = require("@firestone-hs/reference-data");
|
|
|
5
5
|
const divine_shield_1 = require("../divine-shield");
|
|
6
6
|
const utils_1 = require("../services/utils");
|
|
7
7
|
const utils_2 = require("../utils");
|
|
8
|
-
const
|
|
9
|
-
const cards_in_hand_1 = require("./cards-in-hand");
|
|
8
|
+
const after_attack_1 = require("./after-attack");
|
|
10
9
|
const damage_effects_1 = require("./damage-effects");
|
|
11
10
|
const deathrattle_effects_1 = require("./deathrattle-effects");
|
|
12
11
|
const deathrattle_orchestration_1 = require("./deathrattle-orchestration");
|
|
13
12
|
const deathrattle_spawns_1 = require("./deathrattle-spawns");
|
|
14
|
-
const deathrattle_utils_1 = require("./deathrattle-utils");
|
|
15
13
|
const frenzy_1 = require("./frenzy");
|
|
16
14
|
const minion_death_1 = require("./minion-death");
|
|
17
15
|
const minion_kill_1 = require("./minion-kill");
|
|
18
16
|
const on_attack_1 = require("./on-attack");
|
|
19
17
|
const on_being_attacked_1 = require("./on-being-attacked");
|
|
20
|
-
const quest_1 = require("./quest");
|
|
21
18
|
const spawns_1 = require("./spawns");
|
|
22
19
|
const stats_1 = require("./stats");
|
|
23
20
|
const summon_when_space_1 = require("./summon-when-space");
|
|
@@ -61,7 +58,7 @@ const doFullAttack = (attackingEntity, attackingBoard, attackingBoardHero, defen
|
|
|
61
58
|
(0, on_being_attacked_1.applyOnBeingAttackedBuffs)(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, gameState);
|
|
62
59
|
(0, on_attack_1.applyOnAttackEffects)(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoard, defendingBoardHero, gameState);
|
|
63
60
|
const { damageDoneByAttacker, damageDoneByDefender } = performAttack(attackingEntity, defendingEntity, attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState);
|
|
64
|
-
applyAfterAttackEffects(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState);
|
|
61
|
+
(0, after_attack_1.applyAfterAttackEffects)(attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState);
|
|
65
62
|
(0, exports.processMinionDeath)(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState);
|
|
66
63
|
(0, stats_1.applyAfterStatsUpdate)(gameState);
|
|
67
64
|
attackingEntity.immuneWhenAttackCharges = Math.max(0, ((_a = attackingEntity.immuneWhenAttackCharges) !== null && _a !== void 0 ? _a : 0) - 1);
|
|
@@ -76,66 +73,6 @@ const doFullAttack = (attackingEntity, attackingBoard, attackingBoardHero, defen
|
|
|
76
73
|
}
|
|
77
74
|
};
|
|
78
75
|
exports.doFullAttack = doFullAttack;
|
|
79
|
-
const applyAfterAttackEffects = (attackingEntity, attackingBoard, attackingBoardHero, defendingEntity, defendingBoardHero, damageDoneByAttacker, damageDoneByDefender, gameState) => {
|
|
80
|
-
var _a, _b;
|
|
81
|
-
let secretTriggered = null;
|
|
82
|
-
if ((secretTriggered = (_a = defendingBoardHero.secrets) === null || _a === void 0 ? void 0 : _a.find((secret) => !secret.triggered && (secret === null || secret === void 0 ? void 0 : secret.cardId) === "TB_Bacon_Secrets_14")) != null) {
|
|
83
|
-
if (damageDoneByAttacker >= 3 && !(attackingEntity.health <= 0 || attackingEntity.definitelyDead)) {
|
|
84
|
-
secretTriggered.triggered = true;
|
|
85
|
-
attackingEntity.definitelyDead = true;
|
|
86
|
-
gameState.spectator.registerPowerTarget(secretTriggered, attackingEntity, attackingBoard, defendingBoardHero, attackingBoardHero);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
if (attackingEntity.cardId === "BG20_104" || attackingEntity.cardId === "BG20_104_G") {
|
|
90
|
-
const quantity = attackingEntity.cardId === "BG20_104_G" ? 2 : 1;
|
|
91
|
-
const cards = quantity === 1 ? ["BG20_GEM"] : ["BG20_GEM", "BG20_GEM"];
|
|
92
|
-
(0, cards_in_hand_1.addCardsInHand)(attackingBoardHero, attackingBoard, cards, gameState);
|
|
93
|
-
}
|
|
94
|
-
else if (attackingEntity.cardId === "BG23_350" || attackingEntity.cardId === "BG23_350_G") {
|
|
95
|
-
const modifier = attackingEntity.cardId === "BG23_350_G" ? 2 : 1;
|
|
96
|
-
(0, utils_2.grantStatsToMinionsOfEachType)(attackingEntity, attackingBoard, attackingBoardHero, modifier * 1, modifier * 2, gameState);
|
|
97
|
-
}
|
|
98
|
-
else if (attackingEntity.cardId === "BG26_RLK_117" ||
|
|
99
|
-
attackingEntity.cardId === "BG26_RLK_117_G") {
|
|
100
|
-
attackingEntity.definitelyDead = true;
|
|
101
|
-
}
|
|
102
|
-
else if ((_b = attackingEntity.additionalCards) === null || _b === void 0 ? void 0 : _b.includes("BG26_RLK_117")) {
|
|
103
|
-
attackingEntity.definitelyDead = true;
|
|
104
|
-
}
|
|
105
|
-
attackingBoard
|
|
106
|
-
.filter((e) => { var _a; return (_a = e.additionalCards) === null || _a === void 0 ? void 0 : _a.includes("BG_GIL_655"); })
|
|
107
|
-
.forEach((e) => {
|
|
108
|
-
(0, stats_1.modifyStats)(e, 1, 0, attackingBoard, attackingBoardHero, gameState);
|
|
109
|
-
});
|
|
110
|
-
attackingEntity.stealth = false;
|
|
111
|
-
applyOnAttackQuest(attackingEntity, attackingBoard, attackingBoardHero, gameState);
|
|
112
|
-
};
|
|
113
|
-
const applyOnAttackQuest = (attackingEntity, attackingBoard, attackingBoardHero, gameState) => {
|
|
114
|
-
var _a, _b;
|
|
115
|
-
const quests = (_a = attackingBoardHero.questEntities) !== null && _a !== void 0 ? _a : [];
|
|
116
|
-
for (const quest of quests) {
|
|
117
|
-
switch (quest.CardId) {
|
|
118
|
-
case "BG24_Quest_352":
|
|
119
|
-
(0, quest_1.onQuestProgressUpdated)(attackingBoardHero, quest, attackingBoard, gameState);
|
|
120
|
-
break;
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
const trinkets = (_b = attackingBoardHero.trinkets) !== null && _b !== void 0 ? _b : [];
|
|
124
|
-
for (const trinket of trinkets) {
|
|
125
|
-
switch (trinket.cardId) {
|
|
126
|
-
case "BG30_MagicItem_546":
|
|
127
|
-
trinket.scriptDataNum1--;
|
|
128
|
-
if (trinket.scriptDataNum1 <= 0) {
|
|
129
|
-
for (const entity of attackingBoard.filter((e) => (0, utils_2.hasCorrectTribe)(e, attackingBoardHero, reference_data_1.Race.QUILBOAR, gameState.allCards))) {
|
|
130
|
-
(0, blood_gems_1.playBloodGemsOn)(trinket, entity, 1, attackingBoard, attackingBoardHero, gameState);
|
|
131
|
-
gameState.spectator.registerPowerTarget(trinket, entity, attackingBoard, attackingBoardHero, attackingBoardHero);
|
|
132
|
-
}
|
|
133
|
-
trinket.scriptDataNum1 = gameState.cardsData.defaultScriptDataNum(trinket.cardId);
|
|
134
|
-
}
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
76
|
const performAttack = (attackingEntity, defendingEntity, attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState) => {
|
|
140
77
|
let damageDoneByAttacker = 0;
|
|
141
78
|
let damageDoneByDefender = 0;
|
|
@@ -244,38 +181,12 @@ const performAttack = (attackingEntity, defendingEntity, attackingBoard, attacki
|
|
|
244
181
|
}
|
|
245
182
|
}
|
|
246
183
|
}
|
|
247
|
-
if (attackingEntity.cardId === "BGS_078" ||
|
|
248
|
-
attackingEntity.cardId === "TB_BaconUps_135") {
|
|
249
|
-
const loops = attackingEntity.cardId === "TB_BaconUps_135" ? 2 : 1;
|
|
250
|
-
const validDeathrattles = (0, deathrattle_utils_1.getValidDeathrattles)(attackingBoard.filter((e) => e.entityId !== attackingEntity.entityId), gameState);
|
|
251
|
-
const leftMost = validDeathrattles[0];
|
|
252
|
-
if (!!leftMost) {
|
|
253
|
-
for (let i = 0; i < loops; i++) {
|
|
254
|
-
gameState.spectator.registerPowerTarget(attackingEntity, leftMost, attackingBoard, attackingBoardHero, defendingBoardHero);
|
|
255
|
-
const indexFromRight = attackingBoard.length - (attackingBoard.indexOf(leftMost) + 1);
|
|
256
|
-
(0, deathrattle_orchestration_1.processDeathrattleForMinion)(leftMost, indexFromRight, [leftMost], leftMost.friendly ? gameState.gameState.player : gameState.gameState.opponent, leftMost.friendly ? gameState.gameState.opponent : gameState.gameState.player, gameState, false);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
184
|
attackingEntity.attackImmediately = false;
|
|
261
185
|
if (attackingEntity.enchantments.some((e) => e.cardId === "BG24_Reward_364e")) {
|
|
262
186
|
attackingEntity.definitelyDead = true;
|
|
263
187
|
}
|
|
264
188
|
return { damageDoneByAttacker, damageDoneByDefender };
|
|
265
189
|
};
|
|
266
|
-
const triggerRandomDeathrattle = (sourceEntity, attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, gameState, excludeSource = false) => {
|
|
267
|
-
const validDeathrattles = (0, deathrattle_utils_1.getValidDeathrattles)(attackingBoard, gameState).filter((entity) => !excludeSource || entity.entityId !== sourceEntity.entityId);
|
|
268
|
-
if (validDeathrattles.length === 0) {
|
|
269
|
-
return;
|
|
270
|
-
}
|
|
271
|
-
const targetEntity = (0, utils_1.pickRandom)(validDeathrattles);
|
|
272
|
-
if (!(targetEntity === null || targetEntity === void 0 ? void 0 : targetEntity.cardId)) {
|
|
273
|
-
console.error('missing card id when triggering random deathrattle', (0, utils_2.stringifySimpleCard)(targetEntity, gameState.allCards), targetEntity, validDeathrattles.length, (0, utils_2.stringifySimple)(validDeathrattles, gameState.allCards), (0, utils_2.stringifySimple)(attackingBoard, gameState.allCards), excludeSource, (0, utils_2.stringifySimpleCard)(sourceEntity, gameState.allCards));
|
|
274
|
-
}
|
|
275
|
-
gameState.spectator.registerPowerTarget(sourceEntity, targetEntity, attackingBoard, attackingBoardHero, defendingBoardHero);
|
|
276
|
-
const indexFromRight = attackingBoard.length - (attackingBoard.indexOf(targetEntity) + 1);
|
|
277
|
-
(0, deathrattle_orchestration_1.processDeathrattleForMinion)(targetEntity, indexFromRight, [targetEntity], targetEntity.friendly ? gameState.gameState.player : gameState.gameState.opponent, targetEntity.friendly ? gameState.gameState.opponent : gameState.gameState.player, gameState, false);
|
|
278
|
-
};
|
|
279
190
|
const getAttackingEntity = (attackingBoard, allCards) => {
|
|
280
191
|
const debug = attackingBoard.map((e) => {
|
|
281
192
|
var _a;
|