@firestone-hs/simulate-bgs-battle 1.1.261 → 1.1.263
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/cards-data.js +4 -4
- package/dist/cards/cards-data.js.map +1 -1
- package/dist/simulation/attack.js.map +1 -1
- package/dist/simulation/avenge.js +2 -2
- package/dist/simulation/avenge.js.map +1 -1
- package/dist/simulation/deathrattle-effects.js +4 -4
- package/dist/simulation/deathrattle-effects.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +11 -12
- package/dist/utils.js.map +1 -1
- package/package.json +1 -4
package/dist/cards/cards-data.js
CHANGED
|
@@ -136,11 +136,11 @@ class CardsData {
|
|
|
136
136
|
isGolden(card) {
|
|
137
137
|
return !!card.battlegroundsNormalDbfId;
|
|
138
138
|
}
|
|
139
|
-
isValidTribe(validTribes,
|
|
140
|
-
if (!(
|
|
141
|
-
return
|
|
139
|
+
isValidTribe(validTribes, cardRaces) {
|
|
140
|
+
if (!(cardRaces === null || cardRaces === void 0 ? void 0 : cardRaces.length)) {
|
|
141
|
+
return true;
|
|
142
142
|
}
|
|
143
|
-
return
|
|
143
|
+
return cardRaces
|
|
144
144
|
.map((race) => utils_2.getRaceEnum(race))
|
|
145
145
|
.some((raceEnum) => raceEnum === reference_data_1.Race.ALL || !(validTribes === null || validTribes === void 0 ? void 0 : validTribes.length) || validTribes.includes(raceEnum));
|
|
146
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cards-data.js","sourceRoot":"","sources":["../../src/cards/cards-data.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n\tAllCardsService,\r\n\tCardIds,\r\n\tGameTag,\r\n\tisBattlegroundsCard,\r\n\tNON_BUYABLE_MINION_IDS,\r\n\tRace,\r\n\tReferenceCard,\r\n} from '@firestone-hs/reference-data';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { getRaceEnum, hasMechanic, isCorrectTribe } from '../utils';\r\n\r\nexport const START_OF_COMBAT_CARD_IDS = [\r\n\tCardIds.CorruptedMyrmidon,\r\n\tCardIds.CorruptedMyrmidonBattlegrounds,\r\n\tCardIds.Crabby_BG22_HERO_000_Buddy,\r\n\tCardIds.CrabbyBattlegrounds,\r\n\tCardIds.MantidQueen,\r\n\tCardIds.MantidQueenBattlegrounds,\r\n\tCardIds.PrizedPromoDrake,\r\n\tCardIds.PrizedPromoDrakeBattlegrounds,\r\n\tCardIds.RedWhelp,\r\n\tCardIds.RedWhelpBattlegrounds,\r\n\tCardIds.AmberGuardian,\r\n\tCardIds.AmberGuardianBattlegrounds,\r\n\tCardIds.InterrogatorWhitemane_BG24_704,\r\n\tCardIds.InterrogatorWhitemane_BG24_704_G,\r\n\tCardIds.Soulsplitter,\r\n\tCardIds.SoulsplitterBattlegrounds,\r\n];\r\nexport const WHELP_CARD_IDS = [CardIds.RedWhelp, CardIds.RedWhelpBattlegrounds, CardIds.Onyxia_OnyxianWhelpToken];\r\n\r\nexport class CardsData {\r\n\t// public shredderSpawns: readonly string[];\r\n\tpublic ghastcoilerSpawns: readonly string[];\r\n\tpublic validDeathrattles: readonly string[];\r\n\tpublic impMamaSpawns: readonly string[];\r\n\tpublic gentleDjinniSpawns: readonly string[];\r\n\t// public festergutSpawns: readonly string[];\r\n\tpublic kilrekSpawns: readonly string[];\r\n\tpublic brannEpicEggSpawns: readonly string[];\r\n\t// public sneedsSpawns: readonly string[];\r\n\t// public treasureChestSpawns: readonly string[];\r\n\tpublic pirateSpawns: readonly string[];\r\n\tpublic beastSpawns: readonly string[];\r\n\r\n\tpublic putricidePool1: readonly string[];\r\n\tpublic putricidePool2: readonly string[];\r\n\tpublic putridicePool2ForEternalSummoner: readonly string[];\r\n\r\n\tprivate minionsForTier: { [key: string]: readonly ReferenceCard[] };\r\n\r\n\tconstructor(private readonly allCards: AllCardsService, init = true) {\r\n\t\tif (init) {\r\n\t\t\tthis.inititialize();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic inititialize(validTribes?: readonly Race[]): void {\r\n\t\tconst pool = this.allCards\r\n\t\t\t.getCards()\r\n\t\t\t.filter((card) => isBattlegroundsCard(card))\r\n\t\t\t.filter((card) => !NON_BUYABLE_MINION_IDS.includes(card.id as CardIds))\r\n\t\t\t.filter((card) => !!card.techLevel)\r\n\t\t\t.filter((card) => !hasMechanic(card, GameTag[GameTag.BACON_BUDDY]))\r\n\t\t\t.filter((card) => card.set !== 'Vanilla');\r\n\t\tthis.minionsForTier = groupByFunction((card: ReferenceCard) => card.techLevel)(pool.filter((card) => !this.isGolden(card)));\r\n\t\tthis.ghastcoilerSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.id !== 'BGS_008')\r\n\t\t\t.filter((card) => hasMechanic(card, 'DEATHRATTLE'))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.races))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.validDeathrattles = pool\r\n\t\t\t// .filter((card) => !card.id.startsWith('TB_BaconUps')) // Ignore golden\r\n\t\t\t.filter((card) => hasMechanic(card, 'DEATHRATTLE'))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.races))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.impMamaSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.DEMON))\r\n\t\t\t.filter((card) => card.id !== CardIds.ImpMama)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.gentleDjinniSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.ELEMENTAL))\r\n\t\t\t.filter((card) => card.id !== CardIds.GentleDjinni)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\t// FIXME: just spawn a random undead instead of an Undead Creation\r\n\t\t// this.festergutSpawns = pool\r\n\t\t// \t.filter((card) => !this.isGolden(card))\r\n\t\t// \t.filter((card) => isCorrectTribe(card.races, Race.UNDEAD))\r\n\t\t// \t.filter((card) => card.id !== CardIds.Festergut_BG25_HERO_100_Buddy)\r\n\t\t// \t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t// \t.map((card) => card.id);\r\n\t\tthis.kilrekSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.DEMON))\r\n\t\t\t.filter((card) => card.id !== CardIds.KilrekBattlegrounds_TB_BaconShop_HERO_37_Buddy)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.brannEpicEggSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => hasMechanic(card, 'BATTLECRY'))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.pirateSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.PIRATE))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.beastSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.BEAST))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\r\n\t\tthis.putricidePool1 = pool.filter((card) => card.battlegroundsPutridicePool1).map((card) => card.id);\r\n\t\tthis.putricidePool2 = pool.filter((card) => card.battlegroundsPutridicePool2).map((card) => card.id);\r\n\t\tthis.putridicePool2ForEternalSummoner = pool\r\n\t\t\t.filter((card) => card.battlegroundsPutridicePool2)\r\n\t\t\t.filter((card) => !card.battlegroundsPutridiceSummonerExclusion)\r\n\t\t\t.map((card) => card.id);\r\n\t}\r\n\r\n\tpublic avengeValue(cardId: string): number {\r\n\t\tswitch (cardId) {\r\n\t\t\tcase CardIds.BirdBuddy:\r\n\t\t\tcase CardIds.BirdBuddyBattlegrounds:\r\n\t\t\tcase CardIds.HungeringAbomination:\r\n\t\t\tcase CardIds.HungeringAbominationBattlegrounds:\r\n\t\t\t// Not technically an avenge, but behaves as if\r\n\t\t\tcase CardIds.ShadowyConstruct:\r\n\t\t\tcase CardIds.ShadowyConstructBattlegrounds:\r\n\t\t\t\treturn 1;\r\n\t\t\tcase CardIds.GhoulOfTheFeast:\r\n\t\t\tcase CardIds.GhoulOfTheFeastBattlegrounds:\r\n\t\t\tcase CardIds.MechanoTank_BG21_023:\r\n\t\t\tcase CardIds.MechanoTank_BG21_023_G:\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001_G:\r\n\t\t\tcase CardIds.StormpikeLieutenant:\r\n\t\t\tcase CardIds.StormpikeLieutenantBattlegrounds:\r\n\t\t\tcase CardIds.VanndarStormpike_LeadTheStormpikes:\r\n\t\t\t\treturn 2;\r\n\t\t\tcase CardIds.BuddingGreenthumb:\r\n\t\t\tcase CardIds.BuddingGreenthumbBattlegrounds:\r\n\t\t\t// case CardIds.FrostwolfLieutenant:\r\n\t\t\t// case CardIds.FrostwolfLieutenantBattlegrounds:\r\n\t\t\tcase CardIds.PashmarTheVengeful:\r\n\t\t\tcase CardIds.PashmarTheVengefulBattlegrounds:\r\n\t\t\tcase CardIds.WitchwingNestmatron_BG21_038:\r\n\t\t\tcase CardIds.WitchwingNestmatron_BG21_038_G:\r\n\t\t\tcase CardIds.Drekthar_LeadTheFrostwolves:\r\n\t\t\t\treturn 3;\r\n\t\t\tcase CardIds.ImpatientDoomsayer:\r\n\t\t\tcase CardIds.ImpatientDoomsayerBattlegrounds:\r\n\t\t\tcase CardIds.Sisefin_BG21_009:\r\n\t\t\tcase CardIds.Sisefin_BG21_009_G:\r\n\t\t\tcase CardIds.TonyTwoTusk_BG21_031:\r\n\t\t\tcase CardIds.TonyTwoTusk_BG21_031_G:\r\n\t\t\tcase CardIds.Onyxia_Broodmother:\r\n\t\t\t\treturn 4;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tpublic getTavernLevel(cardId: string): number {\r\n\t\treturn this.allCards.getCard(cardId).techLevel ?? 1;\r\n\t}\r\n\r\n\tpublic getRandomMinionForTavernTier(tavernTier: number): string {\r\n\t\t// Tzvern tier can be undefined for hero-power specific tokens, like the Amalgam, or when\r\n\t\t// for some reason tokens end up in the shop. For now, defaulting to 1 for tavern\r\n\t\t// level seems to work in all cases\r\n\t\tconst minionsForTier = this.minionsForTier[tavernTier ?? 1];\r\n\t\tif (!minionsForTier?.length) {\r\n\t\t\tconsole.error('incorrect minions for tier', tavernTier, this.minionsForTier, minionsForTier);\r\n\t\t}\r\n\t\treturn pickRandom(this.minionsForTier[tavernTier ?? 1])?.id;\r\n\t}\r\n\r\n\tprivate isGolden(card: ReferenceCard): boolean {\r\n\t\treturn !!card.battlegroundsNormalDbfId;\r\n\t}\r\n\r\n\tprivate isValidTribe(validTribes: readonly Race[], races: readonly string[]): boolean {\r\n\t\tif (!races?.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\treturn races\r\n\t\t\t.map((race) => getRaceEnum(race))\r\n\t\t\t.some((raceEnum) => raceEnum === Race.ALL || !validTribes?.length || validTribes.includes(raceEnum));\r\n\t}\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"cards-data.js","sourceRoot":"","sources":["../../src/cards/cards-data.ts"],"names":[],"mappings":";;;AAAA,iEAQsC;AACtC,6CAAgE;AAChE,oCAAoE;AAEvD,QAAA,wBAAwB,GAAG;;;;;;;;;;;;;;;;;CAiBvC,CAAC;AACW,QAAA,cAAc,GAAG,gDAAmF,CAAC;AAElH,MAAa,SAAS;IAoBrB,YAA6B,QAAyB,EAAE,IAAI,GAAG,IAAI;QAAtC,aAAQ,GAAR,QAAQ,CAAiB;QACrD,IAAI,IAAI,EAAE;YACT,IAAI,CAAC,YAAY,EAAE,CAAC;SACpB;IACF,CAAC;IAEM,YAAY,CAAC,WAA6B;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ;aACxB,QAAQ,EAAE;aACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oCAAmB,CAAC,IAAI,CAAC,CAAC;aAC3C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,uCAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAa,CAAC,CAAC;aACtE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;aAClC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,mBAAW,CAAC,IAAI,EAAE,wBAAO,CAAC,wBAAO,CAAC,WAAW,CAAC,CAAC,CAAC;aAClE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG,uBAAe,CAAC,CAAC,IAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5H,IAAI,CAAC,iBAAiB,GAAG,IAAI;aAC3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,SAAS,CAAC;aACvC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;aAElD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;aAC5D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,iBAAiB,GAAG,IAAI;aAE3B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAW,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;aAElD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;aAC5D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI;aACvB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAc,CAAC,IAAI,CAAC,KAAK,EAAE,qBAAI,CAAC,KAAK,CAAC,CAAC;aACxD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,cAAoB,CAAC;aAE7C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,IAAI;aAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAc,CAAC,IAAI,CAAC,KAAK,EAAE,qBAAI,CAAC,SAAS,CAAC,CAAC;aAC5D,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,cAAyB,CAAC;aAElD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAQzB,IAAI,CAAC,YAAY,GAAG,IAAI;aACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAc,CAAC,IAAI,CAAC,KAAK,EAAE,qBAAI,CAAC,KAAK,CAAC,CAAC;aACxD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,iCAA2D,CAAC;aAEpF,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,kBAAkB,GAAG,IAAI;aAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;aAChD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI;aACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAc,CAAC,IAAI,CAAC,KAAK,EAAE,qBAAI,CAAC,MAAM,CAAC,CAAC;aAEzD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,IAAI;aACrB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;aACtC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,sBAAc,CAAC,IAAI,CAAC,KAAK,EAAE,qBAAI,CAAC,KAAK,CAAC,CAAC;aAExD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEzB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrG,IAAI,CAAC,gCAAgC,GAAG,IAAI;aAC1C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC;aAClD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC;aAC/D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1B,CAAC;IAEM,WAAW,CAAC,MAAc;QAChC,QAAQ,MAAM,EAAE;YACf,gBAAuB;YACvB,kBAAoC;YACpC,gBAAkC;YAClC,kBAA+C;YAE/C,2BAA8B;YAC9B;gBACC,OAAO,CAAC,CAAC;YACV,gBAA6B;YAC7B,kBAA0C;YAC1C,gBAAkC;YAClC,kBAAoC;YACpC,gBAAyC;YACzC,kBAA2C;YAC3C,2BAAiC;YACjC,6BAA8C;YAC9C;gBACC,OAAO,CAAC,CAAC;YACV,gBAA+B;YAC/B,kBAA4C;YAG5C,gBAAgC;YAChC,kBAA6C;YAC7C,gBAA0C;YAC1C,kBAA4C;YAC5C;gBACC,OAAO,CAAC,CAAC;YACV,gBAAgC;YAChC,kBAA6C;YAC7C,gBAA8B;YAC9B,kBAAgC;YAChC,gBAAkC;YAClC,kBAAoC;YACpC;gBACC,OAAO,CAAC,CAAC;SACV;QACD,OAAO,CAAC,CAAC;IACV,CAAC;IAEM,cAAc,CAAC,MAAc;;QACnC,aAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,mCAAI,CAAC,CAAC;IACrD,CAAC;IAEM,4BAA4B,CAAC,UAAkB;;QAIrD,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,CAAC,CAAC,CAAC;QAC5D,IAAI,EAAC,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,CAAA,EAAE;YAC5B,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;SAC7F;QACD,aAAO,kBAAU,CAAC,IAAI,CAAC,cAAc,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,CAAC,CAAC,CAAC,0CAAE,EAAE,CAAC;IAC7D,CAAC;IAEO,QAAQ,CAAC,IAAmB;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC;IACxC,CAAC;IAEO,YAAY,CAAC,WAA4B,EAAE,SAA4B;QAE9E,IAAI,EAAC,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,CAAA,EAAE;YACvB,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,SAAS;aACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAW,CAAC,IAAI,CAAC,CAAC;aAChC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,qBAAI,CAAC,GAAG,IAAI,EAAC,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,MAAM,CAAA,IAAI,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvG,CAAC;CACD;AAtKD,8BAsKC","sourcesContent":["import {\r\n\tAllCardsService,\r\n\tCardIds,\r\n\tGameTag,\r\n\tisBattlegroundsCard,\r\n\tNON_BUYABLE_MINION_IDS,\r\n\tRace,\r\n\tReferenceCard,\r\n} from '@firestone-hs/reference-data';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { getRaceEnum, hasMechanic, isCorrectTribe } from '../utils';\r\n\r\nexport const START_OF_COMBAT_CARD_IDS = [\r\n\tCardIds.CorruptedMyrmidon,\r\n\tCardIds.CorruptedMyrmidonBattlegrounds,\r\n\tCardIds.Crabby_BG22_HERO_000_Buddy,\r\n\tCardIds.CrabbyBattlegrounds,\r\n\tCardIds.MantidQueen,\r\n\tCardIds.MantidQueenBattlegrounds,\r\n\tCardIds.PrizedPromoDrake,\r\n\tCardIds.PrizedPromoDrakeBattlegrounds,\r\n\tCardIds.RedWhelp,\r\n\tCardIds.RedWhelpBattlegrounds,\r\n\tCardIds.AmberGuardian,\r\n\tCardIds.AmberGuardianBattlegrounds,\r\n\tCardIds.InterrogatorWhitemane_BG24_704,\r\n\tCardIds.InterrogatorWhitemane_BG24_704_G,\r\n\tCardIds.Soulsplitter,\r\n\tCardIds.SoulsplitterBattlegrounds,\r\n];\r\nexport const WHELP_CARD_IDS = [CardIds.RedWhelp, CardIds.RedWhelpBattlegrounds, CardIds.Onyxia_OnyxianWhelpToken];\r\n\r\nexport class CardsData {\r\n\t// public shredderSpawns: readonly string[];\r\n\tpublic ghastcoilerSpawns: readonly string[];\r\n\tpublic validDeathrattles: readonly string[];\r\n\tpublic impMamaSpawns: readonly string[];\r\n\tpublic gentleDjinniSpawns: readonly string[];\r\n\t// public festergutSpawns: readonly string[];\r\n\tpublic kilrekSpawns: readonly string[];\r\n\tpublic brannEpicEggSpawns: readonly string[];\r\n\t// public sneedsSpawns: readonly string[];\r\n\t// public treasureChestSpawns: readonly string[];\r\n\tpublic pirateSpawns: readonly string[];\r\n\tpublic beastSpawns: readonly string[];\r\n\r\n\tpublic putricidePool1: readonly string[];\r\n\tpublic putricidePool2: readonly string[];\r\n\tpublic putridicePool2ForEternalSummoner: readonly string[];\r\n\r\n\tprivate minionsForTier: { [key: string]: readonly ReferenceCard[] };\r\n\r\n\tconstructor(private readonly allCards: AllCardsService, init = true) {\r\n\t\tif (init) {\r\n\t\t\tthis.inititialize();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic inititialize(validTribes?: readonly Race[]): void {\r\n\t\tconst pool = this.allCards\r\n\t\t\t.getCards()\r\n\t\t\t.filter((card) => isBattlegroundsCard(card))\r\n\t\t\t.filter((card) => !NON_BUYABLE_MINION_IDS.includes(card.id as CardIds))\r\n\t\t\t.filter((card) => !!card.techLevel)\r\n\t\t\t.filter((card) => !hasMechanic(card, GameTag[GameTag.BACON_BUDDY]))\r\n\t\t\t.filter((card) => card.set !== 'Vanilla');\r\n\t\tthis.minionsForTier = groupByFunction((card: ReferenceCard) => card.techLevel)(pool.filter((card) => !this.isGolden(card)));\r\n\t\tthis.ghastcoilerSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => card.id !== 'BGS_008')\r\n\t\t\t.filter((card) => hasMechanic(card, 'DEATHRATTLE'))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.races))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.validDeathrattles = pool\r\n\t\t\t// .filter((card) => !card.id.startsWith('TB_BaconUps')) // Ignore golden\r\n\t\t\t.filter((card) => hasMechanic(card, 'DEATHRATTLE'))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.filter((card) => this.isValidTribe(validTribes, card.races))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.impMamaSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.DEMON))\r\n\t\t\t.filter((card) => card.id !== CardIds.ImpMama)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.gentleDjinniSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.ELEMENTAL))\r\n\t\t\t.filter((card) => card.id !== CardIds.GentleDjinni)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\t// FIXME: just spawn a random undead instead of an Undead Creation\r\n\t\t// this.festergutSpawns = pool\r\n\t\t// \t.filter((card) => !this.isGolden(card))\r\n\t\t// \t.filter((card) => isCorrectTribe(card.races, Race.UNDEAD))\r\n\t\t// \t.filter((card) => card.id !== CardIds.Festergut_BG25_HERO_100_Buddy)\r\n\t\t// \t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t// \t.map((card) => card.id);\r\n\t\tthis.kilrekSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.DEMON))\r\n\t\t\t.filter((card) => card.id !== CardIds.KilrekBattlegrounds_TB_BaconShop_HERO_37_Buddy)\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.brannEpicEggSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => hasMechanic(card, 'BATTLECRY'))\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.pirateSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.PIRATE))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\t\tthis.beastSpawns = pool\r\n\t\t\t.filter((card) => !this.isGolden(card))\r\n\t\t\t.filter((card) => isCorrectTribe(card.races, Race.BEAST))\r\n\t\t\t// .filter((card) => REMOVED_CARD_IDS.indexOf(card.id) === -1)\r\n\t\t\t.map((card) => card.id);\r\n\r\n\t\tthis.putricidePool1 = pool.filter((card) => card.battlegroundsPutridicePool1).map((card) => card.id);\r\n\t\tthis.putricidePool2 = pool.filter((card) => card.battlegroundsPutridicePool2).map((card) => card.id);\r\n\t\tthis.putridicePool2ForEternalSummoner = pool\r\n\t\t\t.filter((card) => card.battlegroundsPutridicePool2)\r\n\t\t\t.filter((card) => !card.battlegroundsPutridiceSummonerExclusion)\r\n\t\t\t.map((card) => card.id);\r\n\t}\r\n\r\n\tpublic avengeValue(cardId: string): number {\r\n\t\tswitch (cardId) {\r\n\t\t\tcase CardIds.BirdBuddy:\r\n\t\t\tcase CardIds.BirdBuddyBattlegrounds:\r\n\t\t\tcase CardIds.HungeringAbomination:\r\n\t\t\tcase CardIds.HungeringAbominationBattlegrounds:\r\n\t\t\t// Not technically an avenge, but behaves as if\r\n\t\t\tcase CardIds.ShadowyConstruct:\r\n\t\t\tcase CardIds.ShadowyConstructBattlegrounds:\r\n\t\t\t\treturn 1;\r\n\t\t\tcase CardIds.GhoulOfTheFeast:\r\n\t\t\tcase CardIds.GhoulOfTheFeastBattlegrounds:\r\n\t\t\tcase CardIds.MechanoTank_BG21_023:\r\n\t\t\tcase CardIds.MechanoTank_BG21_023_G:\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001:\r\n\t\t\tcase CardIds.PalescaleCrocolisk_BG21_001_G:\r\n\t\t\tcase CardIds.StormpikeLieutenant:\r\n\t\t\tcase CardIds.StormpikeLieutenantBattlegrounds:\r\n\t\t\tcase CardIds.VanndarStormpike_LeadTheStormpikes:\r\n\t\t\t\treturn 2;\r\n\t\t\tcase CardIds.BuddingGreenthumb:\r\n\t\t\tcase CardIds.BuddingGreenthumbBattlegrounds:\r\n\t\t\t// case CardIds.FrostwolfLieutenant:\r\n\t\t\t// case CardIds.FrostwolfLieutenantBattlegrounds:\r\n\t\t\tcase CardIds.PashmarTheVengeful:\r\n\t\t\tcase CardIds.PashmarTheVengefulBattlegrounds:\r\n\t\t\tcase CardIds.WitchwingNestmatron_BG21_038:\r\n\t\t\tcase CardIds.WitchwingNestmatron_BG21_038_G:\r\n\t\t\tcase CardIds.Drekthar_LeadTheFrostwolves:\r\n\t\t\t\treturn 3;\r\n\t\t\tcase CardIds.ImpatientDoomsayer:\r\n\t\t\tcase CardIds.ImpatientDoomsayerBattlegrounds:\r\n\t\t\tcase CardIds.Sisefin_BG21_009:\r\n\t\t\tcase CardIds.Sisefin_BG21_009_G:\r\n\t\t\tcase CardIds.TonyTwoTusk_BG21_031:\r\n\t\t\tcase CardIds.TonyTwoTusk_BG21_031_G:\r\n\t\t\tcase CardIds.Onyxia_Broodmother:\r\n\t\t\t\treturn 4;\r\n\t\t}\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tpublic getTavernLevel(cardId: string): number {\r\n\t\treturn this.allCards.getCard(cardId).techLevel ?? 1;\r\n\t}\r\n\r\n\tpublic getRandomMinionForTavernTier(tavernTier: number): string {\r\n\t\t// Tzvern tier can be undefined for hero-power specific tokens, like the Amalgam, or when\r\n\t\t// for some reason tokens end up in the shop. For now, defaulting to 1 for tavern\r\n\t\t// level seems to work in all cases\r\n\t\tconst minionsForTier = this.minionsForTier[tavernTier ?? 1];\r\n\t\tif (!minionsForTier?.length) {\r\n\t\t\tconsole.error('incorrect minions for tier', tavernTier, this.minionsForTier, minionsForTier);\r\n\t\t}\r\n\t\treturn pickRandom(this.minionsForTier[tavernTier ?? 1])?.id;\r\n\t}\r\n\r\n\tprivate isGolden(card: ReferenceCard): boolean {\r\n\t\treturn !!card.battlegroundsNormalDbfId;\r\n\t}\r\n\r\n\tprivate isValidTribe(validTribes: readonly Race[], cardRaces: readonly string[]): boolean {\r\n\t\t// Blank races are always ok\r\n\t\tif (!cardRaces?.length) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn cardRaces\r\n\t\t\t.map((race) => getRaceEnum(race))\r\n\t\t\t.some((raceEnum) => raceEnum === Race.ALL || !validTribes?.length || validTribes.includes(raceEnum));\r\n\t}\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attack.js","sourceRoot":"","sources":["../../src/simulation/attack.ts"],"names":[],"mappings":";;;AACA,iEAA8E;AAI9E,6CAAgE;AAChE,gEAA2D;AAC3D,oCAckB;AAClB,+DAA4E;AAC5E,qCAA8C;AAC9C,+DAAiI;AACjI,6DAAkH;AAClH,qCAAuC;AACvC,yEAAmE;AAGnE,uDAAiD;AAG1C,MAAM,cAAc,GAAG,CAC7B,cAA6B,EAC7B,kBAAmC,EACnC,cAA6B,EAC7B,kBAAmC,EACnC,oBAA4B,EAC5B,QAAyB,EACzB,MAAiB,EACjB,WAAwB,EACxB,SAAoB,EACpB,yBAAkC,EACzB,EAAE;IACX,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;QAC/D,OAAO;KACP;IAED,MAAM,eAAe,GACpB,yBAAyB,IAAI,IAAI;QAChC,CAAC,CAAC,cAAc,CAAC,yBAAyB,CAAC;QAC3C,CAAC,CAAC,kBAAkB,CAAC,cAAc,EAAE,oBAAoB,CAAC,CAAC;IAC7D,MAAM,oBAAoB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,QAAQ,CAAC,CAAC;IACtG,IAAI,eAAe,EAAE;QACpB,eAAe,CAAC,SAAS,GAAG,IAAI,CAAC;QAEjC,MAAM,eAAe,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YAEzC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;gBAC/D,OAAO;aACP;YAED,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,KAAK,eAAe,CAAC,QAAQ,CAAC,EAAE;gBAClF,0BAAkB,CAAC,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;gBACzE,MAAM,eAAe,GAAgB,0BAAkB,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;gBAEzF,IAAI,eAAe,EAAE;oBAOpB,SAAS,CAAC,cAAc,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;oBAC3F,iCAAyB,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACjG,aAAa,CACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,CACT,CAAC;oBACF,uBAAuB,CAAC,eAAe,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;oBAClG,IACC,eAAe,CAAC,MAAM,GAAG,CAAC;wBAC1B,CAAC,eAAe,CAAC,cAAc;wBAC/B,CAAC,eAAe,CAAC,MAAM,cAAqB,IAAI,eAAe,CAAC,MAAM,sBAAkC,CAAC,EACxG;wBACD,eAAe,CAAC,iBAAiB,GAAG,IAAI,CAAC;wBACzC,IAAI,eAAe,CAAC,iBAAiB,EAAE;4BACtC,sBAAc,CACb,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,CACT,CAAC;yBACF;qBACD;iBAMD;qBAAM;oBAEN,eAAe,CAAC,iBAAiB,GAAG,KAAK,CAAC;iBAC1C;aACD;SACD;QACD,eAAe,CAAC,SAAS,GAAG,KAAK,CAAC;KAClC;IAED,OAAO,oBAAoB,CAAC;AAC7B,CAAC,CAAC;AA5FW,QAAA,cAAc,kBA4FzB;AAEF,MAAM,uBAAuB,GAAG,CAC/B,eAA4B,EAC5B,cAA6B,EAC7B,kBAAmC,EACnC,QAAyB,EACzB,SAAoB,EACb,EAAE;;IACT,IAAI,eAAe,CAAC,MAAM,eAA4B,IAAI,eAAe,CAAC,MAAM,iBAA8B,EAAE;QAC/G,sBAAc,CAAC,kBAAkB,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,aAAmB,CAAC;KAC7F;SAAM,IAAI,eAAe,CAAC,MAAM,eAA0B,IAAI,eAAe,CAAC,MAAM,iBAA4B,EAAE;QAClH,MAAM,QAAQ,GAAG,eAAe,CAAC,MAAM,iBAA4B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5E,qCAA6B,CAAC,eAAe,EAAE,cAAc,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;KAChH;SAEI,UAAI,eAAe,CAAC,eAAe,0CAAE,QAAQ,kBAA4C;QAC7F,eAAe,CAAC,cAAc,GAAG,IAAI,CAAC;KACtC;IACD,cAAc;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,wBAAC,CAAC,CAAC,eAAe,0CAAE,QAAQ,iBAAkC,CAAC;SAC5E,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACd,oBAAY,CAAC,CAAC,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QAC7C,wBAAgB,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEJ,eAAe,CAAC,OAAO,GAAG,KAAK,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CACrB,eAA4B,EAC5B,eAA4B,EAC5B,cAA6B,EAC7B,kBAAmC,EACnC,cAA6B,EAC7B,kBAAmC,EACnC,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IACT,IAAI,uBAAe,CAAC,eAAe,EAAE,qBAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;QAC5D,MAAM,QAAQ,GAAG,cAAc;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,eAAe,CAAC,QAAQ,CAAC;aACtD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAuC,IAAI,CAAC,CAAC,MAAM,iBAAyC,CAAC,CAAC;QACtH,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5B,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;YACxE,yBAAiB,CAChB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,OAAO,EACP,OAAO,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/D,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;QACH,CAAC,CAAC,CAAC;KACH;IACD,IAAI,eAAe,CAAC,MAAM,eAA+B,IAAI,eAAe,CAAC,MAAM,iBAAmC,EAAE;QACvH,MAAM,OAAO,GAAG,CAAC,eAAe,EAAE,GAAG,qBAAa,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;QACrF,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAErF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;YACpC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC1B,SAAS,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;gBACvE,yBAAiB,CAChB,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,CAAC,EACD,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;YACH,CAAC,CAAC,CAAC;SACH;KACD;IAED,IAAI,0BAA0D,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAiB,CAAC,EAAE;QAC3G,MAAM,MAAM,GAAG,kCAAa,CAC3B,eAAe,CAAC,MAAM,iBAAiC,CAAC,CAAC,gBAAgC,CAAC,aAAiC,EAC3H,CAAC,EACD,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,IAAI,EACJ,IAAI,CACJ,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;YACtB,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAC5D,MAAM,YAAY,GAAG,2BAAmB,CACvC,MAAM,EACN,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;YACF,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE;gBACvC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE;oBAClE,aAAa,CACZ,WAAW,EACX,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;iBACF;aACD;SACD;KACD;IAGD,MAAM,yBAAyB,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;IAChG,IAAI,yBAAyB,EAAE;QAC9B,IAAI,CAAC,eAAe,CAAC,uBAAuB,IAAI,eAAe,CAAC,uBAAuB,IAAI,CAAC,EAAE;YAC7F,oBAAY,CACX,eAAe,EACf,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;SACF;QACD,oBAAY,CACX,eAAe,EACf,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;QAGF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,YAAY,EAAE;YAC/D,0BAAkB,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;SACrE;QACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,YAAY,EAAE;YAC/D,0BAAkB,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;SACrE;KACD;IAED,IAAI,eAAe,CAAC,MAAM,EAAE;QAC3B,MAAM,kBAAkB,GAA2B,qBAAa,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAClG,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE;YAC3C,oBAAY,CACX,SAAS,EACT,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;YAGF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,YAAY,EAAE;gBACzD,0BAAkB,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;aAC/D;SACD;KACD;IACD,IACC,CAAC,eAAe,CAAC,MAAM,IAAI,CAAC,IAAI,eAAe,CAAC,cAAc,CAAC;QAC/D,CAAC,eAAe,CAAC,MAAM,cAA8B,IAAI,eAAe,CAAC,MAAM,sBAA2C,CAAC,EAC1H;QACD,MAAM,YAAY,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC;QAC7C,MAAM,UAAU,GAAG,qBAAa,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;QAElE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,IAAI,eAAe,CAAC,MAAM,cAA8B,EAAE;gBACzD,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;gBAC/E,yBAAiB,CAChB,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,eAAe,CAAC,oBAAoB,EACpC,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;aACF;iBAAM;gBACN,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAChC,yBAAiB,CAChB,SAAS,EACT,cAAc,EACd,kBAAkB,EAClB,eAAe,CAAC,oBAAoB,EACpC,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CACD,CAAC;aACF;SACD;KACD;IAKD,IAAI,eAAe,CAAC,MAAM,cAA2B,EAAE;QACtD,wBAAwB,CACvB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,IAAI,CACJ,CAAC;KACF;SAAM,IAAI,eAAe,CAAC,MAAM,sBAAwC,EAAE;QAC1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,wBAAwB,CACvB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,IAAI,CACJ,CAAC;SACF;KACD;IAED,eAAe,CAAC,iBAAiB,GAAG,KAAK,CAAC;IAC1C,IAAI,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,uBAA8C,CAAC,EAAE;QACrG,eAAe,CAAC,cAAc,GAAG,IAAI,CAAC;KACtC;IACD,0BAAkB,CAAC,cAAc,EAAE,kBAAkB,EAAE,cAAc,EAAE,kBAAkB,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IACxI,eAAe,CAAC,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,uBAAuB,GAAG,CAAC,CAAC,CAAC;AACpG,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAG,CAChC,YAAyB,EACzB,cAA6B,EAC7B,kBAAmC,EACnC,cAA6B,EAC7B,kBAAmC,EACnC,QAAyB,EACzB,MAAiB,EACjB,WAAwB,EACxB,SAAoB,EACpB,aAAa,GAAG,KAAK,EACd,EAAE;IACT,MAAM,iBAAiB,GAAG,cAAc;SACtC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,QAAQ,KAAK,YAAY,CAAC,QAAQ,CAAC;SAC/E,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;;QAClB,IAAI,mBAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,EAAE;YAChE,OAAO,IAAI,CAAC;SACZ;QACD,UAAI,MAAM,CAAC,sBAAsB,0CAAE,MAAM,EAAE;YAC1C,OAAO,IAAI,CAAC;SACZ;QACD,IACC,MAAM,CAAC,YAAY;YACnB,MAAM,CAAC,YAAY;iBACjB,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC;iBACxC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE,CAAC,uCAAiB,CAAC,QAAQ,CAAC,aAAwB,CAAC,CAAC,EAC9E;YACD,OAAO,IAAI,CAAC;SACZ;QACD,OAAO,KAAK,CAAC;IACd,CAAC,CAAC,CAAC;IACJ,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE;QACnC,OAAO;KACP;IACD,MAAM,YAAY,GAAG,kBAAU,CAAC,iBAAiB,CAAC,CAAC;IACnD,IAAI,EAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,CAAA,EAAE;QAC1B,OAAO,CAAC,KAAK,CACZ,oDAAoD,EACpD,2BAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC,EAC3C,YAAY,EACZ,iBAAiB,CAAC,MAAM,EACxB,uBAAe,CAAC,iBAAiB,EAAE,QAAQ,CAAC,EAC5C,uBAAe,CAAC,cAAc,EAAE,QAAQ,CAAC,EACzC,aAAa,EACb,2BAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAC3C,CAAC;KACF;IACD,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1F,gCAAgC,CAC/B,cAAc,EACd,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,EAAE,EACF,QAAQ,EACR,MAAM,EACN,WAAW,EACX,SAAS,CACT,CAAC;AAcH,CAAC,CAAC;AAEF,MAAM,kBAAkB,GAAG,CAAC,cAA6B,EAAE,iBAAyB,EAAe,EAAE;IACpG,IAAI,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,wBAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE;QAChC,OAAO,IAAI,CAAC;KACZ;IAED,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE;QAC9D,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;KAC7E;IAKD,IAAI,iBAAiB,IAAI,IAAI,IAAI,iBAAiB,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;QAE/E,MAAM,UAAU,GAAG,cAAc,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC3D,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YAC1B,cAAc,GAAG,UAAU,CAAC;SAC5B;KACD;IAED,IAAI,eAAe,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,kBAAkB,GAAW,eAAe,CAAC,gBAAgB,IAAI,CAAC,CAAC;IACvE,KAAK,MAAM,MAAM,IAAI,cAAc,EAAE;QACpC,IAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,kBAAkB,EAAE;YACxD,eAAe,GAAG,MAAM,CAAC;YACzB,kBAAkB,GAAG,MAAM,CAAC,gBAAgB,CAAC;SAC7C;KACD;IAED,IAAI,CAAC,eAAe,CAAC,iBAAiB,EAAE;QACvC,eAAe,CAAC,gBAAgB,GAAG,CAAC,eAAe,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;KAC/E;IACD,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,CACjC,cAA6B,EAC7B,MAAmB,EACnB,oBAA4B,EAC5B,cAA6B,EAC7B,eAAuB,EACP,EAAE;IAClB,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;QAE9B,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,GAAG,oBAAoB,GAAG,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,aAAa,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAExF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;YACzC,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,cAAc,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAE3H,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;gBAC5B,MAAM;aACN;YAED,MAAM,YAAY,GAAG,uBAAe,CAAC,CAAC,CAAc,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC;YACnH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;iBACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;iBACd,IAAI,EAAE,CAAC;YACT,MAAM,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;YACrC,IAAI,eAAe,IAAI,IAAI,EAAE;gBAC5B,MAAM,MAAM,GAAG,kBAAU,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;aACpB;SACD;KACD;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC,CAAC;AAhCW,QAAA,kBAAkB,sBAgC7B;AAEK,MAAM,aAAa,GAAG,CAAC,KAAoB,EAAE,MAAmB,EAAE,wBAAiC,EAA0B,EAAE;IACrI,MAAM,UAAU,GAAG,EAAE,CAAC;IACtB,IAAI,wBAAwB,IAAI,IAAI,EAAE;QAErC,MAAM,mBAAmB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,CAAC,CAAC;QAC9E,MAAM,cAAc,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClD,IAAI,cAAc,EAAE;YACnB,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAChC;QAED,MAAM,kBAAkB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,GAAG,wBAAwB,CAAC;QACvE,MAAM,aAAa,GAAG,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAChD,IAAI,aAAa,EAAE;YAClB,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAC/B;KACD;SAAM;QACN,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACpE,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,EAAE;YACnB,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;SAClC;QAED,IAAI,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE;YAC7B,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;SAClC;KACD;IACD,OAAO,UAAU,CAAC;AACnB,CAAC,CAAC;AA1BW,QAAA,aAAa,iBA0BxB;AAEK,MAAM,uBAAuB,GAAG,CACtC,gBAA+B,EAC/B,oBAAqC,EACrC,YAAyB,EACzB,MAAc,EACd,qBAAoC,EACpC,yBAA0C,EAC1C,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IACT,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;QAClC,OAAO;KACP;IACD,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IACvF,MAAM,eAAe,GAAgB,kBAAU,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,eAAe,EAAE;QACpB,SAAS,CAAC,mBAAmB,CAAC,YAAY,EAAE,eAAe,EAAE,gBAAgB,CAAC,CAAC;QAC/E,yBAAiB,CAChB,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,MAAM,EACN,qBAAqB,EACrB,yBAAyB,EACzB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;AACF,CAAC,CAAC;AAjCW,QAAA,uBAAuB,2BAiClC;AAEK,MAAM,iBAAiB,GAAG,CAChC,eAA4B,EAC5B,cAA6B,EAC7B,kBAAmC,EACnC,YAAyB,EACzB,MAAc,EACd,qBAAoC,EACpC,yBAA0C,EAC1C,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACX,EAAE;IAEX,IAAI,CAAC,eAAe,EAAE;QACrB,OAAO,CAAC,CAAC;KACT;IAED,MAAM,kBAAkB,GAAG,eAAe,CAAC,cAAc,IAAI,eAAe,CAAC,MAAM,IAAI,CAAC,CAAC;IAIzF,MAAM,YAAY,GAAG;QACpB,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC;QACvB,QAAQ,EAAE,CAAC,CAAC;QACZ,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,IAAI;KACA,CAAC;IACjB,MAAM,gBAAgB,GAAG,oBAAY,CACpC,eAAe,EACf,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;IAGF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,eAAe,CAAC,YAAY,EAAE;QAC5D,0BAAkB,CAAC,eAAe,EAAE,cAAc,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;KACrE;IACD,IAAI,CAAC,kBAAkB,IAAI,gBAAgB,GAAG,CAAC,EAAE;QAChD,eAAe,CAAC,oBAAoB,GAAG,YAAY,CAAC;KACpD;IACD,MAAM,oBAAoB,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IAC/G,cAAc,CAAC,oBAAoB,CAAC,GAAG,eAAe,CAAC;IACvD,OAAO,gBAAgB,CAAC;AACzB,CAAC,CAAC;AAnDW,QAAA,iBAAiB,qBAmD5B;AAEK,MAAM,kBAAkB,GAAG,CAAC,cAA6B,EAAE,eAA4B,EAAE,YAAY,GAAG,KAAK,EAAe,EAAE;IACpI,IAAI,iBAAyC,CAAC;IAC9C,IAAI,eAAe,CAAC,MAAM,cAAwB,IAAI,eAAe,CAAC,MAAM,sBAAqC,EAAE;QAClH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7E,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;KACnF;SAAM;QACN,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7D,IAAI,CAAC,YAAY,EAAE;YAClB,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAClE,iBAAiB,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC;SACnE;KACD;IACD,IAAI,cAAc,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,IAAI,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,EAAE;QAC1B,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CACrC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,cAAuC,IAAI,MAAM,CAAC,MAAM,sBAA4C,CAC7H,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACxB,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;SACvE;KACD;IACD,OAAO,cAAc,CAAC;AACvB,CAAC,CAAC;AAtBW,QAAA,kBAAkB,sBAsB7B;AAEK,MAAM,YAAY,GAAG,CAC3B,MAAmB,EACnB,QAAqB,EACrB,WAA0B,EAC1B,eAAgC,EAChC,UAAyB,EACzB,SAA0B,EAC1B,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACX,EAAE;IAEX,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QAC1B,OAAO,CAAC,CAAC;KACT;IAED,IAAI,MAAM,CAAC,YAAY,EAAE;QAExB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,cAAoC,EAAE;gBAC9D,oBAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACvD,wBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACxD,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;aAC3E;iBAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,sBAAyC,EAAE;gBAC1E,oBAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACvD,wBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACxD,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;aAC3E;iBAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,cAA6B,EAAE;gBAC9D,oBAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACvD,oBAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACvD,wBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACxD,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;aAC3E;iBAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,sBAA0C,EAAE;gBAC3E,oBAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACvD,oBAAY,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACvD,wBAAgB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;gBACxD,SAAS,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC;aAC3E;iBAAM,IACN,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;gBAC3C,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,eAAyB,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,iBAAsC,CAAC,EAC9G;gBACD,0BAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;aAChE;iBAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,eAAiC,EAAE;gBAClE,sBAAc,CAAC,eAAe,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,aAAmB,CAAC;aACvF;iBAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,iBAAmC,EAAE;gBACpE,sBAAc,CAAC,eAAe,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,aAAmB,CAAC;aACvF;SAMD;QACD,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,eAAsB,CAAC,CAAC;QACvF,MAAM,sBAAsB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,iBAAmC,CAAC,CAAC;QAChH,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC/C,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC/C,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QACH,sBAAsB,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACtC,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC/C,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;YAC/C,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;KAET;IACD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC;IAEjF,IAAI,MAAM,CAAC,MAAM,iBAAiC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QAC5E,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;KAC7B;SAAM,IAAI,MAAM,CAAC,MAAM,mBAAmC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;QACrF,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;KAC7B;IAGD,IAAI,QAAQ,CAAC,SAAS,EAAE;QAGvB,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC;KAE7B;IAGD,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC/G,MAAM,CAAC,oBAAoB,GAAG,QAAQ,CAAC;IACvC,IAAI,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE;QACzE,oBAAW,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;QAC/F,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;KAC5B;IAMD,MAAM,YAAY,GAAG,uBAAuB,CAC3C,MAAM,EACN,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;IACF,IAAI,CAAC,EAAC,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,CAAA,EAAE;QAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC1E,uCAAiB,CAAC,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;QAClH,SAAS,CAAC,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;KAClE;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC;AACxB,CAAC,CAAC;AApHW,QAAA,YAAY,gBAoHvB;AAEF,MAAM,uBAAuB,GAAG,CAC/B,MAAmB,EACnB,WAA0B,EAC1B,eAAgC,EAChC,UAAyB,EACzB,SAA0B,EAC1B,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACK,EAAE;IAC3B,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;QAC7B,OAAO,IAAI,CAAC;KACZ;IAED,IAAI,MAAM,CAAC,MAAM,cAAwB,EAAE;QAC1C,OAAO,kCAAa,aAEnB,CAAC,EACD,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,IAAI,CACJ,CAAC;KACF;SAAM,IAAI,MAAM,CAAC,MAAM,sBAAqC,EAAE;QAC9D,OAAO,kCAAa,qBAEnB,CAAC,EACD,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,IAAI,CACJ,CAAC;KACF;SAAM,IAAI,MAAM,CAAC,MAAM,cAAoB,EAAE;QAC7C,OAAO,kCAAa,CACnB,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EACnF,CAAC,EACD,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,IAAI,CACJ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;KAChD;SAAM,IAAI,MAAM,CAAC,MAAM,sBAAiC,EAAE;QAC1D,OAAO,kCAAa,CACnB,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,EACnF,CAAC,EACD,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,IAAI,CACJ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;KAChD;SAAM,IAAI,MAAM,CAAC,MAAM,cAA0B,EAAE;QACnD,OAAO,kCAAa,aAEnB,CAAC,EACD,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,IAAI,CACJ,CAAC;KACF;SAAM,IAAI,MAAM,CAAC,MAAM,sBAAuC,EAAE;QAChE,OAAO,kCAAa,qBAEnB,CAAC,EACD,WAAW,EACX,eAAe,EACf,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,MAAM,CAAC,QAAQ,EACf,IAAI,CACJ,CAAC;KACF;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,CACjC,MAAqB,EACrB,UAA2B,EAC3B,MAAqB,EACrB,UAA2B,EAC3B,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IAET,MAAM,CAAC,4BAA4B,EAAE,aAAa,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClG,MAAM,CAAC,4BAA4B,EAAE,aAAa,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAClG,SAAS,CAAC,oBAAoB,CAC7B,4BAA4B,EAC5B,aAAa,EACb,MAAM,EACN,4BAA4B,EAC5B,aAAa,EACb,MAAM,CACN,CAAC;IAEF,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;QAC7D,OAAO;KAEP;IAED,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAC1C,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,CAAC;IAC1C,UAAU,CAAC,UAAU,CAAC,0BAA0B;QAC/C,UAAU,CAAC,UAAU,CAAC,0BAA0B;YAChD,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAA0B,IAAI,CAAC,CAAC,MAAM,iBAAuC,CAAC,CAAC,MAAM,CAAC;IAC3H,UAAU,CAAC,UAAU,CAAC,0BAA0B;QAC/C,UAAU,CAAC,UAAU,CAAC,0BAA0B;YAChD,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAA0B,IAAI,CAAC,CAAC,MAAM,iBAAuC,CAAC,CAAC,MAAM,CAAC;IAG3H,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QAExB,+BAA+B,CAC9B,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;QAEF,+BAA+B,CAC9B,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;SAAM;QACN,+BAA+B,CAC9B,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;QACF,+BAA+B,CAC9B,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;IAGD,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE;QAExB,yBAAyB,CACxB,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;QAEF,yBAAyB,CACxB,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;SAAM;QACN,yBAAyB,CACxB,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;QACF,yBAAyB,CACxB,MAAM,EACN,UAAU,EACV,MAAM,EACN,UAAU,EACV,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;IAGD,MAAM;SACJ,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAM,CAAC,MAAM,CAAC,CAAC;SAClC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,0CAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IACrG,MAAM;SACJ,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAM,CAAC,MAAM,CAAC,CAAC;SAClC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,0CAAoB,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IAErG,MAAM;SACJ,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,0BAAwB,IAAI,MAAM,CAAC,MAAM,4BAAqC,CAAC;SAC/G,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,sCAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjF,MAAM;SACJ,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,0BAAwB,IAAI,MAAM,CAAC,MAAM,4BAAqC,CAAC;SAC/G,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,sCAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IASjF,0BAAkB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IAGxG,wBAAwB,CACvB,MAAM,EACN,aAAa,EACb,UAAU,EACV,MAAM,EACN,aAAa,EACb,UAAU,EACV,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;AACH,CAAC,CAAC;AAvLW,QAAA,kBAAkB,sBAuL7B;AAEF,MAAM,wBAAwB,GAAG,CAChC,MAAqB,EACrB,aAA4B,EAC5B,WAA4B,EAC5B,MAAqB,EACrB,aAA4B,EAC5B,WAA4B,EAC5B,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACnB,EAAE;IACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC;IACnC,gCAAgC,CAC/B,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACxB,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EACtC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAClC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACxB,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EACtC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EAClC,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;IACF,gCAAgC,CAC/B,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACzB,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EACvC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EACnC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EACzB,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,EACvC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,WAAW,EACnC,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gCAAgC,GAAG,CACxC,aAA4B,EAC5B,oBAAmC,EACnC,kBAAmC,EACnC,UAAyB,EACzB,iBAAgC,EAChC,eAAgC,EAChC,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACnB,EAAE;IACH,KAAK,MAAM,UAAU,IAAI,oBAAoB,EAAE;QAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,oBAAoB,CAAC;QAC/C,IAAI,CAAC,MAAM,EAAE;YACZ,SAAS;SACT;QAED,IAAI,MAAM,CAAC,QAAQ,KAAK,UAAU,CAAC,QAAQ,EAAE;YAC5C,IAAI,eAAe,CAAC,WAAW,qBAAiC,EAAE;gBACjE,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC9C,wBAAgB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAE/C,UAAU;qBACR,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,0BAA8B,IAAI,CAAC,CAAC,MAAM,4BAA2C,CAAC;qBAC5G,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;oBACrB,oBAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,4BAA2C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;oBACpH,wBAAgB,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;gBACrD,CAAC,CAAC,CAAC;aACJ;SACD;KACD;AACF,CAAC,CAAC;AAEF,MAAM,+BAA+B,GAAG,CACvC,UAAyB,EACzB,cAA+B,EAC/B,UAAyB,EACzB,cAA+B,EAC/B,0BAA6C,EAC7C,YAAoC,EACpC,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IACT,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,0BAA0B,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,cAAc,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE;YAChD,gCAAgC,CAC/B,UAAU,EACV,cAAc,EACd,MAAM,EACN,cAAc,EACd,UAAU,EACV,cAAc,EACd,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;SACF;aAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YAEjC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;SAEjE;KACD;AAEF,CAAC,CAAC;AAEF,MAAM,yBAAyB,GAAG,CACjC,UAAyB,EACzB,cAA+B,EAC/B,UAAyB,EACzB,cAA+B,EAC/B,0BAA6C,EAC7C,YAAoC,EACpC,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IAET,KAAK,IAAI,CAAC,GAAG,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAChE,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,cAAc,GAAG,0BAA0B,CAAC,CAAC,CAAC,CAAC;QACrD,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,EAAE;YAChD,IAAI,EAAC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,MAAM,CAAA,EAAE;gBACpB,OAAO,CAAC,KAAK,CACZ,sCAAsC,EACtC,2BAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EACrC,MAAM,EACN,cAAc,EACd,0BAA0B,EAC1B,uBAAe,CAAC,UAAU,EAAE,QAAQ,CAAC,CACrC,CAAC;aACF;YAED,2BAA2B,CAC1B,UAAU,EACV,cAAc,EACd,MAAM,EACN,cAAc,EACd,UAAU,EACV,cAAc,EACd,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;SAEF;aAAM,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YAEjC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;SAEjE;KACD;AAEF,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,CACjC,QAAqB,EACrB,cAA6B,EAC7B,QAAyB,EACzB,SAAoB,EACb,EAAE;IACT,IAAI,QAAQ,CAAC,MAAM,cAAkC,EAAE;QAEtD,oBAAY,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;KACxF;IACD,IAAI,QAAQ,CAAC,MAAM,sBAAuC,EAAE;QAC3D,oBAAY,CAAC,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;KACxF;IAGD,IAAI,sBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,qBAAI,CAAC,MAAM,CAAC,EAAE;QACzE,MAAM,SAAS,GAAG,cAAc;aAC9B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,cAA4B,CAAC;aACnD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,cAAc;aAChC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,sBAAyC,CAAC;aAC1E,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAClD,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,oBAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YACpD,oBAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YACpD,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC/B,oBAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YACpD,oBAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YACpD,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;KACH;IAGD,IAAI,sBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,qBAAI,CAAC,MAAM,CAAC,EAAE;QACzE,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,cAA8B,CAAC,CAAC;QACpF,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,sBAA2C,CAAC,CAAC;QAEnG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACxB,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACjC,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBAClD,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBAClD,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1B,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACjC,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBAClD,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;gBAClD,SAAS,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;YAC9D,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;KACH;IACD,IAAI,QAAQ,CAAC,MAAM,eAA4B,IAAI,QAAQ,CAAC,MAAM,iBAAyC,EAAE;QAC5G,cAAc;aACZ,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,qBAAI,CAAC,MAAM,CAAC,CAAC;aAC5E,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,oBAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC5G,oBAAY,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,iBAAyC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC5G,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;KACJ;AACF,CAAC,CAAC;AA/DW,QAAA,kBAAkB,sBA+D7B;AAEK,MAAM,yBAAyB,GAAG,CACxC,cAA2B,EAC3B,cAA2B,EAC3B,cAA6B,EAC7B,QAAyB,EACzB,SAAoB,EACb,EAAE;IACT,IAAI,cAAc,CAAC,KAAK,EAAE;QACzB,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,cAA8B,CAAC,CAAC;QACjG,MAAM,eAAe,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,sBAA2C,CAAC,CAAC;QACpH,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5B,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAClD,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAClD,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QACH,eAAe,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAClC,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAClD,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAClD,SAAS,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,cAA2B,CAAC,CAAC;QACzF,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,sBAAwC,CAAC,CAAC;QAC5G,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACpB,oBAAY,CAAC,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC1D,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;QACH,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YAC1B,oBAAY,CAAC,cAAc,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAC1D,SAAS,CAAC,mBAAmB,CAAC,GAAG,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;QACpE,CAAC,CAAC,CAAC;KACH;IACD,IAAI,cAAc,CAAC,MAAM,cAA+B,EAAE;QACzD,MAAM,UAAU,GAAG,qBAAa,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QACjE,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAClD,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAClD,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;KACH;IACD,IAAI,cAAc,CAAC,MAAM,sBAA4C,EAAE;QACtE,MAAM,UAAU,GAAG,qBAAa,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QACjE,UAAU,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;YAC7B,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAClD,oBAAY,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;YAClD,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC;KACH;IACD,IAAI,cAAc,CAAC,MAAM,eAAsB,IAAI,cAAc,CAAC,MAAM,iBAAmC,EAAE;QAC5G,oBAAY,CAAC,cAAc,EAAE,cAAc,CAAC,MAAM,iBAAmC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC;QACzH,SAAS,CAAC,mBAAmB,CAAC,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;KAC9E;IACD,IAAI,cAAc,CAAC,MAAM,eAAiC,IAAI,cAAc,CAAC,MAAM,iBAA8C,EAAE;QAClI,cAAc,CAAC,KAAK,GAAG,KAAK,CAAC;QAC7B,cAAc,CAAC,MAAM,GAAG,KAAK,CAAC;KAC9B;AACF,CAAC,CAAC;AAxDW,QAAA,yBAAyB,6BAwDpC;AAEF,MAAM,cAAc,GAAG,CAAC,KAAoB,EAAE,QAAyB,EAAE,SAAoB,EAA6B,EAAE;IAE3H,MAAM,0BAA0B,GAAa,EAAE,CAAC;IAChD,MAAM,YAAY,GAAkB,EAAE,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE;YACpD,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACxD,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,gDAAqB,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;YAErD,CAAC,EAAE,CAAC;SACJ;KACD;IAED,MAAM,qBAAqB,GAAG,CAAC,GAAG,0BAA0B,CAAC,CAAC;IAC9D,KAAK,IAAI,CAAC,GAAG,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;QAChE,IAAI,CAAC,KAAK,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE;YAChD,SAAS;SACT;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC,GAAG,0BAA0B,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;YACrF,qBAAqB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACxD;aAAM;YACN,qBAAqB,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;SACpD;KACD;IACD,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;AAC9C,CAAC,CAAC;AA6BF,MAAM,gCAAgC,GAAG,CACxC,qBAAoC,EACpC,yBAA0C,EAC1C,UAAuB,EACvB,yBAAiC,EACjC,aAA4B,EAC5B,iBAAkC,EAClC,sBAA8C,EAC9C,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;;IAOT,IAAI,yBAAyB,IAAI,CAAC,EAAE;QACnC,4CAAsB,CACrB,UAAU,EACV,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;KACF;IACD,MAAM,6BAA6B,GAA2B,iDAA4B,CACzF,UAAU,EACV,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;IAEF,MAAM,wBAAwB,GAA2B,kDAA6B,CACrF,UAAU,EACV,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;IAEF,MAAM,iBAAiB,GAA2B,CAAC,GAAG,6BAA6B,EAAE,GAAG,wBAAwB,CAAC,CAAC;IAClH,2BAAmB,CAClB,iBAAiB,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,UAAU,EACV,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;IAGF,8CAAwB,CACvB,qBAAqB,EACrB,yBAAyB,EACzB,UAAU,EACV,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;IAGF,UAAI,UAAU,CAAC,sBAAsB,0CAAE,MAAM,EAAE;QAC9C,KAAK,MAAM,WAAW,IAAI,UAAU,CAAC,sBAAsB,EAAE;YAC5D,MAAM,eAAe,GAAgB;gBACpC,GAAG,UAAU;gBACb,sBAAsB,EAAE,SAAS;gBACjC,MAAM,EAAE,WAAW,CAAC,MAAM;gBAC1B,YAAY,EAAE;oBACb;wBACC,MAAM,EAAE,WAAW,CAAC,MAAM;wBAC1B,cAAc,EAAE,UAAU,CAAC,QAAQ;wBACnC,OAAO,QAAE,WAAW,CAAC,OAAO,mCAAI,CAAC;wBACjC,MAAM,EAAE,WAAW,CAAC,MAAM;qBAC1B;iBACD;aACD,CAAC;YACF,gCAAgC,CAC/B,qBAAqB,EACrB,yBAAyB,EACzB,eAAe,EACf,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,sBAAsB,EACtB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;SACF;KACD;IAID,2BAAkB,CACjB,UAAU,EACV,yBAAyB,EACzB,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,2BAA2B,GAAG,CACnC,qBAAoC,EACpC,yBAA0C,EAC1C,UAAuB,EACvB,wBAAgC,EAChC,aAA4B,EAC5B,iBAAkC,EAClC,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACb,EAAE;IACT,MAAM,eAAe,GAAG,CAAC,CAAC;IAE1B,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;QACvB,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,2BAAmB,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;KACxG;IACD,IAAI,aAAa,GAAgB,IAAI,CAAC;IAEtC,IAAI,UAAU,CAAC,MAAM,eAA6B,IAAI,UAAU,CAAC,MAAM,iBAA0C,EAAE;QAClH,aAAa,GAAG;YACf,GAAG,UAAU;YACb,MAAM,EAAE,UAAU,CAAC,SAAS;YAC5B,YAAY,EAAE,UAAU,CAAC,eAAe;YACxC,MAAM,EAAE,KAAK;SACb,CAAC;KACF;IACD,MAAM,kBAAkB,GACvB,UAAU,CAAC,MAAM,IAAI,wBAAwB,IAAI,CAAC;QACjD,CAAC,CAAC,kCAAa,CACb,UAAU,CAAC,MAAM,EACjB,eAAe,EACf,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,EACT,UAAU,CAAC,QAAQ,EACnB,KAAK,EACL,IAAI,EACJ,IAAI,EACJ,aAAa,EACb,UAAU,CACT;QACH,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,sBAAsB,GAAG,2BAAmB,CACjD,kBAAkB,EAClB,qBAAqB,EACrB,yBAAyB,EACzB,UAAU,EACV,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EACjB,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;IAEF,MAAM,KAAK,GAAG,qBAAqB;SACjC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,iCAA0D,CAAC;SACjF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,MAAM,WAAW,GAAG,qBAAqB;SACvC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,mCAA4D,CAAC;SACnF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7B,IAAI,KAAK,GAAG,WAAW,GAAG,CAAC,EAAE;QAC5B,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpC,oBAAY,CAAC,CAAC,EAAE,KAAK,GAAG,WAAW,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;YACtE,wBAAgB,CAAC,CAAC,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;QACtD,CAAC,CAAC,CAAC;KACH;IAED,MAAM,+BAA+B,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC/E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,+BAA+B,EAAE,CAAC,EAAE,EAAE;QACzD,qBAAqB;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAA+B,IAAI,CAAC,CAAC,MAAM,iBAA4C,CAAC;aAC9G,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,iBAA4C,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAChF,uBAAe,CAAC,CAAC,EAAE,qBAAqB,EAAE,UAAU,GAAG,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,qBAAI,CAAC,qBAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACnH,CAAC,CAAC,CAAC;QACJ,qBAAqB;aACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,eAAuB,IAAI,CAAC,CAAC,MAAM,iBAAoC,CAAC;aAC9F,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACd,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,iBAAoC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,oBAAY,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;YACjE,oBAAY,CAAC,CAAC,EAAE,UAAU,GAAG,CAAC,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;YACjE,wBAAgB,CAAC,CAAC,EAAE,qBAAqB,EAAE,QAAQ,CAAC,CAAC;YACrD,SAAS,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;KACJ;AACF,CAAC,CAAC;AAEK,MAAM,mBAAmB,GAAG,CAClC,iBAAyC,EACzC,qBAAoC,EACpC,yBAA0C,EAC1C,iBAAgD,EAChD,+BAAuC,EACvC,aAA4B,EAC5B,iBAAkC,EAClC,QAAyB,EACzB,SAAoB,EACpB,WAAwB,EACxB,SAAoB,EACK,EAAE;IAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IACvG,MAAM,eAAe,GAAG,EAAE,CAAC;IAC3B,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE;QAErC,IAAI,qBAAqB,CAAC,MAAM,IAAI,CAAC,EAAE;YACtC,MAAM;SACN;QAKD,MAAM,cAAc,GAAG,qBAAqB,CAAC,MAAM,GAAG,+BAA+B,CAAC;QACtF,sCAAgB,CACf,qBAAqB,EACrB,yBAAyB,EACzB,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,QAAQ,EACR,SAAS,EACT,WAAW,CACX,CAAC;QACF,IAAI,SAAS,CAAC,iBAAiB,EAAE;YAEhC,sBAAc,CACb,qBAAqB,EACrB,yBAAyB,EACzB,aAAa,EACb,iBAAiB,EACjB,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,SAAS,CACT,CAAC;SACF;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE;YACtD,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;SAChC;KACD;IAED,SAAS,CAAC,oBAAoB,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,CAAC,CAAC;IAC1F,OAAO,eAAe,CAAC;AACxB,CAAC,CAAC;AAxDW,QAAA,mBAAmB,uBAwD9B","sourcesContent":["/* eslint-disable @typescript-eslint/no-use-before-define */\r\nimport { AllCardsService, CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { CardsData } from '../cards/cards-data';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { validEnchantments } from '../simulate-bgs-battle';\r\nimport {\r\n\taddCardsInHand,\r\n\taddStatsToBoard,\r\n\tafterStatsUpdate,\r\n\tgrantStatsToMinionsOfEachType,\r\n\thasCorrectTribe,\r\n\thasMechanic,\r\n\tisCorrectTribe,\r\n\tisFish,\r\n\tmodifyAttack,\r\n\tmodifyHealth,\r\n\tstringifySimple,\r\n\tstringifySimpleCard,\r\n\tupdateDivineShield,\r\n} from '../utils';\r\nimport { addMinionsToBoard, addMinionToBoard } from './add-minion-to-board';\r\nimport { applyAvengeEffects } from './avenge';\r\nimport { applyMinionDeathEffect, applyMonstrosity, handleDeathrattleEffects, rememberDeathrattles } from './deathrattle-effects';\r\nimport { spawnEntities, spawnEntitiesFromDeathrattle, spawnEntitiesFromEnchantments } from './deathrattle-spawns';\r\nimport { applyFrenzy } from './frenzy';\r\nimport { removeMinionFromBoard } from './remove-minion-from-board';\r\nimport { SharedState } from './shared-state';\r\nimport { Spectator } from './spectator/spectator';\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\tlastAttackerEntityId: number,\r\n\tallCards: AllCardsService,\r\n\tspawns: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n\tforceAttackingEntityIndex?: number,\r\n): number => {\r\n\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst attackingEntity =\r\n\t\tforceAttackingEntityIndex != null\r\n\t\t\t? attackingBoard[forceAttackingEntityIndex]\r\n\t\t\t: getAttackingEntity(attackingBoard, lastAttackerEntityId);\r\n\tconst attackingEntityIndex = attackingBoard.map((e) => e.entityId).indexOf(attackingEntity?.entityId);\r\n\tif (attackingEntity) {\r\n\t\tattackingEntity.attacking = true;\r\n\t\t// console.log('attack by', stringifySimpleCard(attackingEntity, allCards), stringifySimple(defendingBoard, allCards));\r\n\t\tconst numberOfAttacks = attackingEntity.megaWindfury ? 4 : 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\treturn;\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\tapplyOnAttackBuffs(attackingEntity, attackingBoard, allCards, spectator);\r\n\t\t\t\tconst defendingEntity: BoardEntity = 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) {\r\n\t\t\t\t\t// console.log(\r\n\t\t\t\t\t// \t'AATTTTTTTTTTTAAAAAAAAAAAAAAAAAACK by',\r\n\t\t\t\t\t// \tstringifySimpleCard(attackingEntity, allCards),\r\n\t\t\t\t\t// \tstringifySimpleCard(defendingEntity, allCards),\r\n\t\t\t\t\t// \tstringifySimple(attackingBoard, allCards),\r\n\t\t\t\t\t// );\r\n\t\t\t\t\tspectator.registerAttack(attackingEntity, defendingEntity, attackingBoard, defendingBoard);\r\n\t\t\t\t\tapplyOnBeingAttackedBuffs(attackingEntity, defendingEntity, defendingBoard, allCards, spectator);\r\n\t\t\t\t\tperformAttack(\r\n\t\t\t\t\t\tattackingEntity,\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\tallCards,\r\n\t\t\t\t\t\tspawns,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tapplyAfterAttackEffects(attackingEntity, attackingBoard, attackingBoardHero, allCards, spectator);\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tdefendingEntity.health > 0 &&\r\n\t\t\t\t\t\t!defendingEntity.definitelyDead &&\r\n\t\t\t\t\t\t(defendingEntity.cardId === CardIds.YoHoOgre || defendingEntity.cardId === CardIds.YoHoOgreBattlegrounds)\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tdefendingEntity.attackImmediately = true;\r\n\t\t\t\t\t\tif (defendingEntity.attackImmediately) {\r\n\t\t\t\t\t\t\tsimulateAttack(\r\n\t\t\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\t\tspawns,\r\n\t\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// console.log(\r\n\t\t\t\t\t// \t'after attack by',\r\n\t\t\t\t\t// \tstringifySimpleCard(attackingEntity, allCards),\r\n\t\t\t\t\t// \tstringifySimpleCard(defendingEntity, allCards),\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\tattackingEntity.attacking = false;\r\n\t}\r\n\t// If entities that were before the attacker died, we need to update the attacker index\r\n\treturn attackingEntityIndex;\r\n};\r\n\r\nconst applyAfterAttackEffects = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (attackingEntity.cardId === CardIds.Bonker_BG20_104 || attackingEntity.cardId === CardIds.Bonker_BG20_104_G) {\r\n\t\taddCardsInHand(attackingBoardHero, 1, attackingBoard, allCards, spectator, CardIds.BloodGem);\r\n\t} else if (attackingEntity.cardId === CardIds.Yrel_BG23_350 || attackingEntity.cardId === CardIds.Yrel_BG23_350_G) {\r\n\t\tconst modifier = attackingEntity.cardId === CardIds.Yrel_BG23_350_G ? 2 : 1;\r\n\t\tgrantStatsToMinionsOfEachType(attackingEntity, attackingBoard, modifier * 1, modifier * 2, allCards, spectator);\r\n\t}\r\n\t// Putricide-only\r\n\telse if (attackingEntity.additionalCards?.includes(CardIds.IncorporealCorporal_BG26_RLK_117)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\tattackingBoard\r\n\t\t.filter((e) => e.additionalCards?.includes(CardIds.FesterootHulk_BG_GIL_655))\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyAttack(e, 1, attackingBoard, allCards);\r\n\t\t\tafterStatsUpdate(e, attackingBoard, allCards);\r\n\t\t});\r\n\r\n\tattackingEntity.stealth = false;\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (hasCorrectTribe(attackingEntity, Race.DRAGON, allCards)) {\r\n\t\tconst prestors = attackingBoard\r\n\t\t\t.filter((e) => e.entityId !== attackingEntity.entityId)\r\n\t\t\t.filter((e) => e.cardId === CardIds.PrestorsPyrospawn_BG21_012 || e.cardId === CardIds.PrestorsPyrospawn_BG21_012_G);\r\n\t\tprestors.forEach((prestor) => {\r\n\t\t\tspectator.registerPowerTarget(prestor, defendingEntity, defendingBoard);\r\n\t\t\tdealDamageToEnemy(\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\tif (attackingEntity.cardId === CardIds.Atramedes_BG23_362 || attackingEntity.cardId === CardIds.AtramedesBattlegrounds) {\r\n\t\tconst targets = [defendingEntity, ...getNeighbours(defendingBoard, defendingEntity)];\r\n\t\tconst multiplier = attackingEntity.cardId === CardIds.AtramedesBattlegrounds ? 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\tspectator.registerPowerTarget(attackingEntity, target, defendingBoard);\r\n\t\t\t\tdealDamageToEnemy(\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\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\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 ? CardIds.DevilsaurBattlegrounds : 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\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\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\tallCards,\r\n\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\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\tif (defenderAliveBeforeAttack) {\r\n\t\tif (!attackingEntity.immuneWhenAttackCharges || attackingEntity.immuneWhenAttackCharges <= 0) {\r\n\t\t\tbumpEntities(\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t}\r\n\t\tbumpEntities(\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\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\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\tif (defendingEntity.attack > 0 && attackingEntity.divineShield) {\r\n\t\t\tupdateDivineShield(attackingEntity, attackingBoard, false, allCards);\r\n\t\t}\r\n\t\tif (attackingEntity.attack > 0 && defendingEntity.divineShield) {\r\n\t\t\tupdateDivineShield(defendingEntity, defendingBoard, false, allCards);\r\n\t\t}\r\n\t}\r\n\t// Cleave\r\n\tif (attackingEntity.cleave) {\r\n\t\tconst defenderNeighbours: readonly BoardEntity[] = getNeighbours(defendingBoard, defendingEntity);\r\n\t\tfor (const neighbour of defenderNeighbours) {\r\n\t\t\tbumpEntities(\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\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, false, allCards);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (\r\n\t\t(defendingEntity.health <= 0 || defendingEntity.definitelyDead) &&\r\n\t\t(attackingEntity.cardId === CardIds.WildfireElemental || attackingEntity.cardId === CardIds.WildfireElementalBattlegrounds)\r\n\t) {\r\n\t\tconst excessDamage = -defendingEntity.health;\r\n\t\tconst neighbours = getNeighbours(defendingBoard, defendingEntity);\r\n\t\t// console.log('neighbours', stringifySimple(neighbours, allCards));\r\n\t\tif (neighbours.length > 0) {\r\n\t\t\tif (attackingEntity.cardId === CardIds.WildfireElemental) {\r\n\t\t\t\tconst randomTarget = neighbours[Math.floor(Math.random() * neighbours.length)];\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\trandomTarget,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tdefendingEntity.lastAffectedByEntity,\r\n\t\t\t\t\texcessDamage,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tneighbours.forEach((neighbour) =>\r\n\t\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\t\tneighbour,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tdefendingEntity.lastAffectedByEntity,\r\n\t\t\t\t\t\texcessDamage,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\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// After attack hooks\r\n\t// Arcane Cannon\r\n\t// Monstrous Macaw\r\n\tif (attackingEntity.cardId === CardIds.MonstrousMacaw) {\r\n\t\ttriggerRandomDeathrattle(\r\n\t\t\tattackingEntity,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t} else if (attackingEntity.cardId === CardIds.MonstrousMacawBattlegrounds) {\r\n\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\ttriggerRandomDeathrattle(\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t\ttrue,\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\tprocessMinionDeath(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, allCards, cardsData, sharedState, spectator);\r\n\tattackingEntity.immuneWhenAttackCharges = Math.max(0, attackingEntity.immuneWhenAttackCharges - 1);\r\n};\r\n\r\nconst triggerRandomDeathrattle = (\r\n\tsourceEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tspawns: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst validDeathrattles = attackingBoard\r\n\t\t.filter((entity) => !excludeSource || entity.entityId !== sourceEntity.entityId)\r\n\t\t.filter((entity) => {\r\n\t\t\tif (hasMechanic(allCards.getCard(entity.cardId), 'DEATHRATTLE')) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (entity.rememberedDeathrattles?.length) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tentity.enchantments &&\r\n\t\t\t\tentity.enchantments\r\n\t\t\t\t\t.map((enchantment) => enchantment.cardId)\r\n\t\t\t\t\t.some((enchantmentId) => validEnchantments.includes(enchantmentId as CardIds))\r\n\t\t\t) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t});\r\n\tif (validDeathrattles.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\tconst targetEntity = pickRandom(validDeathrattles);\r\n\tif (!targetEntity?.cardId) {\r\n\t\tconsole.error(\r\n\t\t\t'missing card id when triggering random deathrattle',\r\n\t\t\tstringifySimpleCard(targetEntity, allCards),\r\n\t\t\ttargetEntity,\r\n\t\t\tvalidDeathrattles.length,\r\n\t\t\tstringifySimple(validDeathrattles, allCards),\r\n\t\t\tstringifySimple(attackingBoard, allCards),\r\n\t\t\texcludeSource,\r\n\t\t\tstringifySimpleCard(sourceEntity, allCards),\r\n\t\t);\r\n\t}\r\n\tspectator.registerPowerTarget(sourceEntity, targetEntity, attackingBoard);\r\n\tconst indexFromRight = attackingBoard.length - (attackingBoard.indexOf(targetEntity) + 1);\r\n\tbuildBoardAfterDeathrattleSpawns(\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\ttargetEntity,\r\n\t\tindexFromRight,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\t[],\r\n\t\tallCards,\r\n\t\tspawns,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\t// The reborn minion spawns to the right of the DR spawns\r\n\t// buildBoardAfterRebornSpawns(\r\n\t// \tattackingBoard,\r\n\t// \tattackingBoardHero,\r\n\t// \ttargetEntity,\r\n\t// \tindexFromRight,\r\n\t// \tdefendingBoard,\r\n\t// \tdefendingBoardHero,\r\n\t// \tallCards,\r\n\t// \tspawns,\r\n\t// \tsharedState,\r\n\t// \tspectator,\r\n\t// );\r\n};\r\n\r\nconst getAttackingEntity = (attackingBoard: BoardEntity[], lastAttackerIndex: number): 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}\r\n\r\n\t// Once an entity has attacked, no entity to the left of it can attack until all entities\r\n\t// on the board have attacked\r\n\t// Once the last attacker index is the last entity on the board, we cycle back to the start\r\n\tif (lastAttackerIndex != null && lastAttackerIndex < validAttackers.length - 1) {\r\n\t\t// This doesn't work if any entity that appears before the attacked index died in-between\r\n\t\tconst candidates = validAttackers.slice(lastAttackerIndex);\r\n\t\tif (candidates.length > 0) {\r\n\t\t\tvalidAttackers = candidates;\r\n\t\t}\r\n\t}\r\n\r\n\tlet attackingEntity = validAttackers[0];\r\n\tlet minNumberOfAttacks: number = attackingEntity.attacksPerformed || 0;\r\n\tfor (const entity of validAttackers) {\r\n\t\tif ((entity.attacksPerformed || 0) < minNumberOfAttacks) {\r\n\t\t\tattackingEntity = entity;\r\n\t\t\tminNumberOfAttacks = entity.attacksPerformed;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!attackingEntity.attackImmediately) {\r\n\t\tattackingEntity.attacksPerformed = (attackingEntity.attacksPerformed || 0) + 1;\r\n\t}\r\n\treturn attackingEntity;\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): BoardEntity[] => {\r\n\tconst result = [];\r\n\tif (defendingBoard.length > 0) {\r\n\t\t// console.debug('defending board', numberOfTargets, stringifySimple(defendingBoard));\r\n\t\tconst attackerIndex = attackingBoard.length - entityIndexFromRight - 1;\r\n\t\tconst targetIndex = attackerIndex - (attackingBoard.length - defendingBoard.length) / 2;\r\n\r\n\t\tfor (let i = 0; i < numberOfTargets; i++) {\r\n\t\t\tconst possibleTargets = defendingBoard.filter((e) => !e.definitelyDead && e.health > 0).filter((e) => !result.includes(e));\r\n\t\t\t// console.debug('possibleTargets', stringifySimple(possibleTargets));\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) => defendingBoard.indexOf(e) - targetIndex)(possibleTargets);\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\tconst target = pickRandom(targetGroups[nearestDistance]);\r\n\t\t\t\tresult.push(target);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result.filter((e) => !!e);\r\n};\r\n\r\nexport const getNeighbours = (board: BoardEntity[], entity: BoardEntity, deadEntityIndexFromRight?: number): readonly BoardEntity[] => {\r\n\tconst neighbours = [];\r\n\tif (deadEntityIndexFromRight != null) {\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\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\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}\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}\r\n\t}\r\n\treturn neighbours;\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\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\tspectator.registerPowerTarget(damageSource, defendingEntity, boardToBeDamaged);\r\n\t\tdealDamageToEnemy(\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\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport const dealDamageToEnemy = (\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity,\r\n\tdamage: number,\r\n\tboardWithAttackOrigin: BoardEntity[],\r\n\tboardWithAttackOriginHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): number => {\r\n\t// console.log('dealing damage to', damage, stringifySimpleCard(defendingEntity, allCards));\r\n\tif (!defendingEntity) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst isDeadBeforeDamage = defendingEntity.definitelyDead || defendingEntity.health <= 0;\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\tattacking: true,\r\n\t} as BoardEntity;\r\n\tconst actualDamageDone = bumpEntities(\r\n\t\tdefendingEntity,\r\n\t\tfakeAttacker,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tboardWithAttackOrigin,\r\n\t\tboardWithAttackOriginHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\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\tif (fakeAttacker.attack > 0 && defendingEntity.divineShield) {\r\n\t\tupdateDivineShield(defendingEntity, defendingBoard, false, allCards);\r\n\t}\r\n\tif (!isDeadBeforeDamage && actualDamageDone > 0) {\r\n\t\tdefendingEntity.lastAffectedByEntity = damageSource;\r\n\t}\r\n\tconst defendingEntityIndex = defendingBoard.map((entity) => entity.entityId).indexOf(defendingEntity.entityId);\r\n\tdefendingBoard[defendingEntityIndex] = defendingEntity;\r\n\treturn actualDamageDone;\r\n};\r\n\r\nexport const getDefendingEntity = (defendingBoard: BoardEntity[], attackingEntity: BoardEntity, ignoreTaunts = false): BoardEntity => {\r\n\tlet possibleDefenders: readonly BoardEntity[];\r\n\tif (attackingEntity.cardId === CardIds.ZappSlywick || attackingEntity.cardId === CardIds.ZappSlywickBattlegrounds) {\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 {\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\tlet chosenDefender = possibleDefenders[Math.floor(Math.random() * possibleDefenders.length)];\r\n\tif (chosenDefender?.taunt) {\r\n\t\tconst elistras = defendingBoard.filter(\r\n\t\t\t(entity) => entity.cardId === CardIds.ElistraTheImmortal_BGS_205 || entity.cardId === CardIds.ElistraTheImmortalBattlegrounds,\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): number => {\r\n\t// No attack has no impact\r\n\tif (bumpInto.attack === 0) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tif (entity.divineShield) {\r\n\t\t// Handle all the divine shield loss effects here\r\n\t\tfor (let i = 0; i < entityBoard.length; i++) {\r\n\t\t\tif (entityBoard[i].cardId === CardIds.BolvarFireblood_ICC_858) {\r\n\t\t\t\tmodifyAttack(entityBoard[i], 2, entityBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(entityBoard[i], entityBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(entityBoard[i], entityBoard[i], entityBoard);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.BolvarFirebloodBattlegrounds) {\r\n\t\t\t\tmodifyAttack(entityBoard[i], 4, entityBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(entityBoard[i], entityBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(entityBoard[i], entityBoard[i], entityBoard);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.DrakonidEnforcer) {\r\n\t\t\t\tmodifyAttack(entityBoard[i], 2, entityBoard, allCards);\r\n\t\t\t\tmodifyHealth(entityBoard[i], 2, entityBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(entityBoard[i], entityBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(entityBoard[i], entityBoard[i], entityBoard);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.DrakonidEnforcerBattlegrounds) {\r\n\t\t\t\tmodifyAttack(entityBoard[i], 4, entityBoard, allCards);\r\n\t\t\t\tmodifyHealth(entityBoard[i], 4, entityBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(entityBoard[i], entityBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(entityBoard[i], entityBoard[i], entityBoard);\r\n\t\t\t} else if (\r\n\t\t\t\tentityBoard[i].entityId !== entity.entityId &&\r\n\t\t\t\t(entityBoard[i].cardId === CardIds.HolyMecherel || entityBoard[i].cardId === CardIds.HolyMecherelBattlegrounds)\r\n\t\t\t) {\r\n\t\t\t\tupdateDivineShield(entityBoard[i], entityBoard, true, allCards);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.Gemsplitter_BG21_037) {\r\n\t\t\t\taddCardsInHand(entityBoardHero, 1, entityBoard, allCards, spectator, CardIds.BloodGem);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.Gemsplitter_BG21_037_G) {\r\n\t\t\t\taddCardsInHand(entityBoardHero, 2, entityBoard, allCards, spectator, CardIds.BloodGem);\r\n\t\t\t}\r\n\r\n\t\t\t// So that self-buffs from Bolvar are taken into account\r\n\t\t\t// if (entityBoard[i].entityId === entity.entityId && entity.divineShield) {\r\n\t\t\t// \tupdateDivineShield(entityBoard[i], entityBoard, false, allCards);\r\n\t\t\t// }\r\n\t\t}\r\n\t\tconst greaseBots = entityBoard.filter((entity) => entity.cardId === CardIds.GreaseBot);\r\n\t\tconst greaseBotBattlegrounds = entityBoard.filter((entity) => entity.cardId === CardIds.GreaseBotBattlegrounds);\r\n\t\tgreaseBots.forEach((bot) => {\r\n\t\t\tmodifyAttack(entity, 2, entityBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 1, entityBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(bot, entity, entityBoard);\r\n\t\t});\r\n\t\tgreaseBotBattlegrounds.forEach((bot) => {\r\n\t\t\tmodifyAttack(entity, 4, entityBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 2, entityBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(bot, entity, entityBoard);\r\n\t\t});\r\n\r\n\t\tspectator.registerDamageDealt(bumpInto, entity, 0, entityBoard);\r\n\t\treturn 0;\r\n\t\t// return entity;\r\n\t}\r\n\tentity.health = entity.health - (entity.damageMultiplier || 1) * bumpInto.attack;\r\n\r\n\tif (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\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\t// return entity;\r\n\t}\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\tspectator.registerDamageDealt(bumpInto, entity, (entity.damageMultiplier || 1) * bumpInto.attack, entityBoard);\r\n\tentity.lastAffectedByEntity = bumpInto;\r\n\tif (!entity.frenzyApplied && entity.health > 0 && !entity.definitelyDead) {\r\n\t\tapplyFrenzy(entity, entityBoard, entityBoardHero, allCards, cardsData, sharedState, spectator);\r\n\t\tentity.frenzyApplied = true;\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\tconst 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\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\tif (!!entitySpawns?.length) {\r\n\t\tconst index = entityBoard.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\taddMinionsToBoard(entityBoard, entityBoardHero, otherHero, index, entitySpawns, allCards, spectator, sharedState);\r\n\t\tspectator.registerMinionsSpawn(entity, entityBoard, entitySpawns);\r\n\t}\r\n\treturn bumpInto.attack;\r\n};\r\n\r\nconst 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) {\r\n\t\treturn spawnEntities(\r\n\t\t\tCardIds.ImpGangBoss_ImpToken,\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.ImpGangBossBattlegrounds) {\r\n\t\treturn spawnEntities(\r\n\t\t\tCardIds.ImpGangBoss_ImpTokenBattlegrounds,\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) {\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.ImpMamaBattlegrounds) {\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) {\r\n\t\treturn spawnEntities(\r\n\t\t\tCardIds.SecurityRover_GuardBotToken,\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.SecurityRoverBattlegrounds) {\r\n\t\treturn spawnEntities(\r\n\t\t\tCardIds.SecurityRover_GuardBotTokenBattlegrounds,\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\t// console.debug('processing minions death', stringifySimple(board1, allCards), stringifySimple(board2, allCards));\r\n\tconst [deadMinionIndexesFromRights1, deadEntities1] = makeMinionsDie(board1, allCards, spectator);\r\n\tconst [deadMinionIndexesFromRights2, deadEntities2] = makeMinionsDie(board2, allCards, spectator);\r\n\tspectator.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\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\tsharedState.deaths.push(...deadEntities1);\r\n\tsharedState.deaths.push(...deadEntities2);\r\n\tboard1Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard1Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities1.filter((e) => e.cardId === CardIds.EternalKnight || e.cardId === CardIds.EternalKnightBattlegrounds).length;\r\n\tboard2Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard2Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities2.filter((e) => e.cardId === CardIds.EternalKnight || e.cardId === CardIds.EternalKnightBattlegrounds).length;\r\n\r\n\t// First process all DRs, then process the reborn\r\n\tif (Math.random() > 0.5) {\r\n\t\t// Now proceed to trigger all deathrattle effects on baord1\r\n\t\thandleDeathrattlesForFirstBoard(\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdeadMinionIndexesFromRights1,\r\n\t\t\tdeadEntities1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\t// Now handle the other board's deathrattles\r\n\t\thandleDeathrattlesForFirstBoard(\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdeadMinionIndexesFromRights2,\r\n\t\t\tdeadEntities2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t} else {\r\n\t\thandleDeathrattlesForFirstBoard(\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdeadMinionIndexesFromRights2,\r\n\t\t\tdeadEntities2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\thandleDeathrattlesForFirstBoard(\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdeadMinionIndexesFromRights1,\r\n\t\t\tdeadEntities1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\r\n\t// Now the reborn\r\n\tif (Math.random() > 0.5) {\r\n\t\t// Now proceed to trigger all deathrattle effects on baord1\r\n\t\thandleRebornForFirstBoard(\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdeadMinionIndexesFromRights1,\r\n\t\t\tdeadEntities1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\t// Now handle the other board's deathrattles\r\n\t\thandleRebornForFirstBoard(\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdeadMinionIndexesFromRights2,\r\n\t\t\tdeadEntities2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t} else {\r\n\t\thandleRebornForFirstBoard(\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdeadMinionIndexesFromRights2,\r\n\t\t\tdeadEntities2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\thandleRebornForFirstBoard(\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdeadMinionIndexesFromRights1,\r\n\t\t\tdeadEntities1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\r\n\t// If the fish dies (from Scallywag for instance), it doesn't remember the deathrattle\r\n\tboard1\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) => rememberDeathrattles(entity, deadEntities1, cardsData, allCards, sharedState));\r\n\tboard2\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) => rememberDeathrattles(entity, deadEntities2, cardsData, allCards, sharedState));\r\n\r\n\tboard1\r\n\t\t.filter((entity) => entity.cardId === CardIds.Monstrosity || entity.cardId === CardIds.MonstrosityBattlegrounds)\r\n\t\t.forEach((entity) => applyMonstrosity(entity, deadEntities1, board1, allCards));\r\n\tboard2\r\n\t\t.filter((entity) => entity.cardId === CardIds.Monstrosity || entity.cardId === CardIds.MonstrosityBattlegrounds)\r\n\t\t.forEach((entity) => applyMonstrosity(entity, deadEntities2, board2, allCards));\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, allCards, cardsData, sharedState, spectator);\r\n\r\n\t// Apply \"after minion death\" effects\r\n\thandleAfterMinionsDeaths(\r\n\t\tboard1,\r\n\t\tdeadEntities1,\r\n\t\tboard1Hero,\r\n\t\tboard2,\r\n\t\tdeadEntities2,\r\n\t\tboard2Hero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\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\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\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\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n) => {\r\n\tfor (const deadEntity of friendlyDeadEntities) {\r\n\t\tconst killer = deadEntity.lastAffectedByEntity;\r\n\t\tif (!killer) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\t// Killed an enemy minion\r\n\t\tif (killer.friendly !== deadEntity.friendly) {\r\n\t\t\tif (otherHeroEntity.heroPowerId === CardIds.Rokara_GloryOfCombat) {\r\n\t\t\t\tmodifyAttack(killer, 1, otherBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(killer, otherBoard, allCards);\r\n\t\t\t\t// Icesnarl the Mighty\r\n\t\t\t\totherBoard\r\n\t\t\t\t\t.filter((e) => e.cardId === CardIds.IcesnarlTheMighty || e.cardId === CardIds.IcesnarlTheMightyBattlegrounds)\r\n\t\t\t\t\t.forEach((icesnarl) => {\r\n\t\t\t\t\t\tmodifyHealth(icesnarl, icesnarl.cardId === CardIds.IcesnarlTheMightyBattlegrounds ? 2 : 1, friendlyBoard, allCards);\r\n\t\t\t\t\t\tafterStatsUpdate(icesnarl, friendlyBoard, allCards);\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleDeathrattlesForFirstBoard = (\r\n\tfirstBoard: BoardEntity[],\r\n\tfirstBoardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tdeadMinionIndexesFromRight: readonly number[],\r\n\tdeadEntities: readonly BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tfor (let i = 0; i < deadMinionIndexesFromRight.length; i++) {\r\n\t\tconst entity = deadEntities[i];\r\n\t\tconst indexFromRight = deadMinionIndexesFromRight[i];\r\n\t\tif (entity.health <= 0 || entity.definitelyDead) {\r\n\t\t\tbuildBoardAfterDeathrattleSpawns(\r\n\t\t\t\tfirstBoard,\r\n\t\t\t\tfirstBoardHero,\r\n\t\t\t\tentity,\r\n\t\t\t\tindexFromRight,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tdeadEntities,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t} else if (firstBoard.length > 0) {\r\n\t\t\t// const newBoardD = [...firstBoard];\r\n\t\t\tfirstBoard.splice(firstBoard.length - indexFromRight, 1, entity);\r\n\t\t\t// firstBoard = newBoardD;\r\n\t\t}\r\n\t}\r\n\t// return [firstBoard, otherBoard];\r\n};\r\n\r\nconst handleRebornForFirstBoard = (\r\n\tfirstBoard: BoardEntity[],\r\n\tfirstBoardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tdeadMinionIndexesFromRight: readonly number[],\r\n\tdeadEntities: readonly BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\t// console.log('will handle reborn', stringifySimple(firstBoard, allCards), deadMinionIndexesFromRight);\r\n\tfor (let i = deadMinionIndexesFromRight.length - 1; i >= 0; i--) {\r\n\t\tconst entity = deadEntities[i];\r\n\t\tconst indexFromRight = deadMinionIndexesFromRight[i];\r\n\t\tif (entity.health <= 0 || entity.definitelyDead) {\r\n\t\t\tif (!entity?.cardId) {\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\t'missing card id for entity that died',\r\n\t\t\t\t\tstringifySimpleCard(entity, allCards),\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tindexFromRight,\r\n\t\t\t\t\tdeadMinionIndexesFromRight,\r\n\t\t\t\t\tstringifySimple(firstBoard, allCards),\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\t// console.log('dead entity', stringifySimpleCard(entity, allCards), indexFromRight);\r\n\t\t\tbuildBoardAfterRebornSpawns(\r\n\t\t\t\tfirstBoard,\r\n\t\t\t\tfirstBoardHero,\r\n\t\t\t\tentity,\r\n\t\t\t\tindexFromRight,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t\t// console.log('after rebord', stringifySimple(firstBoard, allCards));\r\n\t\t} else if (firstBoard.length > 0) {\r\n\t\t\t// const newBoardD = [...firstBoard];\r\n\t\t\tfirstBoard.splice(firstBoard.length - indexFromRight, 1, entity);\r\n\t\t\t// firstBoard = newBoardD;\r\n\t\t}\r\n\t}\r\n\t// return [firstBoard, otherBoard];\r\n};\r\n\r\nexport const applyOnAttackBuffs = (\r\n\tattacker: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (attacker.cardId === CardIds.GlyphGuardian_BGS_045) {\r\n\t\t// For now the utility method only works additively, so we hack around it\r\n\t\tmodifyAttack(attacker, 2 * attacker.attack - attacker.attack, attackingBoard, allCards);\r\n\t}\r\n\tif (attacker.cardId === CardIds.GlyphGuardianBattlegrounds) {\r\n\t\tmodifyAttack(attacker, 3 * attacker.attack - attacker.attack, attackingBoard, allCards);\r\n\t}\r\n\r\n\t// Ripsnarl Captain\r\n\tif (isCorrectTribe(allCards.getCard(attacker.cardId).races, Race.PIRATE)) {\r\n\t\tconst ripsnarls = attackingBoard\r\n\t\t\t.filter((e) => e.cardId === CardIds.RipsnarlCaptain)\r\n\t\t\t.filter((e) => e.entityId !== attacker.entityId);\r\n\t\tconst ripsnarlsTB = attackingBoard\r\n\t\t\t.filter((entity) => entity.cardId === CardIds.RipsnarlCaptainBattlegrounds)\r\n\t\t\t.filter((e) => e.entityId !== attacker.entityId);\r\n\t\tripsnarls.forEach((captain) => {\r\n\t\t\tmodifyAttack(attacker, 3, attackingBoard, allCards);\r\n\t\t\tmodifyHealth(attacker, 3, attackingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(captain, attacker, attackingBoard);\r\n\t\t});\r\n\t\tripsnarlsTB.forEach((captain) => {\r\n\t\t\tmodifyAttack(attacker, 6, attackingBoard, allCards);\r\n\t\t\tmodifyHealth(attacker, 6, attackingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(captain, attacker, attackingBoard);\r\n\t\t});\r\n\t}\r\n\r\n\t// Dread Admiral Eliza\r\n\tif (isCorrectTribe(allCards.getCard(attacker.cardId).races, Race.PIRATE)) {\r\n\t\tconst elizas = attackingBoard.filter((e) => e.cardId === CardIds.DreadAdmiralEliza);\r\n\t\tconst elizasTB = attackingBoard.filter((e) => e.cardId === CardIds.DreadAdmiralElizaBattlegrounds);\r\n\r\n\t\telizas.forEach((eliza) => {\r\n\t\t\tattackingBoard.forEach((entity) => {\r\n\t\t\t\tmodifyAttack(entity, 2, attackingBoard, allCards);\r\n\t\t\t\tmodifyHealth(entity, 1, attackingBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(eliza, entity, attackingBoard);\r\n\t\t\t});\r\n\t\t});\r\n\t\telizasTB.forEach((eliza) => {\r\n\t\t\tattackingBoard.forEach((entity) => {\r\n\t\t\t\tmodifyAttack(entity, 4, attackingBoard, allCards);\r\n\t\t\t\tmodifyHealth(entity, 2, attackingBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(eliza, entity, attackingBoard);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\tif (attacker.cardId === CardIds.VanessaVancleef || attacker.cardId === CardIds.VanessaVancleefBattlegrounds) {\r\n\t\tattackingBoard\r\n\t\t\t.filter((e) => isCorrectTribe(allCards.getCard(e.cardId).races, Race.PIRATE))\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tmodifyAttack(e, attacker.cardId === CardIds.VanessaVancleefBattlegrounds ? 4 : 2, attackingBoard, allCards);\r\n\t\t\t\tmodifyHealth(e, attacker.cardId === CardIds.VanessaVancleefBattlegrounds ? 4 : 2, attackingBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(attacker, e, attackingBoard);\r\n\t\t\t});\r\n\t}\r\n};\r\n\r\nexport const applyOnBeingAttackedBuffs = (\r\n\tattackerEntity: BoardEntity,\r\n\tattackedEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (attackedEntity.taunt) {\r\n\t\tconst champions = defendingBoard.filter((entity) => entity.cardId === CardIds.ChampionOfYshaarj);\r\n\t\tconst goldenChampions = defendingBoard.filter((entity) => entity.cardId === CardIds.ChampionOfYshaarjBattlegrounds);\r\n\t\tchampions.forEach((entity) => {\r\n\t\t\tmodifyAttack(entity, 1, defendingBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 1, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(entity, entity, defendingBoard);\r\n\t\t});\r\n\t\tgoldenChampions.forEach((entity) => {\r\n\t\t\tmodifyAttack(entity, 2, defendingBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 2, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(entity, entity, defendingBoard);\r\n\t\t});\r\n\r\n\t\tconst arms = defendingBoard.filter((entity) => entity.cardId === CardIds.ArmOfTheEmpire);\r\n\t\tconst goldenArms = defendingBoard.filter((entity) => entity.cardId === CardIds.ArmOfTheEmpireBattlegrounds);\r\n\t\tarms.forEach((arm) => {\r\n\t\t\tmodifyAttack(attackedEntity, 2, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(arm, attackedEntity, defendingBoard);\r\n\t\t});\r\n\t\tgoldenArms.forEach((arm) => {\r\n\t\t\tmodifyAttack(attackedEntity, 4, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(arm, attackedEntity, defendingBoard);\r\n\t\t});\r\n\t}\r\n\tif (attackedEntity.cardId === CardIds.TormentedRitualist) {\r\n\t\tconst neighbours = getNeighbours(defendingBoard, attackedEntity);\r\n\t\tneighbours.forEach((entity) => {\r\n\t\t\tmodifyAttack(entity, 1, defendingBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 1, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(attackedEntity, entity, defendingBoard);\r\n\t\t});\r\n\t}\r\n\tif (attackedEntity.cardId === CardIds.TormentedRitualistBattlegrounds) {\r\n\t\tconst neighbours = getNeighbours(defendingBoard, attackedEntity);\r\n\t\tneighbours.forEach((entity) => {\r\n\t\t\tmodifyAttack(entity, 2, defendingBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 2, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(attackedEntity, entity, defendingBoard);\r\n\t\t});\r\n\t}\r\n\tif (attackedEntity.cardId === CardIds.DozyWhelp || attackedEntity.cardId === CardIds.DozyWhelpBattlegrounds) {\r\n\t\tmodifyAttack(attackedEntity, attackedEntity.cardId === CardIds.DozyWhelpBattlegrounds ? 2 : 1, defendingBoard, allCards);\r\n\t\tspectator.registerPowerTarget(attackedEntity, attackedEntity, defendingBoard);\r\n\t}\r\n\tif (attackerEntity.cardId === CardIds.SindoreiStraightShot || attackerEntity.cardId === CardIds.SindoreiStraightShotBattlegrounds) {\r\n\t\tattackedEntity.taunt = false;\r\n\t\tattackedEntity.reborn = false;\r\n\t}\r\n};\r\n\r\nconst makeMinionsDie = (board: BoardEntity[], allCards: AllCardsService, spectator: Spectator): [number[], BoardEntity[]] => {\r\n\t// Because entities spawn to the left, so the right index is unchanged\r\n\tconst deadMinionIndexesFromRight: number[] = [];\r\n\tconst deadEntities: BoardEntity[] = [];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].health <= 0 || board[i].definitelyDead) {\r\n\t\t\tdeadMinionIndexesFromRight.push(board.length - (i + 1));\r\n\t\t\tdeadEntities.push(board[i]);\r\n\t\t\tremoveMinionFromBoard(board, i, allCards, spectator);\r\n\t\t\t// We modify the original array, so we need to update teh current index accordingly\r\n\t\t\ti--;\r\n\t\t}\r\n\t}\r\n\t// Treat all dead entities as a single block\r\n\tconst blockIndexesFromRight = [...deadMinionIndexesFromRight];\r\n\tfor (let i = deadMinionIndexesFromRight.length - 1; i >= 0; i--) {\r\n\t\tif (i === deadMinionIndexesFromRight.length - 1) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (Math.abs(deadMinionIndexesFromRight[i] - deadMinionIndexesFromRight[i + 1]) <= 1) {\r\n\t\t\tblockIndexesFromRight[i] = blockIndexesFromRight[i + 1];\r\n\t\t} else {\r\n\t\t\tblockIndexesFromRight[i] = blockIndexesFromRight[i];\r\n\t\t}\r\n\t}\r\n\treturn [blockIndexesFromRight, deadEntities];\r\n};\r\n\r\n// const handleKillEffects = (\r\n// \tboardWithKilledMinion: BoardEntity[],\r\n// \tkillerBoard: BoardEntity[],\r\n// \tdeadEntity: BoardEntity,\r\n// \tallCards: AllCardsService,\r\n// \tspectator: Spectator,\r\n// ): void => {\r\n// \tif (\r\n// \t\tdeadEntity.lastAffectedByEntity?.cardId &&\r\n// \t\tisCorrectTribe(allCards.getCard(deadEntity.lastAffectedByEntity.cardId).race, Race.DRAGON)\r\n// \t) {\r\n// \t\tfor (const entity of killerBoard) {\r\n// \t\t\tif (entity.cardId === CardIds.WaxriderTogwaggle2) {\r\n// \t\t\t\tmodifyAttack(entity, 2, killerBoard, allCards);\r\n// \t\t\t\tmodifyHealth(entity, 2, killerBoard, allCards);\r\n// \t\t\t\tafterStatsUpdate(entity, killerBoard, allCards);\r\n// \t\t\t\tspectator.registerPowerTarget(entity, entity, killerBoard);\r\n// \t\t\t} else if (entity.cardId === CardIds.WaxriderTogwaggleBattlegrounds) {\r\n// \t\t\t\tmodifyAttack(entity, 4, killerBoard, allCards);\r\n// \t\t\t\tmodifyHealth(entity, 4, killerBoard, allCards);\r\n// \t\t\t\tafterStatsUpdate(entity, killerBoard, allCards);\r\n// \t\t\t\tspectator.registerPowerTarget(entity, entity, killerBoard);\r\n// \t\t\t}\r\n// \t\t}\r\n// \t}\r\n// };\r\n\r\nconst buildBoardAfterDeathrattleSpawns = (\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadMinionIndexFromRight2: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tentitiesDeadThisAttack: readonly BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\t// TODO: don't apply this for FishOfNZoth\r\n\t// if (deadMinionIndex >= 0) {\r\n\t// \thandleKillEffects(boardWithKilledMinion, opponentBoard, deadEntity, allCards, spectator);\r\n\t// }\r\n\r\n\t// But Wildfire Element is applied first, before the DR spawns\r\n\tif (deadMinionIndexFromRight2 >= 0) {\r\n\t\tapplyMinionDeathEffect(\r\n\t\t\tdeadEntity,\r\n\t\t\tdeadMinionIndexFromRight2,\r\n\t\t\tboardWithKilledMinion,\r\n\t\t\tboardWithKilledMinionHero,\r\n\t\t\topponentBoard,\r\n\t\t\topponentBoardHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\tconst entitiesFromNativeDeathrattle: readonly BoardEntity[] = spawnEntitiesFromDeathrattle(\r\n\t\tdeadEntity,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tentitiesDeadThisAttack,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\tconst entitiesFromEnchantments: readonly BoardEntity[] = spawnEntitiesFromEnchantments(\r\n\t\tdeadEntity,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\tconst candidateEntities: readonly BoardEntity[] = [...entitiesFromNativeDeathrattle, ...entitiesFromEnchantments];\r\n\tperformEntitySpawns(\r\n\t\tcandidateEntities,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight2,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\t// In case of leapfrogger, we want to first spawn the minions, then apply the frog effect\r\n\thandleDeathrattleEffects(\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight2,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\t// eslint-disable-next-line prettier/prettier\r\n\tif (deadEntity.rememberedDeathrattles?.length) {\r\n\t\tfor (const deathrattle of deadEntity.rememberedDeathrattles) {\r\n\t\t\tconst entityToProcess: BoardEntity = {\r\n\t\t\t\t...deadEntity,\r\n\t\t\t\trememberedDeathrattles: undefined,\r\n\t\t\t\tcardId: deathrattle.cardId,\r\n\t\t\t\tenchantments: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcardId: deathrattle.cardId,\r\n\t\t\t\t\t\toriginEntityId: deadEntity.entityId,\r\n\t\t\t\t\t\trepeats: deathrattle.repeats ?? 1,\r\n\t\t\t\t\t\ttiming: deathrattle.timing,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t};\r\n\t\t\tbuildBoardAfterDeathrattleSpawns(\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\tentityToProcess,\r\n\t\t\t\tdeadMinionIndexFromRight2,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tentitiesDeadThisAttack,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t// TODO: check if Avenge effects should proc after deathrattles instead\r\n\t// They most certainly do, since the rat pack + avenge beast buffer works\r\n\tapplyAvengeEffects(\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight2,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n};\r\n\r\nconst buildBoardAfterRebornSpawns = (\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadMinionIndexFromRight: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst numberOfReborns = 1;\r\n\t// Reborn happens after deathrattles\r\n\tif (!deadEntity.cardId) {\r\n\t\tconsole.error('missing card id for dead entity', stringifySimpleCard(deadEntity, allCards), deadEntity);\r\n\t}\r\n\tlet entityToSpawn: BoardEntity = null;\r\n\t// TODO: test\r\n\tif (deadEntity.cardId === CardIds.SinrunnerBlanchy || deadEntity.cardId === CardIds.SinrunnerBlanchyBattlegrounds) {\r\n\t\tentityToSpawn = {\r\n\t\t\t...deadEntity,\r\n\t\t\thealth: deadEntity.maxHealth,\r\n\t\t\tdivineShield: deadEntity.hadDivineShield,\r\n\t\t\treborn: false,\r\n\t\t};\r\n\t}\r\n\tconst entitiesFromReborn: readonly BoardEntity[] =\r\n\t\tdeadEntity.reborn && deadMinionIndexFromRight >= 0\r\n\t\t\t? spawnEntities(\r\n\t\t\t\t\tdeadEntity.cardId,\r\n\t\t\t\t\tnumberOfReborns,\r\n\t\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\t\topponentBoard,\r\n\t\t\t\t\topponentBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t\tdeadEntity.friendly,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tentityToSpawn,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t )\r\n\t\t\t: [];\r\n\tconst entitiesThatWereReborn = performEntitySpawns(\r\n\t\tentitiesFromReborn,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\tconst arfus = boardWithKilledMinion\r\n\t\t.filter((e) => e.cardId === CardIds.ArfusBattlegrounds_TB_BaconShop_HERO_22_Buddy)\r\n\t\t.map((e) => e.attack)\r\n\t\t.reduce((a, b) => a + b, 0);\r\n\tconst goldenArfus = boardWithKilledMinion\r\n\t\t.filter((e) => e.cardId === CardIds.ArfusBattlegrounds_TB_BaconShop_HERO_22_Buddy_G)\r\n\t\t.map((e) => 2 * e.attack)\r\n\t\t.reduce((a, b) => a + b, 0);\r\n\tif (arfus + goldenArfus > 0) {\r\n\t\tentitiesThatWereReborn.forEach((e) => {\r\n\t\t\tmodifyAttack(e, arfus + goldenArfus, boardWithKilledMinion, allCards);\r\n\t\t\tafterStatsUpdate(e, boardWithKilledMinion, allCards);\r\n\t\t});\r\n\t}\r\n\r\n\tconst numberOfTriggersForDeathwhisper = Math.min(entitiesFromReborn.length, 1);\r\n\tfor (let i = 0; i < numberOfTriggersForDeathwhisper; i++) {\r\n\t\tboardWithKilledMinion\r\n\t\t\t.filter((e) => e.cardId === CardIds.SisterDeathwhisper || e.cardId === CardIds.SisterDeathwhisperBattlegrounds)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst multiplier = e.cardId === CardIds.SisterDeathwhisperBattlegrounds ? 2 : 1;\r\n\t\t\t\taddStatsToBoard(e, boardWithKilledMinion, multiplier * 1, multiplier * 2, allCards, spectator, Race[Race.UNDEAD]);\r\n\t\t\t});\r\n\t\tboardWithKilledMinion\r\n\t\t\t.filter((e) => e.cardId === CardIds.JellyBelly || e.cardId === CardIds.JellyBellyBattlegrounds)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst multiplier = e.cardId === CardIds.JellyBellyBattlegrounds ? 2 : 1;\r\n\t\t\t\tmodifyAttack(e, multiplier * 3, boardWithKilledMinion, allCards);\r\n\t\t\t\tmodifyHealth(e, multiplier * 3, boardWithKilledMinion, allCards);\r\n\t\t\t\tafterStatsUpdate(e, boardWithKilledMinion, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(e, e, boardWithKilledMinion);\r\n\t\t\t});\r\n\t}\r\n};\r\n\r\nexport const performEntitySpawns = (\r\n\tcandidateEntities: readonly BoardEntity[],\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tspawnSourceEntity: BoardEntity | BgsPlayerEntity,\r\n\tspawnSourceEntityIndexFromRight: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): readonly BoardEntity[] => {\r\n\tconst aliveEntites = candidateEntities.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\tconst spawnedEntities = [];\r\n\tfor (const newMinion of aliveEntites) {\r\n\t\t// All entities have been spawned\r\n\t\tif (boardWithKilledMinion.length >= 7) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t// Avoid minions spawning backwards (we don't have this issue if we add all elements at\r\n\t\t// the same time, but here we want to be able to attack after each spawn, which in turn\r\n\t\t// means that the minion can die before the other one spawns)\r\n\t\t// In boardWithKilledMinion, the dead minion has already been removed\r\n\t\tconst indexToSpawnAt = boardWithKilledMinion.length - spawnSourceEntityIndexFromRight;\r\n\t\taddMinionToBoard(\r\n\t\t\tboardWithKilledMinion,\r\n\t\t\tboardWithKilledMinionHero,\r\n\t\t\topponentBoardHero,\r\n\t\t\tindexToSpawnAt,\r\n\t\t\tnewMinion,\r\n\t\t\tallCards,\r\n\t\t\tspectator,\r\n\t\t\tsharedState,\r\n\t\t);\r\n\t\tif (newMinion.attackImmediately) {\r\n\t\t\t// Whenever we are already in a combat phase, we need to first clean up the state\r\n\t\t\tsimulateAttack(\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tnull,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (newMinion.health > 0 && !newMinion.definitelyDead) {\r\n\t\t\tspawnedEntities.push(newMinion);\r\n\t\t}\r\n\t}\r\n\r\n\tspectator.registerMinionsSpawn(spawnSourceEntity, boardWithKilledMinion, spawnedEntities);\r\n\treturn spawnedEntities;\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, CardIds, Race } from '@firestone-hs/reference-data';\r\nimport { BgsPlayerEntity } from '../bgs-player-entity';\r\nimport { BoardEntity } from '../board-entity';\r\nimport { CardsData } from '../cards/cards-data';\r\nimport { groupByFunction, pickRandom } from '../services/utils';\r\nimport { validEnchantments } from '../simulate-bgs-battle';\r\nimport {\r\n\taddCardsInHand,\r\n\taddStatsToBoard,\r\n\tafterStatsUpdate,\r\n\tgrantStatsToMinionsOfEachType,\r\n\thasCorrectTribe,\r\n\thasMechanic,\r\n\tisCorrectTribe,\r\n\tisFish,\r\n\tmodifyAttack,\r\n\tmodifyHealth,\r\n\tstringifySimple,\r\n\tstringifySimpleCard,\r\n\tupdateDivineShield,\r\n} from '../utils';\r\nimport { addMinionToBoard, addMinionsToBoard } from './add-minion-to-board';\r\nimport { applyAvengeEffects } from './avenge';\r\nimport { applyMinionDeathEffect, applyMonstrosity, handleDeathrattleEffects, rememberDeathrattles } from './deathrattle-effects';\r\nimport { spawnEntities, spawnEntitiesFromDeathrattle, spawnEntitiesFromEnchantments } from './deathrattle-spawns';\r\nimport { applyFrenzy } from './frenzy';\r\nimport { removeMinionFromBoard } from './remove-minion-from-board';\r\nimport { SharedState } from './shared-state';\r\nimport { Spectator } from './spectator/spectator';\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\tlastAttackerEntityId: number,\r\n\tallCards: AllCardsService,\r\n\tspawns: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n\tforceAttackingEntityIndex?: number,\r\n): number => {\r\n\tif (attackingBoard.length === 0 || defendingBoard.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst attackingEntity =\r\n\t\tforceAttackingEntityIndex != null\r\n\t\t\t? attackingBoard[forceAttackingEntityIndex]\r\n\t\t\t: getAttackingEntity(attackingBoard, lastAttackerEntityId);\r\n\tconst attackingEntityIndex = attackingBoard.map((e) => e.entityId).indexOf(attackingEntity?.entityId);\r\n\tif (attackingEntity) {\r\n\t\tattackingEntity.attacking = true;\r\n\t\t// console.log('attack by', stringifySimpleCard(attackingEntity, allCards), stringifySimple(defendingBoard, allCards));\r\n\t\tconst numberOfAttacks = attackingEntity.megaWindfury ? 4 : 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\treturn;\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\tapplyOnAttackBuffs(attackingEntity, attackingBoard, allCards, spectator);\r\n\t\t\t\tconst defendingEntity: BoardEntity = 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) {\r\n\t\t\t\t\t// console.log(\r\n\t\t\t\t\t// \t'AATTTTTTTTTTTAAAAAAAAAAAAAAAAAACK by',\r\n\t\t\t\t\t// \tstringifySimpleCard(attackingEntity, allCards),\r\n\t\t\t\t\t// \tstringifySimpleCard(defendingEntity, allCards),\r\n\t\t\t\t\t// \tstringifySimple(attackingBoard, allCards),\r\n\t\t\t\t\t// );\r\n\t\t\t\t\tspectator.registerAttack(attackingEntity, defendingEntity, attackingBoard, defendingBoard);\r\n\t\t\t\t\tapplyOnBeingAttackedBuffs(attackingEntity, defendingEntity, defendingBoard, allCards, spectator);\r\n\t\t\t\t\tperformAttack(\r\n\t\t\t\t\t\tattackingEntity,\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\tallCards,\r\n\t\t\t\t\t\tspawns,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t);\r\n\t\t\t\t\tapplyAfterAttackEffects(attackingEntity, attackingBoard, attackingBoardHero, allCards, spectator);\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tdefendingEntity.health > 0 &&\r\n\t\t\t\t\t\t!defendingEntity.definitelyDead &&\r\n\t\t\t\t\t\t(defendingEntity.cardId === CardIds.YoHoOgre || defendingEntity.cardId === CardIds.YoHoOgreBattlegrounds)\r\n\t\t\t\t\t) {\r\n\t\t\t\t\t\tdefendingEntity.attackImmediately = true;\r\n\t\t\t\t\t\tif (defendingEntity.attackImmediately) {\r\n\t\t\t\t\t\t\tsimulateAttack(\r\n\t\t\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\t\t\tnull,\r\n\t\t\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\t\t\tspawns,\r\n\t\t\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\t\t\tspectator,\r\n\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\t// console.log(\r\n\t\t\t\t\t// \t'after attack by',\r\n\t\t\t\t\t// \tstringifySimpleCard(attackingEntity, allCards),\r\n\t\t\t\t\t// \tstringifySimpleCard(defendingEntity, allCards),\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\tattackingEntity.attacking = false;\r\n\t}\r\n\t// If entities that were before the attacker died, we need to update the attacker index\r\n\treturn attackingEntityIndex;\r\n};\r\n\r\nconst applyAfterAttackEffects = (\r\n\tattackingEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (attackingEntity.cardId === CardIds.Bonker_BG20_104 || attackingEntity.cardId === CardIds.Bonker_BG20_104_G) {\r\n\t\taddCardsInHand(attackingBoardHero, 1, attackingBoard, allCards, spectator, CardIds.BloodGem);\r\n\t} else if (attackingEntity.cardId === CardIds.Yrel_BG23_350 || attackingEntity.cardId === CardIds.Yrel_BG23_350_G) {\r\n\t\tconst modifier = attackingEntity.cardId === CardIds.Yrel_BG23_350_G ? 2 : 1;\r\n\t\tgrantStatsToMinionsOfEachType(attackingEntity, attackingBoard, modifier * 1, modifier * 2, allCards, spectator);\r\n\t}\r\n\t// Putricide-only\r\n\telse if (attackingEntity.additionalCards?.includes(CardIds.IncorporealCorporal_BG26_RLK_117)) {\r\n\t\tattackingEntity.definitelyDead = true;\r\n\t}\r\n\tattackingBoard\r\n\t\t.filter((e) => e.additionalCards?.includes(CardIds.FesterootHulk_BG_GIL_655))\r\n\t\t.forEach((e) => {\r\n\t\t\tmodifyAttack(e, 1, attackingBoard, allCards);\r\n\t\t\tafterStatsUpdate(e, attackingBoard, allCards);\r\n\t\t});\r\n\r\n\tattackingEntity.stealth = false;\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (hasCorrectTribe(attackingEntity, Race.DRAGON, allCards)) {\r\n\t\tconst prestors = attackingBoard\r\n\t\t\t.filter((e) => e.entityId !== attackingEntity.entityId)\r\n\t\t\t.filter((e) => e.cardId === CardIds.PrestorsPyrospawn_BG21_012 || e.cardId === CardIds.PrestorsPyrospawn_BG21_012_G);\r\n\t\tprestors.forEach((prestor) => {\r\n\t\t\tspectator.registerPowerTarget(prestor, defendingEntity, defendingBoard);\r\n\t\t\tdealDamageToEnemy(\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t});\r\n\t}\r\n\tif (attackingEntity.cardId === CardIds.Atramedes_BG23_362 || attackingEntity.cardId === CardIds.AtramedesBattlegrounds) {\r\n\t\tconst targets = [defendingEntity, ...getNeighbours(defendingBoard, defendingEntity)];\r\n\t\tconst multiplier = attackingEntity.cardId === CardIds.AtramedesBattlegrounds ? 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\tspectator.registerPowerTarget(attackingEntity, target, defendingBoard);\r\n\t\t\t\tdealDamageToEnemy(\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\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\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 ? CardIds.DevilsaurBattlegrounds : 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\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\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\tallCards,\r\n\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\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\tif (defenderAliveBeforeAttack) {\r\n\t\tif (!attackingEntity.immuneWhenAttackCharges || attackingEntity.immuneWhenAttackCharges <= 0) {\r\n\t\t\tbumpEntities(\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t}\r\n\t\tbumpEntities(\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\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\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\tif (defendingEntity.attack > 0 && attackingEntity.divineShield) {\r\n\t\t\tupdateDivineShield(attackingEntity, attackingBoard, false, allCards);\r\n\t\t}\r\n\t\tif (attackingEntity.attack > 0 && defendingEntity.divineShield) {\r\n\t\t\tupdateDivineShield(defendingEntity, defendingBoard, false, allCards);\r\n\t\t}\r\n\t}\r\n\t// Cleave\r\n\tif (attackingEntity.cleave) {\r\n\t\tconst defenderNeighbours: readonly BoardEntity[] = getNeighbours(defendingBoard, defendingEntity);\r\n\t\tfor (const neighbour of defenderNeighbours) {\r\n\t\t\tbumpEntities(\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\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, false, allCards);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\tif (\r\n\t\t(defendingEntity.health <= 0 || defendingEntity.definitelyDead) &&\r\n\t\t(attackingEntity.cardId === CardIds.WildfireElemental || attackingEntity.cardId === CardIds.WildfireElementalBattlegrounds)\r\n\t) {\r\n\t\tconst excessDamage = -defendingEntity.health;\r\n\t\tconst neighbours = getNeighbours(defendingBoard, defendingEntity);\r\n\t\t// console.log('neighbours', stringifySimple(neighbours, allCards));\r\n\t\tif (neighbours.length > 0) {\r\n\t\t\tif (attackingEntity.cardId === CardIds.WildfireElemental) {\r\n\t\t\t\tconst randomTarget = neighbours[Math.floor(Math.random() * neighbours.length)];\r\n\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\trandomTarget,\r\n\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\tdefendingEntity.lastAffectedByEntity,\r\n\t\t\t\t\texcessDamage,\r\n\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t);\r\n\t\t\t} else {\r\n\t\t\t\tneighbours.forEach((neighbour) =>\r\n\t\t\t\t\tdealDamageToEnemy(\r\n\t\t\t\t\t\tneighbour,\r\n\t\t\t\t\t\tdefendingBoard,\r\n\t\t\t\t\t\tdefendingBoardHero,\r\n\t\t\t\t\t\tdefendingEntity.lastAffectedByEntity,\r\n\t\t\t\t\t\texcessDamage,\r\n\t\t\t\t\t\tattackingBoard,\r\n\t\t\t\t\t\tattackingBoardHero,\r\n\t\t\t\t\t\tallCards,\r\n\t\t\t\t\t\tcardsData,\r\n\t\t\t\t\t\tsharedState,\r\n\t\t\t\t\t\tspectator,\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// After attack hooks\r\n\t// Arcane Cannon\r\n\t// Monstrous Macaw\r\n\tif (attackingEntity.cardId === CardIds.MonstrousMacaw) {\r\n\t\ttriggerRandomDeathrattle(\r\n\t\t\tattackingEntity,\r\n\t\t\tattackingBoard,\r\n\t\t\tattackingBoardHero,\r\n\t\t\tdefendingBoard,\r\n\t\t\tdefendingBoardHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t\ttrue,\r\n\t\t);\r\n\t} else if (attackingEntity.cardId === CardIds.MonstrousMacawBattlegrounds) {\r\n\t\tfor (let i = 0; i < 2; i++) {\r\n\t\t\ttriggerRandomDeathrattle(\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\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t\ttrue,\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\tprocessMinionDeath(attackingBoard, attackingBoardHero, defendingBoard, defendingBoardHero, allCards, cardsData, sharedState, spectator);\r\n\tattackingEntity.immuneWhenAttackCharges = Math.max(0, attackingEntity.immuneWhenAttackCharges - 1);\r\n};\r\n\r\nconst triggerRandomDeathrattle = (\r\n\tsourceEntity: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tattackingBoardHero: BgsPlayerEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tspawns: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n\texcludeSource = false,\r\n): void => {\r\n\tconst validDeathrattles = attackingBoard\r\n\t\t.filter((entity) => !excludeSource || entity.entityId !== sourceEntity.entityId)\r\n\t\t.filter((entity) => {\r\n\t\t\tif (hasMechanic(allCards.getCard(entity.cardId), 'DEATHRATTLE')) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (entity.rememberedDeathrattles?.length) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\tif (\r\n\t\t\t\tentity.enchantments &&\r\n\t\t\t\tentity.enchantments\r\n\t\t\t\t\t.map((enchantment) => enchantment.cardId)\r\n\t\t\t\t\t.some((enchantmentId) => validEnchantments.includes(enchantmentId as CardIds))\r\n\t\t\t) {\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t\treturn false;\r\n\t\t});\r\n\tif (validDeathrattles.length === 0) {\r\n\t\treturn;\r\n\t}\r\n\tconst targetEntity = pickRandom(validDeathrattles);\r\n\tif (!targetEntity?.cardId) {\r\n\t\tconsole.error(\r\n\t\t\t'missing card id when triggering random deathrattle',\r\n\t\t\tstringifySimpleCard(targetEntity, allCards),\r\n\t\t\ttargetEntity,\r\n\t\t\tvalidDeathrattles.length,\r\n\t\t\tstringifySimple(validDeathrattles, allCards),\r\n\t\t\tstringifySimple(attackingBoard, allCards),\r\n\t\t\texcludeSource,\r\n\t\t\tstringifySimpleCard(sourceEntity, allCards),\r\n\t\t);\r\n\t}\r\n\tspectator.registerPowerTarget(sourceEntity, targetEntity, attackingBoard);\r\n\tconst indexFromRight = attackingBoard.length - (attackingBoard.indexOf(targetEntity) + 1);\r\n\tbuildBoardAfterDeathrattleSpawns(\r\n\t\tattackingBoard,\r\n\t\tattackingBoardHero,\r\n\t\ttargetEntity,\r\n\t\tindexFromRight,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\t[],\r\n\t\tallCards,\r\n\t\tspawns,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\t// The reborn minion spawns to the right of the DR spawns\r\n\t// buildBoardAfterRebornSpawns(\r\n\t// \tattackingBoard,\r\n\t// \tattackingBoardHero,\r\n\t// \ttargetEntity,\r\n\t// \tindexFromRight,\r\n\t// \tdefendingBoard,\r\n\t// \tdefendingBoardHero,\r\n\t// \tallCards,\r\n\t// \tspawns,\r\n\t// \tsharedState,\r\n\t// \tspectator,\r\n\t// );\r\n};\r\n\r\nconst getAttackingEntity = (attackingBoard: BoardEntity[], lastAttackerIndex: number): 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}\r\n\r\n\t// Once an entity has attacked, no entity to the left of it can attack until all entities\r\n\t// on the board have attacked\r\n\t// Once the last attacker index is the last entity on the board, we cycle back to the start\r\n\tif (lastAttackerIndex != null && lastAttackerIndex < validAttackers.length - 1) {\r\n\t\t// This doesn't work if any entity that appears before the attacked index died in-between\r\n\t\tconst candidates = validAttackers.slice(lastAttackerIndex);\r\n\t\tif (candidates.length > 0) {\r\n\t\t\tvalidAttackers = candidates;\r\n\t\t}\r\n\t}\r\n\r\n\tlet attackingEntity = validAttackers[0];\r\n\tlet minNumberOfAttacks: number = attackingEntity.attacksPerformed || 0;\r\n\tfor (const entity of validAttackers) {\r\n\t\tif ((entity.attacksPerformed || 0) < minNumberOfAttacks) {\r\n\t\t\tattackingEntity = entity;\r\n\t\t\tminNumberOfAttacks = entity.attacksPerformed;\r\n\t\t}\r\n\t}\r\n\r\n\tif (!attackingEntity.attackImmediately) {\r\n\t\tattackingEntity.attacksPerformed = (attackingEntity.attacksPerformed || 0) + 1;\r\n\t}\r\n\treturn attackingEntity;\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): BoardEntity[] => {\r\n\tconst result = [];\r\n\tif (defendingBoard.length > 0) {\r\n\t\t// console.debug('defending board', numberOfTargets, stringifySimple(defendingBoard));\r\n\t\tconst attackerIndex = attackingBoard.length - entityIndexFromRight - 1;\r\n\t\tconst targetIndex = attackerIndex - (attackingBoard.length - defendingBoard.length) / 2;\r\n\r\n\t\tfor (let i = 0; i < numberOfTargets; i++) {\r\n\t\t\tconst possibleTargets = defendingBoard.filter((e) => !e.definitelyDead && e.health > 0).filter((e) => !result.includes(e));\r\n\t\t\t// console.debug('possibleTargets', stringifySimple(possibleTargets));\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) => defendingBoard.indexOf(e) - targetIndex)(possibleTargets);\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\tconst target = pickRandom(targetGroups[nearestDistance]);\r\n\t\t\t\tresult.push(target);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\treturn result.filter((e) => !!e);\r\n};\r\n\r\nexport const getNeighbours = (board: BoardEntity[], entity: BoardEntity, deadEntityIndexFromRight?: number): readonly BoardEntity[] => {\r\n\tconst neighbours = [];\r\n\tif (deadEntityIndexFromRight != null) {\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\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\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}\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}\r\n\t}\r\n\treturn neighbours;\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\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\tspectator.registerPowerTarget(damageSource, defendingEntity, boardToBeDamaged);\r\n\t\tdealDamageToEnemy(\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\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n};\r\n\r\nexport const dealDamageToEnemy = (\r\n\tdefendingEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tdefendingBoardHero: BgsPlayerEntity,\r\n\tdamageSource: BoardEntity,\r\n\tdamage: number,\r\n\tboardWithAttackOrigin: BoardEntity[],\r\n\tboardWithAttackOriginHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): number => {\r\n\t// console.log('dealing damage to', damage, stringifySimpleCard(defendingEntity, allCards));\r\n\tif (!defendingEntity) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tconst isDeadBeforeDamage = defendingEntity.definitelyDead || defendingEntity.health <= 0;\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\tattacking: true,\r\n\t} as BoardEntity;\r\n\tconst actualDamageDone = bumpEntities(\r\n\t\tdefendingEntity,\r\n\t\tfakeAttacker,\r\n\t\tdefendingBoard,\r\n\t\tdefendingBoardHero,\r\n\t\tboardWithAttackOrigin,\r\n\t\tboardWithAttackOriginHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\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\tif (fakeAttacker.attack > 0 && defendingEntity.divineShield) {\r\n\t\tupdateDivineShield(defendingEntity, defendingBoard, false, allCards);\r\n\t}\r\n\tif (!isDeadBeforeDamage && actualDamageDone > 0) {\r\n\t\tdefendingEntity.lastAffectedByEntity = damageSource;\r\n\t}\r\n\tconst defendingEntityIndex = defendingBoard.map((entity) => entity.entityId).indexOf(defendingEntity.entityId);\r\n\tdefendingBoard[defendingEntityIndex] = defendingEntity;\r\n\treturn actualDamageDone;\r\n};\r\n\r\nexport const getDefendingEntity = (defendingBoard: BoardEntity[], attackingEntity: BoardEntity, ignoreTaunts = false): BoardEntity => {\r\n\tlet possibleDefenders: readonly BoardEntity[];\r\n\tif (attackingEntity.cardId === CardIds.ZappSlywick || attackingEntity.cardId === CardIds.ZappSlywickBattlegrounds) {\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 {\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\tlet chosenDefender = possibleDefenders[Math.floor(Math.random() * possibleDefenders.length)];\r\n\tif (chosenDefender?.taunt) {\r\n\t\tconst elistras = defendingBoard.filter(\r\n\t\t\t(entity) => entity.cardId === CardIds.ElistraTheImmortal_BGS_205 || entity.cardId === CardIds.ElistraTheImmortalBattlegrounds,\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): number => {\r\n\t// No attack has no impact\r\n\tif (bumpInto.attack === 0) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tif (entity.divineShield) {\r\n\t\t// Handle all the divine shield loss effects here\r\n\t\tfor (let i = 0; i < entityBoard.length; i++) {\r\n\t\t\tif (entityBoard[i].cardId === CardIds.BolvarFireblood_ICC_858) {\r\n\t\t\t\tmodifyAttack(entityBoard[i], 2, entityBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(entityBoard[i], entityBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(entityBoard[i], entityBoard[i], entityBoard);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.BolvarFirebloodBattlegrounds) {\r\n\t\t\t\tmodifyAttack(entityBoard[i], 4, entityBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(entityBoard[i], entityBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(entityBoard[i], entityBoard[i], entityBoard);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.DrakonidEnforcer) {\r\n\t\t\t\tmodifyAttack(entityBoard[i], 2, entityBoard, allCards);\r\n\t\t\t\tmodifyHealth(entityBoard[i], 2, entityBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(entityBoard[i], entityBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(entityBoard[i], entityBoard[i], entityBoard);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.DrakonidEnforcerBattlegrounds) {\r\n\t\t\t\tmodifyAttack(entityBoard[i], 4, entityBoard, allCards);\r\n\t\t\t\tmodifyHealth(entityBoard[i], 4, entityBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(entityBoard[i], entityBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(entityBoard[i], entityBoard[i], entityBoard);\r\n\t\t\t} else if (\r\n\t\t\t\tentityBoard[i].entityId !== entity.entityId &&\r\n\t\t\t\t(entityBoard[i].cardId === CardIds.HolyMecherel || entityBoard[i].cardId === CardIds.HolyMecherelBattlegrounds)\r\n\t\t\t) {\r\n\t\t\t\tupdateDivineShield(entityBoard[i], entityBoard, true, allCards);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.Gemsplitter_BG21_037) {\r\n\t\t\t\taddCardsInHand(entityBoardHero, 1, entityBoard, allCards, spectator, CardIds.BloodGem);\r\n\t\t\t} else if (entityBoard[i].cardId === CardIds.Gemsplitter_BG21_037_G) {\r\n\t\t\t\taddCardsInHand(entityBoardHero, 2, entityBoard, allCards, spectator, CardIds.BloodGem);\r\n\t\t\t}\r\n\r\n\t\t\t// So that self-buffs from Bolvar are taken into account\r\n\t\t\t// if (entityBoard[i].entityId === entity.entityId && entity.divineShield) {\r\n\t\t\t// \tupdateDivineShield(entityBoard[i], entityBoard, false, allCards);\r\n\t\t\t// }\r\n\t\t}\r\n\t\tconst greaseBots = entityBoard.filter((entity) => entity.cardId === CardIds.GreaseBot);\r\n\t\tconst greaseBotBattlegrounds = entityBoard.filter((entity) => entity.cardId === CardIds.GreaseBotBattlegrounds);\r\n\t\tgreaseBots.forEach((bot) => {\r\n\t\t\tmodifyAttack(entity, 2, entityBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 1, entityBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(bot, entity, entityBoard);\r\n\t\t});\r\n\t\tgreaseBotBattlegrounds.forEach((bot) => {\r\n\t\t\tmodifyAttack(entity, 4, entityBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 2, entityBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(bot, entity, entityBoard);\r\n\t\t});\r\n\r\n\t\tspectator.registerDamageDealt(bumpInto, entity, 0, entityBoard);\r\n\t\treturn 0;\r\n\t\t// return entity;\r\n\t}\r\n\tentity.health = entity.health - (entity.damageMultiplier || 1) * bumpInto.attack;\r\n\r\n\tif (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\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\t// return entity;\r\n\t}\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\tspectator.registerDamageDealt(bumpInto, entity, (entity.damageMultiplier || 1) * bumpInto.attack, entityBoard);\r\n\tentity.lastAffectedByEntity = bumpInto;\r\n\tif (!entity.frenzyApplied && entity.health > 0 && !entity.definitelyDead) {\r\n\t\tapplyFrenzy(entity, entityBoard, entityBoardHero, allCards, cardsData, sharedState, spectator);\r\n\t\tentity.frenzyApplied = true;\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\tconst 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\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\tif (!!entitySpawns?.length) {\r\n\t\tconst index = entityBoard.map((e) => e.entityId).indexOf(entity.entityId);\r\n\t\taddMinionsToBoard(entityBoard, entityBoardHero, otherHero, index, entitySpawns, allCards, spectator, sharedState);\r\n\t\tspectator.registerMinionsSpawn(entity, entityBoard, entitySpawns);\r\n\t}\r\n\treturn bumpInto.attack;\r\n};\r\n\r\nconst 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) {\r\n\t\treturn spawnEntities(\r\n\t\t\tCardIds.ImpGangBoss_ImpToken,\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.ImpGangBossBattlegrounds) {\r\n\t\treturn spawnEntities(\r\n\t\t\tCardIds.ImpGangBoss_ImpTokenBattlegrounds,\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) {\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.ImpMamaBattlegrounds) {\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) {\r\n\t\treturn spawnEntities(\r\n\t\t\tCardIds.SecurityRover_GuardBotToken,\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.SecurityRoverBattlegrounds) {\r\n\t\treturn spawnEntities(\r\n\t\t\tCardIds.SecurityRover_GuardBotTokenBattlegrounds,\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\t// console.debug('processing minions death', stringifySimple(board1, allCards), stringifySimple(board2, allCards));\r\n\tconst [deadMinionIndexesFromRights1, deadEntities1] = makeMinionsDie(board1, allCards, spectator);\r\n\tconst [deadMinionIndexesFromRights2, deadEntities2] = makeMinionsDie(board2, allCards, spectator);\r\n\tspectator.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\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\tsharedState.deaths.push(...deadEntities1);\r\n\tsharedState.deaths.push(...deadEntities2);\r\n\tboard1Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard1Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities1.filter((e) => e.cardId === CardIds.EternalKnight || e.cardId === CardIds.EternalKnightBattlegrounds).length;\r\n\tboard2Hero.globalInfo.EternalKnightsDeadThisGame =\r\n\t\tboard2Hero.globalInfo.EternalKnightsDeadThisGame +\r\n\t\tdeadEntities2.filter((e) => e.cardId === CardIds.EternalKnight || e.cardId === CardIds.EternalKnightBattlegrounds).length;\r\n\r\n\t// First process all DRs, then process the reborn\r\n\tif (Math.random() > 0.5) {\r\n\t\t// Now proceed to trigger all deathrattle effects on baord1\r\n\t\thandleDeathrattlesForFirstBoard(\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdeadMinionIndexesFromRights1,\r\n\t\t\tdeadEntities1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\t// Now handle the other board's deathrattles\r\n\t\thandleDeathrattlesForFirstBoard(\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdeadMinionIndexesFromRights2,\r\n\t\t\tdeadEntities2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t} else {\r\n\t\thandleDeathrattlesForFirstBoard(\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdeadMinionIndexesFromRights2,\r\n\t\t\tdeadEntities2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\thandleDeathrattlesForFirstBoard(\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdeadMinionIndexesFromRights1,\r\n\t\t\tdeadEntities1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\r\n\t// Now the reborn\r\n\tif (Math.random() > 0.5) {\r\n\t\t// Now proceed to trigger all deathrattle effects on baord1\r\n\t\thandleRebornForFirstBoard(\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdeadMinionIndexesFromRights1,\r\n\t\t\tdeadEntities1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\t// Now handle the other board's deathrattles\r\n\t\thandleRebornForFirstBoard(\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdeadMinionIndexesFromRights2,\r\n\t\t\tdeadEntities2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t} else {\r\n\t\thandleRebornForFirstBoard(\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tdeadMinionIndexesFromRights2,\r\n\t\t\tdeadEntities2,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t\thandleRebornForFirstBoard(\r\n\t\t\tboard1,\r\n\t\t\tboard1Hero,\r\n\t\t\tboard2,\r\n\t\t\tboard2Hero,\r\n\t\t\tdeadMinionIndexesFromRights1,\r\n\t\t\tdeadEntities1,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\r\n\t// If the fish dies (from Scallywag for instance), it doesn't remember the deathrattle\r\n\tboard1\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) => rememberDeathrattles(entity, deadEntities1, cardsData, allCards, sharedState));\r\n\tboard2\r\n\t\t.filter((entity) => isFish(entity))\r\n\t\t.forEach((entity) => rememberDeathrattles(entity, deadEntities2, cardsData, allCards, sharedState));\r\n\r\n\tboard1\r\n\t\t.filter((entity) => entity.cardId === CardIds.Monstrosity || entity.cardId === CardIds.MonstrosityBattlegrounds)\r\n\t\t.forEach((entity) => applyMonstrosity(entity, deadEntities1, board1, allCards));\r\n\tboard2\r\n\t\t.filter((entity) => entity.cardId === CardIds.Monstrosity || entity.cardId === CardIds.MonstrosityBattlegrounds)\r\n\t\t.forEach((entity) => applyMonstrosity(entity, deadEntities2, board2, allCards));\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, allCards, cardsData, sharedState, spectator);\r\n\r\n\t// Apply \"after minion death\" effects\r\n\thandleAfterMinionsDeaths(\r\n\t\tboard1,\r\n\t\tdeadEntities1,\r\n\t\tboard1Hero,\r\n\t\tboard2,\r\n\t\tdeadEntities2,\r\n\t\tboard2Hero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\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\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\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\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\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\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n) => {\r\n\tfor (const deadEntity of friendlyDeadEntities) {\r\n\t\tconst killer = deadEntity.lastAffectedByEntity;\r\n\t\tif (!killer) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\t// Killed an enemy minion\r\n\t\tif (killer.friendly !== deadEntity.friendly) {\r\n\t\t\tif (otherHeroEntity.heroPowerId === CardIds.Rokara_GloryOfCombat) {\r\n\t\t\t\tmodifyAttack(killer, 1, otherBoard, allCards);\r\n\t\t\t\tafterStatsUpdate(killer, otherBoard, allCards);\r\n\t\t\t\t// Icesnarl the Mighty\r\n\t\t\t\totherBoard\r\n\t\t\t\t\t.filter((e) => e.cardId === CardIds.IcesnarlTheMighty || e.cardId === CardIds.IcesnarlTheMightyBattlegrounds)\r\n\t\t\t\t\t.forEach((icesnarl) => {\r\n\t\t\t\t\t\tmodifyHealth(icesnarl, icesnarl.cardId === CardIds.IcesnarlTheMightyBattlegrounds ? 2 : 1, friendlyBoard, allCards);\r\n\t\t\t\t\t\tafterStatsUpdate(icesnarl, friendlyBoard, allCards);\r\n\t\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\r\n\r\nconst handleDeathrattlesForFirstBoard = (\r\n\tfirstBoard: BoardEntity[],\r\n\tfirstBoardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tdeadMinionIndexesFromRight: readonly number[],\r\n\tdeadEntities: readonly BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tfor (let i = 0; i < deadMinionIndexesFromRight.length; i++) {\r\n\t\tconst entity = deadEntities[i];\r\n\t\tconst indexFromRight = deadMinionIndexesFromRight[i];\r\n\t\tif (entity.health <= 0 || entity.definitelyDead) {\r\n\t\t\tbuildBoardAfterDeathrattleSpawns(\r\n\t\t\t\tfirstBoard,\r\n\t\t\t\tfirstBoardHero,\r\n\t\t\t\tentity,\r\n\t\t\t\tindexFromRight,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tdeadEntities,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t} else if (firstBoard.length > 0) {\r\n\t\t\t// const newBoardD = [...firstBoard];\r\n\t\t\tfirstBoard.splice(firstBoard.length - indexFromRight, 1, entity);\r\n\t\t\t// firstBoard = newBoardD;\r\n\t\t}\r\n\t}\r\n\t// return [firstBoard, otherBoard];\r\n};\r\n\r\nconst handleRebornForFirstBoard = (\r\n\tfirstBoard: BoardEntity[],\r\n\tfirstBoardHero: BgsPlayerEntity,\r\n\totherBoard: BoardEntity[],\r\n\totherBoardHero: BgsPlayerEntity,\r\n\tdeadMinionIndexesFromRight: readonly number[],\r\n\tdeadEntities: readonly BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\t// console.log('will handle reborn', stringifySimple(firstBoard, allCards), deadMinionIndexesFromRight);\r\n\tfor (let i = deadMinionIndexesFromRight.length - 1; i >= 0; i--) {\r\n\t\tconst entity = deadEntities[i];\r\n\t\tconst indexFromRight = deadMinionIndexesFromRight[i];\r\n\t\tif (entity.health <= 0 || entity.definitelyDead) {\r\n\t\t\tif (!entity?.cardId) {\r\n\t\t\t\tconsole.error(\r\n\t\t\t\t\t'missing card id for entity that died',\r\n\t\t\t\t\tstringifySimpleCard(entity, allCards),\r\n\t\t\t\t\tentity,\r\n\t\t\t\t\tindexFromRight,\r\n\t\t\t\t\tdeadMinionIndexesFromRight,\r\n\t\t\t\t\tstringifySimple(firstBoard, allCards),\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\t// console.log('dead entity', stringifySimpleCard(entity, allCards), indexFromRight);\r\n\t\t\tbuildBoardAfterRebornSpawns(\r\n\t\t\t\tfirstBoard,\r\n\t\t\t\tfirstBoardHero,\r\n\t\t\t\tentity,\r\n\t\t\t\tindexFromRight,\r\n\t\t\t\totherBoard,\r\n\t\t\t\totherBoardHero,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t\t// console.log('after rebord', stringifySimple(firstBoard, allCards));\r\n\t\t} else if (firstBoard.length > 0) {\r\n\t\t\t// const newBoardD = [...firstBoard];\r\n\t\t\tfirstBoard.splice(firstBoard.length - indexFromRight, 1, entity);\r\n\t\t\t// firstBoard = newBoardD;\r\n\t\t}\r\n\t}\r\n\t// return [firstBoard, otherBoard];\r\n};\r\n\r\nexport const applyOnAttackBuffs = (\r\n\tattacker: BoardEntity,\r\n\tattackingBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (attacker.cardId === CardIds.GlyphGuardian_BGS_045) {\r\n\t\t// For now the utility method only works additively, so we hack around it\r\n\t\tmodifyAttack(attacker, 2 * attacker.attack - attacker.attack, attackingBoard, allCards);\r\n\t}\r\n\tif (attacker.cardId === CardIds.GlyphGuardianBattlegrounds) {\r\n\t\tmodifyAttack(attacker, 3 * attacker.attack - attacker.attack, attackingBoard, allCards);\r\n\t}\r\n\r\n\t// Ripsnarl Captain\r\n\tif (isCorrectTribe(allCards.getCard(attacker.cardId).races, Race.PIRATE)) {\r\n\t\tconst ripsnarls = attackingBoard\r\n\t\t\t.filter((e) => e.cardId === CardIds.RipsnarlCaptain)\r\n\t\t\t.filter((e) => e.entityId !== attacker.entityId);\r\n\t\tconst ripsnarlsTB = attackingBoard\r\n\t\t\t.filter((entity) => entity.cardId === CardIds.RipsnarlCaptainBattlegrounds)\r\n\t\t\t.filter((e) => e.entityId !== attacker.entityId);\r\n\t\tripsnarls.forEach((captain) => {\r\n\t\t\tmodifyAttack(attacker, 3, attackingBoard, allCards);\r\n\t\t\tmodifyHealth(attacker, 3, attackingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(captain, attacker, attackingBoard);\r\n\t\t});\r\n\t\tripsnarlsTB.forEach((captain) => {\r\n\t\t\tmodifyAttack(attacker, 6, attackingBoard, allCards);\r\n\t\t\tmodifyHealth(attacker, 6, attackingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(captain, attacker, attackingBoard);\r\n\t\t});\r\n\t}\r\n\r\n\t// Dread Admiral Eliza\r\n\tif (isCorrectTribe(allCards.getCard(attacker.cardId).races, Race.PIRATE)) {\r\n\t\tconst elizas = attackingBoard.filter((e) => e.cardId === CardIds.DreadAdmiralEliza);\r\n\t\tconst elizasTB = attackingBoard.filter((e) => e.cardId === CardIds.DreadAdmiralElizaBattlegrounds);\r\n\r\n\t\telizas.forEach((eliza) => {\r\n\t\t\tattackingBoard.forEach((entity) => {\r\n\t\t\t\tmodifyAttack(entity, 2, attackingBoard, allCards);\r\n\t\t\t\tmodifyHealth(entity, 1, attackingBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(eliza, entity, attackingBoard);\r\n\t\t\t});\r\n\t\t});\r\n\t\telizasTB.forEach((eliza) => {\r\n\t\t\tattackingBoard.forEach((entity) => {\r\n\t\t\t\tmodifyAttack(entity, 4, attackingBoard, allCards);\r\n\t\t\t\tmodifyHealth(entity, 2, attackingBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(eliza, entity, attackingBoard);\r\n\t\t\t});\r\n\t\t});\r\n\t}\r\n\tif (attacker.cardId === CardIds.VanessaVancleef || attacker.cardId === CardIds.VanessaVancleefBattlegrounds) {\r\n\t\tattackingBoard\r\n\t\t\t.filter((e) => isCorrectTribe(allCards.getCard(e.cardId).races, Race.PIRATE))\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tmodifyAttack(e, attacker.cardId === CardIds.VanessaVancleefBattlegrounds ? 4 : 2, attackingBoard, allCards);\r\n\t\t\t\tmodifyHealth(e, attacker.cardId === CardIds.VanessaVancleefBattlegrounds ? 4 : 2, attackingBoard, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(attacker, e, attackingBoard);\r\n\t\t\t});\r\n\t}\r\n};\r\n\r\nexport const applyOnBeingAttackedBuffs = (\r\n\tattackerEntity: BoardEntity,\r\n\tattackedEntity: BoardEntity,\r\n\tdefendingBoard: BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tif (attackedEntity.taunt) {\r\n\t\tconst champions = defendingBoard.filter((entity) => entity.cardId === CardIds.ChampionOfYshaarj);\r\n\t\tconst goldenChampions = defendingBoard.filter((entity) => entity.cardId === CardIds.ChampionOfYshaarjBattlegrounds);\r\n\t\tchampions.forEach((entity) => {\r\n\t\t\tmodifyAttack(entity, 1, defendingBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 1, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(entity, entity, defendingBoard);\r\n\t\t});\r\n\t\tgoldenChampions.forEach((entity) => {\r\n\t\t\tmodifyAttack(entity, 2, defendingBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 2, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(entity, entity, defendingBoard);\r\n\t\t});\r\n\r\n\t\tconst arms = defendingBoard.filter((entity) => entity.cardId === CardIds.ArmOfTheEmpire);\r\n\t\tconst goldenArms = defendingBoard.filter((entity) => entity.cardId === CardIds.ArmOfTheEmpireBattlegrounds);\r\n\t\tarms.forEach((arm) => {\r\n\t\t\tmodifyAttack(attackedEntity, 2, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(arm, attackedEntity, defendingBoard);\r\n\t\t});\r\n\t\tgoldenArms.forEach((arm) => {\r\n\t\t\tmodifyAttack(attackedEntity, 4, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(arm, attackedEntity, defendingBoard);\r\n\t\t});\r\n\t}\r\n\tif (attackedEntity.cardId === CardIds.TormentedRitualist) {\r\n\t\tconst neighbours = getNeighbours(defendingBoard, attackedEntity);\r\n\t\tneighbours.forEach((entity) => {\r\n\t\t\tmodifyAttack(entity, 1, defendingBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 1, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(attackedEntity, entity, defendingBoard);\r\n\t\t});\r\n\t}\r\n\tif (attackedEntity.cardId === CardIds.TormentedRitualistBattlegrounds) {\r\n\t\tconst neighbours = getNeighbours(defendingBoard, attackedEntity);\r\n\t\tneighbours.forEach((entity) => {\r\n\t\t\tmodifyAttack(entity, 2, defendingBoard, allCards);\r\n\t\t\tmodifyHealth(entity, 2, defendingBoard, allCards);\r\n\t\t\tspectator.registerPowerTarget(attackedEntity, entity, defendingBoard);\r\n\t\t});\r\n\t}\r\n\tif (attackedEntity.cardId === CardIds.DozyWhelp || attackedEntity.cardId === CardIds.DozyWhelpBattlegrounds) {\r\n\t\tmodifyAttack(attackedEntity, attackedEntity.cardId === CardIds.DozyWhelpBattlegrounds ? 2 : 1, defendingBoard, allCards);\r\n\t\tspectator.registerPowerTarget(attackedEntity, attackedEntity, defendingBoard);\r\n\t}\r\n\tif (attackerEntity.cardId === CardIds.SindoreiStraightShot || attackerEntity.cardId === CardIds.SindoreiStraightShotBattlegrounds) {\r\n\t\tattackedEntity.taunt = false;\r\n\t\tattackedEntity.reborn = false;\r\n\t}\r\n};\r\n\r\nconst makeMinionsDie = (board: BoardEntity[], allCards: AllCardsService, spectator: Spectator): [number[], BoardEntity[]] => {\r\n\t// Because entities spawn to the left, so the right index is unchanged\r\n\tconst deadMinionIndexesFromRight: number[] = [];\r\n\tconst deadEntities: BoardEntity[] = [];\r\n\tfor (let i = 0; i < board.length; i++) {\r\n\t\tif (board[i].health <= 0 || board[i].definitelyDead) {\r\n\t\t\tdeadMinionIndexesFromRight.push(board.length - (i + 1));\r\n\t\t\tdeadEntities.push(board[i]);\r\n\t\t\tremoveMinionFromBoard(board, i, allCards, spectator);\r\n\t\t\t// We modify the original array, so we need to update teh current index accordingly\r\n\t\t\ti--;\r\n\t\t}\r\n\t}\r\n\t// Treat all dead entities as a single block\r\n\tconst blockIndexesFromRight = [...deadMinionIndexesFromRight];\r\n\tfor (let i = deadMinionIndexesFromRight.length - 1; i >= 0; i--) {\r\n\t\tif (i === deadMinionIndexesFromRight.length - 1) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (Math.abs(deadMinionIndexesFromRight[i] - deadMinionIndexesFromRight[i + 1]) <= 1) {\r\n\t\t\tblockIndexesFromRight[i] = blockIndexesFromRight[i + 1];\r\n\t\t} else {\r\n\t\t\tblockIndexesFromRight[i] = blockIndexesFromRight[i];\r\n\t\t}\r\n\t}\r\n\treturn [blockIndexesFromRight, deadEntities];\r\n};\r\n\r\n// const handleKillEffects = (\r\n// \tboardWithKilledMinion: BoardEntity[],\r\n// \tkillerBoard: BoardEntity[],\r\n// \tdeadEntity: BoardEntity,\r\n// \tallCards: AllCardsService,\r\n// \tspectator: Spectator,\r\n// ): void => {\r\n// \tif (\r\n// \t\tdeadEntity.lastAffectedByEntity?.cardId &&\r\n// \t\tisCorrectTribe(allCards.getCard(deadEntity.lastAffectedByEntity.cardId).race, Race.DRAGON)\r\n// \t) {\r\n// \t\tfor (const entity of killerBoard) {\r\n// \t\t\tif (entity.cardId === CardIds.WaxriderTogwaggle2) {\r\n// \t\t\t\tmodifyAttack(entity, 2, killerBoard, allCards);\r\n// \t\t\t\tmodifyHealth(entity, 2, killerBoard, allCards);\r\n// \t\t\t\tafterStatsUpdate(entity, killerBoard, allCards);\r\n// \t\t\t\tspectator.registerPowerTarget(entity, entity, killerBoard);\r\n// \t\t\t} else if (entity.cardId === CardIds.WaxriderTogwaggleBattlegrounds) {\r\n// \t\t\t\tmodifyAttack(entity, 4, killerBoard, allCards);\r\n// \t\t\t\tmodifyHealth(entity, 4, killerBoard, allCards);\r\n// \t\t\t\tafterStatsUpdate(entity, killerBoard, allCards);\r\n// \t\t\t\tspectator.registerPowerTarget(entity, entity, killerBoard);\r\n// \t\t\t}\r\n// \t\t}\r\n// \t}\r\n// };\r\n\r\nconst buildBoardAfterDeathrattleSpawns = (\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadMinionIndexFromRight2: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tentitiesDeadThisAttack: readonly BoardEntity[],\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\t// TODO: don't apply this for FishOfNZoth\r\n\t// if (deadMinionIndex >= 0) {\r\n\t// \thandleKillEffects(boardWithKilledMinion, opponentBoard, deadEntity, allCards, spectator);\r\n\t// }\r\n\r\n\t// But Wildfire Element is applied first, before the DR spawns\r\n\tif (deadMinionIndexFromRight2 >= 0) {\r\n\t\tapplyMinionDeathEffect(\r\n\t\t\tdeadEntity,\r\n\t\t\tdeadMinionIndexFromRight2,\r\n\t\t\tboardWithKilledMinion,\r\n\t\t\tboardWithKilledMinionHero,\r\n\t\t\topponentBoard,\r\n\t\t\topponentBoardHero,\r\n\t\t\tallCards,\r\n\t\t\tcardsData,\r\n\t\t\tsharedState,\r\n\t\t\tspectator,\r\n\t\t);\r\n\t}\r\n\tconst entitiesFromNativeDeathrattle: readonly BoardEntity[] = spawnEntitiesFromDeathrattle(\r\n\t\tdeadEntity,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tentitiesDeadThisAttack,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\tconst entitiesFromEnchantments: readonly BoardEntity[] = spawnEntitiesFromEnchantments(\r\n\t\tdeadEntity,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\tconst candidateEntities: readonly BoardEntity[] = [...entitiesFromNativeDeathrattle, ...entitiesFromEnchantments];\r\n\tperformEntitySpawns(\r\n\t\tcandidateEntities,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight2,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\t// In case of leapfrogger, we want to first spawn the minions, then apply the frog effect\r\n\thandleDeathrattleEffects(\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight2,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\t// eslint-disable-next-line prettier/prettier\r\n\tif (deadEntity.rememberedDeathrattles?.length) {\r\n\t\tfor (const deathrattle of deadEntity.rememberedDeathrattles) {\r\n\t\t\tconst entityToProcess: BoardEntity = {\r\n\t\t\t\t...deadEntity,\r\n\t\t\t\trememberedDeathrattles: undefined,\r\n\t\t\t\tcardId: deathrattle.cardId,\r\n\t\t\t\tenchantments: [\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tcardId: deathrattle.cardId,\r\n\t\t\t\t\t\toriginEntityId: deadEntity.entityId,\r\n\t\t\t\t\t\trepeats: deathrattle.repeats ?? 1,\r\n\t\t\t\t\t\ttiming: deathrattle.timing,\r\n\t\t\t\t\t},\r\n\t\t\t\t],\r\n\t\t\t};\r\n\t\t\tbuildBoardAfterDeathrattleSpawns(\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\tentityToProcess,\r\n\t\t\t\tdeadMinionIndexFromRight2,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tentitiesDeadThisAttack,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n\t// TODO: check if Avenge effects should proc after deathrattles instead\r\n\t// They most certainly do, since the rat pack + avenge beast buffer works\r\n\tapplyAvengeEffects(\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight2,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n};\r\n\r\nconst buildBoardAfterRebornSpawns = (\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tdeadEntity: BoardEntity,\r\n\tdeadMinionIndexFromRight: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): void => {\r\n\tconst numberOfReborns = 1;\r\n\t// Reborn happens after deathrattles\r\n\tif (!deadEntity.cardId) {\r\n\t\tconsole.error('missing card id for dead entity', stringifySimpleCard(deadEntity, allCards), deadEntity);\r\n\t}\r\n\tlet entityToSpawn: BoardEntity = null;\r\n\t// TODO: test\r\n\tif (deadEntity.cardId === CardIds.SinrunnerBlanchy || deadEntity.cardId === CardIds.SinrunnerBlanchyBattlegrounds) {\r\n\t\tentityToSpawn = {\r\n\t\t\t...deadEntity,\r\n\t\t\thealth: deadEntity.maxHealth,\r\n\t\t\tdivineShield: deadEntity.hadDivineShield,\r\n\t\t\treborn: false,\r\n\t\t};\r\n\t}\r\n\tconst entitiesFromReborn: readonly BoardEntity[] =\r\n\t\tdeadEntity.reborn && deadMinionIndexFromRight >= 0\r\n\t\t\t? spawnEntities(\r\n\t\t\t\t\tdeadEntity.cardId,\r\n\t\t\t\t\tnumberOfReborns,\r\n\t\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\t\topponentBoard,\r\n\t\t\t\t\topponentBoardHero,\r\n\t\t\t\t\tallCards,\r\n\t\t\t\t\tcardsData,\r\n\t\t\t\t\tsharedState,\r\n\t\t\t\t\tspectator,\r\n\t\t\t\t\tdeadEntity.friendly,\r\n\t\t\t\t\tfalse,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\ttrue,\r\n\t\t\t\t\tentityToSpawn,\r\n\t\t\t\t\tdeadEntity,\r\n\t\t\t )\r\n\t\t\t: [];\r\n\tconst entitiesThatWereReborn = performEntitySpawns(\r\n\t\tentitiesFromReborn,\r\n\t\tboardWithKilledMinion,\r\n\t\tboardWithKilledMinionHero,\r\n\t\tdeadEntity,\r\n\t\tdeadMinionIndexFromRight,\r\n\t\topponentBoard,\r\n\t\topponentBoardHero,\r\n\t\tallCards,\r\n\t\tcardsData,\r\n\t\tsharedState,\r\n\t\tspectator,\r\n\t);\r\n\r\n\tconst arfus = boardWithKilledMinion\r\n\t\t.filter((e) => e.cardId === CardIds.ArfusBattlegrounds_TB_BaconShop_HERO_22_Buddy)\r\n\t\t.map((e) => e.attack)\r\n\t\t.reduce((a, b) => a + b, 0);\r\n\tconst goldenArfus = boardWithKilledMinion\r\n\t\t.filter((e) => e.cardId === CardIds.ArfusBattlegrounds_TB_BaconShop_HERO_22_Buddy_G)\r\n\t\t.map((e) => 2 * e.attack)\r\n\t\t.reduce((a, b) => a + b, 0);\r\n\tif (arfus + goldenArfus > 0) {\r\n\t\tentitiesThatWereReborn.forEach((e) => {\r\n\t\t\tmodifyAttack(e, arfus + goldenArfus, boardWithKilledMinion, allCards);\r\n\t\t\tafterStatsUpdate(e, boardWithKilledMinion, allCards);\r\n\t\t});\r\n\t}\r\n\r\n\tconst numberOfTriggersForDeathwhisper = Math.min(entitiesFromReborn.length, 1);\r\n\tfor (let i = 0; i < numberOfTriggersForDeathwhisper; i++) {\r\n\t\tboardWithKilledMinion\r\n\t\t\t.filter((e) => e.cardId === CardIds.SisterDeathwhisper || e.cardId === CardIds.SisterDeathwhisperBattlegrounds)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst multiplier = e.cardId === CardIds.SisterDeathwhisperBattlegrounds ? 2 : 1;\r\n\t\t\t\taddStatsToBoard(e, boardWithKilledMinion, multiplier * 1, multiplier * 2, allCards, spectator, Race[Race.UNDEAD]);\r\n\t\t\t});\r\n\t\tboardWithKilledMinion\r\n\t\t\t.filter((e) => e.cardId === CardIds.JellyBelly || e.cardId === CardIds.JellyBellyBattlegrounds)\r\n\t\t\t.forEach((e) => {\r\n\t\t\t\tconst multiplier = e.cardId === CardIds.JellyBellyBattlegrounds ? 2 : 1;\r\n\t\t\t\tmodifyAttack(e, multiplier * 3, boardWithKilledMinion, allCards);\r\n\t\t\t\tmodifyHealth(e, multiplier * 3, boardWithKilledMinion, allCards);\r\n\t\t\t\tafterStatsUpdate(e, boardWithKilledMinion, allCards);\r\n\t\t\t\tspectator.registerPowerTarget(e, e, boardWithKilledMinion);\r\n\t\t\t});\r\n\t}\r\n};\r\n\r\nexport const performEntitySpawns = (\r\n\tcandidateEntities: readonly BoardEntity[],\r\n\tboardWithKilledMinion: BoardEntity[],\r\n\tboardWithKilledMinionHero: BgsPlayerEntity,\r\n\tspawnSourceEntity: BoardEntity | BgsPlayerEntity,\r\n\tspawnSourceEntityIndexFromRight: number,\r\n\topponentBoard: BoardEntity[],\r\n\topponentBoardHero: BgsPlayerEntity,\r\n\tallCards: AllCardsService,\r\n\tcardsData: CardsData,\r\n\tsharedState: SharedState,\r\n\tspectator: Spectator,\r\n): readonly BoardEntity[] => {\r\n\tconst aliveEntites = candidateEntities.filter((entity) => entity.health > 0 && !entity.definitelyDead);\r\n\tconst spawnedEntities = [];\r\n\tfor (const newMinion of aliveEntites) {\r\n\t\t// All entities have been spawned\r\n\t\tif (boardWithKilledMinion.length >= 7) {\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\t// Avoid minions spawning backwards (we don't have this issue if we add all elements at\r\n\t\t// the same time, but here we want to be able to attack after each spawn, which in turn\r\n\t\t// means that the minion can die before the other one spawns)\r\n\t\t// In boardWithKilledMinion, the dead minion has already been removed\r\n\t\tconst indexToSpawnAt = boardWithKilledMinion.length - spawnSourceEntityIndexFromRight;\r\n\t\taddMinionToBoard(\r\n\t\t\tboardWithKilledMinion,\r\n\t\t\tboardWithKilledMinionHero,\r\n\t\t\topponentBoardHero,\r\n\t\t\tindexToSpawnAt,\r\n\t\t\tnewMinion,\r\n\t\t\tallCards,\r\n\t\t\tspectator,\r\n\t\t\tsharedState,\r\n\t\t);\r\n\t\tif (newMinion.attackImmediately) {\r\n\t\t\t// Whenever we are already in a combat phase, we need to first clean up the state\r\n\t\t\tsimulateAttack(\r\n\t\t\t\tboardWithKilledMinion,\r\n\t\t\t\tboardWithKilledMinionHero,\r\n\t\t\t\topponentBoard,\r\n\t\t\t\topponentBoardHero,\r\n\t\t\t\tnull,\r\n\t\t\t\tallCards,\r\n\t\t\t\tcardsData,\r\n\t\t\t\tsharedState,\r\n\t\t\t\tspectator,\r\n\t\t\t);\r\n\t\t}\r\n\t\tif (newMinion.health > 0 && !newMinion.definitelyDead) {\r\n\t\t\tspawnedEntities.push(newMinion);\r\n\t\t}\r\n\t}\r\n\r\n\tspectator.registerMinionsSpawn(spawnSourceEntity, boardWithKilledMinion, spawnedEntities);\r\n\treturn spawnedEntities;\r\n};\r\n"]}
|