@firestone-hs/simulate-bgs-battle 1.1.487 → 1.1.489
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/bgs-player-entity.d.ts +2 -1
- package/dist/bgs-player-entity.js.map +1 -1
- package/dist/cards/card.interface.d.ts +12 -0
- package/dist/cards/card.interface.js +3 -0
- package/dist/cards/card.interface.js.map +1 -0
- package/dist/cards/cards-data.js +6 -0
- package/dist/cards/cards-data.js.map +1 -1
- package/dist/cards/impl/anomaly/anomalous-twin.d.ts +8 -0
- package/dist/cards/impl/anomaly/anomalous-twin.js +24 -0
- package/dist/cards/impl/anomaly/anomalous-twin.js.map +1 -0
- package/dist/cards/impl/anomaly/blessed-or-blighted.d.ts +5 -0
- package/dist/cards/impl/anomaly/blessed-or-blighted.js +16 -0
- package/dist/cards/impl/anomaly/blessed-or-blighted.js.map +1 -0
- package/dist/cards/impl/hero-power/aim-high.d.ts +5 -0
- package/dist/cards/impl/hero-power/aim-high.js +18 -0
- package/dist/cards/impl/hero-power/aim-high.js.map +1 -0
- package/dist/cards/impl/hero-power/aim-left.d.ts +5 -0
- package/dist/cards/impl/hero-power/aim-left.js +16 -0
- package/dist/cards/impl/hero-power/aim-left.js.map +1 -0
- package/dist/cards/impl/hero-power/aim-low.d.ts +5 -0
- package/dist/cards/impl/hero-power/aim-low.js +18 -0
- package/dist/cards/impl/hero-power/aim-low.js.map +1 -0
- package/dist/cards/impl/hero-power/aim-right.d.ts +5 -0
- package/dist/cards/impl/hero-power/aim-right.js +16 -0
- package/dist/cards/impl/hero-power/aim-right.js.map +1 -0
- package/dist/cards/impl/hero-power/all-will-burn.d.ts +5 -0
- package/dist/cards/impl/hero-power/all-will-burn.js +18 -0
- package/dist/cards/impl/hero-power/all-will-burn.js.map +1 -0
- package/dist/cards/impl/hero-power/earth-invocation.d.ts +5 -0
- package/dist/cards/impl/hero-power/earth-invocation.js +13 -0
- package/dist/cards/impl/hero-power/earth-invocation.js.map +1 -0
- package/dist/cards/impl/hero-power/embrace-your-rage.d.ts +8 -0
- package/dist/cards/impl/hero-power/embrace-your-rage.js +26 -0
- package/dist/cards/impl/hero-power/embrace-your-rage.js.map +1 -0
- package/dist/cards/impl/hero-power/fire-invocation.d.ts +5 -0
- package/dist/cards/impl/hero-power/fire-invocation.js +13 -0
- package/dist/cards/impl/hero-power/fire-invocation.js.map +1 -0
- package/dist/cards/impl/hero-power/fragrant-phylactery.d.ts +8 -0
- package/dist/cards/impl/hero-power/fragrant-phylactery.js +25 -0
- package/dist/cards/impl/hero-power/fragrant-phylactery.js.map +1 -0
- package/dist/cards/impl/hero-power/glorious-gloop.d.ts +5 -0
- package/dist/cards/impl/hero-power/glorious-gloop.js +40 -0
- package/dist/cards/impl/hero-power/glorious-gloop.js.map +1 -0
- package/dist/cards/impl/hero-power/lightning-invocation.d.ts +5 -0
- package/dist/cards/impl/hero-power/lightning-invocation.js +13 -0
- package/dist/cards/impl/hero-power/lightning-invocation.js.map +1 -0
- package/dist/cards/impl/hero-power/rapid-reanimation.d.ts +8 -0
- package/dist/cards/impl/hero-power/rapid-reanimation.js +29 -0
- package/dist/cards/impl/hero-power/rapid-reanimation.js.map +1 -0
- package/dist/cards/impl/hero-power/reborn-rites.d.ts +5 -0
- package/dist/cards/impl/hero-power/reborn-rites.js +18 -0
- package/dist/cards/impl/hero-power/reborn-rites.js.map +1 -0
- package/dist/cards/impl/hero-power/swatting-insects.d.ts +5 -0
- package/dist/cards/impl/hero-power/swatting-insects.js +21 -0
- package/dist/cards/impl/hero-power/swatting-insects.js.map +1 -0
- package/dist/cards/impl/hero-power/tentacular.d.ts +8 -0
- package/dist/cards/impl/hero-power/tentacular.js +10 -0
- package/dist/cards/impl/hero-power/tentacular.js.map +1 -0
- package/dist/cards/impl/hero-power/water-invocation.d.ts +5 -0
- package/dist/cards/impl/hero-power/water-invocation.js +13 -0
- package/dist/cards/impl/hero-power/water-invocation.js.map +1 -0
- package/dist/cards/impl/hero-power/wax-warband.d.ts +5 -0
- package/dist/cards/impl/hero-power/wax-warband.js +56 -0
- package/dist/cards/impl/hero-power/wax-warband.js.map +1 -0
- package/dist/cards/impl/minion/amber-guardian.d.ts +5 -0
- package/dist/cards/impl/minion/amber-guardian.js +31 -0
- package/dist/cards/impl/minion/amber-guardian.js.map +1 -0
- package/dist/cards/impl/minion/audacious-anchor.d.ts +5 -0
- package/dist/cards/impl/minion/audacious-anchor.js +25 -0
- package/dist/cards/impl/minion/audacious-anchor.js.map +1 -0
- package/dist/cards/impl/minion/carbonic-copy.d.ts +5 -0
- package/dist/cards/impl/minion/carbonic-copy.js +24 -0
- package/dist/cards/impl/minion/carbonic-copy.js.map +1 -0
- package/dist/cards/impl/minion/choral-mrrrglr.d.ts +5 -0
- package/dist/cards/impl/minion/choral-mrrrglr.js +14 -0
- package/dist/cards/impl/minion/choral-mrrrglr.js.map +1 -0
- package/dist/cards/impl/minion/corrupted-myrmidon.d.ts +5 -0
- package/dist/cards/impl/minion/corrupted-myrmidon.js +13 -0
- package/dist/cards/impl/minion/corrupted-myrmidon.js.map +1 -0
- package/dist/cards/impl/minion/crabby.d.ts +5 -0
- package/dist/cards/impl/minion/crabby.js +18 -0
- package/dist/cards/impl/minion/crabby.js.map +1 -0
- package/dist/cards/impl/minion/diremuck-forager.d.ts +5 -0
- package/dist/cards/impl/minion/diremuck-forager.js +32 -0
- package/dist/cards/impl/minion/diremuck-forager.js.map +1 -0
- package/dist/cards/impl/minion/elder-taggawag.d.ts +5 -0
- package/dist/cards/impl/minion/elder-taggawag.js +19 -0
- package/dist/cards/impl/minion/elder-taggawag.js.map +1 -0
- package/dist/cards/impl/minion/hawkstrider-herald.d.ts +5 -0
- package/dist/cards/impl/minion/hawkstrider-herald.js +27 -0
- package/dist/cards/impl/minion/hawkstrider-herald.js.map +1 -0
- package/dist/cards/impl/minion/hoarding-hatespawn.d.ts +5 -0
- package/dist/cards/impl/minion/hoarding-hatespawn.js +22 -0
- package/dist/cards/impl/minion/hoarding-hatespawn.js.map +1 -0
- package/dist/cards/impl/minion/humming-bird.d.ts +5 -0
- package/dist/cards/impl/minion/humming-bird.js +15 -0
- package/dist/cards/impl/minion/humming-bird.js.map +1 -0
- package/dist/cards/impl/minion/interrogator-whitemane.d.ts +5 -0
- package/dist/cards/impl/minion/interrogator-whitemane.js +33 -0
- package/dist/cards/impl/minion/interrogator-whitemane.js.map +1 -0
- package/dist/cards/impl/minion/irate-rooster.d.ts +5 -0
- package/dist/cards/impl/minion/irate-rooster.js +20 -0
- package/dist/cards/impl/minion/irate-rooster.js.map +1 -0
- package/dist/cards/impl/minion/mantid-queen.d.ts +5 -0
- package/dist/cards/impl/minion/mantid-queen.js +52 -0
- package/dist/cards/impl/minion/mantid-queen.js.map +1 -0
- package/dist/cards/impl/minion/misfit-dragonling.d.ts +5 -0
- package/dist/cards/impl/minion/misfit-dragonling.js +15 -0
- package/dist/cards/impl/minion/misfit-dragonling.js.map +1 -0
- package/dist/cards/impl/minion/piloted-whirl-o-tron.d.ts +5 -0
- package/dist/cards/impl/minion/piloted-whirl-o-tron.js +13 -0
- package/dist/cards/impl/minion/piloted-whirl-o-tron.js.map +1 -0
- package/dist/cards/impl/minion/prized-promo-drake.d.ts +5 -0
- package/dist/cards/impl/minion/prized-promo-drake.js +22 -0
- package/dist/cards/impl/minion/prized-promo-drake.js.map +1 -0
- package/dist/cards/impl/minion/red-whelp.d.ts +5 -0
- package/dist/cards/impl/minion/red-whelp.js +17 -0
- package/dist/cards/impl/minion/red-whelp.js.map +1 -0
- package/dist/cards/impl/minion/sanctum-rester.d.ts +5 -0
- package/dist/cards/impl/minion/sanctum-rester.js +20 -0
- package/dist/cards/impl/minion/sanctum-rester.js.map +1 -0
- package/dist/cards/impl/minion/sandy.d.ts +5 -0
- package/dist/cards/impl/minion/sandy.js +23 -0
- package/dist/cards/impl/minion/sandy.js.map +1 -0
- package/dist/cards/impl/minion/sky-pirate-flagbearer.d.ts +5 -0
- package/dist/cards/impl/minion/sky-pirate-flagbearer.js +24 -0
- package/dist/cards/impl/minion/sky-pirate-flagbearer.js.map +1 -0
- package/dist/cards/impl/minion/soulsplitter.d.ts +5 -0
- package/dist/cards/impl/minion/soulsplitter.js +23 -0
- package/dist/cards/impl/minion/soulsplitter.js.map +1 -0
- package/dist/cards/impl/minion/sun-screener.d.ts +5 -0
- package/dist/cards/impl/minion/sun-screener.js +15 -0
- package/dist/cards/impl/minion/sun-screener.js.map +1 -0
- package/dist/cards/impl/minion/the-uninvited-guest.d.ts +5 -0
- package/dist/cards/impl/minion/the-uninvited-guest.js +24 -0
- package/dist/cards/impl/minion/the-uninvited-guest.js.map +1 -0
- package/dist/cards/impl/minion/thousandth-paper-drake.d.ts +5 -0
- package/dist/cards/impl/minion/thousandth-paper-drake.js +24 -0
- package/dist/cards/impl/minion/thousandth-paper-drake.js.map +1 -0
- package/dist/cards/impl/minion/vaelastrasz.d.ts +5 -0
- package/dist/cards/impl/minion/vaelastrasz.js +17 -0
- package/dist/cards/impl/minion/vaelastrasz.js.map +1 -0
- package/dist/cards/impl/minion/yulon-fortune-granter.d.ts +5 -0
- package/dist/cards/impl/minion/yulon-fortune-granter.js +26 -0
- package/dist/cards/impl/minion/yulon-fortune-granter.js.map +1 -0
- package/dist/cards/impl/quest-reward/evil-twin.d.ts +5 -0
- package/dist/cards/impl/quest-reward/evil-twin.js +32 -0
- package/dist/cards/impl/quest-reward/evil-twin.js.map +1 -0
- package/dist/cards/impl/quest-reward/staff-of-origination.d.ts +5 -0
- package/dist/cards/impl/quest-reward/staff-of-origination.js +14 -0
- package/dist/cards/impl/quest-reward/staff-of-origination.js.map +1 -0
- package/dist/cards/impl/quest-reward/stolen-gold.d.ts +5 -0
- package/dist/cards/impl/quest-reward/stolen-gold.js +16 -0
- package/dist/cards/impl/quest-reward/stolen-gold.js.map +1 -0
- package/dist/cards/impl/trinket/artisanal-urn.d.ts +5 -0
- package/dist/cards/impl/trinket/artisanal-urn.js +13 -0
- package/dist/cards/impl/trinket/artisanal-urn.js.map +1 -0
- package/dist/cards/impl/trinket/automaton-portrait.d.ts +5 -0
- package/dist/cards/impl/trinket/automaton-portrait.js +15 -0
- package/dist/cards/impl/trinket/automaton-portrait.js.map +1 -0
- package/dist/cards/impl/trinket/bronze-timepiece.d.ts +5 -0
- package/dist/cards/impl/trinket/bronze-timepiece.js +17 -0
- package/dist/cards/impl/trinket/bronze-timepiece.js.map +1 -0
- package/dist/cards/impl/trinket/emerald-dreamcatcher.d.ts +5 -0
- package/dist/cards/impl/trinket/emerald-dreamcatcher.js +18 -0
- package/dist/cards/impl/trinket/emerald-dreamcatcher.js.map +1 -0
- package/dist/cards/impl/trinket/eternal-portrait.d.ts +5 -0
- package/dist/cards/impl/trinket/eternal-portrait.js +19 -0
- package/dist/cards/impl/trinket/eternal-portrait.js.map +1 -0
- package/dist/cards/impl/trinket/fishy-sticker.d.ts +5 -0
- package/dist/cards/impl/trinket/fishy-sticker.js +28 -0
- package/dist/cards/impl/trinket/fishy-sticker.js.map +1 -0
- package/dist/cards/impl/trinket/hoggy-bank.d.ts +5 -0
- package/dist/cards/impl/trinket/hoggy-bank.js +23 -0
- package/dist/cards/impl/trinket/hoggy-bank.js.map +1 -0
- package/dist/cards/impl/trinket/holly-mallet.d.ts +5 -0
- package/dist/cards/impl/trinket/holly-mallet.js +18 -0
- package/dist/cards/impl/trinket/holly-mallet.js.map +1 -0
- package/dist/cards/impl/trinket/ironforge-anvil.d.ts +5 -0
- package/dist/cards/impl/trinket/ironforge-anvil.js +23 -0
- package/dist/cards/impl/trinket/ironforge-anvil.js.map +1 -0
- package/dist/cards/impl/trinket/jarred-frostling.d.ts +5 -0
- package/dist/cards/impl/trinket/jarred-frostling.js +27 -0
- package/dist/cards/impl/trinket/jarred-frostling.js.map +1 -0
- package/dist/cards/impl/trinket/karazhan-chess-set.d.ts +5 -0
- package/dist/cards/impl/trinket/karazhan-chess-set.js +40 -0
- package/dist/cards/impl/trinket/karazhan-chess-set.js.map +1 -0
- package/dist/cards/impl/trinket/rivendare-portrait.d.ts +5 -0
- package/dist/cards/impl/trinket/rivendare-portrait.js +21 -0
- package/dist/cards/impl/trinket/rivendare-portrait.js.map +1 -0
- package/dist/cards/impl/trinket/rusty-trident.d.ts +2 -0
- package/dist/cards/impl/trinket/rusty-trident.js +23 -0
- package/dist/cards/impl/trinket/rusty-trident.js.map +1 -0
- package/dist/cards/impl/trinket/ship-in-a-bottle.d.ts +5 -0
- package/dist/cards/impl/trinket/ship-in-a-bottle.js +20 -0
- package/dist/cards/impl/trinket/ship-in-a-bottle.js.map +1 -0
- package/dist/cards/impl/trinket/summoning-sphere.d.ts +5 -0
- package/dist/cards/impl/trinket/summoning-sphere.js +31 -0
- package/dist/cards/impl/trinket/summoning-sphere.js.map +1 -0
- package/dist/cards/impl/trinket/tinyfin-onesie.d.ts +5 -0
- package/dist/cards/impl/trinket/tinyfin-onesie.js +15 -0
- package/dist/cards/impl/trinket/tinyfin-onesie.js.map +1 -0
- package/dist/cards/impl/trinket/training-certificate.d.ts +5 -0
- package/dist/cards/impl/trinket/training-certificate.js +21 -0
- package/dist/cards/impl/trinket/training-certificate.js.map +1 -0
- package/dist/cards/impl/trinket/valorous-medaillion.d.ts +5 -0
- package/dist/cards/impl/trinket/valorous-medaillion.js +12 -0
- package/dist/cards/impl/trinket/valorous-medaillion.js.map +1 -0
- package/dist/simulation/add-minion-to-board.js +18 -23
- package/dist/simulation/add-minion-to-board.js.map +1 -1
- package/dist/simulation/auras.js +0 -2
- package/dist/simulation/auras.js.map +1 -1
- package/dist/simulation/avenge.js +24 -4
- package/dist/simulation/avenge.js.map +1 -1
- package/dist/simulation/battlecries.js +9 -0
- package/dist/simulation/battlecries.js.map +1 -1
- package/dist/simulation/blood-gems.js +8 -0
- package/dist/simulation/blood-gems.js.map +1 -1
- package/dist/simulation/deathrattle-effects.js +7 -1
- package/dist/simulation/deathrattle-effects.js.map +1 -1
- package/dist/simulation/deathrattle-on-trigger.js +5 -0
- package/dist/simulation/deathrattle-on-trigger.js.map +1 -1
- package/dist/simulation/discover.js +6 -0
- package/dist/simulation/discover.js.map +1 -1
- package/dist/simulation/magnetize.js +2 -1
- package/dist/simulation/magnetize.js.map +1 -1
- package/dist/simulation/remove-minion-from-board.js +0 -10
- package/dist/simulation/remove-minion-from-board.js.map +1 -1
- package/dist/simulation/simulator.js +1 -1
- package/dist/simulation/simulator.js.map +1 -1
- package/dist/simulation/start-of-combat/phases.d.ts +1 -0
- package/dist/simulation/start-of-combat/phases.js +3 -0
- package/dist/simulation/start-of-combat/phases.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-action-processor.d.ts +4 -0
- package/dist/simulation/start-of-combat/soc-action-processor.js +286 -0
- package/dist/simulation/start-of-combat/soc-action-processor.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-anomalies.d.ts +4 -0
- package/dist/simulation/start-of-combat/soc-anomalies.js +39 -0
- package/dist/simulation/start-of-combat/soc-anomalies.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-hero-power.d.ts +5 -0
- package/dist/simulation/start-of-combat/soc-hero-power.js +77 -0
- package/dist/simulation/start-of-combat/soc-hero-power.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-illidan-hero-power.d.ts +4 -0
- package/dist/simulation/start-of-combat/soc-illidan-hero-power.js +55 -0
- package/dist/simulation/start-of-combat/soc-illidan-hero-power.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-minion.d.ts +6 -0
- package/dist/simulation/start-of-combat/soc-minion.js +68 -0
- package/dist/simulation/start-of-combat/soc-minion.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-pre-combat-hero-power.d.ts +4 -0
- package/dist/simulation/start-of-combat/soc-pre-combat-hero-power.js +72 -0
- package/dist/simulation/start-of-combat/soc-pre-combat-hero-power.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-quest-reward.d.ts +4 -0
- package/dist/simulation/start-of-combat/soc-quest-reward.js +60 -0
- package/dist/simulation/start-of-combat/soc-quest-reward.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-secret.d.ts +4 -0
- package/dist/simulation/start-of-combat/soc-secret.js +54 -0
- package/dist/simulation/start-of-combat/soc-secret.js.map +1 -0
- package/dist/simulation/start-of-combat/soc-trinket.d.ts +4 -0
- package/dist/simulation/start-of-combat/soc-trinket.js +60 -0
- package/dist/simulation/start-of-combat/soc-trinket.js.map +1 -0
- package/dist/simulation/start-of-combat/start-of-combat-input.d.ts +14 -0
- package/dist/simulation/start-of-combat/start-of-combat-input.js +3 -0
- package/dist/simulation/start-of-combat/start-of-combat-input.js.map +1 -0
- package/dist/simulation/start-of-combat/start-of-combat.d.ts +4 -0
- package/dist/simulation/start-of-combat/start-of-combat.js +68 -0
- package/dist/simulation/start-of-combat/start-of-combat.js.map +1 -0
- package/dist/temp-card-ids.d.ts +2 -0
- package/dist/temp-card-ids.js +3 -0
- package/dist/temp-card-ids.js.map +1 -0
- package/package.json +3 -3
- package/dist/simulation/start-of-combat.d.ts +0 -8
- package/dist/simulation/start-of-combat.js +0 -1187
- package/dist/simulation/start-of-combat.js.map +0 -1
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleStartOfCombatAnomalies = void 0;
|
|
4
|
+
const summon_when_space_1 = require("../summon-when-space");
|
|
5
|
+
const soc_action_processor_1 = require("./soc-action-processor");
|
|
6
|
+
const handleStartOfCombatAnomalies = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
|
|
7
|
+
currentAttacker = handleStartOfCombatAnomaliesForPlayer({
|
|
8
|
+
playerEntity: playerEntity,
|
|
9
|
+
playerBoard: playerBoard,
|
|
10
|
+
opponentEntity: opponentEntity,
|
|
11
|
+
opponentBoard: opponentBoard,
|
|
12
|
+
currentAttacker,
|
|
13
|
+
gameState,
|
|
14
|
+
playerIsFriendly: true,
|
|
15
|
+
});
|
|
16
|
+
currentAttacker = handleStartOfCombatAnomaliesForPlayer({
|
|
17
|
+
playerEntity: opponentEntity,
|
|
18
|
+
playerBoard: opponentBoard,
|
|
19
|
+
opponentEntity: playerEntity,
|
|
20
|
+
opponentBoard: playerBoard,
|
|
21
|
+
currentAttacker,
|
|
22
|
+
gameState,
|
|
23
|
+
playerIsFriendly: false,
|
|
24
|
+
});
|
|
25
|
+
(0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
26
|
+
return currentAttacker;
|
|
27
|
+
};
|
|
28
|
+
exports.handleStartOfCombatAnomalies = handleStartOfCombatAnomalies;
|
|
29
|
+
const handleStartOfCombatAnomaliesForPlayer = (input) => {
|
|
30
|
+
var _a;
|
|
31
|
+
if (!((_a = input.gameState.anomalies) === null || _a === void 0 ? void 0 : _a.length) || input.playerEntity.startOfCombatDone) {
|
|
32
|
+
return input.currentAttacker;
|
|
33
|
+
}
|
|
34
|
+
for (const anomaly of input.gameState.anomalies) {
|
|
35
|
+
(0, soc_action_processor_1.performStartOfCombatAction)(anomaly, input.playerEntity, input);
|
|
36
|
+
}
|
|
37
|
+
return input.currentAttacker;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=soc-anomalies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-anomalies.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-anomalies.ts"],"names":[],"mappings":";;;AAGA,4DAA8D;AAC9D,iEAAoE;AAG7D,MAAM,4BAA4B,GAAG,CAC3C,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IACX,eAAe,GAAG,qCAAqC,CAAC;QACvD,YAAY,EAAE,YAAY;QAC1B,WAAW,EAAE,WAAW;QACxB,cAAc,EAAE,cAAc;QAC9B,aAAa,EAAE,aAAa;QAC5B,eAAe;QACf,SAAS;QACT,gBAAgB,EAAE,IAAI;KACtB,CAAC,CAAC;IACH,eAAe,GAAG,qCAAqC,CAAC;QACvD,YAAY,EAAE,cAAc;QAC5B,WAAW,EAAE,aAAa;QAC1B,cAAc,EAAE,YAAY;QAC5B,aAAa,EAAE,WAAW;QAC1B,eAAe;QACf,SAAS;QACT,gBAAgB,EAAE,KAAK;KACvB,CAAC,CAAC;IACH,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AA5BW,QAAA,4BAA4B,gCA4BvC;AAEF,MAAM,qCAAqC,GAAG,CAAC,KAAe,EAAU,EAAE;;IACzE,IAAI,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,CAAC,SAAS,0CAAE,MAAM,CAAA,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE;QAC/E,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,SAAS,CAAC,SAAS,EAAE;QAChD,IAAA,iDAA0B,EAAC,OAAO,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;KAC/D;IAED,OAAO,KAAK,CAAC,eAAe,CAAC;AAC9B,CAAC,CAAC","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handleStartOfCombatAnomalies = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tcurrentAttacker = handleStartOfCombatAnomaliesForPlayer({\r\n\t\tplayerEntity: playerEntity,\r\n\t\tplayerBoard: playerBoard,\r\n\t\topponentEntity: opponentEntity,\r\n\t\topponentBoard: opponentBoard,\r\n\t\tcurrentAttacker,\r\n\t\tgameState,\r\n\t\tplayerIsFriendly: true,\r\n\t});\r\n\tcurrentAttacker = handleStartOfCombatAnomaliesForPlayer({\r\n\t\tplayerEntity: opponentEntity,\r\n\t\tplayerBoard: opponentBoard,\r\n\t\topponentEntity: playerEntity,\r\n\t\topponentBoard: playerBoard,\r\n\t\tcurrentAttacker,\r\n\t\tgameState,\r\n\t\tplayerIsFriendly: false,\r\n\t});\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handleStartOfCombatAnomaliesForPlayer = (input: SoCInput): number => {\r\n\tif (!input.gameState.anomalies?.length || input.playerEntity.startOfCombatDone) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tfor (const anomaly of input.gameState.anomalies) {\r\n\t\tperformStartOfCombatAction(anomaly, input.playerEntity, input);\r\n\t}\r\n\r\n\treturn input.currentAttacker;\r\n};\r\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { FullGameState } from '../internal-game-state';
|
|
4
|
+
export declare const handleStartOfCombatHeroPowers: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
|
|
5
|
+
export declare const getHeroPowerForHero: (heroCardId: string) => string;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getHeroPowerForHero = exports.handleStartOfCombatHeroPowers = void 0;
|
|
4
|
+
const attack_1 = require("../attack");
|
|
5
|
+
const summon_when_space_1 = require("../summon-when-space");
|
|
6
|
+
const soc_action_processor_1 = require("./soc-action-processor");
|
|
7
|
+
const handleStartOfCombatHeroPowers = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
|
|
8
|
+
if (Math.random() < 0.5) {
|
|
9
|
+
currentAttacker = handlePlayerStartOfCombatHeroPowers({
|
|
10
|
+
playerEntity: playerEntity,
|
|
11
|
+
playerBoard: playerBoard,
|
|
12
|
+
opponentEntity: opponentEntity,
|
|
13
|
+
opponentBoard: opponentBoard,
|
|
14
|
+
currentAttacker,
|
|
15
|
+
playerIsFriendly: true,
|
|
16
|
+
gameState,
|
|
17
|
+
});
|
|
18
|
+
currentAttacker = handlePlayerStartOfCombatHeroPowers({
|
|
19
|
+
playerEntity: opponentEntity,
|
|
20
|
+
playerBoard: opponentBoard,
|
|
21
|
+
opponentEntity: playerEntity,
|
|
22
|
+
opponentBoard: playerBoard,
|
|
23
|
+
currentAttacker,
|
|
24
|
+
playerIsFriendly: false,
|
|
25
|
+
gameState,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
currentAttacker = handlePlayerStartOfCombatHeroPowers({
|
|
30
|
+
playerEntity: opponentEntity,
|
|
31
|
+
playerBoard: opponentBoard,
|
|
32
|
+
opponentEntity: playerEntity,
|
|
33
|
+
opponentBoard: playerBoard,
|
|
34
|
+
currentAttacker,
|
|
35
|
+
playerIsFriendly: false,
|
|
36
|
+
gameState,
|
|
37
|
+
});
|
|
38
|
+
currentAttacker = handlePlayerStartOfCombatHeroPowers({
|
|
39
|
+
playerEntity: playerEntity,
|
|
40
|
+
playerBoard: playerBoard,
|
|
41
|
+
opponentEntity: opponentEntity,
|
|
42
|
+
opponentBoard: opponentBoard,
|
|
43
|
+
currentAttacker,
|
|
44
|
+
playerIsFriendly: true,
|
|
45
|
+
gameState,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
(0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
49
|
+
return currentAttacker;
|
|
50
|
+
};
|
|
51
|
+
exports.handleStartOfCombatHeroPowers = handleStartOfCombatHeroPowers;
|
|
52
|
+
const handlePlayerStartOfCombatHeroPowers = (input) => {
|
|
53
|
+
if (input.playerEntity.startOfCombatDone || input.playerEntity.hpLeft <= 0) {
|
|
54
|
+
return input.currentAttacker;
|
|
55
|
+
}
|
|
56
|
+
const playerHeroPowerId = input.playerEntity.heroPowerId || (0, exports.getHeroPowerForHero)(input.playerEntity.cardId);
|
|
57
|
+
(0, soc_action_processor_1.performStartOfCombatAction)(playerHeroPowerId, input.playerEntity, input);
|
|
58
|
+
(0, attack_1.processMinionDeath)(input.playerBoard, input.playerEntity, input.opponentBoard, input.opponentEntity, input.gameState);
|
|
59
|
+
return input.currentAttacker;
|
|
60
|
+
};
|
|
61
|
+
const getHeroPowerForHero = (heroCardId) => {
|
|
62
|
+
switch (heroCardId) {
|
|
63
|
+
case "TB_BaconShop_HERO_08":
|
|
64
|
+
return "TB_BaconShop_HP_069";
|
|
65
|
+
case "TB_BaconShop_HERO_22":
|
|
66
|
+
return "TB_BaconShop_HP_024";
|
|
67
|
+
case "BG25_HERO_100":
|
|
68
|
+
return "TB_BaconShop_HP_018";
|
|
69
|
+
case "TB_BaconShop_HERO_52":
|
|
70
|
+
return "TB_BaconShop_HP_061";
|
|
71
|
+
case "BG25_HERO_103":
|
|
72
|
+
return "BG25_HERO_103p";
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
};
|
|
76
|
+
exports.getHeroPowerForHero = getHeroPowerForHero;
|
|
77
|
+
//# sourceMappingURL=soc-hero-power.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-hero-power.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-hero-power.ts"],"names":[],"mappings":";;;AAGA,sCAA+C;AAE/C,4DAA8D;AAC9D,iEAAoE;AAG7D,MAAM,6BAA6B,GAAG,CAC5C,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IAGX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,mCAAmC,CAAC;YACrD,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,WAAW;YACxB,cAAc,EAAE,cAAc;YAC9B,aAAa,EAAE,aAAa;YAC5B,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,mCAAmC,CAAC;YACrD,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE,YAAY;YAC5B,aAAa,EAAE,WAAW;YAC1B,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,mCAAmC,CAAC;YACrD,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE,YAAY;YAC5B,aAAa,EAAE,WAAW;YAC1B,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,mCAAmC,CAAC;YACrD,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,WAAW;YACxB,cAAc,EAAE,cAAc;YAC9B,aAAa,EAAE,aAAa;YAC5B,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;KACH;IACD,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAnDW,QAAA,6BAA6B,iCAmDxC;AAEF,MAAM,mCAAmC,GAAG,CAAC,KAAe,EAAU,EAAE;IACvE,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;QAC3E,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,IAAI,IAAA,2BAAmB,EAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3G,IAAA,iDAA0B,EAAC,iBAAiB,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACzE,IAAA,2BAAkB,EACjB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,CACf,CAAC;IACF,OAAO,KAAK,CAAC,eAAe,CAAC;AAC9B,CAAC,CAAC;AAEK,MAAM,mBAAmB,GAAG,CAAC,UAAkB,EAAU,EAAE;IACjE,QAAQ,UAAU,EAAE;QACnB;YACC,6BAAuB;QACxB;YACC,6BAA2B;QAC5B;YACC,6BAA0B;QAC3B;YACC,6BAA2B;QAC5B;YACC,wBAA+C;KAChD;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAdW,QAAA,mBAAmB,uBAc9B","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { processMinionDeath } from '../attack';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handleStartOfCombatHeroPowers = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// Apparently it's a toin coss about whether to handle Illidan first or Al'Akir first\r\n\t// Auras are only relevant for Illidan, and already applied there\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handlePlayerStartOfCombatHeroPowers({\r\n\t\t\tplayerEntity: playerEntity,\r\n\t\t\tplayerBoard: playerBoard,\r\n\t\t\topponentEntity: opponentEntity,\r\n\t\t\topponentBoard: opponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePlayerStartOfCombatHeroPowers({\r\n\t\t\tplayerEntity: opponentEntity,\r\n\t\t\tplayerBoard: opponentBoard,\r\n\t\t\topponentEntity: playerEntity,\r\n\t\t\topponentBoard: playerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handlePlayerStartOfCombatHeroPowers({\r\n\t\t\tplayerEntity: opponentEntity,\r\n\t\t\tplayerBoard: opponentBoard,\r\n\t\t\topponentEntity: playerEntity,\r\n\t\t\topponentBoard: playerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePlayerStartOfCombatHeroPowers({\r\n\t\t\tplayerEntity: playerEntity,\r\n\t\t\tplayerBoard: playerBoard,\r\n\t\t\topponentEntity: opponentEntity,\r\n\t\t\topponentBoard: opponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t}\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handlePlayerStartOfCombatHeroPowers = (input: SoCInput): number => {\r\n\tif (input.playerEntity.startOfCombatDone || input.playerEntity.hpLeft <= 0) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tconst playerHeroPowerId = input.playerEntity.heroPowerId || getHeroPowerForHero(input.playerEntity.cardId);\r\n\tperformStartOfCombatAction(playerHeroPowerId, input.playerEntity, input);\r\n\tprocessMinionDeath(\r\n\t\tinput.playerBoard,\r\n\t\tinput.playerEntity,\r\n\t\tinput.opponentBoard,\r\n\t\tinput.opponentEntity,\r\n\t\tinput.gameState,\r\n\t);\r\n\treturn input.currentAttacker;\r\n};\r\n\r\nexport const getHeroPowerForHero = (heroCardId: string): string => {\r\n\tswitch (heroCardId) {\r\n\t\tcase CardIds.IllidanStormrage_TB_BaconShop_HERO_08:\r\n\t\t\treturn CardIds.Wingmen;\r\n\t\tcase CardIds.TheLichKing_TB_BaconShop_HERO_22:\r\n\t\t\treturn CardIds.RebornRites;\r\n\t\tcase CardIds.ProfessorPutricide_BG25_HERO_100:\r\n\t\t\treturn CardIds.RagePotion;\r\n\t\tcase CardIds.Deathwing_TB_BaconShop_HERO_52:\r\n\t\t\treturn CardIds.AllWillBurn;\r\n\t\tcase CardIds.TeronGorefiend_BG25_HERO_103:\r\n\t\t\treturn CardIds.TeronGorefiend_RapidReanimation;\r\n\t}\r\n\treturn null;\r\n};\r\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { FullGameState } from '../internal-game-state';
|
|
4
|
+
export declare const handleIllidanHeroPowers: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleIllidanHeroPowers = void 0;
|
|
4
|
+
const attack_1 = require("../attack");
|
|
5
|
+
const stats_1 = require("../stats");
|
|
6
|
+
const summon_when_space_1 = require("../summon-when-space");
|
|
7
|
+
const soc_hero_power_1 = require("./soc-hero-power");
|
|
8
|
+
const handleIllidanHeroPowers = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
|
|
9
|
+
if (Math.random() < 0.5) {
|
|
10
|
+
currentAttacker = handlePlayerIllidanHeroPowers(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, true, gameState);
|
|
11
|
+
currentAttacker = handlePlayerIllidanHeroPowers(opponentEntity, opponentBoard, playerEntity, playerBoard, currentAttacker, false, gameState);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
currentAttacker = handlePlayerIllidanHeroPowers(opponentEntity, opponentBoard, playerEntity, playerBoard, currentAttacker, false, gameState);
|
|
15
|
+
currentAttacker = handlePlayerIllidanHeroPowers(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, true, gameState);
|
|
16
|
+
}
|
|
17
|
+
(0, attack_1.processMinionDeath)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
18
|
+
(0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
19
|
+
return currentAttacker;
|
|
20
|
+
};
|
|
21
|
+
exports.handleIllidanHeroPowers = handleIllidanHeroPowers;
|
|
22
|
+
const handlePlayerIllidanHeroPowers = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, friendly, gameState) => {
|
|
23
|
+
if (playerEntity.hpLeft <= 0) {
|
|
24
|
+
return currentAttacker;
|
|
25
|
+
}
|
|
26
|
+
const playerHeroPowerId = playerEntity.heroPowerId || (0, soc_hero_power_1.getHeroPowerForHero)(playerEntity.cardId);
|
|
27
|
+
if (playerHeroPowerId === "TB_BaconShop_HP_069" && playerBoard.length > 0) {
|
|
28
|
+
handleIllidanForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState, currentAttacker);
|
|
29
|
+
currentAttacker = friendly ? 1 : 0;
|
|
30
|
+
}
|
|
31
|
+
return currentAttacker;
|
|
32
|
+
};
|
|
33
|
+
const handleIllidanForPlayer = (playerBoard, playerEntity, opponentBoard, opponentEntity, gameState, currentAttacker) => {
|
|
34
|
+
if (playerEntity.startOfCombatDone) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const minionsAtStart = playerBoard.length;
|
|
38
|
+
const firstAttacker = playerBoard[0];
|
|
39
|
+
const secondAttacker = minionsAtStart > 1 ? playerBoard[playerBoard.length - 1] : null;
|
|
40
|
+
(0, stats_1.modifyStats)(firstAttacker, 2, 1, playerBoard, playerEntity, gameState);
|
|
41
|
+
gameState.spectator.registerPowerTarget(firstAttacker, firstAttacker, playerBoard, playerEntity, opponentEntity);
|
|
42
|
+
if (!!secondAttacker && !secondAttacker.definitelyDead && secondAttacker.health > 0) {
|
|
43
|
+
(0, stats_1.modifyStats)(secondAttacker, 2, 1, playerBoard, playerEntity, gameState);
|
|
44
|
+
gameState.spectator.registerPowerTarget(secondAttacker, secondAttacker, playerBoard, playerEntity, opponentEntity);
|
|
45
|
+
}
|
|
46
|
+
firstAttacker.attackImmediately = true;
|
|
47
|
+
(0, attack_1.simulateAttack)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
48
|
+
firstAttacker.hasAttacked = 0;
|
|
49
|
+
if (!!secondAttacker && !secondAttacker.definitelyDead && secondAttacker.health > 0) {
|
|
50
|
+
secondAttacker.attackImmediately = true;
|
|
51
|
+
(0, attack_1.simulateAttack)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
52
|
+
secondAttacker.hasAttacked = 0;
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=soc-illidan-hero-power.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-illidan-hero-power.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-illidan-hero-power.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { processMinionDeath, simulateAttack } from '../attack';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { modifyStats } from '../stats';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { getHeroPowerForHero } from './soc-hero-power';\r\n\r\nexport const handleIllidanHeroPowers = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// console.log('current attacker before', currentAttacker);\r\n\t// Apparently it's a toin coss about whether to handle Illidan first or Al'Akir first\r\n\t// Auras are only relevant for Illidan, and already applied there\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handlePlayerIllidanHeroPowers(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\ttrue,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tcurrentAttacker = handlePlayerIllidanHeroPowers(\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tfalse,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t} else {\r\n\t\tcurrentAttacker = handlePlayerIllidanHeroPowers(\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tfalse,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tcurrentAttacker = handlePlayerIllidanHeroPowers(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\ttrue,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n\tprocessMinionDeath(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handlePlayerIllidanHeroPowers = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tfriendly: boolean,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tif (playerEntity.hpLeft <= 0) {\r\n\t\treturn currentAttacker;\r\n\t}\r\n\tconst playerHeroPowerId = playerEntity.heroPowerId || getHeroPowerForHero(playerEntity.cardId);\r\n\tif (playerHeroPowerId === CardIds.Wingmen && playerBoard.length > 0) {\r\n\t\t// After Illidan triggers, it's always the other opponent's turn\r\n\t\t// https://x.com/LoewenMitchell/status/1752714583360639131?s=20\r\n\t\thandleIllidanForPlayer(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState, currentAttacker);\r\n\t\tcurrentAttacker = friendly ? 1 : 0;\r\n\t}\r\n\treturn currentAttacker;\r\n};\r\n\r\n// TODO: not exactly correct, because of \"attack immediately\", but it's close enough\r\nconst handleIllidanForPlayer = (\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tcurrentAttacker: number,\r\n): void => {\r\n\tif (playerEntity.startOfCombatDone) {\r\n\t\treturn;\r\n\t}\r\n\t// Otherwise, if the first minion dies on the attack, and the board has only 2 minions, we\r\n\t// miss the second one\r\n\tconst minionsAtStart = playerBoard.length;\r\n\tconst firstAttacker = playerBoard[0];\r\n\tconst secondAttacker = minionsAtStart > 1 ? playerBoard[playerBoard.length - 1] : null;\r\n\r\n\t// Stats updates\r\n\tmodifyStats(firstAttacker, 2, 1, playerBoard, playerEntity, gameState);\r\n\tgameState.spectator.registerPowerTarget(firstAttacker, firstAttacker, playerBoard, playerEntity, opponentEntity);\r\n\tif (!!secondAttacker && !secondAttacker.definitelyDead && secondAttacker.health > 0) {\r\n\t\tmodifyStats(secondAttacker, 2, 1, playerBoard, playerEntity, gameState);\r\n\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\tsecondAttacker,\r\n\t\t\tsecondAttacker,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\topponentEntity,\r\n\t\t);\r\n\t}\r\n\r\n\t// Attacks\r\n\tfirstAttacker.attackImmediately = true;\r\n\tsimulateAttack(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t// See http://replays.firestoneapp.com/?reviewId=f16b7a49-c2a2-4ac5-a9eb-a75f83246f70&turn=6&action=8\r\n\tfirstAttacker.hasAttacked = 0;\r\n\tif (!!secondAttacker && !secondAttacker.definitelyDead && secondAttacker.health > 0) {\r\n\t\tsecondAttacker.attackImmediately = true;\r\n\t\tsimulateAttack(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\t\tsecondAttacker.hasAttacked = 0;\r\n\t}\r\n\r\n\t// // See http://replays.firestoneapp.com/?reviewId=7e9ec42c-a8f6-43d2-9f39-cc486dfa2395&turn=6&action=5\r\n\t// if (firstAttacker.definitelyDead || firstAttacker.health <= 0) {\r\n\t// \tcurrentAttacker = (currentAttacker + 1) % 2;\r\n\t// }\r\n\t// return currentAttacker;\r\n};\r\n"]}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { FullGameState } from '../internal-game-state';
|
|
4
|
+
import { SoCInput } from './start-of-combat-input';
|
|
5
|
+
export declare const handleStartOfCombatMinions: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, playerBoardBefore: BoardEntity[], opponentBoardBefore: BoardEntity[], gameState: FullGameState) => number;
|
|
6
|
+
export declare const performStartOfCombatMinionsForPlayer: (minion: BoardEntity, input: SoCInput) => boolean;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.performStartOfCombatMinionsForPlayer = exports.handleStartOfCombatMinions = void 0;
|
|
4
|
+
const attack_1 = require("../attack");
|
|
5
|
+
const soc_action_processor_1 = require("./soc-action-processor");
|
|
6
|
+
const handleStartOfCombatMinions = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, playerBoardBefore, opponentBoardBefore, gameState) => {
|
|
7
|
+
let attackerForStart = Math.random() < 0.5 ? 0 : 1;
|
|
8
|
+
const playerAttackers = [...playerBoard];
|
|
9
|
+
const opponentAttackers = [...opponentBoard];
|
|
10
|
+
while (playerAttackers.length > 0 || opponentAttackers.length > 0) {
|
|
11
|
+
let shouldUpdateNextPlayer = false;
|
|
12
|
+
if (attackerForStart === 0 && playerAttackers.length > 0) {
|
|
13
|
+
const attacker = playerAttackers.splice(0, 1)[0];
|
|
14
|
+
if (attacker.health <= 0 || attacker.definitelyDead) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
shouldUpdateNextPlayer = (0, exports.performStartOfCombatMinionsForPlayer)(attacker, {
|
|
18
|
+
playerBoard: playerBoard,
|
|
19
|
+
playerEntity: playerEntity,
|
|
20
|
+
opponentBoard: opponentBoard,
|
|
21
|
+
opponentEntity: opponentEntity,
|
|
22
|
+
playerBoardBefore: playerBoardBefore,
|
|
23
|
+
opponentBoardBefore: opponentBoardBefore,
|
|
24
|
+
playerIsFriendly: true,
|
|
25
|
+
currentAttacker: 0,
|
|
26
|
+
gameState,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else if (attackerForStart === 0 && playerAttackers.length === 0) {
|
|
30
|
+
shouldUpdateNextPlayer = true;
|
|
31
|
+
}
|
|
32
|
+
else if (attackerForStart === 1 && opponentAttackers.length > 0) {
|
|
33
|
+
const attacker = opponentAttackers.splice(0, 1)[0];
|
|
34
|
+
if (attacker.health <= 0 || attacker.definitelyDead) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
shouldUpdateNextPlayer = (0, exports.performStartOfCombatMinionsForPlayer)(attacker, {
|
|
38
|
+
playerBoard: opponentBoard,
|
|
39
|
+
playerEntity: opponentEntity,
|
|
40
|
+
opponentBoard: playerBoard,
|
|
41
|
+
opponentEntity: playerEntity,
|
|
42
|
+
playerBoardBefore: opponentBoardBefore,
|
|
43
|
+
opponentBoardBefore: playerBoardBefore,
|
|
44
|
+
playerIsFriendly: false,
|
|
45
|
+
currentAttacker: 0,
|
|
46
|
+
gameState,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
else if (attackerForStart === 1 && opponentAttackers.length === 0) {
|
|
50
|
+
shouldUpdateNextPlayer = true;
|
|
51
|
+
}
|
|
52
|
+
if (shouldUpdateNextPlayer) {
|
|
53
|
+
attackerForStart = (attackerForStart + 1) % 2;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return currentAttacker;
|
|
57
|
+
};
|
|
58
|
+
exports.handleStartOfCombatMinions = handleStartOfCombatMinions;
|
|
59
|
+
const performStartOfCombatMinionsForPlayer = (minion, input) => {
|
|
60
|
+
if (input.playerEntity.startOfCombatDone) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
const hasProcessed = (0, soc_action_processor_1.performStartOfCombatAction)(minion.cardId, minion, input);
|
|
64
|
+
(0, attack_1.processMinionDeath)(input.playerBoard, input.playerEntity, input.opponentBoard, input.opponentEntity, input.gameState);
|
|
65
|
+
return hasProcessed;
|
|
66
|
+
};
|
|
67
|
+
exports.performStartOfCombatMinionsForPlayer = performStartOfCombatMinionsForPlayer;
|
|
68
|
+
//# sourceMappingURL=soc-minion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-minion.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-minion.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { processMinionDeath } from '../attack';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handleStartOfCombatMinions = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tplayerBoardBefore: BoardEntity[],\r\n\topponentBoardBefore: BoardEntity[],\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tlet attackerForStart = Math.random() < 0.5 ? 0 : 1;\r\n\tconst playerAttackers = [...playerBoard];\r\n\tconst opponentAttackers = [...opponentBoard];\r\n\r\n\twhile (playerAttackers.length > 0 || opponentAttackers.length > 0) {\r\n\t\tlet shouldUpdateNextPlayer = false;\r\n\t\tif (attackerForStart === 0 && playerAttackers.length > 0) {\r\n\t\t\tconst attacker = playerAttackers.splice(0, 1)[0];\r\n\t\t\tif (attacker.health <= 0 || attacker.definitelyDead) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tshouldUpdateNextPlayer = performStartOfCombatMinionsForPlayer(attacker, {\r\n\t\t\t\tplayerBoard: playerBoard,\r\n\t\t\t\tplayerEntity: playerEntity,\r\n\t\t\t\topponentBoard: opponentBoard,\r\n\t\t\t\topponentEntity: opponentEntity,\r\n\t\t\t\tplayerBoardBefore: playerBoardBefore,\r\n\t\t\t\topponentBoardBefore: opponentBoardBefore,\r\n\t\t\t\tplayerIsFriendly: true,\r\n\t\t\t\tcurrentAttacker: 0,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t} else if (attackerForStart === 0 && playerAttackers.length === 0) {\r\n\t\t\tshouldUpdateNextPlayer = true;\r\n\t\t} else if (attackerForStart === 1 && opponentAttackers.length > 0) {\r\n\t\t\tconst attacker = opponentAttackers.splice(0, 1)[0];\r\n\t\t\tif (attacker.health <= 0 || attacker.definitelyDead) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tshouldUpdateNextPlayer = performStartOfCombatMinionsForPlayer(attacker, {\r\n\t\t\t\tplayerBoard: opponentBoard,\r\n\t\t\t\tplayerEntity: opponentEntity,\r\n\t\t\t\topponentBoard: playerBoard,\r\n\t\t\t\topponentEntity: playerEntity,\r\n\t\t\t\tplayerBoardBefore: opponentBoardBefore,\r\n\t\t\t\topponentBoardBefore: playerBoardBefore,\r\n\t\t\t\tplayerIsFriendly: false,\r\n\t\t\t\tcurrentAttacker: 0,\r\n\t\t\t\tgameState,\r\n\t\t\t});\r\n\t\t} else if (attackerForStart === 1 && opponentAttackers.length === 0) {\r\n\t\t\tshouldUpdateNextPlayer = true;\r\n\t\t}\r\n\r\n\t\tif (shouldUpdateNextPlayer) {\r\n\t\t\tattackerForStart = (attackerForStart + 1) % 2;\r\n\t\t}\r\n\t}\r\n\treturn currentAttacker;\r\n};\r\n\r\n// Apparently, the board composition used for start of combat minion effects (like Red Whelp, and I assume it works the\r\n// same way for others like Prized Promo Drake or Mantid Queen) is the one that is used before Illidan's effect is handled.\r\n// Since this also runs before HP start of combat, we probably also use the state as it was before HP were triggered, like\r\n// Tamsin's Phylactery.\r\nexport const performStartOfCombatMinionsForPlayer = (minion: BoardEntity, input: SoCInput): boolean => {\r\n\tif (input.playerEntity.startOfCombatDone) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tconst hasProcessed = performStartOfCombatAction(minion.cardId, minion, input);\r\n\r\n\tprocessMinionDeath(\r\n\t\tinput.playerBoard,\r\n\t\tinput.playerEntity,\r\n\t\tinput.opponentBoard,\r\n\t\tinput.opponentEntity,\r\n\t\tinput.gameState,\r\n\t);\r\n\treturn hasProcessed;\r\n};\r\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { FullGameState } from '../internal-game-state';
|
|
4
|
+
export declare const handlePreCombatHeroPowers: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handlePreCombatHeroPowers = void 0;
|
|
4
|
+
const attack_1 = require("../attack");
|
|
5
|
+
const summon_when_space_1 = require("../summon-when-space");
|
|
6
|
+
const soc_action_processor_1 = require("./soc-action-processor");
|
|
7
|
+
const soc_hero_power_1 = require("./soc-hero-power");
|
|
8
|
+
const handlePreCombatHeroPowers = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
|
|
9
|
+
if (Math.random() < 0.5) {
|
|
10
|
+
currentAttacker = handlePreCombatHeroPowersForPlayer({
|
|
11
|
+
playerEntity: playerEntity,
|
|
12
|
+
playerBoard: playerBoard,
|
|
13
|
+
opponentEntity: opponentEntity,
|
|
14
|
+
opponentBoard: opponentBoard,
|
|
15
|
+
currentAttacker,
|
|
16
|
+
playerIsFriendly: true,
|
|
17
|
+
gameState,
|
|
18
|
+
});
|
|
19
|
+
currentAttacker = handlePreCombatHeroPowersForPlayer({
|
|
20
|
+
playerEntity: opponentEntity,
|
|
21
|
+
playerBoard: opponentBoard,
|
|
22
|
+
opponentEntity: playerEntity,
|
|
23
|
+
opponentBoard: playerBoard,
|
|
24
|
+
currentAttacker,
|
|
25
|
+
playerIsFriendly: false,
|
|
26
|
+
gameState,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
currentAttacker = handlePreCombatHeroPowersForPlayer({
|
|
31
|
+
playerEntity: opponentEntity,
|
|
32
|
+
playerBoard: opponentBoard,
|
|
33
|
+
opponentEntity: playerEntity,
|
|
34
|
+
opponentBoard: playerBoard,
|
|
35
|
+
currentAttacker,
|
|
36
|
+
playerIsFriendly: false,
|
|
37
|
+
gameState,
|
|
38
|
+
});
|
|
39
|
+
currentAttacker = handlePreCombatHeroPowersForPlayer({
|
|
40
|
+
playerEntity: playerEntity,
|
|
41
|
+
playerBoard: playerBoard,
|
|
42
|
+
opponentEntity: opponentEntity,
|
|
43
|
+
opponentBoard: opponentBoard,
|
|
44
|
+
currentAttacker,
|
|
45
|
+
playerIsFriendly: true,
|
|
46
|
+
gameState,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const initialPlayerBoardSize = playerBoard.length;
|
|
50
|
+
const initialOpponentBoardSize = opponentBoard.length;
|
|
51
|
+
(0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
52
|
+
if (playerBoard.length !== initialPlayerBoardSize || opponentBoard.length !== initialOpponentBoardSize) {
|
|
53
|
+
currentAttacker =
|
|
54
|
+
playerBoard.length > opponentBoard.length
|
|
55
|
+
? 0
|
|
56
|
+
: opponentBoard.length > playerBoard.length
|
|
57
|
+
? 1
|
|
58
|
+
: Math.round(Math.random());
|
|
59
|
+
}
|
|
60
|
+
return currentAttacker;
|
|
61
|
+
};
|
|
62
|
+
exports.handlePreCombatHeroPowers = handlePreCombatHeroPowers;
|
|
63
|
+
const handlePreCombatHeroPowersForPlayer = (input) => {
|
|
64
|
+
if (input.playerEntity.startOfCombatDone || input.playerEntity.hpLeft <= 0) {
|
|
65
|
+
return input.currentAttacker;
|
|
66
|
+
}
|
|
67
|
+
const playerHeroPowerId = input.playerEntity.heroPowerId || (0, soc_hero_power_1.getHeroPowerForHero)(input.playerEntity.cardId);
|
|
68
|
+
(0, soc_action_processor_1.performStartOfCombatAction)(playerHeroPowerId, input.playerEntity, input);
|
|
69
|
+
(0, attack_1.processMinionDeath)(input.playerBoard, input.playerEntity, input.opponentBoard, input.opponentEntity, input.gameState);
|
|
70
|
+
return input.currentAttacker;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=soc-pre-combat-hero-power.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-pre-combat-hero-power.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-pre-combat-hero-power.ts"],"names":[],"mappings":";;;AAEA,sCAA+C;AAE/C,4DAA8D;AAC9D,iEAAoE;AACpE,qDAAuD;AAGhD,MAAM,yBAAyB,GAAG,CACxC,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IACX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,kCAAkC,CAAC;YACpD,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,WAAW;YACxB,cAAc,EAAE,cAAc;YAC9B,aAAa,EAAE,aAAa;YAC5B,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,kCAAkC,CAAC;YACpD,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE,YAAY;YAC5B,aAAa,EAAE,WAAW;YAC1B,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,kCAAkC,CAAC;YACpD,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE,YAAY;YAC5B,aAAa,EAAE,WAAW;YAC1B,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,kCAAkC,CAAC;YACpD,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,WAAW;YACxB,cAAc,EAAE,cAAc;YAC9B,aAAa,EAAE,aAAa;YAC5B,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;KACH;IACD,MAAM,sBAAsB,GAAG,WAAW,CAAC,MAAM,CAAC;IAClD,MAAM,wBAAwB,GAAG,aAAa,CAAC,MAAM,CAAC;IAGtD,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAE5F,IAAI,WAAW,CAAC,MAAM,KAAK,sBAAsB,IAAI,aAAa,CAAC,MAAM,KAAK,wBAAwB,EAAE;QACvG,eAAe;YACd,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM;gBACxC,CAAC,CAAC,CAAC;gBACH,CAAC,CAAC,aAAa,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM;oBAC3C,CAAC,CAAC,CAAC;oBACH,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;KAC9B;IACD,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AA9DW,QAAA,yBAAyB,6BA8DpC;AAEF,MAAM,kCAAkC,GAAG,CAAC,KAAe,EAAU,EAAE;IACtE,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,IAAI,CAAC,EAAE;QAC3E,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,MAAM,iBAAiB,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,IAAI,IAAA,oCAAmB,EAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC3G,IAAA,iDAA0B,EAAC,iBAAiB,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACzE,IAAA,2BAAkB,EACjB,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,YAAY,EAClB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,cAAc,EACpB,KAAK,CAAC,SAAS,CACf,CAAC;IAEF,OAAO,KAAK,CAAC,eAAe,CAAC;AAC9B,CAAC,CAAC","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { processMinionDeath } from '../attack';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { getHeroPowerForHero } from './soc-hero-power';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handlePreCombatHeroPowers = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\r\n\t\t\tplayerEntity: playerEntity,\r\n\t\t\tplayerBoard: playerBoard,\r\n\t\t\topponentEntity: opponentEntity,\r\n\t\t\topponentBoard: opponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\r\n\t\t\tplayerEntity: opponentEntity,\r\n\t\t\tplayerBoard: opponentBoard,\r\n\t\t\topponentEntity: playerEntity,\r\n\t\t\topponentBoard: playerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\r\n\t\t\tplayerEntity: opponentEntity,\r\n\t\t\tplayerBoard: opponentBoard,\r\n\t\t\topponentEntity: playerEntity,\r\n\t\t\topponentBoard: playerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\r\n\t\t\tplayerEntity: playerEntity,\r\n\t\t\tplayerBoard: playerBoard,\r\n\t\t\topponentEntity: opponentEntity,\r\n\t\t\topponentBoard: opponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t}\r\n\tconst initialPlayerBoardSize = playerBoard.length;\r\n\tconst initialOpponentBoardSize = opponentBoard.length;\r\n\t// Ozumat's Tentaclecan cause the first player to be recomputed\r\n\t// https://replays.firestoneapp.com/?reviewId=f15c90de-8b3c-4017-960d-365fe09eb7ab&turn=5&action=1\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\r\n\tif (playerBoard.length !== initialPlayerBoardSize || opponentBoard.length !== initialOpponentBoardSize) {\r\n\t\tcurrentAttacker =\r\n\t\t\tplayerBoard.length > opponentBoard.length\r\n\t\t\t\t? 0\r\n\t\t\t\t: opponentBoard.length > playerBoard.length\r\n\t\t\t\t? 1\r\n\t\t\t\t: Math.round(Math.random());\r\n\t}\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handlePreCombatHeroPowersForPlayer = (input: SoCInput): number => {\r\n\tif (input.playerEntity.startOfCombatDone || input.playerEntity.hpLeft <= 0) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tconst playerHeroPowerId = input.playerEntity.heroPowerId || getHeroPowerForHero(input.playerEntity.cardId);\r\n\tperformStartOfCombatAction(playerHeroPowerId, input.playerEntity, input);\r\n\tprocessMinionDeath(\r\n\t\tinput.playerBoard,\r\n\t\tinput.playerEntity,\r\n\t\tinput.opponentBoard,\r\n\t\tinput.opponentEntity,\r\n\t\tinput.gameState,\r\n\t);\r\n\r\n\treturn input.currentAttacker;\r\n};\r\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { FullGameState } from '../internal-game-state';
|
|
4
|
+
export declare const handleStartOfCombatQuestRewards: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleStartOfCombatQuestRewards = void 0;
|
|
4
|
+
const summon_when_space_1 = require("../summon-when-space");
|
|
5
|
+
const soc_action_processor_1 = require("./soc-action-processor");
|
|
6
|
+
const handleStartOfCombatQuestRewards = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
|
|
7
|
+
if (Math.random() < 0.5) {
|
|
8
|
+
currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
|
|
9
|
+
playerEntity: playerEntity,
|
|
10
|
+
playerBoard: playerBoard,
|
|
11
|
+
opponentEntity: opponentEntity,
|
|
12
|
+
opponentBoard: opponentBoard,
|
|
13
|
+
currentAttacker,
|
|
14
|
+
gameState,
|
|
15
|
+
playerIsFriendly: true,
|
|
16
|
+
});
|
|
17
|
+
currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
|
|
18
|
+
playerEntity: opponentEntity,
|
|
19
|
+
playerBoard: opponentBoard,
|
|
20
|
+
opponentEntity: playerEntity,
|
|
21
|
+
opponentBoard: playerBoard,
|
|
22
|
+
currentAttacker,
|
|
23
|
+
gameState,
|
|
24
|
+
playerIsFriendly: false,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
|
|
29
|
+
playerEntity: opponentEntity,
|
|
30
|
+
playerBoard: opponentBoard,
|
|
31
|
+
opponentEntity: playerEntity,
|
|
32
|
+
opponentBoard: playerBoard,
|
|
33
|
+
currentAttacker,
|
|
34
|
+
gameState,
|
|
35
|
+
playerIsFriendly: false,
|
|
36
|
+
});
|
|
37
|
+
currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
|
|
38
|
+
playerEntity: playerEntity,
|
|
39
|
+
playerBoard: playerBoard,
|
|
40
|
+
opponentEntity: opponentEntity,
|
|
41
|
+
opponentBoard: opponentBoard,
|
|
42
|
+
currentAttacker,
|
|
43
|
+
gameState,
|
|
44
|
+
playerIsFriendly: true,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
(0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
48
|
+
return currentAttacker;
|
|
49
|
+
};
|
|
50
|
+
exports.handleStartOfCombatQuestRewards = handleStartOfCombatQuestRewards;
|
|
51
|
+
const handleStartOfCombatQuestRewardsForPlayer = (input) => {
|
|
52
|
+
if (input.playerEntity.startOfCombatDone) {
|
|
53
|
+
return input.currentAttacker;
|
|
54
|
+
}
|
|
55
|
+
for (const reward of input.playerEntity.questRewards) {
|
|
56
|
+
(0, soc_action_processor_1.performStartOfCombatAction)(reward, input.playerEntity, input);
|
|
57
|
+
}
|
|
58
|
+
return input.currentAttacker;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=soc-quest-reward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-quest-reward.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-quest-reward.ts"],"names":[],"mappings":";;;AAGA,4DAA8D;AAC9D,iEAAoE;AAG7D,MAAM,+BAA+B,GAAG,CAC9C,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IACX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,wCAAwC,CAAC;YAC1D,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,WAAW;YACxB,cAAc,EAAE,cAAc;YAC9B,aAAa,EAAE,aAAa;YAC5B,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,eAAe,GAAG,wCAAwC,CAAC;YAC1D,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE,YAAY;YAC5B,aAAa,EAAE,WAAW;YAC1B,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,KAAK;SACvB,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,wCAAwC,CAAC;YAC1D,YAAY,EAAE,cAAc;YAC5B,WAAW,EAAE,aAAa;YAC1B,cAAc,EAAE,YAAY;YAC5B,aAAa,EAAE,WAAW;YAC1B,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,eAAe,GAAG,wCAAwC,CAAC;YAC1D,YAAY,EAAE,YAAY;YAC1B,WAAW,EAAE,WAAW;YACxB,cAAc,EAAE,cAAc;YAC9B,aAAa,EAAE,aAAa;YAC5B,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,IAAI;SACtB,CAAC,CAAC;KACH;IAED,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAlDW,QAAA,+BAA+B,mCAkD1C;AAEF,MAAM,wCAAwC,GAAG,CAAC,KAAe,EAAU,EAAE;IAC5E,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACzC,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,YAAY,EAAE;QACrD,IAAA,iDAA0B,EAAC,MAAM,EAAE,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;KAC9D;IAED,OAAO,KAAK,CAAC,eAAe,CAAC;AAC9B,CAAC,CAAC","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\nimport { performStartOfCombatAction } from './soc-action-processor';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const handleStartOfCombatQuestRewards = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\r\n\t\t\tplayerEntity: playerEntity,\r\n\t\t\tplayerBoard: playerBoard,\r\n\t\t\topponentEntity: opponentEntity,\r\n\t\t\topponentBoard: opponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t});\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\r\n\t\t\tplayerEntity: opponentEntity,\r\n\t\t\tplayerBoard: opponentBoard,\r\n\t\t\topponentEntity: playerEntity,\r\n\t\t\topponentBoard: playerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\r\n\t\t\tplayerEntity: opponentEntity,\r\n\t\t\tplayerBoard: opponentBoard,\r\n\t\t\topponentEntity: playerEntity,\r\n\t\t\topponentBoard: playerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: false,\r\n\t\t});\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\r\n\t\t\tplayerEntity: playerEntity,\r\n\t\t\tplayerBoard: playerBoard,\r\n\t\t\topponentEntity: opponentEntity,\r\n\t\t\topponentBoard: opponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tplayerIsFriendly: true,\r\n\t\t});\r\n\t}\r\n\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handleStartOfCombatQuestRewardsForPlayer = (input: SoCInput): number => {\r\n\tif (input.playerEntity.startOfCombatDone) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tfor (const reward of input.playerEntity.questRewards) {\r\n\t\tperformStartOfCombatAction(reward, input.playerEntity, input);\r\n\t}\r\n\r\n\treturn input.currentAttacker;\r\n};\r\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { FullGameState } from '../internal-game-state';
|
|
4
|
+
export declare const handleStartOfCombatSecrets: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleStartOfCombatSecrets = void 0;
|
|
4
|
+
const utils_1 = require("../../services/utils");
|
|
5
|
+
const utils_2 = require("../../utils");
|
|
6
|
+
const deathrattle_spawns_1 = require("../deathrattle-spawns");
|
|
7
|
+
const spawns_1 = require("../spawns");
|
|
8
|
+
const summon_when_space_1 = require("../summon-when-space");
|
|
9
|
+
const handleStartOfCombatSecrets = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
|
|
10
|
+
if (Math.random() < 0.5) {
|
|
11
|
+
currentAttacker = handleStartOfCombatSecretsForPlayer(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState, true);
|
|
12
|
+
currentAttacker = handleStartOfCombatSecretsForPlayer(opponentEntity, opponentBoard, playerEntity, playerBoard, currentAttacker, gameState, false);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
currentAttacker = handleStartOfCombatSecretsForPlayer(opponentEntity, opponentBoard, playerEntity, playerBoard, currentAttacker, gameState, false);
|
|
16
|
+
currentAttacker = handleStartOfCombatSecretsForPlayer(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState, true);
|
|
17
|
+
}
|
|
18
|
+
(0, summon_when_space_1.handleSummonsWhenSpace)(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);
|
|
19
|
+
return currentAttacker;
|
|
20
|
+
};
|
|
21
|
+
exports.handleStartOfCombatSecrets = handleStartOfCombatSecrets;
|
|
22
|
+
const handleStartOfCombatSecretsForPlayer = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState, playerIsFriendly) => {
|
|
23
|
+
var _a;
|
|
24
|
+
if (playerEntity.startOfCombatDone) {
|
|
25
|
+
return currentAttacker;
|
|
26
|
+
}
|
|
27
|
+
for (const secret of (_a = playerEntity.secrets) !== null && _a !== void 0 ? _a : []) {
|
|
28
|
+
switch (secret.cardId) {
|
|
29
|
+
case "BG28_573":
|
|
30
|
+
if (!!opponentBoard.length) {
|
|
31
|
+
const target = (0, utils_1.pickRandom)(opponentBoard);
|
|
32
|
+
target.health = 1;
|
|
33
|
+
target.maxHealth = 1;
|
|
34
|
+
gameState.spectator.registerPowerTarget(playerEntity, target, opponentBoard, null, null);
|
|
35
|
+
}
|
|
36
|
+
break;
|
|
37
|
+
case "BG28_603":
|
|
38
|
+
secret.scriptDataNum1 = 1;
|
|
39
|
+
break;
|
|
40
|
+
case "BG28_519":
|
|
41
|
+
(0, utils_2.addStatsToBoard)(secret, playerBoard, playerEntity, 2, 1, gameState);
|
|
42
|
+
break;
|
|
43
|
+
case "BG28_641":
|
|
44
|
+
if (playerBoard.length < 7) {
|
|
45
|
+
const newMinions = (0, deathrattle_spawns_1.spawnEntities)("BG28_641t", 1, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState.allCards, gameState.cardsData, gameState.sharedState, gameState.spectator, playerEntity.friendly, true, false, false);
|
|
46
|
+
newMinions[0].attackImmediately = true;
|
|
47
|
+
(0, spawns_1.performEntitySpawns)(newMinions, playerBoard, playerEntity, null, 0, opponentBoard, opponentEntity, gameState);
|
|
48
|
+
}
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return currentAttacker;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=soc-secret.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-secret.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-secret.ts"],"names":[],"mappings":";;;AAGA,gDAAkD;AAClD,uCAA8C;AAC9C,8DAAsD;AAEtD,sCAAgD;AAChD,4DAA8D;AAEvD,MAAM,0BAA0B,GAAG,CACzC,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACf,EAAE;IACX,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QACxB,eAAe,GAAG,mCAAmC,CACpD,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,SAAS,EACT,IAAI,CACJ,CAAC;QACF,eAAe,GAAG,mCAAmC,CACpD,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,SAAS,EACT,KAAK,CACL,CAAC;KACF;SAAM;QACN,eAAe,GAAG,mCAAmC,CACpD,cAAc,EACd,aAAa,EACb,YAAY,EACZ,WAAW,EACX,eAAe,EACf,SAAS,EACT,KAAK,CACL,CAAC;QACF,eAAe,GAAG,mCAAmC,CACpD,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,eAAe,EACf,SAAS,EACT,IAAI,CACJ,CAAC;KACF;IACD,IAAA,0CAAsB,EAAC,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IAC5F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAjDW,QAAA,0BAA0B,8BAiDrC;AAEF,MAAM,mCAAmC,GAAG,CAC3C,YAA6B,EAC7B,WAA0B,EAC1B,cAA+B,EAC/B,aAA4B,EAC5B,eAAuB,EACvB,SAAwB,EACxB,gBAAyB,EAChB,EAAE;;IACX,IAAI,YAAY,CAAC,iBAAiB,EAAE;QACnC,OAAO,eAAe,CAAC;KACvB;IACD,KAAK,MAAM,MAAM,IAAI,MAAA,YAAY,CAAC,OAAO,mCAAI,EAAE,EAAE;QAChD,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB;gBACC,IAAI,CAAC,CAAC,aAAa,CAAC,MAAM,EAAE;oBAC3B,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,aAAa,CAAC,CAAC;oBACzC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;oBAClB,MAAM,CAAC,SAAS,GAAG,CAAC,CAAC;oBACrB,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;iBACzF;gBACD,MAAM;YACP;gBACC,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC;gBAC1B,MAAM;YACP;gBACC,IAAA,uBAAe,EAAC,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;gBACpE,MAAM;YACP;gBACC,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC3B,MAAM,UAAU,GAAG,IAAA,kCAAa,eAE/B,CAAC,EACD,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,SAAS,CAAC,QAAQ,EAClB,SAAS,CAAC,SAAS,EACnB,SAAS,CAAC,WAAW,EACrB,SAAS,CAAC,SAAS,EACnB,YAAY,CAAC,QAAQ,EACrB,IAAI,EACJ,KAAK,EACL,KAAK,CACL,CAAC;oBACF,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,GAAG,IAAI,CAAC;oBACvC,IAAA,4BAAmB,EAClB,UAAU,EACV,WAAW,EACX,YAAY,EACZ,IAAI,EACJ,CAAC,EACD,aAAa,EACb,cAAc,EACd,SAAS,CACT,CAAC;iBACF;gBACD,MAAM;SACP;KACD;IAED,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { pickRandom } from '../../services/utils';\r\nimport { addStatsToBoard } from '../../utils';\r\nimport { spawnEntities } from '../deathrattle-spawns';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { performEntitySpawns } from '../spawns';\r\nimport { handleSummonsWhenSpace } from '../summon-when-space';\r\n\r\nexport const handleStartOfCombatSecrets = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tif (Math.random() < 0.5) {\r\n\t\tcurrentAttacker = handleStartOfCombatSecretsForPlayer(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t\tcurrentAttacker = handleStartOfCombatSecretsForPlayer(\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t} else {\r\n\t\tcurrentAttacker = handleStartOfCombatSecretsForPlayer(\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\tfalse,\r\n\t\t);\r\n\t\tcurrentAttacker = handleStartOfCombatSecretsForPlayer(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t}\r\n\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handleStartOfCombatSecretsForPlayer = (\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n\tplayerIsFriendly: boolean,\r\n): number => {\r\n\tif (playerEntity.startOfCombatDone) {\r\n\t\treturn currentAttacker;\r\n\t}\r\n\tfor (const secret of playerEntity.secrets ?? []) {\r\n\t\tswitch (secret.cardId) {\r\n\t\t\tcase CardIds.UpperHand_BG28_573:\r\n\t\t\t\tif (!!opponentBoard.length) {\r\n\t\t\t\t\tconst target = pickRandom(opponentBoard);\r\n\t\t\t\t\ttarget.health = 1;\r\n\t\t\t\t\ttarget.maxHealth = 1;\r\n\t\t\t\t\tgameState.spectator.registerPowerTarget(playerEntity, target, opponentBoard, null, null);\r\n\t\t\t\t}\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.BoonOfBeetles_BG28_603:\r\n\t\t\t\tsecret.scriptDataNum1 = 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.FleetingVigor_BG28_519:\r\n\t\t\t\taddStatsToBoard(secret, playerBoard, playerEntity, 2, 1, gameState);\r\n\t\t\t\tbreak;\r\n\t\t\tcase CardIds.ToxicTumbleweed_BG28_641:\r\n\t\t\t\tif (playerBoard.length < 7) {\r\n\t\t\t\t\tconst newMinions = spawnEntities(\r\n\t\t\t\t\t\tCardIds.ToxicTumbleweed_TumblingAssassinToken_BG28_641t,\r\n\t\t\t\t\t\t1,\r\n\t\t\t\t\t\tplayerBoard,\r\n\t\t\t\t\t\tplayerEntity,\r\n\t\t\t\t\t\topponentBoard,\r\n\t\t\t\t\t\topponentEntity,\r\n\t\t\t\t\t\tgameState.allCards,\r\n\t\t\t\t\t\tgameState.cardsData,\r\n\t\t\t\t\t\tgameState.sharedState,\r\n\t\t\t\t\t\tgameState.spectator,\r\n\t\t\t\t\t\tplayerEntity.friendly,\r\n\t\t\t\t\t\ttrue,\r\n\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t\tfalse,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tnewMinions[0].attackImmediately = true;\r\n\t\t\t\t\tperformEntitySpawns(\r\n\t\t\t\t\t\tnewMinions,\r\n\t\t\t\t\t\tplayerBoard,\r\n\t\t\t\t\t\tplayerEntity,\r\n\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t0,\r\n\t\t\t\t\t\topponentBoard,\r\n\t\t\t\t\t\topponentEntity,\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\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn currentAttacker;\r\n};\r\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { FullGameState } from '../internal-game-state';
|
|
4
|
+
export declare const handleStartOfCombatTrinkets: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
|