@firestone-hs/simulate-bgs-battle 1.1.552 → 1.1.554
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/impl/hero-power/rapid-reanimation.js +2 -0
- package/dist/cards/impl/hero-power/rapid-reanimation.js.map +1 -1
- package/dist/cards/impl/minion/battlecruiser.js +31 -24
- package/dist/cards/impl/minion/battlecruiser.js.map +1 -1
- package/dist/cards/impl/minion/captain-bonerender.js +39 -7
- package/dist/cards/impl/minion/captain-bonerender.js.map +1 -1
- package/dist/cards/impl/minion/corrupted-myrmidon.js +1 -1
- package/dist/cards/impl/minion/corrupted-myrmidon.js.map +1 -1
- package/dist/cards/impl/minion/karmic-chameleon.js +12 -12
- package/dist/cards/impl/minion/karmic-chameleon.js.map +1 -1
- package/dist/cards/impl/minion/turquoise-skitterer.js +5 -3
- package/dist/cards/impl/minion/turquoise-skitterer.js.map +1 -1
- package/dist/simulation/add-minion-to-board.js +2 -1
- package/dist/simulation/add-minion-to-board.js.map +1 -1
- package/dist/simulation/attack.d.ts +1 -1
- package/dist/simulation/attack.js +1 -0
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/damage-effects.js +1 -1
- package/dist/simulation/damage-effects.js.map +1 -1
- package/dist/simulation/spawns.js +7 -2
- package/dist/simulation/spawns.js.map +1 -1
- package/dist/simulation/start-of-combat/start-of-combat.js +2 -2
- package/dist/simulation/start-of-combat/start-of-combat.js.map +1 -1
- package/dist/simulation/summon-when-space.js +1 -17
- package/dist/simulation/summon-when-space.js.map +1 -1
- package/dist/utils.js +3 -1
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RapidReanimation = void 0;
|
|
4
|
+
const add_minion_to_board_1 = require("../../../simulation/add-minion-to-board");
|
|
4
5
|
const utils_1 = require("../../../utils");
|
|
5
6
|
exports.RapidReanimation = {
|
|
6
7
|
startOfCombatTiming: 'pre-combat',
|
|
@@ -18,6 +19,7 @@ exports.RapidReanimation = {
|
|
|
18
19
|
input.playerEntity.rapidReanimationIndexFromRight =
|
|
19
20
|
input.playerBoard.length - 1 - rapidReanimationIndexFromLeft;
|
|
20
21
|
const minionToCopy = (0, utils_1.copyEntity)(minionThatWillDie);
|
|
22
|
+
(0, add_minion_to_board_1.removeAurasFromSelf)(minionToCopy, input.playerBoard, input.playerEntity, input.gameState);
|
|
21
23
|
input.playerEntity.rapidReanimationMinion = minionToCopy;
|
|
22
24
|
minionThatWillDie.definitelyDead = true;
|
|
23
25
|
input.gameState.spectator.registerPowerTarget(input.playerEntity, minionThatWillDie, input.playerBoard, input.playerEntity, input.opponentEntity);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rapid-reanimation.js","sourceRoot":"","sources":["../../../../src/cards/impl/hero-power/rapid-reanimation.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"rapid-reanimation.js","sourceRoot":"","sources":["../../../../src/cards/impl/hero-power/rapid-reanimation.ts"],"names":[],"mappings":";;;AAEA,iFAA8E;AAE9E,0CAA4C;AAG/B,QAAA,gBAAgB,GAAsB;IAClD,mBAAmB,EAAE,YAAY;IACjC,OAAO,EAAE,kBAAyC;IAClD,aAAa,EAAE,CAAC,OAAqB,EAAE,KAAe,EAAE,EAAE;QACzD,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE;YACtD,IAAI,wBAAgB,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,IAAI,EAAE;gBAM1E,MAAM,iBAAiB,GAAG,KAAK,CAAC,WAAW;qBACzC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,sBAAuD,CAAC,CAC3F;qBACA,IAAI,CACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,sBAAuD,CAAC;qBACzF,cAAc;oBACf,CAAC,CAAC,YAAY,CAAC,IAAI,CAClB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,sBAAuD,CACtE,CAAC,cAAc,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAC7C,CAAC,CAAC,CAAC,CAAC;gBACN,IAAI,iBAAiB,EAAE;oBAUtB,MAAM,6BAA6B,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;oBACnF,KAAK,CAAC,YAAY,CAAC,8BAA8B;wBAChD,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,6BAA6B,CAAC;oBAC9D,MAAM,YAAY,GAAG,IAAA,kBAAU,EAAC,iBAAiB,CAAC,CAAC;oBAGnD,IAAA,yCAAmB,EAAC,YAAY,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;oBAC1F,KAAK,CAAC,YAAY,CAAC,sBAAsB,GAAG,YAAY,CAAC;oBACzD,iBAAiB,CAAC,cAAc,GAAG,IAAI,CAAC;oBACxC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,KAAK,CAAC,YAAY,EAClB,iBAAiB,EACjB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,cAAc,CACpB,CAAC;oBACF,OAAO,EAAE,YAAY,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,CAAC;iBACpE;aACD;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BoardTrinket } from '../../../bgs-player-entity';\r\nimport { removeAurasFromSelf } from '../../../simulation/add-minion-to-board';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { copyEntity } from '../../../utils';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const RapidReanimation: StartOfCombatCard = {\r\n\tstartOfCombatTiming: 'pre-combat',\r\n\tcardIds: [CardIds.TeronGorefiend_RapidReanimation],\r\n\tstartOfCombat: (trinket: BoardTrinket, input: SoCInput) => {\r\n\t\tfor (const heroPower of input.playerEntity.heroPowers) {\r\n\t\t\tif (RapidReanimation.cardIds.includes(heroPower.cardId) && heroPower.used) {\r\n\t\t\t\t// Getting the right enchantment can be tricky. The RapidReanimation enchantment can sometimes be\r\n\t\t\t\t// in the Graveyard zone, so we can't filter them out. In that case, we can have multiple\r\n\t\t\t\t// enchantments\r\n\t\t\t\t// However, because of how things are handled in the logs, we should be able to always take the one *\r\n\t\t\t\t// with the biggest entityId\r\n\t\t\t\tconst minionThatWillDie = input.playerBoard\r\n\t\t\t\t\t.filter((m) =>\r\n\t\t\t\t\t\tm.enchantments.some((e) => e.cardId === CardIds.RapidReanimation_ImpendingDeathEnchantment),\r\n\t\t\t\t\t)\r\n\t\t\t\t\t.sort(\r\n\t\t\t\t\t\t(a, b) =>\r\n\t\t\t\t\t\t\tb.enchantments.find((e) => e.cardId === CardIds.RapidReanimation_ImpendingDeathEnchantment)\r\n\t\t\t\t\t\t\t\t.originEntityId -\r\n\t\t\t\t\t\t\t\ta.enchantments.find(\r\n\t\t\t\t\t\t\t\t\t(e) => e.cardId === CardIds.RapidReanimation_ImpendingDeathEnchantment,\r\n\t\t\t\t\t\t\t\t).originEntityId || b.entityId - a.entityId,\r\n\t\t\t\t\t)[0];\r\n\t\t\t\tif (minionThatWillDie) {\r\n\t\t\t\t\t// So this is a bit tricky (as all the stuff with indices...). Because in practice it's more likely that players use Rapid Reanimation\r\n\t\t\t\t\t// on minions that they want to die quickly, most of the time they will be placed\r\n\t\t\t\t\t// to the left of the board\r\n\t\t\t\t\t// So using a left-based index (usually 0) is more likely to be correct after minions spawn on the board\r\n\t\t\t\t\t// Update: this looks like it's not the case, and looking at\r\n\t\t\t\t\t// http://replays.firestoneapp.com/?reviewId=2e6b389f-d904-43a2-a7cd-928a60d973ce&turn=11&action=1\r\n\t\t\t\t\t// the index seems to be right-based at least in some cases\r\n\t\t\t\t\t// Looks like even this is wrong:\r\n\t\t\t\t\t// http://replays.firestoneapp.com/?reviewId=9a46ab39-ccf0-478c-a010-68f2abb06c6f&turn=9&action=0\r\n\t\t\t\t\tconst rapidReanimationIndexFromLeft = input.playerBoard.indexOf(minionThatWillDie);\r\n\t\t\t\t\tinput.playerEntity.rapidReanimationIndexFromRight =\r\n\t\t\t\t\t\tinput.playerBoard.length - 1 - rapidReanimationIndexFromLeft;\r\n\t\t\t\t\tconst minionToCopy = copyEntity(minionThatWillDie);\r\n\t\t\t\t\t// We don't reapply auras when resummoning\r\n\t\t\t\t\t// Actually we should: a dead Goldrinn is then buffed by the auras upon resummon\r\n\t\t\t\t\tremoveAurasFromSelf(minionToCopy, input.playerBoard, input.playerEntity, input.gameState);\r\n\t\t\t\t\tinput.playerEntity.rapidReanimationMinion = minionToCopy;\r\n\t\t\t\t\tminionThatWillDie.definitelyDead = true;\r\n\t\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\tminionThatWillDie,\r\n\t\t\t\t\t\tinput.playerBoard,\r\n\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\tinput.opponentEntity,\r\n\t\t\t\t\t);\r\n\t\t\t\t\treturn { hasTriggered: true, shouldRecomputeCurrentAttacker: true };\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -9,29 +9,38 @@ exports.Battlecruiser = {
|
|
|
9
9
|
cardIds: ["BG31_HERO_801pt", "BG31_HERO_801pt_G"],
|
|
10
10
|
startOfCombat: (minion, input) => {
|
|
11
11
|
var _a, _b;
|
|
12
|
-
const
|
|
13
|
-
.
|
|
14
|
-
|
|
15
|
-
if (!yamatoCannon) {
|
|
12
|
+
const yamatoCannons = [...((_a = minion.enchantments) !== null && _a !== void 0 ? _a : [])]
|
|
13
|
+
.filter((e) => e.cardId === "BG31_HERO_801ptce");
|
|
14
|
+
if (!(yamatoCannons === null || yamatoCannons === void 0 ? void 0 : yamatoCannons.length)) {
|
|
16
15
|
return false;
|
|
17
16
|
}
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
const aliveEntities = input.opponentBoard
|
|
18
|
+
.filter((entity) => entity.health > 0 && !entity.definitelyDead)
|
|
19
|
+
.map((e) => e.entityId);
|
|
20
|
+
let target = (0, utils_1.getRandomMinionWithHighestHealth)(input.opponentBoardBefore.filter((e) => aliveEntities.includes(e.entityId)));
|
|
21
|
+
const cannonDamage = Math.max(...yamatoCannons.map((e) => e.tagScriptDataNum1));
|
|
22
|
+
for (const yamatoCannon of yamatoCannons) {
|
|
23
|
+
const loops = ((_b = minion.tags) === null || _b === void 0 ? void 0 : _b[reference_data_1.GameTag.BACON_YAMATO_CANNON]) === 1 ? 2 : 1;
|
|
24
|
+
for (let i = 0; i < loops; i++) {
|
|
25
|
+
if (!target) {
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
if (target.health <= 0 || target.definitelyDead) {
|
|
29
|
+
target = (0, utils_1.getRandomMinionWithHighestHealth)(input.opponentBoard);
|
|
30
|
+
}
|
|
31
|
+
if (!!target) {
|
|
32
|
+
input.gameState.spectator.registerPowerTarget(minion, target, input.opponentBoard, input.playerEntity, input.opponentEntity);
|
|
33
|
+
(0, attack_1.dealDamageToMinion)(target, input.opponentBoard, input.opponentEntity, minion, cannonDamage, input.playerBoard, input.playerEntity, input.gameState);
|
|
34
|
+
}
|
|
25
35
|
}
|
|
26
36
|
}
|
|
27
37
|
return true;
|
|
28
38
|
},
|
|
29
39
|
rebornEffect: (minion, input) => {
|
|
30
40
|
var _a;
|
|
31
|
-
const
|
|
32
|
-
.
|
|
33
|
-
|
|
34
|
-
if (!ultraCapacitor) {
|
|
41
|
+
const ultraCapacitors = [...((_a = input.initialEntity.enchantments) !== null && _a !== void 0 ? _a : [])]
|
|
42
|
+
.filter((e) => e.cardId === "BG31_HERO_801ptje");
|
|
43
|
+
if (!(ultraCapacitors === null || ultraCapacitors === void 0 ? void 0 : ultraCapacitors.length)) {
|
|
35
44
|
return;
|
|
36
45
|
}
|
|
37
46
|
minion.enchantments = input.initialEntity.enchantments;
|
|
@@ -50,12 +59,11 @@ exports.Battlecruiser = {
|
|
|
50
59
|
return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
|
|
51
60
|
}
|
|
52
61
|
const advancedBallistics = [...((_a = minion.enchantments) !== null && _a !== void 0 ? _a : [])]
|
|
53
|
-
.
|
|
54
|
-
|
|
55
|
-
if (!advancedBallistics) {
|
|
62
|
+
.filter((e) => e.cardId === "BG31_HERO_801ptde");
|
|
63
|
+
if (!(advancedBallistics === null || advancedBallistics === void 0 ? void 0 : advancedBallistics.length)) {
|
|
56
64
|
return { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };
|
|
57
65
|
}
|
|
58
|
-
const buff = advancedBallistics.tagScriptDataNum1;
|
|
66
|
+
const buff = advancedBallistics.map((e) => { var _a; return (_a = e.tagScriptDataNum1) !== null && _a !== void 0 ? _a : 0; }).reduce((a, b) => a + b, 0);
|
|
59
67
|
const targets = input.attackingBoard.filter((entity) => entity !== minion);
|
|
60
68
|
for (const target of targets) {
|
|
61
69
|
(0, stats_1.modifyStats)(target, buff, 0, input.attackingBoard, input.attackingHero, input.gameState);
|
|
@@ -64,17 +72,16 @@ exports.Battlecruiser = {
|
|
|
64
72
|
},
|
|
65
73
|
deathrattleEffect: (minion, input) => {
|
|
66
74
|
var _a;
|
|
67
|
-
const
|
|
68
|
-
.
|
|
69
|
-
|
|
70
|
-
if (!caduceusReactor) {
|
|
75
|
+
const caduceusReactors = [...((_a = minion.enchantments) !== null && _a !== void 0 ? _a : [])]
|
|
76
|
+
.filter((e) => e.cardId === "BG31_HERO_801ptee");
|
|
77
|
+
if (!(caduceusReactors === null || caduceusReactors === void 0 ? void 0 : caduceusReactors.length)) {
|
|
71
78
|
return;
|
|
72
79
|
}
|
|
73
80
|
const target = input.boardWithDeadEntity.filter((e) => e.health > 0 && !e.definitelyDead)[0];
|
|
74
81
|
if (!target) {
|
|
75
82
|
return;
|
|
76
83
|
}
|
|
77
|
-
const buff =
|
|
84
|
+
const buff = caduceusReactors.map((e) => { var _a; return (_a = e.tagScriptDataNum1) !== null && _a !== void 0 ? _a : 0; }).reduce((a, b) => a + b, 0);
|
|
78
85
|
(0, stats_1.modifyStats)(target, buff, buff, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);
|
|
79
86
|
input.gameState.spectator.registerPowerTarget(minion, target, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.otherBoardHero);
|
|
80
87
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"battlecruiser.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/battlecruiser.ts"],"names":[],"mappings":";;;AAAA,iEAAgE;AAEhE,uDAAgE;AAKhE,qDAAwD;AACxD,0CAAkE;AAGrD,QAAA,aAAa,GAAgF;IACzG,OAAO,EAAE,wCAA6F;IACtG,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;;QAEvD,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,MAAA,MAAM,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC;aACnD,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,wBAAmE,CAAC,CAAC;QAC3F,IAAI,CAAC,YAAY,EAAE;YAClB,OAAO,KAAK,CAAC;SACb;QAED,MAAM,MAAM,GAAG,YAAY,CAAC,iBAAiB,CAAC;QAC9C,MAAM,KAAK,GAAG,CAAA,MAAA,MAAM,CAAC,IAAI,0CAAG,wBAAO,CAAC,mBAAmB,CAAC,MAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE;YAC/B,MAAM,MAAM,GAAG,IAAA,wCAAgC,EAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACrE,IAAI,CAAC,CAAC,MAAM,EAAE;gBACb,IAAA,2BAAkB,EACjB,MAAM,EACN,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,MAAM,EACN,MAAM,EACN,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,MAAM,EACN,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,cAAc,CACpB,CAAC;aACF;SACD;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IACD,YAAY,EAAE,CAAC,MAAmB,EAAE,KAAwB,EAAE,EAAE;;QAC/D,MAAM,cAAc,GAAG,CAAC,GAAG,CAAC,MAAA,KAAK,CAAC,aAAa,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC;aAClE,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,wBAAuE,CAAC,CAAC;QAC/F,IAAI,CAAC,cAAc,EAAE;YACpB,OAAO;SACP;QAED,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC;QACvD,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;QAC9C,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;QACjD,MAAM,CAAC,MAAM,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;QAC9C,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;QACjD,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC;QAC1D,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC;QACzC,MAAM,CAAC,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,CAAC;QAC/C,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,aAAa,CAAC,SAAS,CAAC;IAClD,CAAC;IACD,iBAAiB,EAAE,CAClB,MAAmB,EACnB,KAAoB,EAInB,EAAE;;QACH,IAAI,MAAM,KAAK,KAAK,CAAC,QAAQ,EAAE;YAC9B,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,kBAAkB,GAAG,CAAC,GAAG,CAAC,MAAA,MAAM,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC;aACzD,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,wBAA+E,CAAC,CAAC;QACvG,IAAI,CAAC,kBAAkB,EAAE;YACxB,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;SACtD;QAED,MAAM,IAAI,GAAG,kBAAkB,CAAC,iBAAiB,CAAC;QAClD,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC3E,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SACzF;QACD,OAAO,EAAE,iBAAiB,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACvD,CAAC;IACD,iBAAiB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;;QAC5E,MAAM,eAAe,GAAG,CAAC,GAAG,CAAC,MAAA,MAAM,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC;aACtD,OAAO,EAAE;aACT,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,wBAAyE,CAAC,CAAC;QACjG,IAAI,CAAC,eAAe,EAAE;YACrB,OAAO;SACP;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7F,IAAI,CAAC,MAAM,EAAE;YACZ,OAAO;SACP;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,iBAAiB,CAAC;QAC/C,IAAA,mBAAW,EAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3G,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,MAAM,EACN,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,cAAc,CACpB,CAAC;IACH,CAAC;CACD,CAAC","sourcesContent":["import { CardIds, GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { dealDamageToMinion } from '../../../simulation/attack';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { RebornEffectInput } from '../../../simulation/reborn';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getRandomMinionWithHighestHealth } from '../../../utils';\r\nimport { DeathrattleEffectCard, OnAttackCard, RebornEffectCard, StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const Battlecruiser: StartOfCombatCard & RebornEffectCard & OnAttackCard & DeathrattleEffectCard = {\r\n\tcardIds: [CardIds.LiftOff_BattlecruiserToken_BG31_HERO_801pt, CardIds.Battlecruiser_BG31_HERO_801pt_G],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\t// Enchantments can appear multiple times???\r\n\t\tconst yamatoCannon = [...(minion.enchantments ?? [])]\r\n\t\t\t.reverse()\r\n\t\t\t.find((e) => e.cardId === CardIds.YamatoCannon_YamatoCannonEnchantment_BG31_HERO_801ptce);\r\n\t\tif (!yamatoCannon) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst damage = yamatoCannon.tagScriptDataNum1;\r\n\t\tconst loops = minion.tags?.[GameTag.BACON_YAMATO_CANNON] === 1 ? 2 : 1;\r\n\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\tconst target = getRandomMinionWithHighestHealth(input.opponentBoard);\r\n\t\t\tif (!!target) {\r\n\t\t\t\tdealDamageToMinion(\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tinput.opponentBoard,\r\n\t\t\t\t\tinput.opponentEntity,\r\n\t\t\t\t\tminion,\r\n\t\t\t\t\tdamage,\r\n\t\t\t\t\tinput.playerBoard,\r\n\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tminion,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\tinput.opponentBoard,\r\n\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\tinput.opponentEntity,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\trebornEffect: (minion: BoardEntity, input: RebornEffectInput) => {\r\n\t\tconst ultraCapacitor = [...(input.initialEntity.enchantments ?? [])]\r\n\t\t\t.reverse()\r\n\t\t\t.find((e) => e.cardId === CardIds.UltraCapacitor_UltraCapacitorEnchantment_BG31_HERO_801ptje);\r\n\t\tif (!ultraCapacitor) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tminion.enchantments = input.initialEntity.enchantments;\r\n\t\tminion.attack = input.initialEntity.maxAttack;\r\n\t\tminion.maxAttack = input.initialEntity.maxAttack;\r\n\t\tminion.health = input.initialEntity.maxHealth;\r\n\t\tminion.maxHealth = input.initialEntity.maxHealth;\r\n\t\tminion.divineShield = input.initialEntity.hadDivineShield;\r\n\t\tminion.taunt = input.initialEntity.taunt;\r\n\t\tminion.windfury = input.initialEntity.windfury;\r\n\t\tminion.poisonous = input.initialEntity.poisonous;\r\n\t},\r\n\tonAnyMinionAttack: (\r\n\t\tminion: BoardEntity,\r\n\t\tinput: OnAttackInput,\r\n\t): {\r\n\t\tdmgDoneByAttacker: number;\r\n\t\tdmgDoneByDefender: number;\r\n\t} => {\r\n\t\tif (minion !== input.attacker) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst advancedBallistics = [...(minion.enchantments ?? [])]\r\n\t\t\t.reverse()\r\n\t\t\t.find((e) => e.cardId === CardIds.AdvancedBallistics_AdvancedBallisticsEnchantment_BG31_HERO_801ptde);\r\n\t\tif (!advancedBallistics) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst buff = advancedBallistics.tagScriptDataNum1;\r\n\t\tconst targets = input.attackingBoard.filter((entity) => entity !== minion);\r\n\t\tfor (const target of targets) {\r\n\t\t\tmodifyStats(target, buff, 0, input.attackingBoard, input.attackingHero, input.gameState);\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n\tdeathrattleEffect: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst caduceusReactor = [...(minion.enchantments ?? [])]\r\n\t\t\t.reverse()\r\n\t\t\t.find((e) => e.cardId === CardIds.CaduceusReactor_CaduceusReactorEnchantment_BG31_HERO_801ptee);\r\n\t\tif (!caduceusReactor) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst target = input.boardWithDeadEntity.filter((e) => e.health > 0 && !e.definitelyDead)[0];\r\n\t\tif (!target) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst buff = caduceusReactor.tagScriptDataNum1;\r\n\t\tmodifyStats(target, buff, buff, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);\r\n\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\tminion,\r\n\t\t\ttarget,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\tinput.otherBoardHero,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"file":"battlecruiser.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/battlecruiser.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds, GameTag } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { dealDamageToMinion } from '../../../simulation/attack';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { OnAttackInput } from '../../../simulation/on-attack';\r\nimport { RebornEffectInput } from '../../../simulation/reborn';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { getRandomMinionWithHighestHealth } from '../../../utils';\r\nimport { DeathrattleEffectCard, OnAttackCard, RebornEffectCard, StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const Battlecruiser: StartOfCombatCard & RebornEffectCard & OnAttackCard & DeathrattleEffectCard = {\r\n\tcardIds: [CardIds.LiftOff_BattlecruiserToken_BG31_HERO_801pt, CardIds.Battlecruiser_BG31_HERO_801pt_G],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\t// Enchantments can appear multiple times???\r\n\t\tconst yamatoCannons = [...(minion.enchantments ?? [])]\r\n\t\t\t// .reverse()\r\n\t\t\t.filter((e) => e.cardId === CardIds.YamatoCannon_YamatoCannonEnchantment_BG31_HERO_801ptce);\r\n\t\tif (!yamatoCannons?.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\t// Still not sure how these should be processed\r\n\t\t// In some cases, it feels like it takes the sum of the damage, in other cases it runs them one after the other\r\n\t\t// (but maybe that's just the replay aggregating the values)\r\n\t\t// I'm not sure about the BACON_YAMATO_CANNON tag; it seems like it indicates multiple cannons, but I'm not sure\r\n\t\t// Other issues: looks like that if there are multiple cannon enchantments but no divine shield, everything is applied to the same target\r\n\t\t// So it looks as if the target is selected first, then everything targets it\r\n\t\t// https://replays.firestoneapp.com/?reviewId=e8f38ab0-3380-4275-88d8-0715d69d3f08&turn=21&action=1\r\n\t\t// Even more than that: the target is the same between multiple battlecruisers\r\n\t\t// https://replays.firestoneapp.com/?reviewId=cbfd6fe9-1a58-400a-a593-6b8852df5427&turn=9&action=0\r\n\t\t// However I'm pretty sure I've seen another behavior\r\n\t\t// Get the highest health opponent minion at the start of the phase\r\n\t\tconst aliveEntities = input.opponentBoard\r\n\t\t\t.filter((entity) => entity.health > 0 && !entity.definitelyDead)\r\n\t\t\t.map((e) => e.entityId);\r\n\t\tlet target = getRandomMinionWithHighestHealth(\r\n\t\t\tinput.opponentBoardBefore.filter((e) => aliveEntities.includes(e.entityId)),\r\n\t\t);\r\n\t\t// const numberOfCannons = yamatoCannons.length;\r\n\t\tconst cannonDamage = Math.max(...yamatoCannons.map((e) => e.tagScriptDataNum1));\r\n\t\tfor (const yamatoCannon of yamatoCannons) {\r\n\t\t\t// const damage = yamatoCannon.tagScriptDataNum1;\r\n\t\t\t// Could this simply be tagScriptDataNum2 on the battlecruiser?\r\n\t\t\t// I don't understand how this relates to the number enchants in the cruiser itself\r\n\t\t\tconst loops = minion.tags?.[GameTag.BACON_YAMATO_CANNON] === 1 ? 2 : 1;\r\n\t\t\tfor (let i = 0; i < loops; i++) {\r\n\t\t\t\tif (!target) {\r\n\t\t\t\t\tcontinue;\r\n\t\t\t\t}\r\n\t\t\t\tif (target.health <= 0 || target.definitelyDead) {\r\n\t\t\t\t\ttarget = getRandomMinionWithHighestHealth(input.opponentBoard);\r\n\t\t\t\t}\r\n\t\t\t\tif (!!target) {\r\n\t\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\t\tminion,\r\n\t\t\t\t\t\ttarget,\r\n\t\t\t\t\t\tinput.opponentBoard,\r\n\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\tinput.opponentEntity,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tdealDamageToMinion(\r\n\t\t\t\t\t\ttarget,\r\n\t\t\t\t\t\tinput.opponentBoard,\r\n\t\t\t\t\t\tinput.opponentEntity,\r\n\t\t\t\t\t\tminion,\r\n\t\t\t\t\t\tcannonDamage,\r\n\t\t\t\t\t\tinput.playerBoard,\r\n\t\t\t\t\t\tinput.playerEntity,\r\n\t\t\t\t\t\tinput.gameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn true;\r\n\t},\r\n\trebornEffect: (minion: BoardEntity, input: RebornEffectInput) => {\r\n\t\tconst ultraCapacitors = [...(input.initialEntity.enchantments ?? [])]\r\n\t\t\t// .reverse()\r\n\t\t\t.filter((e) => e.cardId === CardIds.UltraCapacitor_UltraCapacitorEnchantment_BG31_HERO_801ptje);\r\n\t\tif (!ultraCapacitors?.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tminion.enchantments = input.initialEntity.enchantments;\r\n\t\tminion.attack = input.initialEntity.maxAttack;\r\n\t\tminion.maxAttack = input.initialEntity.maxAttack;\r\n\t\tminion.health = input.initialEntity.maxHealth;\r\n\t\tminion.maxHealth = input.initialEntity.maxHealth;\r\n\t\tminion.divineShield = input.initialEntity.hadDivineShield;\r\n\t\tminion.taunt = input.initialEntity.taunt;\r\n\t\tminion.windfury = input.initialEntity.windfury;\r\n\t\tminion.poisonous = input.initialEntity.poisonous;\r\n\t},\r\n\tonAnyMinionAttack: (\r\n\t\tminion: BoardEntity,\r\n\t\tinput: OnAttackInput,\r\n\t): {\r\n\t\tdmgDoneByAttacker: number;\r\n\t\tdmgDoneByDefender: number;\r\n\t} => {\r\n\t\tif (minion !== input.attacker) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst advancedBallistics = [...(minion.enchantments ?? [])]\r\n\t\t\t// .reverse()\r\n\t\t\t.filter((e) => e.cardId === CardIds.AdvancedBallistics_AdvancedBallisticsEnchantment_BG31_HERO_801ptde);\r\n\t\tif (!advancedBallistics?.length) {\r\n\t\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t\t}\r\n\r\n\t\tconst buff = advancedBallistics.map((e) => e.tagScriptDataNum1 ?? 0).reduce((a, b) => a + b, 0);\r\n\t\tconst targets = input.attackingBoard.filter((entity) => entity !== minion);\r\n\t\tfor (const target of targets) {\r\n\t\t\tmodifyStats(target, buff, 0, input.attackingBoard, input.attackingHero, input.gameState);\r\n\t\t}\r\n\t\treturn { dmgDoneByAttacker: 0, dmgDoneByDefender: 0 };\r\n\t},\r\n\tdeathrattleEffect: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst caduceusReactors = [...(minion.enchantments ?? [])]\r\n\t\t\t// .reverse()\r\n\t\t\t.filter((e) => e.cardId === CardIds.CaduceusReactor_CaduceusReactorEnchantment_BG31_HERO_801ptee);\r\n\t\tif (!caduceusReactors?.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst target = input.boardWithDeadEntity.filter((e) => e.health > 0 && !e.definitelyDead)[0];\r\n\t\tif (!target) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tconst buff = caduceusReactors.map((e) => e.tagScriptDataNum1 ?? 0).reduce((a, b) => a + b, 0);\r\n\t\tmodifyStats(target, buff, buff, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);\r\n\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\tminion,\r\n\t\t\ttarget,\r\n\t\t\tinput.boardWithDeadEntity,\r\n\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\tinput.otherBoardHero,\r\n\t\t);\r\n\t},\r\n};\r\n"]}
|
|
@@ -8,20 +8,52 @@ const utils_1 = require("../../../utils");
|
|
|
8
8
|
exports.CaptainBonerender = {
|
|
9
9
|
cardIds: ["BG31_840", "BG31_840_G"],
|
|
10
10
|
afterOtherSpawned: (minion, input) => {
|
|
11
|
-
|
|
11
|
+
var _a;
|
|
12
|
+
const isAlreadyHandled = exports.CaptainBonerender.cardIds.includes((_a = input.spawned.lastAffectedByEntity) === null || _a === void 0 ? void 0 : _a.cardId);
|
|
13
|
+
if (exports.CaptainBonerender.cardIds.includes(input.spawned.cardId) || isAlreadyHandled) {
|
|
12
14
|
return;
|
|
13
15
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
16
|
+
input.spawned.lastAffectedByEntity = minion;
|
|
17
|
+
let numberOfSpawns = 1;
|
|
18
|
+
for (let i = 0; i < input.board.length; i++) {
|
|
19
|
+
if (input.board[i].cardId !== "BG31_840" &&
|
|
20
|
+
input.board[i].cardId !== "BG31_840_G") {
|
|
21
|
+
continue;
|
|
18
22
|
}
|
|
19
|
-
const
|
|
23
|
+
const newSpawns = input.board[i].cardId === "BG31_840_G" ? 2 : 1;
|
|
24
|
+
const spawnsChain = buildSpawnsChain(newSpawns, input.board.slice(i + 1));
|
|
25
|
+
numberOfSpawns += spawnsChain;
|
|
26
|
+
}
|
|
27
|
+
const numberOfCopies = numberOfSpawns - 1;
|
|
28
|
+
const initialCopy = (0, utils_1.copyEntity)(input.spawned);
|
|
29
|
+
const indexFromRight = input.board.length - input.board.indexOf(input.spawned) - 1;
|
|
30
|
+
for (let i = 0; i < numberOfCopies; i++) {
|
|
31
|
+
const copy = (0, utils_1.copyEntity)(initialCopy);
|
|
20
32
|
(0, add_minion_to_board_1.removeAurasFromSelf)(copy, input.board, input.hero, input.gameState);
|
|
21
33
|
const newMinions = (0, deathrattle_spawns_1.spawnEntities)(copy.cardId, 1, input.board, input.hero, input.otherBoard, input.otherHero, input.gameState, input.hero.friendly, false, false, false, copy);
|
|
22
|
-
|
|
34
|
+
newMinions.forEach((spawn) => {
|
|
35
|
+
spawn.lastAffectedByEntity = minion;
|
|
36
|
+
});
|
|
23
37
|
const spawns = (0, spawns_1.performEntitySpawns)(newMinions, input.board, input.hero, minion, indexFromRight, input.otherBoard, input.otherHero, input.gameState);
|
|
38
|
+
spawns.forEach((spawn) => {
|
|
39
|
+
spawn.lastAffectedByEntity = minion;
|
|
40
|
+
});
|
|
24
41
|
}
|
|
25
42
|
},
|
|
26
43
|
};
|
|
44
|
+
const buildSpawnsChain = (numberOfSpawns, board) => {
|
|
45
|
+
let spawns = numberOfSpawns;
|
|
46
|
+
for (let k = 0; k < numberOfSpawns; k++) {
|
|
47
|
+
for (let i = 0; i < board.length; i++) {
|
|
48
|
+
if (board[i].cardId !== "BG31_840" &&
|
|
49
|
+
board[i].cardId !== "BG31_840_G") {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const newSpawns = board[i].cardId === "BG31_840_G" ? 2 : 1;
|
|
53
|
+
const spawnsChain = buildSpawnsChain(newSpawns, board.slice(i + 1));
|
|
54
|
+
spawns += spawnsChain;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return spawns;
|
|
58
|
+
};
|
|
27
59
|
//# sourceMappingURL=captain-bonerender.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captain-bonerender.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/captain-bonerender.ts"],"names":[],"mappings":";;;AAEA,iFAAiG;AACjG,+EAAuE;AACvE,uDAAiE;AACjE,0CAA4C;AAG/B,QAAA,iBAAiB,GAA0B;IACvD,OAAO,EAAE,0BAA0E;IACnF,iBAAiB,EAAE,CAAC,MAAmB,EAAE,KAAwB,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"captain-bonerender.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/captain-bonerender.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { OnOtherSpawnInput, removeAurasFromSelf } from '../../../simulation/add-minion-to-board';\r\nimport { spawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { performEntitySpawns } from '../../../simulation/spawns';\r\nimport { copyEntity } from '../../../utils';\r\nimport { AfterOtherSpawnedCard } from '../../card.interface';\r\n\r\nexport const CaptainBonerender: AfterOtherSpawnedCard = {\r\n\tcardIds: [CardIds.CaptainBonerender_BG31_840, CardIds.CaptainBonerender_BG31_840_G],\r\n\tafterOtherSpawned: (minion: BoardEntity, input: OnOtherSpawnInput) => {\r\n\t\t// Handle all copies in one go\r\n\t\tconst isAlreadyHandled = CaptainBonerender.cardIds.includes(\r\n\t\t\tinput.spawned.lastAffectedByEntity?.cardId as CardIds,\r\n\t\t);\r\n\t\tif (CaptainBonerender.cardIds.includes(input.spawned.cardId as CardIds) || isAlreadyHandled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tinput.spawned.lastAffectedByEntity = minion;\r\n\r\n\t\t// Seems weird, but looking at a real game this feels like this is how it works\r\n\t\t// https://replays.firestoneapp.com/?reviewId=b9eeb0a6-f5f1-424f-ba7a-7941d890f6bd&turn=21&action=1\r\n\t\tlet numberOfSpawns = 1;\r\n\t\tfor (let i = 0; i < input.board.length; i++) {\r\n\t\t\tif (\r\n\t\t\t\tinput.board[i].cardId !== CardIds.CaptainBonerender_BG31_840 &&\r\n\t\t\t\tinput.board[i].cardId !== CardIds.CaptainBonerender_BG31_840_G\r\n\t\t\t) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tconst newSpawns = input.board[i].cardId === CardIds.CaptainBonerender_BG31_840_G ? 2 : 1;\r\n\t\t\tconst spawnsChain = buildSpawnsChain(newSpawns, input.board.slice(i + 1));\r\n\t\t\tnumberOfSpawns += spawnsChain;\r\n\t\t}\r\n\t\tconst numberOfCopies = numberOfSpawns - 1;\r\n\t\t// const numberOfCopies = input.board\r\n\t\t// \t.map((e) =>\r\n\t\t// \t\te.cardId === CardIds.CaptainBonerender_BG31_840_G\r\n\t\t// \t\t\t? 2\r\n\t\t// \t\t\t: e.cardId === CardIds.CaptainBonerender_BG31_840\r\n\t\t// \t\t\t? 1\r\n\t\t// \t\t\t: 0,\r\n\t\t// \t)\r\n\t\t// \t.reduce((a, b) => a + b, 0);\r\n\t\t// Do it first, so that modifications like \"attack immediately\" are not reflected in subsequent copies\r\n\t\tconst initialCopy = copyEntity(input.spawned);\r\n\t\t// Technically not necessarily correct, but the main issue is with \"attack immediately\" tokens\r\n\t\t// like Tumbling Assassin, which spawns to the right\r\n\t\tconst indexFromRight = input.board.length - input.board.indexOf(input.spawned) - 1;\r\n\t\tfor (let i = 0; i < numberOfCopies; i++) {\r\n\t\t\t// if (input.board.length >= 7) {\r\n\t\t\t// \tbreak;\r\n\t\t\t// }\r\n\t\t\tconst copy = copyEntity(initialCopy);\r\n\t\t\tremoveAurasFromSelf(copy, input.board, input.hero, input.gameState);\r\n\t\t\tconst newMinions = spawnEntities(\r\n\t\t\t\tcopy.cardId,\r\n\t\t\t\t1,\r\n\t\t\t\tinput.board,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tinput.otherBoard,\r\n\t\t\t\tinput.otherHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t\tinput.hero.friendly,\r\n\t\t\t\tfalse,\r\n\t\t\t\tfalse,\r\n\t\t\t\tfalse,\r\n\t\t\t\tcopy,\r\n\t\t\t);\r\n\t\t\tnewMinions.forEach((spawn) => {\r\n\t\t\t\tspawn.lastAffectedByEntity = minion;\r\n\t\t\t});\r\n\t\t\tconst spawns = performEntitySpawns(\r\n\t\t\t\tnewMinions,\r\n\t\t\t\tinput.board,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tminion,\r\n\t\t\t\tindexFromRight,\r\n\t\t\t\tinput.otherBoard,\r\n\t\t\t\tinput.otherHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t\tspawns.forEach((spawn) => {\r\n\t\t\t\tspawn.lastAffectedByEntity = minion;\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n};\r\n\r\nconst buildSpawnsChain = (numberOfSpawns: number, board: readonly BoardEntity[]): number => {\r\n\tlet spawns = numberOfSpawns;\r\n\tfor (let k = 0; k < numberOfSpawns; k++) {\r\n\t\tfor (let i = 0; i < board.length; i++) {\r\n\t\t\tif (\r\n\t\t\t\tboard[i].cardId !== CardIds.CaptainBonerender_BG31_840 &&\r\n\t\t\t\tboard[i].cardId !== CardIds.CaptainBonerender_BG31_840_G\r\n\t\t\t) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tconst newSpawns = board[i].cardId === CardIds.CaptainBonerender_BG31_840_G ? 2 : 1;\r\n\t\t\tconst spawnsChain = buildSpawnsChain(newSpawns, board.slice(i + 1));\r\n\t\t\tspawns += spawnsChain;\r\n\t\t}\r\n\t}\r\n\treturn spawns;\r\n};\r\n"]}
|
|
@@ -6,7 +6,7 @@ exports.CorruptedMyrmidon = {
|
|
|
6
6
|
cardIds: ["BG23_012", "BG23_012_G"],
|
|
7
7
|
startOfCombat: (minion, input) => {
|
|
8
8
|
const multiplier = minion.cardId === "BG23_012_G" ? 2 : 1;
|
|
9
|
-
(0, stats_1.modifyStats)(minion, multiplier * minion.
|
|
9
|
+
(0, stats_1.modifyStats)(minion, multiplier * minion.maxAttack, multiplier * minion.maxHealth, input.playerBoard, input.playerEntity, input.gameState);
|
|
10
10
|
input.gameState.spectator.registerPowerTarget(minion, minion, input.playerBoard, input.playerEntity, input.opponentEntity);
|
|
11
11
|
return true;
|
|
12
12
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"corrupted-myrmidon.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/corrupted-myrmidon.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AAG3C,QAAA,iBAAiB,GAAsB;IACnD,OAAO,EAAE,0BAA0E;IACnF,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QAEvD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"corrupted-myrmidon.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/corrupted-myrmidon.ts"],"names":[],"mappings":";;;AAGA,qDAAwD;AAG3C,QAAA,iBAAiB,GAAsB;IACnD,OAAO,EAAE,0BAA0E;IACnF,aAAa,EAAE,CAAC,MAAmB,EAAE,KAAe,EAAE,EAAE;QAEvD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAKlF,IAAA,mBAAW,EACV,MAAM,EACN,UAAU,GAAG,MAAM,CAAC,SAAS,EAC7B,UAAU,GAAG,MAAM,CAAC,SAAS,EAC7B,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,SAAS,CACf,CAAC;QACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,MAAM,EACN,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,cAAc,CACpB,CAAC;QACF,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { SoCInput } from '../../../simulation/start-of-combat/start-of-combat-input';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { StartOfCombatCard } from '../../card.interface';\r\n\r\nexport const CorruptedMyrmidon: StartOfCombatCard = {\r\n\tcardIds: [CardIds.CorruptedMyrmidon_BG23_012, CardIds.CorruptedMyrmidon_BG23_012_G],\r\n\tstartOfCombat: (minion: BoardEntity, input: SoCInput) => {\r\n\t\t// We add these stats\r\n\t\tconst multiplier = minion.cardId === CardIds.CorruptedMyrmidon_BG23_012_G ? 2 : 1;\r\n\t\t// Tt remembers the \"max stats\" it had, and adds these, instead of the current ones.\r\n\t\t// // Or alternatively, that the stat gain is computed before other effects happen, then is applied\r\n\t\t// https://replays.firestoneapp.com/?reviewId=10a78c2e-d16d-4593-86c8-15eb4cc81a3e&turn=11&action=1\r\n\t\t// I'll go with the max stats for now, since it's easier to implement\r\n\t\tmodifyStats(\r\n\t\t\tminion,\r\n\t\t\tmultiplier * minion.maxAttack,\r\n\t\t\tmultiplier * minion.maxHealth,\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tinput.gameState,\r\n\t\t);\r\n\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\tminion,\r\n\t\t\tminion,\r\n\t\t\tinput.playerBoard,\r\n\t\t\tinput.playerEntity,\r\n\t\t\tinput.opponentEntity,\r\n\t\t);\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
|
|
@@ -7,21 +7,21 @@ exports.KarmicChameleon = {
|
|
|
7
7
|
cardIds: ["BG31_802", "BG31_802_G"],
|
|
8
8
|
baseAvengeValue: (cardId) => 5,
|
|
9
9
|
avenge: (minion, input) => {
|
|
10
|
+
const board = input.board.filter((e) => e.health > 0 && !e.definitelyDead);
|
|
10
11
|
const chameleonIndex = input.board.findIndex((entity) => entity.entityId === minion.entityId);
|
|
11
12
|
if (chameleonIndex > 0) {
|
|
12
|
-
const minionToTheLeft =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
13
|
+
const minionToTheLeft = board[chameleonIndex - 1];
|
|
14
|
+
if (!!minionToTheLeft) {
|
|
15
|
+
const clone = {
|
|
16
|
+
...(0, utils_1.copyEntity)(minionToTheLeft),
|
|
17
|
+
entityId: input.gameState.sharedState.currentEntityId++,
|
|
18
|
+
};
|
|
19
|
+
if (minion.cardId === "BG31_802_G") {
|
|
20
|
+
(0, golden_1.makeMinionGolden)(clone, minion, input.board, input.hero, input.otherBoard, input.otherHero, input.gameState);
|
|
21
|
+
}
|
|
22
|
+
input.board.splice(chameleonIndex, 1, clone);
|
|
23
|
+
input.gameState.spectator.registerPowerTarget(minion, minionToTheLeft, input.board, input.hero, input.otherHero);
|
|
22
24
|
}
|
|
23
|
-
input.gameState.spectator.registerPowerTarget(minion, minionToTheLeft, input.board, input.hero, input.otherHero);
|
|
24
|
-
input.board.splice(chameleonIndex, 1, clone);
|
|
25
25
|
}
|
|
26
26
|
},
|
|
27
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"karmic-chameleon.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/karmic-chameleon.ts"],"names":[],"mappings":";;;AAGA,6DAAoE;AACpE,
|
|
1
|
+
{"version":3,"file":"karmic-chameleon.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/karmic-chameleon.ts"],"names":[],"mappings":";;;AAGA,6DAAoE;AACpE,0CAAkF;AAGrE,QAAA,eAAe,GAAe;IAC1C,OAAO,EAAE,0BAAsE;IAC/E,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;QACnD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC3E,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9F,IAAI,cAAc,GAAG,CAAC,EAAE;YACvB,MAAM,eAAe,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,CAAC,eAAe,EAAE;gBACtB,MAAM,KAAK,GAAgB;oBAC1B,GAAG,IAAA,kBAAU,EAAC,eAAe,CAAC;oBAC9B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE;iBACvD,CAAC;gBACF,IAAI,MAAM,CAAC,MAAM,iBAAuC,EAAE;oBACzD,IAAA,yBAAgB,EACf,KAAK,EACL,MAAM,EACN,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,SAAS,CACf,CAAC;iBACF;gBACD,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;gBAC7C,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAC5C,MAAM,EACN,eAAe,EACf,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;aACF;SACD;IACF,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { makeMinionGolden } from '../../../simulation/utils/golden';\r\nimport { copyEntity, stringifySimple, stringifySimpleCard } from '../../../utils';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const KarmicChameleon: AvengeCard = {\r\n\tcardIds: [CardIds.KarmicChameleon_BG31_802, CardIds.KarmicChameleon_BG31_802_G],\r\n\tbaseAvengeValue: (cardId: string) => 5,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst board = input.board.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\t\tconst chameleonIndex = input.board.findIndex((entity) => entity.entityId === minion.entityId);\r\n\t\tif (chameleonIndex > 0) {\r\n\t\t\tconst minionToTheLeft = board[chameleonIndex - 1];\r\n\t\t\tif (!!minionToTheLeft) {\r\n\t\t\t\tconst clone: BoardEntity = {\r\n\t\t\t\t\t...copyEntity(minionToTheLeft),\r\n\t\t\t\t\tentityId: input.gameState.sharedState.currentEntityId++,\r\n\t\t\t\t};\r\n\t\t\t\tif (minion.cardId === CardIds.KarmicChameleon_BG31_802_G) {\r\n\t\t\t\t\tmakeMinionGolden(\r\n\t\t\t\t\t\tclone,\r\n\t\t\t\t\t\tminion,\r\n\t\t\t\t\t\tinput.board,\r\n\t\t\t\t\t\tinput.hero,\r\n\t\t\t\t\t\tinput.otherBoard,\r\n\t\t\t\t\t\tinput.otherHero,\r\n\t\t\t\t\t\tinput.gameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t\tinput.board.splice(chameleonIndex, 1, clone);\r\n\t\t\t\tinput.gameState.spectator.registerPowerTarget(\r\n\t\t\t\t\tminion,\r\n\t\t\t\t\tminionToTheLeft,\r\n\t\t\t\t\tinput.board,\r\n\t\t\t\t\tinput.hero,\r\n\t\t\t\t\tinput.otherHero,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TurquoiseSkitterer = void 0;
|
|
4
4
|
const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
|
|
5
5
|
const stats_1 = require("../../../simulation/stats");
|
|
6
|
+
const atkBuff = 1;
|
|
7
|
+
const hpBuff = 1;
|
|
6
8
|
exports.TurquoiseSkitterer = {
|
|
7
9
|
cardIds: ["BG31_809", "BG31_809_G"],
|
|
8
10
|
deathrattleSpawn: (deadEntity, input) => {
|
|
@@ -12,13 +14,13 @@ exports.TurquoiseSkitterer = {
|
|
|
12
14
|
deathrattleEffect: (minion, input) => {
|
|
13
15
|
const mult = minion.cardId === "BG31_809_G" ? 2 : 1;
|
|
14
16
|
input.boardWithDeadEntityHero.globalInfo.BeetleAttackBuff =
|
|
15
|
-
input.boardWithDeadEntityHero.globalInfo.BeetleAttackBuff +
|
|
17
|
+
input.boardWithDeadEntityHero.globalInfo.BeetleAttackBuff + atkBuff * mult;
|
|
16
18
|
input.boardWithDeadEntityHero.globalInfo.BeetleHealthBuff =
|
|
17
|
-
input.boardWithDeadEntityHero.globalInfo.BeetleHealthBuff +
|
|
19
|
+
input.boardWithDeadEntityHero.globalInfo.BeetleHealthBuff + hpBuff * mult;
|
|
18
20
|
input.boardWithDeadEntity
|
|
19
21
|
.filter((e) => ["BG28_603t", "BG28_603t_G"].includes(e.cardId))
|
|
20
22
|
.forEach((e) => {
|
|
21
|
-
(0, stats_1.modifyStats)(e,
|
|
23
|
+
(0, stats_1.modifyStats)(e, atkBuff * mult, hpBuff * mult, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);
|
|
22
24
|
});
|
|
23
25
|
},
|
|
24
26
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turquoise-skitterer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/turquoise-skitterer.ts"],"names":[],"mappings":";;;AAGA,+EAAiF;AACjF,qDAAwD;
|
|
1
|
+
{"version":3,"file":"turquoise-skitterer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/turquoise-skitterer.ts"],"names":[],"mappings":";;;AAGA,+EAAiF;AACjF,qDAAwD;AAGxD,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,MAAM,GAAG,CAAC,CAAC;AAEJ,QAAA,kBAAkB,GAAiD;IAC/E,OAAO,EAAE,0BAA4E;IACrF,gBAAgB,EAAE,CAAC,UAAuB,EAAE,KAAgC,EAA0B,EAAE;QACvG,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,iBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3F,OAAO,IAAA,4CAAuB,eAA8C,cAAc,EAAE,KAAK,CAAC,CAAC;IACpG,CAAC;IACD,iBAAiB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC5E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB;YACxD,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB,GAAG,OAAO,GAAG,IAAI,CAAC;QAC5E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB;YACxD,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAAC;QAC3E,KAAK,CAAC,mBAAmB;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,4BAAyE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,CACvG;aACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,IAAA,mBAAW,EACV,CAAC,EACD,OAAO,GAAG,IAAI,EACd,MAAM,GAAG,IAAI,EACb,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,SAAS,CACf,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACD,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { simplifiedSpawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { DeathrattleEffectCard, DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nconst atkBuff = 1;\r\nconst hpBuff = 1;\r\n\r\nexport const TurquoiseSkitterer: DeathrattleSpawnCard & DeathrattleEffectCard = {\r\n\tcardIds: [CardIds.TurquoiseSkitterer_BG31_809, CardIds.TurquoiseSkitterer_BG31_809_G],\r\n\tdeathrattleSpawn: (deadEntity: BoardEntity, input: DeathrattleTriggeredInput): readonly BoardEntity[] => {\r\n\t\tconst numberOfSpawns = deadEntity.cardId === CardIds.TurquoiseSkitterer_BG31_809_G ? 2 : 1;\r\n\t\treturn simplifiedSpawnEntities(CardIds.BoonOfBeetles_BeetleToken_BG28_603t, numberOfSpawns, input);\r\n\t},\r\n\tdeathrattleEffect: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TurquoiseSkitterer_BG31_809_G ? 2 : 1;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.BeetleAttackBuff =\r\n\t\t\tinput.boardWithDeadEntityHero.globalInfo.BeetleAttackBuff + atkBuff * mult;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.BeetleHealthBuff =\r\n\t\t\tinput.boardWithDeadEntityHero.globalInfo.BeetleHealthBuff + hpBuff * mult;\r\n\t\tinput.boardWithDeadEntity\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[CardIds.BoonOfBeetles_BeetleToken_BG28_603t, CardIds.Beetle_BG28_603t_G].includes(e.cardId as CardIds),\r\n\t\t\t)\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\tatkBuff * mult,\r\n\t\t\t\t\thpBuff * mult,\r\n\t\t\t\t\tinput.boardWithDeadEntity,\r\n\t\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t},\r\n};\r\n"]}
|
|
@@ -561,7 +561,8 @@ const onMinionSummoned = (hero, board, gameState) => {
|
|
|
561
561
|
exports.onMinionSummoned = onMinionSummoned;
|
|
562
562
|
const handleAfterSpawnEffect = (board, hero, otherBoard, otherHero, spawned, gameState) => {
|
|
563
563
|
var _a;
|
|
564
|
-
|
|
564
|
+
const initialBoard = [...board];
|
|
565
|
+
for (const entity of initialBoard) {
|
|
565
566
|
const onAfterSpawnedImpl = _card_mappings_1.cardMappings[entity.cardId];
|
|
566
567
|
if ((0, card_interface_1.hasAfterOtherSpawned)(onAfterSpawnedImpl)) {
|
|
567
568
|
onAfterSpawnedImpl.afterOtherSpawned(entity, {
|