@firestone-hs/simulate-bgs-battle 1.1.684 → 1.1.686
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cards/impl/_card-mappings.js +2 -0
- package/dist/cards/impl/_card-mappings.js.map +1 -1
- package/dist/cards/impl/minion/forest-rover.js +2 -2
- package/dist/cards/impl/minion/forest-rover.js.map +1 -1
- package/dist/cards/impl/minion/hardy-orca.js.map +1 -1
- package/dist/cards/impl/minion/silent-enforcer.js +2 -4
- package/dist/cards/impl/minion/silent-enforcer.js.map +1 -1
- package/dist/cards/impl/minion/timewarped-geist.js +1 -1
- package/dist/cards/impl/minion/timewarped-geist.js.map +1 -1
- package/dist/cards/impl/minion/timewarped-painter.js +1 -1
- package/dist/cards/impl/minion/timewarped-painter.js.map +1 -1
- package/dist/cards/impl/minion/timewarped-pashmar.js +1 -1
- package/dist/cards/impl/minion/timewarped-pashmar.js.map +1 -1
- package/dist/cards/impl/minion/turquoise-skitterer.js +2 -2
- package/dist/cards/impl/minion/turquoise-skitterer.js.map +1 -1
- package/dist/simulation/attack.d.ts +1 -0
- package/dist/simulation/attack.js +39 -1
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/spectator/spectator.d.ts +1 -0
- package/dist/simulation/spectator/spectator.js +22 -0
- package/dist/simulation/spectator/spectator.js.map +1 -1
- package/package.json +1 -1
|
@@ -361,6 +361,7 @@ const timewarped_goldrinn_1 = require("./minion/timewarped-goldrinn");
|
|
|
361
361
|
const timewarped_grease_bot_1 = require("./minion/timewarped-grease-bot");
|
|
362
362
|
const timewarped_greenskeeper_1 = require("./minion/timewarped-greenskeeper");
|
|
363
363
|
const timewarped_guard_1 = require("./minion/timewarped-guard");
|
|
364
|
+
const timewarped_hag_1 = require("./minion/timewarped-hag");
|
|
364
365
|
const timewarped_hawkstrider_1 = require("./minion/timewarped-hawkstrider");
|
|
365
366
|
const timewarped_hooktail_1 = require("./minion/timewarped-hooktail");
|
|
366
367
|
const timewarped_hunter_1 = require("./minion/timewarped-hunter");
|
|
@@ -613,6 +614,7 @@ const cards = [
|
|
|
613
614
|
maw_caster_1.MawCaster,
|
|
614
615
|
dastardly_drust_1.DastardlyDrust,
|
|
615
616
|
elite_navigator_1.EliteNavigator,
|
|
617
|
+
timewarped_hag_1.TimewarpedHag,
|
|
616
618
|
surfing_slyvar_1.SurfingSylvar,
|
|
617
619
|
goldgrubber_1.GoldGrubber,
|
|
618
620
|
unholy_sanctum_1.UnholySanctum,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"_card-mappings.js","sourceRoot":"","sources":["../../../src/cards/impl/_card-mappings.ts"],"names":[],"mappings":"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","sourcesContent":["import { Card } from '../card.interface';\r\nimport { AzeriteEmpowerment } from './bg-spell/azerite-empowerment';\r\nimport { BloodGemBarrage } from './bg-spell/blood-gem-barrage';\r\nimport { BroodOfNozdormu } from './bg-spell/brood-of-nozdormu';\r\nimport { EyesOfTheEarthMother } from './bg-spell/eyes-of-the-earth-mother';\r\nimport { HandOfDeios } from './bg-spell/hand-of-deios';\r\nimport { MenagerieTableware } from './bg-spell/menagerie-tableware';\r\nimport { MurkysFish } from './bg-spell/murkys-fish';\r\nimport { NaturalBlessing } from './bg-spell/natural-blessing';\r\nimport { SharingIsCaring } from './bg-spell/sharing-is-caring';\r\nimport { ShinyRing } from './bg-spell/shiny-ring';\r\nimport { TimewarpedBananas } from './bg-spell/timewarped-bananas';\r\nimport { TimewarpedChefsChoice } from './bg-spell/timewarped-chefs-choice';\r\nimport { TimewarpedCloningDevice } from './bg-spell/timewarped-cloning-device';\r\nimport { TimewarpedConch } from './bg-spell/timewarped-conch';\r\nimport { TimewarpedCorpse } from './bg-spell/timewarped-corpse';\r\nimport { TimewarpedEvolution } from './bg-spell/timewarped-evolution';\r\nimport { TimewarpedGoldenizer } from './bg-spell/timewarped-goldenizer';\r\nimport { TimewarpedMasterThief } from './bg-spell/timewarped-master-thief';\r\nimport { TimewarpedOnTheHouse } from './bg-spell/timewarped-on-the-house';\r\nimport { TimewarpedRatInTheCage } from './bg-spell/timewarped-rat-in-the-cage';\r\nimport { TimewarpedRitual } from './bg-spell/timewarped-ritual';\r\nimport { TimewarpedSpecial } from './bg-spell/timewarped-special';\r\nimport { TimewarpedThief } from './bg-spell/timewarped-thief';\r\nimport { TombTurning } from './bg-spell/tomb-turning';\r\nimport { WaveOfGold } from './bg-spell/wave-of-gold';\r\nimport { FragrantPhylactery } from './hero-power/fragrant-phylactery';\r\nimport { FragrantPhylacteryEnchantment } from './hero-power/fragrant-phylactery-enchantment';\r\nimport { FrostwolfFervor } from './hero-power/frostwolf-fervor';\r\nimport { GloriousGloop } from './hero-power/glorious-gloop';\r\nimport { LoackAndLoad } from './hero-power/lock-and-load';\r\nimport { Stormpike } from './hero-power/stormpike';\r\nimport { SwattingInsects } from './hero-power/swatting-insects';\r\nimport { AdmiralElizaGoreblade } from './minion/admiral-eliza-goreblade';\r\nimport { AllSeeingElder } from './minion/all-seeing-elder';\r\nimport { Alleycat } from './minion/alleycat';\r\nimport { AnubarakNerubianKing } from './minion/anubarak-nerubian-king';\r\nimport { ApexisGuardian } from './minion/apexis-guardian';\r\nimport { ApprenticeOfSefin } from './minion/apprentice-of-sefin';\r\nimport { ArcaneCannoneer } from './minion/arcane-cannoneer';\r\nimport { Archaedas } from './minion/archaedas';\r\nimport { Archimonde } from './minion/archimonde';\r\nimport { AridAtrocity } from './minion/arid-atrocity';\r\nimport { AshenCorruptor } from './minion/ashen-corruptor';\r\nimport { AssistantGuard } from './minion/assistant-guard';\r\nimport { AutoAccelerator } from './minion/auto-accelerator';\r\nimport { AutoAssembler } from './minion/auto-assembler';\r\nimport { AutoAssemblerEnchantment } from './minion/auto-assembler-enchantment';\r\nimport { AvalancheCaller } from './minion/avalanche-caller';\r\nimport { AzsharanCutlassier } from './minion/azsharan-cutlassier';\r\nimport { BabyYshaarj } from './minion/baby-yshaarj';\r\nimport { Baneling } from './minion/baneling';\r\nimport { Bannerboar } from './minion/bannerboar';\r\nimport { Bassgill } from './minion/bassgill';\r\nimport { Battlecruiser } from './minion/battlecruiser';\r\nimport { Beetle } from './minion/beetle';\r\nimport { BellowingTyrant } from './minion/bellowing-tyrant';\r\nimport { BigwigBandit } from './minion/bigwig-bandit';\r\nimport { BileSpitter } from './minion/bile-spitter';\r\nimport { BirdBuddy } from './minion/bird-buddy';\r\nimport { BlazingSkyfin } from './minion/blazing-skyfin';\r\nimport { BloodsnoutWarlord } from './minion/bloodsnout-warlord';\r\nimport { BlueVolumizer } from './minion/blue-volumizer';\r\nimport { BlueWhelp } from './minion/blue-whelp';\r\nimport { BluesySiren } from './minion/bluesy-siren';\r\nimport { BoarGamer } from './minion/boar-gamer';\r\nimport { BongoBopper } from './minion/bongo-bopper';\r\nimport { Bonker } from './minion/bonker';\r\nimport { BriarbackBookie } from './minion/briarback-bookie';\r\nimport { BriarbackDrummer } from './minion/briarback-drummer';\r\nimport { BrinyBootlegger } from './minion/briny-bootlegger';\r\nimport { BronzeSteward } from './minion/bronze-steward';\r\nimport { BubbleGunner } from './minion/bubble-gunner';\r\nimport { BuddingGreenthumb } from './minion/budding-greenthumb';\r\nimport { BurgeoningWhelp } from './minion/burgeoning-whelp';\r\nimport { BuzzingVermin } from './minion/buzzing-vermin';\r\nimport { CadaverCaretaker } from './minion/cadaver-caretaker';\r\nimport { CampfireShadow } from './minion/campfire-shadow';\r\nimport { CanopySwinger } from './minion/canopy-swinger';\r\nimport { CaptainBonerender } from './minion/captain-bonerender';\r\nimport { CarapaceRaiser } from './minion/carapace-raiser';\r\nimport { Carrier } from './minion/carrier';\r\nimport { ChampionOfThePrimus } from './minion/champion-of-the-primus';\r\nimport { ChargingCzarina } from './minion/charging-czarina';\r\nimport { Charlga } from './minion/charlga';\r\nimport { Charmwing } from './minion/charmwing';\r\nimport { ChoralMrrrglr } from './minion/choral-mrrrglr';\r\nimport { ClunkerJunker } from './minion/clunker-junker';\r\nimport { CoilskarSapper } from './minion/coilskar-sapper';\r\nimport { ColdlightDiver } from './minion/coldlight-diver';\r\nimport { Colossus } from './minion/colossus';\r\nimport { ConveyorConstruct } from './minion/conveyor-construct';\r\nimport { CorruptedBristler } from './minion/corrupted-bristler';\r\nimport { CostumeEnthusiast } from './minion/costume-enthusiast';\r\nimport { CruiseController } from './minion/cruise-controller';\r\nimport { CrystalInfuserEnchantment } from './minion/crystal-infuser-enchantment';\r\nimport { CupcakePeddler } from './minion/cupcake-peddler';\r\nimport { DastardlyDrust } from './minion/dastardly-drust';\r\nimport { Deadstomper } from './minion/deadstomper';\r\nimport { DeathlyStriker } from './minion/deathly-striker';\r\nimport { DefiantShipwright } from './minion/defiant-shipwright';\r\nimport { DeflectoBot } from './minion/deflecto-bot';\r\nimport { DevoutHellcaller } from './minion/devout-hellcaller';\r\nimport { DivineSparkbot } from './minion/divine-sparkbot';\r\nimport { DrakkariEmbalmer } from './minion/drakkari-embalmer';\r\nimport { Dramaloc } from './minion/dramaloc';\r\nimport { DreamingThornweaver } from './minion/dreaming-thornweaver';\r\nimport { DrustfallenButcher } from './minion/drustfallen-butcher';\r\nimport { EchoingRoar } from './minion/echoing-roar';\r\nimport { EfficientEngineer } from './minion/efficient-engineer';\r\nimport { ElectricSynthesizer } from './minion/electric-synthesizer';\r\nimport { EliteNavigator } from './minion/elite-navigator';\r\nimport { EternalTycoon } from './minion/eternal-tycoon';\r\nimport { ExceptionalCaretaker } from './minion/exceptionnal-caretaker';\r\nimport { ExpertAviator } from './minion/expert-aviator';\r\nimport { ExpertTechnician } from './minion/expert-technician';\r\nimport { FairyGillmother } from './minion/fairy-gillmother';\r\nimport { FaunaWhisperer } from './minion/fauna-whisperer';\r\nimport { Felhorn } from './minion/felhorn';\r\nimport { Festergut } from './minion/festergut';\r\nimport { FireForgedEvoker } from './minion/fire-forged-evoker';\r\nimport { FirescaleHoarder } from './minion/firescale-hoarder';\r\nimport { FireworksFanatic } from './minion/fireworks-fanatic';\r\nimport { FlightyScout } from './minion/flighty-scout';\r\nimport { FloatingWatcher } from './minion/floating-watcher';\r\nimport { FlotsamFlinger } from './minion/flotsam-flinger';\r\nimport { ForestRover } from './minion/forest-rover';\r\nimport { ForsakenWeaver } from './minion/forsaken-weaver';\r\nimport { FountainChiller } from './minion/fountain-chiller';\r\nimport { FriendlyBouncer } from './minion/friendly-bouncer';\r\nimport { FriendlyGeist } from './minion/friendly-geist';\r\nimport { FrostwolfLieutenant } from './minion/frostwolf-lieutenant';\r\nimport { Futurefin } from './minion/futurefin';\r\nimport { GearedGuard } from './minion/geared-guard';\r\nimport { GemRat } from './minion/gem-rat';\r\nimport { GemSmuggler } from './minion/gem-smuggler';\r\nimport { Gemsplitter } from './minion/gemsplitter';\r\nimport { GeneralDrakkisath } from './minion/general-drakkisath';\r\nimport { GentleDjinni } from './minion/gentle-djinni';\r\nimport { GentleStag } from './minion/gentle-stag';\r\nimport { GhoulOfTheFeast } from './minion/ghoul-of-the-feast';\r\nimport { GildedGargoyle } from './minion/gilded-gargoyle';\r\nimport { GleamingTrader } from './minion/gleaming-trader';\r\nimport { GlowgulletWarlord } from './minion/glowgullet-warlord';\r\nimport { GlowingCinder } from './minion/glowing-cinder';\r\nimport { GoldGrubber } from './minion/goldgrubber';\r\nimport { GoldrinnTheGreatWolf } from './minion/goldrinn-the-great-wolf';\r\nimport { GormlingGourmet } from './minion/gormling-gourmet';\r\nimport { GreaseBot } from './minion/grease-bot';\r\nimport { GreedySnaketongue } from './minion/greedy-snaketongue';\r\nimport { GreenVolumizer } from './minion/green-volumizer';\r\nimport { Greenskeeper } from './minion/greenskeeper';\r\nimport { GrimscaleElegist } from './minion/grimscale-elegist';\r\nimport { GrittyHeadhunter } from './minion/gritty-headhunter';\r\nimport { Hackerfin } from './minion/hackerfin';\r\nimport { HandlessForsaken } from './minion/handless-forsaken';\r\nimport { HardyOrca } from './minion/hardy-orca';\r\nimport { HarmlessBonehead } from './minion/harmless-bonehead';\r\nimport { HeroicUnderdog } from './minion/heroic-underdog';\r\nimport { HighkeeperRa } from './minion/highkeeper-ra';\r\nimport { HogWatcher } from './minion/hog-watcher';\r\nimport { HoloRover } from './minion/holo-rover';\r\nimport { HotSpringer } from './minion/hot-springer';\r\nimport { HummingBird } from './minion/humming-bird';\r\nimport { Humongozz } from './minion/humongozz';\r\nimport { HungrySnapjaw } from './minion/hungry-snapjaw';\r\nimport { HunterOfGatherers } from './minion/hunter-of-gatherers';\r\nimport { HuntingTigerShark } from './minion/hunting-tiger-shark';\r\nimport { Hydralisk } from './minion/hydralisk';\r\nimport { IgnitionSpecialist } from './minion/ignition-specialist';\r\nimport { Immortal } from './minion/immortal';\r\nimport { ImplantSubject } from './minion/implant-subject';\r\nimport { ImposingPercussionist } from './minion/imposing-percussionist';\r\nimport { ImpulsiveTrickster } from './minion/impulsive-trickster';\r\nimport { IndomitableMount } from './minion/indomitable-mount';\r\nimport { InspiringUnderdog } from './minion/inspiring-underdog';\r\nimport { InterrogatorWhitemane } from './minion/interrogator-whitemane';\r\nimport { JellyBelly } from './minion/jelly-belly';\r\nimport { JunkJouster } from './minion/junk-jouster';\r\nimport { KalecgosArcaneAspect } from './minion/kalecgos-arcane-aspect';\r\nimport { KangorsApprentice } from './minion/kangors-apprentice';\r\nimport { KarmicChameleon } from './minion/karmic-chameleon';\r\nimport { KingBagurgle } from './minion/king-bagurgle';\r\nimport { LeeroyTheReckless } from './minion/leeroy-the-reckless';\r\nimport { LightfangEnforcer } from './minion/lightfang-enforcer';\r\nimport { LightfeatherScreecher } from './minion/lightfeather-screecher';\r\nimport { LokholarFrostforger } from './minion/lokholar-frostforger';\r\nimport { LordOfTheRuins } from './minion/lord-of-the-ruins';\r\nimport { LostCityLooter } from './minion/lost-city-looter';\r\nimport { LovesickBalladist } from './minion/lovesick-balladist';\r\nimport { LowFlier } from './minion/low-flier';\r\nimport { Lurker } from './minion/lurker';\r\nimport { MagicfinApprentice } from './minion/magicfin-apprentice';\r\nimport { Malorne } from './minion/malorne';\r\nimport { Manasaber } from './minion/manasaber';\r\nimport { MarqueeTicker } from './minion/marquee-ticker';\r\nimport { MasterGadrin } from './minion/master-gadrin';\r\nimport { MawCaster } from './minion/maw-caster';\r\nimport { MechaJaraxxus } from './minion/mecha-jaraxxus';\r\nimport { MechagnomeInterpreter } from './minion/mechagnome-interpreter';\r\nimport { MechanizedGiftHorse } from './minion/mechanized-gift-horse';\r\nimport { Mechorse } from './minion/mechorse';\r\nimport { MenagerieJug } from './minion/menagerie-jug';\r\nimport { MetalDispenser } from './minion/metal-dispenser';\r\nimport { MetallicHunter } from './minion/metallic-hunter';\r\nimport { MisfitDragonling } from './minion/misfit-dragonling';\r\nimport { Monstrosity } from './minion/monstrosity';\r\nimport { MonstrousMacaw } from './minion/monstrous-macaw';\r\nimport { MoonsteelJuggernaut } from './minion/moonsteel-juggernaut';\r\nimport { Mothership } from './minion/mothership';\r\nimport { Mummifier } from './minion/mummifier';\r\nimport { Murcules } from './minion/murcules';\r\nimport { MurkbrineExpeditioner } from './minion/murkbrine-expeditioner';\r\nimport { Murky } from './minion/murky';\r\nimport { MurkySpashFisher } from './minion/murky-spash-fisher';\r\nimport { Mutalisk } from './minion/mutalisk';\r\nimport { MutatedLasher } from './minion/mutated-lasher';\r\nimport { MythraxTheUnraveler } from './minion/mythrax';\r\nimport { NalaaTheRedeemer } from './minion/nalaa-the-redeemer';\r\nimport { NeonAgent } from './minion/neon-agent';\r\nimport { NerubianDeathswarmer } from './minion/nerubian-deathswarmer';\r\nimport { NestSwarmer } from './minion/nest-swarmer';\r\nimport { NetherDrake } from './minion/nether-drake';\r\nimport { NightmareParTeaGuest } from './minion/nightmare-par-tea-guest';\r\nimport { NimbleHatchling } from './minion/nimble-hatchling';\r\nimport { Niuzao } from './minion/niuzao';\r\nimport { NoisulOfTheManyFaces } from './minion/noisul-of-the-many-faces';\r\nimport { ObsidianRavager } from './minion/obisidian-ravager';\r\nimport { OozelingGladiator } from './minion/oozeling-gladiator';\r\nimport { OperaticBelcher } from './minion/operatic-belcher';\r\nimport { OranomonosTheWilted } from './minion/oranomonos-the-wilted';\r\nimport { OutbackSmolderer } from './minion/outback-smolderer';\r\nimport { PaintSmudger } from './minion/paint-smudger';\r\nimport { ParchedWanderer } from './minion/parched-wanderer';\r\nimport { PashmarTheVengeful } from './minion/pashmar-the-vengeful';\r\nimport { PeggySturdybone } from './minion/peggy-sturdybone';\r\nimport { Photobomber } from './minion/photobomber';\r\nimport { PilotTheShredder } from './minion/pilot-the-shredder';\r\nimport { PilotedWhirlOTron } from './minion/piloted-whirl-o-tron';\r\nimport { Plankwalker } from './minion/plankwalker';\r\nimport { Poultron } from './minion/poultron';\r\nimport { PrimalfinLookout } from './minion/primalfin-lookout';\r\nimport { PrimevalMonstrosity } from './minion/primeval-monstrosity';\r\nimport { PrizedPromoDrake } from './minion/prized-promo-drake';\r\nimport { ProdigiousTusker } from './minion/prodigious-tusker';\r\nimport { ProfoundThinker } from './minion/profound-thinker';\r\nimport { Psychus } from './minion/psychus';\r\nimport { RadioStar } from './minion/radio-star';\r\nimport { Rampager } from './minion/rampager';\r\nimport { RapscallionRecruiter } from './minion/rapscallion-recruiter';\r\nimport { RaptorElder } from './minion/raptor-elder';\r\nimport { RazorfenFlapper } from './minion/razorfen-flapper';\r\nimport { RazorfenGeomancer } from './minion/razorfen-geomancer';\r\nimport { RazorfenVineweaver } from './minion/razorfen-vineweaver';\r\nimport { RazorgoreTheUntamed } from './minion/razorgore-the-untamed';\r\nimport { RecklessCliffdiver } from './minion/reckless-cliffdiver';\r\nimport { RedVolumizer } from './minion/red-volumizer';\r\nimport { RelentlessDeflector } from './minion/relentless-deflector';\r\nimport { RicketyRepairbot } from './minion/rickety-repairbot';\r\nimport { RideOrDie } from './minion/ride-or-die';\r\nimport { RipsnarlCaptain } from './minion/ripsnarl-captain';\r\nimport { Roach } from './minion/roach';\r\nimport { Roadboar } from './minion/roadboar';\r\nimport { RoaringRallier } from './minion/roaring-rallier';\r\nimport { RodeoPerformer } from './minion/rodeo-performer';\r\nimport { RuinsRenovator } from './minion/ruins-renovator';\r\nimport { RunedProgenitor } from './minion/runed-progenitor';\r\nimport { RylakMetalhead } from './minion/rylak-metalhead';\r\nimport { SaltyHog } from './minion/salty-hog';\r\nimport { SandSwirler } from './minion/sand-swirler';\r\nimport { SanguineRefiner } from './minion/sanguine-refiner';\r\nimport { SanlaynScribe } from './minion/sanlayn-scribe';\r\nimport { Scallywag } from './minion/scallywag';\r\nimport { Scourfin } from './minion/scourfin';\r\nimport { ScourgeHarvester } from './minion/scourge-harvester';\r\nimport { SelflessHero } from './minion/selfless-hero';\r\nimport { Shadowdancer } from './minion/shadowdancer';\r\nimport { ShadowyConstruct } from './minion/shadowy-construct';\r\nimport { SharpEyedSabretooth } from './minion/sharp-eyed-sabretooth';\r\nimport { SharptoothSnapper } from './minion/sharptooth-snapper';\r\nimport { ShellCollector } from './minion/shell-collector';\r\nimport { ShipMasterEudora } from './minion/ship-master-eudora';\r\nimport { ShipwreckedRascal } from './minion/shipwrecked-rascal';\r\nimport { ShoreMarauder } from './minion/shore-marauder';\r\nimport { ShowyCyclist } from './minion/showy-cyclist';\r\nimport { SilentEnforcer } from './minion/silent-enforcer';\r\nimport { SilithidBurrower } from './minion/silithid-burrower';\r\nimport { SilkyShimmermoth } from './minion/silky-shimmermoth';\r\nimport { SilverHandedRecruit } from './minion/silver-handed-recruit';\r\nimport { SindoreiStraightShot } from './minion/sinodorei-straight-shot';\r\nimport { SkulkingBristlemane } from './minion/skulking-bristlemane';\r\nimport { SkyPirateFlagbearer } from './minion/sky-pirate-flagbearer';\r\nimport { SkyPirateFlagbearerEnchantment } from './minion/sky-pirate-flagbearer-enchantment';\r\nimport { SleepySupporter } from './minion/sleepy-supporter';\r\nimport { SlumberSorcerer } from './minion/slumber-sorcerer';\r\nimport { SlyRaptor } from './minion/sly-raptor';\r\nimport { Smolderwing } from './minion/smolderwing';\r\nimport { SnackVendor } from './minion/snack-vendor';\r\nimport { SoulRewinder } from './minion/soul-rewinder';\r\nimport { Soulsplitter } from './minion/soulsplitter';\r\nimport { Spacefarer } from './minion/spacefarer';\r\nimport { SpellboundSoul } from './minion/spellbound-soul';\r\nimport { SpiritDrake } from './minion/spirit-drake';\r\nimport { SpiritOfAir } from './minion/spirit-of-air';\r\nimport { SpiritedWhimsydrake } from './minion/spirited-whimsydrake';\r\nimport { SpringySpriggan } from './minion/springy-spriggan';\r\nimport { StalwartKodo } from './minion/stalwart-kodo';\r\nimport { StellarFreebooter } from './minion/stellar-freebooter';\r\nimport { StitchedSalvager } from './minion/stitched-salvager';\r\nimport { StompingStegodon } from './minion/stomping-stegodon';\r\nimport { StompingStegodonEnchantment } from './minion/stomping-stegodon-enchantment';\r\nimport { StoneshellGuardian } from './minion/stoneshell-guardian';\r\nimport { StormpikeLieutenant } from './minion/stormpike-lieutenant';\r\nimport { StraySatyr } from './minion/stray-satyr';\r\nimport { Stuntdrake } from './minion/stuntdrake';\r\nimport { SunkenAdvocate } from './minion/sunken-advocate';\r\nimport { SuperConstructor } from './minion/super-constructor';\r\nimport { SurfNSurfCrabRiding } from './minion/surf-n-surf-crab-riding';\r\nimport { SurfingSylvar } from './minion/surfing-slyvar';\r\nimport { Swampstriker } from './minion/swampstriker';\r\nimport { Tamuzo } from './minion/tamuzo';\r\nimport { TheGladIator } from './minion/the-glad-iator';\r\nimport { TheLastOneStanding } from './minion/the-last-one-standing';\r\nimport { Thorncaller } from './minion/thorncaller';\r\nimport { ThreeLilQuilboar } from './minion/three-lil-quilboar';\r\nimport { ThunderingAbomination } from './minion/thundering-abomination';\r\nimport { Tichondrius } from './minion/tichondrius';\r\nimport { TimewarpedAlleycat } from './minion/timewarped-alleycat';\r\nimport { TimewarpedArchimonde } from './minion/timewarped-archimonde';\r\nimport { TimewarpedArm } from './minion/timewarped-arm';\r\nimport { TimewarpedBassgill } from './minion/timewarped-bassgill';\r\nimport { TimewarpedBloodbinder } from './minion/timewarped-bloodbinder';\r\nimport { TimewarpedBonker } from './minion/timewarped-bonker';\r\nimport { TimewarpedBotani } from './minion/timewarped-botani';\r\nimport { TimewarpedBristler } from './minion/timewarped-bristler';\r\nimport { TimewarpedCalligrapher } from './minion/timewarped-calligrapher';\r\nimport { TimewarpedCaretaker } from './minion/timewarped-caretaker';\r\nimport { TimewarpedCenturion } from './minion/timewarped-centurion';\r\nimport { TimewarpedChameleon } from './minion/timewarped-chameleon';\r\nimport { TimewarpedChimera } from './minion/timewarped-chimera';\r\nimport { TimewarpedClefthoof } from './minion/timewarped-clefthoof';\r\nimport { TimewarpedCollector } from './minion/timewarped-collector';\r\nimport { TimewarpedCopter } from './minion/timewarped-copter';\r\nimport { TimewarpedDeadstomper } from './minion/timewarped-deadstomper';\r\nimport { TimewarpedDeathswarmer } from './minion/timewarped-deathswarmer';\r\nimport { TimewarpedDragonling } from './minion/timewarped-dragonling';\r\nimport { TimewarpedDuskmaw } from './minion/timewarped-duskmaw';\r\nimport { TimewarpedElectron } from './minion/timewarped-electron';\r\nimport { TimewarpedElegist } from './minion/timewarped-elegist';\r\nimport { TimewarpedEmbalmer } from './minion/timewarped-embalmer';\r\nimport { TimewarpedExpeditioner } from './minion/timewarped-expeditioner';\r\nimport { TimewarpedFestergut } from './minion/timewarped-festergut';\r\nimport { TimewarpedGeist } from './minion/timewarped-geist';\r\nimport { TimewarpedGemsplitter } from './minion/timewarped-gemsplitter';\r\nimport { TimewarpedGeomancer } from './minion/timewarped-geomancer';\r\nimport { TimewarpedGhoulAcabra } from './minion/timewarped-ghoul-acabra';\r\nimport { TimewarpedGoldrinn } from './minion/timewarped-goldrinn';\r\nimport { TimewarpedGreaseBot } from './minion/timewarped-grease-bot';\r\nimport { TimewarpedGreenskeeper } from './minion/timewarped-greenskeeper';\r\nimport { TimewarpedGuard } from './minion/timewarped-guard';\r\nimport { TimewarpedHawkstrider } from './minion/timewarped-hawkstrider';\r\nimport { TimewarpedHootail } from './minion/timewarped-hooktail';\r\nimport { TimewarpedHunter } from './minion/timewarped-hunter';\r\nimport { TimewarpedHyena } from './minion/timewarped-hyena';\r\nimport { TimewarpedIckyImp } from './minion/timewarped-icky-imp';\r\nimport { TimewarpedImmortal } from './minion/timewarped-immortal';\r\nimport { TimewarpedInterpreter } from './minion/timewarped-interpreter';\r\nimport { TimewarpedJazzer } from './minion/timewarped-jazzer';\r\nimport { TimewarpedJellyBelly } from './minion/timewarped-jelly-belly';\r\nimport { TimewarpedJungleKing } from './minion/timewarped-jungle-king';\r\nimport { TimewarpedKarathress } from './minion/timewarped-karathress';\r\nimport { TimewarpedKilrek } from './minion/timewarped-kilrek';\r\nimport { TimewarpedLabRat } from './minion/timewarped-lab-rat';\r\nimport { TimewarpedLilQuilboar } from './minion/timewarped-lil-quilboar';\r\nimport { TimewarpedLowFlier } from './minion/timewarped-low-flier';\r\nimport { TimewarpedMagnanimoose } from './minion/timewarped-magnanimoose';\r\nimport { TimewarpedMothership } from './minion/timewarped-mothership';\r\nimport { TimewarpedMrrrglr } from './minion/timewarped-mrrrglr';\r\nimport { TimewarpedMurcules } from './minion/timewarped-murcules';\r\nimport { TimewarpedMurkEye } from './minion/timewarped-murk-eye';\r\nimport { TimewarpedMurky } from './minion/timewarped-murky';\r\nimport { TimewarpedMythrax } from './minion/timewarped-mythraw';\r\nimport { TimewarpedNalaa } from './minion/timewarped-nalaa';\r\nimport { TimewarpedNelliesShip } from './minion/timewarped-nellies-ship';\r\nimport { TimewarpedNestSwarmer } from './minion/timewarped-nest-swarmer';\r\nimport { TimewarpedPainter } from './minion/timewarped-painter';\r\nimport { TimewarpedPaleofin } from './minion/timewarped-paleofin';\r\nimport { TimewarpedPashmar } from './minion/timewarped-pashmar';\r\nimport { TimewarpedPeggy } from './minion/timewarped-peggy';\r\nimport { TimewarpedPillager } from './minion/timewarped-pillager';\r\nimport { TimewarpedPiper } from './minion/timewarped-piper';\r\nimport { TimewarpedPrimscale } from './minion/timewarped-primscale';\r\nimport { TimewarpedProbius } from './minion/timewarped-probius';\r\nimport { TimewarpedPromoDrake } from './minion/timewarped-promo-drake';\r\nimport { TimewarpedRadioStar } from './minion/timewarped-radio-star';\r\nimport { TimewarpedRagnaros } from './minion/timewarped-ragnaros';\r\nimport { TimewarpedRecycler } from './minion/timewarped-recycler';\r\nimport { TimewarpedRedWhelp } from './minion/timewarped-red-whelp';\r\nimport { TimewarpedRewinder } from './minion/timewarped-rewinder';\r\nimport { TimewarpedRiplash } from './minion/timewarped-riplash';\r\nimport { TimewarpedSapper } from './minion/timewarped-sapper';\r\nimport { TimewarpedSaurolisk } from './minion/timewarped-saurolisk';\r\nimport { TimewarpedScourfin } from './minion/timewarped-scourfin';\r\nimport { TimewarpedSeaGlass } from './minion/timewarped-sea-glass';\r\nimport { TimewarpedSellemental } from './minion/timewarped-sellemental';\r\nimport { TimewarpedSensei } from './minion/timewarped-sensei';\r\nimport { TimewarpedShadowdancer } from './minion/timewarped-shadowdancer';\r\nimport { TimewarpedSpiritOfAir } from './minion/timewarped-spirit-of-air';\r\nimport { TimewarpedSporebat } from './minion/timewarped-sporebat';\r\nimport { TimewarpedSteamer } from './minion/timewarped-steamer';\r\nimport { TimewarpedStoneDrake } from './minion/timewarped-stone-drake';\r\nimport { TimewarpedStormcloud } from './minion/timewarped-stormcloud';\r\nimport { TimewarpedSubstrate } from './minion/timewarped-substrate';\r\nimport { TimewarpedSwirler } from './minion/timewarped-swirler';\r\nimport { TimewarpedSylvar } from './minion/timewarped-sylvar';\r\nimport { TimewarpedTamuzo } from './minion/timewarped-tamuzo';\r\nimport { TimewarpedTender } from './minion/timewarped-tender';\r\nimport { TimewarpedThorncaller } from './minion/timewarped-thorncaller';\r\nimport { TimewarpedTideRazor } from './minion/timewarped-tide-razor';\r\nimport { TimewarpedTony } from './minion/timewarped-tony';\r\nimport { TimewarpedTraveler } from './minion/timewarped-traveler';\r\nimport { TimewarpedTrickster } from './minion/timewarped-trickster';\r\nimport { TimewarpedTwirler } from './minion/timewarped-twirler';\r\nimport { TimewarpedUltralisk } from './minion/timewarped-ultralisk';\r\nimport { TimewarpedVaelastrasz } from './minion/timewarped-vaelastrasz';\r\nimport { TimewarpedWargear } from './minion/timewarped-wargear';\r\nimport { TimewarpedWarghoul } from './minion/timewarped-warghoul';\r\nimport { TimewarpedWhelpSmuggler } from './minion/timewarped-whelp-smuggler';\r\nimport { TombPillager } from './minion/tomb-pillager';\r\nimport { TransmutedBramblewitch } from './minion/transmuted-bramblewitch';\r\nimport { TrenchFighter } from './minion/trench-fighter';\r\nimport { TunnelBlaster } from './minion/tunnel-blaster';\r\nimport { TurquoiseSkitterer } from './minion/turquoise-skitterer';\r\nimport { TuskedCamper } from './minion/tusked-camper';\r\nimport { TwilightBroodmother } from './minion/twilight-broodmother';\r\nimport { TwilightHatchling } from './minion/twilight-hatchling';\r\nimport { TwilightPrimordium } from './minion/twilight-primordium';\r\nimport { TwilightWatcher } from './minion/twilight-watcher';\r\nimport { Ultralisk } from './minion/ultralisk';\r\nimport { UltravioletAscendant } from './minion/ultraviolet-ascendant';\r\nimport { UnforgivingTreant } from './minion/unforgiving-treant';\r\nimport { UtilityDrone } from './minion/utility-drone';\r\nimport { ValiantTiger } from './minion/valiant-tiger';\r\nimport { VengefulProtector } from './minion/vengeful-protector';\r\nimport { VoidEarl } from './minion/void-earl';\r\nimport { VoidRay } from './minion/void-ray';\r\nimport { VorkaiGuardian } from './minion/vorkai-guardian';\r\nimport { WanderingWight } from './minion/wandering-wight';\r\nimport { Weebomination } from './minion/weebomination';\r\nimport { WhelpSmuggler } from './minion/whelp-smuggler';\r\nimport { WhelpWatcher } from './minion/whelp-watcher';\r\nimport { WhirlingLassOMatic } from './minion/whirling-lass-o-matic';\r\nimport { WhirringProtector } from './minion/whirring-protector';\r\nimport { WhirringProtectorEnchantment } from './minion/whirring-protector-enchantment';\r\nimport { WildfireElemental } from './minion/wildfire-elemental';\r\nimport { WispInTheShell } from './minion/wisp-in-the-shell';\r\nimport { WitchwingNestmatron } from './minion/witchwing-nestmatron';\r\nimport { WrathscaleRogue } from './minion/wrathscale-rogue';\r\nimport { YorikSmite } from './minion/yorik-smite';\r\nimport { YoungMurkEye } from './minion/young-murk-eye';\r\nimport { Yrel } from './minion/yrel';\r\nimport { Zergling } from './minion/zergling';\r\nimport { Zippers } from './minion/zippers';\r\nimport { RighteousCharge } from './quest-reward/righteous-charge';\r\nimport { AnglersLure } from './spellcraft/anglers-lure';\r\nimport { AzsharasHatchery } from './spellcraft/azsharas-hatchery';\r\nimport { CrabMount } from './spellcraft/crab-mount';\r\nimport { DeepBlues } from './spellcraft/deep-blues';\r\nimport { EvolvingStrategy } from './spellcraft/evolving-strategy';\r\nimport { GlowingCrown } from './spellcraft/glowing-crown';\r\nimport { GoldGun } from './spellcraft/gold-gun';\r\nimport { HarvestedPearl } from './spellcraft/harvested-pearl';\r\nimport { JustKeepSwimming } from './spellcraft/just-keep-swimming';\r\nimport { Meditation } from './spellcraft/meditation';\r\nimport { MiniTrident } from './spellcraft/mini-trident';\r\nimport { Reinvigoration } from './spellcraft/reinvigoration';\r\nimport { RimeOrReason } from './spellcraft/rime-or-reason';\r\nimport { RushingWinds } from './spellcraft/rushing-winds';\r\nimport { SickRiffs } from './spellcraft/sick-riffs';\r\nimport { SunkenSpells } from './spellcraft/sunken-spells';\r\nimport { SurgingScales } from './spellcraft/surging-scales';\r\nimport { Thaumaturgy } from './spellcraft/thaumaturgy';\r\nimport { TimewarpedCrown } from './spellcraft/timewarped-crown';\r\nimport { TimewarpedEelectrify } from './spellcraft/timewarped-eelectrify';\r\nimport { TimewarpedShoal } from './spellcraft/timewarped-shoal';\r\nimport { UnderseaMount } from './spellcraft/undersea-mount';\r\nimport { VeteransTactics } from './spellcraft/veterans-tactics';\r\nimport { AllPurposeKibble } from './trinket/all-purpose-kibble';\r\nimport { ArmOfTheEmpire } from './trinket/arm-of-the-empire';\r\nimport { ArtisanalUrn } from './trinket/artisanal-urn';\r\nimport { BalefulIncense } from './trinket/baleful-incense';\r\nimport { BassgillPortrait } from './trinket/bassgill-portrait';\r\nimport { BattleHorn } from './trinket/battle-horn';\r\nimport { BeetleBand } from './trinket/beetle-band';\r\nimport { BirdFeeder } from './trinket/bird-feeder';\r\nimport { CrochetedSungill } from './trinket/crocheted-sungill';\r\nimport { DaggerspineThrasher } from './trinket/daggerspine-thrasher';\r\nimport { DivineSignet } from './trinket/divine-signet';\r\nimport { EclecticShrine } from './trinket/eclectic-shrine';\r\nimport { FaerieDragonScale } from './trinket/faerie-dragon-scale';\r\nimport { GhostlyYmirjar } from './trinket/ghostly-ymirjar';\r\nimport { HeraldSticker } from './trinket/herald-sticker';\r\nimport { HogwashBasin } from './trinket/hogwash-basin';\r\nimport { SaltscaleHoncho } from './trinket/saltscale-honcho';\r\nimport { SepulchralSergeant } from './trinket/sepulchral-sergent';\r\nimport { StharaSticker } from './trinket/sthara-sticker';\r\nimport { UnholySanctum } from './trinket/unholy-sanctum';\r\nimport { VashjirAnemone } from './trinket/vashjir-anemone';\r\nimport { WintergraspGhoul } from './trinket/wintergrasp-ghoul';\r\nimport { YulonSticker } from './trinket/yulon-sticker';\r\n\r\nconst cards = [\r\n\tShinyRing,\r\n\tMagicfinApprentice,\r\n\tRaptorElder,\r\n\tRighteousCharge,\r\n\tAvalancheCaller,\r\n\tBileSpitter,\r\n\tBigwigBandit,\r\n\tLostCityLooter,\r\n\tShipwreckedRascal,\r\n\tColdlightDiver,\r\n\tCanopySwinger,\r\n\tLightfeatherScreecher,\r\n\tHotSpringer,\r\n\tFlotsamFlinger,\r\n\tYoungMurkEye,\r\n\tYorikSmite,\r\n\tShipMasterEudora,\r\n\tOranomonosTheWilted,\r\n\tScourgeHarvester,\r\n\tSharpEyedSabretooth,\r\n\tCharmwing,\r\n\tStompingStegodon,\r\n\tGearedGuard,\r\n\tStompingStegodonEnchantment,\r\n\tTuskedCamper,\r\n\tNimbleHatchling,\r\n\tBlueWhelp,\r\n\tDaggerspineThrasher,\r\n\tFrostwolfFervor,\r\n\tStormpike,\r\n\tTwilightWatcher,\r\n\tVengefulProtector,\r\n\tPrimevalMonstrosity,\r\n\tProdigiousTusker,\r\n\tRoadboar,\r\n\tRazorfenVineweaver,\r\n\tHogWatcher,\r\n\tSanguineRefiner,\r\n\tBloodsnoutWarlord,\r\n\tSleepySupporter,\r\n\tGreedySnaketongue,\r\n\tDrakkariEmbalmer,\r\n\tFriendlyGeist,\r\n\tWrathscaleRogue,\r\n\tRideOrDie,\r\n\tAllSeeingElder,\r\n\tExceptionalCaretaker,\r\n\tYrel,\r\n\tRuinsRenovator,\r\n\tCampfireShadow,\r\n\tCarapaceRaiser,\r\n\tWhirringProtector,\r\n\tWhirringProtectorEnchantment,\r\n\tGleamingTrader,\r\n\tDevoutHellcaller,\r\n\tCupcakePeddler,\r\n\tSilentEnforcer,\r\n\tLordOfTheRuins,\r\n\tStraySatyr,\r\n\tVoidEarl,\r\n\tPoultron,\r\n\tFireworksFanatic,\r\n\tBassgillPortrait,\r\n\tApprenticeOfSefin,\r\n\tGormlingGourmet,\r\n\tFlightyScout,\r\n\tGrimscaleElegist,\r\n\tMurkbrineExpeditioner,\r\n\tDivineSignet,\r\n\tSilithidBurrower,\r\n\tCrochetedSungill,\r\n\tBeetleBand,\r\n\tHeraldSticker,\r\n\tAllPurposeKibble,\r\n\tSilkyShimmermoth,\r\n\tAlleycat,\r\n\tFaunaWhisperer,\r\n\tFloatingWatcher,\r\n\tSlumberSorcerer,\r\n\tCoilskarSapper,\r\n\tMonstrousMacaw,\r\n\tHogwashBasin,\r\n\tDreamingThornweaver,\r\n\tFelhorn,\r\n\tRelentlessDeflector,\r\n\tPhotobomber,\r\n\tStellarFreebooter,\r\n\tSkulkingBristlemane,\r\n\tSharptoothSnapper,\r\n\tValiantTiger,\r\n\t// AmplifyingLightspawn,\r\n\tGlowingCinder,\r\n\tSandSwirler,\r\n\tBonker,\r\n\tThorncaller,\r\n\tVashjirAnemone,\r\n\tGlowgulletWarlord,\r\n\tCorruptedBristler,\r\n\tGreenskeeper,\r\n\tMawCaster,\r\n\tDastardlyDrust,\r\n\tEliteNavigator,\r\n\tSurfingSylvar,\r\n\tGoldGrubber,\r\n\tUnholySanctum,\r\n\tHumongozz,\r\n\tArtisanalUrn,\r\n\tDrustfallenButcher,\r\n\tNoisulOfTheManyFaces,\r\n\tFirescaleHoarder,\r\n\tIgnitionSpecialist,\r\n\tBalefulIncense,\r\n\tSpiritedWhimsydrake,\r\n\tBirdFeeder,\r\n\tFireForgedEvoker,\r\n\tBronzeSteward,\r\n\tMetallicHunter,\r\n\tYulonSticker,\r\n\tBattleHorn,\r\n\tFaerieDragonScale,\r\n\tSpringySpriggan,\r\n\tRicketyRepairbot,\r\n\tMechagnomeInterpreter,\r\n\tAutoAssembler,\r\n\tAutoAssemblerEnchantment,\r\n\tDeadstomper,\r\n\tArmOfTheEmpire,\r\n\tEternalTycoon,\r\n\tBattlecruiser,\r\n\tSharingIsCaring,\r\n\tLowFlier,\r\n\tZergling,\r\n\tHydralisk,\r\n\tBaneling,\r\n\tMutalisk,\r\n\tLurker,\r\n\tRoach,\r\n\tUltralisk,\r\n\tColossus,\r\n\tCarrier,\r\n\tImmortal,\r\n\tVoidRay,\r\n\tMothership,\r\n\tCaptainBonerender,\r\n\tGentleStag,\r\n\tBellowingTyrant,\r\n\tStitchedSalvager,\r\n\tMythraxTheUnraveler,\r\n\tWildfireElemental,\r\n\tHoloRover,\r\n\tForestRover,\r\n\tBeetle,\r\n\tBuzzingVermin,\r\n\tGemRat,\r\n\tNestSwarmer,\r\n\tRunedProgenitor,\r\n\tTurquoiseSkitterer,\r\n\tEfficientEngineer,\r\n\tNetherDrake,\r\n\tElectricSynthesizer,\r\n\tEclecticShrine,\r\n\tSelflessHero,\r\n\tNightmareParTeaGuest,\r\n\tVorkaiGuardian,\r\n\tOutbackSmolderer,\r\n\tRazorgoreTheUntamed,\r\n\tUltravioletAscendant,\r\n\tTwilightPrimordium,\r\n\tGentleDjinni,\r\n\tMoonsteelJuggernaut,\r\n\tMarqueeTicker,\r\n\tRecklessCliffdiver,\r\n\tFountainChiller,\r\n\tNeonAgent,\r\n\tLokholarFrostforger,\r\n\tImplantSubject,\r\n\tHackerfin,\r\n\tBubbleGunner,\r\n\tFairyGillmother,\r\n\tShowyCyclist,\r\n\tArcaneCannoneer,\r\n\tMutatedLasher,\r\n\tGloriousGloop,\r\n\tSilverHandedRecruit,\r\n\tSaltyHog,\r\n\tSpacefarer,\r\n\tGrittyHeadhunter,\r\n\tCrystalInfuserEnchantment,\r\n\tBoarGamer,\r\n\tBannerboar,\r\n\tWanderingWight,\r\n\tDeathlyStriker,\r\n\tWispInTheShell,\r\n\tHandlessForsaken,\r\n\tHarmlessBonehead,\r\n\tCadaverCaretaker,\r\n\tHungrySnapjaw,\r\n\tNiuzao,\r\n\tBirdBuddy,\r\n\tSlyRaptor,\r\n\tManasaber,\r\n\tRylakMetalhead,\r\n\tHummingBird,\r\n\tMechanizedGiftHorse,\r\n\tMechorse,\r\n\tIndomitableMount,\r\n\tKarmicChameleon,\r\n\tGoldrinnTheGreatWolf,\r\n\tImpulsiveTrickster,\r\n\tMechaJaraxxus,\r\n\tWhelpSmuggler,\r\n\tHunterOfGatherers,\r\n\tBlazingSkyfin,\r\n\tGeneralDrakkisath,\r\n\tSmolderwing,\r\n\tMisfitDragonling,\r\n\tKalecgosArcaneAspect,\r\n\tGreaseBot,\r\n\tClunkerJunker,\r\n\tKangorsApprentice,\r\n\tDeflectoBot,\r\n\tSwampstriker,\r\n\tMurky,\r\n\tOperaticBelcher,\r\n\tParchedWanderer,\r\n\tPrimalfinLookout,\r\n\tKingBagurgle,\r\n\tShellCollector,\r\n\tTunnelBlaster,\r\n\tLeeroyTheReckless,\r\n\tInterrogatorWhitemane,\r\n\tOozelingGladiator,\r\n\tRodeoPerformer,\r\n\tAssistantGuard,\r\n\tAridAtrocity,\r\n\tInspiringUnderdog,\r\n\tLightfangEnforcer,\r\n\tDefiantShipwright,\r\n\tPeggySturdybone,\r\n\tRapscallionRecruiter,\r\n\tLovesickBalladist,\r\n\tObsidianRavager,\r\n\tRoaringRallier,\r\n\tAdmiralElizaGoreblade,\r\n\tSkyPirateFlagbearer,\r\n\tSkyPirateFlagbearerEnchantment,\r\n\tCruiseController,\r\n\tRipsnarlCaptain,\r\n\tScallywag,\r\n\tRazorfenGeomancer,\r\n\tCharlga,\r\n\tGemSmuggler,\r\n\tBongoBopper,\r\n\tThreeLilQuilboar,\r\n\tAnubarakNerubianKing,\r\n\tNerubianDeathswarmer,\r\n\tSindoreiStraightShot,\r\n\tChampionOfThePrimus,\r\n\tMummifier,\r\n\tEchoingRoar,\r\n\tStharaSticker,\r\n\tMenagerieJug,\r\n\tThunderingAbomination,\r\n\tPrizedPromoDrake,\r\n\tTransmutedBramblewitch,\r\n\tFriendlyBouncer,\r\n\tImposingPercussionist,\r\n\tSoulRewinder,\r\n\tHardyOrca,\r\n\tHuntingTigerShark,\r\n\tStalwartKodo,\r\n\tStuntdrake,\r\n\tTwilightBroodmother,\r\n\tWhelpWatcher,\r\n\tTwilightHatchling,\r\n\tBlueVolumizer,\r\n\tRedVolumizer,\r\n\tGreenVolumizer,\r\n\tWhirlingLassOMatic,\r\n\tThaumaturgy,\r\n\tEvolvingStrategy,\r\n\tHarvestedPearl,\r\n\tReinvigoration,\r\n\tMeditation,\r\n\tRimeOrReason,\r\n\tRushingWinds,\r\n\tTimewarpedChimera,\r\n\tTimewarpedMagnanimoose,\r\n\tTimewarpedNestSwarmer,\r\n\tTimewarpedSwirler,\r\n\tShoreMarauder,\r\n\tTimewarpedStoneDrake,\r\n\tTimewarpedMythrax,\r\n\tTimewarpedWargear,\r\n\tTimewarpedCollector,\r\n\tTimewarpedIckyImp,\r\n\tUnderseaMount,\r\n\tBurgeoningWhelp,\r\n\tTimewarpedTraveler,\r\n\tSunkenAdvocate,\r\n\tBluesySiren,\r\n\tRazorfenFlapper,\r\n\tBriarbackDrummer,\r\n\tTrenchFighter,\r\n\tSpiritDrake,\r\n\tBrinyBootlegger,\r\n\tTombTurning,\r\n\tBroodOfNozdormu,\r\n\tWaveOfGold,\r\n\tHandOfDeios,\r\n\tEyesOfTheEarthMother,\r\n\tJellyBelly,\r\n\tTimewarpedJellyBelly,\r\n\tTimewarpedDeathswarmer,\r\n\tTimewarpedRecycler,\r\n\tTimewarpedPillager,\r\n\tFestergut,\r\n\tTimewarpedFestergut,\r\n\tPashmarTheVengeful,\r\n\tTimewarpedPashmar,\r\n\tTimewarpedEelectrify,\r\n\tTimewarpedSapper,\r\n\tTimewarpedPiper,\r\n\tTimewarpedThorncaller,\r\n\tTimewarpedGeomancer,\r\n\tTimewarpedJazzer,\r\n\tTimewarpedAlleycat,\r\n\tTimewarpedSaurolisk,\r\n\tTimewarpedHyena,\r\n\tTimewarpedSporebat,\r\n\tTimewarpedNelliesShip,\r\n\tTimewarpedSellemental,\r\n\tTimewarpedRagnaros,\r\n\tTimewarpedBotani,\r\n\tSpiritOfAir,\r\n\tTimewarpedSpiritOfAir,\r\n\tTimewarpedArm,\r\n\tTimewarpedWhelpSmuggler,\r\n\tTimewarpedShoal,\r\n\tTimewarpedGuard,\r\n\tTimewarpedSensei,\r\n\tTimewarpedCopter,\r\n\tTimewarpedHunter,\r\n\tTimewarpedMothership,\r\n\tScourfin,\r\n\tTimewarpedScourfin,\r\n\tBassgill,\r\n\tTimewarpedBassgill,\r\n\tMurcules,\r\n\tTimewarpedMurcules,\r\n\tTimewarpedElegist,\r\n\tTimewarpedRewinder,\r\n\tTimewarpedShadowdancer,\r\n\tTimewarpedKilrek,\r\n\tTimewarpedDragonling,\r\n\tTimewarpedLowFlier,\r\n\tTimewarpedRedWhelp,\r\n\tTimewarpedVaelastrasz,\r\n\tTimewarpedGeist,\r\n\tRadioStar,\r\n\tTimewarpedRadioStar,\r\n\tTimewarpedWarghoul,\r\n\tTimewarpedCaretaker,\r\n\tTimewarpedGhoulAcabra,\r\n\tTimewarpedDeadstomper,\r\n\tTimewarpedRiplash,\r\n\tTimewarpedKarathress,\r\n\tTimewarpedBonker,\r\n\tTimewarpedBristler,\r\n\tBloodGemBarrage,\r\n\tTimewarpedTwirler,\r\n\tTimewarpedLilQuilboar,\r\n\tGemsplitter,\r\n\tTimewarpedGemsplitter,\r\n\tTimewarpedChameleon,\r\n\tTimewarpedGoldrinn,\r\n\tTimewarpedHawkstrider,\r\n\tTimewarpedTamuzo,\r\n\tTimewarpedJungleKing,\r\n\tTimewarpedClefthoof,\r\n\tTimewarpedSeaGlass,\r\n\tTimewarpedStormcloud,\r\n\tTimewarpedSubstrate,\r\n\tTimewarpedCrown,\r\n\tTimewarpedTideRazor,\r\n\tTimewarpedTender,\r\n\tTimewarpedCloningDevice,\r\n\tTimewarpedMasterThief,\r\n\tTimewarpedOnTheHouse,\r\n\tTimewarpedRatInTheCage,\r\n\tTimewarpedBananas,\r\n\tTimewarpedRitual,\r\n\tTimewarpedEvolution,\r\n\tTimewarpedCorpse,\r\n\tTimewarpedChefsChoice,\r\n\tTimewarpedSpecial,\r\n\tTimewarpedConch,\r\n\tTimewarpedGoldenizer,\r\n\tTimewarpedThief,\r\n\tTimewarpedUltralisk,\r\n\tTimewarpedInterpreter,\r\n\tTimewarpedProbius,\r\n\tTimewarpedImmortal,\r\n\tTimewarpedGreaseBot,\r\n\tTimewarpedSteamer,\r\n\tTimewarpedSylvar,\r\n\tTimewarpedTony,\r\n\tTimewarpedPeggy,\r\n\tTimewarpedMurky,\r\n\tTimewarpedExpeditioner,\r\n\tTimewarpedMurkEye,\r\n\tTimewarpedPainter,\r\n\tChoralMrrrglr,\r\n\tTimewarpedMrrrglr,\r\n\tTimewarpedPaleofin,\r\n\tTimewarpedTrickster,\r\n\tTimewarpedArchimonde,\r\n\tTimewarpedEmbalmer,\r\n\tTimewarpedCalligrapher,\r\n\tTimewarpedGreenskeeper,\r\n\tTimewarpedPromoDrake,\r\n\tTimewarpedDuskmaw,\r\n\tTimewarpedPrimscale,\r\n\tPlankwalker,\r\n\tMenagerieTableware,\r\n\tVeteransTactics,\r\n\tChargingCzarina,\r\n\tPaintSmudger,\r\n\tForsakenWeaver,\r\n\tTimewarpedBloodbinder,\r\n\tTimewarpedLabRat,\r\n\tTimewarpedNalaa,\r\n\tTimewarpedElectron,\r\n\tTimewarpedHootail,\r\n\tTimewarpedCenturion,\r\n\tApexisGuardian,\r\n\tMetalDispenser,\r\n\tUtilityDrone,\r\n\tSurfNSurfCrabRiding,\r\n\tCrabMount,\r\n\tTheGladIator,\r\n\tSwattingInsects,\r\n\tNalaaTheRedeemer,\r\n\tJunkJouster,\r\n\tMiniTrident,\r\n\tAnglersLure,\r\n\tGlowingCrown,\r\n\tAzsharasHatchery,\r\n\tGoldGun,\r\n\tSickRiffs,\r\n\tDeepBlues,\r\n\tJustKeepSwimming,\r\n\tSunkenSpells,\r\n\tSurgingScales,\r\n\tConveyorConstruct,\r\n\tAutoAccelerator,\r\n\tBuddingGreenthumb,\r\n\tWitchwingNestmatron,\r\n\tUnforgivingTreant,\r\n\tPsychus,\r\n\tHighkeeperRa,\r\n\tTheLastOneStanding,\r\n\tHeroicUnderdog,\r\n\tGhoulOfTheFeast,\r\n\tSoulsplitter,\r\n\tSpellboundSoul,\r\n\tSepulchralSergeant,\r\n\tWintergraspGhoul,\r\n\tGhostlyYmirjar,\r\n\tSaltscaleHoncho,\r\n\tExpertAviator,\r\n\tProfoundThinker,\r\n\tCostumeEnthusiast,\r\n\tDramaloc,\r\n\tFuturefin,\r\n\tArchaedas,\r\n\tTichondrius,\r\n\tArchimonde,\r\n\tSanlaynScribe,\r\n\tBriarbackBookie,\r\n\tShadowdancer,\r\n\tAshenCorruptor,\r\n\tStoneshellGuardian,\r\n\tMasterGadrin,\r\n\tPilotedWhirlOTron,\r\n\tSnackVendor,\r\n\tShadowyConstruct,\r\n\tTombPillager,\r\n\tGildedGargoyle,\r\n\tRampager,\r\n\tTamuzo,\r\n\tWeebomination,\r\n\tMonstrosity,\r\n\tFrostwolfLieutenant,\r\n\tPilotTheShredder,\r\n\tStormpikeLieutenant,\r\n\tFragrantPhylactery,\r\n\tFragrantPhylacteryEnchantment,\r\n\tExpertTechnician,\r\n\tDivineSparkbot,\r\n\tSuperConstructor,\r\n\tAzsharanCutlassier,\r\n\tMurkySpashFisher,\r\n\tMurkysFish,\r\n\tAzeriteEmpowerment,\r\n\tMalorne,\r\n\tLoackAndLoad,\r\n\tZippers,\r\n\tNaturalBlessing,\r\n\tBabyYshaarj,\r\n];\r\n\r\nexport const cardMappings: { [cardId: string]: Card } = {};\r\nfor (const card of cards) {\r\n\tconst cardIds = card.cardIds ?? [];\r\n\tfor (const cardId of cardIds) {\r\n\t\tcardMappings[cardId] = card;\r\n\t}\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"_card-mappings.js","sourceRoot":"","sources":["../../../src/cards/impl/_card-mappings.ts"],"names":[],"mappings":"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","sourcesContent":["import { Card } from '../card.interface';\r\nimport { AzeriteEmpowerment } from './bg-spell/azerite-empowerment';\r\nimport { BloodGemBarrage } from './bg-spell/blood-gem-barrage';\r\nimport { BroodOfNozdormu } from './bg-spell/brood-of-nozdormu';\r\nimport { EyesOfTheEarthMother } from './bg-spell/eyes-of-the-earth-mother';\r\nimport { HandOfDeios } from './bg-spell/hand-of-deios';\r\nimport { MenagerieTableware } from './bg-spell/menagerie-tableware';\r\nimport { MurkysFish } from './bg-spell/murkys-fish';\r\nimport { NaturalBlessing } from './bg-spell/natural-blessing';\r\nimport { SharingIsCaring } from './bg-spell/sharing-is-caring';\r\nimport { ShinyRing } from './bg-spell/shiny-ring';\r\nimport { TimewarpedBananas } from './bg-spell/timewarped-bananas';\r\nimport { TimewarpedChefsChoice } from './bg-spell/timewarped-chefs-choice';\r\nimport { TimewarpedCloningDevice } from './bg-spell/timewarped-cloning-device';\r\nimport { TimewarpedConch } from './bg-spell/timewarped-conch';\r\nimport { TimewarpedCorpse } from './bg-spell/timewarped-corpse';\r\nimport { TimewarpedEvolution } from './bg-spell/timewarped-evolution';\r\nimport { TimewarpedGoldenizer } from './bg-spell/timewarped-goldenizer';\r\nimport { TimewarpedMasterThief } from './bg-spell/timewarped-master-thief';\r\nimport { TimewarpedOnTheHouse } from './bg-spell/timewarped-on-the-house';\r\nimport { TimewarpedRatInTheCage } from './bg-spell/timewarped-rat-in-the-cage';\r\nimport { TimewarpedRitual } from './bg-spell/timewarped-ritual';\r\nimport { TimewarpedSpecial } from './bg-spell/timewarped-special';\r\nimport { TimewarpedThief } from './bg-spell/timewarped-thief';\r\nimport { TombTurning } from './bg-spell/tomb-turning';\r\nimport { WaveOfGold } from './bg-spell/wave-of-gold';\r\nimport { FragrantPhylactery } from './hero-power/fragrant-phylactery';\r\nimport { FragrantPhylacteryEnchantment } from './hero-power/fragrant-phylactery-enchantment';\r\nimport { FrostwolfFervor } from './hero-power/frostwolf-fervor';\r\nimport { GloriousGloop } from './hero-power/glorious-gloop';\r\nimport { LoackAndLoad } from './hero-power/lock-and-load';\r\nimport { Stormpike } from './hero-power/stormpike';\r\nimport { SwattingInsects } from './hero-power/swatting-insects';\r\nimport { AdmiralElizaGoreblade } from './minion/admiral-eliza-goreblade';\r\nimport { AllSeeingElder } from './minion/all-seeing-elder';\r\nimport { Alleycat } from './minion/alleycat';\r\nimport { AnubarakNerubianKing } from './minion/anubarak-nerubian-king';\r\nimport { ApexisGuardian } from './minion/apexis-guardian';\r\nimport { ApprenticeOfSefin } from './minion/apprentice-of-sefin';\r\nimport { ArcaneCannoneer } from './minion/arcane-cannoneer';\r\nimport { Archaedas } from './minion/archaedas';\r\nimport { Archimonde } from './minion/archimonde';\r\nimport { AridAtrocity } from './minion/arid-atrocity';\r\nimport { AshenCorruptor } from './minion/ashen-corruptor';\r\nimport { AssistantGuard } from './minion/assistant-guard';\r\nimport { AutoAccelerator } from './minion/auto-accelerator';\r\nimport { AutoAssembler } from './minion/auto-assembler';\r\nimport { AutoAssemblerEnchantment } from './minion/auto-assembler-enchantment';\r\nimport { AvalancheCaller } from './minion/avalanche-caller';\r\nimport { AzsharanCutlassier } from './minion/azsharan-cutlassier';\r\nimport { BabyYshaarj } from './minion/baby-yshaarj';\r\nimport { Baneling } from './minion/baneling';\r\nimport { Bannerboar } from './minion/bannerboar';\r\nimport { Bassgill } from './minion/bassgill';\r\nimport { Battlecruiser } from './minion/battlecruiser';\r\nimport { Beetle } from './minion/beetle';\r\nimport { BellowingTyrant } from './minion/bellowing-tyrant';\r\nimport { BigwigBandit } from './minion/bigwig-bandit';\r\nimport { BileSpitter } from './minion/bile-spitter';\r\nimport { BirdBuddy } from './minion/bird-buddy';\r\nimport { BlazingSkyfin } from './minion/blazing-skyfin';\r\nimport { BloodsnoutWarlord } from './minion/bloodsnout-warlord';\r\nimport { BlueVolumizer } from './minion/blue-volumizer';\r\nimport { BlueWhelp } from './minion/blue-whelp';\r\nimport { BluesySiren } from './minion/bluesy-siren';\r\nimport { BoarGamer } from './minion/boar-gamer';\r\nimport { BongoBopper } from './minion/bongo-bopper';\r\nimport { Bonker } from './minion/bonker';\r\nimport { BriarbackBookie } from './minion/briarback-bookie';\r\nimport { BriarbackDrummer } from './minion/briarback-drummer';\r\nimport { BrinyBootlegger } from './minion/briny-bootlegger';\r\nimport { BronzeSteward } from './minion/bronze-steward';\r\nimport { BubbleGunner } from './minion/bubble-gunner';\r\nimport { BuddingGreenthumb } from './minion/budding-greenthumb';\r\nimport { BurgeoningWhelp } from './minion/burgeoning-whelp';\r\nimport { BuzzingVermin } from './minion/buzzing-vermin';\r\nimport { CadaverCaretaker } from './minion/cadaver-caretaker';\r\nimport { CampfireShadow } from './minion/campfire-shadow';\r\nimport { CanopySwinger } from './minion/canopy-swinger';\r\nimport { CaptainBonerender } from './minion/captain-bonerender';\r\nimport { CarapaceRaiser } from './minion/carapace-raiser';\r\nimport { Carrier } from './minion/carrier';\r\nimport { ChampionOfThePrimus } from './minion/champion-of-the-primus';\r\nimport { ChargingCzarina } from './minion/charging-czarina';\r\nimport { Charlga } from './minion/charlga';\r\nimport { Charmwing } from './minion/charmwing';\r\nimport { ChoralMrrrglr } from './minion/choral-mrrrglr';\r\nimport { ClunkerJunker } from './minion/clunker-junker';\r\nimport { CoilskarSapper } from './minion/coilskar-sapper';\r\nimport { ColdlightDiver } from './minion/coldlight-diver';\r\nimport { Colossus } from './minion/colossus';\r\nimport { ConveyorConstruct } from './minion/conveyor-construct';\r\nimport { CorruptedBristler } from './minion/corrupted-bristler';\r\nimport { CostumeEnthusiast } from './minion/costume-enthusiast';\r\nimport { CruiseController } from './minion/cruise-controller';\r\nimport { CrystalInfuserEnchantment } from './minion/crystal-infuser-enchantment';\r\nimport { CupcakePeddler } from './minion/cupcake-peddler';\r\nimport { DastardlyDrust } from './minion/dastardly-drust';\r\nimport { Deadstomper } from './minion/deadstomper';\r\nimport { DeathlyStriker } from './minion/deathly-striker';\r\nimport { DefiantShipwright } from './minion/defiant-shipwright';\r\nimport { DeflectoBot } from './minion/deflecto-bot';\r\nimport { DevoutHellcaller } from './minion/devout-hellcaller';\r\nimport { DivineSparkbot } from './minion/divine-sparkbot';\r\nimport { DrakkariEmbalmer } from './minion/drakkari-embalmer';\r\nimport { Dramaloc } from './minion/dramaloc';\r\nimport { DreamingThornweaver } from './minion/dreaming-thornweaver';\r\nimport { DrustfallenButcher } from './minion/drustfallen-butcher';\r\nimport { EchoingRoar } from './minion/echoing-roar';\r\nimport { EfficientEngineer } from './minion/efficient-engineer';\r\nimport { ElectricSynthesizer } from './minion/electric-synthesizer';\r\nimport { EliteNavigator } from './minion/elite-navigator';\r\nimport { EternalTycoon } from './minion/eternal-tycoon';\r\nimport { ExceptionalCaretaker } from './minion/exceptionnal-caretaker';\r\nimport { ExpertAviator } from './minion/expert-aviator';\r\nimport { ExpertTechnician } from './minion/expert-technician';\r\nimport { FairyGillmother } from './minion/fairy-gillmother';\r\nimport { FaunaWhisperer } from './minion/fauna-whisperer';\r\nimport { Felhorn } from './minion/felhorn';\r\nimport { Festergut } from './minion/festergut';\r\nimport { FireForgedEvoker } from './minion/fire-forged-evoker';\r\nimport { FirescaleHoarder } from './minion/firescale-hoarder';\r\nimport { FireworksFanatic } from './minion/fireworks-fanatic';\r\nimport { FlightyScout } from './minion/flighty-scout';\r\nimport { FloatingWatcher } from './minion/floating-watcher';\r\nimport { FlotsamFlinger } from './minion/flotsam-flinger';\r\nimport { ForestRover } from './minion/forest-rover';\r\nimport { ForsakenWeaver } from './minion/forsaken-weaver';\r\nimport { FountainChiller } from './minion/fountain-chiller';\r\nimport { FriendlyBouncer } from './minion/friendly-bouncer';\r\nimport { FriendlyGeist } from './minion/friendly-geist';\r\nimport { FrostwolfLieutenant } from './minion/frostwolf-lieutenant';\r\nimport { Futurefin } from './minion/futurefin';\r\nimport { GearedGuard } from './minion/geared-guard';\r\nimport { GemRat } from './minion/gem-rat';\r\nimport { GemSmuggler } from './minion/gem-smuggler';\r\nimport { Gemsplitter } from './minion/gemsplitter';\r\nimport { GeneralDrakkisath } from './minion/general-drakkisath';\r\nimport { GentleDjinni } from './minion/gentle-djinni';\r\nimport { GentleStag } from './minion/gentle-stag';\r\nimport { GhoulOfTheFeast } from './minion/ghoul-of-the-feast';\r\nimport { GildedGargoyle } from './minion/gilded-gargoyle';\r\nimport { GleamingTrader } from './minion/gleaming-trader';\r\nimport { GlowgulletWarlord } from './minion/glowgullet-warlord';\r\nimport { GlowingCinder } from './minion/glowing-cinder';\r\nimport { GoldGrubber } from './minion/goldgrubber';\r\nimport { GoldrinnTheGreatWolf } from './minion/goldrinn-the-great-wolf';\r\nimport { GormlingGourmet } from './minion/gormling-gourmet';\r\nimport { GreaseBot } from './minion/grease-bot';\r\nimport { GreedySnaketongue } from './minion/greedy-snaketongue';\r\nimport { GreenVolumizer } from './minion/green-volumizer';\r\nimport { Greenskeeper } from './minion/greenskeeper';\r\nimport { GrimscaleElegist } from './minion/grimscale-elegist';\r\nimport { GrittyHeadhunter } from './minion/gritty-headhunter';\r\nimport { Hackerfin } from './minion/hackerfin';\r\nimport { HandlessForsaken } from './minion/handless-forsaken';\r\nimport { HardyOrca } from './minion/hardy-orca';\r\nimport { HarmlessBonehead } from './minion/harmless-bonehead';\r\nimport { HeroicUnderdog } from './minion/heroic-underdog';\r\nimport { HighkeeperRa } from './minion/highkeeper-ra';\r\nimport { HogWatcher } from './minion/hog-watcher';\r\nimport { HoloRover } from './minion/holo-rover';\r\nimport { HotSpringer } from './minion/hot-springer';\r\nimport { HummingBird } from './minion/humming-bird';\r\nimport { Humongozz } from './minion/humongozz';\r\nimport { HungrySnapjaw } from './minion/hungry-snapjaw';\r\nimport { HunterOfGatherers } from './minion/hunter-of-gatherers';\r\nimport { HuntingTigerShark } from './minion/hunting-tiger-shark';\r\nimport { Hydralisk } from './minion/hydralisk';\r\nimport { IgnitionSpecialist } from './minion/ignition-specialist';\r\nimport { Immortal } from './minion/immortal';\r\nimport { ImplantSubject } from './minion/implant-subject';\r\nimport { ImposingPercussionist } from './minion/imposing-percussionist';\r\nimport { ImpulsiveTrickster } from './minion/impulsive-trickster';\r\nimport { IndomitableMount } from './minion/indomitable-mount';\r\nimport { InspiringUnderdog } from './minion/inspiring-underdog';\r\nimport { InterrogatorWhitemane } from './minion/interrogator-whitemane';\r\nimport { JellyBelly } from './minion/jelly-belly';\r\nimport { JunkJouster } from './minion/junk-jouster';\r\nimport { KalecgosArcaneAspect } from './minion/kalecgos-arcane-aspect';\r\nimport { KangorsApprentice } from './minion/kangors-apprentice';\r\nimport { KarmicChameleon } from './minion/karmic-chameleon';\r\nimport { KingBagurgle } from './minion/king-bagurgle';\r\nimport { LeeroyTheReckless } from './minion/leeroy-the-reckless';\r\nimport { LightfangEnforcer } from './minion/lightfang-enforcer';\r\nimport { LightfeatherScreecher } from './minion/lightfeather-screecher';\r\nimport { LokholarFrostforger } from './minion/lokholar-frostforger';\r\nimport { LordOfTheRuins } from './minion/lord-of-the-ruins';\r\nimport { LostCityLooter } from './minion/lost-city-looter';\r\nimport { LovesickBalladist } from './minion/lovesick-balladist';\r\nimport { LowFlier } from './minion/low-flier';\r\nimport { Lurker } from './minion/lurker';\r\nimport { MagicfinApprentice } from './minion/magicfin-apprentice';\r\nimport { Malorne } from './minion/malorne';\r\nimport { Manasaber } from './minion/manasaber';\r\nimport { MarqueeTicker } from './minion/marquee-ticker';\r\nimport { MasterGadrin } from './minion/master-gadrin';\r\nimport { MawCaster } from './minion/maw-caster';\r\nimport { MechaJaraxxus } from './minion/mecha-jaraxxus';\r\nimport { MechagnomeInterpreter } from './minion/mechagnome-interpreter';\r\nimport { MechanizedGiftHorse } from './minion/mechanized-gift-horse';\r\nimport { Mechorse } from './minion/mechorse';\r\nimport { MenagerieJug } from './minion/menagerie-jug';\r\nimport { MetalDispenser } from './minion/metal-dispenser';\r\nimport { MetallicHunter } from './minion/metallic-hunter';\r\nimport { MisfitDragonling } from './minion/misfit-dragonling';\r\nimport { Monstrosity } from './minion/monstrosity';\r\nimport { MonstrousMacaw } from './minion/monstrous-macaw';\r\nimport { MoonsteelJuggernaut } from './minion/moonsteel-juggernaut';\r\nimport { Mothership } from './minion/mothership';\r\nimport { Mummifier } from './minion/mummifier';\r\nimport { Murcules } from './minion/murcules';\r\nimport { MurkbrineExpeditioner } from './minion/murkbrine-expeditioner';\r\nimport { Murky } from './minion/murky';\r\nimport { MurkySpashFisher } from './minion/murky-spash-fisher';\r\nimport { Mutalisk } from './minion/mutalisk';\r\nimport { MutatedLasher } from './minion/mutated-lasher';\r\nimport { MythraxTheUnraveler } from './minion/mythrax';\r\nimport { NalaaTheRedeemer } from './minion/nalaa-the-redeemer';\r\nimport { NeonAgent } from './minion/neon-agent';\r\nimport { NerubianDeathswarmer } from './minion/nerubian-deathswarmer';\r\nimport { NestSwarmer } from './minion/nest-swarmer';\r\nimport { NetherDrake } from './minion/nether-drake';\r\nimport { NightmareParTeaGuest } from './minion/nightmare-par-tea-guest';\r\nimport { NimbleHatchling } from './minion/nimble-hatchling';\r\nimport { Niuzao } from './minion/niuzao';\r\nimport { NoisulOfTheManyFaces } from './minion/noisul-of-the-many-faces';\r\nimport { ObsidianRavager } from './minion/obisidian-ravager';\r\nimport { OozelingGladiator } from './minion/oozeling-gladiator';\r\nimport { OperaticBelcher } from './minion/operatic-belcher';\r\nimport { OranomonosTheWilted } from './minion/oranomonos-the-wilted';\r\nimport { OutbackSmolderer } from './minion/outback-smolderer';\r\nimport { PaintSmudger } from './minion/paint-smudger';\r\nimport { ParchedWanderer } from './minion/parched-wanderer';\r\nimport { PashmarTheVengeful } from './minion/pashmar-the-vengeful';\r\nimport { PeggySturdybone } from './minion/peggy-sturdybone';\r\nimport { Photobomber } from './minion/photobomber';\r\nimport { PilotTheShredder } from './minion/pilot-the-shredder';\r\nimport { PilotedWhirlOTron } from './minion/piloted-whirl-o-tron';\r\nimport { Plankwalker } from './minion/plankwalker';\r\nimport { Poultron } from './minion/poultron';\r\nimport { PrimalfinLookout } from './minion/primalfin-lookout';\r\nimport { PrimevalMonstrosity } from './minion/primeval-monstrosity';\r\nimport { PrizedPromoDrake } from './minion/prized-promo-drake';\r\nimport { ProdigiousTusker } from './minion/prodigious-tusker';\r\nimport { ProfoundThinker } from './minion/profound-thinker';\r\nimport { Psychus } from './minion/psychus';\r\nimport { RadioStar } from './minion/radio-star';\r\nimport { Rampager } from './minion/rampager';\r\nimport { RapscallionRecruiter } from './minion/rapscallion-recruiter';\r\nimport { RaptorElder } from './minion/raptor-elder';\r\nimport { RazorfenFlapper } from './minion/razorfen-flapper';\r\nimport { RazorfenGeomancer } from './minion/razorfen-geomancer';\r\nimport { RazorfenVineweaver } from './minion/razorfen-vineweaver';\r\nimport { RazorgoreTheUntamed } from './minion/razorgore-the-untamed';\r\nimport { RecklessCliffdiver } from './minion/reckless-cliffdiver';\r\nimport { RedVolumizer } from './minion/red-volumizer';\r\nimport { RelentlessDeflector } from './minion/relentless-deflector';\r\nimport { RicketyRepairbot } from './minion/rickety-repairbot';\r\nimport { RideOrDie } from './minion/ride-or-die';\r\nimport { RipsnarlCaptain } from './minion/ripsnarl-captain';\r\nimport { Roach } from './minion/roach';\r\nimport { Roadboar } from './minion/roadboar';\r\nimport { RoaringRallier } from './minion/roaring-rallier';\r\nimport { RodeoPerformer } from './minion/rodeo-performer';\r\nimport { RuinsRenovator } from './minion/ruins-renovator';\r\nimport { RunedProgenitor } from './minion/runed-progenitor';\r\nimport { RylakMetalhead } from './minion/rylak-metalhead';\r\nimport { SaltyHog } from './minion/salty-hog';\r\nimport { SandSwirler } from './minion/sand-swirler';\r\nimport { SanguineRefiner } from './minion/sanguine-refiner';\r\nimport { SanlaynScribe } from './minion/sanlayn-scribe';\r\nimport { Scallywag } from './minion/scallywag';\r\nimport { Scourfin } from './minion/scourfin';\r\nimport { ScourgeHarvester } from './minion/scourge-harvester';\r\nimport { SelflessHero } from './minion/selfless-hero';\r\nimport { Shadowdancer } from './minion/shadowdancer';\r\nimport { ShadowyConstruct } from './minion/shadowy-construct';\r\nimport { SharpEyedSabretooth } from './minion/sharp-eyed-sabretooth';\r\nimport { SharptoothSnapper } from './minion/sharptooth-snapper';\r\nimport { ShellCollector } from './minion/shell-collector';\r\nimport { ShipMasterEudora } from './minion/ship-master-eudora';\r\nimport { ShipwreckedRascal } from './minion/shipwrecked-rascal';\r\nimport { ShoreMarauder } from './minion/shore-marauder';\r\nimport { ShowyCyclist } from './minion/showy-cyclist';\r\nimport { SilentEnforcer } from './minion/silent-enforcer';\r\nimport { SilithidBurrower } from './minion/silithid-burrower';\r\nimport { SilkyShimmermoth } from './minion/silky-shimmermoth';\r\nimport { SilverHandedRecruit } from './minion/silver-handed-recruit';\r\nimport { SindoreiStraightShot } from './minion/sinodorei-straight-shot';\r\nimport { SkulkingBristlemane } from './minion/skulking-bristlemane';\r\nimport { SkyPirateFlagbearer } from './minion/sky-pirate-flagbearer';\r\nimport { SkyPirateFlagbearerEnchantment } from './minion/sky-pirate-flagbearer-enchantment';\r\nimport { SleepySupporter } from './minion/sleepy-supporter';\r\nimport { SlumberSorcerer } from './minion/slumber-sorcerer';\r\nimport { SlyRaptor } from './minion/sly-raptor';\r\nimport { Smolderwing } from './minion/smolderwing';\r\nimport { SnackVendor } from './minion/snack-vendor';\r\nimport { SoulRewinder } from './minion/soul-rewinder';\r\nimport { Soulsplitter } from './minion/soulsplitter';\r\nimport { Spacefarer } from './minion/spacefarer';\r\nimport { SpellboundSoul } from './minion/spellbound-soul';\r\nimport { SpiritDrake } from './minion/spirit-drake';\r\nimport { SpiritOfAir } from './minion/spirit-of-air';\r\nimport { SpiritedWhimsydrake } from './minion/spirited-whimsydrake';\r\nimport { SpringySpriggan } from './minion/springy-spriggan';\r\nimport { StalwartKodo } from './minion/stalwart-kodo';\r\nimport { StellarFreebooter } from './minion/stellar-freebooter';\r\nimport { StitchedSalvager } from './minion/stitched-salvager';\r\nimport { StompingStegodon } from './minion/stomping-stegodon';\r\nimport { StompingStegodonEnchantment } from './minion/stomping-stegodon-enchantment';\r\nimport { StoneshellGuardian } from './minion/stoneshell-guardian';\r\nimport { StormpikeLieutenant } from './minion/stormpike-lieutenant';\r\nimport { StraySatyr } from './minion/stray-satyr';\r\nimport { Stuntdrake } from './minion/stuntdrake';\r\nimport { SunkenAdvocate } from './minion/sunken-advocate';\r\nimport { SuperConstructor } from './minion/super-constructor';\r\nimport { SurfNSurfCrabRiding } from './minion/surf-n-surf-crab-riding';\r\nimport { SurfingSylvar } from './minion/surfing-slyvar';\r\nimport { Swampstriker } from './minion/swampstriker';\r\nimport { Tamuzo } from './minion/tamuzo';\r\nimport { TheGladIator } from './minion/the-glad-iator';\r\nimport { TheLastOneStanding } from './minion/the-last-one-standing';\r\nimport { Thorncaller } from './minion/thorncaller';\r\nimport { ThreeLilQuilboar } from './minion/three-lil-quilboar';\r\nimport { ThunderingAbomination } from './minion/thundering-abomination';\r\nimport { Tichondrius } from './minion/tichondrius';\r\nimport { TimewarpedAlleycat } from './minion/timewarped-alleycat';\r\nimport { TimewarpedArchimonde } from './minion/timewarped-archimonde';\r\nimport { TimewarpedArm } from './minion/timewarped-arm';\r\nimport { TimewarpedBassgill } from './minion/timewarped-bassgill';\r\nimport { TimewarpedBloodbinder } from './minion/timewarped-bloodbinder';\r\nimport { TimewarpedBonker } from './minion/timewarped-bonker';\r\nimport { TimewarpedBotani } from './minion/timewarped-botani';\r\nimport { TimewarpedBristler } from './minion/timewarped-bristler';\r\nimport { TimewarpedCalligrapher } from './minion/timewarped-calligrapher';\r\nimport { TimewarpedCaretaker } from './minion/timewarped-caretaker';\r\nimport { TimewarpedCenturion } from './minion/timewarped-centurion';\r\nimport { TimewarpedChameleon } from './minion/timewarped-chameleon';\r\nimport { TimewarpedChimera } from './minion/timewarped-chimera';\r\nimport { TimewarpedClefthoof } from './minion/timewarped-clefthoof';\r\nimport { TimewarpedCollector } from './minion/timewarped-collector';\r\nimport { TimewarpedCopter } from './minion/timewarped-copter';\r\nimport { TimewarpedDeadstomper } from './minion/timewarped-deadstomper';\r\nimport { TimewarpedDeathswarmer } from './minion/timewarped-deathswarmer';\r\nimport { TimewarpedDragonling } from './minion/timewarped-dragonling';\r\nimport { TimewarpedDuskmaw } from './minion/timewarped-duskmaw';\r\nimport { TimewarpedElectron } from './minion/timewarped-electron';\r\nimport { TimewarpedElegist } from './minion/timewarped-elegist';\r\nimport { TimewarpedEmbalmer } from './minion/timewarped-embalmer';\r\nimport { TimewarpedExpeditioner } from './minion/timewarped-expeditioner';\r\nimport { TimewarpedFestergut } from './minion/timewarped-festergut';\r\nimport { TimewarpedGeist } from './minion/timewarped-geist';\r\nimport { TimewarpedGemsplitter } from './minion/timewarped-gemsplitter';\r\nimport { TimewarpedGeomancer } from './minion/timewarped-geomancer';\r\nimport { TimewarpedGhoulAcabra } from './minion/timewarped-ghoul-acabra';\r\nimport { TimewarpedGoldrinn } from './minion/timewarped-goldrinn';\r\nimport { TimewarpedGreaseBot } from './minion/timewarped-grease-bot';\r\nimport { TimewarpedGreenskeeper } from './minion/timewarped-greenskeeper';\r\nimport { TimewarpedGuard } from './minion/timewarped-guard';\r\nimport { TimewarpedHag } from './minion/timewarped-hag';\r\nimport { TimewarpedHawkstrider } from './minion/timewarped-hawkstrider';\r\nimport { TimewarpedHootail } from './minion/timewarped-hooktail';\r\nimport { TimewarpedHunter } from './minion/timewarped-hunter';\r\nimport { TimewarpedHyena } from './minion/timewarped-hyena';\r\nimport { TimewarpedIckyImp } from './minion/timewarped-icky-imp';\r\nimport { TimewarpedImmortal } from './minion/timewarped-immortal';\r\nimport { TimewarpedInterpreter } from './minion/timewarped-interpreter';\r\nimport { TimewarpedJazzer } from './minion/timewarped-jazzer';\r\nimport { TimewarpedJellyBelly } from './minion/timewarped-jelly-belly';\r\nimport { TimewarpedJungleKing } from './minion/timewarped-jungle-king';\r\nimport { TimewarpedKarathress } from './minion/timewarped-karathress';\r\nimport { TimewarpedKilrek } from './minion/timewarped-kilrek';\r\nimport { TimewarpedLabRat } from './minion/timewarped-lab-rat';\r\nimport { TimewarpedLilQuilboar } from './minion/timewarped-lil-quilboar';\r\nimport { TimewarpedLowFlier } from './minion/timewarped-low-flier';\r\nimport { TimewarpedMagnanimoose } from './minion/timewarped-magnanimoose';\r\nimport { TimewarpedMothership } from './minion/timewarped-mothership';\r\nimport { TimewarpedMrrrglr } from './minion/timewarped-mrrrglr';\r\nimport { TimewarpedMurcules } from './minion/timewarped-murcules';\r\nimport { TimewarpedMurkEye } from './minion/timewarped-murk-eye';\r\nimport { TimewarpedMurky } from './minion/timewarped-murky';\r\nimport { TimewarpedMythrax } from './minion/timewarped-mythraw';\r\nimport { TimewarpedNalaa } from './minion/timewarped-nalaa';\r\nimport { TimewarpedNelliesShip } from './minion/timewarped-nellies-ship';\r\nimport { TimewarpedNestSwarmer } from './minion/timewarped-nest-swarmer';\r\nimport { TimewarpedPainter } from './minion/timewarped-painter';\r\nimport { TimewarpedPaleofin } from './minion/timewarped-paleofin';\r\nimport { TimewarpedPashmar } from './minion/timewarped-pashmar';\r\nimport { TimewarpedPeggy } from './minion/timewarped-peggy';\r\nimport { TimewarpedPillager } from './minion/timewarped-pillager';\r\nimport { TimewarpedPiper } from './minion/timewarped-piper';\r\nimport { TimewarpedPrimscale } from './minion/timewarped-primscale';\r\nimport { TimewarpedProbius } from './minion/timewarped-probius';\r\nimport { TimewarpedPromoDrake } from './minion/timewarped-promo-drake';\r\nimport { TimewarpedRadioStar } from './minion/timewarped-radio-star';\r\nimport { TimewarpedRagnaros } from './minion/timewarped-ragnaros';\r\nimport { TimewarpedRecycler } from './minion/timewarped-recycler';\r\nimport { TimewarpedRedWhelp } from './minion/timewarped-red-whelp';\r\nimport { TimewarpedRewinder } from './minion/timewarped-rewinder';\r\nimport { TimewarpedRiplash } from './minion/timewarped-riplash';\r\nimport { TimewarpedSapper } from './minion/timewarped-sapper';\r\nimport { TimewarpedSaurolisk } from './minion/timewarped-saurolisk';\r\nimport { TimewarpedScourfin } from './minion/timewarped-scourfin';\r\nimport { TimewarpedSeaGlass } from './minion/timewarped-sea-glass';\r\nimport { TimewarpedSellemental } from './minion/timewarped-sellemental';\r\nimport { TimewarpedSensei } from './minion/timewarped-sensei';\r\nimport { TimewarpedShadowdancer } from './minion/timewarped-shadowdancer';\r\nimport { TimewarpedSpiritOfAir } from './minion/timewarped-spirit-of-air';\r\nimport { TimewarpedSporebat } from './minion/timewarped-sporebat';\r\nimport { TimewarpedSteamer } from './minion/timewarped-steamer';\r\nimport { TimewarpedStoneDrake } from './minion/timewarped-stone-drake';\r\nimport { TimewarpedStormcloud } from './minion/timewarped-stormcloud';\r\nimport { TimewarpedSubstrate } from './minion/timewarped-substrate';\r\nimport { TimewarpedSwirler } from './minion/timewarped-swirler';\r\nimport { TimewarpedSylvar } from './minion/timewarped-sylvar';\r\nimport { TimewarpedTamuzo } from './minion/timewarped-tamuzo';\r\nimport { TimewarpedTender } from './minion/timewarped-tender';\r\nimport { TimewarpedThorncaller } from './minion/timewarped-thorncaller';\r\nimport { TimewarpedTideRazor } from './minion/timewarped-tide-razor';\r\nimport { TimewarpedTony } from './minion/timewarped-tony';\r\nimport { TimewarpedTraveler } from './minion/timewarped-traveler';\r\nimport { TimewarpedTrickster } from './minion/timewarped-trickster';\r\nimport { TimewarpedTwirler } from './minion/timewarped-twirler';\r\nimport { TimewarpedUltralisk } from './minion/timewarped-ultralisk';\r\nimport { TimewarpedVaelastrasz } from './minion/timewarped-vaelastrasz';\r\nimport { TimewarpedWargear } from './minion/timewarped-wargear';\r\nimport { TimewarpedWarghoul } from './minion/timewarped-warghoul';\r\nimport { TimewarpedWhelpSmuggler } from './minion/timewarped-whelp-smuggler';\r\nimport { TombPillager } from './minion/tomb-pillager';\r\nimport { TransmutedBramblewitch } from './minion/transmuted-bramblewitch';\r\nimport { TrenchFighter } from './minion/trench-fighter';\r\nimport { TunnelBlaster } from './minion/tunnel-blaster';\r\nimport { TurquoiseSkitterer } from './minion/turquoise-skitterer';\r\nimport { TuskedCamper } from './minion/tusked-camper';\r\nimport { TwilightBroodmother } from './minion/twilight-broodmother';\r\nimport { TwilightHatchling } from './minion/twilight-hatchling';\r\nimport { TwilightPrimordium } from './minion/twilight-primordium';\r\nimport { TwilightWatcher } from './minion/twilight-watcher';\r\nimport { Ultralisk } from './minion/ultralisk';\r\nimport { UltravioletAscendant } from './minion/ultraviolet-ascendant';\r\nimport { UnforgivingTreant } from './minion/unforgiving-treant';\r\nimport { UtilityDrone } from './minion/utility-drone';\r\nimport { ValiantTiger } from './minion/valiant-tiger';\r\nimport { VengefulProtector } from './minion/vengeful-protector';\r\nimport { VoidEarl } from './minion/void-earl';\r\nimport { VoidRay } from './minion/void-ray';\r\nimport { VorkaiGuardian } from './minion/vorkai-guardian';\r\nimport { WanderingWight } from './minion/wandering-wight';\r\nimport { Weebomination } from './minion/weebomination';\r\nimport { WhelpSmuggler } from './minion/whelp-smuggler';\r\nimport { WhelpWatcher } from './minion/whelp-watcher';\r\nimport { WhirlingLassOMatic } from './minion/whirling-lass-o-matic';\r\nimport { WhirringProtector } from './minion/whirring-protector';\r\nimport { WhirringProtectorEnchantment } from './minion/whirring-protector-enchantment';\r\nimport { WildfireElemental } from './minion/wildfire-elemental';\r\nimport { WispInTheShell } from './minion/wisp-in-the-shell';\r\nimport { WitchwingNestmatron } from './minion/witchwing-nestmatron';\r\nimport { WrathscaleRogue } from './minion/wrathscale-rogue';\r\nimport { YorikSmite } from './minion/yorik-smite';\r\nimport { YoungMurkEye } from './minion/young-murk-eye';\r\nimport { Yrel } from './minion/yrel';\r\nimport { Zergling } from './minion/zergling';\r\nimport { Zippers } from './minion/zippers';\r\nimport { RighteousCharge } from './quest-reward/righteous-charge';\r\nimport { AnglersLure } from './spellcraft/anglers-lure';\r\nimport { AzsharasHatchery } from './spellcraft/azsharas-hatchery';\r\nimport { CrabMount } from './spellcraft/crab-mount';\r\nimport { DeepBlues } from './spellcraft/deep-blues';\r\nimport { EvolvingStrategy } from './spellcraft/evolving-strategy';\r\nimport { GlowingCrown } from './spellcraft/glowing-crown';\r\nimport { GoldGun } from './spellcraft/gold-gun';\r\nimport { HarvestedPearl } from './spellcraft/harvested-pearl';\r\nimport { JustKeepSwimming } from './spellcraft/just-keep-swimming';\r\nimport { Meditation } from './spellcraft/meditation';\r\nimport { MiniTrident } from './spellcraft/mini-trident';\r\nimport { Reinvigoration } from './spellcraft/reinvigoration';\r\nimport { RimeOrReason } from './spellcraft/rime-or-reason';\r\nimport { RushingWinds } from './spellcraft/rushing-winds';\r\nimport { SickRiffs } from './spellcraft/sick-riffs';\r\nimport { SunkenSpells } from './spellcraft/sunken-spells';\r\nimport { SurgingScales } from './spellcraft/surging-scales';\r\nimport { Thaumaturgy } from './spellcraft/thaumaturgy';\r\nimport { TimewarpedCrown } from './spellcraft/timewarped-crown';\r\nimport { TimewarpedEelectrify } from './spellcraft/timewarped-eelectrify';\r\nimport { TimewarpedShoal } from './spellcraft/timewarped-shoal';\r\nimport { UnderseaMount } from './spellcraft/undersea-mount';\r\nimport { VeteransTactics } from './spellcraft/veterans-tactics';\r\nimport { AllPurposeKibble } from './trinket/all-purpose-kibble';\r\nimport { ArmOfTheEmpire } from './trinket/arm-of-the-empire';\r\nimport { ArtisanalUrn } from './trinket/artisanal-urn';\r\nimport { BalefulIncense } from './trinket/baleful-incense';\r\nimport { BassgillPortrait } from './trinket/bassgill-portrait';\r\nimport { BattleHorn } from './trinket/battle-horn';\r\nimport { BeetleBand } from './trinket/beetle-band';\r\nimport { BirdFeeder } from './trinket/bird-feeder';\r\nimport { CrochetedSungill } from './trinket/crocheted-sungill';\r\nimport { DaggerspineThrasher } from './trinket/daggerspine-thrasher';\r\nimport { DivineSignet } from './trinket/divine-signet';\r\nimport { EclecticShrine } from './trinket/eclectic-shrine';\r\nimport { FaerieDragonScale } from './trinket/faerie-dragon-scale';\r\nimport { GhostlyYmirjar } from './trinket/ghostly-ymirjar';\r\nimport { HeraldSticker } from './trinket/herald-sticker';\r\nimport { HogwashBasin } from './trinket/hogwash-basin';\r\nimport { SaltscaleHoncho } from './trinket/saltscale-honcho';\r\nimport { SepulchralSergeant } from './trinket/sepulchral-sergent';\r\nimport { StharaSticker } from './trinket/sthara-sticker';\r\nimport { UnholySanctum } from './trinket/unholy-sanctum';\r\nimport { VashjirAnemone } from './trinket/vashjir-anemone';\r\nimport { WintergraspGhoul } from './trinket/wintergrasp-ghoul';\r\nimport { YulonSticker } from './trinket/yulon-sticker';\r\n\r\nconst cards = [\r\n\tShinyRing,\r\n\tMagicfinApprentice,\r\n\tRaptorElder,\r\n\tRighteousCharge,\r\n\tAvalancheCaller,\r\n\tBileSpitter,\r\n\tBigwigBandit,\r\n\tLostCityLooter,\r\n\tShipwreckedRascal,\r\n\tColdlightDiver,\r\n\tCanopySwinger,\r\n\tLightfeatherScreecher,\r\n\tHotSpringer,\r\n\tFlotsamFlinger,\r\n\tYoungMurkEye,\r\n\tYorikSmite,\r\n\tShipMasterEudora,\r\n\tOranomonosTheWilted,\r\n\tScourgeHarvester,\r\n\tSharpEyedSabretooth,\r\n\tCharmwing,\r\n\tStompingStegodon,\r\n\tGearedGuard,\r\n\tStompingStegodonEnchantment,\r\n\tTuskedCamper,\r\n\tNimbleHatchling,\r\n\tBlueWhelp,\r\n\tDaggerspineThrasher,\r\n\tFrostwolfFervor,\r\n\tStormpike,\r\n\tTwilightWatcher,\r\n\tVengefulProtector,\r\n\tPrimevalMonstrosity,\r\n\tProdigiousTusker,\r\n\tRoadboar,\r\n\tRazorfenVineweaver,\r\n\tHogWatcher,\r\n\tSanguineRefiner,\r\n\tBloodsnoutWarlord,\r\n\tSleepySupporter,\r\n\tGreedySnaketongue,\r\n\tDrakkariEmbalmer,\r\n\tFriendlyGeist,\r\n\tWrathscaleRogue,\r\n\tRideOrDie,\r\n\tAllSeeingElder,\r\n\tExceptionalCaretaker,\r\n\tYrel,\r\n\tRuinsRenovator,\r\n\tCampfireShadow,\r\n\tCarapaceRaiser,\r\n\tWhirringProtector,\r\n\tWhirringProtectorEnchantment,\r\n\tGleamingTrader,\r\n\tDevoutHellcaller,\r\n\tCupcakePeddler,\r\n\tSilentEnforcer,\r\n\tLordOfTheRuins,\r\n\tStraySatyr,\r\n\tVoidEarl,\r\n\tPoultron,\r\n\tFireworksFanatic,\r\n\tBassgillPortrait,\r\n\tApprenticeOfSefin,\r\n\tGormlingGourmet,\r\n\tFlightyScout,\r\n\tGrimscaleElegist,\r\n\tMurkbrineExpeditioner,\r\n\tDivineSignet,\r\n\tSilithidBurrower,\r\n\tCrochetedSungill,\r\n\tBeetleBand,\r\n\tHeraldSticker,\r\n\tAllPurposeKibble,\r\n\tSilkyShimmermoth,\r\n\tAlleycat,\r\n\tFaunaWhisperer,\r\n\tFloatingWatcher,\r\n\tSlumberSorcerer,\r\n\tCoilskarSapper,\r\n\tMonstrousMacaw,\r\n\tHogwashBasin,\r\n\tDreamingThornweaver,\r\n\tFelhorn,\r\n\tRelentlessDeflector,\r\n\tPhotobomber,\r\n\tStellarFreebooter,\r\n\tSkulkingBristlemane,\r\n\tSharptoothSnapper,\r\n\tValiantTiger,\r\n\t// AmplifyingLightspawn,\r\n\tGlowingCinder,\r\n\tSandSwirler,\r\n\tBonker,\r\n\tThorncaller,\r\n\tVashjirAnemone,\r\n\tGlowgulletWarlord,\r\n\tCorruptedBristler,\r\n\tGreenskeeper,\r\n\tMawCaster,\r\n\tDastardlyDrust,\r\n\tEliteNavigator,\r\n\tTimewarpedHag,\r\n\tSurfingSylvar,\r\n\tGoldGrubber,\r\n\tUnholySanctum,\r\n\tHumongozz,\r\n\tArtisanalUrn,\r\n\tDrustfallenButcher,\r\n\tNoisulOfTheManyFaces,\r\n\tFirescaleHoarder,\r\n\tIgnitionSpecialist,\r\n\tBalefulIncense,\r\n\tSpiritedWhimsydrake,\r\n\tBirdFeeder,\r\n\tFireForgedEvoker,\r\n\tBronzeSteward,\r\n\tMetallicHunter,\r\n\tYulonSticker,\r\n\tBattleHorn,\r\n\tFaerieDragonScale,\r\n\tSpringySpriggan,\r\n\tRicketyRepairbot,\r\n\tMechagnomeInterpreter,\r\n\tAutoAssembler,\r\n\tAutoAssemblerEnchantment,\r\n\tDeadstomper,\r\n\tArmOfTheEmpire,\r\n\tEternalTycoon,\r\n\tBattlecruiser,\r\n\tSharingIsCaring,\r\n\tLowFlier,\r\n\tZergling,\r\n\tHydralisk,\r\n\tBaneling,\r\n\tMutalisk,\r\n\tLurker,\r\n\tRoach,\r\n\tUltralisk,\r\n\tColossus,\r\n\tCarrier,\r\n\tImmortal,\r\n\tVoidRay,\r\n\tMothership,\r\n\tCaptainBonerender,\r\n\tGentleStag,\r\n\tBellowingTyrant,\r\n\tStitchedSalvager,\r\n\tMythraxTheUnraveler,\r\n\tWildfireElemental,\r\n\tHoloRover,\r\n\tForestRover,\r\n\tBeetle,\r\n\tBuzzingVermin,\r\n\tGemRat,\r\n\tNestSwarmer,\r\n\tRunedProgenitor,\r\n\tTurquoiseSkitterer,\r\n\tEfficientEngineer,\r\n\tNetherDrake,\r\n\tElectricSynthesizer,\r\n\tEclecticShrine,\r\n\tSelflessHero,\r\n\tNightmareParTeaGuest,\r\n\tVorkaiGuardian,\r\n\tOutbackSmolderer,\r\n\tRazorgoreTheUntamed,\r\n\tUltravioletAscendant,\r\n\tTwilightPrimordium,\r\n\tGentleDjinni,\r\n\tMoonsteelJuggernaut,\r\n\tMarqueeTicker,\r\n\tRecklessCliffdiver,\r\n\tFountainChiller,\r\n\tNeonAgent,\r\n\tLokholarFrostforger,\r\n\tImplantSubject,\r\n\tHackerfin,\r\n\tBubbleGunner,\r\n\tFairyGillmother,\r\n\tShowyCyclist,\r\n\tArcaneCannoneer,\r\n\tMutatedLasher,\r\n\tGloriousGloop,\r\n\tSilverHandedRecruit,\r\n\tSaltyHog,\r\n\tSpacefarer,\r\n\tGrittyHeadhunter,\r\n\tCrystalInfuserEnchantment,\r\n\tBoarGamer,\r\n\tBannerboar,\r\n\tWanderingWight,\r\n\tDeathlyStriker,\r\n\tWispInTheShell,\r\n\tHandlessForsaken,\r\n\tHarmlessBonehead,\r\n\tCadaverCaretaker,\r\n\tHungrySnapjaw,\r\n\tNiuzao,\r\n\tBirdBuddy,\r\n\tSlyRaptor,\r\n\tManasaber,\r\n\tRylakMetalhead,\r\n\tHummingBird,\r\n\tMechanizedGiftHorse,\r\n\tMechorse,\r\n\tIndomitableMount,\r\n\tKarmicChameleon,\r\n\tGoldrinnTheGreatWolf,\r\n\tImpulsiveTrickster,\r\n\tMechaJaraxxus,\r\n\tWhelpSmuggler,\r\n\tHunterOfGatherers,\r\n\tBlazingSkyfin,\r\n\tGeneralDrakkisath,\r\n\tSmolderwing,\r\n\tMisfitDragonling,\r\n\tKalecgosArcaneAspect,\r\n\tGreaseBot,\r\n\tClunkerJunker,\r\n\tKangorsApprentice,\r\n\tDeflectoBot,\r\n\tSwampstriker,\r\n\tMurky,\r\n\tOperaticBelcher,\r\n\tParchedWanderer,\r\n\tPrimalfinLookout,\r\n\tKingBagurgle,\r\n\tShellCollector,\r\n\tTunnelBlaster,\r\n\tLeeroyTheReckless,\r\n\tInterrogatorWhitemane,\r\n\tOozelingGladiator,\r\n\tRodeoPerformer,\r\n\tAssistantGuard,\r\n\tAridAtrocity,\r\n\tInspiringUnderdog,\r\n\tLightfangEnforcer,\r\n\tDefiantShipwright,\r\n\tPeggySturdybone,\r\n\tRapscallionRecruiter,\r\n\tLovesickBalladist,\r\n\tObsidianRavager,\r\n\tRoaringRallier,\r\n\tAdmiralElizaGoreblade,\r\n\tSkyPirateFlagbearer,\r\n\tSkyPirateFlagbearerEnchantment,\r\n\tCruiseController,\r\n\tRipsnarlCaptain,\r\n\tScallywag,\r\n\tRazorfenGeomancer,\r\n\tCharlga,\r\n\tGemSmuggler,\r\n\tBongoBopper,\r\n\tThreeLilQuilboar,\r\n\tAnubarakNerubianKing,\r\n\tNerubianDeathswarmer,\r\n\tSindoreiStraightShot,\r\n\tChampionOfThePrimus,\r\n\tMummifier,\r\n\tEchoingRoar,\r\n\tStharaSticker,\r\n\tMenagerieJug,\r\n\tThunderingAbomination,\r\n\tPrizedPromoDrake,\r\n\tTransmutedBramblewitch,\r\n\tFriendlyBouncer,\r\n\tImposingPercussionist,\r\n\tSoulRewinder,\r\n\tHardyOrca,\r\n\tHuntingTigerShark,\r\n\tStalwartKodo,\r\n\tStuntdrake,\r\n\tTwilightBroodmother,\r\n\tWhelpWatcher,\r\n\tTwilightHatchling,\r\n\tBlueVolumizer,\r\n\tRedVolumizer,\r\n\tGreenVolumizer,\r\n\tWhirlingLassOMatic,\r\n\tThaumaturgy,\r\n\tEvolvingStrategy,\r\n\tHarvestedPearl,\r\n\tReinvigoration,\r\n\tMeditation,\r\n\tRimeOrReason,\r\n\tRushingWinds,\r\n\tTimewarpedChimera,\r\n\tTimewarpedMagnanimoose,\r\n\tTimewarpedNestSwarmer,\r\n\tTimewarpedSwirler,\r\n\tShoreMarauder,\r\n\tTimewarpedStoneDrake,\r\n\tTimewarpedMythrax,\r\n\tTimewarpedWargear,\r\n\tTimewarpedCollector,\r\n\tTimewarpedIckyImp,\r\n\tUnderseaMount,\r\n\tBurgeoningWhelp,\r\n\tTimewarpedTraveler,\r\n\tSunkenAdvocate,\r\n\tBluesySiren,\r\n\tRazorfenFlapper,\r\n\tBriarbackDrummer,\r\n\tTrenchFighter,\r\n\tSpiritDrake,\r\n\tBrinyBootlegger,\r\n\tTombTurning,\r\n\tBroodOfNozdormu,\r\n\tWaveOfGold,\r\n\tHandOfDeios,\r\n\tEyesOfTheEarthMother,\r\n\tJellyBelly,\r\n\tTimewarpedJellyBelly,\r\n\tTimewarpedDeathswarmer,\r\n\tTimewarpedRecycler,\r\n\tTimewarpedPillager,\r\n\tFestergut,\r\n\tTimewarpedFestergut,\r\n\tPashmarTheVengeful,\r\n\tTimewarpedPashmar,\r\n\tTimewarpedEelectrify,\r\n\tTimewarpedSapper,\r\n\tTimewarpedPiper,\r\n\tTimewarpedThorncaller,\r\n\tTimewarpedGeomancer,\r\n\tTimewarpedJazzer,\r\n\tTimewarpedAlleycat,\r\n\tTimewarpedSaurolisk,\r\n\tTimewarpedHyena,\r\n\tTimewarpedSporebat,\r\n\tTimewarpedNelliesShip,\r\n\tTimewarpedSellemental,\r\n\tTimewarpedRagnaros,\r\n\tTimewarpedBotani,\r\n\tSpiritOfAir,\r\n\tTimewarpedSpiritOfAir,\r\n\tTimewarpedArm,\r\n\tTimewarpedWhelpSmuggler,\r\n\tTimewarpedShoal,\r\n\tTimewarpedGuard,\r\n\tTimewarpedSensei,\r\n\tTimewarpedCopter,\r\n\tTimewarpedHunter,\r\n\tTimewarpedMothership,\r\n\tScourfin,\r\n\tTimewarpedScourfin,\r\n\tBassgill,\r\n\tTimewarpedBassgill,\r\n\tMurcules,\r\n\tTimewarpedMurcules,\r\n\tTimewarpedElegist,\r\n\tTimewarpedRewinder,\r\n\tTimewarpedShadowdancer,\r\n\tTimewarpedKilrek,\r\n\tTimewarpedDragonling,\r\n\tTimewarpedLowFlier,\r\n\tTimewarpedRedWhelp,\r\n\tTimewarpedVaelastrasz,\r\n\tTimewarpedGeist,\r\n\tRadioStar,\r\n\tTimewarpedRadioStar,\r\n\tTimewarpedWarghoul,\r\n\tTimewarpedCaretaker,\r\n\tTimewarpedGhoulAcabra,\r\n\tTimewarpedDeadstomper,\r\n\tTimewarpedRiplash,\r\n\tTimewarpedKarathress,\r\n\tTimewarpedBonker,\r\n\tTimewarpedBristler,\r\n\tBloodGemBarrage,\r\n\tTimewarpedTwirler,\r\n\tTimewarpedLilQuilboar,\r\n\tGemsplitter,\r\n\tTimewarpedGemsplitter,\r\n\tTimewarpedChameleon,\r\n\tTimewarpedGoldrinn,\r\n\tTimewarpedHawkstrider,\r\n\tTimewarpedTamuzo,\r\n\tTimewarpedJungleKing,\r\n\tTimewarpedClefthoof,\r\n\tTimewarpedSeaGlass,\r\n\tTimewarpedStormcloud,\r\n\tTimewarpedSubstrate,\r\n\tTimewarpedCrown,\r\n\tTimewarpedTideRazor,\r\n\tTimewarpedTender,\r\n\tTimewarpedCloningDevice,\r\n\tTimewarpedMasterThief,\r\n\tTimewarpedOnTheHouse,\r\n\tTimewarpedRatInTheCage,\r\n\tTimewarpedBananas,\r\n\tTimewarpedRitual,\r\n\tTimewarpedEvolution,\r\n\tTimewarpedCorpse,\r\n\tTimewarpedChefsChoice,\r\n\tTimewarpedSpecial,\r\n\tTimewarpedConch,\r\n\tTimewarpedGoldenizer,\r\n\tTimewarpedThief,\r\n\tTimewarpedUltralisk,\r\n\tTimewarpedInterpreter,\r\n\tTimewarpedProbius,\r\n\tTimewarpedImmortal,\r\n\tTimewarpedGreaseBot,\r\n\tTimewarpedSteamer,\r\n\tTimewarpedSylvar,\r\n\tTimewarpedTony,\r\n\tTimewarpedPeggy,\r\n\tTimewarpedMurky,\r\n\tTimewarpedExpeditioner,\r\n\tTimewarpedMurkEye,\r\n\tTimewarpedPainter,\r\n\tChoralMrrrglr,\r\n\tTimewarpedMrrrglr,\r\n\tTimewarpedPaleofin,\r\n\tTimewarpedTrickster,\r\n\tTimewarpedArchimonde,\r\n\tTimewarpedEmbalmer,\r\n\tTimewarpedCalligrapher,\r\n\tTimewarpedGreenskeeper,\r\n\tTimewarpedPromoDrake,\r\n\tTimewarpedDuskmaw,\r\n\tTimewarpedPrimscale,\r\n\tPlankwalker,\r\n\tMenagerieTableware,\r\n\tVeteransTactics,\r\n\tChargingCzarina,\r\n\tPaintSmudger,\r\n\tForsakenWeaver,\r\n\tTimewarpedBloodbinder,\r\n\tTimewarpedLabRat,\r\n\tTimewarpedNalaa,\r\n\tTimewarpedElectron,\r\n\tTimewarpedHootail,\r\n\tTimewarpedCenturion,\r\n\tApexisGuardian,\r\n\tMetalDispenser,\r\n\tUtilityDrone,\r\n\tSurfNSurfCrabRiding,\r\n\tCrabMount,\r\n\tTheGladIator,\r\n\tSwattingInsects,\r\n\tNalaaTheRedeemer,\r\n\tJunkJouster,\r\n\tMiniTrident,\r\n\tAnglersLure,\r\n\tGlowingCrown,\r\n\tAzsharasHatchery,\r\n\tGoldGun,\r\n\tSickRiffs,\r\n\tDeepBlues,\r\n\tJustKeepSwimming,\r\n\tSunkenSpells,\r\n\tSurgingScales,\r\n\tConveyorConstruct,\r\n\tAutoAccelerator,\r\n\tBuddingGreenthumb,\r\n\tWitchwingNestmatron,\r\n\tUnforgivingTreant,\r\n\tPsychus,\r\n\tHighkeeperRa,\r\n\tTheLastOneStanding,\r\n\tHeroicUnderdog,\r\n\tGhoulOfTheFeast,\r\n\tSoulsplitter,\r\n\tSpellboundSoul,\r\n\tSepulchralSergeant,\r\n\tWintergraspGhoul,\r\n\tGhostlyYmirjar,\r\n\tSaltscaleHoncho,\r\n\tExpertAviator,\r\n\tProfoundThinker,\r\n\tCostumeEnthusiast,\r\n\tDramaloc,\r\n\tFuturefin,\r\n\tArchaedas,\r\n\tTichondrius,\r\n\tArchimonde,\r\n\tSanlaynScribe,\r\n\tBriarbackBookie,\r\n\tShadowdancer,\r\n\tAshenCorruptor,\r\n\tStoneshellGuardian,\r\n\tMasterGadrin,\r\n\tPilotedWhirlOTron,\r\n\tSnackVendor,\r\n\tShadowyConstruct,\r\n\tTombPillager,\r\n\tGildedGargoyle,\r\n\tRampager,\r\n\tTamuzo,\r\n\tWeebomination,\r\n\tMonstrosity,\r\n\tFrostwolfLieutenant,\r\n\tPilotTheShredder,\r\n\tStormpikeLieutenant,\r\n\tFragrantPhylactery,\r\n\tFragrantPhylacteryEnchantment,\r\n\tExpertTechnician,\r\n\tDivineSparkbot,\r\n\tSuperConstructor,\r\n\tAzsharanCutlassier,\r\n\tMurkySpashFisher,\r\n\tMurkysFish,\r\n\tAzeriteEmpowerment,\r\n\tMalorne,\r\n\tLoackAndLoad,\r\n\tZippers,\r\n\tNaturalBlessing,\r\n\tBabyYshaarj,\r\n];\r\n\r\nexport const cardMappings: { [cardId: string]: Card } = {};\r\nfor (const card of cards) {\r\n\tconst cardIds = card.cardIds ?? [];\r\n\tfor (const cardId of cardIds) {\r\n\t\tcardMappings[cardId] = card;\r\n\t}\r\n}\r\n"]}
|
|
@@ -11,12 +11,12 @@ exports.ForestRover = {
|
|
|
11
11
|
},
|
|
12
12
|
battlecry: (minion, input) => {
|
|
13
13
|
const mult = minion.cardId === "BG31_801_G" ? 2 : 1;
|
|
14
|
-
input.hero.globalInfo.BeetleAttackBuff = input.hero.globalInfo.BeetleAttackBuff +
|
|
14
|
+
input.hero.globalInfo.BeetleAttackBuff = input.hero.globalInfo.BeetleAttackBuff + 2 * mult;
|
|
15
15
|
input.hero.globalInfo.BeetleHealthBuff = input.hero.globalInfo.BeetleHealthBuff + 1 * mult;
|
|
16
16
|
input.board
|
|
17
17
|
.filter((e) => ["BG28_603t", "BG28_603t_G"].includes(e.cardId))
|
|
18
18
|
.forEach((e) => {
|
|
19
|
-
(0, stats_1.modifyStats)(e, minion,
|
|
19
|
+
(0, stats_1.modifyStats)(e, minion, 2 * mult, 1 * mult, input.board, input.hero, input.gameState);
|
|
20
20
|
});
|
|
21
21
|
return true;
|
|
22
22
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"forest-rover.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/forest-rover.ts"],"names":[],"mappings":";;;AAIA,+EAAiF;AACjF,qDAAwD;AAG3C,QAAA,WAAW,GAAyC;IAChE,OAAO,EAAE,0BAA8D;IACvE,gBAAgB,EAAE,CAAC,UAAuB,EAAE,KAAgC,EAA0B,EAAE;QACvG,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,IAAA,4CAAuB,eAA8C,cAAc,EAAE,KAAK,CAAC,CAAC;IACpG,CAAC;IACD,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3F,KAAK,CAAC,KAAK;aACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,4BAAyE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,CACvG;aACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,IAAA,mBAAW,EAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACJ,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"forest-rover.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/forest-rover.ts"],"names":[],"mappings":";;;AAIA,+EAAiF;AACjF,qDAAwD;AAG3C,QAAA,WAAW,GAAyC;IAChE,OAAO,EAAE,0BAA8D;IACvE,gBAAgB,EAAE,CAAC,UAAuB,EAAE,KAAgC,EAA0B,EAAE;QACvG,MAAM,cAAc,GAAG,UAAU,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpF,OAAO,IAAA,4CAAuB,eAA8C,cAAc,EAAE,KAAK,CAAC,CAAC;IACpG,CAAC;IACD,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3F,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,GAAG,CAAC,GAAG,IAAI,CAAC;QAC3F,KAAK,CAAC,KAAK;aACT,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,4BAAyE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,CACvG;aACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,IAAA,mBAAW,EAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QACJ,OAAO,IAAI,CAAC;IACb,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { BattlecryInput } from '../../../simulation/battlecries';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { simplifiedSpawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { BattlecryCard, DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nexport const ForestRover: DeathrattleSpawnCard & BattlecryCard = {\r\n\tcardIds: [CardIds.ForestRover_BG31_801, CardIds.ForestRover_BG31_801_G],\r\n\tdeathrattleSpawn: (deadEntity: BoardEntity, input: DeathrattleTriggeredInput): readonly BoardEntity[] => {\r\n\t\tconst numberOfSpawns = deadEntity.cardId === CardIds.ForestRover_BG31_801_G ? 2 : 1;\r\n\t\treturn simplifiedSpawnEntities(CardIds.BoonOfBeetles_BeetleToken_BG28_603t, numberOfSpawns, input);\r\n\t},\r\n\tbattlecry: (minion: BoardEntity, input: BattlecryInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.ForestRover_BG31_801_G ? 2 : 1;\r\n\t\tinput.hero.globalInfo.BeetleAttackBuff = input.hero.globalInfo.BeetleAttackBuff + 2 * mult;\r\n\t\tinput.hero.globalInfo.BeetleHealthBuff = input.hero.globalInfo.BeetleHealthBuff + 1 * mult;\r\n\t\tinput.board\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[CardIds.BoonOfBeetles_BeetleToken_BG28_603t, CardIds.Beetle_BG28_603t_G].includes(e.cardId as CardIds),\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tmodifyStats(e, minion, 2 * mult, 1 * mult, input.board, input.hero, input.gameState);\r\n\t\t\t});\r\n\t\treturn true;\r\n\t},\r\n};\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hardy-orca.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/hardy-orca.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AAG3C,QAAA,SAAS,GAAkB;IACvC,OAAO,EAAE,0BAA0D;
|
|
1
|
+
{"version":3,"file":"hardy-orca.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/hardy-orca.ts"],"names":[],"mappings":";;;AAEA,qDAAwD;AAG3C,QAAA,SAAS,GAAkB;IACvC,OAAO,EAAE,0BAA0D;IAInE,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAiC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC7F,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,IAAA,mBAAW,EAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1F;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { OnDamagedCard, OnDamagedInput } from '../../card.interface';\r\n\r\nexport const HardyOrca: OnDamagedCard = {\r\n\tcardIds: [CardIds.HardyOrca_BG34_312, CardIds.HardyOrca_BG34_312_G],\r\n\t// When multiple minions are damaged, the damage is first applied to all minions, then\r\n\t// the buff occurs\r\n\t// https://replays.firestoneapp.com/?reviewId=c3c7c2b0-1f61-4fac-a7fc-eda57ce8e16f&turn=13&action=3\r\n\tonDamaged: (minion: BoardEntity, input: OnDamagedInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.HardyOrca_BG34_312_G ? 2 : 1;\r\n\t\tconst targets = input.board.filter((e) => e !== minion && e.health > 0 && !e.definitelyDead);\r\n\t\tfor (const target of targets) {\r\n\t\t\tmodifyStats(target, minion, 1 * mult, 1 * mult, input.board, input.hero, input.gameState);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -15,10 +15,8 @@ exports.SilentEnforcer = {
|
|
|
15
15
|
...friendlyMinionsAliveAtStart.filter((e) => !(0, utils_1.hasCorrectTribe)(e, input.boardWithDeadEntityHero, reference_data_1.Race.DEMON, input.gameState.anomalies, input.gameState.allCards)),
|
|
16
16
|
...opponentMinionsAliveAtStart,
|
|
17
17
|
];
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
(0, attack_1.dealDamageToMinion)(target, input.otherBoard, input.otherBoardHero, minion, 2, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);
|
|
21
|
-
}
|
|
18
|
+
input.gameState.spectator.registerPowerTargets(minion, targets, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.otherBoardHero);
|
|
19
|
+
(0, attack_1.dealDamageToMinions)(targets, input.otherBoard, input.otherBoardHero, minion, 2, input.boardWithDeadEntity, input.boardWithDeadEntityHero, input.gameState);
|
|
22
20
|
}
|
|
23
21
|
return [];
|
|
24
22
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"silent-enforcer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/silent-enforcer.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,
|
|
1
|
+
{"version":3,"file":"silent-enforcer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/silent-enforcer.ts"],"names":[],"mappings":";;;AAAA,iEAAoD;AAGpD,uDAAiE;AAEjE,0CAAiD;AAGpC,QAAA,cAAc,GAAyB;IACnD,OAAO,EAAE,0BAAoE;IAC7E,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAA0B,EAAE;QACnG,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,MAAM,2BAA2B,GAAG,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QAC/G,MAAM,2BAA2B,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;QACtG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,OAAO,GAAG;gBAEf,GAAG,2BAA2B,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CACL,CAAC,IAAA,uBAAe,EACf,CAAC,EACD,KAAK,CAAC,uBAAuB,EAC7B,qBAAI,CAAC,KAAK,EACV,KAAK,CAAC,SAAS,CAAC,SAAS,EACzB,KAAK,CAAC,SAAS,CAAC,QAAQ,CACxB,CACF;gBAED,GAAG,2BAA2B;aAC9B,CAAC;YACF,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,CAC7C,MAAM,EACN,OAAO,EACP,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,cAAc,CACpB,CAAC;YACF,IAAA,4BAAmB,EAClB,OAAO,EACP,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,cAAc,EACpB,MAAM,EACN,CAAC,EACD,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,SAAS,CACf,CAAC;SACF;QACD,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["import { Race } from '@firestone-hs/reference-data';\r\nimport { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { dealDamageToMinions } from '../../../simulation/attack';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { hasCorrectTribe } from '../../../utils';\r\nimport { DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nexport const SilentEnforcer: DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.SilentEnforcer_BG33_156, CardIds.SilentEnforcer_BG33_156_G],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput): readonly BoardEntity[] => {\r\n\t\tconst mult = minion.cardId === CardIds.SilentEnforcer_BG33_156_G ? 2 : 1;\r\n\t\tconst friendlyMinionsAliveAtStart = input.boardWithDeadEntity.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\t\tconst opponentMinionsAliveAtStart = input.otherBoard.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\t\tfor (let i = 0; i < mult; i++) {\r\n\t\t\tconst targets = [\r\n\t\t\t\t// Friendly non-demons\r\n\t\t\t\t...friendlyMinionsAliveAtStart.filter(\r\n\t\t\t\t\t(e) =>\r\n\t\t\t\t\t\t!hasCorrectTribe(\r\n\t\t\t\t\t\t\te,\r\n\t\t\t\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\t\t\t\tRace.DEMON,\r\n\t\t\t\t\t\t\tinput.gameState.anomalies,\r\n\t\t\t\t\t\t\tinput.gameState.allCards,\r\n\t\t\t\t\t\t),\r\n\t\t\t\t),\r\n\t\t\t\t// All opponent minions\r\n\t\t\t\t...opponentMinionsAliveAtStart,\r\n\t\t\t];\r\n\t\t\tinput.gameState.spectator.registerPowerTargets(\r\n\t\t\t\tminion,\r\n\t\t\t\ttargets,\r\n\t\t\t\tinput.boardWithDeadEntity,\r\n\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\tinput.otherBoardHero,\r\n\t\t\t);\r\n\t\t\tdealDamageToMinions(\r\n\t\t\t\ttargets,\r\n\t\t\t\tinput.otherBoard,\r\n\t\t\t\tinput.otherBoardHero,\r\n\t\t\t\tminion,\r\n\t\t\t\t2,\r\n\t\t\t\tinput.boardWithDeadEntity,\r\n\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
|
|
@@ -6,7 +6,7 @@ exports.TimewarpedGeist = {
|
|
|
6
6
|
deathrattleSpawn: (minion, input) => {
|
|
7
7
|
const mult = minion.cardId === "BG34_Giant_034_G" ? 2 : 1;
|
|
8
8
|
input.boardWithDeadEntityHero.globalInfo.TavernSpellAttackBuff += 2 * mult;
|
|
9
|
-
input.boardWithDeadEntityHero.globalInfo.TavernSpellHealthBuff +=
|
|
9
|
+
input.boardWithDeadEntityHero.globalInfo.TavernSpellHealthBuff += 2 * mult;
|
|
10
10
|
return [];
|
|
11
11
|
},
|
|
12
12
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timewarped-geist.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-geist.ts"],"names":[],"mappings":";;;AAKa,QAAA,eAAe,GAAyB;IACpD,OAAO,EAAE,sCAAkF;IAC3F,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAA0B,EAAE;QACnG,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA6C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,qBAAqB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC3E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,qBAAqB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC3E,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nexport const TimewarpedGeist: DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.TimewarpedGeist_BG34_Giant_034, CardIds.TimewarpedGeist_BG34_Giant_034_G],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput): readonly BoardEntity[] => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedGeist_BG34_Giant_034_G ? 2 : 1;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.TavernSpellAttackBuff += 2 * mult;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.TavernSpellHealthBuff +=
|
|
1
|
+
{"version":3,"file":"timewarped-geist.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-geist.ts"],"names":[],"mappings":";;;AAKa,QAAA,eAAe,GAAyB;IACpD,OAAO,EAAE,sCAAkF;IAC3F,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAA0B,EAAE;QACnG,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA6C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,qBAAqB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC3E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,qBAAqB,IAAI,CAAC,GAAG,IAAI,CAAC;QAC3E,OAAO,EAAE,CAAC;IACX,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nexport const TimewarpedGeist: DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.TimewarpedGeist_BG34_Giant_034, CardIds.TimewarpedGeist_BG34_Giant_034_G],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput): readonly BoardEntity[] => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedGeist_BG34_Giant_034_G ? 2 : 1;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.TavernSpellAttackBuff += 2 * mult;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.TavernSpellHealthBuff += 2 * mult;\r\n\t\treturn [];\r\n\t},\r\n};\r\n"]}
|
|
@@ -12,7 +12,7 @@ exports.TimewarpedPainter = {
|
|
|
12
12
|
const baseBuff = (_a = minion.scriptDataNum1) !== null && _a !== void 0 ? _a : 1;
|
|
13
13
|
for (const target of targets) {
|
|
14
14
|
input.gameState.spectator.registerPowerTarget(minion, target, input.board, input.hero, input.otherHero);
|
|
15
|
-
(0, stats_1.modifyStats)(target, minion, 2 * baseBuff * mult,
|
|
15
|
+
(0, stats_1.modifyStats)(target, minion, 2 * baseBuff * mult, 2 * baseBuff * mult, input.board, input.hero, input.gameState);
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timewarped-painter.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-painter.ts"],"names":[],"mappings":";;;AAEA,uDAA2D;AAC3D,qDAAwD;AAG3C,QAAA,iBAAiB,GAAkB;IAC/C,OAAO,EAAE,sCAAsF;IAC/F,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;;QACzD,MAAM,OAAO,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,CAAC,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACxG,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,CAAC,GAAG,QAAQ,GAAG,IAAI,EACnB,CAAC,GAAG,QAAQ,GAAG,IAAI,EACnB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;SACF;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { getNeighbours } from '../../../simulation/attack';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { EndOfTurnCard, EndOfTurnInput } from '../../card.interface';\r\n\r\nexport const TimewarpedPainter: EndOfTurnCard = {\r\n\tcardIds: [CardIds.TimewarpedPainter_BG34_Giant_319, CardIds.TimewarpedPainter_BG34_Giant_319_G],\r\n\tendOfTurn: (minion: BoardEntity, input: EndOfTurnInput) => {\r\n\t\tconst targets = getNeighbours(input.board, minion);\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedPainter_BG34_Giant_319_G ? 2 : 1;\r\n\t\tconst baseBuff = minion.scriptDataNum1 ?? 1;\r\n\t\tfor (const target of targets) {\r\n\t\t\tinput.gameState.spectator.registerPowerTarget(minion, target, input.board, input.hero, input.otherHero);\r\n\t\t\tmodifyStats(\r\n\t\t\t\ttarget,\r\n\t\t\t\tminion,\r\n\t\t\t\t2 * baseBuff * mult,\r\n\t\t\t\
|
|
1
|
+
{"version":3,"file":"timewarped-painter.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-painter.ts"],"names":[],"mappings":";;;AAEA,uDAA2D;AAC3D,qDAAwD;AAG3C,QAAA,iBAAiB,GAAkB;IAC/C,OAAO,EAAE,sCAAsF;IAC/F,SAAS,EAAE,CAAC,MAAmB,EAAE,KAAqB,EAAE,EAAE;;QACzD,MAAM,OAAO,GAAG,IAAA,sBAAa,EAAC,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,QAAQ,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,CAAC,CAAC;QAC5C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC7B,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;YACxG,IAAA,mBAAW,EACV,MAAM,EACN,MAAM,EACN,CAAC,GAAG,QAAQ,GAAG,IAAI,EACnB,CAAC,GAAG,QAAQ,GAAG,IAAI,EACnB,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,IAAI,EACV,KAAK,CAAC,SAAS,CACf,CAAC;SACF;IACF,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { getNeighbours } from '../../../simulation/attack';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { EndOfTurnCard, EndOfTurnInput } from '../../card.interface';\r\n\r\nexport const TimewarpedPainter: EndOfTurnCard = {\r\n\tcardIds: [CardIds.TimewarpedPainter_BG34_Giant_319, CardIds.TimewarpedPainter_BG34_Giant_319_G],\r\n\tendOfTurn: (minion: BoardEntity, input: EndOfTurnInput) => {\r\n\t\tconst targets = getNeighbours(input.board, minion);\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedPainter_BG34_Giant_319_G ? 2 : 1;\r\n\t\tconst baseBuff = minion.scriptDataNum1 ?? 1;\r\n\t\tfor (const target of targets) {\r\n\t\t\tinput.gameState.spectator.registerPowerTarget(minion, target, input.board, input.hero, input.otherHero);\r\n\t\t\tmodifyStats(\r\n\t\t\t\ttarget,\r\n\t\t\t\tminion,\r\n\t\t\t\t2 * baseBuff * mult,\r\n\t\t\t\t2 * baseBuff * mult,\r\n\t\t\t\tinput.board,\r\n\t\t\t\tinput.hero,\r\n\t\t\t\tinput.gameState,\r\n\t\t\t);\r\n\t\t}\r\n\t},\r\n};\r\n"]}
|
|
@@ -4,7 +4,7 @@ exports.TimewarpedPashmar = void 0;
|
|
|
4
4
|
const cards_in_hand_1 = require("../../../simulation/cards-in-hand");
|
|
5
5
|
exports.TimewarpedPashmar = {
|
|
6
6
|
cardIds: ["BG34_Giant_211", "BG34_Giant_211_G"],
|
|
7
|
-
baseAvengeValue: (cardId) =>
|
|
7
|
+
baseAvengeValue: (cardId) => 3,
|
|
8
8
|
avenge: (minion, input) => {
|
|
9
9
|
var _a;
|
|
10
10
|
const mult = minion.cardId === "BG34_Giant_211_G" ? 2 : 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timewarped-pashmar.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-pashmar.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAGtD,QAAA,iBAAiB,GAAe;IAC5C,OAAO,EAAE,sCAAsF;IAC/F,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,UAAU,CAAC,IAAI,CACd,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,aAAa,EAAE,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,mCAAI,CAAC,EAAE,CAAC,CAC5F,CAAC;SACF;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,CAAC;SAClE;QACD,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const TimewarpedPashmar: AvengeCard = {\r\n\tcardIds: [CardIds.TimewarpedPashmar_BG34_Giant_211, CardIds.TimewarpedPashmar_BG34_Giant_211_G],\r\n\tbaseAvengeValue: (cardId: string) =>
|
|
1
|
+
{"version":3,"file":"timewarped-pashmar.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/timewarped-pashmar.ts"],"names":[],"mappings":";;;AAGA,qEAAmE;AAGtD,QAAA,iBAAiB,GAAe;IAC5C,OAAO,EAAE,sCAAsF;IAC/F,eAAe,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC;IACtC,MAAM,EAAE,CAAC,MAAmB,EAAE,KAAkB,EAAE,EAAE;;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,uBAA+C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClF,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,UAAU,CAAC,IAAI,CACd,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,aAAa,EAAE,MAAA,KAAK,CAAC,IAAI,CAAC,UAAU,mCAAI,CAAC,EAAE,CAAC,CAC5F,CAAC;SACF;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,oBAAoB,EAAE,CAAC,CAAC;SAClE;QACD,IAAA,8BAAc,EAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IACtE,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { AvengeInput } from '../../../simulation/avenge';\r\nimport { addCardsInHand } from '../../../simulation/cards-in-hand';\r\nimport { AvengeCard } from '../../card.interface';\r\n\r\nexport const TimewarpedPashmar: AvengeCard = {\r\n\tcardIds: [CardIds.TimewarpedPashmar_BG34_Giant_211, CardIds.TimewarpedPashmar_BG34_Giant_211_G],\r\n\tbaseAvengeValue: (cardId: string) => 3,\r\n\tavenge: (minion: BoardEntity, input: AvengeInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TimewarpedPashmar_BG34_Giant_211_G ? 2 : 1;\r\n\t\tconst cardsToAdd = [];\r\n\t\tfor (let i = 0; i < mult; i++) {\r\n\t\t\tcardsToAdd.push(\r\n\t\t\t\tinput.gameState.cardsData.getRandomSpellcraft({ maxTavernTier: input.hero.tavernTier ?? 3 }),\r\n\t\t\t);\r\n\t\t}\r\n\t\tfor (let i = 0; i < mult; i++) {\r\n\t\t\tcardsToAdd.push(input.gameState.cardsData.getRandomTavernSpell());\r\n\t\t}\r\n\t\taddCardsInHand(input.hero, input.board, cardsToAdd, input.gameState);\r\n\t},\r\n};\r\n"]}
|
|
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TurquoiseSkitterer = void 0;
|
|
4
4
|
const deathrattle_spawns_1 = require("../../../simulation/deathrattle-spawns");
|
|
5
5
|
const stats_1 = require("../../../simulation/stats");
|
|
6
|
-
const atkBuff =
|
|
7
|
-
const hpBuff =
|
|
6
|
+
const atkBuff = 5;
|
|
7
|
+
const hpBuff = 5;
|
|
8
8
|
exports.TurquoiseSkitterer = {
|
|
9
9
|
cardIds: ["BG31_809", "BG31_809_G"],
|
|
10
10
|
deathrattleSpawn: (minion, input) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"turquoise-skitterer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/turquoise-skitterer.ts"],"names":[],"mappings":";;;AAGA,+EAAiF;AACjF,qDAAwD;AAGxD,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,MAAM,GAAG,CAAC,CAAC;AAEJ,QAAA,kBAAkB,GAAgD;IAC9E,OAAO,EAAE,0BAA4E;IACrF,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB;YACxD,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB,GAAG,OAAO,GAAG,IAAI,CAAC;QAC5E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB;YACxD,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAAC;QAC3E,KAAK,CAAC,mBAAmB;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,4BAAyE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,CACvG;aACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,IAAA,mBAAW,EACV,CAAC,EACD,MAAM,EACN,OAAO,GAAG,IAAI,EACd,MAAM,GAAG,IAAI,EACb,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,SAAS,CACf,CAAC;QACH,CAAC,CAAC,CAAC;QACJ,OAAO,IAAA,4CAAuB,eAA8C,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1F,CAAC;CACD,CAAC","sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"turquoise-skitterer.js","sourceRoot":"","sources":["../../../../src/cards/impl/minion/turquoise-skitterer.ts"],"names":[],"mappings":";;;AAGA,+EAAiF;AACjF,qDAAwD;AAGxD,MAAM,OAAO,GAAG,CAAC,CAAC;AAClB,MAAM,MAAM,GAAG,CAAC,CAAC;AAEJ,QAAA,kBAAkB,GAAgD;IAC9E,OAAO,EAAE,0BAA4E;IACrF,gBAAgB,EAAE,CAAC,MAAmB,EAAE,KAAgC,EAAE,EAAE;QAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,iBAA0C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB;YACxD,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB,GAAG,OAAO,GAAG,IAAI,CAAC;QAC5E,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB;YACxD,KAAK,CAAC,uBAAuB,CAAC,UAAU,CAAC,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAAC;QAC3E,KAAK,CAAC,mBAAmB;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACb,4BAAyE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAiB,CAAC,CACvG;aACA,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,IAAA,mBAAW,EACV,CAAC,EACD,MAAM,EACN,OAAO,GAAG,IAAI,EACd,MAAM,GAAG,IAAI,EACb,KAAK,CAAC,mBAAmB,EACzB,KAAK,CAAC,uBAAuB,EAC7B,KAAK,CAAC,SAAS,CACf,CAAC;QACH,CAAC,CAAC,CAAC;QACJ,OAAO,IAAA,4CAAuB,eAA8C,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1F,CAAC;CACD,CAAC","sourcesContent":["import { BoardEntity } from '../../../board-entity';\r\nimport { CardIds } from '../../../services/card-ids';\r\nimport { DeathrattleTriggeredInput } from '../../../simulation/deathrattle-on-trigger';\r\nimport { simplifiedSpawnEntities } from '../../../simulation/deathrattle-spawns';\r\nimport { modifyStats } from '../../../simulation/stats';\r\nimport { DeathrattleSpawnCard } from '../../card.interface';\r\n\r\nconst atkBuff = 5;\r\nconst hpBuff = 5;\r\n\r\nexport const TurquoiseSkitterer: DeathrattleSpawnCard & DeathrattleSpawnCard = {\r\n\tcardIds: [CardIds.TurquoiseSkitterer_BG31_809, CardIds.TurquoiseSkitterer_BG31_809_G],\r\n\tdeathrattleSpawn: (minion: BoardEntity, input: DeathrattleTriggeredInput) => {\r\n\t\tconst mult = minion.cardId === CardIds.TurquoiseSkitterer_BG31_809_G ? 2 : 1;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.BeetleAttackBuff =\r\n\t\t\tinput.boardWithDeadEntityHero.globalInfo.BeetleAttackBuff + atkBuff * mult;\r\n\t\tinput.boardWithDeadEntityHero.globalInfo.BeetleHealthBuff =\r\n\t\t\tinput.boardWithDeadEntityHero.globalInfo.BeetleHealthBuff + hpBuff * mult;\r\n\t\tinput.boardWithDeadEntity\r\n\t\t\t.filter((e) =>\r\n\t\t\t\t[CardIds.BoonOfBeetles_BeetleToken_BG28_603t, CardIds.Beetle_BG28_603t_G].includes(e.cardId as CardIds),\r\n\t\t\t)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tmodifyStats(\r\n\t\t\t\t\te,\r\n\t\t\t\t\tminion,\r\n\t\t\t\t\tatkBuff * mult,\r\n\t\t\t\t\thpBuff * mult,\r\n\t\t\t\t\tinput.boardWithDeadEntity,\r\n\t\t\t\t\tinput.boardWithDeadEntityHero,\r\n\t\t\t\t\tinput.gameState,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\treturn simplifiedSpawnEntities(CardIds.BoonOfBeetles_BeetleToken_BG28_603t, mult, input);\r\n\t},\r\n};\r\n"]}
|
|
@@ -14,6 +14,7 @@ export declare const getNeighbours: (board: BoardEntity[], entity: BoardEntity,
|
|
|
14
14
|
export declare const getLeftNeighbour: (board: BoardEntity[], entity: BoardEntity, deadEntityIndexFromRight?: number) => BoardEntity;
|
|
15
15
|
export declare const dealDamageToRandomEnemy: (boardToBeDamaged: BoardEntity[], boardToBeDamagedHero: BgsPlayerEntity, damageSource: BoardEntity, damage: number, boardWithAttackOrigin: BoardEntity[], boardWithAttackOriginHero: BgsPlayerEntity, gameState: FullGameState) => void;
|
|
16
16
|
export declare const dealDamageToMinion: (target: BoardEntity, board: BoardEntity[], hero: BgsPlayerEntity, damageSource: BoardEntity | BgsPlayerEntity, damage: number, otherBoard: BoardEntity[], otherHero: BgsPlayerEntity, gameState: FullGameState) => number;
|
|
17
|
+
export declare const dealDamageToMinions: (targets: BoardEntity[], board: BoardEntity[], hero: BgsPlayerEntity, damageSource: BoardEntity | BgsPlayerEntity, damage: number, otherBoard: BoardEntity[], otherHero: BgsPlayerEntity, gameState: FullGameState) => number;
|
|
17
18
|
export declare const getDefendingEntity: (defendingBoard: BoardEntity[], attackingEntity: BoardEntity, ignoreTaunts?: boolean) => BoardEntity;
|
|
18
19
|
export declare const bumpEntities: (entity: BoardEntity, bumpInto: BoardEntity, entityBoard: BoardEntity[], entityBoardHero: BgsPlayerEntity, otherBoard: BoardEntity[], otherHero: BgsPlayerEntity, gameState: FullGameState, applyVenomous?: boolean) => number;
|
|
19
20
|
export declare const processMinionDeath: (board1: BoardEntity[], board1Hero: BgsPlayerEntity, board2: BoardEntity[], board2Hero: BgsPlayerEntity, gameState: FullGameState, skipSummonWhenSpace?: boolean) => void;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.processMinionDeath = exports.bumpEntities = exports.getDefendingEntity = exports.dealDamageToMinion = exports.dealDamageToRandomEnemy = exports.getLeftNeighbour = exports.getNeighbours = exports.findNearestEnemies = exports.doFullAttack = exports.simulateAttack = void 0;
|
|
3
|
+
exports.processMinionDeath = exports.bumpEntities = exports.getDefendingEntity = exports.dealDamageToMinions = exports.dealDamageToMinion = exports.dealDamageToRandomEnemy = exports.getLeftNeighbour = exports.getNeighbours = exports.findNearestEnemies = exports.doFullAttack = exports.simulateAttack = void 0;
|
|
4
4
|
const card_interface_1 = require("../cards/card.interface");
|
|
5
5
|
const _card_mappings_1 = require("../cards/impl/_card-mappings");
|
|
6
6
|
const debug_state_1 = require("../debug-state");
|
|
@@ -280,6 +280,44 @@ const dealDamageToMinion = (target, board, hero, damageSource, damage, otherBoar
|
|
|
280
280
|
return actualDamageDone;
|
|
281
281
|
};
|
|
282
282
|
exports.dealDamageToMinion = dealDamageToMinion;
|
|
283
|
+
const dealDamageToMinions = (targets, board, hero, damageSource, damage, otherBoard, otherHero, gameState) => {
|
|
284
|
+
if (!(targets === null || targets === void 0 ? void 0 : targets.length)) {
|
|
285
|
+
return 0;
|
|
286
|
+
}
|
|
287
|
+
const actualDamagesDone = [];
|
|
288
|
+
const areDeadBeforeDamage = targets.map((target) => target.definitelyDead || target.health <= 0);
|
|
289
|
+
for (const target of targets) {
|
|
290
|
+
const fakeAttacker = {
|
|
291
|
+
...(damageSource || {}),
|
|
292
|
+
entityId: -1,
|
|
293
|
+
attack: damage,
|
|
294
|
+
};
|
|
295
|
+
const actualDamageDone = (0, exports.bumpEntities)(target, fakeAttacker, board, hero, otherBoard, otherHero, gameState);
|
|
296
|
+
actualDamagesDone.push(actualDamageDone);
|
|
297
|
+
if (fakeAttacker.attack > 0 && target.divineShield) {
|
|
298
|
+
(0, divine_shield_1.updateDivineShield)(target, board, hero, otherHero, false, gameState);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const spawns = [];
|
|
302
|
+
for (let i = 0; i < targets.length; i++) {
|
|
303
|
+
const target = targets[i];
|
|
304
|
+
const actualDamageDone = actualDamagesDone[i];
|
|
305
|
+
const isDeadBeforeDamage = areDeadBeforeDamage[i];
|
|
306
|
+
if (actualDamageDone > 0) {
|
|
307
|
+
const newSpawns = (0, damage_effects_1.onEntityDamaged)(target, board, hero, otherBoard, otherHero, damageSource, actualDamageDone, gameState);
|
|
308
|
+
}
|
|
309
|
+
if (!isDeadBeforeDamage && actualDamageDone > 0 && 'attack' in damageSource && 'health' in damageSource) {
|
|
310
|
+
target.lastAffectedByEntity = damageSource;
|
|
311
|
+
if (target.health <= 0 || target.definitelyDead) {
|
|
312
|
+
(0, minion_kill_1.onMinionKill)(damageSource, false, target, otherBoard, otherHero, board, hero, [], gameState);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
const defendingEntityIndex = board.map((entity) => entity.entityId).indexOf(target.entityId);
|
|
316
|
+
board[defendingEntityIndex] = target;
|
|
317
|
+
}
|
|
318
|
+
return actualDamagesDone.reduce((a, b) => a + b, 0);
|
|
319
|
+
};
|
|
320
|
+
exports.dealDamageToMinions = dealDamageToMinions;
|
|
283
321
|
const getDefendingEntity = (defendingBoard, attackingEntity, ignoreTaunts = false) => {
|
|
284
322
|
if (debug_state_1.debugState.active) {
|
|
285
323
|
for (const forcedFaceOff of debug_state_1.debugState.forcedFaceOff) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attack.js","sourceRoot":"","sources":["../../src/simulation/attack.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnAfterDeath, hasOnDeath } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { debugState } from '../debug-state';\r\nimport { updateDivineShield } from '../keywords/divine-shield';\r\nimport { updateVenomous } from '../keywords/venomous';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { addImpliedMechanics, isFish } from '../utils';\r\nimport { applyAfterAttackEffects, applyAfterAttackTrinkets } from './after-attack';\r\nimport { onEntityDamaged } from './damage-effects';\r\nimport { rememberDeathrattles } from './deathrattle-effects';\r\nimport { orchestrateMinionDeathEffects } from './deathrattle-orchestration';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { makeMinionsDie } from './minion-death';\r\nimport { onMinionKill } from './minion-kill';\r\nimport { applyOnAttackEffects } from './on-attack';\r\nimport { applyOnBeingAttackedBuffs } from './on-being-attacked';\r\nimport { performEntitySpawns } from './spawns';\r\nimport { applyAfterStatsUpdate } from './stats';\r\nimport { handleSummonsWhenSpace } from './summon-when-space';\r\nimport { canAttack } from './utils/entity-utils';\r\n\r\n// Only use it to simulate actual attack. To simulate damage, or something similar, use bumpInto\r\nexport const simulateAttack = (\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\toptions?: {\r\n\t\tskipSummonWhenSpace?: boolean;\r\n\t\tforceTarget?: BoardEntity;\r\n\t},\r\n): BoardEntity => {\r\n\t// console.debug(\r\n\t// \t'\\nsimulating attack',\r\n\t// \tstringifySimple(attackingBoard, gameState.allCards),\r\n\t// \t'\\n',\r\n\t// \tstringifySimple(defendingBoard, gameState.allCards),\r\n\t// );\r\n\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst attackingEntity = getAttackingEntity(attackingBoard, gameState.allCards);\r\n\tif (attackingEntity) {\r\n\t\tgameState.sharedState.currentAttackerEntityId = attackingEntity.entityId;\r\n\t\t// Get the left entities now, otherwise things might break if the attacker dies and/or other\r\n\t\t// entities pop\r\n\t\tconst attackingEntityIndex = attackingBoard.indexOf(attackingEntity);\r\n\t\tconst attackingEntitiesToTheLeft = attackingBoard.slice(0, attackingEntityIndex);\r\n\t\tconst isAttackingImmediately = attackingEntity.attackImmediately;\r\n\t\t// In case of Broodmother spawn, it spawns where the dead minion was, and has no influence on the\r\n\t\t// attack order\r\n\t\t// Situation this is trying to resolve by putting this right at the top of the loop:\r\n\t\t// - One scallywag attacks into another one, both die\r\n\t\t// - The first one attacks. To its left is a Harmless Bonehead with 1 HP. The scallywag attacks, and both scallys die\r\n\t\t// - The *other* sky pirate attacks first, and kills the bonehead. Two minions are spawned\r\n\t\t// - The first sy pirate attacks\r\n\t\t// - The initial loop is resolved. If this is at the end, the Harmless Bonehead is already dead, and not flagged\r\n\t\t// While having this right away, we immediately flag all minions to the left\r\n\t\tif (!isAttackingImmediately) {\r\n\t\t\t// Make sure they won't be able to attack until everyone has attacked\r\n\t\t\t// See http://replays.firestoneapp.com/?reviewId=a1b3066d-e806-44c1-ab4b-7ef9dbf9b5b9&turn=5&action=4\r\n\t\t\tattackingEntitiesToTheLeft.forEach((entity) => (entity.hasAttacked = 2));\r\n\t\t} else {\r\n\t\t\t// Change it right away so that new spawns don't trigger the \"attack immediately\" again\r\n\t\t\tattackingEntity.attackImmediately = false;\r\n\t\t}\r\n\r\n\t\tconst numberOfAttacks = attackingEntity.windfury ? 2 : 1;\r\n\t\tfor (let i = 0; i < numberOfAttacks; i++) {\r\n\t\t\t// We refresh the entity in case of windfury\r\n\t\t\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\t\t\t// We still want to flag the entity as having attacked, so that it doesn't attack again\r\n\t\t\t\t// after teammate switch in Duos\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t// Check that didn't die\r\n\t\t\tif (attackingBoard.find((entity) => entity.entityId === attackingEntity.entityId)) {\r\n\t\t\t\tconst defendingEntity: BoardEntity =\r\n\t\t\t\t\toptions?.forceTarget ?? getDefendingEntity(defendingBoard, attackingEntity);\r\n\t\t\t\t// Can happen with a single defender that has stealth\r\n\t\t\t\tif (defendingEntity && defendingEntity.health > 0 && !defendingEntity.definitelyDead) {\r\n\t\t\t\t\tdoFullAttack(\r\n\t\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingEntity,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\toptions,\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Solves the edge case of Sky Pirate vs a stealth board\r\n\t\t\t\t\tattackingEntity.attackImmediately = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tgameState.sharedState.currentAttackerEntityId = null;\r\n\t\tattackingEntity.hasAttacked = 1;\r\n\t}\r\n\treturn attackingEntity;\r\n};\r\n\r\nexport const doFullAttack = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\toptions?: {\r\n\t\tskipSummonWhenSpace?: boolean;\r\n\t},\r\n) => {\r\n\tconst isAttackingImmediately = attackingEntity.attackImmediately;\r\n\tgameState.spectator.registerAttack(\r\n\t\tattackingEntity,\r\n\t\tdefendingEntity,\r\n\t\tattackingBoard,\r\n\t\tdefendingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoardHero,\r\n\t);\r\n\t// http://replays.firestoneapp.com/?reviewId=50576a9f-2e6a-4600-87ba-6e737ca9853e&turn=21&action=4\r\n\t// Looks like onBeingAttacked effects apply before onAttack effects\r\n\tapplyOnBeingAttackedBuffs(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tconst { damageDoneByAttacker: damageDoneByAttacker1, damageDoneByDefender: damageDoneByDefender1 } =\r\n\t\tapplyOnAttackEffects(\r\n\t\t\tattackingEntity,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingEntity,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\tconst { damageDoneByAttacker: damageDoneByAttacker2, damageDoneByDefender: damageDoneByDefender2 } = performAttack(\r\n\t\tattackingEntity,\r\n\t\tdefendingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tconst damageDoneByAttacker = damageDoneByAttacker1 + damageDoneByAttacker2;\r\n\tconst damageDoneByDefender = damageDoneByDefender1 + damageDoneByDefender2;\r\n\r\n\t// Process this after the minions die and deathrattles are triggered/spawned\r\n\t// https://replays.firestoneapp.com/?reviewId=dd4e9dbe-abca-434a-ab94-04777cbedefe&turn=29&action=3\r\n\t// BUT: the attacking entity's afterAttack (like Macaw) needs to be processed\r\n\t// To recap:\r\n\t// - Jar o'Gems procs after the deathrattles have spawned\r\n\t// - When Monstrous Macaw procs a deathrattle, it is still on board, thus limiting the spawn room\r\n\t// So not sure what the exact timings are. It could be:\r\n\t// 1. Trigger minion's after attack\r\n\t// 2. Make minions die\r\n\t// 3. Process trinkets after attack\r\n\t// I have asked on Discord - for now I will consider a \"minion after attack\" phase and a \"trinket after attack\" phase.\r\n\t// I'm not sure about the secrets / trinkets, they will need to be adapted\r\n\tapplyAfterAttackEffects(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tdamageDoneByAttacker,\r\n\t\tdamageDoneByDefender,\r\n\t\tgameState,\r\n\t);\r\n\r\n\tprocessMinionDeath(\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t\toptions?.skipSummonWhenSpace || isAttackingImmediately,\r\n\t);\r\n\r\n\tapplyAfterAttackTrinkets(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tdamageDoneByAttacker,\r\n\t\tdamageDoneByDefender,\r\n\t\tgameState,\r\n\t);\r\n\tapplyAfterStatsUpdate(gameState);\r\n\tattackingEntity.immuneWhenAttackCharges = Math.max(0, (attackingEntity.immuneWhenAttackCharges ?? 0) - 1);\r\n\t// if (\r\n\t// \tdefendingEntity.health > 0 &&\r\n\t// \t!defendingEntity.definitelyDead\r\n\t// \t&& (defendingEntity.cardId === CardIds.YoHoOgre_BGS_060 ||\r\n\t// \t\tdefendingEntity.cardId === CardIds.YoHoOgre_TB_BaconUps_150)\r\n\t// ) {\r\n\t// \tdefendingEntity.attackImmediately = true;\r\n\t// \tif (defendingEntity.attackImmediately) {\r\n\t// \t\tsimulateAttack(defendingBoard, defendingBoardHero, attackingBoard, attackingBoardHero, gameState);\r\n\t// \t}\r\n\t// }\r\n};\r\n\r\nconst performAttack = (\r\n\tattackingEntity: BoardEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): { damageDoneByAttacker: number; damageDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\r\n\t// if (hasCorrectTribe(attackingEntity, attackingBoardHero, Race.DRAGON, gameState.anomalies, gameState.allCards)) {\r\n\t// \tconst prestors = attackingBoard\r\n\t// \t\t.filter((e) => e.entityId !== attackingEntity.entityId)\r\n\t// \t\t.filter(\r\n\t// \t\t\t(e) =>\r\n\t// \t\t\t\te.cardId === CardIds.PrestorsPyrospawn_BG21_012 ||\r\n\t// \t\t\t\te.cardId === CardIds.PrestorsPyrospawn_BG21_012_G,\r\n\t// \t\t);\r\n\t// \tprestors.forEach((prestor) => {\r\n\t// \t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\tprestor,\r\n\t// \t\t\tdefendingEntity,\r\n\t// \t\t\tdefendingBoard,\r\n\t// \t\t\tattackingBoardHero,\r\n\t// \t\t\tdefendingBoardHero,\r\n\t// \t\t);\r\n\t// \t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t// \t\t\tdefendingEntity,\r\n\t// \t\t\tdefendingBoard,\r\n\t// \t\t\tdefendingBoardHero,\r\n\t// \t\t\tprestor,\r\n\t// \t\t\tprestor.cardId === CardIds.PrestorsPyrospawn_BG21_012_G ? 6 : 3,\r\n\t// \t\t\tattackingBoard,\r\n\t// \t\t\tattackingBoardHero,\r\n\t// \t\t\tgameState,\r\n\t// \t\t);\r\n\t// \t});\r\n\t// }\r\n\t// if (\r\n\t// \tattackingEntity.cardId === CardIds.Atramedes_BG23_362 ||\r\n\t// \tattackingEntity.cardId === CardIds.Atramedes_BG23_362_G\r\n\t// ) {\r\n\t// \tconst targets = [defendingEntity, ...getNeighbours(defendingBoard, defendingEntity)];\r\n\t// \tconst multiplier = attackingEntity.cardId === CardIds.Atramedes_BG23_362_G ? 2 : 1;\r\n\r\n\t// \tfor (let i = 0; i < multiplier; i++) {\r\n\t// \t\ttargets.forEach((target) => {\r\n\t// \t\t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\t\tattackingEntity,\r\n\t// \t\t\t\ttarget,\r\n\t// \t\t\t\tdefendingBoard,\r\n\t// \t\t\t\tattackingBoardHero,\r\n\t// \t\t\t\tdefendingBoardHero,\r\n\t// \t\t\t);\r\n\t// \t\t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t// \t\t\t\ttarget,\r\n\t// \t\t\t\tdefendingBoard,\r\n\t// \t\t\t\tdefendingBoardHero,\r\n\t// \t\t\t\tattackingEntity,\r\n\t// \t\t\t\t3,\r\n\t// \t\t\t\tattackingBoard,\r\n\t// \t\t\t\tattackingBoardHero,\r\n\t// \t\t\t\tgameState,\r\n\t// \t\t\t);\r\n\t// \t\t});\r\n\t// \t}\r\n\t// } else\r\n\tif ([CardIds.BabyKrush_BG22_001, CardIds.BabyKrush_BG22_001_G].includes(attackingEntity.cardId as CardIds)) {\r\n\t\tconst spawns = spawnEntities(\r\n\t\t\tattackingEntity.cardId === CardIds.BabyKrush_BG22_001_G\r\n\t\t\t\t? CardIds.BabyKrush_BG22_001_G\r\n\t\t\t\t: CardIds.BabyKrush_DevilsaurToken,\r\n\t\t\t1,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t\tif (spawns.length > 0) {\r\n\t\t\tconst sourceIndex = attackingBoard.indexOf(attackingEntity);\r\n\t\t\tconst actualSpawns = performEntitySpawns(\r\n\t\t\t\tspawns,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tsourceIndex,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tfor (const actualSpawn of actualSpawns) {\r\n\t\t\t\tif (defendingEntity.health > 0 && !defendingEntity.definitelyDead) {\r\n\t\t\t\t\tperformAttack(\r\n\t\t\t\t\t\tactualSpawn,\r\n\t\t\t\t\t\tdefendingEntity,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// For Prestor\r\n\tconst defenderAliveBeforeAttack = defendingEntity.health > 0 && !defendingEntity.definitelyDead;\r\n\t// Because of Bristleback Knight, which changes its divine shield status during bumpEntities\r\n\tconst attackerHadDivineShield = attackingEntity.divineShield;\r\n\tconst defenderHadDivineShield = defendingEntity.divineShield;\r\n\t// For cleave\r\n\t// We do that now so that we don't include entities that spawn on entity damaged\r\n\tconst defenderNeighbours: readonly BoardEntity[] = getNeighbours(defendingBoard, defendingEntity);\r\n\tif (defenderAliveBeforeAttack) {\r\n\t\tif (!attackingEntity.immuneWhenAttackCharges) {\r\n\t\t\t// TODO: this bumpEntities approach doesn't work well, as it leads to code duplication\r\n\t\t\tdamageDoneByDefender += bumpEntities(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tdamageDoneByAttacker += bumpEntities(\r\n\t\t\tdefendingEntity,\r\n\t\t\tattackingEntity,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tif (defendingEntity.attack > 0 && attackerHadDivineShield && !attackingEntity.immuneWhenAttackCharges) {\r\n\t\t\tupdateDivineShield(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tfalse,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (attackingEntity.attack > 0 && defenderHadDivineShield) {\r\n\t\t\tupdateDivineShield(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tfalse,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t// cause wrong results to happen\r\n\t\t// This whole logic is a MEEEEESSSSSSSSSSSSSSS\r\n\t\tif (damageDoneByDefender > 0) {\r\n\t\t\tonEntityDamaged(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdamageDoneByDefender,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (damageDoneByAttacker > 0) {\r\n\t\t\tonEntityDamaged(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdamageDoneByAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (defendingEntity.health <= 0 || defendingEntity.definitelyDead) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\ttrue,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tdefenderNeighbours,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tif (attackingEntity.health <= 0 || attackingEntity.definitelyDead) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tfalse,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefenderNeighbours,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t}\r\n\t// Cleave\r\n\tif (attackingEntity.cleave) {\r\n\t\tfor (const neighbour of defenderNeighbours) {\r\n\t\t\tconst thisAttackDamage = bumpEntities(\r\n\t\t\t\tneighbour,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += thisAttackDamage;\r\n\t\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t\t// cause wrong results to happen\r\n\t\t\tif (attackingEntity.attack > 0 && neighbour.divineShield) {\r\n\t\t\t\tupdateDivineShield(neighbour, defendingBoard, defendingBoardHero, attackingBoardHero, false, gameState);\r\n\t\t\t}\r\n\t\t\tif (thisAttackDamage > 0) {\r\n\t\t\t\tonEntityDamaged(\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\tthisAttackDamage,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tif (neighbour.health <= 0 || neighbour.definitelyDead) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tdefenderNeighbours,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tattackingEntity.attackImmediately = false;\r\n\tif (attackingEntity.enchantments.some((e) => e.cardId === CardIds.VolatileVenom_VolatileEnchantment)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\treturn { damageDoneByAttacker, damageDoneByDefender };\r\n};\r\n\r\n// TODO: Could it be possible to store the index of the entity that last attacked? Probably not, because minion\r\n// spawns would mess this up? Could we update the indexes as each entity spawns / dies?\r\nconst getAttackingEntity = (attackingBoard: BoardEntity[], allCards: AllCardsService): BoardEntity => {\r\n\tlet validAttackers = attackingBoard.filter((entity) => canAttack(entity));\r\n\tif (validAttackers.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (validAttackers.some((entity) => entity.attackImmediately)) {\r\n\t\tvalidAttackers = validAttackers.filter((entity) => entity.attackImmediately);\r\n\t} else if (validAttackers.every((e) => e.hasAttacked != null)) {\r\n\t\tattackingBoard.forEach((e) => (e.hasAttacked = undefined));\r\n\t} else {\r\n\t\tvalidAttackers = validAttackers.filter((entity) => entity.hasAttacked == undefined);\r\n\t}\r\n\tconst attacker = validAttackers[0];\r\n\treturn attacker;\r\n};\r\n\r\nexport const findNearestEnemies = (\r\n\tattackingBoard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tentityIndexFromRight: number,\r\n\tdefendingBoard: BoardEntity[],\r\n\tnumberOfTargets: number,\r\n\tallCards: AllCardsService,\r\n): BoardEntity[] => {\r\n\tconst result = [];\r\n\tif (defendingBoard.length > 0) {\r\n\t\t// console.debug('defending board', numberOfTargets, stringifySimple(defendingBoard, allCards));\r\n\t\tconst attackerIndex = attackingBoard.length - entityIndexFromRight - 1;\r\n\t\tconst targetIndex = attackerIndex - (attackingBoard.length - defendingBoard.length) / 2;\r\n\t\t// console.debug('indexes', attackerIndex, entityIndexFromRight, targetIndex, attackingBoard.length);\r\n\r\n\t\tfor (let i = 0; i < numberOfTargets; i++) {\r\n\t\t\tconst possibleTargets = defendingBoard\r\n\t\t\t\t.filter((e) => !e.definitelyDead && e.health > 0)\r\n\t\t\t\t.filter((e) => !result.includes(e));\r\n\t\t\t// console.debug('possibleTargets', stringifySimple(possibleTargets, allCards));\r\n\t\t\tif (!possibleTargets.length) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tconst targetGroups = groupByFunction((e: BoardEntity) => Math.abs(defendingBoard.indexOf(e) - targetIndex))(\r\n\t\t\t\tpossibleTargets,\r\n\t\t\t);\r\n\t\t\tconst distances = Object.keys(targetGroups)\r\n\t\t\t\t.map((k) => +k)\r\n\t\t\t\t.sort();\r\n\t\t\tconst nearestDistance = distances[0];\r\n\t\t\tif (nearestDistance != null) {\r\n\t\t\t\t// console.debug(\r\n\t\t\t\t// \t'targetGroups[nearestDistance]',\r\n\t\t\t\t// \tnearestDistance,\r\n\t\t\t\t// \tstringifySimple(targetGroups[nearestDistance], allCards),\r\n\t\t\t\t// );\r\n\t\t\t\tconst target = pickRandom(targetGroups[nearestDistance]);\r\n\t\t\t\tresult.push(target);\r\n\t\t\t}\r\n\t\t\t// console.debug('\\n');\r\n\t\t}\r\n\t}\r\n\treturn result.filter((e) => !!e);\r\n};\r\n\r\nexport const getNeighbours = (\r\n\tboard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tdeadEntityIndexFromRight?: number,\r\n\talwaysIncludeBoth = false,\r\n): readonly BoardEntity[] => {\r\n\tconst neighbours = [];\r\n\t// When triggering DR with Hawkstrider, the entity is still on the board\r\n\tif (deadEntityIndexFromRight != null && !board.includes(entity)) {\r\n\t\tconst leftNeighbourIndex = board.length - 1 - deadEntityIndexFromRight;\r\n\t\tconst leftNeighbour = board[leftNeighbourIndex];\r\n\t\tif (leftNeighbour) {\r\n\t\t\tneighbours.push(leftNeighbour);\r\n\t\t}\r\n\r\n\t\t// If the deadEntityIndexFromRight === 0 (right-most minion), no neighbour will be found\r\n\t\tconst rightNeighbourIndex = board.length - 1 - (deadEntityIndexFromRight - 1);\r\n\t\tconst rightNeighbour = board[rightNeighbourIndex];\r\n\t\tif (rightNeighbour) {\r\n\t\t\tneighbours.push(rightNeighbour);\r\n\t\t}\r\n\t} else {\r\n\t\tconst index = board.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\tif (index - 1 >= 0) {\r\n\t\t\tneighbours.push(board[index - 1]);\r\n\t\t} else if (alwaysIncludeBoth) {\r\n\t\t\tneighbours.push(null);\r\n\t\t}\r\n\t\t// neighbours.push(entity);\r\n\t\tif (index + 1 < board.length) {\r\n\t\t\tneighbours.push(board[index + 1]);\r\n\t\t} else if (alwaysIncludeBoth) {\r\n\t\t\tneighbours.push(null);\r\n\t\t}\r\n\t}\r\n\treturn neighbours;\r\n};\r\n\r\nexport const getLeftNeighbour = (\r\n\tboard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tdeadEntityIndexFromRight?: number,\r\n): BoardEntity => {\r\n\t// When triggering DR with Hawkstrider, the entity is still on the board\r\n\tif (deadEntityIndexFromRight != null && !board.includes(entity)) {\r\n\t\tconst leftNeighbourIndex = board.length - 1 - deadEntityIndexFromRight;\r\n\t\tconst leftNeighbour = board[leftNeighbourIndex];\r\n\t\tif (leftNeighbour) {\r\n\t\t\treturn leftNeighbour;\r\n\t\t}\r\n\t} else {\r\n\t\tconst index = board.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\tif (index - 1 >= 0) {\r\n\t\t\treturn board[index - 1];\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const dealDamageToRandomEnemy = (\r\n\tboardToBeDamaged: BoardEntity[],\r\n\tboardToBeDamagedHero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity,\r\n\tdamage: number,\r\n\tboardWithAttackOrigin: BoardEntity[],\r\n\tboardWithAttackOriginHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (boardToBeDamaged.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\tconst validTargets = boardToBeDamaged.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst defendingEntity: BoardEntity = pickRandom(validTargets);\r\n\tif (defendingEntity) {\r\n\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\tdamageSource,\r\n\t\t\tdefendingEntity,\r\n\t\t\tboardToBeDamaged,\r\n\t\t\tboardToBeDamagedHero,\r\n\t\t\tboardWithAttackOriginHero,\r\n\t\t);\r\n\t\tdealDamageToMinion(\r\n\t\t\tdefendingEntity,\r\n\t\t\tboardToBeDamaged,\r\n\t\t\tboardToBeDamagedHero,\r\n\t\t\tdamageSource,\r\n\t\t\tdamage,\r\n\t\t\tboardWithAttackOrigin,\r\n\t\t\tboardWithAttackOriginHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport const dealDamageToMinion = (\r\n\ttarget: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity | BgsPlayerEntity,\r\n\tdamage: number,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// console.log('dealing damage to', damage, stringifySimpleCard(defendingEntity, allCards));\r\n\tif (!target) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst isDeadBeforeDamage = target.definitelyDead || target.health <= 0;\r\n\tconst spawns = [];\r\n\t// Why do we use a fakeAttacker? Is that for the \"attacking\" prop?\r\n\t// That prop is only used for Overkill, and even in that case it looks like it would work\r\n\t// without it\r\n\tconst fakeAttacker = {\r\n\t\t...(damageSource || {}),\r\n\t\tentityId: -1,\r\n\t\tattack: damage,\r\n\t\t// attacking: true,\r\n\t} as BoardEntity;\r\n\tconst actualDamageDone = bumpEntities(target, fakeAttacker, board, hero, otherBoard, otherHero, gameState);\r\n\r\n\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t// cause wrong results to happen\r\n\t// TODO: why isn't it done in bumpEntities?\r\n\t// Because of how \"bump\" works: we do it first for the attacker, then the defender, and we only want to update\r\n\t// the divine shield once both bumps are done\r\n\t// The problem is with the Frenzy: bumpEntities can trigger the frenzy, and which can act on the divine shield\r\n\tif (fakeAttacker.attack > 0 && target.divineShield) {\r\n\t\tupdateDivineShield(target, board, hero, otherHero, false, gameState);\r\n\t}\r\n\r\n\tif (actualDamageDone > 0) {\r\n\t\t// TODO: handle entities that have been spawned here to adjust the dead entity index from parent stack\r\n\t\tconst newSpawns = onEntityDamaged(\r\n\t\t\ttarget,\r\n\t\t\tboard,\r\n\t\t\thero,\r\n\t\t\totherBoard,\r\n\t\t\totherHero,\r\n\t\t\tdamageSource,\r\n\t\t\tactualDamageDone,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n\tif (!isDeadBeforeDamage && actualDamageDone > 0 && 'attack' in damageSource && 'health' in damageSource) {\r\n\t\ttarget.lastAffectedByEntity = damageSource as BoardEntity;\r\n\r\n\t\tif (target.health <= 0 || target.definitelyDead) {\r\n\t\t\tonMinionKill(damageSource as BoardEntity, false, target, otherBoard, otherHero, board, hero, [], gameState);\r\n\t\t}\r\n\t}\r\n\tconst defendingEntityIndex = board.map((entity) => entity.entityId).indexOf(target.entityId);\r\n\tboard[defendingEntityIndex] = target;\r\n\treturn actualDamageDone;\r\n};\r\n\r\nexport const getDefendingEntity = (\r\n\tdefendingBoard: BoardEntity[],\r\n\tattackingEntity: BoardEntity,\r\n\tignoreTaunts = false,\r\n): BoardEntity => {\r\n\tif (debugState.active) {\r\n\t\tfor (const forcedFaceOff of debugState.forcedFaceOff) {\r\n\t\t\tif (debugState.isCorrectEntity(forcedFaceOff.attacker, attackingEntity)) {\r\n\t\t\t\t// if (attackingEntity.entityId === forcedFaceOff.attacker.entityId) {\r\n\t\t\t\tconst def = defendingBoard.find((e) => debugState.isCorrectEntity(forcedFaceOff.defender, e));\r\n\t\t\t\tif (!!def) {\r\n\t\t\t\t\t// Remove the face-off\r\n\t\t\t\t\tdebugState.forcedFaceOff = debugState.forcedFaceOff.filter((f) => f != forcedFaceOff);\r\n\t\t\t\t\treturn def;\r\n\t\t\t\t}\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet possibleDefenders: readonly BoardEntity[];\r\n\tif (\r\n\t\tattackingEntity.cardId === CardIds.ZappSlywick_BGS_022 ||\r\n\t\tattackingEntity.cardId === CardIds.ZappSlywick_TB_BaconUps_091 ||\r\n\t\tattackingEntity.cardId === CardIds.MercilessMammoth_BG33_845 ||\r\n\t\tattackingEntity.cardId === CardIds.MercilessMammoth_BG33_845_G\r\n\t) {\r\n\t\tconst minAttack = Math.min(...defendingBoard.map((entity) => entity.attack));\r\n\t\tpossibleDefenders = defendingBoard.filter((entity) => entity.attack === minAttack);\r\n\t} else if (\r\n\t\tattackingEntity.cardId === CardIds.WorgenVigilante_BG26_921 ||\r\n\t\tattackingEntity.cardId === CardIds.WorgenVigilante_BG26_921_G\r\n\t) {\r\n\t\tpossibleDefenders = defendingBoard\r\n\t\t\t.filter(\r\n\t\t\t\t(entity) =>\r\n\t\t\t\t\tentity.health <= attackingEntity.attack || attackingEntity.venomous || attackingEntity.poisonous,\r\n\t\t\t)\r\n\t\t\t.filter((e) => !e.divineShield);\r\n\t\tif (!possibleDefenders.length) {\r\n\t\t\tpossibleDefenders = defendingBoard;\r\n\t\t}\r\n\t} else {\r\n\t\tpossibleDefenders = defendingBoard.filter((e) => !e.stealth);\r\n\t\tif (!ignoreTaunts) {\r\n\t\t\tconst taunts = possibleDefenders.filter((entity) => entity.taunt);\r\n\t\t\tpossibleDefenders = taunts.length > 0 ? taunts : possibleDefenders;\r\n\t\t}\r\n\t}\r\n\r\n\tconst chosenDefender = pickRandom(possibleDefenders);\r\n\t// if (chosenDefender?.taunt) {\r\n\t// \tconst elistras = defendingBoard.filter(\r\n\t// \t\t(entity) =>\r\n\t// \t\t\tentity.cardId === CardIds.ElistraTheImmortal_BGS_205 ||\r\n\t// \t\t\tentity.cardId === CardIds.ElistraTheImmortal_TB_BaconUps_306,\r\n\t// \t);\r\n\t// \tif (elistras.length > 0) {\r\n\t// \t\tchosenDefender = elistras[Math.floor(Math.random() * elistras.length)];\r\n\t// \t}\r\n\t// }\r\n\treturn chosenDefender;\r\n};\r\n\r\nexport const bumpEntities = (\r\n\tentity: BoardEntity,\r\n\tbumpInto: BoardEntity,\r\n\tentityBoard: BoardEntity[],\r\n\tentityBoardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tapplyVenomous = true,\r\n): number => {\r\n\t// No attack has no impact\r\n\tconst debug = bumpInto.cardId === 'BG26_888';\r\n\tif (bumpInto.attack === 0) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t// Matador effect has priority\r\n\tif (\r\n\t\tentity.abiityChargesLeft > 0 &&\r\n\t\t(entity.cardId === CardIds.MadMatador_BG28_404 || entity.cardId === CardIds.MadMatador_BG28_404_G)\r\n\t) {\r\n\t\tentity.abiityChargesLeft--;\r\n\t\tconst newTarget = pickRandom(otherBoard);\r\n\t\tif (newTarget) {\r\n\t\t\tgameState.spectator.registerPowerTarget(entity, newTarget, otherBoard, entityBoardHero, otherHero);\r\n\t\t\t// TODO: here the MadMatador is the source of the damage, not the initial attacker\r\n\t\t\t// Not sure exactly what the impact would be, as there is no counter\r\n\t\t\tconst newSource = {\r\n\t\t\t\t...entity,\r\n\t\t\t\tattack: bumpInto.attack,\r\n\t\t\t\t// attacking: true,\r\n\t\t\t} as BoardEntity;\r\n\t\t\tconst defenderHadDivineShield = newTarget.divineShield;\r\n\t\t\tconst damageDone = bumpEntities(\r\n\t\t\t\tnewTarget,\r\n\t\t\t\tnewSource,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherHero,\r\n\t\t\t\tentityBoard,\r\n\t\t\t\tentityBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tif (newSource.attack > 0 && defenderHadDivineShield) {\r\n\t\t\t\tupdateDivineShield(newTarget, otherBoard, otherHero, entityBoardHero, false, gameState);\r\n\t\t\t}\r\n\t\t\tif (damageDone > 0) {\r\n\t\t\t\tonEntityDamaged(\r\n\t\t\t\t\tnewTarget,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherHero,\r\n\t\t\t\t\tentityBoard,\r\n\t\t\t\t\tentityBoardHero,\r\n\t\t\t\t\tnewSource,\r\n\t\t\t\t\tdamageDone,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\treturn damageDone;\r\n\t\t}\r\n\t}\r\n\r\n\tif (entity.divineShield) {\r\n\t\tgameState.spectator.registerDamageDealt(bumpInto, entity, 0, entityBoard);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst damageDealt = (entity.damageMultiplier || 1) * bumpInto.attack;\r\n\tentity.health = entity.health - damageDealt;\r\n\t// FIXME: This will likely be incorrect in terms of timings, e.g. if the entity ends up\r\n\t// surviving following a buff like Spawn.\r\n\tgameState.spectator.registerDamageDealt(bumpInto, entity, damageDealt, entityBoard);\r\n\r\n\t// if (entity.cardId === CardIds.Bubblette_BG_TID_713 && bumpInto.attack === 1) {\r\n\t// \tentity.definitelyDead = true;\r\n\t// } else if (entity.cardId === CardIds.Bubblette_BG_TID_713_G && bumpInto.attack === 2) {\r\n\t// \tentity.definitelyDead = true;\r\n\t// }\r\n\t// Do it last, so that other effects are still processed\r\n\tif (bumpInto.poisonous) {\r\n\t\t// So that further buffs don't revive it\r\n\t\t// And we don't just set the health to avoid applying overkill effects\r\n\t\tentity.definitelyDead = true;\r\n\t}\r\n\tif (bumpInto.venomous && applyVenomous) {\r\n\t\t// So that further buffs don't revive it\r\n\t\t// And we don't just set the health to avoid applying overkill effects\r\n\t\tentity.definitelyDead = true;\r\n\t\tupdateVenomous(bumpInto, false, otherBoard, otherHero, entityBoardHero, gameState);\r\n\t}\r\n\t// Ideally we should do the Reckoning stuff here. However, at this point we only have half the damage\r\n\t// information, so it is possible that the entity deals more than 3 (which should trigger Reckoning)\r\n\t// but dies during the exchange (and Reckoning doesn't trigger then)\r\n\r\n\tentity.lastAffectedByEntity = bumpInto;\r\n\t// if (entity.frenzyChargesLeft > 0 && entity.health > 0 && !entity.definitelyDead) {\r\n\t// \tapplyFrenzy(entity, entityBoard, entityBoardHero, gameState);\r\n\t// \tentity.frenzyChargesLeft--;\r\n\t// }\r\n\r\n\t// We spawn them here, because it says \"whenever\", and so happens right away\r\n\t// FIXME: there could be a bug here, if a Cleave attacks several IGB at the same time. The current\r\n\t// implementation could spawn minions above the max board size. Fringe case though, so leaving it\r\n\t// like this for now\r\n\t// const entitySpawns = getWheneverEntitySpawns(\r\n\t// \tentity,\r\n\t// \tentityBoard,\r\n\t// \tentityBoardHero,\r\n\t// \totherBoard,\r\n\t// \totherHero,\r\n\t// \tgameState.allCards,\r\n\t// \tgameState.cardsData,\r\n\t// \tgameState.sharedState,\r\n\t// \tgameState.spectator,\r\n\t// );\r\n\t// if (!!entitySpawns?.length) {\r\n\t// \t// Spawn to the right\r\n\t// \tconst index = entityBoard.map((e) => e.entityId).indexOf(entity.entityId) + 1;\r\n\t// \taddMinionsToBoard(entityBoard, entityBoardHero, otherHero, index, entitySpawns, gameState);\r\n\t// \tgameState.spectator.registerMinionsSpawn(entity, entityBoard, entitySpawns);\r\n\t// }\r\n\treturn bumpInto.attack;\r\n};\r\n\r\n// const getWheneverEntitySpawns = (\r\n// \tentity: BoardEntity,\r\n// \tentityBoard: BoardEntity[],\r\n// \tentityBoardHero: BgsPlayerEntity,\r\n// \totherBoard: BoardEntity[],\r\n// \totherHero: BgsPlayerEntity,\r\n// \tallCards: AllCardsService,\r\n// \tcardsData: CardsData,\r\n// \tsharedState: SharedState,\r\n// \tspectator: Spectator,\r\n// ): readonly BoardEntity[] => {\r\n// \tif (entityBoard.length === 7) {\r\n// \t\treturn null;\r\n// \t}\r\n\r\n// \tif (entity.cardId === CardIds.ImpGangBoss_BRM_006) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.ImpGangBoss_ImpToken_BRM_006t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.ImpGangBoss_TB_BaconUps_030) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.ImpGangBoss_ImpToken_TB_BaconUps_030t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.ImpMama_BGS_044) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tcardsData.impMamaSpawns[Math.floor(Math.random() * cardsData.impMamaSpawns.length)],\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t).map((entity) => ({ ...entity, taunt: true }));\r\n// \t} else if (entity.cardId === CardIds.ImpMama_TB_BaconUps_116) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tcardsData.impMamaSpawns[Math.floor(Math.random() * cardsData.impMamaSpawns.length)],\r\n// \t\t\t2,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t).map((entity) => ({ ...entity, taunt: true }));\r\n// \t} else if (entity.cardId === CardIds.SecurityRover_BOT_218) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.SecurityRover_GuardBotToken_BOT_218t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.SecurityRover_TB_BaconUps_041) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.SecurityRover_GuardBotToken_TB_BaconUps_041t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t}\r\n// \treturn null;\r\n// };\r\n\r\nexport const processMinionDeath = (\r\n\tboard1: BoardEntity[],\r\n\tboard1Hero: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tboard2Hero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\t// When we're in an \"attack immediately\" phase, we wait until we're out of the phase to summon minions\r\n\tskipSummonWhenSpace = false,\r\n): void => {\r\n\t// const debug = board1.some((e) => e.health <= 0) || board2.some((e) => e.health <= 0);\r\n\t// debug && console.debug('\\nprocessing minions death');\r\n\t// debug && console.debug(stringifySimple(board1, gameState.allCards));\r\n\t// debug && console.debug(stringifySimple(board2, gameState.allCards));\r\n\tconst [deadMinionIndexesFromLeft1, deadMinionIndexesFromRights1, deadEntities1] = makeMinionsDie(\r\n\t\tboard1,\r\n\t\tboard1Hero,\r\n\t\tboard2,\r\n\t\tboard2Hero,\r\n\t\tgameState,\r\n\t);\r\n\tconst [deadMinionIndexesFromLeft2, deadMinionIndexesFromRights2, deadEntities2] = makeMinionsDie(\r\n\t\tboard2,\r\n\t\tboard2Hero,\r\n\t\tboard1,\r\n\t\tboard1Hero,\r\n\t\tgameState,\r\n\t);\r\n\t// debug && console.debug('after processing minions death');\r\n\t// debug && console.debug(stringifySimple(board1, gameState.allCards));\r\n\t// debug && console.debug(stringifySimple(board2, gameState.allCards));\r\n\t// debug && console.debug(deadMinionIndexesFromRights1);\r\n\t// debug && console.debug(deadMinionIndexesFromRights2);\r\n\t// console.debug('dead entities', stringifySimple(deadEntities1, allCards), stringifySimple(deadEntities2, allCards));\r\n\t// No death to process, we can return\r\n\tif (deadEntities1.length === 0 && deadEntities2.length === 0) {\r\n\t\treturn;\r\n\t\t// return [board1, board2];\r\n\t}\r\n\r\n\t// Remember them right away, so that subsequent deaths do not break the order\r\n\t// TODO: move this to the deathrattle-orchestration?\r\n\t// If the fish dies (from Scallywag for instance), it doesn't remember the deathrattle\r\n\t// console.debug(\r\n\t// \t'\\n\\ndeadEntities',\r\n\t// \tstringifySimple(deadEntities1, gameState.allCards),\r\n\t// \tstringifySimple(deadEntities2, gameState.allCards),\r\n\t// );\r\n\r\n\tgameState.spectator.registerDeadEntities(\r\n\t\tdeadMinionIndexesFromRights1,\r\n\t\tdeadEntities1,\r\n\t\tboard1,\r\n\t\tdeadMinionIndexesFromRights2,\r\n\t\tdeadEntities2,\r\n\t\tboard2,\r\n\t);\r\n\tgameState.sharedState.deaths.push(\r\n\t\t...deadEntities1.map((e, index) =>\r\n\t\t\taddImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\t...e,\r\n\t\t\t\t\thealth: e.maxHealth,\r\n\t\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\t\tindexFromLeftAtTimeOfDeath: deadMinionIndexesFromLeft1[index],\r\n\t\t\t\t},\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t),\r\n\t\t),\r\n\t);\r\n\tgameState.sharedState.deaths.push(\r\n\t\t...deadEntities2.map((e, index) =>\r\n\t\t\taddImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\t...e,\r\n\t\t\t\t\thealth: e.maxHealth,\r\n\t\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\t\tindexFromLeftAtTimeOfDeath: deadMinionIndexesFromLeft2[index],\r\n\t\t\t\t},\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t),\r\n\t\t),\r\n\t);\r\n\r\n\tfor (const deadEntity of deadEntities1) {\r\n\t\tconst onDeathImpl = cardMappings[deadEntity.cardId];\r\n\t\tif (hasOnDeath(onDeathImpl)) {\r\n\t\t\tonDeathImpl.onDeath(deadEntity, {\r\n\t\t\t\thero: board1Hero,\r\n\t\t\t\tboard: board1,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const deadEntity of deadEntities2) {\r\n\t\tconst onDeathImpl = cardMappings[deadEntity.cardId];\r\n\t\tif (hasOnDeath(onDeathImpl)) {\r\n\t\t\tonDeathImpl.onDeath(deadEntity, {\r\n\t\t\t\thero: board2Hero,\r\n\t\t\t\tboard: board2,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tboard1Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard1Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities1.filter(\r\n\t\t\t(e) => e.cardId === CardIds.EternalKnight_BG25_008 || e.cardId === CardIds.EternalKnight_BG25_008_G,\r\n\t\t).length;\r\n\tboard2Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard2Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities2.filter(\r\n\t\t\t(e) => e.cardId === CardIds.EternalKnight_BG25_008 || e.cardId === CardIds.EternalKnight_BG25_008_G,\r\n\t\t).length;\r\n\r\n\torchestrateMinionDeathEffects({\r\n\t\tgameState: gameState,\r\n\t\tplayerDeadEntities: board1Hero.friendly ? deadEntities1 : deadEntities2,\r\n\t\tplayerDeadEntityIndexesFromRight: board1Hero.friendly\r\n\t\t\t? deadMinionIndexesFromRights1\r\n\t\t\t: deadMinionIndexesFromRights2,\r\n\t\topponentDeadEntities: board1Hero.friendly ? deadEntities2 : deadEntities1,\r\n\t\topponentDeadEntityIndexesFromRight: board1Hero.friendly\r\n\t\t\t? deadMinionIndexesFromRights2\r\n\t\t\t: deadMinionIndexesFromRights1,\r\n\t});\r\n\r\n\t// Make sure we only return when there are no more deaths to process\r\n\t// Make sure to do this right before the end of the process\r\n\t// FIXME: this will propagate the killer between rounds, which is incorrect. For instance,\r\n\t// if a dragon kills a Ghoul, then the Ghoul's deathrattle kills a Kaboom, the killer should\r\n\t// now be the ghoul. Then if the Kaboom kills someone, the killer should again change. You could\r\n\t// also have multiple killers, which is not taken into account here.\r\n\t// The current assumption is that it's a suffienctly fringe case to not matter too much\r\n\tprocessMinionDeath(board1, board1Hero, board2, board2Hero, gameState);\r\n\r\n\t// Not sure about the timing here, but I have bothered Mitchell quite a lot already recently :)\r\n\tif (!skipSummonWhenSpace) {\r\n\t\thandleSummonsWhenSpace(board1, board1Hero, board2, board2Hero, gameState);\r\n\t}\r\n\r\n\t// Apply \"after minion death\" effects\r\n\thandleAfterMinionsDeaths(board1, deadEntities1, board1Hero, board2, deadEntities2, board2Hero, gameState);\r\n\r\n\t// Only when all deathrattles have resolved\r\n\t// 2025-12-20: https://replays.firestoneapp.com/?reviewId=7d8f9af4-b484-4256-976b-ff9df8847b50&turn=5&action=0\r\n\t// Confirmed by dev that the fish doesn't get the deathrattle in this case\r\n\tboard1\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) =>\r\n\t\t\trememberDeathrattles(entity, deadEntities1, gameState.cardsData, gameState.allCards, gameState.sharedState),\r\n\t\t);\r\n\tboard2\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) =>\r\n\t\t\trememberDeathrattles(entity, deadEntities2, gameState.cardsData, gameState.allCards, gameState.sharedState),\r\n\t\t);\r\n};\r\n\r\nconst handleAfterMinionsDeaths = (\r\n\tboard1: BoardEntity[],\r\n\tdeadEntities1: BoardEntity[],\r\n\theroEntity1: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tdeadEntities2: BoardEntity[],\r\n\theroEntity2: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst random = Math.random() > 0.5;\r\n\thandleAfterMinionsDeathsForBoard(\r\n\t\trandom ? board1 : board2,\r\n\t\trandom ? deadEntities1 : deadEntities2,\r\n\t\trandom ? heroEntity1 : heroEntity2,\r\n\t\trandom ? board2 : board1,\r\n\t\trandom ? deadEntities2 : deadEntities1,\r\n\t\trandom ? heroEntity2 : heroEntity1,\r\n\t\tgameState,\r\n\t);\r\n\thandleAfterMinionsDeathsForBoard(\r\n\t\t!random ? board1 : board2,\r\n\t\t!random ? deadEntities1 : deadEntities2,\r\n\t\t!random ? heroEntity1 : heroEntity2,\r\n\t\t!random ? board2 : board1,\r\n\t\t!random ? deadEntities2 : deadEntities1,\r\n\t\t!random ? heroEntity2 : heroEntity1,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nconst handleAfterMinionsDeathsForBoard = (\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyDeadEntities: BoardEntity[],\r\n\tfriendlyHeroEntity: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherDeadEntities: BoardEntity[],\r\n\totherHeroEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst candidateEntities = [];\r\n\r\n\tfor (const trinket of friendlyHeroEntity.trinkets ?? []) {\r\n\t\tconst onAfterDeathImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasOnAfterDeath(onAfterDeathImpl)) {\r\n\t\t\tonAfterDeathImpl.onAfterDeath(trinket, {\r\n\t\t\t\thero: friendlyHeroEntity,\r\n\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\totherHero: otherHeroEntity,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tdeadEntities: friendlyDeadEntities,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const entity of friendlyBoard) {\r\n\t\tconst onAfterDeathImpl = cardMappings[entity.cardId];\r\n\t\tif (hasOnAfterDeath(onAfterDeathImpl)) {\r\n\t\t\tonAfterDeathImpl.onAfterDeath(entity, {\r\n\t\t\t\thero: friendlyHeroEntity,\r\n\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\totherHero: otherHeroEntity,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tdeadEntities: friendlyDeadEntities,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tconst secretTriggered = null;\r\n\t// if (\r\n\t// \t(secretTriggered = friendlyHeroEntity.secrets?.find(\r\n\t// \t\t(secret) => !secret.triggered && secret?.cardId === CardIds.MagicBlackSoulstone,\r\n\t// \t)) != null\r\n\t// ) {\r\n\t// \tif (friendlyBoard.length === 0) {\r\n\t// \t\tsecretTriggered.triggered = true;\r\n\t// \t\tfor (let i = 0; i < 2; i++) {\r\n\t// \t\t\tconst toSummon = pickRandom(gameState.cardsData.demonSpawns);\r\n\t// \t\t\tcandidateEntities.push(\r\n\t// \t\t\t\t...spawnEntities(\r\n\t// \t\t\t\t\ttoSummon,\r\n\t// \t\t\t\t\t1,\r\n\t// \t\t\t\t\tfriendlyBoard,\r\n\t// \t\t\t\t\tfriendlyHeroEntity,\r\n\t// \t\t\t\t\totherBoard,\r\n\t// \t\t\t\t\totherHeroEntity,\r\n\t// \t\t\t\t\tgameState,\r\n\t// \t\t\t\t\tfriendlyHeroEntity.friendly,\r\n\t// \t\t\t\t\tfalse,\r\n\t// \t\t\t\t),\r\n\t// \t\t\t);\r\n\t// \t\t}\r\n\t// \t}\r\n\t// }\r\n\tperformEntitySpawns(\r\n\t\tcandidateEntities,\r\n\t\tfriendlyBoard,\r\n\t\tfriendlyHeroEntity,\r\n\t\tsecretTriggered,\r\n\t\t0,\r\n\t\totherBoard,\r\n\t\totherHeroEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nexport interface OnDeathInput {\r\n\treadonly hero: BgsPlayerEntity;\r\n\treadonly board: BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n}\r\nexport interface OnAfterDeathInput {\r\n\treadonly hero: BgsPlayerEntity;\r\n\treadonly board: BoardEntity[];\r\n\treadonly otherHero: BgsPlayerEntity;\r\n\treadonly otherBoard: BoardEntity[];\r\n\treadonly deadEntities: BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n}\r\nexport interface OnMinionKilledInput {\r\n\treadonly killer: BoardEntity;\r\n\treadonly killerIsAttacking: boolean;\r\n\treadonly minionKilled: BoardEntity;\r\n\treadonly attackingHero: BgsPlayerEntity;\r\n\treadonly attackingBoard: BoardEntity[];\r\n\treadonly defendingHero: BgsPlayerEntity;\r\n\treadonly defendingBoard: BoardEntity[];\r\n\treadonly defenderNeighbours: readonly BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n\treadonly playerIsFriendly: boolean;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"attack.js","sourceRoot":"","sources":["../../src/simulation/attack.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { hasOnAfterDeath, hasOnDeath } from '../cards/card.interface';\r\nimport { cardMappings } from '../cards/impl/_card-mappings';\r\nimport { debugState } from '../debug-state';\r\nimport { updateDivineShield } from '../keywords/divine-shield';\r\nimport { updateVenomous } from '../keywords/venomous';\r\nimport { CardIds } from '../services/card-ids';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { addImpliedMechanics, isFish } from '../utils';\r\nimport { applyAfterAttackEffects, applyAfterAttackTrinkets } from './after-attack';\r\nimport { onEntityDamaged } from './damage-effects';\r\nimport { rememberDeathrattles } from './deathrattle-effects';\r\nimport { orchestrateMinionDeathEffects } from './deathrattle-orchestration';\r\nimport { spawnEntities } from './deathrattle-spawns';\r\nimport { FullGameState } from './internal-game-state';\r\nimport { makeMinionsDie } from './minion-death';\r\nimport { onMinionKill } from './minion-kill';\r\nimport { applyOnAttackEffects } from './on-attack';\r\nimport { applyOnBeingAttackedBuffs } from './on-being-attacked';\r\nimport { performEntitySpawns } from './spawns';\r\nimport { applyAfterStatsUpdate } from './stats';\r\nimport { handleSummonsWhenSpace } from './summon-when-space';\r\nimport { canAttack } from './utils/entity-utils';\r\n\r\n// Only use it to simulate actual attack. To simulate damage, or something similar, use bumpInto\r\nexport const simulateAttack = (\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\toptions?: {\r\n\t\tskipSummonWhenSpace?: boolean;\r\n\t\tforceTarget?: BoardEntity;\r\n\t},\r\n): BoardEntity => {\r\n\t// console.debug(\r\n\t// \t'\\nsimulating attack',\r\n\t// \tstringifySimple(attackingBoard, gameState.allCards),\r\n\t// \t'\\n',\r\n\t// \tstringifySimple(defendingBoard, gameState.allCards),\r\n\t// );\r\n\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst attackingEntity = getAttackingEntity(attackingBoard, gameState.allCards);\r\n\tif (attackingEntity) {\r\n\t\tgameState.sharedState.currentAttackerEntityId = attackingEntity.entityId;\r\n\t\t// Get the left entities now, otherwise things might break if the attacker dies and/or other\r\n\t\t// entities pop\r\n\t\tconst attackingEntityIndex = attackingBoard.indexOf(attackingEntity);\r\n\t\tconst attackingEntitiesToTheLeft = attackingBoard.slice(0, attackingEntityIndex);\r\n\t\tconst isAttackingImmediately = attackingEntity.attackImmediately;\r\n\t\t// In case of Broodmother spawn, it spawns where the dead minion was, and has no influence on the\r\n\t\t// attack order\r\n\t\t// Situation this is trying to resolve by putting this right at the top of the loop:\r\n\t\t// - One scallywag attacks into another one, both die\r\n\t\t// - The first one attacks. To its left is a Harmless Bonehead with 1 HP. The scallywag attacks, and both scallys die\r\n\t\t// - The *other* sky pirate attacks first, and kills the bonehead. Two minions are spawned\r\n\t\t// - The first sy pirate attacks\r\n\t\t// - The initial loop is resolved. If this is at the end, the Harmless Bonehead is already dead, and not flagged\r\n\t\t// While having this right away, we immediately flag all minions to the left\r\n\t\tif (!isAttackingImmediately) {\r\n\t\t\t// Make sure they won't be able to attack until everyone has attacked\r\n\t\t\t// See http://replays.firestoneapp.com/?reviewId=a1b3066d-e806-44c1-ab4b-7ef9dbf9b5b9&turn=5&action=4\r\n\t\t\tattackingEntitiesToTheLeft.forEach((entity) => (entity.hasAttacked = 2));\r\n\t\t} else {\r\n\t\t\t// Change it right away so that new spawns don't trigger the \"attack immediately\" again\r\n\t\t\tattackingEntity.attackImmediately = false;\r\n\t\t}\r\n\r\n\t\tconst numberOfAttacks = attackingEntity.windfury ? 2 : 1;\r\n\t\tfor (let i = 0; i < numberOfAttacks; i++) {\r\n\t\t\t// We refresh the entity in case of windfury\r\n\t\t\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\t\t\t// We still want to flag the entity as having attacked, so that it doesn't attack again\r\n\t\t\t\t// after teammate switch in Duos\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\t// Check that didn't die\r\n\t\t\tif (attackingBoard.find((entity) => entity.entityId === attackingEntity.entityId)) {\r\n\t\t\t\tconst defendingEntity: BoardEntity =\r\n\t\t\t\t\toptions?.forceTarget ?? getDefendingEntity(defendingBoard, attackingEntity);\r\n\t\t\t\t// Can happen with a single defender that has stealth\r\n\t\t\t\tif (defendingEntity && defendingEntity.health > 0 && !defendingEntity.definitelyDead) {\r\n\t\t\t\t\tdoFullAttack(\r\n\t\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingEntity,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t\toptions,\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Solves the edge case of Sky Pirate vs a stealth board\r\n\t\t\t\t\tattackingEntity.attackImmediately = false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tgameState.sharedState.currentAttackerEntityId = null;\r\n\t\tattackingEntity.hasAttacked = 1;\r\n\t}\r\n\treturn attackingEntity;\r\n};\r\n\r\nexport const doFullAttack = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\toptions?: {\r\n\t\tskipSummonWhenSpace?: boolean;\r\n\t},\r\n) => {\r\n\tconst isAttackingImmediately = attackingEntity.attackImmediately;\r\n\tgameState.spectator.registerAttack(\r\n\t\tattackingEntity,\r\n\t\tdefendingEntity,\r\n\t\tattackingBoard,\r\n\t\tdefendingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoardHero,\r\n\t);\r\n\t// http://replays.firestoneapp.com/?reviewId=50576a9f-2e6a-4600-87ba-6e737ca9853e&turn=21&action=4\r\n\t// Looks like onBeingAttacked effects apply before onAttack effects\r\n\tapplyOnBeingAttackedBuffs(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tconst { damageDoneByAttacker: damageDoneByAttacker1, damageDoneByDefender: damageDoneByDefender1 } =\r\n\t\tapplyOnAttackEffects(\r\n\t\t\tattackingEntity,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingEntity,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\tconst { damageDoneByAttacker: damageDoneByAttacker2, damageDoneByDefender: damageDoneByDefender2 } = performAttack(\r\n\t\tattackingEntity,\r\n\t\tdefendingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t);\r\n\tconst damageDoneByAttacker = damageDoneByAttacker1 + damageDoneByAttacker2;\r\n\tconst damageDoneByDefender = damageDoneByDefender1 + damageDoneByDefender2;\r\n\r\n\t// Process this after the minions die and deathrattles are triggered/spawned\r\n\t// https://replays.firestoneapp.com/?reviewId=dd4e9dbe-abca-434a-ab94-04777cbedefe&turn=29&action=3\r\n\t// BUT: the attacking entity's afterAttack (like Macaw) needs to be processed\r\n\t// To recap:\r\n\t// - Jar o'Gems procs after the deathrattles have spawned\r\n\t// - When Monstrous Macaw procs a deathrattle, it is still on board, thus limiting the spawn room\r\n\t// So not sure what the exact timings are. It could be:\r\n\t// 1. Trigger minion's after attack\r\n\t// 2. Make minions die\r\n\t// 3. Process trinkets after attack\r\n\t// I have asked on Discord - for now I will consider a \"minion after attack\" phase and a \"trinket after attack\" phase.\r\n\t// I'm not sure about the secrets / trinkets, they will need to be adapted\r\n\tapplyAfterAttackEffects(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tdamageDoneByAttacker,\r\n\t\tdamageDoneByDefender,\r\n\t\tgameState,\r\n\t);\r\n\r\n\tprocessMinionDeath(\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tgameState,\r\n\t\toptions?.skipSummonWhenSpace || isAttackingImmediately,\r\n\t);\r\n\r\n\tapplyAfterAttackTrinkets(\r\n\t\tattackingEntity,\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\tdefendingEntity,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tdamageDoneByAttacker,\r\n\t\tdamageDoneByDefender,\r\n\t\tgameState,\r\n\t);\r\n\tapplyAfterStatsUpdate(gameState);\r\n\tattackingEntity.immuneWhenAttackCharges = Math.max(0, (attackingEntity.immuneWhenAttackCharges ?? 0) - 1);\r\n\t// if (\r\n\t// \tdefendingEntity.health > 0 &&\r\n\t// \t!defendingEntity.definitelyDead\r\n\t// \t&& (defendingEntity.cardId === CardIds.YoHoOgre_BGS_060 ||\r\n\t// \t\tdefendingEntity.cardId === CardIds.YoHoOgre_TB_BaconUps_150)\r\n\t// ) {\r\n\t// \tdefendingEntity.attackImmediately = true;\r\n\t// \tif (defendingEntity.attackImmediately) {\r\n\t// \t\tsimulateAttack(defendingBoard, defendingBoardHero, attackingBoard, attackingBoardHero, gameState);\r\n\t// \t}\r\n\t// }\r\n};\r\n\r\nconst performAttack = (\r\n\tattackingEntity: BoardEntity,\r\n\tdefendingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): { damageDoneByAttacker: number; damageDoneByDefender: number } => {\r\n\tlet damageDoneByAttacker = 0;\r\n\tlet damageDoneByDefender = 0;\r\n\r\n\t// if (hasCorrectTribe(attackingEntity, attackingBoardHero, Race.DRAGON, gameState.anomalies, gameState.allCards)) {\r\n\t// \tconst prestors = attackingBoard\r\n\t// \t\t.filter((e) => e.entityId !== attackingEntity.entityId)\r\n\t// \t\t.filter(\r\n\t// \t\t\t(e) =>\r\n\t// \t\t\t\te.cardId === CardIds.PrestorsPyrospawn_BG21_012 ||\r\n\t// \t\t\t\te.cardId === CardIds.PrestorsPyrospawn_BG21_012_G,\r\n\t// \t\t);\r\n\t// \tprestors.forEach((prestor) => {\r\n\t// \t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\tprestor,\r\n\t// \t\t\tdefendingEntity,\r\n\t// \t\t\tdefendingBoard,\r\n\t// \t\t\tattackingBoardHero,\r\n\t// \t\t\tdefendingBoardHero,\r\n\t// \t\t);\r\n\t// \t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t// \t\t\tdefendingEntity,\r\n\t// \t\t\tdefendingBoard,\r\n\t// \t\t\tdefendingBoardHero,\r\n\t// \t\t\tprestor,\r\n\t// \t\t\tprestor.cardId === CardIds.PrestorsPyrospawn_BG21_012_G ? 6 : 3,\r\n\t// \t\t\tattackingBoard,\r\n\t// \t\t\tattackingBoardHero,\r\n\t// \t\t\tgameState,\r\n\t// \t\t);\r\n\t// \t});\r\n\t// }\r\n\t// if (\r\n\t// \tattackingEntity.cardId === CardIds.Atramedes_BG23_362 ||\r\n\t// \tattackingEntity.cardId === CardIds.Atramedes_BG23_362_G\r\n\t// ) {\r\n\t// \tconst targets = [defendingEntity, ...getNeighbours(defendingBoard, defendingEntity)];\r\n\t// \tconst multiplier = attackingEntity.cardId === CardIds.Atramedes_BG23_362_G ? 2 : 1;\r\n\r\n\t// \tfor (let i = 0; i < multiplier; i++) {\r\n\t// \t\ttargets.forEach((target) => {\r\n\t// \t\t\tgameState.spectator.registerPowerTarget(\r\n\t// \t\t\t\tattackingEntity,\r\n\t// \t\t\t\ttarget,\r\n\t// \t\t\t\tdefendingBoard,\r\n\t// \t\t\t\tattackingBoardHero,\r\n\t// \t\t\t\tdefendingBoardHero,\r\n\t// \t\t\t);\r\n\t// \t\t\tdamageDoneByAttacker += dealDamageToMinion(\r\n\t// \t\t\t\ttarget,\r\n\t// \t\t\t\tdefendingBoard,\r\n\t// \t\t\t\tdefendingBoardHero,\r\n\t// \t\t\t\tattackingEntity,\r\n\t// \t\t\t\t3,\r\n\t// \t\t\t\tattackingBoard,\r\n\t// \t\t\t\tattackingBoardHero,\r\n\t// \t\t\t\tgameState,\r\n\t// \t\t\t);\r\n\t// \t\t});\r\n\t// \t}\r\n\t// } else\r\n\tif ([CardIds.BabyKrush_BG22_001, CardIds.BabyKrush_BG22_001_G].includes(attackingEntity.cardId as CardIds)) {\r\n\t\tconst spawns = spawnEntities(\r\n\t\t\tattackingEntity.cardId === CardIds.BabyKrush_BG22_001_G\r\n\t\t\t\t? CardIds.BabyKrush_BG22_001_G\r\n\t\t\t\t: CardIds.BabyKrush_DevilsaurToken,\r\n\t\t\t1,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tgameState,\r\n\t\t\ttrue,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t\tif (spawns.length > 0) {\r\n\t\t\tconst sourceIndex = attackingBoard.indexOf(attackingEntity);\r\n\t\t\tconst actualSpawns = performEntitySpawns(\r\n\t\t\t\tspawns,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tsourceIndex,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tfor (const actualSpawn of actualSpawns) {\r\n\t\t\t\tif (defendingEntity.health > 0 && !defendingEntity.definitelyDead) {\r\n\t\t\t\t\tperformAttack(\r\n\t\t\t\t\t\tactualSpawn,\r\n\t\t\t\t\t\tdefendingEntity,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tgameState,\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// For Prestor\r\n\tconst defenderAliveBeforeAttack = defendingEntity.health > 0 && !defendingEntity.definitelyDead;\r\n\t// Because of Bristleback Knight, which changes its divine shield status during bumpEntities\r\n\tconst attackerHadDivineShield = attackingEntity.divineShield;\r\n\tconst defenderHadDivineShield = defendingEntity.divineShield;\r\n\t// For cleave\r\n\t// We do that now so that we don't include entities that spawn on entity damaged\r\n\tconst defenderNeighbours: readonly BoardEntity[] = getNeighbours(defendingBoard, defendingEntity);\r\n\tif (defenderAliveBeforeAttack) {\r\n\t\tif (!attackingEntity.immuneWhenAttackCharges) {\r\n\t\t\t// TODO: this bumpEntities approach doesn't work well, as it leads to code duplication\r\n\t\t\tdamageDoneByDefender += bumpEntities(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tdamageDoneByAttacker += bumpEntities(\r\n\t\t\tdefendingEntity,\r\n\t\t\tattackingEntity,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t\tif (defendingEntity.attack > 0 && attackerHadDivineShield && !attackingEntity.immuneWhenAttackCharges) {\r\n\t\t\tupdateDivineShield(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tfalse,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (attackingEntity.attack > 0 && defenderHadDivineShield) {\r\n\t\t\tupdateDivineShield(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tfalse,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t// cause wrong results to happen\r\n\t\t// This whole logic is a MEEEEESSSSSSSSSSSSSSS\r\n\t\tif (damageDoneByDefender > 0) {\r\n\t\t\tonEntityDamaged(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdamageDoneByDefender,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (damageDoneByAttacker > 0) {\r\n\t\t\tonEntityDamaged(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdamageDoneByAttacker,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (defendingEntity.health <= 0 || defendingEntity.definitelyDead) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\ttrue,\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tdefenderNeighbours,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t\tif (attackingEntity.health <= 0 || attackingEntity.definitelyDead) {\r\n\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\tdefendingEntity,\r\n\t\t\t\tfalse,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tdefenderNeighbours,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t}\r\n\t}\r\n\t// Cleave\r\n\tif (attackingEntity.cleave) {\r\n\t\tfor (const neighbour of defenderNeighbours) {\r\n\t\t\tconst thisAttackDamage = bumpEntities(\r\n\t\t\t\tneighbour,\r\n\t\t\t\tattackingEntity,\r\n\t\t\t\tdefendingBoard,\r\n\t\t\t\tdefendingBoardHero,\r\n\t\t\t\tattackingBoard,\r\n\t\t\t\tattackingBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t\tdamageDoneByAttacker += thisAttackDamage;\r\n\t\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t\t// cause wrong results to happen\r\n\t\t\tif (attackingEntity.attack > 0 && neighbour.divineShield) {\r\n\t\t\t\tupdateDivineShield(neighbour, defendingBoard, defendingBoardHero, attackingBoardHero, false, gameState);\r\n\t\t\t}\r\n\t\t\tif (thisAttackDamage > 0) {\r\n\t\t\t\tonEntityDamaged(\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\tthisAttackDamage,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\tif (neighbour.health <= 0 || neighbour.definitelyDead) {\r\n\t\t\t\tconst { dmgDoneByAttacker, dmgDoneByDefender } = onMinionKill(\r\n\t\t\t\t\tattackingEntity,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tneighbour,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tdefenderNeighbours,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t\tdamageDoneByAttacker += dmgDoneByAttacker;\r\n\t\t\t\tdamageDoneByDefender += dmgDoneByDefender;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tattackingEntity.attackImmediately = false;\r\n\tif (attackingEntity.enchantments.some((e) => e.cardId === CardIds.VolatileVenom_VolatileEnchantment)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\treturn { damageDoneByAttacker, damageDoneByDefender };\r\n};\r\n\r\n// TODO: Could it be possible to store the index of the entity that last attacked? Probably not, because minion\r\n// spawns would mess this up? Could we update the indexes as each entity spawns / dies?\r\nconst getAttackingEntity = (attackingBoard: BoardEntity[], allCards: AllCardsService): BoardEntity => {\r\n\tlet validAttackers = attackingBoard.filter((entity) => canAttack(entity));\r\n\tif (validAttackers.length === 0) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (validAttackers.some((entity) => entity.attackImmediately)) {\r\n\t\tvalidAttackers = validAttackers.filter((entity) => entity.attackImmediately);\r\n\t} else if (validAttackers.every((e) => e.hasAttacked != null)) {\r\n\t\tattackingBoard.forEach((e) => (e.hasAttacked = undefined));\r\n\t} else {\r\n\t\tvalidAttackers = validAttackers.filter((entity) => entity.hasAttacked == undefined);\r\n\t}\r\n\tconst attacker = validAttackers[0];\r\n\treturn attacker;\r\n};\r\n\r\nexport const findNearestEnemies = (\r\n\tattackingBoard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tentityIndexFromRight: number,\r\n\tdefendingBoard: BoardEntity[],\r\n\tnumberOfTargets: number,\r\n\tallCards: AllCardsService,\r\n): BoardEntity[] => {\r\n\tconst result = [];\r\n\tif (defendingBoard.length > 0) {\r\n\t\t// console.debug('defending board', numberOfTargets, stringifySimple(defendingBoard, allCards));\r\n\t\tconst attackerIndex = attackingBoard.length - entityIndexFromRight - 1;\r\n\t\tconst targetIndex = attackerIndex - (attackingBoard.length - defendingBoard.length) / 2;\r\n\t\t// console.debug('indexes', attackerIndex, entityIndexFromRight, targetIndex, attackingBoard.length);\r\n\r\n\t\tfor (let i = 0; i < numberOfTargets; i++) {\r\n\t\t\tconst possibleTargets = defendingBoard\r\n\t\t\t\t.filter((e) => !e.definitelyDead && e.health > 0)\r\n\t\t\t\t.filter((e) => !result.includes(e));\r\n\t\t\t// console.debug('possibleTargets', stringifySimple(possibleTargets, allCards));\r\n\t\t\tif (!possibleTargets.length) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\r\n\t\t\tconst targetGroups = groupByFunction((e: BoardEntity) => Math.abs(defendingBoard.indexOf(e) - targetIndex))(\r\n\t\t\t\tpossibleTargets,\r\n\t\t\t);\r\n\t\t\tconst distances = Object.keys(targetGroups)\r\n\t\t\t\t.map((k) => +k)\r\n\t\t\t\t.sort();\r\n\t\t\tconst nearestDistance = distances[0];\r\n\t\t\tif (nearestDistance != null) {\r\n\t\t\t\t// console.debug(\r\n\t\t\t\t// \t'targetGroups[nearestDistance]',\r\n\t\t\t\t// \tnearestDistance,\r\n\t\t\t\t// \tstringifySimple(targetGroups[nearestDistance], allCards),\r\n\t\t\t\t// );\r\n\t\t\t\tconst target = pickRandom(targetGroups[nearestDistance]);\r\n\t\t\t\tresult.push(target);\r\n\t\t\t}\r\n\t\t\t// console.debug('\\n');\r\n\t\t}\r\n\t}\r\n\treturn result.filter((e) => !!e);\r\n};\r\n\r\nexport const getNeighbours = (\r\n\tboard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tdeadEntityIndexFromRight?: number,\r\n\talwaysIncludeBoth = false,\r\n): readonly BoardEntity[] => {\r\n\tconst neighbours = [];\r\n\t// When triggering DR with Hawkstrider, the entity is still on the board\r\n\tif (deadEntityIndexFromRight != null && !board.includes(entity)) {\r\n\t\tconst leftNeighbourIndex = board.length - 1 - deadEntityIndexFromRight;\r\n\t\tconst leftNeighbour = board[leftNeighbourIndex];\r\n\t\tif (leftNeighbour) {\r\n\t\t\tneighbours.push(leftNeighbour);\r\n\t\t}\r\n\r\n\t\t// If the deadEntityIndexFromRight === 0 (right-most minion), no neighbour will be found\r\n\t\tconst rightNeighbourIndex = board.length - 1 - (deadEntityIndexFromRight - 1);\r\n\t\tconst rightNeighbour = board[rightNeighbourIndex];\r\n\t\tif (rightNeighbour) {\r\n\t\t\tneighbours.push(rightNeighbour);\r\n\t\t}\r\n\t} else {\r\n\t\tconst index = board.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\tif (index - 1 >= 0) {\r\n\t\t\tneighbours.push(board[index - 1]);\r\n\t\t} else if (alwaysIncludeBoth) {\r\n\t\t\tneighbours.push(null);\r\n\t\t}\r\n\t\t// neighbours.push(entity);\r\n\t\tif (index + 1 < board.length) {\r\n\t\t\tneighbours.push(board[index + 1]);\r\n\t\t} else if (alwaysIncludeBoth) {\r\n\t\t\tneighbours.push(null);\r\n\t\t}\r\n\t}\r\n\treturn neighbours;\r\n};\r\n\r\nexport const getLeftNeighbour = (\r\n\tboard: BoardEntity[],\r\n\tentity: BoardEntity,\r\n\tdeadEntityIndexFromRight?: number,\r\n): BoardEntity => {\r\n\t// When triggering DR with Hawkstrider, the entity is still on the board\r\n\tif (deadEntityIndexFromRight != null && !board.includes(entity)) {\r\n\t\tconst leftNeighbourIndex = board.length - 1 - deadEntityIndexFromRight;\r\n\t\tconst leftNeighbour = board[leftNeighbourIndex];\r\n\t\tif (leftNeighbour) {\r\n\t\t\treturn leftNeighbour;\r\n\t\t}\r\n\t} else {\r\n\t\tconst index = board.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\tif (index - 1 >= 0) {\r\n\t\t\treturn board[index - 1];\r\n\t\t}\r\n\t}\r\n\treturn null;\r\n};\r\n\r\nexport const dealDamageToRandomEnemy = (\r\n\tboardToBeDamaged: BoardEntity[],\r\n\tboardToBeDamagedHero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity,\r\n\tdamage: number,\r\n\tboardWithAttackOrigin: BoardEntity[],\r\n\tboardWithAttackOriginHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): void => {\r\n\tif (boardToBeDamaged.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\tconst validTargets = boardToBeDamaged.filter((e) => e.health > 0 && !e.definitelyDead);\r\n\tconst defendingEntity: BoardEntity = pickRandom(validTargets);\r\n\tif (defendingEntity) {\r\n\t\tgameState.spectator.registerPowerTarget(\r\n\t\t\tdamageSource,\r\n\t\t\tdefendingEntity,\r\n\t\t\tboardToBeDamaged,\r\n\t\t\tboardToBeDamagedHero,\r\n\t\t\tboardWithAttackOriginHero,\r\n\t\t);\r\n\t\tdealDamageToMinion(\r\n\t\t\tdefendingEntity,\r\n\t\t\tboardToBeDamaged,\r\n\t\t\tboardToBeDamagedHero,\r\n\t\t\tdamageSource,\r\n\t\t\tdamage,\r\n\t\t\tboardWithAttackOrigin,\r\n\t\t\tboardWithAttackOriginHero,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport const dealDamageToMinion = (\r\n\ttarget: BoardEntity,\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity | BgsPlayerEntity,\r\n\tdamage: number,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// console.log('dealing damage to', damage, stringifySimpleCard(defendingEntity, allCards));\r\n\tif (!target) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst isDeadBeforeDamage = target.definitelyDead || target.health <= 0;\r\n\tconst spawns = [];\r\n\t// Why do we use a fakeAttacker? Is that for the \"attacking\" prop?\r\n\t// That prop is only used for Overkill, and even in that case it looks like it would work\r\n\t// without it\r\n\tconst fakeAttacker = {\r\n\t\t...(damageSource || {}),\r\n\t\tentityId: -1,\r\n\t\tattack: damage,\r\n\t\t// attacking: true,\r\n\t} as BoardEntity;\r\n\tconst actualDamageDone = bumpEntities(target, fakeAttacker, board, hero, otherBoard, otherHero, gameState);\r\n\r\n\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t// cause wrong results to happen\r\n\t// TODO: why isn't it done in bumpEntities?\r\n\t// Because of how \"bump\" works: we do it first for the attacker, then the defender, and we only want to update\r\n\t// the divine shield once both bumps are done\r\n\t// The problem is with the Frenzy: bumpEntities can trigger the frenzy, and which can act on the divine shield\r\n\tif (fakeAttacker.attack > 0 && target.divineShield) {\r\n\t\tupdateDivineShield(target, board, hero, otherHero, false, gameState);\r\n\t}\r\n\r\n\tif (actualDamageDone > 0) {\r\n\t\t// TODO: handle entities that have been spawned here to adjust the dead entity index from parent stack\r\n\t\tconst newSpawns = onEntityDamaged(\r\n\t\t\ttarget,\r\n\t\t\tboard,\r\n\t\t\thero,\r\n\t\t\totherBoard,\r\n\t\t\totherHero,\r\n\t\t\tdamageSource,\r\n\t\t\tactualDamageDone,\r\n\t\t\tgameState,\r\n\t\t);\r\n\t}\r\n\tif (!isDeadBeforeDamage && actualDamageDone > 0 && 'attack' in damageSource && 'health' in damageSource) {\r\n\t\ttarget.lastAffectedByEntity = damageSource as BoardEntity;\r\n\r\n\t\tif (target.health <= 0 || target.definitelyDead) {\r\n\t\t\tonMinionKill(damageSource as BoardEntity, false, target, otherBoard, otherHero, board, hero, [], gameState);\r\n\t\t}\r\n\t}\r\n\tconst defendingEntityIndex = board.map((entity) => entity.entityId).indexOf(target.entityId);\r\n\tboard[defendingEntityIndex] = target;\r\n\treturn actualDamageDone;\r\n};\r\n\r\n// Because the \"onEntityDamaged\" effect is only called once all the minions are damaged\r\nexport const dealDamageToMinions = (\r\n\ttargets: BoardEntity[],\r\n\tboard: BoardEntity[],\r\n\thero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity | BgsPlayerEntity,\r\n\tdamage: number,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n): number => {\r\n\t// console.log('dealing damage to', damage, stringifySimpleCard(defendingEntity, allCards));\r\n\tif (!targets?.length) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst actualDamagesDone = [];\r\n\tconst areDeadBeforeDamage = targets.map((target) => target.definitelyDead || target.health <= 0);\r\n\r\n\tfor (const target of targets) {\r\n\t\t// Why do we use a fakeAttacker? Is that for the \"attacking\" prop?\r\n\t\t// That prop is only used for Overkill, and even in that case it looks like it would work\r\n\t\t// without it\r\n\t\tconst fakeAttacker = {\r\n\t\t\t...(damageSource || {}),\r\n\t\t\tentityId: -1,\r\n\t\t\tattack: damage,\r\n\t\t\t// attacking: true,\r\n\t\t} as BoardEntity;\r\n\t\tconst actualDamageDone = bumpEntities(target, fakeAttacker, board, hero, otherBoard, otherHero, gameState);\r\n\t\tactualDamagesDone.push(actualDamageDone);\r\n\r\n\t\t// Do it after the damage has been done, so that entities that update on DS lose / gain (CyborgDrake) don't\r\n\t\t// cause wrong results to happen\r\n\t\t// TODO: why isn't it done in bumpEntities?\r\n\t\t// Because of how \"bump\" works: we do it first for the attacker, then the defender, and we only want to update\r\n\t\t// the divine shield once both bumps are done\r\n\t\t// The problem is with the Frenzy: bumpEntities can trigger the frenzy, and which can act on the divine shield\r\n\t\tif (fakeAttacker.attack > 0 && target.divineShield) {\r\n\t\t\tupdateDivineShield(target, board, hero, otherHero, false, gameState);\r\n\t\t}\r\n\t}\r\n\r\n\tconst spawns = [];\r\n\tfor (let i = 0; i < targets.length; i++) {\r\n\t\tconst target = targets[i];\r\n\t\tconst actualDamageDone = actualDamagesDone[i];\r\n\t\tconst isDeadBeforeDamage = areDeadBeforeDamage[i];\r\n\t\tif (actualDamageDone > 0) {\r\n\t\t\t// TODO: handle entities that have been spawned here to adjust the dead entity index from parent stack\r\n\t\t\tconst newSpawns = onEntityDamaged(\r\n\t\t\t\ttarget,\r\n\t\t\t\tboard,\r\n\t\t\t\thero,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherHero,\r\n\t\t\t\tdamageSource,\r\n\t\t\t\tactualDamageDone,\r\n\t\t\t\tgameState,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (!isDeadBeforeDamage && actualDamageDone > 0 && 'attack' in damageSource && 'health' in damageSource) {\r\n\t\t\ttarget.lastAffectedByEntity = damageSource as BoardEntity;\r\n\r\n\t\t\tif (target.health <= 0 || target.definitelyDead) {\r\n\t\t\t\tonMinionKill(\r\n\t\t\t\t\tdamageSource as BoardEntity,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\ttarget,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherHero,\r\n\t\t\t\t\tboard,\r\n\t\t\t\t\thero,\r\n\t\t\t\t\t[],\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst defendingEntityIndex = board.map((entity) => entity.entityId).indexOf(target.entityId);\r\n\t\tboard[defendingEntityIndex] = target;\r\n\t}\r\n\treturn actualDamagesDone.reduce((a, b) => a + b, 0);\r\n};\r\n\r\nexport const getDefendingEntity = (\r\n\tdefendingBoard: BoardEntity[],\r\n\tattackingEntity: BoardEntity,\r\n\tignoreTaunts = false,\r\n): BoardEntity => {\r\n\tif (debugState.active) {\r\n\t\tfor (const forcedFaceOff of debugState.forcedFaceOff) {\r\n\t\t\tif (debugState.isCorrectEntity(forcedFaceOff.attacker, attackingEntity)) {\r\n\t\t\t\t// if (attackingEntity.entityId === forcedFaceOff.attacker.entityId) {\r\n\t\t\t\tconst def = defendingBoard.find((e) => debugState.isCorrectEntity(forcedFaceOff.defender, e));\r\n\t\t\t\tif (!!def) {\r\n\t\t\t\t\t// Remove the face-off\r\n\t\t\t\t\tdebugState.forcedFaceOff = debugState.forcedFaceOff.filter((f) => f != forcedFaceOff);\r\n\t\t\t\t\treturn def;\r\n\t\t\t\t}\r\n\t\t\t\t// }\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tlet possibleDefenders: readonly BoardEntity[];\r\n\tif (\r\n\t\tattackingEntity.cardId === CardIds.ZappSlywick_BGS_022 ||\r\n\t\tattackingEntity.cardId === CardIds.ZappSlywick_TB_BaconUps_091 ||\r\n\t\tattackingEntity.cardId === CardIds.MercilessMammoth_BG33_845 ||\r\n\t\tattackingEntity.cardId === CardIds.MercilessMammoth_BG33_845_G\r\n\t) {\r\n\t\tconst minAttack = Math.min(...defendingBoard.map((entity) => entity.attack));\r\n\t\tpossibleDefenders = defendingBoard.filter((entity) => entity.attack === minAttack);\r\n\t} else if (\r\n\t\tattackingEntity.cardId === CardIds.WorgenVigilante_BG26_921 ||\r\n\t\tattackingEntity.cardId === CardIds.WorgenVigilante_BG26_921_G\r\n\t) {\r\n\t\tpossibleDefenders = defendingBoard\r\n\t\t\t.filter(\r\n\t\t\t\t(entity) =>\r\n\t\t\t\t\tentity.health <= attackingEntity.attack || attackingEntity.venomous || attackingEntity.poisonous,\r\n\t\t\t)\r\n\t\t\t.filter((e) => !e.divineShield);\r\n\t\tif (!possibleDefenders.length) {\r\n\t\t\tpossibleDefenders = defendingBoard;\r\n\t\t}\r\n\t} else {\r\n\t\tpossibleDefenders = defendingBoard.filter((e) => !e.stealth);\r\n\t\tif (!ignoreTaunts) {\r\n\t\t\tconst taunts = possibleDefenders.filter((entity) => entity.taunt);\r\n\t\t\tpossibleDefenders = taunts.length > 0 ? taunts : possibleDefenders;\r\n\t\t}\r\n\t}\r\n\r\n\tconst chosenDefender = pickRandom(possibleDefenders);\r\n\t// if (chosenDefender?.taunt) {\r\n\t// \tconst elistras = defendingBoard.filter(\r\n\t// \t\t(entity) =>\r\n\t// \t\t\tentity.cardId === CardIds.ElistraTheImmortal_BGS_205 ||\r\n\t// \t\t\tentity.cardId === CardIds.ElistraTheImmortal_TB_BaconUps_306,\r\n\t// \t);\r\n\t// \tif (elistras.length > 0) {\r\n\t// \t\tchosenDefender = elistras[Math.floor(Math.random() * elistras.length)];\r\n\t// \t}\r\n\t// }\r\n\treturn chosenDefender;\r\n};\r\n\r\nexport const bumpEntities = (\r\n\tentity: BoardEntity,\r\n\tbumpInto: BoardEntity,\r\n\tentityBoard: BoardEntity[],\r\n\tentityBoardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherHero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\tapplyVenomous = true,\r\n): number => {\r\n\t// No attack has no impact\r\n\tconst debug = bumpInto.cardId === 'BG26_888';\r\n\tif (bumpInto.attack === 0) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t// Matador effect has priority\r\n\tif (\r\n\t\tentity.abiityChargesLeft > 0 &&\r\n\t\t(entity.cardId === CardIds.MadMatador_BG28_404 || entity.cardId === CardIds.MadMatador_BG28_404_G)\r\n\t) {\r\n\t\tentity.abiityChargesLeft--;\r\n\t\tconst newTarget = pickRandom(otherBoard);\r\n\t\tif (newTarget) {\r\n\t\t\tgameState.spectator.registerPowerTarget(entity, newTarget, otherBoard, entityBoardHero, otherHero);\r\n\t\t\t// TODO: here the MadMatador is the source of the damage, not the initial attacker\r\n\t\t\t// Not sure exactly what the impact would be, as there is no counter\r\n\t\t\tconst newSource = {\r\n\t\t\t\t...entity,\r\n\t\t\t\tattack: bumpInto.attack,\r\n\t\t\t\t// attacking: true,\r\n\t\t\t} as BoardEntity;\r\n\t\t\tconst defenderHadDivineShield = newTarget.divineShield;\r\n\t\t\tconst damageDone = bumpEntities(\r\n\t\t\t\tnewTarget,\r\n\t\t\t\tnewSource,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherHero,\r\n\t\t\t\tentityBoard,\r\n\t\t\t\tentityBoardHero,\r\n\t\t\t\tgameState,\r\n\t\t\t\tfalse,\r\n\t\t\t);\r\n\t\t\tif (newSource.attack > 0 && defenderHadDivineShield) {\r\n\t\t\t\tupdateDivineShield(newTarget, otherBoard, otherHero, entityBoardHero, false, gameState);\r\n\t\t\t}\r\n\t\t\tif (damageDone > 0) {\r\n\t\t\t\tonEntityDamaged(\r\n\t\t\t\t\tnewTarget,\r\n\t\t\t\t\totherBoard,\r\n\t\t\t\t\totherHero,\r\n\t\t\t\t\tentityBoard,\r\n\t\t\t\t\tentityBoardHero,\r\n\t\t\t\t\tnewSource,\r\n\t\t\t\t\tdamageDone,\r\n\t\t\t\t\tgameState,\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\treturn damageDone;\r\n\t\t}\r\n\t}\r\n\r\n\tif (entity.divineShield) {\r\n\t\tgameState.spectator.registerDamageDealt(bumpInto, entity, 0, entityBoard);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst damageDealt = (entity.damageMultiplier || 1) * bumpInto.attack;\r\n\tentity.health = entity.health - damageDealt;\r\n\t// FIXME: This will likely be incorrect in terms of timings, e.g. if the entity ends up\r\n\t// surviving following a buff like Spawn.\r\n\tgameState.spectator.registerDamageDealt(bumpInto, entity, damageDealt, entityBoard);\r\n\r\n\t// if (entity.cardId === CardIds.Bubblette_BG_TID_713 && bumpInto.attack === 1) {\r\n\t// \tentity.definitelyDead = true;\r\n\t// } else if (entity.cardId === CardIds.Bubblette_BG_TID_713_G && bumpInto.attack === 2) {\r\n\t// \tentity.definitelyDead = true;\r\n\t// }\r\n\t// Do it last, so that other effects are still processed\r\n\tif (bumpInto.poisonous) {\r\n\t\t// So that further buffs don't revive it\r\n\t\t// And we don't just set the health to avoid applying overkill effects\r\n\t\tentity.definitelyDead = true;\r\n\t}\r\n\tif (bumpInto.venomous && applyVenomous) {\r\n\t\t// So that further buffs don't revive it\r\n\t\t// And we don't just set the health to avoid applying overkill effects\r\n\t\tentity.definitelyDead = true;\r\n\t\tupdateVenomous(bumpInto, false, otherBoard, otherHero, entityBoardHero, gameState);\r\n\t}\r\n\t// Ideally we should do the Reckoning stuff here. However, at this point we only have half the damage\r\n\t// information, so it is possible that the entity deals more than 3 (which should trigger Reckoning)\r\n\t// but dies during the exchange (and Reckoning doesn't trigger then)\r\n\r\n\tentity.lastAffectedByEntity = bumpInto;\r\n\t// if (entity.frenzyChargesLeft > 0 && entity.health > 0 && !entity.definitelyDead) {\r\n\t// \tapplyFrenzy(entity, entityBoard, entityBoardHero, gameState);\r\n\t// \tentity.frenzyChargesLeft--;\r\n\t// }\r\n\r\n\t// We spawn them here, because it says \"whenever\", and so happens right away\r\n\t// FIXME: there could be a bug here, if a Cleave attacks several IGB at the same time. The current\r\n\t// implementation could spawn minions above the max board size. Fringe case though, so leaving it\r\n\t// like this for now\r\n\t// const entitySpawns = getWheneverEntitySpawns(\r\n\t// \tentity,\r\n\t// \tentityBoard,\r\n\t// \tentityBoardHero,\r\n\t// \totherBoard,\r\n\t// \totherHero,\r\n\t// \tgameState.allCards,\r\n\t// \tgameState.cardsData,\r\n\t// \tgameState.sharedState,\r\n\t// \tgameState.spectator,\r\n\t// );\r\n\t// if (!!entitySpawns?.length) {\r\n\t// \t// Spawn to the right\r\n\t// \tconst index = entityBoard.map((e) => e.entityId).indexOf(entity.entityId) + 1;\r\n\t// \taddMinionsToBoard(entityBoard, entityBoardHero, otherHero, index, entitySpawns, gameState);\r\n\t// \tgameState.spectator.registerMinionsSpawn(entity, entityBoard, entitySpawns);\r\n\t// }\r\n\treturn bumpInto.attack;\r\n};\r\n\r\n// const getWheneverEntitySpawns = (\r\n// \tentity: BoardEntity,\r\n// \tentityBoard: BoardEntity[],\r\n// \tentityBoardHero: BgsPlayerEntity,\r\n// \totherBoard: BoardEntity[],\r\n// \totherHero: BgsPlayerEntity,\r\n// \tallCards: AllCardsService,\r\n// \tcardsData: CardsData,\r\n// \tsharedState: SharedState,\r\n// \tspectator: Spectator,\r\n// ): readonly BoardEntity[] => {\r\n// \tif (entityBoard.length === 7) {\r\n// \t\treturn null;\r\n// \t}\r\n\r\n// \tif (entity.cardId === CardIds.ImpGangBoss_BRM_006) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.ImpGangBoss_ImpToken_BRM_006t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.ImpGangBoss_TB_BaconUps_030) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.ImpGangBoss_ImpToken_TB_BaconUps_030t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.ImpMama_BGS_044) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tcardsData.impMamaSpawns[Math.floor(Math.random() * cardsData.impMamaSpawns.length)],\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t).map((entity) => ({ ...entity, taunt: true }));\r\n// \t} else if (entity.cardId === CardIds.ImpMama_TB_BaconUps_116) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tcardsData.impMamaSpawns[Math.floor(Math.random() * cardsData.impMamaSpawns.length)],\r\n// \t\t\t2,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t).map((entity) => ({ ...entity, taunt: true }));\r\n// \t} else if (entity.cardId === CardIds.SecurityRover_BOT_218) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.SecurityRover_GuardBotToken_BOT_218t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t} else if (entity.cardId === CardIds.SecurityRover_TB_BaconUps_041) {\r\n// \t\treturn spawnEntities(\r\n// \t\t\tCardIds.SecurityRover_GuardBotToken_TB_BaconUps_041t,\r\n// \t\t\t1,\r\n// \t\t\tentityBoard,\r\n// \t\t\tentityBoardHero,\r\n// \t\t\totherBoard,\r\n// \t\t\totherHero,\r\n// \t\t\tallCards,\r\n// \t\t\tcardsData,\r\n// \t\t\tsharedState,\r\n// \t\t\tspectator,\r\n// \t\t\tentity.friendly,\r\n// \t\t\ttrue,\r\n// \t\t);\r\n// \t}\r\n// \treturn null;\r\n// };\r\n\r\nexport const processMinionDeath = (\r\n\tboard1: BoardEntity[],\r\n\tboard1Hero: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tboard2Hero: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n\t// When we're in an \"attack immediately\" phase, we wait until we're out of the phase to summon minions\r\n\tskipSummonWhenSpace = false,\r\n): void => {\r\n\t// const debug = board1.some((e) => e.health <= 0) || board2.some((e) => e.health <= 0);\r\n\t// debug && console.debug('\\nprocessing minions death');\r\n\t// debug && console.debug(stringifySimple(board1, gameState.allCards));\r\n\t// debug && console.debug(stringifySimple(board2, gameState.allCards));\r\n\tconst [deadMinionIndexesFromLeft1, deadMinionIndexesFromRights1, deadEntities1] = makeMinionsDie(\r\n\t\tboard1,\r\n\t\tboard1Hero,\r\n\t\tboard2,\r\n\t\tboard2Hero,\r\n\t\tgameState,\r\n\t);\r\n\tconst [deadMinionIndexesFromLeft2, deadMinionIndexesFromRights2, deadEntities2] = makeMinionsDie(\r\n\t\tboard2,\r\n\t\tboard2Hero,\r\n\t\tboard1,\r\n\t\tboard1Hero,\r\n\t\tgameState,\r\n\t);\r\n\t// debug && console.debug('after processing minions death');\r\n\t// debug && console.debug(stringifySimple(board1, gameState.allCards));\r\n\t// debug && console.debug(stringifySimple(board2, gameState.allCards));\r\n\t// debug && console.debug(deadMinionIndexesFromRights1);\r\n\t// debug && console.debug(deadMinionIndexesFromRights2);\r\n\t// console.debug('dead entities', stringifySimple(deadEntities1, allCards), stringifySimple(deadEntities2, allCards));\r\n\t// No death to process, we can return\r\n\tif (deadEntities1.length === 0 && deadEntities2.length === 0) {\r\n\t\treturn;\r\n\t\t// return [board1, board2];\r\n\t}\r\n\r\n\t// Remember them right away, so that subsequent deaths do not break the order\r\n\t// TODO: move this to the deathrattle-orchestration?\r\n\t// If the fish dies (from Scallywag for instance), it doesn't remember the deathrattle\r\n\t// console.debug(\r\n\t// \t'\\n\\ndeadEntities',\r\n\t// \tstringifySimple(deadEntities1, gameState.allCards),\r\n\t// \tstringifySimple(deadEntities2, gameState.allCards),\r\n\t// );\r\n\r\n\tgameState.spectator.registerDeadEntities(\r\n\t\tdeadMinionIndexesFromRights1,\r\n\t\tdeadEntities1,\r\n\t\tboard1,\r\n\t\tdeadMinionIndexesFromRights2,\r\n\t\tdeadEntities2,\r\n\t\tboard2,\r\n\t);\r\n\tgameState.sharedState.deaths.push(\r\n\t\t...deadEntities1.map((e, index) =>\r\n\t\t\taddImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\t...e,\r\n\t\t\t\t\thealth: e.maxHealth,\r\n\t\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\t\tindexFromLeftAtTimeOfDeath: deadMinionIndexesFromLeft1[index],\r\n\t\t\t\t},\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t),\r\n\t\t),\r\n\t);\r\n\tgameState.sharedState.deaths.push(\r\n\t\t...deadEntities2.map((e, index) =>\r\n\t\t\taddImpliedMechanics(\r\n\t\t\t\t{\r\n\t\t\t\t\t...e,\r\n\t\t\t\t\thealth: e.maxHealth,\r\n\t\t\t\t\tdefinitelyDead: false,\r\n\t\t\t\t\tindexFromLeftAtTimeOfDeath: deadMinionIndexesFromLeft2[index],\r\n\t\t\t\t},\r\n\t\t\t\tgameState.cardsData,\r\n\t\t\t),\r\n\t\t),\r\n\t);\r\n\r\n\tfor (const deadEntity of deadEntities1) {\r\n\t\tconst onDeathImpl = cardMappings[deadEntity.cardId];\r\n\t\tif (hasOnDeath(onDeathImpl)) {\r\n\t\t\tonDeathImpl.onDeath(deadEntity, {\r\n\t\t\t\thero: board1Hero,\r\n\t\t\t\tboard: board1,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const deadEntity of deadEntities2) {\r\n\t\tconst onDeathImpl = cardMappings[deadEntity.cardId];\r\n\t\tif (hasOnDeath(onDeathImpl)) {\r\n\t\t\tonDeathImpl.onDeath(deadEntity, {\r\n\t\t\t\thero: board2Hero,\r\n\t\t\t\tboard: board2,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tboard1Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard1Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities1.filter(\r\n\t\t\t(e) => e.cardId === CardIds.EternalKnight_BG25_008 || e.cardId === CardIds.EternalKnight_BG25_008_G,\r\n\t\t).length;\r\n\tboard2Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard2Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities2.filter(\r\n\t\t\t(e) => e.cardId === CardIds.EternalKnight_BG25_008 || e.cardId === CardIds.EternalKnight_BG25_008_G,\r\n\t\t).length;\r\n\r\n\torchestrateMinionDeathEffects({\r\n\t\tgameState: gameState,\r\n\t\tplayerDeadEntities: board1Hero.friendly ? deadEntities1 : deadEntities2,\r\n\t\tplayerDeadEntityIndexesFromRight: board1Hero.friendly\r\n\t\t\t? deadMinionIndexesFromRights1\r\n\t\t\t: deadMinionIndexesFromRights2,\r\n\t\topponentDeadEntities: board1Hero.friendly ? deadEntities2 : deadEntities1,\r\n\t\topponentDeadEntityIndexesFromRight: board1Hero.friendly\r\n\t\t\t? deadMinionIndexesFromRights2\r\n\t\t\t: deadMinionIndexesFromRights1,\r\n\t});\r\n\r\n\t// Make sure we only return when there are no more deaths to process\r\n\t// Make sure to do this right before the end of the process\r\n\t// FIXME: this will propagate the killer between rounds, which is incorrect. For instance,\r\n\t// if a dragon kills a Ghoul, then the Ghoul's deathrattle kills a Kaboom, the killer should\r\n\t// now be the ghoul. Then if the Kaboom kills someone, the killer should again change. You could\r\n\t// also have multiple killers, which is not taken into account here.\r\n\t// The current assumption is that it's a suffienctly fringe case to not matter too much\r\n\tprocessMinionDeath(board1, board1Hero, board2, board2Hero, gameState);\r\n\r\n\t// Not sure about the timing here, but I have bothered Mitchell quite a lot already recently :)\r\n\tif (!skipSummonWhenSpace) {\r\n\t\thandleSummonsWhenSpace(board1, board1Hero, board2, board2Hero, gameState);\r\n\t}\r\n\r\n\t// Apply \"after minion death\" effects\r\n\thandleAfterMinionsDeaths(board1, deadEntities1, board1Hero, board2, deadEntities2, board2Hero, gameState);\r\n\r\n\t// Only when all deathrattles have resolved\r\n\t// 2025-12-20: https://replays.firestoneapp.com/?reviewId=7d8f9af4-b484-4256-976b-ff9df8847b50&turn=5&action=0\r\n\t// Confirmed by dev that the fish doesn't get the deathrattle in this case\r\n\tboard1\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) =>\r\n\t\t\trememberDeathrattles(entity, deadEntities1, gameState.cardsData, gameState.allCards, gameState.sharedState),\r\n\t\t);\r\n\tboard2\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) =>\r\n\t\t\trememberDeathrattles(entity, deadEntities2, gameState.cardsData, gameState.allCards, gameState.sharedState),\r\n\t\t);\r\n};\r\n\r\nconst handleAfterMinionsDeaths = (\r\n\tboard1: BoardEntity[],\r\n\tdeadEntities1: BoardEntity[],\r\n\theroEntity1: BgsPlayerEntity,\r\n\tboard2: BoardEntity[],\r\n\tdeadEntities2: BoardEntity[],\r\n\theroEntity2: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst random = Math.random() > 0.5;\r\n\thandleAfterMinionsDeathsForBoard(\r\n\t\trandom ? board1 : board2,\r\n\t\trandom ? deadEntities1 : deadEntities2,\r\n\t\trandom ? heroEntity1 : heroEntity2,\r\n\t\trandom ? board2 : board1,\r\n\t\trandom ? deadEntities2 : deadEntities1,\r\n\t\trandom ? heroEntity2 : heroEntity1,\r\n\t\tgameState,\r\n\t);\r\n\thandleAfterMinionsDeathsForBoard(\r\n\t\t!random ? board1 : board2,\r\n\t\t!random ? deadEntities1 : deadEntities2,\r\n\t\t!random ? heroEntity1 : heroEntity2,\r\n\t\t!random ? board2 : board1,\r\n\t\t!random ? deadEntities2 : deadEntities1,\r\n\t\t!random ? heroEntity2 : heroEntity1,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nconst handleAfterMinionsDeathsForBoard = (\r\n\tfriendlyBoard: BoardEntity[],\r\n\tfriendlyDeadEntities: BoardEntity[],\r\n\tfriendlyHeroEntity: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherDeadEntities: BoardEntity[],\r\n\totherHeroEntity: BgsPlayerEntity,\r\n\tgameState: FullGameState,\r\n) => {\r\n\tconst candidateEntities = [];\r\n\r\n\tfor (const trinket of friendlyHeroEntity.trinkets ?? []) {\r\n\t\tconst onAfterDeathImpl = cardMappings[trinket.cardId];\r\n\t\tif (hasOnAfterDeath(onAfterDeathImpl)) {\r\n\t\t\tonAfterDeathImpl.onAfterDeath(trinket, {\r\n\t\t\t\thero: friendlyHeroEntity,\r\n\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\totherHero: otherHeroEntity,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tdeadEntities: friendlyDeadEntities,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\tfor (const entity of friendlyBoard) {\r\n\t\tconst onAfterDeathImpl = cardMappings[entity.cardId];\r\n\t\tif (hasOnAfterDeath(onAfterDeathImpl)) {\r\n\t\t\tonAfterDeathImpl.onAfterDeath(entity, {\r\n\t\t\t\thero: friendlyHeroEntity,\r\n\t\t\t\tboard: friendlyBoard,\r\n\t\t\t\totherHero: otherHeroEntity,\r\n\t\t\t\totherBoard: otherBoard,\r\n\t\t\t\tdeadEntities: friendlyDeadEntities,\r\n\t\t\t\tgameState: gameState,\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tconst secretTriggered = null;\r\n\t// if (\r\n\t// \t(secretTriggered = friendlyHeroEntity.secrets?.find(\r\n\t// \t\t(secret) => !secret.triggered && secret?.cardId === CardIds.MagicBlackSoulstone,\r\n\t// \t)) != null\r\n\t// ) {\r\n\t// \tif (friendlyBoard.length === 0) {\r\n\t// \t\tsecretTriggered.triggered = true;\r\n\t// \t\tfor (let i = 0; i < 2; i++) {\r\n\t// \t\t\tconst toSummon = pickRandom(gameState.cardsData.demonSpawns);\r\n\t// \t\t\tcandidateEntities.push(\r\n\t// \t\t\t\t...spawnEntities(\r\n\t// \t\t\t\t\ttoSummon,\r\n\t// \t\t\t\t\t1,\r\n\t// \t\t\t\t\tfriendlyBoard,\r\n\t// \t\t\t\t\tfriendlyHeroEntity,\r\n\t// \t\t\t\t\totherBoard,\r\n\t// \t\t\t\t\totherHeroEntity,\r\n\t// \t\t\t\t\tgameState,\r\n\t// \t\t\t\t\tfriendlyHeroEntity.friendly,\r\n\t// \t\t\t\t\tfalse,\r\n\t// \t\t\t\t),\r\n\t// \t\t\t);\r\n\t// \t\t}\r\n\t// \t}\r\n\t// }\r\n\tperformEntitySpawns(\r\n\t\tcandidateEntities,\r\n\t\tfriendlyBoard,\r\n\t\tfriendlyHeroEntity,\r\n\t\tsecretTriggered,\r\n\t\t0,\r\n\t\totherBoard,\r\n\t\totherHeroEntity,\r\n\t\tgameState,\r\n\t);\r\n};\r\n\r\nexport interface OnDeathInput {\r\n\treadonly hero: BgsPlayerEntity;\r\n\treadonly board: BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n}\r\nexport interface OnAfterDeathInput {\r\n\treadonly hero: BgsPlayerEntity;\r\n\treadonly board: BoardEntity[];\r\n\treadonly otherHero: BgsPlayerEntity;\r\n\treadonly otherBoard: BoardEntity[];\r\n\treadonly deadEntities: BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n}\r\nexport interface OnMinionKilledInput {\r\n\treadonly killer: BoardEntity;\r\n\treadonly killerIsAttacking: boolean;\r\n\treadonly minionKilled: BoardEntity;\r\n\treadonly attackingHero: BgsPlayerEntity;\r\n\treadonly attackingBoard: BoardEntity[];\r\n\treadonly defendingHero: BgsPlayerEntity;\r\n\treadonly defendingBoard: BoardEntity[];\r\n\treadonly defenderNeighbours: readonly BoardEntity[];\r\n\treadonly gameState: FullGameState;\r\n\treadonly playerIsFriendly: boolean;\r\n}\r\n"]}
|
|
@@ -24,6 +24,7 @@ export declare class Spectator {
|
|
|
24
24
|
registerOpponentAttack(friendlyBoard: readonly BoardEntity[], opponentBoard: readonly BoardEntity[], damage: number): void;
|
|
25
25
|
registerDamageDealt(damagingEntity: BoardEntity, damagedEntity: BoardEntity, damageTaken: number, damagedEntityBoard: BoardEntity[]): void;
|
|
26
26
|
registerPowerTarget(sourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket, targetEntity: BoardEntity | BgsPlayerEntity, targetBoard: BoardEntity[], hero1: BgsPlayerEntity, hero2: BgsPlayerEntity): void;
|
|
27
|
+
registerPowerTargets(sourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket, targetEntities: (BoardEntity | BgsPlayerEntity)[], targetBoard: BoardEntity[], hero1: BgsPlayerEntity, hero2: BgsPlayerEntity): void;
|
|
27
28
|
registerMinionsSpawn(sourceEntity: BoardEntity | BgsPlayerEntity | BoardTrinket, boardOnWhichToSpawn: BoardEntity[], spawnedEntities: readonly BoardEntity[]): void;
|
|
28
29
|
registerDeadEntities(deadMinionIndexes1: number[], deadEntities1: BoardEntity[], board1: BoardEntity[], deadMinionIndexes2: number[], deadEntities2: BoardEntity[], board2: BoardEntity[]): void;
|
|
29
30
|
private addAction;
|
|
@@ -184,6 +184,28 @@ class Spectator {
|
|
|
184
184
|
});
|
|
185
185
|
this.addAction(action);
|
|
186
186
|
}
|
|
187
|
+
registerPowerTargets(sourceEntity, targetEntities, targetBoard, hero1, hero2) {
|
|
188
|
+
if (!this.enabled) {
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (!(targetEntities === null || targetEntities === void 0 ? void 0 : targetEntities.length)) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const friendlyBoard = (targetBoard === null || targetBoard === void 0 ? void 0 : targetBoard.every((entity) => entity.friendly)) ? targetBoard : null;
|
|
195
|
+
const opponentBoard = (targetBoard === null || targetBoard === void 0 ? void 0 : targetBoard.every((entity) => !entity.friendly)) ? targetBoard : null;
|
|
196
|
+
const friendlyHero = (hero1 === null || hero1 === void 0 ? void 0 : hero1.friendly) ? hero1 : (hero2 === null || hero2 === void 0 ? void 0 : hero2.friendly) ? hero2 : null;
|
|
197
|
+
const opponentHero = (hero1 === null || hero1 === void 0 ? void 0 : hero1.friendly) ? hero2 : (hero2 === null || hero2 === void 0 ? void 0 : hero2.friendly) ? hero1 : null;
|
|
198
|
+
const action = (0, game_action_1.buildGameAction)(friendlyHero, opponentHero, {
|
|
199
|
+
type: 'power-target',
|
|
200
|
+
sourceEntityId: sourceEntity.entityId,
|
|
201
|
+
targetEntityIds: targetEntities.map((entity) => entity.entityId),
|
|
202
|
+
playerBoard: this.sanitize(friendlyBoard),
|
|
203
|
+
opponentBoard: this.sanitize(opponentBoard),
|
|
204
|
+
playerHand: this.sanitize(friendlyHero === null || friendlyHero === void 0 ? void 0 : friendlyHero.hand),
|
|
205
|
+
opponentHand: this.sanitize(opponentHero === null || opponentHero === void 0 ? void 0 : opponentHero.hand),
|
|
206
|
+
});
|
|
207
|
+
this.addAction(action);
|
|
208
|
+
}
|
|
187
209
|
registerMinionsSpawn(sourceEntity, boardOnWhichToSpawn, spawnedEntities) {
|
|
188
210
|
if (!this.enabled) {
|
|
189
211
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spectator.js","sourceRoot":"","sources":["../../../src/simulation/spectator/spectator.ts"],"names":[],"mappings":"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","sourcesContent":["import { BgsGameState } from '../../bgs-battle-info';\r\nimport { BgsPlayerEntity, BoardTrinket } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { BoardSecret } from '../../board-secret';\r\nimport { GameAction, buildGameAction } from './game-action';\r\nimport { GameSample } from './game-sample';\r\n\r\nconst MAX_SAMPLES = 1;\r\n\r\nexport class Spectator {\r\n\tprivate actionsForCurrentBattle: GameAction[];\r\n\tprivate wonBattles: GameSample[];\r\n\tprivate tiedBattles: GameSample[];\r\n\tprivate lostBattles: GameSample[];\r\n\r\n\tconstructor(private readonly enabled: boolean) {\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\t\tthis.wonBattles = [];\r\n\t\tthis.tiedBattles = [];\r\n\t\tthis.lostBattles = [];\r\n\t}\r\n\r\n\tpublic prune(): void {\r\n\t\tthis.wonBattles = this.wonBattles.slice(0, MAX_SAMPLES);\r\n\t\tthis.lostBattles = this.lostBattles.slice(0, MAX_SAMPLES);\r\n\t\tthis.tiedBattles = this.tiedBattles.slice(0, MAX_SAMPLES);\r\n\t}\r\n\r\n\tpublic buildOutcomeSamples(gameState: BgsGameState): {\r\n\t\twon: readonly GameSample[];\r\n\t\tlost: readonly GameSample[];\r\n\t\ttied: readonly GameSample[];\r\n\t} {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn {\r\n\t\t\t\twon: [],\r\n\t\t\t\tlost: [],\r\n\t\t\t\ttied: [],\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn {\r\n\t\t\twon: this.wonBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t\tlost: this.lostBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t\ttied: this.tiedBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t};\r\n\t}\r\n\r\n\tprivate cleanUpActions(battle: GameSample, gameState: BgsGameState): GameSample {\r\n\t\tconst collapsed = this.collapseActions(battle.actions);\r\n\t\tconst result: GameSample = {\r\n\t\t\t...battle,\r\n\t\t\tactions: collapsed,\r\n\t\t\tanomalies: gameState.anomalies,\r\n\t\t};\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic commitBattleResult(result: 'won' | 'lost' | 'tied'): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\tthis.actionsForCurrentBattle = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (\r\n\t\t\tthis.wonBattles.length >= MAX_SAMPLES &&\r\n\t\t\tthis.lostBattles.length >= MAX_SAMPLES &&\r\n\t\t\tthis.tiedBattles.length >= MAX_SAMPLES\r\n\t\t) {\r\n\t\t\tthis.actionsForCurrentBattle = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// const actionsForBattle = this.collapseActions(this.actionsForCurrentBattle);\r\n\t\tconst actionsForBattle = this.actionsForCurrentBattle;\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\r\n\t\tconst battle: GameSample = {\r\n\t\t\tactions: actionsForBattle,\r\n\t\t\tanomalies: [],\r\n\t\t};\r\n\t\tswitch (result) {\r\n\t\t\tcase 'won':\r\n\t\t\t\tthis.wonBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'lost':\r\n\t\t\t\tthis.lostBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'tied':\r\n\t\t\t\tthis.tiedBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic registerAttack(\r\n\t\tattackingEntity: BoardEntity,\r\n\t\tdefendingEntity: BoardEntity,\r\n\t\tattackingBoard: readonly BoardEntity[],\r\n\t\tdefendingBoard: readonly BoardEntity[],\r\n\t\tattackingBoardHero: BgsPlayerEntity,\r\n\t\tdefendingBoardHero: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.debug(\r\n\t\t// \t'\\n register attack',\r\n\t\t// \tstringifySimple(attackingBoard),\r\n\t\t// \t'\\n',\r\n\t\t// \tstringifySimple(defendingBoard),\r\n\t\t// \t'\\n',\r\n\t\t// \tattackingBoard.find((e) => e.entityId === 2441),\r\n\t\t// \t'\\n',\r\n\t\t// \tattackingBoard.find((e) => e.entityId === 2442),\r\n\t\t// );\r\n\t\tconst isAttackerFriendly = attackingBoard.every((entity) => entity.friendly);\r\n\t\tconst playerHero = isAttackerFriendly ? attackingBoardHero : defendingBoardHero;\r\n\t\tconst opponentHero = isAttackerFriendly ? defendingBoardHero : attackingBoardHero;\r\n\t\tconst friendlyBoard = isAttackerFriendly ? attackingBoard : defendingBoard;\r\n\t\tconst opponentBoard = isAttackerFriendly ? defendingBoard : attackingBoard;\r\n\t\tconst action: GameAction = buildGameAction(playerHero, opponentHero, {\r\n\t\t\ttype: 'attack',\r\n\t\t\tsourceEntityId: attackingEntity.entityId,\r\n\t\t\ttargetEntityId: defendingEntity.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\tplayerHand: this.sanitize(playerHero.hand),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\topponentHand: this.sanitize(opponentHero.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerStartOfCombat(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tfriendlyHero: BgsPlayerEntity,\r\n\t\topponentHero: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'start-of-combat',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPlayerAttack(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tdamage: number,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'player-attack',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerOpponentAttack(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tdamage: number,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'opponent-attack',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerDamageDealt(\r\n\t\tdamagingEntity: BoardEntity,\r\n\t\tdamagedEntity: BoardEntity,\r\n\t\tdamageTaken: number,\r\n\t\tdamagedEntityBoard: BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!damagingEntity.entityId) {\r\n\t\t\t// console.error('missing damaging entity id', damagingEntity.cardId);\r\n\t\t}\r\n\t\tconst friendlyBoard = damagedEntityBoard.every((entity) => entity.friendly) ? damagedEntityBoard : null;\r\n\t\tconst opponentBoard = damagedEntityBoard.every((entity) => !entity.friendly) ? damagedEntityBoard : null;\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'damage',\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tsourceEntityId: damagingEntity.entityId,\r\n\t\t\t\t\ttargetEntityId: damagedEntity.entityId,\r\n\t\t\t\t\tdamage: damageTaken,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPowerTarget(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket,\r\n\t\ttargetEntity: BoardEntity | BgsPlayerEntity,\r\n\t\ttargetBoard: BoardEntity[],\r\n\t\thero1: BgsPlayerEntity,\r\n\t\thero2: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!targetEntity) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.log('registerPowerTarget', stringifySimpleCard(sourceEntity), stringifySimpleCard(targetEntity), new Error().stack);\r\n\t\tconst friendlyBoard = targetBoard?.every((entity) => entity.friendly) ? targetBoard : null;\r\n\t\tconst opponentBoard = targetBoard?.every((entity) => !entity.friendly) ? targetBoard : null;\r\n\t\tconst friendlyHero = hero1?.friendly ? hero1 : hero2?.friendly ? hero2 : null;\r\n\t\tconst opponentHero = hero1?.friendly ? hero2 : hero2?.friendly ? hero1 : null;\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'power-target',\r\n\t\t\tsourceEntityId: sourceEntity.entityId,\r\n\t\t\ttargetEntityId: targetEntity.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero?.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero?.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerMinionsSpawn(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardTrinket,\r\n\t\tboardOnWhichToSpawn: BoardEntity[],\r\n\t\tspawnedEntities: readonly BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!spawnedEntities || spawnedEntities.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!sourceEntity?.entityId) {\r\n\t\t\t// console.error('missing spawn source entity id', sourceEntity);\r\n\t\t}\r\n\t\tconst friendlyBoard = boardOnWhichToSpawn.every((entity) => entity.friendly) ? boardOnWhichToSpawn : null;\r\n\t\tconst opponentBoard = boardOnWhichToSpawn.every((entity) => !entity.friendly) ? boardOnWhichToSpawn : null;\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'spawn',\r\n\t\t\tspawns: this.sanitize(spawnedEntities),\r\n\t\t\tsourceEntityId: sourceEntity?.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerDeadEntities(\r\n\t\tdeadMinionIndexes1: number[],\r\n\t\tdeadEntities1: BoardEntity[],\r\n\t\tboard1: BoardEntity[],\r\n\t\tdeadMinionIndexes2: number[],\r\n\t\tdeadEntities2: BoardEntity[],\r\n\t\tboard2: BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst deaths = [...(deadEntities1 || []), ...(deadEntities2 || [])];\r\n\t\tif (!deaths || deaths.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'minion-death',\r\n\t\t\tdeaths: this.sanitize(deaths),\r\n\t\t\tdeadMinionsPositionsOnBoard: [\r\n\t\t\t\t...(deadMinionIndexes1 || []).map((i) => board1.length - i),\r\n\t\t\t\t...(deadMinionIndexes2 || []).map((i) => board2.length - i),\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tprivate addAction(action: GameAction) {\r\n\t\tthis.actionsForCurrentBattle.push(action);\r\n\t}\r\n\r\n\tprivate collapseActions(actions: readonly GameAction[]): readonly GameAction[] {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tif (!actions || actions.length === 0) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tconst result: GameAction[] = [];\r\n\t\tfor (let i = 0; i < actions.length; i++) {\r\n\t\t\tconst action: GameAction = {\r\n\t\t\t\t...actions[i],\r\n\t\t\t\tplayerBoard: this.sanitize(actions[i].playerBoard),\r\n\t\t\t\topponentBoard: this.sanitize(actions[i].opponentBoard),\r\n\t\t\t\tplayerHand: this.sanitize(actions[i].playerHand),\r\n\t\t\t\topponentHand: this.sanitize(actions[i].opponentHand),\r\n\t\t\t\t// spawns: this.sanitize(actions[i].spawns),\r\n\t\t\t\tdeaths: this.sanitize(actions[i].deaths),\r\n\t\t\t\tplayerTrinkets: this.sanitizeTrinkets(actions[i].playerTrinkets),\r\n\t\t\t\topponentTrinkets: this.sanitizeTrinkets(actions[i].opponentTrinkets),\r\n\t\t\t};\r\n\t\t\t// action.playerBoard && console.debug('\\naction playerboard', stringifySimple(action.playerBoard));\r\n\t\t\tconst lastAction = result.length > 0 ? result[result.length - 1] : null;\r\n\r\n\t\t\tif (lastAction) {\r\n\t\t\t\taction.playerBoard = action.playerBoard ?? lastAction.playerBoard;\r\n\t\t\t\taction.opponentBoard = action.opponentBoard ?? lastAction.opponentBoard;\r\n\t\t\t\taction.playerHand = action.playerHand ?? lastAction.playerHand;\r\n\t\t\t\taction.opponentHand = action.opponentHand ?? lastAction.opponentHand;\r\n\t\t\t\taction.playerSecrets = action.playerSecrets ?? lastAction.playerSecrets;\r\n\t\t\t\taction.opponentSecrets = action.opponentSecrets ?? lastAction.opponentSecrets;\r\n\t\t\t\taction.playerRewardCardId = action.playerRewardCardId ?? lastAction.playerRewardCardId;\r\n\t\t\t\taction.playerRewardEntityId = action.playerRewardEntityId ?? lastAction.playerRewardEntityId;\r\n\t\t\t\taction.playerRewardData = action.playerRewardData ?? lastAction.playerRewardData;\r\n\t\t\t\taction.opponentRewardCardId = action.opponentRewardCardId ?? lastAction.opponentRewardCardId;\r\n\t\t\t\taction.opponentRewardEntityId = action.opponentRewardEntityId ?? lastAction.opponentRewardEntityId;\r\n\t\t\t\taction.opponentRewardData = action.opponentRewardData ?? lastAction.opponentRewardData;\r\n\t\t\t\taction.playerCardId = action.playerCardId ?? lastAction.playerCardId;\r\n\t\t\t\taction.playerEntityId = action.playerEntityId ?? lastAction.playerEntityId;\r\n\t\t\t\taction.playerHeroPowerCardId = action.playerHeroPowerCardId ?? lastAction.playerHeroPowerCardId;\r\n\t\t\t\taction.playerHeroPowerEntityId = action.playerHeroPowerEntityId ?? lastAction.playerHeroPowerEntityId;\r\n\t\t\t\taction.playerHeroPowerUsed = action.playerHeroPowerUsed ?? lastAction.playerHeroPowerUsed;\r\n\t\t\t\taction.opponentCardId = action.opponentCardId ?? lastAction.opponentCardId;\r\n\t\t\t\taction.opponentEntityId = action.opponentEntityId ?? lastAction.opponentEntityId;\r\n\t\t\t\taction.opponentHeroPowerCardId = action.opponentHeroPowerCardId ?? lastAction.opponentHeroPowerCardId;\r\n\t\t\t\taction.opponentHeroPowerEntityId =\r\n\t\t\t\t\taction.opponentHeroPowerEntityId ?? lastAction.opponentHeroPowerEntityId;\r\n\t\t\t\taction.opponentHeroPowerUsed = action.opponentHeroPowerUsed ?? lastAction.opponentHeroPowerUsed;\r\n\t\t\t\taction.playerTrinkets = action.playerTrinkets ?? lastAction.playerTrinkets;\r\n\t\t\t\taction.opponentTrinkets = action.opponentTrinkets ?? lastAction.opponentTrinkets;\r\n\t\t\t}\r\n\r\n\t\t\tif (lastAction && action.type === 'damage' && lastAction.type === 'attack') {\r\n\t\t\t\tlastAction.damages = lastAction.damages || [];\r\n\t\t\t\tlastAction.damages.push({\r\n\t\t\t\t\tdamage: action.damages[0].damage,\r\n\t\t\t\t\tsourceEntityId: action.damages[0].sourceEntityId,\r\n\t\t\t\t\ttargetEntityId: action.damages[0].targetEntityId,\r\n\t\t\t\t});\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else if (lastAction && action.type === 'damage' && lastAction.type === 'damage') {\r\n\t\t\t\tlastAction.damages = lastAction.damages || [];\r\n\t\t\t\tlastAction.damages.push({\r\n\t\t\t\t\tdamage: action.damages[0].damage,\r\n\t\t\t\t\tsourceEntityId: action.damages[0].sourceEntityId,\r\n\t\t\t\t\ttargetEntityId: action.damages[0].targetEntityId,\r\n\t\t\t\t});\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else if (\r\n\t\t\t\tlastAction &&\r\n\t\t\t\taction.type === 'power-target' &&\r\n\t\t\t\tlastAction.type === 'power-target' &&\r\n\t\t\t\taction.sourceEntityId === lastAction.sourceEntityId\r\n\t\t\t) {\r\n\t\t\t\tlastAction.targetEntityIds =\r\n\t\t\t\t\tlastAction.targetEntityIds ?? (lastAction.targetEntityId ? [lastAction.targetEntityId] : []);\r\n\t\t\t\taction.targetEntityIds =\r\n\t\t\t\t\taction.targetEntityIds ?? (action.targetEntityId ? [action.targetEntityId] : []);\r\n\t\t\t\tlastAction.targetEntityIds.push(...action.targetEntityIds);\r\n\t\t\t\t// So that when multiple Leapfroggers enchantments target the same minion,\r\n\t\t\t\t// we can count them in the replay viewer's text\r\n\t\t\t\t// lastAction.targetEntityIds = [...new Set(lastAction.targetEntityIds)];\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// Calling sanitize every time before we add an action to the list is mandatory, since\r\n\t// the entities and boards are mutable\r\n\tprivate sanitize(board: readonly BoardEntity[]): readonly BoardEntity[] {\r\n\t\tif (!board) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\treturn board.map(\r\n\t\t\t(entity) =>\r\n\t\t\t\t({\r\n\t\t\t\t\tentityId: entity.entityId,\r\n\t\t\t\t\tcardId: entity.cardId,\r\n\t\t\t\t\tfriendly: entity.friendly,\r\n\t\t\t\t\tattack: entity.attack,\r\n\t\t\t\t\thealth: entity.health,\r\n\t\t\t\t\tmaxHealth: entity.maxHealth,\r\n\t\t\t\t\ttaunt: entity.taunt,\r\n\t\t\t\t\tdivineShield: entity.divineShield,\r\n\t\t\t\t\tpoisonous: entity.poisonous,\r\n\t\t\t\t\tvenomous: entity.venomous,\r\n\t\t\t\t\treborn: entity.reborn,\r\n\t\t\t\t\twindfury: entity.windfury,\r\n\t\t\t\t\tstealth: entity.stealth,\r\n\t\t\t\t} as BoardEntity),\r\n\t\t);\r\n\t}\r\n\r\n\tprivate sanitizeTrinkets(trinkets: readonly BoardTrinket[]): readonly BoardTrinket[] {\r\n\t\tif (!trinkets?.length) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst result = trinkets.map(\r\n\t\t\t(t) =>\r\n\t\t\t\t({\r\n\t\t\t\t\tcardId: t.cardId,\r\n\t\t\t\t\tentityId: t.entityId,\r\n\t\t\t\t\tscriptDataNum1: t.scriptDataNum1,\r\n\t\t\t\t\tscriptDataNum6: t.scriptDataNum6,\r\n\t\t\t\t} as BoardTrinket),\r\n\t\t);\r\n\t\treturn result;\r\n\t}\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"spectator.js","sourceRoot":"","sources":["../../../src/simulation/spectator/spectator.ts"],"names":[],"mappings":";;;AAIA,+CAA4D;AAG5D,MAAM,WAAW,GAAG,CAAC,CAAC;AAEtB,MAAa,SAAS;IAMrB,YAA6B,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;QAC5C,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;IACvB,CAAC;IAEM,KAAK;QACX,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QACxD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;QAC1D,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;IAC3D,CAAC;IAEM,mBAAmB,CAAC,SAAuB;;QAKjD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;gBACN,GAAG,EAAE,EAAE;gBACP,IAAI,EAAE,EAAE;gBACR,IAAI,EAAE,EAAE;aACR,CAAC;SACF;QACD,OAAO;YACN,GAAG,EAAE,MAAA,IAAI,CAAC,UAAU,0CAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC7E,IAAI,EAAE,MAAA,IAAI,CAAC,WAAW,0CAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;YAC/E,IAAI,EAAE,MAAA,IAAI,CAAC,WAAW,0CAAE,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;SAC/E,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,MAAkB,EAAE,SAAuB;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,MAAM,GAAe;YAC1B,GAAG,MAAM;YACT,OAAO,EAAE,SAAS;YAClB,SAAS,EAAE,SAAS,CAAC,SAAS;SAC9B,CAAC;QACF,OAAO,MAAM,CAAC;IACf,CAAC;IAEM,kBAAkB,CAAC,MAA+B;QACxD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;YAClC,OAAO;SACP;QACD,IACC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,WAAW;YACrC,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,WAAW;YACtC,IAAI,CAAC,WAAW,CAAC,MAAM,IAAI,WAAW,EACrC;YACD,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;YAClC,OAAO;SACP;QAED,MAAM,gBAAgB,GAAG,IAAI,CAAC,uBAAuB,CAAC;QACtD,IAAI,CAAC,uBAAuB,GAAG,EAAE,CAAC;QAElC,MAAM,MAAM,GAAe;YAC1B,OAAO,EAAE,gBAAgB;YACzB,SAAS,EAAE,EAAE;SACb,CAAC;QACF,QAAQ,MAAM,EAAE;YACf,KAAK,KAAK;gBACT,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC7B,MAAM;YACP,KAAK,MAAM;gBACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9B,MAAM;YACP,KAAK,MAAM;gBACV,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAC9B,MAAM;SACP;IACF,CAAC;IAEM,cAAc,CACpB,eAA4B,EAC5B,eAA4B,EAC5B,cAAsC,EACtC,cAAsC,EACtC,kBAAmC,EACnC,kBAAmC;QAEnC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QAWD,MAAM,kBAAkB,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7E,MAAM,UAAU,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAChF,MAAM,YAAY,GAAG,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAClF,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;QAC3E,MAAM,aAAa,GAAG,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC;QAC3E,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,UAAU,EAAE,YAAY,EAAE;YACpE,IAAI,EAAE,QAAQ;YACd,cAAc,EAAE,eAAe,CAAC,QAAQ;YACxC,cAAc,EAAE,eAAe,CAAC,QAAQ;YACxC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC;YAC1C,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEM,qBAAqB,CAC3B,aAAqC,EACrC,aAAqC,EACrC,YAA6B,EAC7B,YAA6B;QAE7B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QACD,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,YAAY,EAAE,YAAY,EAAE;YACtE,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC;YAC5C,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC;SAC9C,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEM,oBAAoB,CAC1B,aAAqC,EACrC,aAAqC,EACrC,MAAc;QAEd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QACD,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,IAAI,EAAE,IAAI,EAAE;YACtD,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE;gBACR;oBACC,MAAM,EAAE,MAAM;iBACd;aACD;SACD,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEM,sBAAsB,CAC5B,aAAqC,EACrC,aAAqC,EACrC,MAAc;QAEd,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QACD,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,IAAI,EAAE,IAAI,EAAE;YACtD,IAAI,EAAE,iBAAiB;YACvB,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;YAClB,OAAO,EAAE;gBACR;oBACC,MAAM,EAAE,MAAM;iBACd;aACD;SACD,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEM,mBAAmB,CACzB,cAA2B,EAC3B,aAA0B,EAC1B,WAAmB,EACnB,kBAAiC;QAEjC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QACD,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;SAE7B;QACD,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;QACxG,MAAM,aAAa,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC;QACzG,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,IAAI,EAAE,IAAI,EAAE;YACtD,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACR;oBACC,cAAc,EAAE,cAAc,CAAC,QAAQ;oBACvC,cAAc,EAAE,aAAa,CAAC,QAAQ;oBACtC,MAAM,EAAE,WAAW;iBACnB;aACD;YACD,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEM,mBAAmB,CACzB,YAAwE,EACxE,YAA2C,EAC3C,WAA0B,EAC1B,KAAsB,EACtB,KAAsB;QAEtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QACD,IAAI,CAAC,YAAY,EAAE;YAClB,OAAO;SACP;QAED,MAAM,aAAa,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3F,MAAM,aAAa,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5F,MAAM,YAAY,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,YAAY,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,YAAY,EAAE,YAAY,EAAE;YACtE,IAAI,EAAE,cAAc;YACpB,cAAc,EAAE,YAAY,CAAC,QAAQ;YACrC,cAAc,EAAE,YAAY,CAAC,QAAQ;YACrC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,CAAC;YAC7C,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,CAAC;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEM,oBAAoB,CAC1B,YAAwE,EACxE,cAAiD,EACjD,WAA0B,EAC1B,KAAsB,EACtB,KAAsB;QAEtB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QACD,IAAI,CAAC,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,CAAA,EAAE;YAC5B,OAAO;SACP;QAED,MAAM,aAAa,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3F,MAAM,aAAa,GAAG,CAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;QAC5F,MAAM,YAAY,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,YAAY,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,QAAQ,EAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9E,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,YAAY,EAAE,YAAY,EAAE;YACtE,IAAI,EAAE,cAAc;YACpB,cAAc,EAAE,YAAY,CAAC,QAAQ;YACrC,eAAe,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;YAChE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,CAAC;YAC7C,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,IAAI,CAAC;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEM,oBAAoB,CAC1B,YAA0D,EAC1D,mBAAkC,EAClC,eAAuC;QAEvC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QACD,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;YACrD,OAAO;SACP;QAED,IAAI,CAAC,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,QAAQ,CAAA,EAAE;SAE5B;QACD,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1G,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC;QAC3G,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,IAAI,EAAE,IAAI,EAAE;YACtD,IAAI,EAAE,OAAO;YACb,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;YACtC,cAAc,EAAE,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,QAAQ;YACtC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YACzC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC;YAC3C,UAAU,EAAE,IAAI;YAChB,YAAY,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEM,oBAAoB,CAC1B,kBAA4B,EAC5B,aAA4B,EAC5B,MAAqB,EACrB,kBAA4B,EAC5B,aAA4B,EAC5B,MAAqB;QAErB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO;SACP;QACD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACnC,OAAO;SACP;QACD,MAAM,MAAM,GAAe,IAAA,6BAAe,EAAC,IAAI,EAAE,IAAI,EAAE;YACtD,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC7B,2BAA2B,EAAE;gBAC5B,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC3D,GAAG,CAAC,kBAAkB,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3D;SACD,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAEO,SAAS,CAAC,MAAkB;QACnC,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAEO,eAAe,CAAC,OAA8B;;QACrD,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAClB,OAAO,EAAE,CAAC;SACV;QACD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACrC,OAAO,EAAE,CAAC;SACV;QACD,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACxC,MAAM,MAAM,GAAe;gBAC1B,GAAG,OAAO,CAAC,CAAC,CAAC;gBACb,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;gBAClD,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBACtD,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;gBAChD,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC;gBAEpD,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACxC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;gBAChE,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;aACpE,CAAC;YAEF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAExE,IAAI,UAAU,EAAE;gBACf,MAAM,CAAC,WAAW,GAAG,MAAA,MAAM,CAAC,WAAW,mCAAI,UAAU,CAAC,WAAW,CAAC;gBAClE,MAAM,CAAC,aAAa,GAAG,MAAA,MAAM,CAAC,aAAa,mCAAI,UAAU,CAAC,aAAa,CAAC;gBACxE,MAAM,CAAC,UAAU,GAAG,MAAA,MAAM,CAAC,UAAU,mCAAI,UAAU,CAAC,UAAU,CAAC;gBAC/D,MAAM,CAAC,YAAY,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,UAAU,CAAC,YAAY,CAAC;gBACrE,MAAM,CAAC,aAAa,GAAG,MAAA,MAAM,CAAC,aAAa,mCAAI,UAAU,CAAC,aAAa,CAAC;gBACxE,MAAM,CAAC,eAAe,GAAG,MAAA,MAAM,CAAC,eAAe,mCAAI,UAAU,CAAC,eAAe,CAAC;gBAC9E,MAAM,CAAC,kBAAkB,GAAG,MAAA,MAAM,CAAC,kBAAkB,mCAAI,UAAU,CAAC,kBAAkB,CAAC;gBACvF,MAAM,CAAC,oBAAoB,GAAG,MAAA,MAAM,CAAC,oBAAoB,mCAAI,UAAU,CAAC,oBAAoB,CAAC;gBAC7F,MAAM,CAAC,gBAAgB,GAAG,MAAA,MAAM,CAAC,gBAAgB,mCAAI,UAAU,CAAC,gBAAgB,CAAC;gBACjF,MAAM,CAAC,oBAAoB,GAAG,MAAA,MAAM,CAAC,oBAAoB,mCAAI,UAAU,CAAC,oBAAoB,CAAC;gBAC7F,MAAM,CAAC,sBAAsB,GAAG,MAAA,MAAM,CAAC,sBAAsB,mCAAI,UAAU,CAAC,sBAAsB,CAAC;gBACnG,MAAM,CAAC,kBAAkB,GAAG,MAAA,MAAM,CAAC,kBAAkB,mCAAI,UAAU,CAAC,kBAAkB,CAAC;gBACvF,MAAM,CAAC,YAAY,GAAG,MAAA,MAAM,CAAC,YAAY,mCAAI,UAAU,CAAC,YAAY,CAAC;gBACrE,MAAM,CAAC,cAAc,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,UAAU,CAAC,cAAc,CAAC;gBAC3E,MAAM,CAAC,qBAAqB,GAAG,MAAA,MAAM,CAAC,qBAAqB,mCAAI,UAAU,CAAC,qBAAqB,CAAC;gBAChG,MAAM,CAAC,uBAAuB,GAAG,MAAA,MAAM,CAAC,uBAAuB,mCAAI,UAAU,CAAC,uBAAuB,CAAC;gBACtG,MAAM,CAAC,mBAAmB,GAAG,MAAA,MAAM,CAAC,mBAAmB,mCAAI,UAAU,CAAC,mBAAmB,CAAC;gBAC1F,MAAM,CAAC,cAAc,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,UAAU,CAAC,cAAc,CAAC;gBAC3E,MAAM,CAAC,gBAAgB,GAAG,MAAA,MAAM,CAAC,gBAAgB,mCAAI,UAAU,CAAC,gBAAgB,CAAC;gBACjF,MAAM,CAAC,uBAAuB,GAAG,MAAA,MAAM,CAAC,uBAAuB,mCAAI,UAAU,CAAC,uBAAuB,CAAC;gBACtG,MAAM,CAAC,yBAAyB;oBAC/B,MAAA,MAAM,CAAC,yBAAyB,mCAAI,UAAU,CAAC,yBAAyB,CAAC;gBAC1E,MAAM,CAAC,qBAAqB,GAAG,MAAA,MAAM,CAAC,qBAAqB,mCAAI,UAAU,CAAC,qBAAqB,CAAC;gBAChG,MAAM,CAAC,cAAc,GAAG,MAAA,MAAM,CAAC,cAAc,mCAAI,UAAU,CAAC,cAAc,CAAC;gBAC3E,MAAM,CAAC,gBAAgB,GAAG,MAAA,MAAM,CAAC,gBAAgB,mCAAI,UAAU,CAAC,gBAAgB,CAAC;aACjF;YAED,IAAI,UAAU,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAC3E,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC9C,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;oBACvB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;oBAChC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc;oBAChD,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc;iBAChD,CAAC,CAAC;gBACH,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;gBAC5C,UAAU,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;gBAChD,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;gBAC1C,UAAU,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;gBAC9C,UAAU,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;gBAChD,UAAU,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBACpD,UAAU,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;gBAClD,UAAU,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;aACtD;iBAAM,IAAI,UAAU,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE;gBAClF,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC;gBAC9C,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;oBACvB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM;oBAChC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc;oBAChD,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc;iBAChD,CAAC,CAAC;gBACH,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;gBAC5C,UAAU,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;gBAChD,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;gBAC1C,UAAU,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;gBAC9C,UAAU,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;gBAChD,UAAU,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBACpD,UAAU,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;gBAClD,UAAU,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;aACtD;iBAAM,IACN,UAAU;gBACV,MAAM,CAAC,IAAI,KAAK,cAAc;gBAC9B,UAAU,CAAC,IAAI,KAAK,cAAc;gBAClC,MAAM,CAAC,cAAc,KAAK,UAAU,CAAC,cAAc,EAClD;gBACD,UAAU,CAAC,eAAe;oBACzB,MAAA,UAAU,CAAC,eAAe,mCAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC9F,MAAM,CAAC,eAAe;oBACrB,MAAA,MAAM,CAAC,eAAe,mCAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAClF,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;gBAI3D,UAAU,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;gBAC5C,UAAU,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;gBAChD,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;gBAC1C,UAAU,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;gBAC9C,UAAU,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;gBAChD,UAAU,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;gBACpD,UAAU,CAAC,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;gBAClD,UAAU,CAAC,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;aACtD;iBAAM;gBACN,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACpB;SACD;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAIO,QAAQ,CAAC,KAA6B;QAC7C,IAAI,CAAC,KAAK,EAAE;YACX,OAAO,SAAS,CAAC;SACjB;QACD,OAAO,KAAK,CAAC,GAAG,CACf,CAAC,MAAM,EAAE,EAAE,CACV,CAAC;YACA,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;SACP,CAAA,CAClB,CAAC;IACH,CAAC;IAEO,gBAAgB,CAAC,QAAiC;QACzD,IAAI,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAA,EAAE;YACtB,OAAO,SAAS,CAAC;SACjB;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAC1B,CAAC,CAAC,EAAE,EAAE,CACL,CAAC;YACA,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,cAAc,EAAE,CAAC,CAAC,cAAc;YAChC,cAAc,EAAE,CAAC,CAAC,cAAc;SACf,CAAA,CACnB,CAAC;QACF,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAveD,8BAueC","sourcesContent":["import { BgsGameState } from '../../bgs-battle-info';\r\nimport { BgsPlayerEntity, BoardTrinket } from '../../bgs-player-entity';\r\nimport { BoardEntity } from '../../board-entity';\r\nimport { BoardSecret } from '../../board-secret';\r\nimport { GameAction, buildGameAction } from './game-action';\r\nimport { GameSample } from './game-sample';\r\n\r\nconst MAX_SAMPLES = 1;\r\n\r\nexport class Spectator {\r\n\tprivate actionsForCurrentBattle: GameAction[];\r\n\tprivate wonBattles: GameSample[];\r\n\tprivate tiedBattles: GameSample[];\r\n\tprivate lostBattles: GameSample[];\r\n\r\n\tconstructor(private readonly enabled: boolean) {\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\t\tthis.wonBattles = [];\r\n\t\tthis.tiedBattles = [];\r\n\t\tthis.lostBattles = [];\r\n\t}\r\n\r\n\tpublic prune(): void {\r\n\t\tthis.wonBattles = this.wonBattles.slice(0, MAX_SAMPLES);\r\n\t\tthis.lostBattles = this.lostBattles.slice(0, MAX_SAMPLES);\r\n\t\tthis.tiedBattles = this.tiedBattles.slice(0, MAX_SAMPLES);\r\n\t}\r\n\r\n\tpublic buildOutcomeSamples(gameState: BgsGameState): {\r\n\t\twon: readonly GameSample[];\r\n\t\tlost: readonly GameSample[];\r\n\t\ttied: readonly GameSample[];\r\n\t} {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn {\r\n\t\t\t\twon: [],\r\n\t\t\t\tlost: [],\r\n\t\t\t\ttied: [],\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn {\r\n\t\t\twon: this.wonBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t\tlost: this.lostBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t\ttied: this.tiedBattles?.map((battle) => this.cleanUpActions(battle, gameState)),\r\n\t\t};\r\n\t}\r\n\r\n\tprivate cleanUpActions(battle: GameSample, gameState: BgsGameState): GameSample {\r\n\t\tconst collapsed = this.collapseActions(battle.actions);\r\n\t\tconst result: GameSample = {\r\n\t\t\t...battle,\r\n\t\t\tactions: collapsed,\r\n\t\t\tanomalies: gameState.anomalies,\r\n\t\t};\r\n\t\treturn result;\r\n\t}\r\n\r\n\tpublic commitBattleResult(result: 'won' | 'lost' | 'tied'): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\tthis.actionsForCurrentBattle = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (\r\n\t\t\tthis.wonBattles.length >= MAX_SAMPLES &&\r\n\t\t\tthis.lostBattles.length >= MAX_SAMPLES &&\r\n\t\t\tthis.tiedBattles.length >= MAX_SAMPLES\r\n\t\t) {\r\n\t\t\tthis.actionsForCurrentBattle = [];\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// const actionsForBattle = this.collapseActions(this.actionsForCurrentBattle);\r\n\t\tconst actionsForBattle = this.actionsForCurrentBattle;\r\n\t\tthis.actionsForCurrentBattle = [];\r\n\r\n\t\tconst battle: GameSample = {\r\n\t\t\tactions: actionsForBattle,\r\n\t\t\tanomalies: [],\r\n\t\t};\r\n\t\tswitch (result) {\r\n\t\t\tcase 'won':\r\n\t\t\t\tthis.wonBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'lost':\r\n\t\t\t\tthis.lostBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 'tied':\r\n\t\t\t\tthis.tiedBattles.push(battle);\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\tpublic registerAttack(\r\n\t\tattackingEntity: BoardEntity,\r\n\t\tdefendingEntity: BoardEntity,\r\n\t\tattackingBoard: readonly BoardEntity[],\r\n\t\tdefendingBoard: readonly BoardEntity[],\r\n\t\tattackingBoardHero: BgsPlayerEntity,\r\n\t\tdefendingBoardHero: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.debug(\r\n\t\t// \t'\\n register attack',\r\n\t\t// \tstringifySimple(attackingBoard),\r\n\t\t// \t'\\n',\r\n\t\t// \tstringifySimple(defendingBoard),\r\n\t\t// \t'\\n',\r\n\t\t// \tattackingBoard.find((e) => e.entityId === 2441),\r\n\t\t// \t'\\n',\r\n\t\t// \tattackingBoard.find((e) => e.entityId === 2442),\r\n\t\t// );\r\n\t\tconst isAttackerFriendly = attackingBoard.every((entity) => entity.friendly);\r\n\t\tconst playerHero = isAttackerFriendly ? attackingBoardHero : defendingBoardHero;\r\n\t\tconst opponentHero = isAttackerFriendly ? defendingBoardHero : attackingBoardHero;\r\n\t\tconst friendlyBoard = isAttackerFriendly ? attackingBoard : defendingBoard;\r\n\t\tconst opponentBoard = isAttackerFriendly ? defendingBoard : attackingBoard;\r\n\t\tconst action: GameAction = buildGameAction(playerHero, opponentHero, {\r\n\t\t\ttype: 'attack',\r\n\t\t\tsourceEntityId: attackingEntity.entityId,\r\n\t\t\ttargetEntityId: defendingEntity.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\tplayerHand: this.sanitize(playerHero.hand),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\topponentHand: this.sanitize(opponentHero.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerStartOfCombat(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tfriendlyHero: BgsPlayerEntity,\r\n\t\topponentHero: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'start-of-combat',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPlayerAttack(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tdamage: number,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'player-attack',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerOpponentAttack(\r\n\t\tfriendlyBoard: readonly BoardEntity[],\r\n\t\topponentBoard: readonly BoardEntity[],\r\n\t\tdamage: number,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'opponent-attack',\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tdamage: damage,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerDamageDealt(\r\n\t\tdamagingEntity: BoardEntity,\r\n\t\tdamagedEntity: BoardEntity,\r\n\t\tdamageTaken: number,\r\n\t\tdamagedEntityBoard: BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!damagingEntity.entityId) {\r\n\t\t\t// console.error('missing damaging entity id', damagingEntity.cardId);\r\n\t\t}\r\n\t\tconst friendlyBoard = damagedEntityBoard.every((entity) => entity.friendly) ? damagedEntityBoard : null;\r\n\t\tconst opponentBoard = damagedEntityBoard.every((entity) => !entity.friendly) ? damagedEntityBoard : null;\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'damage',\r\n\t\t\tdamages: [\r\n\t\t\t\t{\r\n\t\t\t\t\tsourceEntityId: damagingEntity.entityId,\r\n\t\t\t\t\ttargetEntityId: damagedEntity.entityId,\r\n\t\t\t\t\tdamage: damageTaken,\r\n\t\t\t\t},\r\n\t\t\t],\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPowerTarget(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket,\r\n\t\ttargetEntity: BoardEntity | BgsPlayerEntity,\r\n\t\ttargetBoard: BoardEntity[],\r\n\t\thero1: BgsPlayerEntity,\r\n\t\thero2: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!targetEntity) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.log('registerPowerTarget', stringifySimpleCard(sourceEntity), stringifySimpleCard(targetEntity), new Error().stack);\r\n\t\tconst friendlyBoard = targetBoard?.every((entity) => entity.friendly) ? targetBoard : null;\r\n\t\tconst opponentBoard = targetBoard?.every((entity) => !entity.friendly) ? targetBoard : null;\r\n\t\tconst friendlyHero = hero1?.friendly ? hero1 : hero2?.friendly ? hero2 : null;\r\n\t\tconst opponentHero = hero1?.friendly ? hero2 : hero2?.friendly ? hero1 : null;\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'power-target',\r\n\t\t\tsourceEntityId: sourceEntity.entityId,\r\n\t\t\ttargetEntityId: targetEntity.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero?.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero?.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerPowerTargets(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardSecret | BoardTrinket,\r\n\t\ttargetEntities: (BoardEntity | BgsPlayerEntity)[],\r\n\t\ttargetBoard: BoardEntity[],\r\n\t\thero1: BgsPlayerEntity,\r\n\t\thero2: BgsPlayerEntity,\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!targetEntities?.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// console.log('registerPowerTarget', stringifySimpleCard(sourceEntity), stringifySimpleCard(targetEntity), new Error().stack);\r\n\t\tconst friendlyBoard = targetBoard?.every((entity) => entity.friendly) ? targetBoard : null;\r\n\t\tconst opponentBoard = targetBoard?.every((entity) => !entity.friendly) ? targetBoard : null;\r\n\t\tconst friendlyHero = hero1?.friendly ? hero1 : hero2?.friendly ? hero2 : null;\r\n\t\tconst opponentHero = hero1?.friendly ? hero2 : hero2?.friendly ? hero1 : null;\r\n\t\tconst action: GameAction = buildGameAction(friendlyHero, opponentHero, {\r\n\t\t\ttype: 'power-target',\r\n\t\t\tsourceEntityId: sourceEntity.entityId,\r\n\t\t\ttargetEntityIds: targetEntities.map((entity) => entity.entityId),\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: this.sanitize(friendlyHero?.hand),\r\n\t\t\topponentHand: this.sanitize(opponentHero?.hand),\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerMinionsSpawn(\r\n\t\tsourceEntity: BoardEntity | BgsPlayerEntity | BoardTrinket,\r\n\t\tboardOnWhichToSpawn: BoardEntity[],\r\n\t\tspawnedEntities: readonly BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!spawnedEntities || spawnedEntities.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!sourceEntity?.entityId) {\r\n\t\t\t// console.error('missing spawn source entity id', sourceEntity);\r\n\t\t}\r\n\t\tconst friendlyBoard = boardOnWhichToSpawn.every((entity) => entity.friendly) ? boardOnWhichToSpawn : null;\r\n\t\tconst opponentBoard = boardOnWhichToSpawn.every((entity) => !entity.friendly) ? boardOnWhichToSpawn : null;\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'spawn',\r\n\t\t\tspawns: this.sanitize(spawnedEntities),\r\n\t\t\tsourceEntityId: sourceEntity?.entityId,\r\n\t\t\tplayerBoard: this.sanitize(friendlyBoard),\r\n\t\t\topponentBoard: this.sanitize(opponentBoard),\r\n\t\t\tplayerHand: null,\r\n\t\t\topponentHand: null,\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tpublic registerDeadEntities(\r\n\t\tdeadMinionIndexes1: number[],\r\n\t\tdeadEntities1: BoardEntity[],\r\n\t\tboard1: BoardEntity[],\r\n\t\tdeadMinionIndexes2: number[],\r\n\t\tdeadEntities2: BoardEntity[],\r\n\t\tboard2: BoardEntity[],\r\n\t): void {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst deaths = [...(deadEntities1 || []), ...(deadEntities2 || [])];\r\n\t\tif (!deaths || deaths.length === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst action: GameAction = buildGameAction(null, null, {\r\n\t\t\ttype: 'minion-death',\r\n\t\t\tdeaths: this.sanitize(deaths),\r\n\t\t\tdeadMinionsPositionsOnBoard: [\r\n\t\t\t\t...(deadMinionIndexes1 || []).map((i) => board1.length - i),\r\n\t\t\t\t...(deadMinionIndexes2 || []).map((i) => board2.length - i),\r\n\t\t\t],\r\n\t\t});\r\n\t\tthis.addAction(action);\r\n\t}\r\n\r\n\tprivate addAction(action: GameAction) {\r\n\t\tthis.actionsForCurrentBattle.push(action);\r\n\t}\r\n\r\n\tprivate collapseActions(actions: readonly GameAction[]): readonly GameAction[] {\r\n\t\tif (!this.enabled) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tif (!actions || actions.length === 0) {\r\n\t\t\treturn [];\r\n\t\t}\r\n\t\tconst result: GameAction[] = [];\r\n\t\tfor (let i = 0; i < actions.length; i++) {\r\n\t\t\tconst action: GameAction = {\r\n\t\t\t\t...actions[i],\r\n\t\t\t\tplayerBoard: this.sanitize(actions[i].playerBoard),\r\n\t\t\t\topponentBoard: this.sanitize(actions[i].opponentBoard),\r\n\t\t\t\tplayerHand: this.sanitize(actions[i].playerHand),\r\n\t\t\t\topponentHand: this.sanitize(actions[i].opponentHand),\r\n\t\t\t\t// spawns: this.sanitize(actions[i].spawns),\r\n\t\t\t\tdeaths: this.sanitize(actions[i].deaths),\r\n\t\t\t\tplayerTrinkets: this.sanitizeTrinkets(actions[i].playerTrinkets),\r\n\t\t\t\topponentTrinkets: this.sanitizeTrinkets(actions[i].opponentTrinkets),\r\n\t\t\t};\r\n\t\t\t// action.playerBoard && console.debug('\\naction playerboard', stringifySimple(action.playerBoard));\r\n\t\t\tconst lastAction = result.length > 0 ? result[result.length - 1] : null;\r\n\r\n\t\t\tif (lastAction) {\r\n\t\t\t\taction.playerBoard = action.playerBoard ?? lastAction.playerBoard;\r\n\t\t\t\taction.opponentBoard = action.opponentBoard ?? lastAction.opponentBoard;\r\n\t\t\t\taction.playerHand = action.playerHand ?? lastAction.playerHand;\r\n\t\t\t\taction.opponentHand = action.opponentHand ?? lastAction.opponentHand;\r\n\t\t\t\taction.playerSecrets = action.playerSecrets ?? lastAction.playerSecrets;\r\n\t\t\t\taction.opponentSecrets = action.opponentSecrets ?? lastAction.opponentSecrets;\r\n\t\t\t\taction.playerRewardCardId = action.playerRewardCardId ?? lastAction.playerRewardCardId;\r\n\t\t\t\taction.playerRewardEntityId = action.playerRewardEntityId ?? lastAction.playerRewardEntityId;\r\n\t\t\t\taction.playerRewardData = action.playerRewardData ?? lastAction.playerRewardData;\r\n\t\t\t\taction.opponentRewardCardId = action.opponentRewardCardId ?? lastAction.opponentRewardCardId;\r\n\t\t\t\taction.opponentRewardEntityId = action.opponentRewardEntityId ?? lastAction.opponentRewardEntityId;\r\n\t\t\t\taction.opponentRewardData = action.opponentRewardData ?? lastAction.opponentRewardData;\r\n\t\t\t\taction.playerCardId = action.playerCardId ?? lastAction.playerCardId;\r\n\t\t\t\taction.playerEntityId = action.playerEntityId ?? lastAction.playerEntityId;\r\n\t\t\t\taction.playerHeroPowerCardId = action.playerHeroPowerCardId ?? lastAction.playerHeroPowerCardId;\r\n\t\t\t\taction.playerHeroPowerEntityId = action.playerHeroPowerEntityId ?? lastAction.playerHeroPowerEntityId;\r\n\t\t\t\taction.playerHeroPowerUsed = action.playerHeroPowerUsed ?? lastAction.playerHeroPowerUsed;\r\n\t\t\t\taction.opponentCardId = action.opponentCardId ?? lastAction.opponentCardId;\r\n\t\t\t\taction.opponentEntityId = action.opponentEntityId ?? lastAction.opponentEntityId;\r\n\t\t\t\taction.opponentHeroPowerCardId = action.opponentHeroPowerCardId ?? lastAction.opponentHeroPowerCardId;\r\n\t\t\t\taction.opponentHeroPowerEntityId =\r\n\t\t\t\t\taction.opponentHeroPowerEntityId ?? lastAction.opponentHeroPowerEntityId;\r\n\t\t\t\taction.opponentHeroPowerUsed = action.opponentHeroPowerUsed ?? lastAction.opponentHeroPowerUsed;\r\n\t\t\t\taction.playerTrinkets = action.playerTrinkets ?? lastAction.playerTrinkets;\r\n\t\t\t\taction.opponentTrinkets = action.opponentTrinkets ?? lastAction.opponentTrinkets;\r\n\t\t\t}\r\n\r\n\t\t\tif (lastAction && action.type === 'damage' && lastAction.type === 'attack') {\r\n\t\t\t\tlastAction.damages = lastAction.damages || [];\r\n\t\t\t\tlastAction.damages.push({\r\n\t\t\t\t\tdamage: action.damages[0].damage,\r\n\t\t\t\t\tsourceEntityId: action.damages[0].sourceEntityId,\r\n\t\t\t\t\ttargetEntityId: action.damages[0].targetEntityId,\r\n\t\t\t\t});\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else if (lastAction && action.type === 'damage' && lastAction.type === 'damage') {\r\n\t\t\t\tlastAction.damages = lastAction.damages || [];\r\n\t\t\t\tlastAction.damages.push({\r\n\t\t\t\t\tdamage: action.damages[0].damage,\r\n\t\t\t\t\tsourceEntityId: action.damages[0].sourceEntityId,\r\n\t\t\t\t\ttargetEntityId: action.damages[0].targetEntityId,\r\n\t\t\t\t});\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else if (\r\n\t\t\t\tlastAction &&\r\n\t\t\t\taction.type === 'power-target' &&\r\n\t\t\t\tlastAction.type === 'power-target' &&\r\n\t\t\t\taction.sourceEntityId === lastAction.sourceEntityId\r\n\t\t\t) {\r\n\t\t\t\tlastAction.targetEntityIds =\r\n\t\t\t\t\tlastAction.targetEntityIds ?? (lastAction.targetEntityId ? [lastAction.targetEntityId] : []);\r\n\t\t\t\taction.targetEntityIds =\r\n\t\t\t\t\taction.targetEntityIds ?? (action.targetEntityId ? [action.targetEntityId] : []);\r\n\t\t\t\tlastAction.targetEntityIds.push(...action.targetEntityIds);\r\n\t\t\t\t// So that when multiple Leapfroggers enchantments target the same minion,\r\n\t\t\t\t// we can count them in the replay viewer's text\r\n\t\t\t\t// lastAction.targetEntityIds = [...new Set(lastAction.targetEntityIds)];\r\n\t\t\t\tlastAction.playerBoard = action.playerBoard;\r\n\t\t\t\tlastAction.opponentBoard = action.opponentBoard;\r\n\t\t\t\tlastAction.playerHand = action.playerHand;\r\n\t\t\t\tlastAction.opponentHand = action.opponentHand;\r\n\t\t\t\tlastAction.playerSecrets = action.playerSecrets;\r\n\t\t\t\tlastAction.opponentSecrets = action.opponentSecrets;\r\n\t\t\t\tlastAction.playerTrinkets = action.playerTrinkets;\r\n\t\t\t\tlastAction.opponentTrinkets = action.opponentTrinkets;\r\n\t\t\t} else {\r\n\t\t\t\tresult.push(action);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\t// Calling sanitize every time before we add an action to the list is mandatory, since\r\n\t// the entities and boards are mutable\r\n\tprivate sanitize(board: readonly BoardEntity[]): readonly BoardEntity[] {\r\n\t\tif (!board) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\treturn board.map(\r\n\t\t\t(entity) =>\r\n\t\t\t\t({\r\n\t\t\t\t\tentityId: entity.entityId,\r\n\t\t\t\t\tcardId: entity.cardId,\r\n\t\t\t\t\tfriendly: entity.friendly,\r\n\t\t\t\t\tattack: entity.attack,\r\n\t\t\t\t\thealth: entity.health,\r\n\t\t\t\t\tmaxHealth: entity.maxHealth,\r\n\t\t\t\t\ttaunt: entity.taunt,\r\n\t\t\t\t\tdivineShield: entity.divineShield,\r\n\t\t\t\t\tpoisonous: entity.poisonous,\r\n\t\t\t\t\tvenomous: entity.venomous,\r\n\t\t\t\t\treborn: entity.reborn,\r\n\t\t\t\t\twindfury: entity.windfury,\r\n\t\t\t\t\tstealth: entity.stealth,\r\n\t\t\t\t} as BoardEntity),\r\n\t\t);\r\n\t}\r\n\r\n\tprivate sanitizeTrinkets(trinkets: readonly BoardTrinket[]): readonly BoardTrinket[] {\r\n\t\tif (!trinkets?.length) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\t\tconst result = trinkets.map(\r\n\t\t\t(t) =>\r\n\t\t\t\t({\r\n\t\t\t\t\tcardId: t.cardId,\r\n\t\t\t\t\tentityId: t.entityId,\r\n\t\t\t\t\tscriptDataNum1: t.scriptDataNum1,\r\n\t\t\t\t\tscriptDataNum6: t.scriptDataNum6,\r\n\t\t\t\t} as BoardTrinket),\r\n\t\t);\r\n\t\treturn result;\r\n\t}\r\n}\r\n"]}
|