@firestone-hs/simulate-bgs-battle 1.1.487 → 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/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 +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/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
|
@@ -12,6 +12,11 @@ const onDeathrattleTriggered = (input) => {
|
|
|
12
12
|
break;
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
|
+
input.boardWithDeadEntityHero.trinkets
|
|
16
|
+
.filter((t) => t.cardId === "BG30_MagicItem_700")
|
|
17
|
+
.forEach((t) => {
|
|
18
|
+
t.scriptDataNum1 = 0;
|
|
19
|
+
});
|
|
15
20
|
};
|
|
16
21
|
exports.onDeathrattleTriggered = onDeathrattleTriggered;
|
|
17
22
|
//# sourceMappingURL=deathrattle-on-trigger.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deathrattle-on-trigger.js","sourceRoot":"","sources":["../../src/simulation/deathrattle-on-trigger.ts"],"names":[],"mappings":";;;AAIA,mCAAiD;AAW1C,MAAM,sBAAsB,GAAG,CAAC,KAAgC,EAAE,EAAE;;IAC1E,MAAM,MAAM,GAAG,MAAA,KAAK,CAAC,uBAAuB,CAAC,aAAa,mCAAI,EAAE,CAAC;IACjE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC3B,QAAQ,KAAK,CAAC,MAAM,EAAE;YACrB;gBACC,IAAA,8BAAsB,EACrB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,EACL,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,MAAM;SACP;KACD;
|
|
1
|
+
{"version":3,"file":"deathrattle-on-trigger.js","sourceRoot":"","sources":["../../src/simulation/deathrattle-on-trigger.ts"],"names":[],"mappings":";;;AAIA,mCAAiD;AAW1C,MAAM,sBAAsB,GAAG,CAAC,KAAgC,EAAE,EAAE;;IAC1E,MAAM,MAAM,GAAG,MAAA,KAAK,CAAC,uBAAuB,CAAC,aAAa,mCAAI,EAAE,CAAC;IACjE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC3B,QAAQ,KAAK,CAAC,MAAM,EAAE;YACrB;gBACC,IAAA,8BAAsB,EACrB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,EACL,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,SAAS,CACf,CAAC;gBACF,MAAM;SACP;KACD;IAED,KAAK,CAAC,uBAAuB,CAAC,QAAQ;SACpC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,yBAAiD,CAAC;SACxE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACd,CAAC,CAAC,cAAc,GAAG,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AApBW,QAAA,sBAAsB,0BAoBjC","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { onQuestProgressUpdated } from './quest';\r\n\r\nexport interface DeathrattleTriggeredInput {\r\n\treadonly boardWithDeadEntity: BoardEntity[];\r\n\treadonly boardWithDeadEntityHero: BgsPlayerEntity;\r\n\treadonly deadEntity: BoardEntity;\r\n\treadonly otherBoard: BoardEntity[];\r\n\treadonly otherBoardHero: BgsPlayerEntity;\r\n\treadonly gameState: FullGameState;\r\n}\r\n\r\nexport const onDeathrattleTriggered = (input: DeathrattleTriggeredInput) => {\r\n\tconst quests = input.boardWithDeadEntityHero.questEntities ?? [];\r\n\tfor (const quest of quests) {\r\n\t\tswitch (quest.CardId) {\r\n\t\t\tcase CardIds.ExhumeTheBones:\r\n\t\t\t\tonQuestProgressUpdated(\r\n\t\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\t\tquest,\r\n\t\t\t\t\tinput.boardWithDeadEntity,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tinput.boardWithDeadEntityHero.trinkets\r\n\t\t.filter((t) => t.cardId === CardIds.DeathlyPhylactery_BG30_MagicItem_700)\r\n\t\t.forEach((t) => {\r\n\t\t\tt.scriptDataNum1 = 0;\r\n\t\t});\r\n};\r\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.afterDiscover = void 0;
|
|
4
|
+
const cards_in_hand_1 = require("./cards-in-hand");
|
|
4
5
|
const stats_1 = require("./stats");
|
|
5
6
|
const afterDiscover = (hero, board, picked, ignored, gameState) => {
|
|
6
7
|
if (!(ignored === null || ignored === void 0 ? void 0 : ignored.length)) {
|
|
@@ -21,6 +22,11 @@ const afterDiscover = (hero, board, picked, ignored, gameState) => {
|
|
|
21
22
|
break;
|
|
22
23
|
}
|
|
23
24
|
}
|
|
25
|
+
const primalfinPortraits = hero.trinkets.filter((t) => t.cardId === "BG30_MagicItem_702").length;
|
|
26
|
+
if (!!primalfinPortraits) {
|
|
27
|
+
const cardsToAdd = new Array(primalfinPortraits).fill(null);
|
|
28
|
+
(0, cards_in_hand_1.addCardsInHand)(hero, board, cardsToAdd, gameState);
|
|
29
|
+
}
|
|
24
30
|
};
|
|
25
31
|
exports.afterDiscover = afterDiscover;
|
|
26
32
|
//# sourceMappingURL=discover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/simulation/discover.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"discover.js","sourceRoot":"","sources":["../../src/simulation/discover.ts"],"names":[],"mappings":";;;AAGA,mDAAiD;AAEjD,mCAAsC;AAE/B,MAAM,aAAa,GAAG,CAC5B,IAAqB,EACrB,KAAoB,EACpB,MAAc,EACd,OAAiB,EACjB,SAAwB,EACvB,EAAE;IACH,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAA,EAAE;QACrB,OAAO;KACP;IAED,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE;QAC3B,QAAQ,MAAM,CAAC,MAAM,EAAE;YACtB,gBAAqC;YACrC;gBACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,eAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnF,MAAM,eAAe,GAAG,OAAO;qBAC7B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;qBAC1D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7B,MAAM,eAAe,GAAG,OAAO;qBAC7B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;qBAC1D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7B,IAAA,mBAAW,EACV,MAAM,EACN,eAAe,GAAG,gBAAgB,EAClC,eAAe,GAAG,gBAAgB,EAClC,KAAK,EACL,IAAI,EACJ,SAAS,CACT,CAAC;gBACF,MAAM;SACP;KACD;IAED,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,yBAAiD,CAChE,CAAC,MAAM,CAAC;IACT,IAAI,CAAC,CAAC,kBAAkB,EAAE;QACzB,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAA,8BAAc,EAAC,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;KACnD;AACF,CAAC,CAAC;AAzCW,QAAA,aAAa,iBAyCxB","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { addCardsInHand } from './cards-in-hand';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const afterDiscover = (\r\n\thero: BgsPlayerEntity,\r\n\tboard: BoardEntity[],\r\n\tpicked: string,\r\n\tignored: string[],\r\n\tgameState: FullGameState,\r\n) => {\r\n\tif (!ignored?.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tfor (const entity of board) {\r\n\t\tswitch (entity.cardId) {\r\n\t\t\tcase CardIds.DepravedFelfin_BG30_115:\r\n\t\t\tcase CardIds.DepravedFelfin_BG30_115_G:\r\n\t\t\t\tconst felfinMultiplier = entity.cardId === CardIds.DepravedFelfin_BG30_115 ? 1 : 2;\r\n\t\t\t\tconst baseTotalAttack = ignored\r\n\t\t\t\t\t.map((cardId) => gameState.allCards.getCard(cardId).attack)\r\n\t\t\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\t\t\tconst baseTotalHealth = ignored\r\n\t\t\t\t\t.map((cardId) => gameState.allCards.getCard(cardId).health)\r\n\t\t\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\t\t\tmodifyStats(\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tbaseTotalAttack * felfinMultiplier,\r\n\t\t\t\t\tbaseTotalHealth * felfinMultiplier,\r\n\t\t\t\t\tboard,\r\n\t\t\t\t\thero,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tconst primalfinPortraits = hero.trinkets.filter(\r\n\t\t(t) => t.cardId === CardIds.PrimalfinPortrait_BG30_MagicItem_702,\r\n\t).length;\r\n\tif (!!primalfinPortraits) {\r\n\t\tconst cardsToAdd = new Array(primalfinPortraits).fill(null);\r\n\t\taddCardsInHand(hero, board, cardsToAdd, gameState);\r\n\t}\r\n};\r\n"]}
|
|
@@ -5,8 +5,9 @@ const reference_data_1 = require("@firestone-hs/reference-data");
|
|
|
5
5
|
const stats_1 = require("./stats");
|
|
6
6
|
const magnetizeToTarget = (target, cardIdToMagnetize, board, hero, gameState) => {
|
|
7
7
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
8
|
+
const electromagneticDevices = hero.trinkets.filter((t) => t.cardId === "BG30_MagicItem_709").length;
|
|
8
9
|
const modularCard = gameState.allCards.getCard(cardIdToMagnetize);
|
|
9
|
-
(0, stats_1.modifyStats)(target, modularCard.attack, modularCard.health, board, hero, gameState);
|
|
10
|
+
(0, stats_1.modifyStats)(target, modularCard.attack + 2 * electromagneticDevices, modularCard.health + 2 * electromagneticDevices, board, hero, gameState);
|
|
10
11
|
target.taunt = target.taunt || ((_a = modularCard.mechanics) === null || _a === void 0 ? void 0 : _a.includes(reference_data_1.GameTag[reference_data_1.GameTag.TAUNT]));
|
|
11
12
|
target.divineShield = target.divineShield || ((_b = modularCard.mechanics) === null || _b === void 0 ? void 0 : _b.includes(reference_data_1.GameTag[reference_data_1.GameTag.DIVINE_SHIELD]));
|
|
12
13
|
target.poisonous = target.poisonous || ((_c = modularCard.mechanics) === null || _c === void 0 ? void 0 : _c.includes(reference_data_1.GameTag[reference_data_1.GameTag.POISONOUS]));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magnetize.js","sourceRoot":"","sources":["../../src/simulation/magnetize.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"magnetize.js","sourceRoot":"","sources":["../../src/simulation/magnetize.ts"],"names":[],"mappings":";;;AAAA,iEAAgE;AAIhE,mCAAsC;AAE/B,MAAM,iBAAiB,GAAG,CAChC,MAAmB,EACnB,iBAAyB,EACzB,KAAoB,EACpB,IAAqB,EACrB,SAAwB,EACvB,EAAE;;IACH,MAAM,sBAAsB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAClD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,yBAAqD,CACpE,CAAC,MAAM,CAAC;IACT,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAClE,IAAA,mBAAW,EACV,MAAM,EACN,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,sBAAsB,EAC/C,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,sBAAsB,EAC/C,KAAK,EACL,IAAI,EACJ,SAAS,CACT,CAAC;IACF,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,KAAI,MAAA,WAAW,CAAC,SAAS,0CAAE,QAAQ,CAAC,wBAAO,CAAC,wBAAO,CAAC,KAAK,CAAC,CAAC,CAAA,CAAC;IACvF,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,KAAI,MAAA,WAAW,CAAC,SAAS,0CAAE,QAAQ,CAAC,wBAAO,CAAC,wBAAO,CAAC,aAAa,CAAC,CAAC,CAAA,CAAC;IAC7G,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,KAAI,MAAA,WAAW,CAAC,SAAS,0CAAE,QAAQ,CAAC,wBAAO,CAAC,wBAAO,CAAC,SAAS,CAAC,CAAC,CAAA,CAAC;IACnG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAI,MAAA,WAAW,CAAC,SAAS,0CAAE,QAAQ,CAAC,wBAAO,CAAC,wBAAO,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAC;IAChG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,KAAI,MAAA,WAAW,CAAC,SAAS,0CAAE,QAAQ,CAAC,wBAAO,CAAC,wBAAO,CAAC,QAAQ,CAAC,CAAC,CAAA,CAAC;IAChG,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,KAAI,MAAA,WAAW,CAAC,SAAS,0CAAE,QAAQ,CAAC,wBAAO,CAAC,wBAAO,CAAC,MAAM,CAAC,CAAC,CAAA,CAAC;IAC1F,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,KAAI,MAAA,WAAW,CAAC,SAAS,0CAAE,QAAQ,CAAC,wBAAO,CAAC,wBAAO,CAAC,OAAO,CAAC,CAAC,CAAA,CAAC;IAE7F,MAAM,mBAAmB,GAAG,WAAW,CAAC,gBAAgB,CAAC;IACzD,IAAI,mBAAmB,EAAE;QACxB,MAAM,WAAW,GAAG,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC;QACvE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,WAAW;YACnB,cAAc,EAAE,WAAW,CAAC,KAAK;YACjC,MAAM,EAAE,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE;SAC/C,CAAC,CAAC;KACH;AACF,CAAC,CAAC;AApCW,QAAA,iBAAiB,qBAoC5B","sourcesContent":["import { CardIds, GameTag } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { modifyStats } from './stats';\r\n\r\nexport const magnetizeToTarget = (\r\n\ttarget: BoardEntity,\r\n\tcardIdToMagnetize: string,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst electromagneticDevices = hero.trinkets.filter(\r\n\t\t(t) => t.cardId === CardIds.ElectromagneticDevice_BG30_MagicItem_709,\r\n\t).length;\r\n\tconst modularCard = gameState.allCards.getCard(cardIdToMagnetize);\r\n\tmodifyStats(\r\n\t\ttarget,\r\n\t\tmodularCard.attack + 2 * electromagneticDevices,\r\n\t\tmodularCard.health + 2 * electromagneticDevices,\r\n\t\tboard,\r\n\t\thero,\r\n\t\tgameState,\r\n\t);\r\n\ttarget.taunt = target.taunt || modularCard.mechanics?.includes(GameTag[GameTag.TAUNT]);\r\n\ttarget.divineShield = target.divineShield || modularCard.mechanics?.includes(GameTag[GameTag.DIVINE_SHIELD]);\r\n\ttarget.poisonous = target.poisonous || modularCard.mechanics?.includes(GameTag[GameTag.POISONOUS]);\r\n\ttarget.venomous = target.venomous || modularCard.mechanics?.includes(GameTag[GameTag.VENOMOUS]);\r\n\ttarget.windfury = target.windfury || modularCard.mechanics?.includes(GameTag[GameTag.WINDFURY]);\r\n\ttarget.reborn = target.reborn || modularCard.mechanics?.includes(GameTag[GameTag.REBORN]);\r\n\ttarget.stealth = target.stealth || modularCard.mechanics?.includes(GameTag[GameTag.STEALTH]);\r\n\r\n\tconst magneticEnchantment = modularCard.enchantmentDbfId;\r\n\tif (magneticEnchantment) {\r\n\t\tconst enchantment = gameState.allCards.getCard(magneticEnchantment).id;\r\n\t\ttarget.enchantments.push({\r\n\t\t\tcardId: enchantment,\r\n\t\t\toriginEntityId: modularCard.dbfId,\r\n\t\t\ttiming: gameState.sharedState.currentEntityId++,\r\n\t\t});\r\n\t}\r\n};\r\n"]}
|
|
@@ -21,16 +21,6 @@ const handleMinionRemovedAuraEffect = (board, removed, boardHero, allCards, spec
|
|
|
21
21
|
e.attack = Math.max(0, e.attack - diff);
|
|
22
22
|
});
|
|
23
23
|
break;
|
|
24
|
-
case "BG26_805":
|
|
25
|
-
case "BG26_805_G":
|
|
26
|
-
board
|
|
27
|
-
.filter((e) => (0, utils_1.hasCorrectTribe)(e, boardHero, reference_data_1.Race.BEAST, allCards))
|
|
28
|
-
.filter((e) => e.entityId !== removed.entityId)
|
|
29
|
-
.forEach((e) => {
|
|
30
|
-
const diff = removed.cardId === "BG26_805_G" ? 4 : 2;
|
|
31
|
-
e.attack = Math.max(0, e.attack - diff);
|
|
32
|
-
});
|
|
33
|
-
break;
|
|
34
24
|
case "BG_NEW1_027":
|
|
35
25
|
case "TB_BaconUps_136":
|
|
36
26
|
board
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remove-minion-from-board.js","sourceRoot":"","sources":["../../src/simulation/remove-minion-from-board.ts"],"names":[],"mappings":";;;AAAA,iEAA8E;AAG9E,oCAA2C;AAC3C,mCAA+C;AAIxC,MAAM,qBAAqB,GAAG,CACpC,KAAoB,EACpB,SAA0B,EAC1B,KAAa,EACb,SAAwB,EACjB,EAAE;IACT,MAAM,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,IAAA,qCAA6B,EAAC,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACxG,IAAA,4BAAoB,EAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACnD,CAAC,CAAC;AATW,QAAA,qBAAqB,yBAShC;AAEK,MAAM,6BAA6B,GAAG,CAC5C,KAAoB,EACpB,OAAoB,EACpB,SAA0B,EAC1B,QAAyB,EACzB,SAAoB,EACb,EAAE;IACT,QAAQ,OAAO,CAAC,MAAM,EAAE;QACvB,kBAA8C;QAC9C;YACC,KAAK;iBACH,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,uBAAe,EAAC,CAAC,EAAE,SAAS,EAAE,qBAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;iBACnE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBACd,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,sBAAkD,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtF,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YACJ,MAAM;QACP,
|
|
1
|
+
{"version":3,"file":"remove-minion-from-board.js","sourceRoot":"","sources":["../../src/simulation/remove-minion-from-board.ts"],"names":[],"mappings":"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","sourcesContent":["import { AllCardsService, CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasCorrectTribe } from '../utils';\r\nimport { updateBoardwideAuras } from './auras';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { Spectator } from './spectator/spectator';\r\n\r\nexport const removeMinionFromBoard = (\r\n\tboard: BoardEntity[],\r\n\tboardHero: BgsPlayerEntity,\r\n\tindex: number,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tconst removedEntity = board.splice(index, 1)[0];\r\n\thandleMinionRemovedAuraEffect(board, removedEntity, boardHero, gameState.allCards, gameState.spectator);\r\n\tupdateBoardwideAuras(board, boardHero, gameState);\r\n};\r\n\r\nexport const handleMinionRemovedAuraEffect = (\r\n\tboard: BoardEntity[],\r\n\tremoved: BoardEntity,\r\n\tboardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tswitch (removed.cardId) {\r\n\t\tcase CardIds.MurlocWarleaderLegacy_BG_EX1_507:\r\n\t\tcase CardIds.MurlocWarleaderLegacy_TB_BaconUps_008:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.MURLOC, allCards))\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tconst diff = removed.cardId === CardIds.MurlocWarleaderLegacy_TB_BaconUps_008 ? 4 : 2;\r\n\t\t\t\t\te.attack = Math.max(0, e.attack - diff);\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SouthseaCaptainLegacy_BG_NEW1_027:\r\n\t\tcase CardIds.SouthseaCaptainLegacy_TB_BaconUps_136:\r\n\t\t\t// console.debug('removing southsea captain', stringifySimpleCard(removed, allCards), stringifySimple(board, allCards));\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.PIRATE, allCards))\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tconst diff = removed.cardId === CardIds.SouthseaCaptainLegacy_TB_BaconUps_136 ? 2 : 1;\r\n\t\t\t\t\te.attack = Math.max(0, e.attack - diff);\r\n\t\t\t\t\te.health = Math.max(1, e.health - diff);\r\n\t\t\t\t});\r\n\t\t\t// console.debug('after removing southsea captain', stringifySimpleCard(removed, allCards), stringifySimple(board, allCards));\r\n\t\t\tbreak;\r\n\t\tcase CardIds.Kathranatir_BG21_039:\r\n\t\tcase CardIds.Kathranatir_BG21_039_G:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.DEMON, allCards))\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tconst diff = removed.cardId === CardIds.Kathranatir_BG21_039_G ? 4 : 2;\r\n\t\t\t\t\te.attack = Math.max(0, e.attack - diff);\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.CyborgDrake_BG25_043:\r\n\t\tcase CardIds.CyborgDrake_BG25_043_G:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => e.divineShield)\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tconst diff = removed.cardId === CardIds.CyborgDrake_BG25_043_G ? 12 : 6;\r\n\t\t\t\t\te.attack = Math.max(0, e.attack - diff);\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t\tcase CardIds.SoreLoser_BG27_030:\r\n\t\tcase CardIds.SoreLoser_BG27_030_G:\r\n\t\t\tboard\r\n\t\t\t\t.filter((e) => hasCorrectTribe(e, boardHero, Race.UNDEAD, allCards))\r\n\t\t\t\t.forEach((e) => {\r\n\t\t\t\t\tconst diff = (removed.cardId === CardIds.SoreLoser_BG27_030_G ? 2 : 1) * boardHero.tavernTier;\r\n\t\t\t\t\te.attack = Math.max(0, e.attack - diff);\r\n\t\t\t\t});\r\n\t\t\tbreak;\r\n\t}\r\n};\r\n"]}
|
|
@@ -6,7 +6,7 @@ const debug_state_1 = require("../debug-state");
|
|
|
6
6
|
const utils_1 = require("../utils");
|
|
7
7
|
const attack_1 = require("./attack");
|
|
8
8
|
const auras_1 = require("./auras");
|
|
9
|
-
const start_of_combat_1 = require("./start-of-combat");
|
|
9
|
+
const start_of_combat_1 = require("./start-of-combat/start-of-combat");
|
|
10
10
|
const summon_when_space_1 = require("./summon-when-space");
|
|
11
11
|
class Simulator {
|
|
12
12
|
constructor(gameState) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simulator.js","sourceRoot":"","sources":["../../src/simulation/simulator.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEffectiveTechLevel } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { debugState } from '../debug-state';\r\nimport { SingleSimulationResult } from '../single-simulation-result';\r\nimport { stringifySimple } from '../utils';\r\nimport { simulateAttack } from './attack';\r\nimport { clearStealthIfNeeded } from './auras';\r\nimport { FullGameState, PlayerState } from './internal-game-state';\r\nimport { handleStartOfCombat } from './start-of-combat';\r\nimport { handleSummonsWhenSpace } from './summon-when-space';\r\n\r\n// New simulator should be instantiated for each match\r\nexport class Simulator {\r\n\tprivate currentAttacker: number;\r\n\tprivate currentSpeedAttacker = -1;\r\n\r\n\tprivate hasShowShortCircuitWarning = false;\r\n\r\n\t// It should come already initialized\r\n\tconstructor(private readonly gameState: FullGameState) {}\r\n\r\n\t// Here we suppose that the BoardEntity only contain at most the enchantments that are linked\r\n\t// to auras (so we probably should hand-filter that, since there are actually few auras)\r\n\tpublic simulateSingleBattle(playerState: PlayerState, opponentState: PlayerState): SingleSimulationResult {\r\n\t\tlet playerBoard: BoardEntity[] = playerState.board;\r\n\t\tlet playerEntity: BgsPlayerEntity = playerState.player;\r\n\t\tlet opponentBoard: BoardEntity[] = opponentState.board;\r\n\t\tlet opponentEntity: BgsPlayerEntity = opponentState.player;\r\n\t\twhile (\r\n\t\t\t!playerEntity.startOfCombatDone ||\r\n\t\t\t!opponentEntity.startOfCombatDone ||\r\n\t\t\t(playerBoard?.length > 0 && opponentBoard?.length > 0)\r\n\t\t) {\r\n\t\t\tthis.simulateSingleBattlePass(playerBoard, playerEntity, opponentBoard, opponentEntity);\r\n\r\n\t\t\t// The only case where there can only 0-attack minions on a board is when both boards\r\n\t\t\t// are that way (otherwise one side would kill the other)\r\n\t\t\tconst areBothBoards0Attack =\r\n\t\t\t\tplayerState.board.length > 0 &&\r\n\t\t\t\tplayerState.board.every((entity) => entity.attack === 0) &&\r\n\t\t\t\topponentState.board.length > 0 &&\r\n\t\t\t\topponentState.board.every((entity) => entity.attack === 0);\r\n\t\t\tconst isPlayerBoardEmpty = playerState.board.length === 0;\r\n\t\t\tconst isOpponentBoardEmpty = opponentState.board.length === 0;\r\n\t\t\tplayerBoard = areBothBoards0Attack || isPlayerBoardEmpty ? playerState.teammate?.board : playerState.board;\r\n\t\t\tplayerEntity =\r\n\t\t\t\tareBothBoards0Attack || isPlayerBoardEmpty ? playerState.teammate?.player : playerState.player;\r\n\t\t\topponentBoard =\r\n\t\t\t\tareBothBoards0Attack || isOpponentBoardEmpty ? opponentState.teammate?.board : opponentState.board;\r\n\t\t\topponentEntity =\r\n\t\t\t\tareBothBoards0Attack || isOpponentBoardEmpty ? opponentState.teammate?.player : opponentState.player;\r\n\t\t\t// So that gameState.player always refers to the active player\r\n\t\t\tif (isPlayerBoardEmpty) {\r\n\t\t\t\t// Reset deaths\r\n\t\t\t\tthis.gameState.sharedState.deaths = this.gameState.sharedState.deaths.filter(\r\n\t\t\t\t\t(e) => e.friendly !== this.gameState.gameState.player.player.friendly,\r\n\t\t\t\t);\r\n\t\t\t\tthis.gameState.gameState.player.teammate = {\r\n\t\t\t\t\tboard: this.gameState.gameState.player.board,\r\n\t\t\t\t\tplayer: this.gameState.gameState.player.player,\r\n\t\t\t\t};\r\n\t\t\t\tthis.gameState.gameState.player.player = playerEntity;\r\n\t\t\t\tthis.gameState.gameState.player.board = playerBoard;\r\n\r\n\t\t\t\t// const initialPlayer = this.gameState.gameState.playerInitial;\r\n\t\t\t\t// const initialPlayerTeammate = initialPlayer.teammate;\r\n\t\t\t}\r\n\t\t\tif (isOpponentBoardEmpty) {\r\n\t\t\t\t// Reset deaths\r\n\t\t\t\tthis.gameState.sharedState.deaths = this.gameState.sharedState.deaths.filter(\r\n\t\t\t\t\t(e) => e.friendly !== this.gameState.gameState.opponent.player.friendly,\r\n\t\t\t\t);\r\n\t\t\t\tthis.gameState.gameState.opponent.teammate = {\r\n\t\t\t\t\tboard: this.gameState.gameState.opponent.board,\r\n\t\t\t\t\tplayer: this.gameState.gameState.opponent.player,\r\n\t\t\t\t};\r\n\t\t\t\tthis.gameState.gameState.opponent.player = opponentEntity;\r\n\t\t\t\tthis.gameState.gameState.opponent.board = opponentBoard;\r\n\t\t\t}\r\n\r\n\t\t\tif (!playerEntity || !opponentEntity) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t(!playerBoard?.length && !opponentBoard?.length) ||\r\n\t\t\t// E.g. when both players have a 0-attack minion\r\n\t\t\t(playerBoard?.length > 0 && opponentBoard?.length > 0)\r\n\t\t) {\r\n\t\t\treturn {\r\n\t\t\t\tresult: 'tied',\r\n\t\t\t} as SingleSimulationResult;\r\n\t\t}\r\n\t\tif (!playerBoard?.length) {\r\n\t\t\tconst damage =\r\n\t\t\t\tthis.buildBoardTotalDamage(opponentBoard, this.gameState.gameState.opponent?.teammate?.board) +\r\n\t\t\t\topponentEntity.tavernTier;\r\n\t\t\tthis.gameState.spectator.registerOpponentAttack(playerBoard, opponentBoard, damage);\r\n\t\t\treturn {\r\n\t\t\t\tresult: 'lost',\r\n\t\t\t\tdamageDealt: damage,\r\n\t\t\t};\r\n\t\t}\r\n\t\tconst damage =\r\n\t\t\tthis.buildBoardTotalDamage(playerBoard, this.gameState.gameState.player?.teammate?.board) +\r\n\t\t\tplayerEntity.tavernTier;\r\n\t\tthis.gameState.spectator.registerPlayerAttack(playerBoard, opponentBoard, damage);\r\n\t\treturn {\r\n\t\t\tresult: 'won',\r\n\t\t\tdamageDealt: damage,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate simulateSingleBattlePass(\r\n\t\tplayerBoard: BoardEntity[],\r\n\t\tplayerEntity: BgsPlayerEntity,\r\n\t\topponentBoard: BoardEntity[],\r\n\t\topponentEntity: BgsPlayerEntity,\r\n\t) {\r\n\t\tif (debugState?.active) {\r\n\t\t\tdebugState.onBattleStart();\r\n\t\t}\r\n\t\t// Start of combat happens only once, so we need to flag whether it has already happened for a\r\n\t\t// given player\r\n\t\tthis.gameState.spectator.registerStartOfCombat(playerBoard, opponentBoard, playerEntity, opponentEntity);\r\n\r\n\t\t// Who attacks first is decided by the game before the hero power comes into effect. However, the full board (with the generated minion)\r\n\t\t// is sent tothe simulator\r\n\t\t// But in fact, the first player decision takes into account that additional minion. See\r\n\t\t// https://replays.firestoneapp.com/?reviewId=ddbbbe93-464b-4400-8e8d-4abca8680a2e\r\n\t\tconst effectivePlayerBoardLength = playerBoard.length;\r\n\t\tconst effectiveOpponentBoardLength = opponentBoard.length;\r\n\t\tthis.currentAttacker =\r\n\t\t\teffectivePlayerBoardLength > effectiveOpponentBoardLength\r\n\t\t\t\t? 0\r\n\t\t\t\t: effectiveOpponentBoardLength > effectivePlayerBoardLength\r\n\t\t\t\t? 1\r\n\t\t\t\t: Math.round(Math.random());\r\n\t\tthis.gameState.sharedState.currentEntityId =\r\n\t\t\tMath.max(\r\n\t\t\t\t...playerBoard.map((entity) => entity.entityId),\r\n\t\t\t\t...opponentBoard.map((entity) => entity.entityId),\r\n\t\t\t\t...(playerEntity.hand?.map((entity) => entity.entityId) ?? []),\r\n\t\t\t\t...(opponentEntity.hand?.map((entity) => entity.entityId) ?? []),\r\n\t\t\t) + 1;\r\n\t\tconst suggestedNewCurrentAttacker = handleStartOfCombat(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tthis.currentAttacker,\r\n\t\t\tthis.gameState,\r\n\t\t);\r\n\t\tthis.currentAttacker = suggestedNewCurrentAttacker;\r\n\t\tlet counter = 0;\r\n\t\tif (debugState?.active) {\r\n\t\t\tthis.currentAttacker = debugState.forcedCurrentAttacker ?? this.currentAttacker;\r\n\t\t}\r\n\t\twhile (playerBoard.length > 0 && opponentBoard.length > 0) {\r\n\t\t\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, this.gameState);\r\n\t\t\tclearStealthIfNeeded(playerBoard, opponentBoard);\r\n\t\t\t// console.log('this.currentSpeedAttacker', this.currentAttacker);\r\n\t\t\t// If there are \"attack immediately\" minions, we keep the same player\r\n\t\t\t// We put it here so that it can kick in after the start of combat effects. However here we don't want\r\n\t\t\t// to change who attacks first, so we repeat that block again after all the attacks have been resolved\r\n\t\t\t// FIXME: This is not strictly correct - if there are multiple attack immediately\r\n\t\t\t// minions that spawn on both player sides it might get a bit more complex\r\n\t\t\t// but overall it works\r\n\t\t\t// Also, this doesn't work when there are several deathrattle competing\r\n\t\t\t// to know who triggers first. See the second test case of the scallywag.test.ts\r\n\t\t\t// that is not handled properly today (the attack should in some cases happen before\r\n\t\t\t// the other deathrattle procs)\r\n\t\t\tif (playerBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 0;\r\n\t\t\t} else if (opponentBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentSpeedAttacker = -1;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tplayerBoard.filter((e) => e.attack > 0).length === 0 &&\r\n\t\t\t\topponentBoard.filter((e) => e.attack > 0).length === 0\r\n\t\t\t) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// console.log('this.currentSpeedAttacker 2', this.currentAttacker, this.currentSpeedAttacker);\r\n\t\t\tif (this.currentSpeedAttacker === 0 || (this.currentSpeedAttacker === -1 && this.currentAttacker === 0)) {\r\n\t\t\t\tsimulateAttack(playerBoard, playerEntity, opponentBoard, opponentEntity, this.gameState);\r\n\t\t\t} else {\r\n\t\t\t\tsimulateAttack(opponentBoard, opponentEntity, playerBoard, playerEntity, this.gameState);\r\n\t\t\t}\r\n\r\n\t\t\t// Update the attacker indices in case there were some deaths\r\n\t\t\tif (playerBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 0;\r\n\t\t\t} else if (opponentBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentSpeedAttacker = -1;\r\n\t\t\t\tthis.currentAttacker = (this.currentAttacker + 1) % 2;\r\n\t\t\t}\r\n\t\t\tcounter++;\r\n\t\t\tif (counter > 400 && !this.hasShowShortCircuitWarning) {\r\n\t\t\t\tconsole.warn(\r\n\t\t\t\t\t'short-circuiting simulation, too many iterations',\r\n\t\t\t\t\tcounter,\r\n\t\t\t\t\t'\\n',\r\n\t\t\t\t\tstringifySimple(playerBoard, this.gameState.allCards),\r\n\t\t\t\t\t'\\n',\r\n\t\t\t\t\tstringifySimple(opponentBoard, this.gameState.allCards),\r\n\t\t\t\t);\r\n\t\t\t\tthis.hasShowShortCircuitWarning = true;\r\n\t\t\t\tbreak;\r\n\t\t\t\t// return null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate buildBoardTotalDamage(playerBoard: readonly BoardEntity[], teammateBoard?: BoardEntity[]): number {\r\n\t\tconst damageFromPlayerBoard = playerBoard\r\n\t\t\t.map((entity) =>\r\n\t\t\t\tgetEffectiveTechLevel(this.gameState.allCards.getCard(entity.cardId), this.gameState.allCards),\r\n\t\t\t)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst numberOfTeamateMinionsToSummnon = 7 - playerBoard.length;\r\n\t\tconst damageFromTeammateBoard =\r\n\t\t\tteammateBoard\r\n\t\t\t\t?.slice(0, numberOfTeamateMinionsToSummnon)\r\n\t\t\t\t.map((entity) =>\r\n\t\t\t\t\tgetEffectiveTechLevel(this.gameState.allCards.getCard(entity.cardId), this.gameState.allCards),\r\n\t\t\t\t)\r\n\t\t\t\t.reduce((a, b) => a + b, 0) ?? 0;\r\n\t\treturn damageFromPlayerBoard + damageFromTeammateBoard;\r\n\t}\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"simulator.js","sourceRoot":"","sources":["../../src/simulation/simulator.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEffectiveTechLevel } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { debugState } from '../debug-state';\r\nimport { SingleSimulationResult } from '../single-simulation-result';\r\nimport { stringifySimple } from '../utils';\r\nimport { simulateAttack } from './attack';\r\nimport { clearStealthIfNeeded } from './auras';\r\nimport { FullGameState, PlayerState } from './internal-game-state';\r\nimport { handleStartOfCombat } from './start-of-combat/start-of-combat';\r\nimport { handleSummonsWhenSpace } from './summon-when-space';\r\n\r\n// New simulator should be instantiated for each match\r\nexport class Simulator {\r\n\tprivate currentAttacker: number;\r\n\tprivate currentSpeedAttacker = -1;\r\n\r\n\tprivate hasShowShortCircuitWarning = false;\r\n\r\n\t// It should come already initialized\r\n\tconstructor(private readonly gameState: FullGameState) {}\r\n\r\n\t// Here we suppose that the BoardEntity only contain at most the enchantments that are linked\r\n\t// to auras (so we probably should hand-filter that, since there are actually few auras)\r\n\tpublic simulateSingleBattle(playerState: PlayerState, opponentState: PlayerState): SingleSimulationResult {\r\n\t\tlet playerBoard: BoardEntity[] = playerState.board;\r\n\t\tlet playerEntity: BgsPlayerEntity = playerState.player;\r\n\t\tlet opponentBoard: BoardEntity[] = opponentState.board;\r\n\t\tlet opponentEntity: BgsPlayerEntity = opponentState.player;\r\n\t\twhile (\r\n\t\t\t!playerEntity.startOfCombatDone ||\r\n\t\t\t!opponentEntity.startOfCombatDone ||\r\n\t\t\t(playerBoard?.length > 0 && opponentBoard?.length > 0)\r\n\t\t) {\r\n\t\t\tthis.simulateSingleBattlePass(playerBoard, playerEntity, opponentBoard, opponentEntity);\r\n\r\n\t\t\t// The only case where there can only 0-attack minions on a board is when both boards\r\n\t\t\t// are that way (otherwise one side would kill the other)\r\n\t\t\tconst areBothBoards0Attack =\r\n\t\t\t\tplayerState.board.length > 0 &&\r\n\t\t\t\tplayerState.board.every((entity) => entity.attack === 0) &&\r\n\t\t\t\topponentState.board.length > 0 &&\r\n\t\t\t\topponentState.board.every((entity) => entity.attack === 0);\r\n\t\t\tconst isPlayerBoardEmpty = playerState.board.length === 0;\r\n\t\t\tconst isOpponentBoardEmpty = opponentState.board.length === 0;\r\n\t\t\tplayerBoard = areBothBoards0Attack || isPlayerBoardEmpty ? playerState.teammate?.board : playerState.board;\r\n\t\t\tplayerEntity =\r\n\t\t\t\tareBothBoards0Attack || isPlayerBoardEmpty ? playerState.teammate?.player : playerState.player;\r\n\t\t\topponentBoard =\r\n\t\t\t\tareBothBoards0Attack || isOpponentBoardEmpty ? opponentState.teammate?.board : opponentState.board;\r\n\t\t\topponentEntity =\r\n\t\t\t\tareBothBoards0Attack || isOpponentBoardEmpty ? opponentState.teammate?.player : opponentState.player;\r\n\t\t\t// So that gameState.player always refers to the active player\r\n\t\t\tif (isPlayerBoardEmpty) {\r\n\t\t\t\t// Reset deaths\r\n\t\t\t\tthis.gameState.sharedState.deaths = this.gameState.sharedState.deaths.filter(\r\n\t\t\t\t\t(e) => e.friendly !== this.gameState.gameState.player.player.friendly,\r\n\t\t\t\t);\r\n\t\t\t\tthis.gameState.gameState.player.teammate = {\r\n\t\t\t\t\tboard: this.gameState.gameState.player.board,\r\n\t\t\t\t\tplayer: this.gameState.gameState.player.player,\r\n\t\t\t\t};\r\n\t\t\t\tthis.gameState.gameState.player.player = playerEntity;\r\n\t\t\t\tthis.gameState.gameState.player.board = playerBoard;\r\n\r\n\t\t\t\t// const initialPlayer = this.gameState.gameState.playerInitial;\r\n\t\t\t\t// const initialPlayerTeammate = initialPlayer.teammate;\r\n\t\t\t}\r\n\t\t\tif (isOpponentBoardEmpty) {\r\n\t\t\t\t// Reset deaths\r\n\t\t\t\tthis.gameState.sharedState.deaths = this.gameState.sharedState.deaths.filter(\r\n\t\t\t\t\t(e) => e.friendly !== this.gameState.gameState.opponent.player.friendly,\r\n\t\t\t\t);\r\n\t\t\t\tthis.gameState.gameState.opponent.teammate = {\r\n\t\t\t\t\tboard: this.gameState.gameState.opponent.board,\r\n\t\t\t\t\tplayer: this.gameState.gameState.opponent.player,\r\n\t\t\t\t};\r\n\t\t\t\tthis.gameState.gameState.opponent.player = opponentEntity;\r\n\t\t\t\tthis.gameState.gameState.opponent.board = opponentBoard;\r\n\t\t\t}\r\n\r\n\t\t\tif (!playerEntity || !opponentEntity) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (\r\n\t\t\t(!playerBoard?.length && !opponentBoard?.length) ||\r\n\t\t\t// E.g. when both players have a 0-attack minion\r\n\t\t\t(playerBoard?.length > 0 && opponentBoard?.length > 0)\r\n\t\t) {\r\n\t\t\treturn {\r\n\t\t\t\tresult: 'tied',\r\n\t\t\t} as SingleSimulationResult;\r\n\t\t}\r\n\t\tif (!playerBoard?.length) {\r\n\t\t\tconst damage =\r\n\t\t\t\tthis.buildBoardTotalDamage(opponentBoard, this.gameState.gameState.opponent?.teammate?.board) +\r\n\t\t\t\topponentEntity.tavernTier;\r\n\t\t\tthis.gameState.spectator.registerOpponentAttack(playerBoard, opponentBoard, damage);\r\n\t\t\treturn {\r\n\t\t\t\tresult: 'lost',\r\n\t\t\t\tdamageDealt: damage,\r\n\t\t\t};\r\n\t\t}\r\n\t\tconst damage =\r\n\t\t\tthis.buildBoardTotalDamage(playerBoard, this.gameState.gameState.player?.teammate?.board) +\r\n\t\t\tplayerEntity.tavernTier;\r\n\t\tthis.gameState.spectator.registerPlayerAttack(playerBoard, opponentBoard, damage);\r\n\t\treturn {\r\n\t\t\tresult: 'won',\r\n\t\t\tdamageDealt: damage,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate simulateSingleBattlePass(\r\n\t\tplayerBoard: BoardEntity[],\r\n\t\tplayerEntity: BgsPlayerEntity,\r\n\t\topponentBoard: BoardEntity[],\r\n\t\topponentEntity: BgsPlayerEntity,\r\n\t) {\r\n\t\tif (debugState?.active) {\r\n\t\t\tdebugState.onBattleStart();\r\n\t\t}\r\n\t\t// Start of combat happens only once, so we need to flag whether it has already happened for a\r\n\t\t// given player\r\n\t\tthis.gameState.spectator.registerStartOfCombat(playerBoard, opponentBoard, playerEntity, opponentEntity);\r\n\r\n\t\t// Who attacks first is decided by the game before the hero power comes into effect. However, the full board (with the generated minion)\r\n\t\t// is sent tothe simulator\r\n\t\t// But in fact, the first player decision takes into account that additional minion. See\r\n\t\t// https://replays.firestoneapp.com/?reviewId=ddbbbe93-464b-4400-8e8d-4abca8680a2e\r\n\t\tconst effectivePlayerBoardLength = playerBoard.length;\r\n\t\tconst effectiveOpponentBoardLength = opponentBoard.length;\r\n\t\tthis.currentAttacker =\r\n\t\t\teffectivePlayerBoardLength > effectiveOpponentBoardLength\r\n\t\t\t\t? 0\r\n\t\t\t\t: effectiveOpponentBoardLength > effectivePlayerBoardLength\r\n\t\t\t\t? 1\r\n\t\t\t\t: Math.round(Math.random());\r\n\t\tthis.gameState.sharedState.currentEntityId =\r\n\t\t\tMath.max(\r\n\t\t\t\t...playerBoard.map((entity) => entity.entityId),\r\n\t\t\t\t...opponentBoard.map((entity) => entity.entityId),\r\n\t\t\t\t...(playerEntity.hand?.map((entity) => entity.entityId) ?? []),\r\n\t\t\t\t...(opponentEntity.hand?.map((entity) => entity.entityId) ?? []),\r\n\t\t\t) + 1;\r\n\t\tconst suggestedNewCurrentAttacker = handleStartOfCombat(\r\n\t\t\tplayerEntity,\r\n\t\t\tplayerBoard,\r\n\t\t\topponentEntity,\r\n\t\t\topponentBoard,\r\n\t\t\tthis.currentAttacker,\r\n\t\t\tthis.gameState,\r\n\t\t);\r\n\t\tthis.currentAttacker = suggestedNewCurrentAttacker;\r\n\t\tlet counter = 0;\r\n\t\tif (debugState?.active) {\r\n\t\t\tthis.currentAttacker = debugState.forcedCurrentAttacker ?? this.currentAttacker;\r\n\t\t}\r\n\t\twhile (playerBoard.length > 0 && opponentBoard.length > 0) {\r\n\t\t\thandleSummonsWhenSpace(playerBoard, playerEntity, opponentBoard, opponentEntity, this.gameState);\r\n\t\t\tclearStealthIfNeeded(playerBoard, opponentBoard);\r\n\t\t\t// console.log('this.currentSpeedAttacker', this.currentAttacker);\r\n\t\t\t// If there are \"attack immediately\" minions, we keep the same player\r\n\t\t\t// We put it here so that it can kick in after the start of combat effects. However here we don't want\r\n\t\t\t// to change who attacks first, so we repeat that block again after all the attacks have been resolved\r\n\t\t\t// FIXME: This is not strictly correct - if there are multiple attack immediately\r\n\t\t\t// minions that spawn on both player sides it might get a bit more complex\r\n\t\t\t// but overall it works\r\n\t\t\t// Also, this doesn't work when there are several deathrattle competing\r\n\t\t\t// to know who triggers first. See the second test case of the scallywag.test.ts\r\n\t\t\t// that is not handled properly today (the attack should in some cases happen before\r\n\t\t\t// the other deathrattle procs)\r\n\t\t\tif (playerBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 0;\r\n\t\t\t} else if (opponentBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentSpeedAttacker = -1;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tplayerBoard.filter((e) => e.attack > 0).length === 0 &&\r\n\t\t\t\topponentBoard.filter((e) => e.attack > 0).length === 0\r\n\t\t\t) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\t// console.log('this.currentSpeedAttacker 2', this.currentAttacker, this.currentSpeedAttacker);\r\n\t\t\tif (this.currentSpeedAttacker === 0 || (this.currentSpeedAttacker === -1 && this.currentAttacker === 0)) {\r\n\t\t\t\tsimulateAttack(playerBoard, playerEntity, opponentBoard, opponentEntity, this.gameState);\r\n\t\t\t} else {\r\n\t\t\t\tsimulateAttack(opponentBoard, opponentEntity, playerBoard, playerEntity, this.gameState);\r\n\t\t\t}\r\n\r\n\t\t\t// Update the attacker indices in case there were some deaths\r\n\t\t\tif (playerBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 0;\r\n\t\t\t} else if (opponentBoard.some((entity) => entity.attackImmediately)) {\r\n\t\t\t\tthis.currentSpeedAttacker = 1;\r\n\t\t\t} else {\r\n\t\t\t\tthis.currentSpeedAttacker = -1;\r\n\t\t\t\tthis.currentAttacker = (this.currentAttacker + 1) % 2;\r\n\t\t\t}\r\n\t\t\tcounter++;\r\n\t\t\tif (counter > 400 && !this.hasShowShortCircuitWarning) {\r\n\t\t\t\tconsole.warn(\r\n\t\t\t\t\t'short-circuiting simulation, too many iterations',\r\n\t\t\t\t\tcounter,\r\n\t\t\t\t\t'\\n',\r\n\t\t\t\t\tstringifySimple(playerBoard, this.gameState.allCards),\r\n\t\t\t\t\t'\\n',\r\n\t\t\t\t\tstringifySimple(opponentBoard, this.gameState.allCards),\r\n\t\t\t\t);\r\n\t\t\t\tthis.hasShowShortCircuitWarning = true;\r\n\t\t\t\tbreak;\r\n\t\t\t\t// return null;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tprivate buildBoardTotalDamage(playerBoard: readonly BoardEntity[], teammateBoard?: BoardEntity[]): number {\r\n\t\tconst damageFromPlayerBoard = playerBoard\r\n\t\t\t.map((entity) =>\r\n\t\t\t\tgetEffectiveTechLevel(this.gameState.allCards.getCard(entity.cardId), this.gameState.allCards),\r\n\t\t\t)\r\n\t\t\t.reduce((a, b) => a + b, 0);\r\n\t\tconst numberOfTeamateMinionsToSummnon = 7 - playerBoard.length;\r\n\t\tconst damageFromTeammateBoard =\r\n\t\t\tteammateBoard\r\n\t\t\t\t?.slice(0, numberOfTeamateMinionsToSummnon)\r\n\t\t\t\t.map((entity) =>\r\n\t\t\t\t\tgetEffectiveTechLevel(this.gameState.allCards.getCard(entity.cardId), this.gameState.allCards),\r\n\t\t\t\t)\r\n\t\t\t\t.reduce((a, b) => a + b, 0) ?? 0;\r\n\t\treturn damageFromPlayerBoard + damageFromTeammateBoard;\r\n\t}\r\n}\r\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type StartOfCombatPhase = 'QuestReward' | 'Anomalies' | 'Trinket' | 'PreCombatHeroPower' | 'IllidanHeroPower' | 'HeroPower' | 'Secret' | 'Minion';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"phases.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/phases.ts"],"names":[],"mappings":"","sourcesContent":["export type StartOfCombatPhase =\r\n\t| 'QuestReward'\r\n\t| 'Anomalies'\r\n\t| 'Trinket'\r\n\t| 'PreCombatHeroPower'\r\n\t| 'IllidanHeroPower'\r\n\t| 'HeroPower'\r\n\t| 'Secret'\r\n\t| 'Minion';\r\n"]}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { BoardTrinket } from '../../bgs-player-entity';
|
|
2
|
+
import { BoardEntity } from '../../board-entity';
|
|
3
|
+
import { SoCInput } from './start-of-combat-input';
|
|
4
|
+
export declare const performStartOfCombatAction: (cardId: string, entity: BoardEntity | BoardTrinket, input: SoCInput) => boolean;
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.performStartOfCombatAction = void 0;
|
|
4
|
+
const anomalous_twin_1 = require("../../cards/impl/anomaly/anomalous-twin");
|
|
5
|
+
const blessed_or_blighted_1 = require("../../cards/impl/anomaly/blessed-or-blighted");
|
|
6
|
+
const aim_high_1 = require("../../cards/impl/hero-power/aim-high");
|
|
7
|
+
const aim_left_1 = require("../../cards/impl/hero-power/aim-left");
|
|
8
|
+
const aim_low_1 = require("../../cards/impl/hero-power/aim-low");
|
|
9
|
+
const aim_right_1 = require("../../cards/impl/hero-power/aim-right");
|
|
10
|
+
const all_will_burn_1 = require("../../cards/impl/hero-power/all-will-burn");
|
|
11
|
+
const earth_invocation_1 = require("../../cards/impl/hero-power/earth-invocation");
|
|
12
|
+
const embrace_your_rage_1 = require("../../cards/impl/hero-power/embrace-your-rage");
|
|
13
|
+
const fire_invocation_1 = require("../../cards/impl/hero-power/fire-invocation");
|
|
14
|
+
const fragrant_phylactery_1 = require("../../cards/impl/hero-power/fragrant-phylactery");
|
|
15
|
+
const glorious_gloop_1 = require("../../cards/impl/hero-power/glorious-gloop");
|
|
16
|
+
const lightning_invocation_1 = require("../../cards/impl/hero-power/lightning-invocation");
|
|
17
|
+
const rapid_reanimation_1 = require("../../cards/impl/hero-power/rapid-reanimation");
|
|
18
|
+
const reborn_rites_1 = require("../../cards/impl/hero-power/reborn-rites");
|
|
19
|
+
const swatting_insects_1 = require("../../cards/impl/hero-power/swatting-insects");
|
|
20
|
+
const tentacular_1 = require("../../cards/impl/hero-power/tentacular");
|
|
21
|
+
const water_invocation_1 = require("../../cards/impl/hero-power/water-invocation");
|
|
22
|
+
const wax_warband_1 = require("../../cards/impl/hero-power/wax-warband");
|
|
23
|
+
const amber_guardian_1 = require("../../cards/impl/minion/amber-guardian");
|
|
24
|
+
const audacious_anchor_1 = require("../../cards/impl/minion/audacious-anchor");
|
|
25
|
+
const carbonic_copy_1 = require("../../cards/impl/minion/carbonic-copy");
|
|
26
|
+
const choral_mrrrglr_1 = require("../../cards/impl/minion/choral-mrrrglr");
|
|
27
|
+
const corrupted_myrmidon_1 = require("../../cards/impl/minion/corrupted-myrmidon");
|
|
28
|
+
const crabby_1 = require("../../cards/impl/minion/crabby");
|
|
29
|
+
const diremuck_forager_1 = require("../../cards/impl/minion/diremuck-forager");
|
|
30
|
+
const elder_taggawag_1 = require("../../cards/impl/minion/elder-taggawag");
|
|
31
|
+
const hawkstrider_herald_1 = require("../../cards/impl/minion/hawkstrider-herald");
|
|
32
|
+
const hoarding_hatespawn_1 = require("../../cards/impl/minion/hoarding-hatespawn");
|
|
33
|
+
const humming_bird_1 = require("../../cards/impl/minion/humming-bird");
|
|
34
|
+
const interrogator_whitemane_1 = require("../../cards/impl/minion/interrogator-whitemane");
|
|
35
|
+
const irate_rooster_1 = require("../../cards/impl/minion/irate-rooster");
|
|
36
|
+
const mantid_queen_1 = require("../../cards/impl/minion/mantid-queen");
|
|
37
|
+
const misfit_dragonling_1 = require("../../cards/impl/minion/misfit-dragonling");
|
|
38
|
+
const piloted_whirl_o_tron_1 = require("../../cards/impl/minion/piloted-whirl-o-tron");
|
|
39
|
+
const prized_promo_drake_1 = require("../../cards/impl/minion/prized-promo-drake");
|
|
40
|
+
const red_whelp_1 = require("../../cards/impl/minion/red-whelp");
|
|
41
|
+
const sanctum_rester_1 = require("../../cards/impl/minion/sanctum-rester");
|
|
42
|
+
const sandy_1 = require("../../cards/impl/minion/sandy");
|
|
43
|
+
const sky_pirate_flagbearer_1 = require("../../cards/impl/minion/sky-pirate-flagbearer");
|
|
44
|
+
const soulsplitter_1 = require("../../cards/impl/minion/soulsplitter");
|
|
45
|
+
const sun_screener_1 = require("../../cards/impl/minion/sun-screener");
|
|
46
|
+
const the_uninvited_guest_1 = require("../../cards/impl/minion/the-uninvited-guest");
|
|
47
|
+
const thousandth_paper_drake_1 = require("../../cards/impl/minion/thousandth-paper-drake");
|
|
48
|
+
const vaelastrasz_1 = require("../../cards/impl/minion/vaelastrasz");
|
|
49
|
+
const yulon_fortune_granter_1 = require("../../cards/impl/minion/yulon-fortune-granter");
|
|
50
|
+
const evil_twin_1 = require("../../cards/impl/quest-reward/evil-twin");
|
|
51
|
+
const staff_of_origination_1 = require("../../cards/impl/quest-reward/staff-of-origination");
|
|
52
|
+
const stolen_gold_1 = require("../../cards/impl/quest-reward/stolen-gold");
|
|
53
|
+
const artisanal_urn_1 = require("../../cards/impl/trinket/artisanal-urn");
|
|
54
|
+
const automaton_portrait_1 = require("../../cards/impl/trinket/automaton-portrait");
|
|
55
|
+
const bronze_timepiece_1 = require("../../cards/impl/trinket/bronze-timepiece");
|
|
56
|
+
const emerald_dreamcatcher_1 = require("../../cards/impl/trinket/emerald-dreamcatcher");
|
|
57
|
+
const eternal_portrait_1 = require("../../cards/impl/trinket/eternal-portrait");
|
|
58
|
+
const fishy_sticker_1 = require("../../cards/impl/trinket/fishy-sticker");
|
|
59
|
+
const hoggy_bank_1 = require("../../cards/impl/trinket/hoggy-bank");
|
|
60
|
+
const holly_mallet_1 = require("../../cards/impl/trinket/holly-mallet");
|
|
61
|
+
const ironforge_anvil_1 = require("../../cards/impl/trinket/ironforge-anvil");
|
|
62
|
+
const jarred_frostling_1 = require("../../cards/impl/trinket/jarred-frostling");
|
|
63
|
+
const karazhan_chess_set_1 = require("../../cards/impl/trinket/karazhan-chess-set");
|
|
64
|
+
const rivendare_portrait_1 = require("../../cards/impl/trinket/rivendare-portrait");
|
|
65
|
+
const rusty_trident_1 = require("../../cards/impl/trinket/rusty-trident");
|
|
66
|
+
const ship_in_a_bottle_1 = require("../../cards/impl/trinket/ship-in-a-bottle");
|
|
67
|
+
const summoning_sphere_1 = require("../../cards/impl/trinket/summoning-sphere");
|
|
68
|
+
const tinyfin_onesie_1 = require("../../cards/impl/trinket/tinyfin-onesie");
|
|
69
|
+
const training_certificate_1 = require("../../cards/impl/trinket/training-certificate");
|
|
70
|
+
const valorous_medaillion_1 = require("../../cards/impl/trinket/valorous-medaillion");
|
|
71
|
+
const performStartOfCombatAction = (cardId, entity, input) => {
|
|
72
|
+
var _a;
|
|
73
|
+
let hasTriggered = false;
|
|
74
|
+
const promoPortraitCount = getPromoPortraitCount(input.playerEntity);
|
|
75
|
+
for (let i = promoPortraitCount; i >= 0; i--) {
|
|
76
|
+
const action = (_a = getStartOfCombatAction(cardId)) === null || _a === void 0 ? void 0 : _a.startOfCombat;
|
|
77
|
+
if (!!action) {
|
|
78
|
+
hasTriggered = action(entity, input);
|
|
79
|
+
if (!!hasTriggered) {
|
|
80
|
+
onStartOfCombatTriggered(i, cardId, input.playerEntity);
|
|
81
|
+
if (typeof hasTriggered !== 'boolean' && hasTriggered.shouldRecomputeCurrentAttacker) {
|
|
82
|
+
input.currentAttacker =
|
|
83
|
+
input.playerBoard.length > input.opponentBoard.length
|
|
84
|
+
? 0
|
|
85
|
+
: input.opponentBoard.length > input.playerBoard.length
|
|
86
|
+
? 1
|
|
87
|
+
: Math.round(Math.random());
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return !!hasTriggered;
|
|
93
|
+
};
|
|
94
|
+
exports.performStartOfCombatAction = performStartOfCombatAction;
|
|
95
|
+
const getStartOfCombatAction = (cardId) => {
|
|
96
|
+
switch (cardId) {
|
|
97
|
+
case "BG24_Reward_111":
|
|
98
|
+
return evil_twin_1.EvilTwin;
|
|
99
|
+
case "BG24_Reward_312":
|
|
100
|
+
return staff_of_origination_1.StaffOfOrigination;
|
|
101
|
+
case "BG24_Reward_109":
|
|
102
|
+
return stolen_gold_1.StolenGold;
|
|
103
|
+
case "BG30_MagicItem_902":
|
|
104
|
+
return holly_mallet_1.HollyMallet;
|
|
105
|
+
case "BG30_MagicItem_962":
|
|
106
|
+
return training_certificate_1.TrainingCertificate;
|
|
107
|
+
case "BG30_MagicItem_970":
|
|
108
|
+
case "BG30_MagicItem_970t":
|
|
109
|
+
return valorous_medaillion_1.ValorousMedallion;
|
|
110
|
+
case "BG30_MagicItem_542":
|
|
111
|
+
return emerald_dreamcatcher_1.EmeraldDreamcatcher;
|
|
112
|
+
case "BG30_MagicItem_952":
|
|
113
|
+
return jarred_frostling_1.JarredFrostling;
|
|
114
|
+
case "BG30_MagicItem_917":
|
|
115
|
+
return rusty_trident_1.RustyTrident;
|
|
116
|
+
case "BG30_MagicItem_411":
|
|
117
|
+
return hoggy_bank_1.HoggyBank;
|
|
118
|
+
case "BG30_MagicItem_303":
|
|
119
|
+
return automaton_portrait_1.AutomatonPortrait;
|
|
120
|
+
case "BG30_MagicItem_407":
|
|
121
|
+
return ship_in_a_bottle_1.ShipInABottle;
|
|
122
|
+
case "BG30_MagicItem_301":
|
|
123
|
+
return eternal_portrait_1.EternalPortrait;
|
|
124
|
+
case "BG30_MagicItem_989":
|
|
125
|
+
case "BG30_MagicItem_989t":
|
|
126
|
+
return artisanal_urn_1.ArtisanalUrn;
|
|
127
|
+
case "BG30_MagicItem_310":
|
|
128
|
+
return rivendare_portrait_1.RivendarePortrait;
|
|
129
|
+
case "BG30_MagicItem_441":
|
|
130
|
+
return tinyfin_onesie_1.TinyfinOnesie;
|
|
131
|
+
case "BG30_MagicItem_995":
|
|
132
|
+
return bronze_timepiece_1.BronzeTimepiece;
|
|
133
|
+
case "BG30_MagicItem_403":
|
|
134
|
+
return ironforge_anvil_1.IronforgeAnvil;
|
|
135
|
+
case "BG30_MagicItem_972":
|
|
136
|
+
return karazhan_chess_set_1.KarazhanChessSet;
|
|
137
|
+
case "BG30_MagicItem_821":
|
|
138
|
+
case "BG30_MagicItem_821t2":
|
|
139
|
+
return fishy_sticker_1.FishySticker;
|
|
140
|
+
case "BGDUO_MagicItem_003":
|
|
141
|
+
return summoning_sphere_1.SummoningSphere;
|
|
142
|
+
case "TB_BaconShop_HP_086":
|
|
143
|
+
return swatting_insects_1.SwattingInsects;
|
|
144
|
+
case "BG22_HERO_001p_t1":
|
|
145
|
+
return earth_invocation_1.EarthInvocation;
|
|
146
|
+
case "BG22_HERO_001p_t3":
|
|
147
|
+
return water_invocation_1.WaterInvocation;
|
|
148
|
+
case "BG22_HERO_001p_t2":
|
|
149
|
+
return fire_invocation_1.FireInvocation;
|
|
150
|
+
case "BG22_HERO_001p_t4":
|
|
151
|
+
return lightning_invocation_1.LightningInvocation;
|
|
152
|
+
case "TB_BaconShop_HP_061":
|
|
153
|
+
return all_will_burn_1.AllWillBurn;
|
|
154
|
+
case "BG20_HERO_282p":
|
|
155
|
+
return fragrant_phylactery_1.FragrantPhylactery;
|
|
156
|
+
case "TB_BaconShop_HP_103":
|
|
157
|
+
return embrace_your_rage_1.EmbraceYourRage;
|
|
158
|
+
case "BG23_HERO_201p":
|
|
159
|
+
return tentacular_1.Tentacular;
|
|
160
|
+
case "TB_BaconShop_HP_024":
|
|
161
|
+
return reborn_rites_1.RebornRites;
|
|
162
|
+
case "BG25_HERO_103p":
|
|
163
|
+
return rapid_reanimation_1.RapidReanimation;
|
|
164
|
+
case "TB_BaconShop_HP_037a":
|
|
165
|
+
return wax_warband_1.WaxWarband;
|
|
166
|
+
case "BGDUO_HERO_101p":
|
|
167
|
+
return glorious_gloop_1.GloriousGloop;
|
|
168
|
+
case "BG22_HERO_000p_t1":
|
|
169
|
+
return aim_left_1.AimLeft;
|
|
170
|
+
case "BG22_HERO_000p_t4":
|
|
171
|
+
return aim_right_1.AimRight;
|
|
172
|
+
case "BG22_HERO_000p_t2":
|
|
173
|
+
return aim_low_1.AimLow;
|
|
174
|
+
case "BG22_HERO_000p_t3":
|
|
175
|
+
return aim_high_1.AimHigh;
|
|
176
|
+
case "BG27_Anomaly_726":
|
|
177
|
+
return blessed_or_blighted_1.BlessedOrBlighted;
|
|
178
|
+
case "BG27_Anomaly_560":
|
|
179
|
+
return anomalous_twin_1.AnomalousTwin;
|
|
180
|
+
case "BGS_019":
|
|
181
|
+
case "TB_BaconUps_102":
|
|
182
|
+
return red_whelp_1.RedWhelp;
|
|
183
|
+
case "BG21_014":
|
|
184
|
+
case "BG21_014_G":
|
|
185
|
+
return prized_promo_drake_1.PrizedPromoDrake;
|
|
186
|
+
case "BG26_354":
|
|
187
|
+
case "BG26_354_G":
|
|
188
|
+
return choral_mrrrglr_1.ChoralMrrrglr;
|
|
189
|
+
case "BG24_500":
|
|
190
|
+
case "BG24_500_G":
|
|
191
|
+
return amber_guardian_1.AmberGuardian;
|
|
192
|
+
case "BG26_356":
|
|
193
|
+
case "BG26_356_G":
|
|
194
|
+
return sanctum_rester_1.SanctumRester;
|
|
195
|
+
case "BG25_023":
|
|
196
|
+
case "BG25_023_G":
|
|
197
|
+
return soulsplitter_1.Soulsplitter;
|
|
198
|
+
case "BG22_HERO_000_Buddy":
|
|
199
|
+
case "BG22_HERO_000_Buddy_G":
|
|
200
|
+
return crabby_1.Crabby;
|
|
201
|
+
case "BG23_012":
|
|
202
|
+
case "BG23_012_G":
|
|
203
|
+
return corrupted_myrmidon_1.CorruptedMyrmidon;
|
|
204
|
+
case "BG24_704":
|
|
205
|
+
case "BG24_704_G":
|
|
206
|
+
return interrogator_whitemane_1.InterrogatorWhitemane;
|
|
207
|
+
case "BG22_402":
|
|
208
|
+
case "BG22_402_G":
|
|
209
|
+
return mantid_queen_1.MantidQueen;
|
|
210
|
+
case "BG27_503":
|
|
211
|
+
case "BG27_503_G":
|
|
212
|
+
return carbonic_copy_1.CarbonicCopy;
|
|
213
|
+
case "BG27_556":
|
|
214
|
+
case "BG27_556_G":
|
|
215
|
+
return diremuck_forager_1.DiremuckForager;
|
|
216
|
+
case "BG27_079":
|
|
217
|
+
case "BG27_079_G":
|
|
218
|
+
return hawkstrider_herald_1.HawkstriderHerald;
|
|
219
|
+
case "BG28_904":
|
|
220
|
+
case "BG28_904_G":
|
|
221
|
+
return audacious_anchor_1.AudaciousAnchor;
|
|
222
|
+
case "BG21_HERO_030_Buddy":
|
|
223
|
+
case "BG21_HERO_030_Buddy_G":
|
|
224
|
+
return piloted_whirl_o_tron_1.PilotedWhirlOTron;
|
|
225
|
+
case "BG29_990":
|
|
226
|
+
case "BG29_990_G":
|
|
227
|
+
return irate_rooster_1.IrateRooster;
|
|
228
|
+
case "BG29_814":
|
|
229
|
+
case "BG29_814_G":
|
|
230
|
+
return misfit_dragonling_1.MisfitDragonling;
|
|
231
|
+
case "BG29_810":
|
|
232
|
+
case "BG29_810_G":
|
|
233
|
+
return thousandth_paper_drake_1.ThousandthPaperDrake;
|
|
234
|
+
case "BG29_811":
|
|
235
|
+
case "BG29_811_G":
|
|
236
|
+
return yulon_fortune_granter_1.YulonFortuneGranter;
|
|
237
|
+
case "BG29_872":
|
|
238
|
+
case "BG29_872_G":
|
|
239
|
+
return hoarding_hatespawn_1.HoardingHatespawn;
|
|
240
|
+
case "BG29_875":
|
|
241
|
+
case "BG29_875_G":
|
|
242
|
+
return the_uninvited_guest_1.TheUninvitedGuest;
|
|
243
|
+
case "BGDUO_125":
|
|
244
|
+
case "BGDUO_125_G":
|
|
245
|
+
return sandy_1.Sandy;
|
|
246
|
+
case "TB_BaconShop_HERO_56_Buddy":
|
|
247
|
+
case "TB_BaconShop_HERO_56_Buddy_G":
|
|
248
|
+
return vaelastrasz_1.Vaelastrasz;
|
|
249
|
+
case "TB_BaconShop_HERO_14_Buddy":
|
|
250
|
+
case "TB_BaconShop_HERO_14_Buddy_G":
|
|
251
|
+
return elder_taggawag_1.ElderTaggawag;
|
|
252
|
+
case "BG30_101":
|
|
253
|
+
case "BG30_101_G":
|
|
254
|
+
return sun_screener_1.SunScreener;
|
|
255
|
+
case "BG30_119":
|
|
256
|
+
case "BG30_119_G":
|
|
257
|
+
return sky_pirate_flagbearer_1.SkyPirateFlagbearer;
|
|
258
|
+
case "BG26_805":
|
|
259
|
+
case "BG26_805_G":
|
|
260
|
+
return humming_bird_1.HummingBird;
|
|
261
|
+
default:
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
const onStartOfCombatTriggered = (iteration, triggeredCardId, playerEntity) => {
|
|
266
|
+
const promoPortraits = playerEntity.trinkets.filter((t) => t.cardId === "BG30_MagicItem_918" && t.scriptDataNum1 > 0);
|
|
267
|
+
if (promoPortraits.length === 0 || iteration === 0 || iteration >= promoPortraits.length) {
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
switch (triggeredCardId) {
|
|
271
|
+
case "BG24_Reward_109":
|
|
272
|
+
case "BG30_MagicItem_902":
|
|
273
|
+
case "BG30_MagicItem_542":
|
|
274
|
+
case "BG30_MagicItem_301":
|
|
275
|
+
case "BG30_MagicItem_995":
|
|
276
|
+
case "TB_BaconShop_HP_086":
|
|
277
|
+
case "TB_BaconShop_HP_024":
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
280
|
+
const promoPortrait = promoPortraits[iteration - 1];
|
|
281
|
+
promoPortrait.scriptDataNum1--;
|
|
282
|
+
};
|
|
283
|
+
const getPromoPortraitCount = (playerEntity) => {
|
|
284
|
+
return playerEntity.trinkets.filter((t) => t.cardId === "BG30_MagicItem_918" && t.scriptDataNum1 > 0).length;
|
|
285
|
+
};
|
|
286
|
+
//# sourceMappingURL=soc-action-processor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"soc-action-processor.js","sourceRoot":"","sources":["../../../src/simulation/start-of-combat/soc-action-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import { CardIds } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity, BoardTrinket } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { StartOfCombatCard } from '../../cards/card.interface';\r\nimport { AnomalousTwin } from '../../cards/impl/anomaly/anomalous-twin';\r\nimport { BlessedOrBlighted } from '../../cards/impl/anomaly/blessed-or-blighted';\r\nimport { AimHigh } from '../../cards/impl/hero-power/aim-high';\r\nimport { AimLeft } from '../../cards/impl/hero-power/aim-left';\r\nimport { AimLow } from '../../cards/impl/hero-power/aim-low';\r\nimport { AimRight } from '../../cards/impl/hero-power/aim-right';\r\nimport { AllWillBurn } from '../../cards/impl/hero-power/all-will-burn';\r\nimport { EarthInvocation } from '../../cards/impl/hero-power/earth-invocation';\r\nimport { EmbraceYourRage } from '../../cards/impl/hero-power/embrace-your-rage';\r\nimport { FireInvocation } from '../../cards/impl/hero-power/fire-invocation';\r\nimport { FragrantPhylactery } from '../../cards/impl/hero-power/fragrant-phylactery';\r\nimport { GloriousGloop } from '../../cards/impl/hero-power/glorious-gloop';\r\nimport { LightningInvocation } from '../../cards/impl/hero-power/lightning-invocation';\r\nimport { RapidReanimation } from '../../cards/impl/hero-power/rapid-reanimation';\r\nimport { RebornRites } from '../../cards/impl/hero-power/reborn-rites';\r\nimport { SwattingInsects } from '../../cards/impl/hero-power/swatting-insects';\r\nimport { Tentacular } from '../../cards/impl/hero-power/tentacular';\r\nimport { WaterInvocation } from '../../cards/impl/hero-power/water-invocation';\r\nimport { WaxWarband } from '../../cards/impl/hero-power/wax-warband';\r\nimport { AmberGuardian } from '../../cards/impl/minion/amber-guardian';\r\nimport { AudaciousAnchor } from '../../cards/impl/minion/audacious-anchor';\r\nimport { CarbonicCopy } from '../../cards/impl/minion/carbonic-copy';\r\nimport { ChoralMrrrglr } from '../../cards/impl/minion/choral-mrrrglr';\r\nimport { CorruptedMyrmidon } from '../../cards/impl/minion/corrupted-myrmidon';\r\nimport { Crabby } from '../../cards/impl/minion/crabby';\r\nimport { DiremuckForager } from '../../cards/impl/minion/diremuck-forager';\r\nimport { ElderTaggawag } from '../../cards/impl/minion/elder-taggawag';\r\nimport { HawkstriderHerald } from '../../cards/impl/minion/hawkstrider-herald';\r\nimport { HoardingHatespawn } from '../../cards/impl/minion/hoarding-hatespawn';\r\nimport { HummingBird } from '../../cards/impl/minion/humming-bird';\r\nimport { InterrogatorWhitemane } from '../../cards/impl/minion/interrogator-whitemane';\r\nimport { IrateRooster } from '../../cards/impl/minion/irate-rooster';\r\nimport { MantidQueen } from '../../cards/impl/minion/mantid-queen';\r\nimport { MisfitDragonling } from '../../cards/impl/minion/misfit-dragonling';\r\nimport { PilotedWhirlOTron } from '../../cards/impl/minion/piloted-whirl-o-tron';\r\nimport { PrizedPromoDrake } from '../../cards/impl/minion/prized-promo-drake';\r\nimport { RedWhelp } from '../../cards/impl/minion/red-whelp';\r\nimport { SanctumRester } from '../../cards/impl/minion/sanctum-rester';\r\nimport { Sandy } from '../../cards/impl/minion/sandy';\r\nimport { SkyPirateFlagbearer } from '../../cards/impl/minion/sky-pirate-flagbearer';\r\nimport { Soulsplitter } from '../../cards/impl/minion/soulsplitter';\r\nimport { SunScreener } from '../../cards/impl/minion/sun-screener';\r\nimport { TheUninvitedGuest } from '../../cards/impl/minion/the-uninvited-guest';\r\nimport { ThousandthPaperDrake } from '../../cards/impl/minion/thousandth-paper-drake';\r\nimport { Vaelastrasz } from '../../cards/impl/minion/vaelastrasz';\r\nimport { YulonFortuneGranter } from '../../cards/impl/minion/yulon-fortune-granter';\r\nimport { EvilTwin } from '../../cards/impl/quest-reward/evil-twin';\r\nimport { StaffOfOrigination } from '../../cards/impl/quest-reward/staff-of-origination';\r\nimport { StolenGold } from '../../cards/impl/quest-reward/stolen-gold';\r\nimport { ArtisanalUrn } from '../../cards/impl/trinket/artisanal-urn';\r\nimport { AutomatonPortrait } from '../../cards/impl/trinket/automaton-portrait';\r\nimport { BronzeTimepiece } from '../../cards/impl/trinket/bronze-timepiece';\r\nimport { EmeraldDreamcatcher } from '../../cards/impl/trinket/emerald-dreamcatcher';\r\nimport { EternalPortrait } from '../../cards/impl/trinket/eternal-portrait';\r\nimport { FishySticker } from '../../cards/impl/trinket/fishy-sticker';\r\nimport { HoggyBank } from '../../cards/impl/trinket/hoggy-bank';\r\nimport { HollyMallet } from '../../cards/impl/trinket/holly-mallet';\r\nimport { IronforgeAnvil } from '../../cards/impl/trinket/ironforge-anvil';\r\nimport { JarredFrostling } from '../../cards/impl/trinket/jarred-frostling';\r\nimport { KarazhanChessSet } from '../../cards/impl/trinket/karazhan-chess-set';\r\nimport { RivendarePortrait } from '../../cards/impl/trinket/rivendare-portrait';\r\nimport { RustyTrident } from '../../cards/impl/trinket/rusty-trident';\r\nimport { ShipInABottle } from '../../cards/impl/trinket/ship-in-a-bottle';\r\nimport { SummoningSphere } from '../../cards/impl/trinket/summoning-sphere';\r\nimport { TinyfinOnesie } from '../../cards/impl/trinket/tinyfin-onesie';\r\nimport { TrainingCertificate } from '../../cards/impl/trinket/training-certificate';\r\nimport { ValorousMedallion } from '../../cards/impl/trinket/valorous-medaillion';\r\nimport { SoCInput } from './start-of-combat-input';\r\n\r\nexport const performStartOfCombatAction = (cardId: string, entity: BoardEntity | BoardTrinket, input: SoCInput) => {\r\n\tlet hasTriggered:\r\n\t\t| boolean\r\n\t\t| {\r\n\t\t\t\thasTriggered: boolean;\r\n\t\t\t\tshouldRecomputeCurrentAttacker: boolean;\r\n\t\t } = false;\r\n\tconst promoPortraitCount = getPromoPortraitCount(input.playerEntity);\r\n\tfor (let i = promoPortraitCount; i >= 0; i--) {\r\n\t\tconst action = getStartOfCombatAction(cardId)?.startOfCombat;\r\n\t\tif (!!action) {\r\n\t\t\thasTriggered = action(entity, input);\r\n\t\t\tif (!!hasTriggered) {\r\n\t\t\t\tonStartOfCombatTriggered(i, cardId, input.playerEntity);\r\n\t\t\t\tif (typeof hasTriggered !== 'boolean' && hasTriggered.shouldRecomputeCurrentAttacker) {\r\n\t\t\t\t\tinput.currentAttacker =\r\n\t\t\t\t\t\tinput.playerBoard.length > input.opponentBoard.length\r\n\t\t\t\t\t\t\t? 0\r\n\t\t\t\t\t\t\t: input.opponentBoard.length > input.playerBoard.length\r\n\t\t\t\t\t\t\t? 1\r\n\t\t\t\t\t\t\t: Math.round(Math.random());\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn !!hasTriggered;\r\n};\r\n\r\n// TODO: load all cards on start, then do some programmatic mapping\r\nconst getStartOfCombatAction = (cardId: string): StartOfCombatCard => {\r\n\tswitch (cardId) {\r\n\t\t// Quest rewards\r\n\t\tcase CardIds.EvilTwin:\r\n\t\t\treturn EvilTwin;\r\n\t\tcase CardIds.StaffOfOrigination_BG24_Reward_312:\r\n\t\t\treturn StaffOfOrigination;\r\n\t\tcase CardIds.StolenGold:\r\n\t\t\treturn StolenGold;\r\n\r\n\t\t// Trinkets\r\n\t\tcase CardIds.HolyMallet_BG30_MagicItem_902:\r\n\t\t\treturn HollyMallet;\r\n\t\tcase CardIds.TrainingCertificate_BG30_MagicItem_962:\r\n\t\t\treturn TrainingCertificate;\r\n\t\tcase CardIds.ValorousMedallion_BG30_MagicItem_970:\r\n\t\tcase CardIds.ValorousMedallion_ValorousMedallionToken_BG30_MagicItem_970t:\r\n\t\t\treturn ValorousMedallion;\r\n\t\tcase CardIds.EmeraldDreamcatcher_BG30_MagicItem_542:\r\n\t\t\treturn EmeraldDreamcatcher;\r\n\t\tcase CardIds.JarredFrostling_BG30_MagicItem_952:\r\n\t\t\treturn JarredFrostling;\r\n\t\tcase CardIds.RustyTrident_BG30_MagicItem_917:\r\n\t\t\treturn RustyTrident;\r\n\t\tcase CardIds.HoggyBank_BG30_MagicItem_411:\r\n\t\t\treturn HoggyBank;\r\n\t\tcase CardIds.AutomatonPortrait_BG30_MagicItem_303:\r\n\t\t\treturn AutomatonPortrait;\r\n\t\tcase CardIds.ShipInABottle_BG30_MagicItem_407:\r\n\t\t\treturn ShipInABottle;\r\n\t\tcase CardIds.EternalPortrait_BG30_MagicItem_301:\r\n\t\t\treturn EternalPortrait;\r\n\t\tcase CardIds.ArtisanalUrn_BG30_MagicItem_989:\r\n\t\tcase CardIds.ArtisanalUrn_ArtisanalUrnToken_BG30_MagicItem_989t:\r\n\t\t\treturn ArtisanalUrn;\r\n\t\tcase CardIds.RivendarePortrait_BG30_MagicItem_310:\r\n\t\t\treturn RivendarePortrait;\r\n\t\tcase CardIds.TinyfinOnesie_BG30_MagicItem_441:\r\n\t\t\treturn TinyfinOnesie;\r\n\t\tcase CardIds.BronzeTimepiece_BG30_MagicItem_995:\r\n\t\t\treturn BronzeTimepiece;\r\n\t\tcase CardIds.IronforgeAnvil_BG30_MagicItem_403:\r\n\t\t\treturn IronforgeAnvil;\r\n\t\tcase CardIds.KarazhanChessSet_BG30_MagicItem_972:\r\n\t\t\treturn KarazhanChessSet;\r\n\t\tcase CardIds.FishySticker_BG30_MagicItem_821:\r\n\t\tcase CardIds.FishySticker_FishyStickerToken_BG30_MagicItem_821t2:\r\n\t\t\treturn FishySticker;\r\n\t\tcase CardIds.SummoningSphere_BGDUO_MagicItem_003:\r\n\t\t\treturn SummoningSphere;\r\n\r\n\t\t// Hero powers\r\n\t\tcase CardIds.SwattingInsects:\r\n\t\t\treturn SwattingInsects;\r\n\t\tcase CardIds.EarthInvocationToken:\r\n\t\t\treturn EarthInvocation;\r\n\t\tcase CardIds.WaterInvocationToken:\r\n\t\t\treturn WaterInvocation;\r\n\t\tcase CardIds.FireInvocationToken:\r\n\t\t\treturn FireInvocation;\r\n\t\tcase CardIds.LightningInvocationToken:\r\n\t\t\treturn LightningInvocation;\r\n\t\tcase CardIds.AllWillBurn:\r\n\t\t\treturn AllWillBurn;\r\n\t\tcase CardIds.TamsinRoame_FragrantPhylactery:\r\n\t\t\treturn FragrantPhylactery;\r\n\t\tcase CardIds.EmbraceYourRage:\r\n\t\t\treturn EmbraceYourRage;\r\n\t\tcase CardIds.Ozumat_Tentacular:\r\n\t\t\treturn Tentacular;\r\n\t\tcase CardIds.RebornRites:\r\n\t\t\treturn RebornRites;\r\n\t\tcase CardIds.TeronGorefiend_RapidReanimation:\r\n\t\t\treturn RapidReanimation;\r\n\t\tcase CardIds.WaxWarband:\r\n\t\t\treturn WaxWarband;\r\n\t\tcase CardIds.FlobbidinousFloop_GloriousGloop_BGDUO_HERO_101p:\r\n\t\t\treturn GloriousGloop;\r\n\t\tcase CardIds.AimLeftToken:\r\n\t\t\treturn AimLeft;\r\n\t\tcase CardIds.AimRightToken:\r\n\t\t\treturn AimRight;\r\n\t\tcase CardIds.AimLowToken:\r\n\t\t\treturn AimLow;\r\n\t\tcase CardIds.AimHighToken:\r\n\t\t\treturn AimHigh;\r\n\r\n\t\t// Anomalies\r\n\t\tcase CardIds.BlessedOrBlighted_BG27_Anomaly_726:\r\n\t\t\treturn BlessedOrBlighted;\r\n\t\tcase CardIds.AnomalousTwin_BG27_Anomaly_560:\r\n\t\t\treturn AnomalousTwin;\r\n\r\n\t\t// Minions\r\n\t\tcase CardIds.RedWhelp_BGS_019:\r\n\t\tcase CardIds.RedWhelp_TB_BaconUps_102:\r\n\t\t\treturn RedWhelp;\r\n\t\tcase CardIds.PrizedPromoDrake_BG21_014:\r\n\t\tcase CardIds.PrizedPromoDrake_BG21_014_G:\r\n\t\t\treturn PrizedPromoDrake;\r\n\t\tcase CardIds.ChoralMrrrglr_BG26_354:\r\n\t\tcase CardIds.ChoralMrrrglr_BG26_354_G:\r\n\t\t\treturn ChoralMrrrglr;\r\n\t\tcase CardIds.AmberGuardian_BG24_500:\r\n\t\tcase CardIds.AmberGuardian_BG24_500_G:\r\n\t\t\treturn AmberGuardian;\r\n\t\tcase CardIds.SanctumRester_BG26_356:\r\n\t\tcase CardIds.SanctumRester_BG26_356_G:\r\n\t\t\treturn SanctumRester;\r\n\t\tcase CardIds.Soulsplitter_BG25_023:\r\n\t\tcase CardIds.Soulsplitter_BG25_023_G:\r\n\t\t\treturn Soulsplitter;\r\n\t\tcase CardIds.Crabby_BG22_HERO_000_Buddy:\r\n\t\tcase CardIds.Crabby_BG22_HERO_000_Buddy_G:\r\n\t\t\treturn Crabby;\r\n\t\tcase CardIds.CorruptedMyrmidon_BG23_012:\r\n\t\tcase CardIds.CorruptedMyrmidon_BG23_012_G:\r\n\t\t\treturn CorruptedMyrmidon;\r\n\t\tcase CardIds.InterrogatorWhitemane_BG24_704:\r\n\t\tcase CardIds.InterrogatorWhitemane_BG24_704_G:\r\n\t\t\treturn InterrogatorWhitemane;\r\n\t\tcase CardIds.MantidQueen_BG22_402:\r\n\t\tcase CardIds.MantidQueen_BG22_402_G:\r\n\t\t\treturn MantidQueen;\r\n\t\tcase CardIds.CarbonicCopy_BG27_503:\r\n\t\tcase CardIds.CarbonicCopy_BG27_503_G:\r\n\t\t\treturn CarbonicCopy;\r\n\t\tcase CardIds.DiremuckForager_BG27_556:\r\n\t\tcase CardIds.DiremuckForager_BG27_556_G:\r\n\t\t\treturn DiremuckForager;\r\n\t\tcase CardIds.HawkstriderHerald_BG27_079:\r\n\t\tcase CardIds.HawkstriderHerald_BG27_079_G:\r\n\t\t\treturn HawkstriderHerald;\r\n\t\tcase CardIds.AudaciousAnchor_BG28_904:\r\n\t\tcase CardIds.AudaciousAnchor_BG28_904_G:\r\n\t\t\treturn AudaciousAnchor;\r\n\t\tcase CardIds.PilotedWhirlOTron_BG21_HERO_030_Buddy:\r\n\t\tcase CardIds.PilotedWhirlOTron_BG21_HERO_030_Buddy_G:\r\n\t\t\treturn PilotedWhirlOTron;\r\n\t\tcase CardIds.IrateRooster_BG29_990:\r\n\t\tcase CardIds.IrateRooster_BG29_990_G:\r\n\t\t\treturn IrateRooster;\r\n\t\tcase CardIds.MisfitDragonling_BG29_814:\r\n\t\tcase CardIds.MisfitDragonling_BG29_814_G:\r\n\t\t\treturn MisfitDragonling;\r\n\t\tcase CardIds.ThousandthPaperDrake_BG29_810:\r\n\t\tcase CardIds.ThousandthPaperDrake_BG29_810_G:\r\n\t\t\treturn ThousandthPaperDrake;\r\n\t\tcase CardIds.YulonFortuneGranter_BG29_811:\r\n\t\tcase CardIds.YulonFortuneGranter_BG29_811_G:\r\n\t\t\treturn YulonFortuneGranter;\r\n\t\tcase CardIds.HoardingHatespawn_BG29_872:\r\n\t\tcase CardIds.HoardingHatespawn_BG29_872_G:\r\n\t\t\treturn HoardingHatespawn;\r\n\t\tcase CardIds.TheUninvitedGuest_BG29_875:\r\n\t\tcase CardIds.TheUninvitedGuest_BG29_875_G:\r\n\t\t\treturn TheUninvitedGuest;\r\n\t\tcase CardIds.Sandy_BGDUO_125:\r\n\t\tcase CardIds.Sandy_BGDUO_125_G:\r\n\t\t\treturn Sandy;\r\n\t\tcase CardIds.Vaelastrasz_TB_BaconShop_HERO_56_Buddy:\r\n\t\tcase CardIds.Vaelastrasz_TB_BaconShop_HERO_56_Buddy_G:\r\n\t\t\treturn Vaelastrasz;\r\n\t\tcase CardIds.ElderTaggawag_TB_BaconShop_HERO_14_Buddy:\r\n\t\tcase CardIds.ElderTaggawag_TB_BaconShop_HERO_14_Buddy_G:\r\n\t\t\treturn ElderTaggawag;\r\n\t\tcase CardIds.SunScreener_BG30_101:\r\n\t\tcase CardIds.SunScreener_BG30_101_G:\r\n\t\t\treturn SunScreener;\r\n\t\tcase CardIds.SkyPirateFlagbearer_BG30_119:\r\n\t\tcase CardIds.SkyPirateFlagbearer_BG30_119_G:\r\n\t\t\treturn SkyPirateFlagbearer;\r\n\t\tcase CardIds.HummingBird_BG26_805:\r\n\t\tcase CardIds.HummingBird_BG26_805_G:\r\n\t\t\treturn HummingBird;\r\n\r\n\t\tdefault:\r\n\t\t\treturn null;\r\n\t}\r\n};\r\n\r\nconst onStartOfCombatTriggered = (iteration: number, triggeredCardId: string, playerEntity: BgsPlayerEntity) => {\r\n\t// Some procs are iso-functional, and don't update the promo portrait\r\n\tconst promoPortraits = playerEntity.trinkets.filter(\r\n\t\t(t) => t.cardId === CardIds.PromoPortrait_BG30_MagicItem_918 && t.scriptDataNum1 > 0,\r\n\t);\r\n\tif (promoPortraits.length === 0 || iteration === 0 || iteration >= promoPortraits.length) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tswitch (triggeredCardId) {\r\n\t\tcase CardIds.StolenGold:\r\n\t\tcase CardIds.HolyMallet_BG30_MagicItem_902:\r\n\t\tcase CardIds.EmeraldDreamcatcher_BG30_MagicItem_542:\r\n\t\tcase CardIds.EternalPortrait_BG30_MagicItem_301:\r\n\t\tcase CardIds.BronzeTimepiece_BG30_MagicItem_995:\r\n\t\tcase CardIds.SwattingInsects:\r\n\t\tcase CardIds.RebornRites:\r\n\t\t\treturn;\r\n\t}\r\n\r\n\tconst promoPortrait = promoPortraits[iteration - 1];\r\n\tpromoPortrait.scriptDataNum1--;\r\n};\r\n\r\nconst getPromoPortraitCount = (playerEntity: BgsPlayerEntity) => {\r\n\treturn playerEntity.trinkets.filter(\r\n\t\t(t) => t.cardId === CardIds.PromoPortrait_BG30_MagicItem_918 && t.scriptDataNum1 > 0,\r\n\t).length;\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 handleStartOfCombatAnomalies: (playerEntity: BgsPlayerEntity, playerBoard: BoardEntity[], opponentEntity: BgsPlayerEntity, opponentBoard: BoardEntity[], currentAttacker: number, gameState: FullGameState) => number;
|