@firestone-hs/simulate-bgs-battle 1.1.486 → 1.1.488
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/board-entity.d.ts +1 -0
- package/dist/board-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 +16 -3
- 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 +5 -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/services/utils.d.ts +1 -0
- package/dist/services/utils.js +13 -1
- package/dist/services/utils.js.map +1 -1
- package/dist/simulation/add-minion-to-board.js +18 -23
- package/dist/simulation/add-minion-to-board.js.map +1 -1
- package/dist/simulation/attack.js +14 -4
- package/dist/simulation/attack.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 +21 -5
- 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.d.ts +4 -0
- package/dist/simulation/discover.js +32 -0
- package/dist/simulation/discover.js.map +1 -0
- package/dist/simulation/magnetize.js +2 -1
- package/dist/simulation/magnetize.js.map +1 -1
- package/dist/simulation/minion-death.d.ts +1 -1
- package/dist/simulation/minion-death.js +8 -8
- package/dist/simulation/minion-death.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/simulation/summon-when-space.js +5 -1
- package/dist/simulation/summon-when-space.js.map +1 -1
- 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 -1167
- package/dist/simulation/start-of-combat.js.map +0 -1
|
@@ -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,
|
|
19
|
+
playerEntity,
|
|
20
|
+
opponentBoard,
|
|
21
|
+
opponentEntity,
|
|
22
|
+
playerBoardBefore,
|
|
23
|
+
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
|
+
opponentBoard,
|
|
39
|
+
opponentEntity,
|
|
40
|
+
playerBoard,
|
|
41
|
+
playerEntity,
|
|
42
|
+
opponentBoardBefore,
|
|
43
|
+
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,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tplayerBoardBefore,\r\n\t\t\t\topponentBoardBefore,\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\topponentBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\topponentBoardBefore,\r\n\t\t\t\tplayerBoardBefore,\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,
|
|
12
|
+
playerBoard,
|
|
13
|
+
opponentEntity,
|
|
14
|
+
opponentBoard,
|
|
15
|
+
currentAttacker,
|
|
16
|
+
playerIsFriendly: true,
|
|
17
|
+
gameState,
|
|
18
|
+
});
|
|
19
|
+
currentAttacker = handlePreCombatHeroPowersForPlayer({
|
|
20
|
+
opponentEntity,
|
|
21
|
+
opponentBoard,
|
|
22
|
+
playerEntity,
|
|
23
|
+
playerBoard,
|
|
24
|
+
currentAttacker,
|
|
25
|
+
playerIsFriendly: false,
|
|
26
|
+
gameState,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
currentAttacker = handlePreCombatHeroPowersForPlayer({
|
|
31
|
+
opponentEntity,
|
|
32
|
+
opponentBoard,
|
|
33
|
+
playerEntity,
|
|
34
|
+
playerBoard,
|
|
35
|
+
currentAttacker,
|
|
36
|
+
playerIsFriendly: false,
|
|
37
|
+
gameState,
|
|
38
|
+
});
|
|
39
|
+
currentAttacker = handlePreCombatHeroPowersForPlayer({
|
|
40
|
+
playerEntity,
|
|
41
|
+
playerBoard,
|
|
42
|
+
opponentEntity,
|
|
43
|
+
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, null, 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;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,gBAAgB,EAAE,IAAI;YACtB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,kCAAkC,CAAC;YACpD,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,kCAAkC,CAAC;YACpD,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,gBAAgB,EAAE,KAAK;YACvB,SAAS;SACT,CAAC,CAAC;QACH,eAAe,GAAG,kCAAkC,CAAC;YACpD,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,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,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3D,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,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\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\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\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\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\tplayerIsFriendly: false,\r\n\t\t\tgameState,\r\n\t\t});\r\n\t\tcurrentAttacker = handlePreCombatHeroPowersForPlayer({\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\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, null, 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,
|
|
10
|
+
playerBoard,
|
|
11
|
+
opponentEntity,
|
|
12
|
+
opponentBoard,
|
|
13
|
+
currentAttacker,
|
|
14
|
+
gameState,
|
|
15
|
+
playerIsFriendly: true,
|
|
16
|
+
});
|
|
17
|
+
currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
|
|
18
|
+
opponentEntity,
|
|
19
|
+
opponentBoard,
|
|
20
|
+
playerEntity,
|
|
21
|
+
playerBoard,
|
|
22
|
+
currentAttacker,
|
|
23
|
+
gameState,
|
|
24
|
+
playerIsFriendly: false,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
|
|
29
|
+
opponentEntity,
|
|
30
|
+
opponentBoard,
|
|
31
|
+
playerEntity,
|
|
32
|
+
playerBoard,
|
|
33
|
+
currentAttacker,
|
|
34
|
+
gameState,
|
|
35
|
+
playerIsFriendly: false,
|
|
36
|
+
});
|
|
37
|
+
currentAttacker = handleStartOfCombatQuestRewardsForPlayer({
|
|
38
|
+
playerEntity,
|
|
39
|
+
playerBoard,
|
|
40
|
+
opponentEntity,
|
|
41
|
+
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, null, 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;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,eAAe,GAAG,wCAAwC,CAAC;YAC1D,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,KAAK;SACvB,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,wCAAwC,CAAC;YAC1D,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,eAAe,GAAG,wCAAwC,CAAC;YAC1D,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,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,IAAI,EAAE,KAAK,CAAC,CAAC;KAChD;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,\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\tplayerIsFriendly: true,\r\n\t\t});\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\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\tplayerIsFriendly: false,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\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\tplayerIsFriendly: false,\r\n\t\t});\r\n\t\tcurrentAttacker = handleStartOfCombatQuestRewardsForPlayer({\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\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, null, 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;
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleStartOfCombatTrinkets = void 0;
|
|
4
|
+
const summon_when_space_1 = require("../summon-when-space");
|
|
5
|
+
const soc_action_processor_1 = require("./soc-action-processor");
|
|
6
|
+
const handleStartOfCombatTrinkets = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
|
|
7
|
+
if (Math.random() < 0.5) {
|
|
8
|
+
currentAttacker = handleStartOfCombatTrinketsForPlayer({
|
|
9
|
+
playerEntity,
|
|
10
|
+
playerBoard,
|
|
11
|
+
opponentEntity,
|
|
12
|
+
opponentBoard,
|
|
13
|
+
currentAttacker,
|
|
14
|
+
gameState,
|
|
15
|
+
playerIsFriendly: true,
|
|
16
|
+
});
|
|
17
|
+
currentAttacker = handleStartOfCombatTrinketsForPlayer({
|
|
18
|
+
opponentEntity,
|
|
19
|
+
opponentBoard,
|
|
20
|
+
playerEntity,
|
|
21
|
+
playerBoard,
|
|
22
|
+
currentAttacker,
|
|
23
|
+
gameState,
|
|
24
|
+
playerIsFriendly: false,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
currentAttacker = handleStartOfCombatTrinketsForPlayer({
|
|
29
|
+
opponentEntity,
|
|
30
|
+
opponentBoard,
|
|
31
|
+
playerEntity,
|
|
32
|
+
playerBoard,
|
|
33
|
+
currentAttacker,
|
|
34
|
+
gameState,
|
|
35
|
+
playerIsFriendly: false,
|
|
36
|
+
});
|
|
37
|
+
currentAttacker = handleStartOfCombatTrinketsForPlayer({
|
|
38
|
+
playerEntity,
|
|
39
|
+
playerBoard,
|
|
40
|
+
opponentEntity,
|
|
41
|
+
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.handleStartOfCombatTrinkets = handleStartOfCombatTrinkets;
|
|
51
|
+
const handleStartOfCombatTrinketsForPlayer = (input) => {
|
|
52
|
+
if (input.playerEntity.startOfCombatDone) {
|
|
53
|
+
return input.currentAttacker;
|
|
54
|
+
}
|
|
55
|
+
for (const trinket of input.playerEntity.trinkets) {
|
|
56
|
+
(0, soc_action_processor_1.performStartOfCombatAction)(trinket.cardId, trinket, input);
|
|
57
|
+
}
|
|
58
|
+
return input.currentAttacker;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=soc-trinket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-trinket.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-trinket.ts"],"names":[],"mappings":";;;AAGA,4DAA8D;AAC9D,iEAAoE;AAG7D,MAAM,2BAA2B,GAAG,CAC1C,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,oCAAoC,CAAC;YACtD,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,IAAI;SACtB,CAAC,CAAC;QACH,eAAe,GAAG,oCAAoC,CAAC;YACtD,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,KAAK;SACvB,CAAC,CAAC;KACH;SAAM;QACN,eAAe,GAAG,oCAAoC,CAAC;YACtD,cAAc;YACd,aAAa;YACb,YAAY;YACZ,WAAW;YACX,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,eAAe,GAAG,oCAAoC,CAAC;YACtD,YAAY;YACZ,WAAW;YACX,cAAc;YACd,aAAa;YACb,eAAe;YACf,SAAS;YACT,gBAAgB,EAAE,IAAI;SACtB,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;AAjDW,QAAA,2BAA2B,+BAiDtC;AAEF,MAAM,oCAAoC,GAAG,CAAC,KAAe,EAAU,EAAE;IACxE,IAAI,KAAK,CAAC,YAAY,CAAC,iBAAiB,EAAE;QACzC,OAAO,KAAK,CAAC,eAAe,CAAC;KAC7B;IAED,KAAK,MAAM,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE;QAClD,IAAA,iDAA0B,EAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;KAC3D;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 handleStartOfCombatTrinkets = (\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 = handleStartOfCombatTrinketsForPlayer({\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\tplayerIsFriendly: true,\r\n\t\t});\r\n\t\tcurrentAttacker = handleStartOfCombatTrinketsForPlayer({\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\tplayerIsFriendly: false,\r\n\t\t});\r\n\t} else {\r\n\t\tcurrentAttacker = handleStartOfCombatTrinketsForPlayer({\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\tplayerIsFriendly: false,\r\n\t\t});\r\n\t\tcurrentAttacker = handleStartOfCombatTrinketsForPlayer({\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\tplayerIsFriendly: true,\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 handleStartOfCombatTrinketsForPlayer = (input: SoCInput): number => {\r\n\tif (input.playerEntity.startOfCombatDone) {\r\n\t\treturn input.currentAttacker;\r\n\t}\r\n\r\n\tfor (const trinket of input.playerEntity.trinkets) {\r\n\t\tperformStartOfCombatAction(trinket.cardId, trinket, input);\r\n\t}\r\n\r\n\treturn input.currentAttacker;\r\n};\r\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { BgsPlayerEntity } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { FullGameState } from '../internal-game-state';
|
|
4
|
+
export interface SoCInput {
|
|
5
|
+
playerEntity: BgsPlayerEntity;
|
|
6
|
+
playerBoard: BoardEntity[];
|
|
7
|
+
opponentEntity: BgsPlayerEntity;
|
|
8
|
+
opponentBoard: BoardEntity[];
|
|
9
|
+
currentAttacker: number;
|
|
10
|
+
playerBoardBefore?: BoardEntity[];
|
|
11
|
+
opponentBoardBefore?: BoardEntity[];
|
|
12
|
+
gameState: FullGameState;
|
|
13
|
+
playerIsFriendly: boolean;
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-of-combat-input.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/start-of-combat-input.ts"],"names":[],"mappings":"","sourcesContent":["import { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { FullGameState } from '../internal-game-state';\r\n\r\nexport interface SoCInput {\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\tplayerIsFriendly: boolean;\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 handleStartOfCombat: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handleStartOfCombat = void 0;
|
|
4
|
+
const stats_1 = require("../stats");
|
|
5
|
+
const soc_anomalies_1 = require("./soc-anomalies");
|
|
6
|
+
const soc_hero_power_1 = require("./soc-hero-power");
|
|
7
|
+
const soc_illidan_hero_power_1 = require("./soc-illidan-hero-power");
|
|
8
|
+
const soc_minion_1 = require("./soc-minion");
|
|
9
|
+
const soc_pre_combat_hero_power_1 = require("./soc-pre-combat-hero-power");
|
|
10
|
+
const soc_quest_reward_1 = require("./soc-quest-reward");
|
|
11
|
+
const soc_secret_1 = require("./soc-secret");
|
|
12
|
+
const soc_trinket_1 = require("./soc-trinket");
|
|
13
|
+
const handleStartOfCombat = (playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState) => {
|
|
14
|
+
const shouldRecomputeCurrentAttacker = true;
|
|
15
|
+
if (shouldRecomputeCurrentAttacker) {
|
|
16
|
+
currentAttacker =
|
|
17
|
+
playerBoard.length > opponentBoard.length
|
|
18
|
+
? 0
|
|
19
|
+
: opponentBoard.length > playerBoard.length
|
|
20
|
+
? 1
|
|
21
|
+
: Math.round(Math.random());
|
|
22
|
+
}
|
|
23
|
+
const phases = [
|
|
24
|
+
'QuestReward',
|
|
25
|
+
'Anomalies',
|
|
26
|
+
'Trinket',
|
|
27
|
+
'PreCombatHeroPower',
|
|
28
|
+
'IllidanHeroPower',
|
|
29
|
+
'HeroPower',
|
|
30
|
+
'Secret',
|
|
31
|
+
'Minion',
|
|
32
|
+
];
|
|
33
|
+
let playerBoardBefore = playerBoard;
|
|
34
|
+
let opponentBoardBefore = opponentBoard;
|
|
35
|
+
for (const phase of phases) {
|
|
36
|
+
currentAttacker = handlePhase(phase, playerEntity, playerBoard, playerBoardBefore, opponentEntity, opponentBoard, opponentBoardBefore, currentAttacker, gameState);
|
|
37
|
+
if (phase === 'PreCombatHeroPower') {
|
|
38
|
+
playerBoardBefore = playerBoard.map((e) => ({ ...e }));
|
|
39
|
+
opponentBoardBefore = opponentBoard.map((e) => ({ ...e }));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
playerEntity.startOfCombatDone = true;
|
|
43
|
+
opponentEntity.startOfCombatDone = true;
|
|
44
|
+
(0, stats_1.applyAfterStatsUpdate)(gameState);
|
|
45
|
+
return currentAttacker;
|
|
46
|
+
};
|
|
47
|
+
exports.handleStartOfCombat = handleStartOfCombat;
|
|
48
|
+
const handlePhase = (phase, playerEntity, playerBoard, playerBoardBefore, opponentEntity, opponentBoard, opponentBoardBefore, currentAttacker, gameState) => {
|
|
49
|
+
switch (phase) {
|
|
50
|
+
case 'QuestReward':
|
|
51
|
+
return (0, soc_quest_reward_1.handleStartOfCombatQuestRewards)(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState);
|
|
52
|
+
case 'Anomalies':
|
|
53
|
+
return (0, soc_anomalies_1.handleStartOfCombatAnomalies)(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState);
|
|
54
|
+
case 'Trinket':
|
|
55
|
+
return (0, soc_trinket_1.handleStartOfCombatTrinkets)(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState);
|
|
56
|
+
case 'PreCombatHeroPower':
|
|
57
|
+
return (0, soc_pre_combat_hero_power_1.handlePreCombatHeroPowers)(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState);
|
|
58
|
+
case 'IllidanHeroPower':
|
|
59
|
+
return (0, soc_illidan_hero_power_1.handleIllidanHeroPowers)(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState);
|
|
60
|
+
case 'HeroPower':
|
|
61
|
+
return (0, soc_hero_power_1.handleStartOfCombatHeroPowers)(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState);
|
|
62
|
+
case 'Secret':
|
|
63
|
+
return (0, soc_secret_1.handleStartOfCombatSecrets)(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, gameState);
|
|
64
|
+
case 'Minion':
|
|
65
|
+
return (0, soc_minion_1.handleStartOfCombatMinions)(playerEntity, playerBoard, opponentEntity, opponentBoard, currentAttacker, playerBoardBefore, opponentBoardBefore, gameState);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=start-of-combat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-of-combat.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/start-of-combat.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { BgsPlayerEntity } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { FullGameState } from '../internal-game-state';\r\nimport { applyAfterStatsUpdate } from '../stats';\r\nimport { StartOfCombatPhase } from './phases';\r\nimport { handleStartOfCombatAnomalies } from './soc-anomalies';\r\nimport { handleStartOfCombatHeroPowers } from './soc-hero-power';\r\nimport { handleIllidanHeroPowers } from './soc-illidan-hero-power';\r\nimport { handleStartOfCombatMinions } from './soc-minion';\r\nimport { handlePreCombatHeroPowers } from './soc-pre-combat-hero-power';\r\nimport { handleStartOfCombatQuestRewards } from './soc-quest-reward';\r\nimport { handleStartOfCombatSecrets } from './soc-secret';\r\nimport { handleStartOfCombatTrinkets } from './soc-trinket';\r\n\r\n// TODO 20/04/2024: I'm not too sure about some ordering. The way I understand it, the Start of Combat has\r\n// multiple phases, and in each phase the player order is random\r\n// However, looking at http://replays.firestoneapp.com/?reviewId=a577602e-06f3-4c4b-928d-36ea98c2e6d5&turn=5&action=0,\r\n// it feels that a \"start of combat\" minion effect could trigger before an opponent's hero power effect\r\n// Or is that limited to Bru'kan?\r\n// I feel that I've asked a lot of questions recently, so I don't want to add that one to the list, as the interaction\r\n// is for now pretty marginal\r\nexport const handleStartOfCombat = (\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\tconst shouldRecomputeCurrentAttacker = true;\r\n\tif (shouldRecomputeCurrentAttacker) {\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\r\n\t// UPDATE 2024-10-10: changed in 30.6, according to a message from Mitchell on Discord\r\n\tconst phases: readonly StartOfCombatPhase[] = [\r\n\t\t'QuestReward',\r\n\t\t'Anomalies',\r\n\t\t'Trinket',\r\n\t\t// https://twitter.com/DCalkosz/status/1488361384320528388?s=20&t=1ECxRZFdjqwEa2fRsXk32Q\r\n\t\t// There’s a certain order for Start of Combat hero powers, rather than “coin flips” where\r\n\t\t// an unlucky trigger order could mess up some positioning you had planned for your own hero\r\n\t\t// power. “Precombat” (Al’Akir, Y’Shaarj), then Illidan, then others.\r\n\t\t// Update: this seems to have changed: https://x.com/LoewenMitchell/status/1737588920139825335?s=20\r\n\t\t// now you have all hero powers trigger in a first phase, then you have Illidan, and once everything has triggered, you have Tavish\r\n\t\t'PreCombatHeroPower',\r\n\t\t'IllidanHeroPower',\r\n\t\t'HeroPower',\r\n\t\t'Secret',\r\n\t\t'Minion',\r\n\t];\r\n\tlet playerBoardBefore = playerBoard;\r\n\tlet opponentBoardBefore = opponentBoard;\r\n\tfor (const phase of phases) {\r\n\t\tcurrentAttacker = handlePhase(\r\n\t\t\tphase,\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\tplayerBoardBefore,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\topponentBoardBefore,\r\n\t\t\tcurrentAttacker,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tif (phase === 'PreCombatHeroPower') {\r\n\t\t\tplayerBoardBefore = playerBoard.map((e) => ({ ...e }));\r\n\t\t\topponentBoardBefore = opponentBoard.map((e) => ({ ...e }));\r\n\t\t}\r\n\t}\r\n\tplayerEntity.startOfCombatDone = true;\r\n\topponentEntity.startOfCombatDone = true;\r\n\tapplyAfterStatsUpdate(gameState);\r\n\treturn currentAttacker;\r\n};\r\n\r\nconst handlePhase = (\r\n\tphase: StartOfCombatPhase,\r\n\tplayerEntity: BgsPlayerEntity,\r\n\tplayerBoard: BoardEntity[],\r\n\tplayerBoardBefore: BoardEntity[],\r\n\topponentEntity: BgsPlayerEntity,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardBefore: BoardEntity[],\r\n\tcurrentAttacker: number,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\tswitch (phase) {\r\n\t\tcase 'QuestReward':\r\n\t\t\treturn handleStartOfCombatQuestRewards(\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\tcurrentAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\tcase 'Anomalies':\r\n\t\t\treturn handleStartOfCombatAnomalies(\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\tcurrentAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\tcase 'Trinket':\r\n\t\t\treturn handleStartOfCombatTrinkets(\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\tcurrentAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\tcase 'PreCombatHeroPower':\r\n\t\t\treturn handlePreCombatHeroPowers(\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\tcurrentAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\tcase 'IllidanHeroPower':\r\n\t\t\treturn handleIllidanHeroPowers(\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\tcurrentAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\tcase 'HeroPower':\r\n\t\t\treturn handleStartOfCombatHeroPowers(\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\tcurrentAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\tcase 'Secret':\r\n\t\t\treturn handleStartOfCombatSecrets(\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\tcurrentAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\tcase 'Minion':\r\n\t\t\treturn handleStartOfCombatMinions(\r\n\t\t\t\tplayerEntity,\r\n\t\t\t\tplayerBoard,\r\n\t\t\t\topponentEntity,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\tcurrentAttacker,\r\n\t\t\t\tplayerBoardBefore,\r\n\t\t\t\topponentBoardBefore,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t}\r\n};\r\n"]}
|
|
@@ -45,8 +45,12 @@ const handleBoomControllerForPlayer = (trinket, playerBoard, playerEntity, oppon
|
|
|
45
45
|
if (!!candidate) {
|
|
46
46
|
const spawn = (0, utils_1.copyEntity)(candidate);
|
|
47
47
|
(0, add_minion_to_board_1.removeAurasFromSelf)(spawn, playerBoard, playerEntity, gameState);
|
|
48
|
+
const initialIndexFromLeft = candidate.indexFromLeftAtTimeOfDeath;
|
|
49
|
+
const indexFromRight = initialIndexFromLeft == null
|
|
50
|
+
? 0
|
|
51
|
+
: Math.min(playerBoard.length, Math.max(0, playerBoard.length - initialIndexFromLeft));
|
|
48
52
|
const target = (0, deathrattle_spawns_1.spawnEntities)(spawn.cardId, 1, playerBoard, playerEntity, opponentBoard, opponentEntity, gameState.allCards, gameState.cardsData, gameState.sharedState, gameState.spectator, playerEntity.friendly, true, false, false, spawn);
|
|
49
|
-
(0, spawns_1.performEntitySpawns)(target, playerBoard, playerEntity, playerEntity,
|
|
53
|
+
(0, spawns_1.performEntitySpawns)(target, playerBoard, playerEntity, playerEntity, indexFromRight, opponentBoard, opponentEntity, gameState);
|
|
50
54
|
target.forEach((t) => gameState.spectator.registerPowerTarget(playerEntity, t, playerBoard, playerEntity, opponentEntity));
|
|
51
55
|
trinket.scriptDataNum1 = 0;
|
|
52
56
|
}
|