@firestone-hs/simulate-bgs-battle 1.1.618 → 1.1.619
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/cards/card.interface.d.ts +10 -3
- package/dist/cards/card.interface.js +5 -3
- package/dist/cards/card.interface.js.map +1 -1
- package/dist/cards/impl/minion/admiral-eliza-goreblade.d.ts +2 -2
- package/dist/cards/impl/minion/admiral-eliza-goreblade.js +1 -1
- package/dist/cards/impl/minion/admiral-eliza-goreblade.js.map +1 -1
- package/dist/cards/impl/minion/arcane-cannoneer.d.ts +2 -2
- package/dist/cards/impl/minion/arcane-cannoneer.js +1 -4
- package/dist/cards/impl/minion/arcane-cannoneer.js.map +1 -1
- package/dist/cards/impl/minion/battlecruiser.d.ts +2 -2
- package/dist/cards/impl/minion/battlecruiser.js +1 -4
- package/dist/cards/impl/minion/battlecruiser.js.map +1 -1
- package/dist/cards/impl/minion/bigwig-bandit.d.ts +2 -2
- package/dist/cards/impl/minion/bigwig-bandit.js +1 -4
- package/dist/cards/impl/minion/bigwig-bandit.js.map +1 -1
- package/dist/cards/impl/minion/bile-spitter.d.ts +2 -2
- package/dist/cards/impl/minion/bile-spitter.js +1 -4
- package/dist/cards/impl/minion/bile-spitter.js.map +1 -1
- package/dist/cards/impl/minion/bloodsnout-warlord.d.ts +2 -2
- package/dist/cards/impl/minion/bloodsnout-warlord.js +1 -1
- package/dist/cards/impl/minion/bloodsnout-warlord.js.map +1 -1
- package/dist/cards/impl/minion/blue-whelp.d.ts +2 -2
- package/dist/cards/impl/minion/blue-whelp.js +1 -4
- package/dist/cards/impl/minion/blue-whelp.js.map +1 -1
- package/dist/cards/impl/minion/bonker.d.ts +2 -2
- package/dist/cards/impl/minion/bonker.js +1 -4
- package/dist/cards/impl/minion/bonker.js.map +1 -1
- package/dist/cards/impl/minion/campfire-shadow.d.ts +2 -2
- package/dist/cards/impl/minion/campfire-shadow.js +1 -4
- package/dist/cards/impl/minion/campfire-shadow.js.map +1 -1
- package/dist/cards/impl/minion/charmwing.d.ts +2 -2
- package/dist/cards/impl/minion/charmwing.js +1 -4
- package/dist/cards/impl/minion/charmwing.js.map +1 -1
- package/dist/cards/impl/minion/choral-mrrrglr.js +4 -6
- package/dist/cards/impl/minion/choral-mrrrglr.js.map +1 -1
- package/dist/cards/impl/minion/colossus.d.ts +2 -2
- package/dist/cards/impl/minion/colossus.js +1 -4
- package/dist/cards/impl/minion/colossus.js.map +1 -1
- package/dist/cards/impl/minion/exceptionnal-caretaker.d.ts +2 -2
- package/dist/cards/impl/minion/exceptionnal-caretaker.js +1 -4
- package/dist/cards/impl/minion/exceptionnal-caretaker.js.map +1 -1
- package/dist/cards/impl/minion/geared-guard.d.ts +2 -2
- package/dist/cards/impl/minion/geared-guard.js +1 -4
- package/dist/cards/impl/minion/geared-guard.js.map +1 -1
- package/dist/cards/impl/minion/greedy-snaketongue.d.ts +2 -2
- package/dist/cards/impl/minion/greedy-snaketongue.js +1 -4
- package/dist/cards/impl/minion/greedy-snaketongue.js.map +1 -1
- package/dist/cards/impl/minion/greenskeeper.d.ts +2 -2
- package/dist/cards/impl/minion/greenskeeper.js +1 -4
- package/dist/cards/impl/minion/greenskeeper.js.map +1 -1
- package/dist/cards/impl/minion/holo-rover.d.ts +2 -2
- package/dist/cards/impl/minion/holo-rover.js +1 -4
- package/dist/cards/impl/minion/holo-rover.js.map +1 -1
- package/dist/cards/impl/minion/hydralisk.d.ts +2 -2
- package/dist/cards/impl/minion/hydralisk.js +1 -4
- package/dist/cards/impl/minion/hydralisk.js.map +1 -1
- package/dist/cards/impl/minion/monstrous-macaw.d.ts +2 -2
- package/dist/cards/impl/minion/monstrous-macaw.js +1 -4
- package/dist/cards/impl/minion/monstrous-macaw.js.map +1 -1
- package/dist/cards/impl/minion/neon-agent.d.ts +2 -2
- package/dist/cards/impl/minion/neon-agent.js +1 -4
- package/dist/cards/impl/minion/neon-agent.js.map +1 -1
- package/dist/cards/impl/minion/niuzao.d.ts +2 -2
- package/dist/cards/impl/minion/niuzao.js +1 -4
- package/dist/cards/impl/minion/niuzao.js.map +1 -1
- package/dist/cards/impl/minion/primeval-monstrosity.d.ts +2 -2
- package/dist/cards/impl/minion/primeval-monstrosity.js +1 -1
- package/dist/cards/impl/minion/primeval-monstrosity.js.map +1 -1
- package/dist/cards/impl/minion/prodigious-tusker.d.ts +2 -2
- package/dist/cards/impl/minion/prodigious-tusker.js +1 -1
- package/dist/cards/impl/minion/prodigious-tusker.js.map +1 -1
- package/dist/cards/impl/minion/raptor-elder.js +2 -2
- package/dist/cards/impl/minion/raptor-elder.js.map +1 -1
- package/dist/cards/impl/minion/razorfen-vineweaver.d.ts +2 -2
- package/dist/cards/impl/minion/razorfen-vineweaver.js +1 -4
- package/dist/cards/impl/minion/razorfen-vineweaver.js.map +1 -1
- package/dist/cards/impl/minion/ripsnarl-captain.d.ts +2 -2
- package/dist/cards/impl/minion/ripsnarl-captain.js +1 -1
- package/dist/cards/impl/minion/ripsnarl-captain.js.map +1 -1
- package/dist/cards/impl/minion/roadboar.d.ts +2 -2
- package/dist/cards/impl/minion/roadboar.js +1 -4
- package/dist/cards/impl/minion/roadboar.js.map +1 -1
- package/dist/cards/impl/minion/sanguine-refiner.d.ts +2 -2
- package/dist/cards/impl/minion/sanguine-refiner.js +1 -4
- package/dist/cards/impl/minion/sanguine-refiner.js.map +1 -1
- package/dist/cards/impl/minion/sinodorei-straight-shot.d.ts +2 -2
- package/dist/cards/impl/minion/sinodorei-straight-shot.js +1 -4
- package/dist/cards/impl/minion/sinodorei-straight-shot.js.map +1 -1
- package/dist/cards/impl/minion/sleepy-supporter.d.ts +2 -2
- package/dist/cards/impl/minion/sleepy-supporter.js +1 -4
- package/dist/cards/impl/minion/sleepy-supporter.js.map +1 -1
- package/dist/cards/impl/minion/stomping-stegodon-enchantment.d.ts +2 -2
- package/dist/cards/impl/minion/stomping-stegodon-enchantment.js +1 -4
- package/dist/cards/impl/minion/stomping-stegodon-enchantment.js.map +1 -1
- package/dist/cards/impl/minion/stomping-stegodon.d.ts +2 -2
- package/dist/cards/impl/minion/stomping-stegodon.js +1 -4
- package/dist/cards/impl/minion/stomping-stegodon.js.map +1 -1
- package/dist/cards/impl/minion/transmuted-bramblewitch.d.ts +2 -2
- package/dist/cards/impl/minion/transmuted-bramblewitch.js +1 -4
- package/dist/cards/impl/minion/transmuted-bramblewitch.js.map +1 -1
- package/dist/cards/impl/minion/tusked-camper.d.ts +2 -2
- package/dist/cards/impl/minion/tusked-camper.js +1 -4
- package/dist/cards/impl/minion/tusked-camper.js.map +1 -1
- package/dist/cards/impl/minion/twilight-watcher.d.ts +2 -2
- package/dist/cards/impl/minion/twilight-watcher.js +1 -1
- package/dist/cards/impl/minion/twilight-watcher.js.map +1 -1
- package/dist/cards/impl/minion/vengeful-protector.d.ts +2 -2
- package/dist/cards/impl/minion/vengeful-protector.js +1 -4
- package/dist/cards/impl/minion/vengeful-protector.js.map +1 -1
- package/dist/cards/impl/minion/void-ray.d.ts +2 -2
- package/dist/cards/impl/minion/void-ray.js +1 -1
- package/dist/cards/impl/minion/void-ray.js.map +1 -1
- package/dist/cards/impl/minion/whirring-protector-enchantment.d.ts +2 -2
- package/dist/cards/impl/minion/whirring-protector-enchantment.js +1 -4
- package/dist/cards/impl/minion/whirring-protector-enchantment.js.map +1 -1
- package/dist/cards/impl/minion/whirring-protector.d.ts +2 -2
- package/dist/cards/impl/minion/whirring-protector.js +1 -4
- package/dist/cards/impl/minion/whirring-protector.js.map +1 -1
- package/dist/cards/impl/minion/yrel.d.ts +2 -2
- package/dist/cards/impl/minion/yrel.js +1 -4
- package/dist/cards/impl/minion/yrel.js.map +1 -1
- package/dist/cards/impl/trinket/all-purpose-kibble.d.ts +2 -2
- package/dist/cards/impl/trinket/all-purpose-kibble.js +1 -1
- package/dist/cards/impl/trinket/all-purpose-kibble.js.map +1 -1
- package/dist/cards/impl/trinket/faerie-dragon-scale.d.ts +2 -2
- package/dist/cards/impl/trinket/faerie-dragon-scale.js +1 -1
- package/dist/cards/impl/trinket/faerie-dragon-scale.js.map +1 -1
- package/dist/cards/impl/trinket/unholy-sanctum.js +3 -0
- package/dist/cards/impl/trinket/unholy-sanctum.js.map +1 -1
- package/dist/simulation/deathrattle-spawns.js +11 -3
- package/dist/simulation/deathrattle-spawns.js.map +1 -1
- package/dist/simulation/on-attack.d.ts +0 -1
- package/dist/simulation/on-attack.js +120 -90
- package/dist/simulation/on-attack.js.map +1 -1
- package/package.json +1 -1
|
@@ -14,15 +14,46 @@ const applyOnAttackEffects = (attacker, attackingBoard, attackingBoardHero, defe
|
|
|
14
14
|
var _a, _b, _c;
|
|
15
15
|
let damageDoneByAttacker = 0;
|
|
16
16
|
let damageDoneByDefender = 0;
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
for (const trinket of (_a = attackingBoardHero.trinkets) !== null && _a !== void 0 ? _a : []) {
|
|
18
|
+
const onAttackImpl = _card_mappings_1.cardMappings[trinket.cardId];
|
|
19
|
+
if ((0, card_interface_1.hasOnWheneverAnotherMinionAttacks)(onAttackImpl)) {
|
|
20
|
+
const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(trinket, {
|
|
21
|
+
attacker: attacker,
|
|
22
|
+
attackingHero: attackingBoardHero,
|
|
23
|
+
attackingBoard: attackingBoard,
|
|
24
|
+
defendingEntity: defendingEntity,
|
|
25
|
+
defendingHero: defendingBoardHero,
|
|
26
|
+
defendingBoard: defendingBoard,
|
|
27
|
+
gameState,
|
|
28
|
+
playerIsFriendly: attackingBoardHero.friendly,
|
|
29
|
+
});
|
|
30
|
+
damageDoneByAttacker += dmgDoneByAttacker;
|
|
31
|
+
damageDoneByDefender += dmgDoneByDefender;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const attackingBoardOtherEntities = attackingBoard.filter((e) => e !== attacker);
|
|
35
|
+
for (const boardEntity of attackingBoardOtherEntities) {
|
|
36
|
+
const onAttackImpl = _card_mappings_1.cardMappings[boardEntity.cardId];
|
|
37
|
+
if ((0, card_interface_1.hasOnWheneverAnotherMinionAttacks)(onAttackImpl)) {
|
|
38
|
+
const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(boardEntity, {
|
|
39
|
+
attacker: attacker,
|
|
40
|
+
attackingHero: attackingBoardHero,
|
|
41
|
+
attackingBoard: attackingBoard,
|
|
42
|
+
defendingEntity: defendingEntity,
|
|
43
|
+
defendingHero: defendingBoardHero,
|
|
44
|
+
defendingBoard: defendingBoard,
|
|
45
|
+
gameState,
|
|
46
|
+
playerIsFriendly: attackingBoardHero.friendly,
|
|
47
|
+
});
|
|
48
|
+
damageDoneByAttacker += dmgDoneByAttacker;
|
|
49
|
+
damageDoneByDefender += dmgDoneByDefender;
|
|
50
|
+
}
|
|
51
|
+
const enchantments = boardEntity.enchantments;
|
|
52
|
+
for (const enchantment of enchantments) {
|
|
53
|
+
const onAttackImpl = _card_mappings_1.cardMappings[enchantment.cardId];
|
|
54
|
+
if ((0, card_interface_1.hasOnWheneverAnotherMinionAttacks)(onAttackImpl)) {
|
|
55
|
+
const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(enchantment, {
|
|
24
56
|
attacker: attacker,
|
|
25
|
-
isSelfAttacking: false,
|
|
26
57
|
attackingHero: attackingBoardHero,
|
|
27
58
|
attackingBoard: attackingBoard,
|
|
28
59
|
defendingEntity: defendingEntity,
|
|
@@ -35,12 +66,31 @@ const applyOnAttackEffects = (attacker, attackingBoard, attackingBoardHero, defe
|
|
|
35
66
|
damageDoneByDefender += dmgDoneByDefender;
|
|
36
67
|
}
|
|
37
68
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
69
|
+
}
|
|
70
|
+
const rallyLoops = 1 +
|
|
71
|
+
((_c = (_b = attackingBoardHero.questRewardEntities) === null || _b === void 0 ? void 0 : _b.filter((r) => r.cardId === "BG33_Reward_021").length) !== null && _c !== void 0 ? _c : 0);
|
|
72
|
+
for (let i = 0; i < rallyLoops; i++) {
|
|
73
|
+
const onAttackImpl = _card_mappings_1.cardMappings[attacker.cardId];
|
|
74
|
+
if ((0, card_interface_1.hasRally)(onAttackImpl)) {
|
|
75
|
+
const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(attacker, {
|
|
76
|
+
attacker: attacker,
|
|
77
|
+
attackingHero: attackingBoardHero,
|
|
78
|
+
attackingBoard: attackingBoard,
|
|
79
|
+
defendingEntity: defendingEntity,
|
|
80
|
+
defendingHero: defendingBoardHero,
|
|
81
|
+
defendingBoard: defendingBoard,
|
|
82
|
+
gameState,
|
|
83
|
+
playerIsFriendly: attackingBoardHero.friendly,
|
|
84
|
+
});
|
|
85
|
+
damageDoneByAttacker += dmgDoneByAttacker;
|
|
86
|
+
damageDoneByDefender += dmgDoneByDefender;
|
|
87
|
+
}
|
|
88
|
+
const enchantments = attacker.enchantments;
|
|
89
|
+
for (const enchantment of enchantments) {
|
|
90
|
+
const onAttackImpl = _card_mappings_1.cardMappings[enchantment.cardId];
|
|
91
|
+
if ((0, card_interface_1.hasRally)(onAttackImpl)) {
|
|
92
|
+
const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(enchantment, {
|
|
42
93
|
attacker: attacker,
|
|
43
|
-
isSelfAttacking: attacker === boardEntity,
|
|
44
94
|
attackingHero: attackingBoardHero,
|
|
45
95
|
attackingBoard: attackingBoard,
|
|
46
96
|
defendingEntity: defendingEntity,
|
|
@@ -52,87 +102,67 @@ const applyOnAttackEffects = (attacker, attackingBoard, attackingBoardHero, defe
|
|
|
52
102
|
damageDoneByAttacker += dmgDoneByAttacker;
|
|
53
103
|
damageDoneByDefender += dmgDoneByDefender;
|
|
54
104
|
}
|
|
55
|
-
const enchantments = boardEntity.enchantments;
|
|
56
|
-
for (const enchantment of enchantments) {
|
|
57
|
-
const onAttackImpl = _card_mappings_1.cardMappings[enchantment.cardId];
|
|
58
|
-
if ((0, card_interface_1.hasOnAttack)(onAttackImpl)) {
|
|
59
|
-
const { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(enchantment, {
|
|
60
|
-
attacker: attacker,
|
|
61
|
-
isSelfAttacking: attacker === boardEntity,
|
|
62
|
-
attackingHero: attackingBoardHero,
|
|
63
|
-
attackingBoard: attackingBoard,
|
|
64
|
-
defendingEntity: defendingEntity,
|
|
65
|
-
defendingHero: defendingBoardHero,
|
|
66
|
-
defendingBoard: defendingBoard,
|
|
67
|
-
gameState,
|
|
68
|
-
playerIsFriendly: attackingBoardHero.friendly,
|
|
69
|
-
});
|
|
70
|
-
damageDoneByAttacker += dmgDoneByAttacker;
|
|
71
|
-
damageDoneByDefender += dmgDoneByDefender;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (attacker.cardId === "BG27_017" ||
|
|
76
|
-
attacker.cardId === "BG27_017_G") {
|
|
77
|
-
const neighbours = (0, attack_1.getNeighbours)(defendingBoard, defendingEntity);
|
|
78
|
-
const targets = attacker.cardId === "BG27_017_G" ? neighbours : [(0, utils_1.pickRandom)(neighbours)];
|
|
79
|
-
[defendingEntity, ...targets].forEach((target) => {
|
|
80
|
-
gameState.spectator.registerPowerTarget(attacker, target, defendingBoard, attackingBoardHero, defendingBoardHero);
|
|
81
|
-
(0, attack_1.dealDamageToMinion)(target, defendingBoard, defendingBoardHero, attacker, attacker.attack, attackingBoard, attackingBoardHero, gameState);
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
if ((0, utils_2.hasCorrectTribe)(attacker, attackingBoardHero, reference_data_1.Race.DRAGON, gameState.anomalies, gameState.allCards)) {
|
|
85
|
-
attackingBoard
|
|
86
|
-
.filter((e) => e.cardId === "BG29_816" || e.cardId === "BG29_816_G")
|
|
87
|
-
.forEach((rallier) => {
|
|
88
|
-
if (rallier !== attacker) {
|
|
89
|
-
const stats = rallier.cardId === "BG29_816_G" ? 2 : 1;
|
|
90
|
-
(0, stats_1.modifyStats)(attacker, rallier, 3 * stats, 1 * stats, attackingBoard, attackingBoardHero, gameState);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
105
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
106
|
+
}
|
|
107
|
+
if (attacker.cardId === "BG27_017" ||
|
|
108
|
+
attacker.cardId === "BG27_017_G") {
|
|
109
|
+
const neighbours = (0, attack_1.getNeighbours)(defendingBoard, defendingEntity);
|
|
110
|
+
const targets = attacker.cardId === "BG27_017_G" ? neighbours : [(0, utils_1.pickRandom)(neighbours)];
|
|
111
|
+
[defendingEntity, ...targets].forEach((target) => {
|
|
112
|
+
gameState.spectator.registerPowerTarget(attacker, target, defendingBoard, attackingBoardHero, defendingBoardHero);
|
|
113
|
+
(0, attack_1.dealDamageToMinion)(target, defendingBoard, defendingBoardHero, attacker, attacker.attack, attackingBoard, attackingBoardHero, gameState);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
if ((0, utils_2.hasCorrectTribe)(attacker, attackingBoardHero, reference_data_1.Race.DRAGON, gameState.anomalies, gameState.allCards)) {
|
|
117
|
+
attackingBoard
|
|
118
|
+
.filter((e) => e.cardId === "BG29_816" || e.cardId === "BG29_816_G")
|
|
119
|
+
.forEach((rallier) => {
|
|
120
|
+
if (rallier !== attacker) {
|
|
121
|
+
const stats = rallier.cardId === "BG29_816_G" ? 2 : 1;
|
|
122
|
+
(0, stats_1.modifyStats)(attacker, rallier, 3 * stats, 1 * stats, attackingBoard, attackingBoardHero, gameState);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
if (attacker.cardId === "BG29_888" || attacker.cardId === "BG29_888_G") {
|
|
127
|
+
const multiplier = attacker.cardId === "BG29_888_G" ? 2 : 1;
|
|
128
|
+
(0, stats_1.modifyStats)(attacker, attacker, 2 * multiplier, 0, attackingBoard, attackingBoardHero, gameState);
|
|
129
|
+
}
|
|
130
|
+
else if (attacker.cardId === "BG24_708" ||
|
|
131
|
+
attacker.cardId === "BG24_708_G") {
|
|
132
|
+
attackingBoard
|
|
133
|
+
.filter((e) => (0, utils_2.hasCorrectTribe)(e, attackingBoardHero, reference_data_1.Race.PIRATE, gameState.anomalies, gameState.allCards))
|
|
134
|
+
.forEach((e) => {
|
|
135
|
+
(0, stats_1.modifyStats)(e, attacker, attacker.cardId === "BG24_708_G" ? 4 : 2, attacker.cardId === "BG24_708_G" ? 4 : 2, attackingBoard, attackingBoardHero, gameState);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else if (attacker.cardId === "BG28_635" ||
|
|
139
|
+
attacker.cardId === "BG28_635_G") {
|
|
140
|
+
const numberOfCardsToAdd = attacker.cardId === "BG28_635_G" ? 2 : 1;
|
|
141
|
+
const cardsToAdd = Array.from({ length: numberOfCardsToAdd }).map(() => null);
|
|
142
|
+
(0, cards_in_hand_1.addCardsInHand)(attackingBoardHero, attackingBoard, cardsToAdd, gameState);
|
|
143
|
+
}
|
|
144
|
+
else if (attacker.cardId === "BG29_809" || attacker.cardId === "BG29_809_G") {
|
|
145
|
+
const loops = attacker.cardId === "BG29_809_G" ? 2 : 1;
|
|
146
|
+
for (let i = 0; i < loops; i++) {
|
|
147
|
+
for (const entity of [...attackingBoard]) {
|
|
148
|
+
if (entity.entityId === attacker.entityId) {
|
|
149
|
+
continue;
|
|
123
150
|
}
|
|
151
|
+
const isSameSide = entity.friendly === attacker.friendly;
|
|
152
|
+
const board = isSameSide ? attackingBoard : defendingBoard;
|
|
153
|
+
const hero = isSameSide ? attackingBoardHero : defendingBoardHero;
|
|
154
|
+
(0, attack_1.dealDamageToMinion)(entity, board, hero, attacker, 1, isSameSide ? defendingBoard : attackingBoard, isSameSide ? defendingBoardHero : attackingBoardHero, gameState);
|
|
124
155
|
}
|
|
125
156
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
}
|
|
157
|
+
}
|
|
158
|
+
else if (attacker.cardId === "BG29_120" || attacker.cardId === "BG29_120_G") {
|
|
159
|
+
const loops = attacker.cardId === "BG29_120_G" ? 2 : 1;
|
|
160
|
+
const attackerIndex = attackingBoard.indexOf(attacker);
|
|
161
|
+
for (let i = 1; i <= loops; i++) {
|
|
162
|
+
const target = attackingBoard[attackerIndex + i];
|
|
163
|
+
if (!!target) {
|
|
164
|
+
(0, reborn_1.updateReborn)(target, true, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);
|
|
165
|
+
gameState.spectator.registerPowerTarget(attacker, target, attackingBoard, attackingBoardHero, defendingBoardHero);
|
|
136
166
|
}
|
|
137
167
|
}
|
|
138
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"on-attack.js","sourceRoot":"","sources":["../../src/simulation/on-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 { hasOnAttack } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateReborn } from '../keywords/reborn';\r\nimport { pickRandom } from '../services/utils';\r\nimport { hasCorrectTribe } from '../utils';\r\nimport { dealDamageToMinion, getNeighbours } from './attack';\r\nimport { addCardsInHand } from './cards-in-hand';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { modifyStats } from './stats';\r\n\r\n// Whenever it attacks\r\nexport const applyOnAttackEffects = (\r\n\tattacker: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): { damageDoneByAttacker: number; damageDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\r\n\t// This assumes that only \"Rally\" effects trigger on attack\r\n\tconst rallyLoops =\r\n\t\t1 +\r\n\t\t(attackingBoardHero.questRewardEntities?.filter((r) => r.cardId === CardIds.RallyingCry_BG33_Reward_021)\r\n\t\t\t.length ?? 0);\r\n\tfor (let i = 0; i < rallyLoops; i++) {\r\n\t\tfor (const trinket of attackingBoardHero.trinkets ?? []) {\r\n\t\t\tconst onAttackImpl = cardMappings[trinket.cardId];\r\n\t\t\tif (hasOnAttack(onAttackImpl)) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(trinket, {\r\n\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\tisSelfAttacking: false,\r\n\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t});\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (const boardEntity of attackingBoard) {\r\n\t\t\tconst onAttackImpl = cardMappings[boardEntity.cardId];\r\n\t\t\tif (hasOnAttack(onAttackImpl)) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(boardEntity, {\r\n\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\tisSelfAttacking: attacker === boardEntity,\r\n\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t});\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t\tconst enchantments = boardEntity.enchantments;\r\n\t\t\tfor (const enchantment of enchantments) {\r\n\t\t\t\tconst onAttackImpl = cardMappings[enchantment.cardId];\r\n\t\t\t\tif (hasOnAttack(onAttackImpl)) {\r\n\t\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onAnyMinionAttack(enchantment, {\r\n\t\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\t\tisSelfAttacking: attacker === boardEntity,\r\n\t\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t\t});\r\n\t\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Damage happens before the entity is buffed, e.g. before an attack buff from Roaring Rallier\r\n\t\tif (\r\n\t\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017 ||\r\n\t\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017_G\r\n\t\t) {\r\n\t\t\tconst neighbours = getNeighbours(defendingBoard, defendingEntity);\r\n\t\t\tconst targets =\r\n\t\t\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017_G ? neighbours : [pickRandom(neighbours)];\r\n\t\t\t[defendingEntity, ...targets].forEach((target) => {\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tdefendingBoard,\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\t// damageDoneByAttacker +=\r\n\t\t\t\tdealDamageToMinion(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\tattacker.attack,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\t// Roaring Rallier\r\n\t\tif (hasCorrectTribe(attacker, attackingBoardHero, Race.DRAGON, gameState.anomalies, gameState.allCards)) {\r\n\t\t\tattackingBoard\r\n\t\t\t\t.filter(\r\n\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\te.cardId === CardIds.RoaringRallier_BG29_816 || e.cardId === CardIds.RoaringRallier_BG29_816_G,\r\n\t\t\t\t)\r\n\t\t\t\t.forEach((rallier) => {\r\n\t\t\t\t\tif (rallier !== attacker) {\r\n\t\t\t\t\t\tconst stats = rallier.cardId === CardIds.RoaringRallier_BG29_816_G ? 2 : 1;\r\n\t\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\t\tattacker,\r\n\t\t\t\t\t\t\trallier,\r\n\t\t\t\t\t\t\t3 * stats,\r\n\t\t\t\t\t\t\t1 * stats,\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\tgameState,\r\n\t\t\t\t\t\t);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t\t// if (attacker.cardId === CardIds.GlyphGuardian_BGS_045) {\r\n\t\t// \t// For now the utility method only works additively, so we hack around it\r\n\t\t// \tmodifyStats(\r\n\t\t// \t\tattacker,\r\n\t\t// \t\tnull,\r\n\t\t// \t\t2 * attacker.attack - attacker.attack,\r\n\t\t// \t\t0,\r\n\t\t// \t\tattackingBoard,\r\n\t\t// \t\tattackingBoardHero,\r\n\t\t// \t\tgameState,\r\n\t\t// \t);\r\n\t\t// } else if (attacker.cardId === CardIds.GlyphGuardian_TB_BaconUps_115) {\r\n\t\t// \tmodifyStats(\r\n\t\t// \t\tattacker,\r\n\t\t// \t\tnull,\r\n\t\t// \t\t3 * attacker.attack - attacker.attack,\r\n\t\t// \t\t0,\r\n\t\t// \t\tattackingBoard,\r\n\t\t// \t\tattackingBoardHero,\r\n\t\t// \t\tgameState,\r\n\t\t// \t);\r\n\t\t// } else\r\n\t\tif (attacker.cardId === CardIds.GlimGuardian_BG29_888 || attacker.cardId === CardIds.GlimGuardian_BG29_888_G) {\r\n\t\t\tconst multiplier = attacker.cardId === CardIds.GlimGuardian_BG29_888_G ? 2 : 1;\r\n\t\t\tmodifyStats(attacker, attacker, 2 * multiplier, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t} else if (\r\n\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708 ||\r\n\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G\r\n\t\t) {\r\n\t\t\tattackingBoard\r\n\t\t\t\t.filter((e) =>\r\n\t\t\t\t\thasCorrectTribe(e, attackingBoardHero, Race.PIRATE, gameState.anomalies, gameState.allCards),\r\n\t\t\t\t)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tmodifyStats(\r\n\t\t\t\t\t\te,\r\n\t\t\t\t\t\tattacker,\r\n\t\t\t\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G ? 4 : 2,\r\n\t\t\t\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G ? 4 : 2,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t});\r\n\t\t} else if (\r\n\t\t\tattacker.cardId === CardIds.WhirlingLassOMatic_BG28_635 ||\r\n\t\t\tattacker.cardId === CardIds.WhirlingLassOMatic_BG28_635_G\r\n\t\t) {\r\n\t\t\tconst numberOfCardsToAdd = attacker.cardId === CardIds.WhirlingLassOMatic_BG28_635_G ? 2 : 1;\r\n\t\t\tconst cardsToAdd = Array.from({ length: numberOfCardsToAdd }).map(() => null);\r\n\t\t\taddCardsInHand(attackingBoardHero, attackingBoard, cardsToAdd, gameState);\r\n\t\t} else if (attacker.cardId === CardIds.Rampager_BG29_809 || attacker.cardId === CardIds.Rampager_BG29_809_G) {\r\n\t\t\tconst loops = attacker.cardId === CardIds.Rampager_BG29_809_G ? 2 : 1;\r\n\t\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\t\t// Don't include new spawns\r\n\t\t\t\tfor (const entity of [...attackingBoard]) {\r\n\t\t\t\t\tif (entity.entityId === attacker.entityId) {\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tconst isSameSide = entity.friendly === attacker.friendly;\r\n\t\t\t\t\tconst board = isSameSide ? attackingBoard : defendingBoard;\r\n\t\t\t\t\tconst hero = isSameSide ? attackingBoardHero : defendingBoardHero;\r\n\t\t\t\t\tdealDamageToMinion(\r\n\t\t\t\t\t\tentity,\r\n\t\t\t\t\t\tboard,\r\n\t\t\t\t\t\thero,\r\n\t\t\t\t\t\tattacker,\r\n\t\t\t\t\t\t1,\r\n\t\t\t\t\t\tisSameSide ? defendingBoard : attackingBoard,\r\n\t\t\t\t\t\tisSameSide ? defendingBoardHero : attackingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (\r\n\t\t\tattacker.cardId === CardIds.HatefulHag_BG29_120 ||\r\n\t\t\tattacker.cardId === CardIds.HatefulHag_BG29_120_G\r\n\t\t) {\r\n\t\t\tconst loops = attacker.cardId === CardIds.HatefulHag_BG29_120_G ? 2 : 1;\r\n\t\t\tconst attackerIndex = attackingBoard.indexOf(attacker);\r\n\t\t\tfor (let i = 1; i <= loops; i++) {\r\n\t\t\t\tconst target = attackingBoard[attackerIndex + i];\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tupdateReborn(target, true, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\tattacker,\r\n\t\t\t\t\t\ttarget,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tconst eclipsion = attackingBoard.find(\r\n\t\t(e) =>\r\n\t\t\t[\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy,\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t].includes(e.cardId as CardIds) && e.abiityChargesLeft > 0,\r\n\t);\r\n\t// Only once per minion\r\n\tif (!!eclipsion && attacker.immuneWhenAttackCharges == null) {\r\n\t\tattacker.immuneWhenAttackCharges = 1;\r\n\t\t// If we have 2 eclipsions, the first minion that attacks eats both charges\r\n\t\tattackingBoard\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy,\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\t].includes(e.cardId as CardIds),\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\te.abiityChargesLeft--;\r\n\t\t\t});\r\n\t}\r\n\r\n\tfor (const trinket of attackingBoardHero.trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.CeremonialSword_BG30_MagicItem_925:\r\n\t\t\t\tmodifyStats(attacker, trinket, 4, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn { damageDoneByAttacker, damageDoneByDefender };\r\n};\r\n\r\nexport interface OnAttackInput {\r\n\tattacker: BoardEntity;\r\n\tisSelfAttacking: boolean;\r\n\tattackingHero: BgsPlayerEntity;\r\n\tattackingBoard: BoardEntity[];\r\n\tdefendingEntity: BoardEntity;\r\n\tdefendingHero: BgsPlayerEntity;\r\n\tdefendingBoard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n\tplayerIsFriendly: boolean;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"on-attack.js","sourceRoot":"","sources":["../../src/simulation/on-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 { hasOnWheneverAnotherMinionAttacks, hasRally } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { updateReborn } from '../keywords/reborn';\r\nimport { pickRandom } from '../services/utils';\r\nimport { hasCorrectTribe } from '../utils';\r\nimport { dealDamageToMinion, getNeighbours } from './attack';\r\nimport { addCardsInHand } from './cards-in-hand';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { modifyStats } from './stats';\r\n\r\n// Whenever it attacks\r\nexport const applyOnAttackEffects = (\r\n\tattacker: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): { damageDoneByAttacker: number; damageDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\r\n\tfor (const trinket of attackingBoardHero.trinkets ?? []) {\r\n\t\tconst onAttackImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasOnWheneverAnotherMinionAttacks(onAttackImpl)) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(trinket, {\r\n\t\t\t\tattacker: attacker,\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\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t}\r\n\r\n\t// \"Whenever friendly minion attacks\" triggers before the rally itself?\r\n\t// https://replays.firestoneapp.com/?reviewId=04e6a624-ccd5-4068-9420-884843f3685f&turn=25&action=1\r\n\tconst attackingBoardOtherEntities = attackingBoard.filter((e) => e !== attacker);\r\n\tfor (const boardEntity of attackingBoardOtherEntities) {\r\n\t\tconst onAttackImpl = cardMappings[boardEntity.cardId];\r\n\t\tif (hasOnWheneverAnotherMinionAttacks(onAttackImpl)) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(boardEntity, {\r\n\t\t\t\tattacker: attacker,\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\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tconst enchantments = boardEntity.enchantments;\r\n\t\tfor (const enchantment of enchantments) {\r\n\t\t\tconst onAttackImpl = cardMappings[enchantment.cardId];\r\n\t\t\tif (hasOnWheneverAnotherMinionAttacks(onAttackImpl)) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.onWheneverAnotherMinionAttacks(\r\n\t\t\t\t\tenchantment,\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t\t},\r\n\t\t\t\t);\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// This assumes that only \"Rally\" effects trigger on attack\r\n\t// 2025-08-20: this is false. \"Whenever a friendly minion attacks\" is not a rally effect\r\n\tconst rallyLoops =\r\n\t\t1 +\r\n\t\t(attackingBoardHero.questRewardEntities?.filter((r) => r.cardId === CardIds.RallyingCry_BG33_Reward_021)\r\n\t\t\t.length ?? 0);\r\n\tfor (let i = 0; i < rallyLoops; i++) {\r\n\t\tconst onAttackImpl = cardMappings[attacker.cardId];\r\n\t\tif (hasRally(onAttackImpl)) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(attacker, {\r\n\t\t\t\tattacker: attacker,\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\tdefendingHero: defendingBoardHero,\r\n\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\tgameState,\r\n\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t});\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tconst enchantments = attacker.enchantments;\r\n\t\tfor (const enchantment of enchantments) {\r\n\t\t\tconst onAttackImpl = cardMappings[enchantment.cardId];\r\n\t\t\tif (hasRally(onAttackImpl)) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onAttackImpl.rally(enchantment, {\r\n\t\t\t\t\tattacker: attacker,\r\n\t\t\t\t\tattackingHero: attackingBoardHero,\r\n\t\t\t\t\tattackingBoard: attackingBoard,\r\n\t\t\t\t\tdefendingEntity: defendingEntity,\r\n\t\t\t\t\tdefendingHero: defendingBoardHero,\r\n\t\t\t\t\tdefendingBoard: defendingBoard,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t\tplayerIsFriendly: attackingBoardHero.friendly,\r\n\t\t\t\t});\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Damage happens before the entity is buffed, e.g. before an attack buff from Roaring Rallier\r\n\tif (\r\n\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017 ||\r\n\t\tattacker.cardId === CardIds.ObsidianRavager_BG27_017_G\r\n\t) {\r\n\t\tconst neighbours = getNeighbours(defendingBoard, defendingEntity);\r\n\t\tconst targets = attacker.cardId === CardIds.ObsidianRavager_BG27_017_G ? neighbours : [pickRandom(neighbours)];\r\n\t\t[defendingEntity, ...targets].forEach((target) => {\r\n\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\tattacker,\r\n\t\t\t\ttarget,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t);\r\n\t\t\t// damageDoneByAttacker +=\r\n\t\t\tdealDamageToMinion(\r\n\t\t\t\ttarget,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattacker,\r\n\t\t\t\tattacker.attack,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\r\n\t// Roaring Rallier\r\n\tif (hasCorrectTribe(attacker, attackingBoardHero, Race.DRAGON, gameState.anomalies, gameState.allCards)) {\r\n\t\tattackingBoard\r\n\t\t\t.filter(\r\n\t\t\t\t(e) => e.cardId === CardIds.RoaringRallier_BG29_816 || e.cardId === CardIds.RoaringRallier_BG29_816_G,\r\n\t\t\t)\r\n\t\t\t.forEach((rallier) => {\r\n\t\t\t\tif (rallier !== attacker) {\r\n\t\t\t\t\tconst stats = rallier.cardId === CardIds.RoaringRallier_BG29_816_G ? 2 : 1;\r\n\t\t\t\t\tmodifyStats(attacker, rallier, 3 * stats, 1 * stats, attackingBoard, attackingBoardHero, gameState);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t}\r\n\r\n\t// if (attacker.cardId === CardIds.GlyphGuardian_BGS_045) {\r\n\t// \t// For now the utility method only works additively, so we hack around it\r\n\t// \tmodifyStats(\r\n\t// \t\tattacker,\r\n\t// \t\tnull,\r\n\t// \t\t2 * attacker.attack - attacker.attack,\r\n\t// \t\t0,\r\n\t// \t\tattackingBoard,\r\n\t// \t\tattackingBoardHero,\r\n\t// \t\tgameState,\r\n\t// \t);\r\n\t// } else if (attacker.cardId === CardIds.GlyphGuardian_TB_BaconUps_115) {\r\n\t// \tmodifyStats(\r\n\t// \t\tattacker,\r\n\t// \t\tnull,\r\n\t// \t\t3 * attacker.attack - attacker.attack,\r\n\t// \t\t0,\r\n\t// \t\tattackingBoard,\r\n\t// \t\tattackingBoardHero,\r\n\t// \t\tgameState,\r\n\t// \t);\r\n\t// } else\r\n\tif (attacker.cardId === CardIds.GlimGuardian_BG29_888 || attacker.cardId === CardIds.GlimGuardian_BG29_888_G) {\r\n\t\tconst multiplier = attacker.cardId === CardIds.GlimGuardian_BG29_888_G ? 2 : 1;\r\n\t\tmodifyStats(attacker, attacker, 2 * multiplier, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t} else if (\r\n\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708 ||\r\n\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G\r\n\t) {\r\n\t\tattackingBoard\r\n\t\t\t.filter((e) => hasCorrectTribe(e, attackingBoardHero, Race.PIRATE, gameState.anomalies, gameState.allCards))\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tmodifyStats(\r\n\t\t\t\t\te,\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G ? 4 : 2,\r\n\t\t\t\t\tattacker.cardId === CardIds.VanessaVancleef_BG24_708_G ? 4 : 2,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t} else if (\r\n\t\tattacker.cardId === CardIds.WhirlingLassOMatic_BG28_635 ||\r\n\t\tattacker.cardId === CardIds.WhirlingLassOMatic_BG28_635_G\r\n\t) {\r\n\t\tconst numberOfCardsToAdd = attacker.cardId === CardIds.WhirlingLassOMatic_BG28_635_G ? 2 : 1;\r\n\t\tconst cardsToAdd = Array.from({ length: numberOfCardsToAdd }).map(() => null);\r\n\t\taddCardsInHand(attackingBoardHero, attackingBoard, cardsToAdd, gameState);\r\n\t} else if (attacker.cardId === CardIds.Rampager_BG29_809 || attacker.cardId === CardIds.Rampager_BG29_809_G) {\r\n\t\tconst loops = attacker.cardId === CardIds.Rampager_BG29_809_G ? 2 : 1;\r\n\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\t// Don't include new spawns\r\n\t\t\tfor (const entity of [...attackingBoard]) {\r\n\t\t\t\tif (entity.entityId === attacker.entityId) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tconst isSameSide = entity.friendly === attacker.friendly;\r\n\t\t\t\tconst board = isSameSide ? attackingBoard : defendingBoard;\r\n\t\t\t\tconst hero = isSameSide ? attackingBoardHero : defendingBoardHero;\r\n\t\t\t\tdealDamageToMinion(\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tboard,\r\n\t\t\t\t\thero,\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\t1,\r\n\t\t\t\t\tisSameSide ? defendingBoard : attackingBoard,\r\n\t\t\t\t\tisSameSide ? defendingBoardHero : attackingBoardHero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t} else if (attacker.cardId === CardIds.HatefulHag_BG29_120 || attacker.cardId === CardIds.HatefulHag_BG29_120_G) {\r\n\t\tconst loops = attacker.cardId === CardIds.HatefulHag_BG29_120_G ? 2 : 1;\r\n\t\tconst attackerIndex = attackingBoard.indexOf(attacker);\r\n\t\tfor (let i = 1; i <= loops; i++) {\r\n\t\t\tconst target = attackingBoard[attackerIndex + i];\r\n\t\t\tif (!!target) {\r\n\t\t\t\tupdateReborn(target, true, attackingBoard, attackingBoardHero, defendingBoardHero, gameState);\r\n\t\t\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tattacker,\r\n\t\t\t\t\ttarget,\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}\r\n\t\t}\r\n\t}\r\n\r\n\tconst eclipsion = attackingBoard.find(\r\n\t\t(e) =>\r\n\t\t\t[\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy,\r\n\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t].includes(e.cardId as CardIds) && e.abiityChargesLeft > 0,\r\n\t);\r\n\t// Only once per minion\r\n\tif (!!eclipsion && attacker.immuneWhenAttackCharges == null) {\r\n\t\tattacker.immuneWhenAttackCharges = 1;\r\n\t\t// If we have 2 eclipsions, the first minion that attacks eats both charges\r\n\t\tattackingBoard\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy,\r\n\t\t\t\t\tCardIds.EclipsionIllidari_TB_BaconShop_HERO_08_Buddy_G,\r\n\t\t\t\t].includes(e.cardId as CardIds),\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\te.abiityChargesLeft--;\r\n\t\t\t});\r\n\t}\r\n\r\n\tfor (const trinket of attackingBoardHero.trinkets) {\r\n\t\tswitch (trinket.cardId) {\r\n\t\t\tcase CardIds.CeremonialSword_BG30_MagicItem_925:\r\n\t\t\t\tmodifyStats(attacker, trinket, 4, 0, attackingBoard, attackingBoardHero, gameState);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn { damageDoneByAttacker, damageDoneByDefender };\r\n};\r\n\r\nexport interface OnAttackInput {\r\n\tattacker: BoardEntity;\r\n\tattackingHero: BgsPlayerEntity;\r\n\tattackingBoard: BoardEntity[];\r\n\tdefendingEntity: BoardEntity;\r\n\tdefendingHero: BgsPlayerEntity;\r\n\tdefendingBoard: BoardEntity[];\r\n\tgameState: FullGameState;\r\n\tplayerIsFriendly: boolean;\r\n}\r\n"]}
|