azeroth-shell 0.0.0-stage → 0.1.1
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/README.md +138 -2
- package/bin/azsh.mjs +19 -0
- package/docs/aifid/eventai-texts.json +4414 -0
- package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
- package/docs/dungeons/survey/pack-id-migration.json +2418 -0
- package/package.json +35 -4
- package/src/autopilot/bossSkip.ts +26 -0
- package/src/autopilot/combatRotation.ts +824 -0
- package/src/autopilot/config.ts +533 -0
- package/src/autopilot/consumables.ts +58 -0
- package/src/autopilot/encounterStand.ts +121 -0
- package/src/autopilot/objectGatePlan.ts +53 -0
- package/src/autopilot/pathEngage.ts +229 -0
- package/src/autopilot/plan.ts +1643 -0
- package/src/autopilot/questPolicy.ts +274 -0
- package/src/autopilot/routeStep.ts +69 -0
- package/src/autopilot/sessionReport.ts +88 -0
- package/src/autopilot/topOffPower.ts +26 -0
- package/src/autopilot/view.ts +476 -0
- package/src/cli/bootCheck.mjs +34 -0
- package/src/cli/bootData.mjs +57 -0
- package/src/cli/combatLogFilter.ts +153 -0
- package/src/cli/combatLogFormat.ts +613 -0
- package/src/cli/fileRepository.mjs +105 -0
- package/src/cli/gzLoader.mjs +31 -0
- package/src/cli/liveGauntletEscort.ts +978 -0
- package/src/cli/liveStratUndead.ts +305 -0
- package/src/cli/macroHostCombat.ts +545 -0
- package/src/cli/macroHostWorld.ts +330 -0
- package/src/cli/prefs.mjs +31 -0
- package/src/cli/register.mjs +4 -0
- package/src/cli/repl.mjs +693 -0
- package/src/cli/rotationText.mjs +226 -0
- package/src/cli/squad.mjs +105 -0
- package/src/cli/term.mjs +144 -0
- package/src/cli/text.mjs +122 -0
- package/src/cli/tui.mjs +626 -0
- package/src/cli/tuiArena.mjs +109 -0
- package/src/cli/tuiAutopilotSettings.mjs +93 -0
- package/src/cli/tuiBags.mjs +180 -0
- package/src/cli/tuiBars.mjs +133 -0
- package/src/cli/tuiBg.mjs +243 -0
- package/src/cli/tuiBulk.mjs +162 -0
- package/src/cli/tuiCheck.mjs +1882 -0
- package/src/cli/tuiCity.mjs +396 -0
- package/src/cli/tuiCompanionKit.mjs +300 -0
- package/src/cli/tuiCompanions.mjs +471 -0
- package/src/cli/tuiDev.mjs +62 -0
- package/src/cli/tuiDungeon.mjs +606 -0
- package/src/cli/tuiEnchantTarget.mjs +120 -0
- package/src/cli/tuiFight.mjs +577 -0
- package/src/cli/tuiFightPanes.mjs +228 -0
- package/src/cli/tuiFloor.mjs +506 -0
- package/src/cli/tuiGear.mjs +158 -0
- package/src/cli/tuiHonor.mjs +74 -0
- package/src/cli/tuiLoot.mjs +97 -0
- package/src/cli/tuiMacros.mjs +144 -0
- package/src/cli/tuiOutfitter.mjs +115 -0
- package/src/cli/tuiPet.mjs +116 -0
- package/src/cli/tuiProfessions.mjs +800 -0
- package/src/cli/tuiRaid.mjs +127 -0
- package/src/cli/tuiRep.mjs +65 -0
- package/src/cli/tuiSaves.mjs +69 -0
- package/src/cli/tuiSearch.mjs +363 -0
- package/src/cli/tuiSettings.mjs +151 -0
- package/src/cli/tuiSimLab.mjs +80 -0
- package/src/cli/tuiTalents.mjs +60 -0
- package/src/cli/tuiViews.mjs +1178 -0
- package/src/cli/tuiWiki.mjs +181 -0
- package/src/cli/tuiWorld.mjs +361 -0
- package/src/cli/wikiIndex.ts +259 -0
- package/src/cli/wikiSources.ts +355 -0
- package/src/data/alteracValley.ts +176 -0
- package/src/data/appearanceOptions.ts +534 -0
- package/src/data/applyLootChanceSanity.ts +21 -0
- package/src/data/createFlavor.ts +96 -0
- package/src/data/customItems.ts +33 -0
- package/src/data/dataStore.ts +1904 -0
- package/src/data/dungeonGameObjects.ts +84 -0
- package/src/data/dungeonPlateCover.ts +66 -0
- package/src/data/dungeonSpawns.ts +294 -0
- package/src/data/dungeons/alterac-valley.ts +135 -0
- package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
- package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
- package/src/data/dungeons/apply-instance-geometry.ts +65 -0
- package/src/data/dungeons/apply-spawn-placement.ts +171 -0
- package/src/data/dungeons/blackfathom-deeps.ts +539 -0
- package/src/data/dungeons/blackrock-depths.ts +1410 -0
- package/src/data/dungeons/blackwing-lair.ts +129 -0
- package/src/data/dungeons/boss-eventai.ts +8 -0
- package/src/data/dungeons/deadmines.ts +410 -0
- package/src/data/dungeons/dire-maul-east.ts +980 -0
- package/src/data/dungeons/dire-maul-north.ts +661 -0
- package/src/data/dungeons/dire-maul-west.ts +785 -0
- package/src/data/dungeons/dungeon-rooms.json +5479 -0
- package/src/data/dungeons/encounter-outdoors.json +359 -0
- package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
- package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
- package/src/data/dungeons/eventai/deadmines.ts +264 -0
- package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
- package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
- package/src/data/dungeons/eventai/helpers.ts +79 -0
- package/src/data/dungeons/eventai/index.ts +133 -0
- package/src/data/dungeons/eventai/lbrs.ts +372 -0
- package/src/data/dungeons/eventai/maraudon.ts +323 -0
- package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
- package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
- package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
- package/src/data/dungeons/eventai/scholomance.ts +680 -0
- package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
- package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
- package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
- package/src/data/dungeons/eventai/sm-library.ts +55 -0
- package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
- package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
- package/src/data/dungeons/eventai/the-stockade.ts +228 -0
- package/src/data/dungeons/eventai/ubrs.ts +225 -0
- package/src/data/dungeons/eventai/uldaman.ts +355 -0
- package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
- package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
- package/src/data/dungeons/gnomeregan.ts +909 -0
- package/src/data/dungeons/index.ts +126 -0
- package/src/data/dungeons/instance-geometry.json +5233 -0
- package/src/data/dungeons/key-sources.json +169 -0
- package/src/data/dungeons/lbrs.ts +996 -0
- package/src/data/dungeons/maraudon.ts +786 -0
- package/src/data/dungeons/molten-core.ts +194 -0
- package/src/data/dungeons/naxxramas.ts +173 -0
- package/src/data/dungeons/onyxias-lair.ts +71 -0
- package/src/data/dungeons/pack-from-clusters.ts +1256 -0
- package/src/data/dungeons/ragefire-chasm.ts +238 -0
- package/src/data/dungeons/razorfen-downs.ts +698 -0
- package/src/data/dungeons/razorfen-kraul.ts +766 -0
- package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
- package/src/data/dungeons/scholomance.ts +1076 -0
- package/src/data/dungeons/shadowfang-keep.ts +740 -0
- package/src/data/dungeons/sm-armory.ts +266 -0
- package/src/data/dungeons/sm-cathedral.ts +430 -0
- package/src/data/dungeons/sm-graveyard.ts +482 -0
- package/src/data/dungeons/sm-library.ts +337 -0
- package/src/data/dungeons/stratholme-live.ts +808 -0
- package/src/data/dungeons/stratholme-undead.ts +1164 -0
- package/src/data/dungeons/sunken-temple.ts +931 -0
- package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
- package/src/data/dungeons/the-stockade.ts +282 -0
- package/src/data/dungeons/ubrs.ts +1286 -0
- package/src/data/dungeons/uldaman.ts +685 -0
- package/src/data/dungeons/wailing-caverns.ts +356 -0
- package/src/data/dungeons/zul-farrak.ts +686 -0
- package/src/data/dungeons/zul-gurub.ts +142 -0
- package/src/data/dungeons.ts +42 -0
- package/src/data/fixtures.ts +446 -0
- package/src/data/gameobject-data.json.gz +0 -0
- package/src/data/item-data.json.gz +0 -0
- package/src/data/loot-data.json.gz +0 -0
- package/src/data/maps/atlas-approach-maps.json +1425 -0
- package/src/data/maps/atlas-landmarks.json +1711 -0
- package/src/data/maps/dungeon-viewports.json +392 -0
- package/src/data/materializeModDamagePercentTaken.ts +70 -0
- package/src/data/materializeModHealthRegen.ts +89 -0
- package/src/data/materializeSpellReputation.ts +26 -0
- package/src/data/pageTexts.ts +19 -0
- package/src/data/profession-data.json.gz +0 -0
- package/src/data/raid-plans/blackfathom-deeps.json +86 -0
- package/src/data/raid-plans/blackrock-depths.json +419 -0
- package/src/data/raid-plans/blackwing-lair.json +328 -0
- package/src/data/raid-plans/deadmines.json +55 -0
- package/src/data/raid-plans/dire-maul-east.json +94 -0
- package/src/data/raid-plans/dire-maul-north.json +70 -0
- package/src/data/raid-plans/dire-maul-west.json +75 -0
- package/src/data/raid-plans/gnomeregan.json +131 -0
- package/src/data/raid-plans/lbrs.json +176 -0
- package/src/data/raid-plans/maraudon.json +102 -0
- package/src/data/raid-plans/molten-core.json +169 -0
- package/src/data/raid-plans/naxxramas.json +354 -0
- package/src/data/raid-plans/onyxias-lair.json +18 -0
- package/src/data/raid-plans/ragefire-chasm.json +30 -0
- package/src/data/raid-plans/razorfen-downs.json +75 -0
- package/src/data/raid-plans/razorfen-kraul.json +53 -0
- package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
- package/src/data/raid-plans/scholomance.json +170 -0
- package/src/data/raid-plans/shadowfang-keep.json +87 -0
- package/src/data/raid-plans/sm-armory.json +53 -0
- package/src/data/raid-plans/sm-cathedral.json +72 -0
- package/src/data/raid-plans/sm-graveyard.json +63 -0
- package/src/data/raid-plans/sm-library.json +23 -0
- package/src/data/raid-plans/stratholme-live.json +129 -0
- package/src/data/raid-plans/stratholme-undead.json +73 -0
- package/src/data/raid-plans/sunken-temple.json +159 -0
- package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
- package/src/data/raid-plans/the-stockade.json +42 -0
- package/src/data/raid-plans/ubrs.json +53 -0
- package/src/data/raid-plans/uldaman.json +131 -0
- package/src/data/raid-plans/wailing-caverns.json +90 -0
- package/src/data/raid-plans/zul-farrak.json +156 -0
- package/src/data/raid-plans/zul-gurub.json +307 -0
- package/src/data/raidInstanceCreatures.mjs +473 -0
- package/src/data/rotations/index.ts +152 -0
- package/src/data/rotations/layout.mjs +72 -0
- package/src/data/rotations/pve/druid/balance.json +754 -0
- package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
- package/src/data/rotations/pve/druid/feral.json +2660 -0
- package/src/data/rotations/pve/druid/restoration.json +424 -0
- package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
- package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
- package/src/data/rotations/pve/hunter/survival.json +1373 -0
- package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
- package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
- package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
- package/src/data/rotations/pve/paladin/holy.json +755 -0
- package/src/data/rotations/pve/paladin/protection.json +962 -0
- package/src/data/rotations/pve/paladin/retribution.json +924 -0
- package/src/data/rotations/pve/priest/discipline.json +772 -0
- package/src/data/rotations/pve/priest/holy.json +707 -0
- package/src/data/rotations/pve/priest/shadow.json +787 -0
- package/src/data/rotations/pve/rogue/assassination.json +2477 -0
- package/src/data/rotations/pve/rogue/combat.json +2483 -0
- package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
- package/src/data/rotations/pve/shaman/elemental.json +1157 -0
- package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
- package/src/data/rotations/pve/shaman/restoration.json +592 -0
- package/src/data/rotations/pve/warlock/affliction.json +1185 -0
- package/src/data/rotations/pve/warlock/demonology.json +1165 -0
- package/src/data/rotations/pve/warlock/destruction.json +1177 -0
- package/src/data/rotations/pve/warrior/arms.json +3020 -0
- package/src/data/rotations/pve/warrior/fury.json +2996 -0
- package/src/data/rotations/pve/warrior/protection.json +2509 -0
- package/src/data/rotations/pvp/druid/balance.json +593 -0
- package/src/data/rotations/pvp/druid/feral.json +3276 -0
- package/src/data/rotations/pvp/druid/restoration.json +662 -0
- package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
- package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
- package/src/data/rotations/pvp/hunter/survival.json +635 -0
- package/src/data/rotations/pvp/mage/arcane.json +574 -0
- package/src/data/rotations/pvp/mage/fire.json +570 -0
- package/src/data/rotations/pvp/mage/frost.json +4048 -0
- package/src/data/rotations/pvp/paladin/holy.json +1498 -0
- package/src/data/rotations/pvp/paladin/protection.json +567 -0
- package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
- package/src/data/rotations/pvp/priest/discipline.json +1848 -0
- package/src/data/rotations/pvp/priest/holy.json +6340 -0
- package/src/data/rotations/pvp/priest/shadow.json +2329 -0
- package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
- package/src/data/rotations/pvp/rogue/combat.json +5258 -0
- package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
- package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
- package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
- package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
- package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
- package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
- package/src/data/rotations/pvp/warlock/destruction.json +638 -0
- package/src/data/rotations/pvp/warrior/arms.json +5665 -0
- package/src/data/rotations/pvp/warrior/fury.json +850 -0
- package/src/data/rotations/pvp/warrior/protection.json +777 -0
- package/src/data/schema/bundle.ts +511 -0
- package/src/data/schema/constants.ts +49 -0
- package/src/data/schema/creature.ts +454 -0
- package/src/data/schema/encounter.ts +155 -0
- package/src/data/schema/faction.ts +48 -0
- package/src/data/schema/item.ts +297 -0
- package/src/data/schema/itemEnchant.ts +105 -0
- package/src/data/schema/npc.ts +44 -0
- package/src/data/schema/primitives.ts +295 -0
- package/src/data/schema/profession.ts +226 -0
- package/src/data/schema/quest.ts +154 -0
- package/src/data/schema/spell.ts +1149 -0
- package/src/data/schema/talent.ts +74 -0
- package/src/data/schema/world.ts +124 -0
- package/src/data/schema.ts +19 -0
- package/src/data/skinNodeGapFill.ts +68 -0
- package/src/data/spell-data.json.gz +0 -0
- package/src/data/spell-script-targets.json +1 -0
- package/src/data/tables/ahItemValues.json.gz +0 -0
- package/src/data/tables/alteracValley.json.gz +0 -0
- package/src/data/tables/areatriggerTeleports.json.gz +0 -0
- package/src/data/tables/botNames.json.gz +0 -0
- package/src/data/tables/botPopulation.json.gz +0 -0
- package/src/data/tables/botSpecs.json.gz +0 -0
- package/src/data/tables/classLevelStats.json.gz +0 -0
- package/src/data/tables/combatConditions.json.gz +0 -0
- package/src/data/tables/combatSkillMeta.json.gz +0 -0
- package/src/data/tables/conditions.json.gz +0 -0
- package/src/data/tables/createInfo.json.gz +0 -0
- package/src/data/tables/creatureAggroGroups.json.gz +0 -0
- package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
- package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
- package/src/data/tables/creatureWeapons.json.gz +0 -0
- package/src/data/tables/creatures.json.gz +0 -0
- package/src/data/tables/dbScripts.json.gz +0 -0
- package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
- package/src/data/tables/dungeonCensus.json.gz +0 -0
- package/src/data/tables/dungeonGameObjects.json.gz +0 -0
- package/src/data/tables/dungeonPacks.json.gz +0 -0
- package/src/data/tables/dungeonPlateCover.json.gz +0 -0
- package/src/data/tables/dungeonSpawns.json.gz +0 -0
- package/src/data/tables/dungeonSurvey.json.gz +0 -0
- package/src/data/tables/durabilityCosts.json.gz +0 -0
- package/src/data/tables/durabilityQuality.json.gz +0 -0
- package/src/data/tables/enchantApplicators.json.gz +0 -0
- package/src/data/tables/entranceYards.json.gz +0 -0
- package/src/data/tables/explorationBasexp.json.gz +0 -0
- package/src/data/tables/factionTemplates.json.gz +0 -0
- package/src/data/tables/factions.json.gz +0 -0
- package/src/data/tables/gameEvents.json.gz +0 -0
- package/src/data/tables/gameObjects.json.gz +0 -0
- package/src/data/tables/gossipMenus.json.gz +0 -0
- package/src/data/tables/graveyards.json.gz +0 -0
- package/src/data/tables/instanceMaps.json.gz +0 -0
- package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
- package/src/data/tables/itemEnchants.json.gz +0 -0
- package/src/data/tables/itemRandomProperties.json.gz +0 -0
- package/src/data/tables/itemSets.json.gz +0 -0
- package/src/data/tables/items.json.gz +0 -0
- package/src/data/tables/levelStats.json.gz +0 -0
- package/src/data/tables/locks.json.gz +0 -0
- package/src/data/tables/map-pin-overrides.json.gz +0 -0
- package/src/data/tables/nonCombatTrash.json.gz +0 -0
- package/src/data/tables/npcTexts.json.gz +0 -0
- package/src/data/tables/pageTexts.json.gz +0 -0
- package/src/data/tables/petAbilityTP.json.gz +0 -0
- package/src/data/tables/petGenericSpells.json.gz +0 -0
- package/src/data/tables/petLevelStats.json.gz +0 -0
- package/src/data/tables/playerbot-weightscales.json.gz +0 -0
- package/src/data/tables/pools.json.gz +0 -0
- package/src/data/tables/quests.json.gz +0 -0
- package/src/data/tables/races.json.gz +0 -0
- package/src/data/tables/reputationRanks.json.gz +0 -0
- package/src/data/tables/reputationRates.json.gz +0 -0
- package/src/data/tables/reputationSpillover.json.gz +0 -0
- package/src/data/tables/ridingSpells.json.gz +0 -0
- package/src/data/tables/scriptTexts.json.gz +0 -0
- package/src/data/tables/soundClipVolume.json.gz +0 -0
- package/src/data/tables/spellChain.json.gz +0 -0
- package/src/data/tables/spellTeleports.json.gz +0 -0
- package/src/data/tables/spells.json.gz +0 -0
- package/src/data/tables/talents.json.gz +0 -0
- package/src/data/tables/tavernTriggers.json.gz +0 -0
- package/src/data/tables/taxiNodes.json.gz +0 -0
- package/src/data/tables/taxiRoutes.json.gz +0 -0
- package/src/data/tables/trainers.json.gz +0 -0
- package/src/data/tables/transports.json.gz +0 -0
- package/src/data/tables/travelAnchors.json.gz +0 -0
- package/src/data/tables/travelEdges.json.gz +0 -0
- package/src/data/tables/unitConditions.json.gz +0 -0
- package/src/data/tables/vendors.json.gz +0 -0
- package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
- package/src/data/tables/xp.json.gz +0 -0
- package/src/data/tables/zoneWeather.json.gz +0 -0
- package/src/data/tables/zones.json.gz +0 -0
- package/src/data/world-data.ts +56 -0
- package/src/data/zone-music-sets.json +2751 -0
- package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
- package/src/domain/audioQuality.mjs +145 -0
- package/src/domain/bg/ab.ts +433 -0
- package/src/domain/bg/arenaComps.ts +644 -0
- package/src/domain/bg/arenaLab.ts +695 -0
- package/src/domain/bg/arenaPace.ts +31 -0
- package/src/domain/bg/arenaRating.ts +110 -0
- package/src/domain/bg/av.ts +758 -0
- package/src/domain/bg/avEnemyPush.ts +219 -0
- package/src/domain/bg/avField.ts +283 -0
- package/src/domain/bg/avInstanceNodes.ts +197 -0
- package/src/domain/bg/avInstanceScore.ts +123 -0
- package/src/domain/bg/avQuestItems.ts +55 -0
- package/src/domain/bg/avQuests.ts +210 -0
- package/src/domain/bg/avSession.ts +196 -0
- package/src/domain/bg/bgConsumes.ts +269 -0
- package/src/domain/bg/bgPrebuff.ts +153 -0
- package/src/domain/bg/bgRest.ts +91 -0
- package/src/domain/bg/bgRoster.ts +305 -0
- package/src/domain/bg/bgTier.ts +61 -0
- package/src/domain/bg/bgWorld.ts +862 -0
- package/src/domain/bg/match.ts +215 -0
- package/src/domain/bg/strategies.ts +552 -0
- package/src/domain/bg/types.ts +291 -0
- package/src/domain/bg/wsg.ts +264 -0
- package/src/domain/bots/actionProviderSpec.ts +38 -0
- package/src/domain/bots/autoConsumables.ts +285 -0
- package/src/domain/bots/betweenPullRest.ts +239 -0
- package/src/domain/bots/botGear.ts +248 -0
- package/src/domain/bots/botInventory.ts +486 -0
- package/src/domain/bots/botPet.ts +535 -0
- package/src/domain/bots/botPool.ts +291 -0
- package/src/domain/bots/botProfessions.ts +334 -0
- package/src/domain/bots/companionActionBar.ts +209 -0
- package/src/domain/bots/companionHireCost.ts +236 -0
- package/src/domain/bots/companionMissions.ts +582 -0
- package/src/domain/bots/companionPrep.ts +254 -0
- package/src/domain/bots/companionQuests.ts +270 -0
- package/src/domain/bots/companionRep.ts +75 -0
- package/src/domain/bots/companionRotation.ts +708 -0
- package/src/domain/bots/companionXp.ts +66 -0
- package/src/domain/bots/consumableShare.ts +811 -0
- package/src/domain/bots/dpsMate.ts +1072 -0
- package/src/domain/bots/groupCompReport.ts +132 -0
- package/src/domain/bots/healthstoneSupply.ts +198 -0
- package/src/domain/bots/outfitter.ts +1056 -0
- package/src/domain/bots/paladinPrePull.ts +231 -0
- package/src/domain/bots/partyRole.ts +40 -0
- package/src/domain/bots/playerbotEquipCache.ts +412 -0
- package/src/domain/bots/playerbotItemEligibility.ts +60 -0
- package/src/domain/bots/playerbotStatWeight.ts +853 -0
- package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
- package/src/domain/bots/prePullBuffs.ts +219 -0
- package/src/domain/bots/prePullStealth.ts +82 -0
- package/src/domain/bots/runSupply.ts +251 -0
- package/src/domain/bots/runSupplyPrefs.ts +28 -0
- package/src/domain/bots/sendTradeGoods.ts +394 -0
- package/src/domain/bots/soulShardCap.ts +35 -0
- package/src/domain/bots/squad.ts +842 -0
- package/src/domain/bots/squadRun.ts +81 -0
- package/src/domain/character/actionbar.ts +346 -0
- package/src/domain/character/appearance.ts +165 -0
- package/src/domain/character/buildCombatant.ts +1726 -0
- package/src/domain/character/character.ts +356 -0
- package/src/domain/character/characterName.ts +43 -0
- package/src/domain/character/characterRatings.ts +424 -0
- package/src/domain/character/characterSpells.ts +282 -0
- package/src/domain/character/characterStats.ts +1559 -0
- package/src/domain/character/characterTalents.ts +398 -0
- package/src/domain/character/combatSkills.ts +994 -0
- package/src/domain/character/displayForm.ts +72 -0
- package/src/domain/character/formTalentAuras.ts +171 -0
- package/src/domain/character/forms.ts +499 -0
- package/src/domain/character/races.ts +40 -0
- package/src/domain/character/resurrectionSickness.ts +49 -0
- package/src/domain/character/spellbook.ts +169 -0
- package/src/domain/character/stanceBar.ts +354 -0
- package/src/domain/character/stancePrereq.ts +70 -0
- package/src/domain/character/talentBuilds.ts +63 -0
- package/src/domain/character/talentImport.ts +130 -0
- package/src/domain/character/talentLink.ts +123 -0
- package/src/domain/character/talents.ts +201 -0
- package/src/domain/core/conditionSnapshot.ts +92 -0
- package/src/domain/core/hover.ts +14 -0
- package/src/domain/core/ids.ts +58 -0
- package/src/domain/core/internalNameTags.ts +5 -0
- package/src/domain/core/runtimeDataPatches.ts +357 -0
- package/src/domain/creature/aiTargeting.ts +588 -0
- package/src/domain/creature/combatCondition.ts +157 -0
- package/src/domain/creature/creatureAggro.ts +804 -0
- package/src/domain/creature/creatureAi.ts +206 -0
- package/src/domain/creature/creatureAiConstants.ts +661 -0
- package/src/domain/creature/creatureCastList.ts +1007 -0
- package/src/domain/creature/creatureEventAi.ts +1409 -0
- package/src/domain/creature/creatureGroups.ts +144 -0
- package/src/domain/creature/creatureLinking.ts +333 -0
- package/src/domain/creature/creatureScaling.ts +320 -0
- package/src/domain/creature/creatureTrigger.ts +53 -0
- package/src/domain/creature/creatureWander.ts +74 -0
- package/src/domain/creature/eventAiTexts.ts +145 -0
- package/src/domain/creature/faction.ts +287 -0
- package/src/domain/creature/forcedReaction.ts +48 -0
- package/src/domain/creature/outdoorHuntable.ts +74 -0
- package/src/domain/creature/patrolPacks.ts +210 -0
- package/src/domain/creature/reputation.ts +967 -0
- package/src/domain/creature/unitFlags.ts +74 -0
- package/src/domain/creature/worldBosses.ts +393 -0
- package/src/domain/dungeonMusic.mjs +48 -0
- package/src/domain/economy/auction.ts +282 -0
- package/src/domain/economy/auctionBot.ts +1060 -0
- package/src/domain/economy/honorPrice.ts +100 -0
- package/src/domain/economy/mail.ts +958 -0
- package/src/domain/economy/money.ts +42 -0
- package/src/domain/economy/syntheticClassTrainers.ts +62 -0
- package/src/domain/economy/trading.ts +296 -0
- package/src/domain/economy/vendorSellAll.ts +252 -0
- package/src/domain/economy/vendorStock.ts +146 -0
- package/src/domain/items/ammo.ts +817 -0
- package/src/domain/items/bank.ts +162 -0
- package/src/domain/items/consumableFamily.ts +205 -0
- package/src/domain/items/craftUpgrades.ts +83 -0
- package/src/domain/items/createItem.ts +93 -0
- package/src/domain/items/durability.ts +581 -0
- package/src/domain/items/equipment.ts +441 -0
- package/src/domain/items/equipmentHelper.ts +767 -0
- package/src/domain/items/inventory.ts +561 -0
- package/src/domain/items/itemBonding.ts +93 -0
- package/src/domain/items/itemContainer.ts +245 -0
- package/src/domain/items/itemDisplayName.ts +33 -0
- package/src/domain/items/itemInstance.ts +181 -0
- package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
- package/src/domain/items/itemRandomProps.ts +77 -0
- package/src/domain/items/itemRestrictions.ts +329 -0
- package/src/domain/items/itemTeaches.ts +82 -0
- package/src/domain/items/itemUseCooldown.ts +52 -0
- package/src/domain/items/itemUseTarget.ts +90 -0
- package/src/domain/items/junkCategories.ts +174 -0
- package/src/domain/items/junkFilter.ts +368 -0
- package/src/domain/items/keyring.ts +131 -0
- package/src/domain/items/loot.ts +221 -0
- package/src/domain/items/mounts.ts +190 -0
- package/src/domain/items/onUsePayload.ts +102 -0
- package/src/domain/items/pendingLoot.ts +107 -0
- package/src/domain/items/relic.ts +105 -0
- package/src/domain/items/rocketBoots.ts +36 -0
- package/src/domain/items/sortContainer.ts +139 -0
- package/src/domain/items/spareContainers.ts +71 -0
- package/src/domain/items/spellReagentIndex.ts +131 -0
- package/src/domain/items/staleConsumables.ts +66 -0
- package/src/domain/items/weaponSpender.ts +110 -0
- package/src/domain/listDungeonIds.mjs +28 -0
- package/src/domain/macro/compose.ts +239 -0
- package/src/domain/macro/conditions.ts +260 -0
- package/src/domain/macro/creatureTypes.ts +40 -0
- package/src/domain/macro/describe.ts +169 -0
- package/src/domain/macro/icon.ts +60 -0
- package/src/domain/macro/index.ts +20 -0
- package/src/domain/macro/normalize.ts +112 -0
- package/src/domain/macro/parse.ts +316 -0
- package/src/domain/macro/plan.ts +288 -0
- package/src/domain/macro/rotation.ts +590 -0
- package/src/domain/macro/rotationEnv.ts +173 -0
- package/src/domain/macro/slots.ts +101 -0
- package/src/domain/macro/snapshot.ts +114 -0
- package/src/domain/macro/templates.ts +446 -0
- package/src/domain/macro/types.ts +70 -0
- package/src/domain/macro/units.ts +93 -0
- package/src/domain/macro/weaponTypes.ts +83 -0
- package/src/domain/nav/cityTeleports.ts +10 -0
- package/src/domain/nav/mounting.ts +113 -0
- package/src/domain/nav/nav.ts +43 -0
- package/src/domain/nav/navCollision.ts +606 -0
- package/src/domain/nav/navOutdoors.ts +91 -0
- package/src/domain/nav/navRegistry.ts +179 -0
- package/src/domain/nav/navRoomGraph.ts +302 -0
- package/src/domain/nav/navTypes.ts +43 -0
- package/src/domain/nav/navmesh.ts +1715 -0
- package/src/domain/nav/speed.ts +200 -0
- package/src/domain/nav/storey.ts +10 -0
- package/src/domain/nav/travel.ts +725 -0
- package/src/domain/nav/travelTypes.ts +75 -0
- package/src/domain/pet/pet.ts +1150 -0
- package/src/domain/pet/petActionBar.ts +180 -0
- package/src/domain/pet/petSpellbook.ts +39 -0
- package/src/domain/pet/petStable.ts +81 -0
- package/src/domain/professions/autoDisenchant.ts +236 -0
- package/src/domain/professions/characterEnchants.ts +176 -0
- package/src/domain/professions/craftCooldown.ts +52 -0
- package/src/domain/professions/enchantApply.ts +62 -0
- package/src/domain/professions/enchantTargets.ts +114 -0
- package/src/domain/professions/enchanting.ts +236 -0
- package/src/domain/professions/gatherFilter.ts +149 -0
- package/src/domain/professions/gearEnchant.ts +137 -0
- package/src/domain/professions/heldTools.ts +29 -0
- package/src/domain/professions/learnAllRecipes.ts +146 -0
- package/src/domain/professions/miningHarvest.ts +69 -0
- package/src/domain/professions/partyDisenchant.ts +294 -0
- package/src/domain/professions/partyWork.ts +83 -0
- package/src/domain/professions/pickpocket.ts +172 -0
- package/src/domain/professions/poisons.ts +240 -0
- package/src/domain/professions/professions.ts +677 -0
- package/src/domain/professions/rareNodes.ts +45 -0
- package/src/domain/professions/skinLoot.ts +27 -0
- package/src/domain/professions/vendorReagents.ts +152 -0
- package/src/domain/professions/weaponImbueHand.ts +171 -0
- package/src/domain/questFarmFilter.mjs +42 -0
- package/src/domain/quests/doQuest.ts +1204 -0
- package/src/domain/quests/gossip.ts +308 -0
- package/src/domain/quests/gossipTalk.ts +298 -0
- package/src/domain/quests/interpreter/canComplete.ts +150 -0
- package/src/domain/quests/interpreter/claim.ts +137 -0
- package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
- package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
- package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
- package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
- package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
- package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
- package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
- package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
- package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
- package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
- package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
- package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
- package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
- package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
- package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
- package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
- package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
- package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
- package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
- package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
- package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
- package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
- package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
- package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
- package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
- package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
- package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
- package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
- package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
- package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
- package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
- package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
- package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
- package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
- package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
- package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
- package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
- package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
- package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
- package/src/domain/quests/interpreter/diff.ts +349 -0
- package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
- package/src/domain/quests/interpreter/flags.ts +101 -0
- package/src/domain/quests/interpreter/index.ts +113 -0
- package/src/domain/quests/interpreter/live.ts +178 -0
- package/src/domain/quests/interpreter/types.ts +81 -0
- package/src/domain/quests/interpreter/updaters.ts +412 -0
- package/src/domain/quests/questCorpseUse.ts +155 -0
- package/src/domain/quests/questDialog.ts +43 -0
- package/src/domain/quests/questFight.ts +34 -0
- package/src/domain/quests/questObjectiveLabel.ts +39 -0
- package/src/domain/quests/questRewardChoice.ts +85 -0
- package/src/domain/quests/questScriptCredit.ts +26 -0
- package/src/domain/quests/questScriptItemUse.ts +74 -0
- package/src/domain/quests/questTameRods.ts +79 -0
- package/src/domain/quests/questlog.ts +1545 -0
- package/src/domain/quests/talkDeliver.ts +170 -0
- package/src/domain/raid/globalActionBar.ts +195 -0
- package/src/domain/raid/instanceRoster.ts +194 -0
- package/src/domain/raid/partySummon.ts +198 -0
- package/src/domain/raid/partyVault.ts +320 -0
- package/src/domain/raid/raidBossAbilities.ts +268 -0
- package/src/domain/raid/raidComp.ts +335 -0
- package/src/domain/raid/raidCustomRows.ts +453 -0
- package/src/domain/raid/raidEncounterGear.ts +298 -0
- package/src/domain/raid/raidEncounterTactics.ts +412 -0
- package/src/domain/raid/raidPlan.ts +509 -0
- package/src/domain/raid/raidPlanEdits.ts +98 -0
- package/src/domain/raid/raidPlanPacks.ts +480 -0
- package/src/domain/raid/raidRecovery.ts +183 -0
- package/src/domain/raid/raidRosterTemplate.ts +138 -0
- package/src/domain/rotation/auraSide.ts +68 -0
- package/src/domain/rotation/build.ts +3031 -0
- package/src/domain/rotation/classes/druid.ts +58 -0
- package/src/domain/rotation/classes/hooks.ts +59 -0
- package/src/domain/rotation/classes/hunter.ts +156 -0
- package/src/domain/rotation/classes/index.ts +104 -0
- package/src/domain/rotation/classes/mage.ts +99 -0
- package/src/domain/rotation/classes/paladin.ts +296 -0
- package/src/domain/rotation/classes/priest.ts +94 -0
- package/src/domain/rotation/classes/pullOpener.ts +92 -0
- package/src/domain/rotation/classes/rogue.ts +69 -0
- package/src/domain/rotation/classes/shaman.ts +29 -0
- package/src/domain/rotation/classes/supportSpec.ts +94 -0
- package/src/domain/rotation/classes/warlock.ts +81 -0
- package/src/domain/rotation/classes/warrior.ts +402 -0
- package/src/domain/rotation/classify.ts +1381 -0
- package/src/domain/rotation/condMetricPicker.ts +379 -0
- package/src/domain/rotation/consumables.ts +242 -0
- package/src/domain/rotation/evaluate.ts +1115 -0
- package/src/domain/rotation/finisherLadder.ts +145 -0
- package/src/domain/rotation/invent.ts +938 -0
- package/src/domain/rotation/killOrder.ts +30 -0
- package/src/domain/rotation/openerForm.ts +22 -0
- package/src/domain/rotation/paladinBuffs.ts +568 -0
- package/src/domain/rotation/prebuff.ts +283 -0
- package/src/domain/rotation/raidRowTuning.ts +34 -0
- package/src/domain/rotation/rotation.ts +11 -0
- package/src/domain/rotation/rotationProfiles.ts +180 -0
- package/src/domain/rotation/rotationSuggestions.ts +851 -0
- package/src/domain/rotation/ruleAfterChain.ts +49 -0
- package/src/domain/rotation/spec.ts +70 -0
- package/src/domain/rotation/spellPicker.ts +140 -0
- package/src/domain/rotation/stand.ts +143 -0
- package/src/domain/rotation/types.ts +718 -0
- package/src/domain/run/battlegroundRun.ts +111 -0
- package/src/domain/run/canEnterContext.ts +32 -0
- package/src/domain/run/death.ts +561 -0
- package/src/domain/run/deathRecovery.ts +289 -0
- package/src/domain/run/duel.ts +141 -0
- package/src/domain/run/dungeonRun.ts +344 -0
- package/src/domain/run/floorRest.ts +159 -0
- package/src/domain/run/honor.ts +557 -0
- package/src/domain/run/honorWeek.ts +180 -0
- package/src/domain/run/whenMap.ts +977 -0
- package/src/domain/scriptdev/arathiHighlands.ts +445 -0
- package/src/domain/scriptdev/ashenvale.ts +635 -0
- package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
- package/src/domain/scriptdev/azshara.ts +892 -0
- package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
- package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
- package/src/domain/scriptdev/blackrockSpire.ts +730 -0
- package/src/domain/scriptdev/blackwingLair.ts +521 -0
- package/src/domain/scriptdev/burningSteppes.ts +62 -0
- package/src/domain/scriptdev/classFilter.ts +43 -0
- package/src/domain/scriptdev/darkshore.ts +817 -0
- package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
- package/src/domain/scriptdev/deadmines.ts +331 -0
- package/src/domain/scriptdev/desolace.ts +1239 -0
- package/src/domain/scriptdev/direMaul.ts +859 -0
- package/src/domain/scriptdev/durotar.ts +532 -0
- package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
- package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
- package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
- package/src/domain/scriptdev/felwood.ts +1055 -0
- package/src/domain/scriptdev/feralas.ts +571 -0
- package/src/domain/scriptdev/feralasHelpers.ts +838 -0
- package/src/domain/scriptdev/gnomeregan.ts +466 -0
- package/src/domain/scriptdev/guards.ts +616 -0
- package/src/domain/scriptdev/hinterlands.ts +693 -0
- package/src/domain/scriptdev/host.ts +1134 -0
- package/src/domain/scriptdev/index.ts +123 -0
- package/src/domain/scriptdev/instanceRaids.ts +136 -0
- package/src/domain/scriptdev/itemScripts.ts +37 -0
- package/src/domain/scriptdev/lochModan.ts +283 -0
- package/src/domain/scriptdev/maraudon.ts +232 -0
- package/src/domain/scriptdev/moltenCore.ts +831 -0
- package/src/domain/scriptdev/moonglade.ts +659 -0
- package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
- package/src/domain/scriptdev/naxxramas.ts +577 -0
- package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
- package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
- package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
- package/src/domain/scriptdev/npcProfessions.ts +1025 -0
- package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
- package/src/domain/scriptdev/onyxiasLair.ts +313 -0
- package/src/domain/scriptdev/orgrimmar.ts +147 -0
- package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
- package/src/domain/scriptdev/razorfenDowns.ts +468 -0
- package/src/domain/scriptdev/razorfenKraul.ts +410 -0
- package/src/domain/scriptdev/redridgeMountains.ts +163 -0
- package/src/domain/scriptdev/registry.ts +945 -0
- package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
- package/src/domain/scriptdev/scarletMonastery.ts +713 -0
- package/src/domain/scriptdev/scholomance.ts +682 -0
- package/src/domain/scriptdev/searingGorge.ts +295 -0
- package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
- package/src/domain/scriptdev/silithus.ts +71 -0
- package/src/domain/scriptdev/silverpineForest.ts +662 -0
- package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
- package/src/domain/scriptdev/stormwindCity.ts +1192 -0
- package/src/domain/scriptdev/stranglethornVale.ts +402 -0
- package/src/domain/scriptdev/stratholme.ts +650 -0
- package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
- package/src/domain/scriptdev/sunkenTemple.ts +736 -0
- package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
- package/src/domain/scriptdev/tanaris.ts +391 -0
- package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
- package/src/domain/scriptdev/teldrassil.ts +143 -0
- package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
- package/src/domain/scriptdev/theBarrens.ts +709 -0
- package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
- package/src/domain/scriptdev/thousandNeedles.ts +426 -0
- package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
- package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
- package/src/domain/scriptdev/types.ts +1026 -0
- package/src/domain/scriptdev/uldaman.ts +437 -0
- package/src/domain/scriptdev/ungoroCrater.ts +549 -0
- package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
- package/src/domain/scriptdev/wailingCaverns.ts +700 -0
- package/src/domain/scriptdev/warEffort.ts +371 -0
- package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
- package/src/domain/scriptdev/westfall.ts +767 -0
- package/src/domain/scriptdev/wetlands.ts +660 -0
- package/src/domain/scriptdev/winterspring.ts +482 -0
- package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
- package/src/domain/scriptdev/worldBosses.ts +605 -0
- package/src/domain/scriptdev/zulfarrak.ts +478 -0
- package/src/domain/scriptdev/zulgurub.ts +1152 -0
- package/src/domain/sim/dummySim.ts +408 -0
- package/src/domain/sim/targetDummy.ts +29 -0
- package/src/domain/social/guild.ts +148 -0
- package/src/domain/spells/areaAuraMembership.ts +93 -0
- package/src/domain/spells/breakableStunCc.ts +166 -0
- package/src/domain/spells/cancelAura.ts +80 -0
- package/src/domain/spells/diminishing.ts +167 -0
- package/src/domain/spells/dispel.ts +149 -0
- package/src/domain/spells/dispelMechanic.ts +105 -0
- package/src/domain/spells/equipSpells.ts +247 -0
- package/src/domain/spells/learnOnTargets.ts +260 -0
- package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
- package/src/domain/spells/resurrectSpell.ts +124 -0
- package/src/domain/spells/spellPushback.ts +39 -0
- package/src/domain/spells/spellReflect.ts +43 -0
- package/src/domain/spells/stealth.ts +183 -0
- package/src/domain/spells/totem.ts +394 -0
- package/src/domain/spells/worldCast.ts +187 -0
- package/src/domain/world/areaTriggerLocks.ts +177 -0
- package/src/domain/world/dungeonMusic.ts +108 -0
- package/src/domain/world/gameEvents.ts +119 -0
- package/src/domain/world/gameObjects.ts +1030 -0
- package/src/domain/world/goEventFire.ts +234 -0
- package/src/domain/world/goMoTransport.ts +74 -0
- package/src/domain/world/goTransport.ts +81 -0
- package/src/domain/world/hazards.ts +459 -0
- package/src/domain/world/openLock.ts +398 -0
- package/src/domain/world/pools.ts +470 -0
- package/src/domain/world/restArea.ts +37 -0
- package/src/domain/world/weather.ts +201 -0
- package/src/domain/zoneAmbience.mjs +87 -0
- package/src/domain/zoneMusic.mjs +62 -0
- package/src/domain/zoneMusicQueue.mjs +7 -0
- package/src/engine/combat/activeSeal.ts +39 -0
- package/src/engine/combat/aiTargetResolve.ts +64 -0
- package/src/engine/combat/aoeCast.ts +289 -0
- package/src/engine/combat/applyConsumeAura.ts +74 -0
- package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
- package/src/engine/combat/applyDispelMechanic.ts +30 -0
- package/src/engine/combat/applyHealEffect.ts +301 -0
- package/src/engine/combat/applySchoolAbsorb.ts +114 -0
- package/src/engine/combat/applySpell.ts +3169 -0
- package/src/engine/combat/applySpellLate.ts +2026 -0
- package/src/engine/combat/applySpellLateBag.ts +144 -0
- package/src/engine/combat/areaAura.ts +283 -0
- package/src/engine/combat/attackTable.ts +508 -0
- package/src/engine/combat/battleRez.ts +87 -0
- package/src/engine/combat/castAction.ts +36 -0
- package/src/engine/combat/castTargetGates.ts +75 -0
- package/src/engine/combat/castableKit.ts +68 -0
- package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
- package/src/engine/combat/chainFan.ts +210 -0
- package/src/engine/combat/channel.ts +423 -0
- package/src/engine/combat/chaseCloseness.ts +95 -0
- package/src/engine/combat/cmangosCastGates.ts +129 -0
- package/src/engine/combat/combatFlag.ts +77 -0
- package/src/engine/combat/combatGeometry.ts +1329 -0
- package/src/engine/combat/combustion.ts +68 -0
- package/src/engine/combat/context.ts +730 -0
- package/src/engine/combat/createSession.ts +1165 -0
- package/src/engine/combat/creatureLeash.ts +38 -0
- package/src/engine/combat/crowdControl.ts +1259 -0
- package/src/engine/combat/dispelDuty.ts +54 -0
- package/src/engine/combat/dispelReflect.ts +609 -0
- package/src/engine/combat/displaceFloor.ts +113 -0
- package/src/engine/combat/duelBounds.ts +47 -0
- package/src/engine/combat/equippedItemGate.ts +297 -0
- package/src/engine/combat/evadeLifecycle.ts +63 -0
- package/src/engine/combat/eventAi.ts +2220 -0
- package/src/engine/combat/facing.ts +74 -0
- package/src/engine/combat/fearFlee.ts +137 -0
- package/src/engine/combat/fighterFactory.ts +1144 -0
- package/src/engine/combat/forceDespawnAction.ts +51 -0
- package/src/engine/combat/formulas.ts +807 -0
- package/src/engine/combat/friendlyFan.ts +55 -0
- package/src/engine/combat/groundPoolTick.ts +210 -0
- package/src/engine/combat/hazards.ts +114 -0
- package/src/engine/combat/healTargets.ts +226 -0
- package/src/engine/combat/heartbeatResist.ts +49 -0
- package/src/engine/combat/hostileItemUse.ts +75 -0
- package/src/engine/combat/interruptAuras.ts +66 -0
- package/src/engine/combat/itemRescue.ts +49 -0
- package/src/engine/combat/itemUse.ts +260 -0
- package/src/engine/combat/kitById.ts +23 -0
- package/src/engine/combat/knockBack.ts +201 -0
- package/src/engine/combat/leap.ts +89 -0
- package/src/engine/combat/mitigation.ts +587 -0
- package/src/engine/combat/modTaunt.ts +43 -0
- package/src/engine/combat/motionClaim.ts +268 -0
- package/src/engine/combat/motionGate.ts +150 -0
- package/src/engine/combat/motionGenerator.ts +27 -0
- package/src/engine/combat/navSight.ts +138 -0
- package/src/engine/combat/perfSink.ts +28 -0
- package/src/engine/combat/periodicDue.ts +55 -0
- package/src/engine/combat/petAuras.ts +86 -0
- package/src/engine/combat/pickAction.ts +3449 -0
- package/src/engine/combat/powerForm.ts +735 -0
- package/src/engine/combat/powerPools.ts +49 -0
- package/src/engine/combat/predicates.ts +538 -0
- package/src/engine/combat/procsDamage.ts +1823 -0
- package/src/engine/combat/reactiveGates.ts +135 -0
- package/src/engine/combat/roles.ts +389 -0
- package/src/engine/combat/rotationSubject.ts +78 -0
- package/src/engine/combat/ruleAfter.ts +106 -0
- package/src/engine/combat/seedDisplayAuras.ts +203 -0
- package/src/engine/combat/seedOocEffects.ts +317 -0
- package/src/engine/combat/seedSchoolImmunities.ts +45 -0
- package/src/engine/combat/session-types.ts +458 -0
- package/src/engine/combat/sessionApi.ts +1785 -0
- package/src/engine/combat/sessionCharge.ts +124 -0
- package/src/engine/combat/sessionChase.ts +869 -0
- package/src/engine/combat/sessionDeaths.ts +469 -0
- package/src/engine/combat/sessionFocus.ts +506 -0
- package/src/engine/combat/sessionFollow.ts +167 -0
- package/src/engine/combat/sessionGeometry.ts +188 -0
- package/src/engine/combat/sessionHome.ts +75 -0
- package/src/engine/combat/sessionInject.ts +719 -0
- package/src/engine/combat/sessionMechanicMove.ts +555 -0
- package/src/engine/combat/sessionMotion.ts +1553 -0
- package/src/engine/combat/sessionMotionKit.ts +247 -0
- package/src/engine/combat/sessionMoveIntent.ts +49 -0
- package/src/engine/combat/sessionMoveOrder.ts +200 -0
- package/src/engine/combat/sessionPathTo.ts +657 -0
- package/src/engine/combat/sessionPools.ts +688 -0
- package/src/engine/combat/sessionSteer.ts +144 -0
- package/src/engine/combat/sessionStepBack.ts +151 -0
- package/src/engine/combat/sessionStepWrap.ts +116 -0
- package/src/engine/combat/sessionView.ts +442 -0
- package/src/engine/combat/simEffects.ts +32 -0
- package/src/engine/combat/simFacade.ts +620 -0
- package/src/engine/combat/simPump.ts +264 -0
- package/src/engine/combat/simSnapshot.ts +165 -0
- package/src/engine/combat/simThreadPool.ts +35 -0
- package/src/engine/combat/skeramImages.ts +57 -0
- package/src/engine/combat/slowUpdate.ts +178 -0
- package/src/engine/combat/snapToFloor.ts +42 -0
- package/src/engine/combat/speedAura.ts +29 -0
- package/src/engine/combat/spellReagents.ts +71 -0
- package/src/engine/combat/stealthDetect.ts +93 -0
- package/src/engine/combat/stepBackMotion.ts +171 -0
- package/src/engine/combat/stepSession.ts +3102 -0
- package/src/engine/combat/summonCast.ts +243 -0
- package/src/engine/combat/thaddiusPolarity.ts +97 -0
- package/src/engine/combat/threat.ts +388 -0
- package/src/engine/combat/threatOps.ts +272 -0
- package/src/engine/combat/tickWorkerBody.ts +211 -0
- package/src/engine/combat/totemAuras.ts +122 -0
- package/src/engine/combat/triggerPayload.ts +42 -0
- package/src/engine/combat/triggeredCompanion.ts +63 -0
- package/src/engine/combat/types.ts +1897 -0
- package/src/engine/combat/useObjectTrap.ts +140 -0
- package/src/engine/combat/walkSurface.ts +54 -0
- package/src/engine/combat/weapon.ts +1248 -0
- package/src/engine/combat/worldFrame.ts +43 -0
- package/src/engine/combat.solo-golden.json +2242 -0
- package/src/engine/combat.ts +84 -0
- package/src/engine/core/detMath.ts +289 -0
- package/src/engine/core/events.ts +357 -0
- package/src/engine/core/rng.ts +36 -0
- package/src/engine/game/actionBars.ts +124 -0
- package/src/engine/game/activateObjectFromSpell.ts +320 -0
- package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
- package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
- package/src/engine/game/applyDoorFromDbScript.ts +388 -0
- package/src/engine/game/applyEscortFromDbScript.ts +290 -0
- package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
- package/src/engine/game/applyHoverFromDbScript.ts +110 -0
- package/src/engine/game/applyOocResurrect.ts +71 -0
- package/src/engine/game/applySpellDurability.ts +115 -0
- package/src/engine/game/applyTailFromDbScript.ts +478 -0
- package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
- package/src/engine/game/auctionMail.ts +269 -0
- package/src/engine/game/bagOverflow.ts +130 -0
- package/src/engine/game/bank.ts +110 -0
- package/src/engine/game/barAutofill.ts +26 -0
- package/src/engine/game/battleground.ts +369 -0
- package/src/engine/game/combatEnemySpec.ts +216 -0
- package/src/engine/game/combatObjectTraps.ts +167 -0
- package/src/engine/game/combatSeed.ts +320 -0
- package/src/engine/game/combatSession.ts +3241 -0
- package/src/engine/game/combatSessionClock.ts +62 -0
- package/src/engine/game/companionQuestActions.ts +242 -0
- package/src/engine/game/companionTraining.ts +40 -0
- package/src/engine/game/consumables.ts +624 -0
- package/src/engine/game/context.ts +53 -0
- package/src/engine/game/createHealthstone.ts +45 -0
- package/src/engine/game/deathFlow.ts +127 -0
- package/src/engine/game/devGrant.ts +117 -0
- package/src/engine/game/dynamicObject.ts +365 -0
- package/src/engine/game/enchantItem.ts +177 -0
- package/src/engine/game/equipmentHelper.ts +806 -0
- package/src/engine/game/factionState.ts +108 -0
- package/src/engine/game/garmentsOoc.ts +69 -0
- package/src/engine/game/globalActionBar.ts +179 -0
- package/src/engine/game/goInteractQuestCredit.ts +51 -0
- package/src/engine/game/goMoTransportUse.ts +61 -0
- package/src/engine/game/goTransportUse.ts +60 -0
- package/src/engine/game/healthstoneUpkeep.ts +59 -0
- package/src/engine/game/killSkin.ts +124 -0
- package/src/engine/game/learnFromItem.ts +118 -0
- package/src/engine/game/loadReconcile.ts +551 -0
- package/src/engine/game/loot.ts +294 -0
- package/src/engine/game/macros.ts +125 -0
- package/src/engine/game/mail.ts +293 -0
- package/src/engine/game/meetingStoneQueue.ts +75 -0
- package/src/engine/game/meetingStoneUse.ts +54 -0
- package/src/engine/game/newGameState.ts +363 -0
- package/src/engine/game/oocAuraInterrupt.ts +92 -0
- package/src/engine/game/oocCast.ts +241 -0
- package/src/engine/game/oocCastEffects.ts +803 -0
- package/src/engine/game/oocCastMethods.ts +1077 -0
- package/src/engine/game/openLockFromSpell.ts +174 -0
- package/src/engine/game/outdoorPvp.ts +187 -0
- package/src/engine/game/outfitter.ts +644 -0
- package/src/engine/game/paladinBoard.ts +393 -0
- package/src/engine/game/partyAuras.ts +121 -0
- package/src/engine/game/persistCombatAuras.ts +91 -0
- package/src/engine/game/pets.ts +459 -0
- package/src/engine/game/prePullHealthstones.ts +154 -0
- package/src/engine/game/professions.ts +2227 -0
- package/src/engine/game/pruneStaleRuntime.ts +39 -0
- package/src/engine/game/questFightCredit.ts +36 -0
- package/src/engine/game/questItemOnCorpse.ts +166 -0
- package/src/engine/game/questItemOnCreature.ts +103 -0
- package/src/engine/game/questLog.ts +879 -0
- package/src/engine/game/questSpellComplete.ts +21 -0
- package/src/engine/game/questTurnIn.ts +598 -0
- package/src/engine/game/raidParty.ts +32 -0
- package/src/engine/game/reagentBuyIn.ts +39 -0
- package/src/engine/game/regenRest.ts +186 -0
- package/src/engine/game/rotation.ts +425 -0
- package/src/engine/game/runFullDungeon.ts +611 -0
- package/src/engine/game/runSupply.ts +80 -0
- package/src/engine/game/sanitizeDriftedItems.ts +135 -0
- package/src/engine/game/scriptDevGoUse.ts +397 -0
- package/src/engine/game/scriptDevInnkeeper.ts +150 -0
- package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
- package/src/engine/game/sendEventFromSpell.ts +87 -0
- package/src/engine/game/sortContainers.ts +85 -0
- package/src/engine/game/spellReputation.ts +69 -0
- package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
- package/src/engine/game/squadDungeon.ts +4222 -0
- package/src/engine/game/squadQuestShare.ts +260 -0
- package/src/engine/game/summonObjectSlot.ts +69 -0
- package/src/engine/game/summonObjectWild.ts +73 -0
- package/src/engine/game/summoningRitualUse.ts +141 -0
- package/src/engine/game/talents.ts +356 -0
- package/src/engine/game/tamingRodUse.ts +66 -0
- package/src/engine/game/tempSpawnCreature.ts +136 -0
- package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
- package/src/engine/game/tickTimedQuests.ts +28 -0
- package/src/engine/game/trade.ts +586 -0
- package/src/engine/game/travel.ts +1155 -0
- package/src/engine/game/types.ts +1855 -0
- package/src/engine/game/vendorOffers.ts +244 -0
- package/src/engine/game/weaponImbueItem.ts +281 -0
- package/src/engine/game/worldSession.ts +183 -0
- package/src/engine/game/worldState.ts +166 -0
- package/src/engine/game.ts +968 -0
- package/src/engine/spells/GAP.md +67 -0
- package/src/engine/spells/absorbs.ts +376 -0
- package/src/engine/spells/addTargetTrigger.ts +53 -0
- package/src/engine/spells/auraPerSecondCost.ts +50 -0
- package/src/engine/spells/auraStacking.ts +497 -0
- package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
- package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
- package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
- package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
- package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
- package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
- package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
- package/src/engine/spells/cmangos-special-cases.ts +1570 -0
- package/src/engine/spells/conditions.ts +718 -0
- package/src/engine/spells/effects.ts +203 -0
- package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
- package/src/engine/spells/immunity.ts +942 -0
- package/src/engine/spells/intentEffects.ts +351 -0
- package/src/engine/spells/interpreter/GAPS.md +21 -0
- package/src/engine/spells/interpreter/amount.ts +109 -0
- package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
- package/src/engine/spells/interpreter/diff.ts +246 -0
- package/src/engine/spells/interpreter/duration.ts +90 -0
- package/src/engine/spells/interpreter/form-attrs.json +1 -0
- package/src/engine/spells/interpreter/form-attrs.ts +95 -0
- package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
- package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
- package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
- package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
- package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
- package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
- package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
- package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
- package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
- package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
- package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
- package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
- package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
- package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
- package/src/engine/spells/interpreter/handlers.ts +9 -0
- package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
- package/src/engine/spells/interpreter/index.ts +525 -0
- package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
- package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
- package/src/engine/spells/interpreter/mage-portals.ts +37 -0
- package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
- package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
- package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
- package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
- package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
- package/src/engine/spells/interpreter/opcodes.ts +789 -0
- package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
- package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
- package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
- package/src/engine/spells/interpreter/proc.ts +443 -0
- package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
- package/src/engine/spells/interpreter/registry/index.ts +216 -0
- package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
- package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
- package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
- package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
- package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
- package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
- package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
- package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
- package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
- package/src/engine/spells/interpreter/registry/types.ts +48 -0
- package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
- package/src/engine/spells/interpreter/targeting.ts +90 -0
- package/src/engine/spells/interpreter/types-intent.ts +1501 -0
- package/src/engine/spells/interpreter/types.ts +419 -0
- package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
- package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
- package/src/engine/spells/interrupt.ts +217 -0
- package/src/engine/spells/meleeAttackReset.ts +60 -0
- package/src/engine/spells/oocTriggerSpell.ts +49 -0
- package/src/engine/spells/overrideClassScripts.ts +319 -0
- package/src/engine/spells/parryHaste.ts +20 -0
- package/src/engine/spells/procs.ts +300 -0
- package/src/engine/spells/recovery.ts +203 -0
- package/src/engine/spells/scriptTargetDest.ts +76 -0
- package/src/engine/spells/scriptTargets.ts +85 -0
- package/src/engine/spells/singleTargetAura.ts +82 -0
- package/src/engine/spells/specialCasePayloads.ts +57 -0
- package/src/engine/spells/spellAttributes.ts +249 -0
- package/src/engine/spells/spellBonus.ts +143 -0
- package/src/engine/spells/spellModIntents.ts +419 -0
- package/src/engine/spells/spellMods.ts +283 -0
- package/src/engine/spells/spellRadius.ts +15 -0
- package/src/engine/spells/trapObjects.ts +26 -0
- package/src/json.d.ts +7 -0
- package/src/persistence/memoryRepository.ts +23 -0
- package/src/persistence/saveBackups.ts +162 -0
- package/src/persistence/saveFile.ts +68 -0
- package/src/persistence/saveRepository.ts +11 -0
- package/src/persistence/saveShape.ts +668 -0
- package/src/progression/leveling.ts +89 -0
- package/src/progression/rest.ts +1434 -0
- package/src/progression/training.ts +226 -0
- package/src/progression/xpGain.ts +369 -0
- package/src/quests/quests.ts +1580 -0
- package/src/world/aoePull.ts +198 -0
- package/src/world/areaTableDbc.ts +39 -0
- package/src/world/areaTableMapIdPairs.ts +141 -0
- package/src/world/bakeSlug.ts +43 -0
- package/src/world/continuousDungeon.ts +1250 -0
- package/src/world/dungeonBakeProjection.ts +190 -0
- package/src/world/dungeonMapDensity.ts +342 -0
- package/src/world/dungeonMapProjection.ts +135 -0
- package/src/world/dungeonNav.ts +904 -0
- package/src/world/dungeonNpcSim.ts +147 -0
- package/src/world/dungeonObjectives.ts +234 -0
- package/src/world/dungeonPreset.ts +35 -0
- package/src/world/dungeonRoute.ts +311 -0
- package/src/world/dungeonRouteGeometry.ts +732 -0
- package/src/world/dungeonRouteOrder.ts +1037 -0
- package/src/world/dungeonWingRooms.ts +426 -0
- package/src/world/escort.ts +296 -0
- package/src/world/goPoolRoll.ts +75 -0
- package/src/world/instanceObjects.ts +785 -0
- package/src/world/instances.ts +1572 -0
- package/src/world/meetingStones.ts +56 -0
- package/src/world/navmeshFloors.ts +145 -0
- package/src/world/nearGrid.ts +167 -0
- package/src/world/packBudget.ts +613 -0
- package/src/world/rareRoll.ts +335 -0
- package/src/world/routeAuthoring.ts +132 -0
- package/src/world/routeEdit.ts +209 -0
- package/src/world/world.ts +812 -0
- package/src/world/zoneHazards.ts +47 -0
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
// Pack-strength budget (COMBAT-INTERACTION-V2 §Pack-strength budget / S4.6).
|
|
2
|
+
//
|
|
3
|
+
// Threat weight per creature = eliteRank × heavyAbilityCount × levelDeltaToParty,
|
|
4
|
+
// all sourced from creature_template (+ baked spell kits). Over-budget packs are
|
|
5
|
+
// SPLIT into sequential sub-pulls — never HP/damage nerfed.
|
|
6
|
+
//
|
|
7
|
+
// Sources (cite, do not invent creature stats):
|
|
8
|
+
// SharedDefines.h CREATURE_ELITE_* Rank column
|
|
9
|
+
// SpellEffectDefines.h SPELL_EFFECT_* heavy special classification
|
|
10
|
+
// SpellMgr.h IsEffectHandledImmediatelySpellLaunch damage/heal launch effects
|
|
11
|
+
// creature_template.Rank / spells / level CreatureDef.scaling.rank, .spells, .level
|
|
12
|
+
// dungeonRoute MAYHEM_SOFT_CAP / CHAIN_MAX_ATOMS + AUTHORING prefer-4 budget presets
|
|
13
|
+
//
|
|
14
|
+
// Pure: no DOM, no Date.now, no Math.random (LOCK 4).
|
|
15
|
+
|
|
16
|
+
import type { CreatureDef, EncounterDef, EncounterPackMember, SpellDef } from '../data/schema.ts';
|
|
17
|
+
import { CREATURE_ELITE } from '../data/schema.ts';
|
|
18
|
+
import type { FusionAbsorbGuard, PullFusion, RouteDensity } from './dungeonRoute.ts';
|
|
19
|
+
import { MAYHEM_SOFT_CAP, CHAIN_MAX_ATOMS } from './dungeonRoute.ts';
|
|
20
|
+
|
|
21
|
+
// ---- Spell effect ids (SpellEffectDefines.h) ---------------------------------
|
|
22
|
+
|
|
23
|
+
/** SPELL_EFFECT_SCHOOL_DAMAGE */
|
|
24
|
+
export const SPELL_EFFECT_SCHOOL_DAMAGE = 2;
|
|
25
|
+
/** SPELL_EFFECT_HEALTH_LEECH */
|
|
26
|
+
export const SPELL_EFFECT_HEALTH_LEECH = 9;
|
|
27
|
+
/** SPELL_EFFECT_HEAL — pack healers are high-pressure specials */
|
|
28
|
+
export const SPELL_EFFECT_HEAL = 10;
|
|
29
|
+
/** SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL */
|
|
30
|
+
export const SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL = 17;
|
|
31
|
+
/** SPELL_EFFECT_WEAPON_PERCENT_DAMAGE — Mortal Strike family */
|
|
32
|
+
export const SPELL_EFFECT_WEAPON_PERCENT_DAMAGE = 31;
|
|
33
|
+
/** SPELL_EFFECT_WEAPON_DAMAGE */
|
|
34
|
+
export const SPELL_EFFECT_WEAPON_DAMAGE = 58;
|
|
35
|
+
/** SPELL_EFFECT_HEAL_MECHANICAL */
|
|
36
|
+
export const SPELL_EFFECT_HEAL_MECHANICAL = 75;
|
|
37
|
+
/** SPELL_EFFECT_NORMALIZED_WEAPON_DMG */
|
|
38
|
+
export const SPELL_EFFECT_NORMALIZED_WEAPON_DMG = 121;
|
|
39
|
+
/** SPELL_EFFECT_APPLY_AURA */
|
|
40
|
+
export const SPELL_EFFECT_APPLY_AURA = 6;
|
|
41
|
+
|
|
42
|
+
/** SPELL_AURA_PERIODIC_DAMAGE (SharedDefines AuraType) */
|
|
43
|
+
export const SPELL_AURA_PERIODIC_DAMAGE = 3;
|
|
44
|
+
/** SPELL_AURA_PERIODIC_HEAL */
|
|
45
|
+
export const SPELL_AURA_PERIODIC_HEAL = 8;
|
|
46
|
+
/** SPELL_AURA_PERIODIC_LEECH */
|
|
47
|
+
export const SPELL_AURA_PERIODIC_LEECH = 53;
|
|
48
|
+
/** SPELL_AURA_PERIODIC_DAMAGE_PERCENT */
|
|
49
|
+
export const SPELL_AURA_PERIODIC_DAMAGE_PERCENT = 89;
|
|
50
|
+
|
|
51
|
+
// Direct damage / heal launch effects that pressure a pack (tank spikes, healer adds). Cite: SpellMgr.h
|
|
52
|
+
// IsEffectHandledImmediatelySpellLaunch ~144–152 (damage + heal subset).
|
|
53
|
+
const HEAVY_LAUNCH_EFFECTS: ReadonlySet<number> = new Set([
|
|
54
|
+
SPELL_EFFECT_SCHOOL_DAMAGE,
|
|
55
|
+
SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL,
|
|
56
|
+
SPELL_EFFECT_WEAPON_PERCENT_DAMAGE,
|
|
57
|
+
SPELL_EFFECT_WEAPON_DAMAGE,
|
|
58
|
+
SPELL_EFFECT_NORMALIZED_WEAPON_DMG,
|
|
59
|
+
SPELL_EFFECT_HEALTH_LEECH,
|
|
60
|
+
SPELL_EFFECT_HEAL,
|
|
61
|
+
SPELL_EFFECT_HEAL_MECHANICAL,
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
const HEAVY_PERIODIC_AURAS: ReadonlySet<number> = new Set([
|
|
65
|
+
SPELL_AURA_PERIODIC_DAMAGE,
|
|
66
|
+
SPELL_AURA_PERIODIC_HEAL,
|
|
67
|
+
SPELL_AURA_PERIODIC_LEECH,
|
|
68
|
+
SPELL_AURA_PERIODIC_DAMAGE_PERCENT,
|
|
69
|
+
]);
|
|
70
|
+
|
|
71
|
+
/** Synthesized SpellEffect.kind values that count as heavy when rawEffects absent. */
|
|
72
|
+
const HEAVY_SYNTH_KINDS: ReadonlySet<string> = new Set([
|
|
73
|
+
'direct_damage',
|
|
74
|
+
'weapon_damage',
|
|
75
|
+
'normalized_weapon_damage',
|
|
76
|
+
'heal',
|
|
77
|
+
'dot',
|
|
78
|
+
'health_leech',
|
|
79
|
+
]);
|
|
80
|
+
|
|
81
|
+
// ---- Presets / budgets ------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
// Pack-strength budget presets (COMBAT-INTERACTION-V2 §Pack-strength budget). Speedrun = low, Normal =
|
|
84
|
+
// medium, Full-Mayhem = high.
|
|
85
|
+
export type PackBudgetPreset = 'speedrun' | 'normal' | 'fullMayhem';
|
|
86
|
+
|
|
87
|
+
// CHAIN_MAX_ATOMS re-exported from dungeonRoute (vision §8b.4 chain upper target).
|
|
88
|
+
export { CHAIN_MAX_ATOMS };
|
|
89
|
+
|
|
90
|
+
// AUTHORING.md / dungeon `splitPackSizes` prefer default — classic mono pack feel. Kept for authoring
|
|
91
|
+
// tools; NOT a threat budget (see PACK_THREAT_BUDGET).
|
|
92
|
+
export const AUTHORING_PREFER_PACK_SIZE = 4;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Per-pack threat-weight budgets by preset, in EFFECTIVE-COMBATANT units
|
|
96
|
+
* (creatureThreatWeight: plain at-level mob ≈ 1, elite special-caster ≈ 2.5–3.75).
|
|
97
|
+
* Calibrated against the real baked packs of all 19 classic 5-mans so that
|
|
98
|
+
* authored trash pulls pass intact at their intended entry level — only
|
|
99
|
+
* genuinely oversized pulls (8+ stacked elite casters, runaway fusion merges)
|
|
100
|
+
* split. Never an HP/damage multiplier (COMBAT-INTERACTION-V2 guardrails).
|
|
101
|
+
*
|
|
102
|
+
* ⚠️ These were 20 / 24 / 40 until 2026-08-14, and the note above says why that was never
|
|
103
|
+
* safe: "authored trash pulls pass intact" is a statement about the DATA, not about whether
|
|
104
|
+
* the intended party survives. `budgetOverride` below exists precisely to plot the second
|
|
105
|
+
* number, and plotting it says the old table was a level-60 calibration. In these units an
|
|
106
|
+
* at-level elite is exactly 2.0 (1 body + eliteSurcharge 1), so `normal: 24` licensed a
|
|
107
|
+
* TWELVE-elite simultaneous pull — a raid pull, not a 5-man pull.
|
|
108
|
+
*
|
|
109
|
+
* probe-dungeon-completion, all 26 defs, each at its OWN band (def.levelRange, not --level 60):
|
|
110
|
+
*
|
|
111
|
+
* budget = elites/pull complete bossesKilled stalled
|
|
112
|
+
* 24 12 6/26 63/218 20
|
|
113
|
+
* 12 6 6/26 75/218 20
|
|
114
|
+
* 10 5 10/26 91/218 16
|
|
115
|
+
* 8 4 12/26 111/218 14 <- shipped
|
|
116
|
+
* 6 3 12/26 109/218 14
|
|
117
|
+
*
|
|
118
|
+
* 8 is both the principled value — four at-level elites is what a classic 5-man actually pulls
|
|
119
|
+
* — and the measured peak: the curve is bracketed on BOTH sides, 10 is clearly worse and 6 buys
|
|
120
|
+
* nothing (same 12 instances, two fewer bosses). So this is not a number fitted to a score;
|
|
121
|
+
* tightening past it stops paying. Nothing is removed by this — `expandRouteByPackBudget` splits an
|
|
122
|
+
* over-budget pack into SEQUENTIAL sub-pulls, which is what a real player does when they pull
|
|
123
|
+
* half a room. speedrun/fullMayhem keep the documented ladder shape and their old ratios to
|
|
124
|
+
* normal (0.83x and 1.67x).
|
|
125
|
+
*/
|
|
126
|
+
export const PACK_THREAT_BUDGET: Readonly<Record<PackBudgetPreset, number>> = {
|
|
127
|
+
speedrun: 7,
|
|
128
|
+
normal: 8,
|
|
129
|
+
fullMayhem: 13,
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Raids keep the pre-2026-08-14 table. `enterInstance` passes a packBudget for EVERY
|
|
134
|
+
* instance — `asRaid` only changes seating — so a flat tightening would have split 40-man
|
|
135
|
+
* raid trash into four-elite pulls as well. The curve above was measured on the 5/10-man set
|
|
136
|
+
* only (probe-dungeon-completion skips `maxPlayers > 10`; raids are probe-play-raid's lane
|
|
137
|
+
* and docs/archive/raids/PLAN.md's program), so raids keep the numbers they were tuned under until
|
|
138
|
+
* someone plots the same curve for them.
|
|
139
|
+
*/
|
|
140
|
+
export const PACK_THREAT_BUDGET_RAID: Readonly<Record<PackBudgetPreset, number>> = {
|
|
141
|
+
speedrun: 20,
|
|
142
|
+
normal: 24,
|
|
143
|
+
fullMayhem: 40,
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/** Raid-sized groups (>10) keep the legacy budget; 5- and 10-mans use the measured one. */
|
|
147
|
+
export const RAID_PARTY_SIZE_MIN = 11;
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Cap on simultaneous heavy-special streams (creatures with ≥1 distinct heavy
|
|
151
|
+
* ability). Same ladder shape as threat budgets — Full-Mayhem highest.
|
|
152
|
+
* Note: splitting makes runs SLOWER (more pulls), so Speedrun is only slightly
|
|
153
|
+
* tighter than Normal — its tempo comes from route density + chain fusion,
|
|
154
|
+
* never from shredding authored packs.
|
|
155
|
+
*/
|
|
156
|
+
export const PACK_HEAVY_SPECIAL_CAP: Readonly<Record<PackBudgetPreset, number>> = {
|
|
157
|
+
speedrun: 8,
|
|
158
|
+
normal: 10,
|
|
159
|
+
fullMayhem: 12,
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Map route density + fusion knobs onto the budget presets.
|
|
164
|
+
*
|
|
165
|
+
* The `speedrun` tier is no longer selectable from here — RouteDensity 'speedrun' was
|
|
166
|
+
* deleted 2026-08-17 — but the tier stays in the tables: it is the pack-STRENGTH axis, and
|
|
167
|
+
* `packBudget.preset` can still name it directly.
|
|
168
|
+
*/
|
|
169
|
+
export function packBudgetPresetFor(
|
|
170
|
+
density: RouteDensity,
|
|
171
|
+
fusion: PullFusion = 'single',
|
|
172
|
+
): PackBudgetPreset {
|
|
173
|
+
// Full clear and/or mayhem fusion = high budget ("Full-Mayhem").
|
|
174
|
+
if (density === 'full' || fusion === 'mayhem') return 'fullMayhem';
|
|
175
|
+
return 'normal';
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Measurement-only override: `PC_PACK_THREAT_BUDGET=18` makes probe sweeps able to produce a
|
|
180
|
+
* completion-vs-budget curve without editing this table. Node-only and absent in the browser,
|
|
181
|
+
* so it can never change what a player gets. The calibration above was validated against
|
|
182
|
+
* "authored packs pass intact" and never against "can the intended party clear the dungeon" —
|
|
183
|
+
* that second number is probe-dungeon-completion, and this knob is how it gets plotted.
|
|
184
|
+
*/
|
|
185
|
+
function budgetOverride(): number | null {
|
|
186
|
+
const raw = (globalThis as { process?: { env?: Record<string, string | undefined> } })
|
|
187
|
+
.process?.env?.PC_PACK_THREAT_BUDGET;
|
|
188
|
+
const n = raw != null ? Number(raw) : NaN;
|
|
189
|
+
return Number.isFinite(n) && n > 0 ? n : null;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function threatBudgetFor(preset: PackBudgetPreset, groupSize?: number): number {
|
|
193
|
+
const table = (groupSize ?? 5) >= RAID_PARTY_SIZE_MIN
|
|
194
|
+
? PACK_THREAT_BUDGET_RAID
|
|
195
|
+
: PACK_THREAT_BUDGET;
|
|
196
|
+
return budgetOverride() ?? table[preset];
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
export function heavySpecialCapFor(preset: PackBudgetPreset): number {
|
|
200
|
+
return PACK_HEAVY_SPECIAL_CAP[preset];
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// ---- Creature inputs (template-sourced) -------------------------------------
|
|
204
|
+
|
|
205
|
+
export type SpellLookup = (spellId: number) => SpellDef | undefined;
|
|
206
|
+
export type CreatureLookup = (entry: number) => CreatureDef | undefined;
|
|
207
|
+
|
|
208
|
+
/** True when a baked spell is a heavy combat special (damage / heal pressure). */
|
|
209
|
+
export function isHeavySpecialSpell(spell: SpellDef | null | undefined): boolean {
|
|
210
|
+
if (!spell) return false;
|
|
211
|
+
for (const e of spell.effects ?? []) {
|
|
212
|
+
if (HEAVY_SYNTH_KINDS.has(e.kind)) return true;
|
|
213
|
+
}
|
|
214
|
+
for (const raw of spell.rawEffects ?? []) {
|
|
215
|
+
if (HEAVY_LAUNCH_EFFECTS.has(raw.effect)) return true;
|
|
216
|
+
if (raw.effect === SPELL_EFFECT_APPLY_AURA && HEAVY_PERIODIC_AURAS.has(raw.auraName)) {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Count of DISTINCT heavy specials on a creature's cast kit
|
|
225
|
+
* (creature_template_spells + AI). Rank variants of the same spell (Heal r4 +
|
|
226
|
+
* Heal r0) dedupe by name — a kit is pressure per distinct ability, not per
|
|
227
|
+
* baked rank row. Unknown / missing spell rows do not invent abilities.
|
|
228
|
+
*/
|
|
229
|
+
export function heavyAbilityCount(
|
|
230
|
+
creature: CreatureDef | null | undefined,
|
|
231
|
+
spellOf: SpellLookup,
|
|
232
|
+
): number {
|
|
233
|
+
if (!creature) return 0;
|
|
234
|
+
const ids = creature.spells ?? [];
|
|
235
|
+
const distinct = new Set<string>();
|
|
236
|
+
for (const id of ids) {
|
|
237
|
+
const sp = spellOf(id);
|
|
238
|
+
if (isHeavySpecialSpell(sp)) distinct.add(sp!.name ?? String(id));
|
|
239
|
+
}
|
|
240
|
+
return distinct.size;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/** Rank from template scaling when present; else NORMAL (0). */
|
|
244
|
+
export function creatureEliteRank(creature: CreatureDef | null | undefined): number {
|
|
245
|
+
if (!creature) return CREATURE_ELITE.NORMAL;
|
|
246
|
+
const r = creature.scaling?.rank;
|
|
247
|
+
return typeof r === 'number' && Number.isFinite(r) ? r : CREATURE_ELITE.NORMAL;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export function creatureLevel(creature: CreatureDef | null | undefined, fallback: number): number {
|
|
251
|
+
if (!creature) return fallback;
|
|
252
|
+
if (typeof creature.level === 'number' && Number.isFinite(creature.level)) return creature.level;
|
|
253
|
+
const minL = creature.scaling?.minLevel;
|
|
254
|
+
if (typeof minL === 'number' && Number.isFinite(minL)) return minL;
|
|
255
|
+
return fallback;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Additive elite surcharge (effective-combatant units).
|
|
260
|
+
* CREATURE_ELITE ladder: NORMAL +0, ELITE +1, RAREELITE +1.5, WORLDBOSS +2;
|
|
261
|
+
* RARE (loot-special normal mob) +0.5. Cite: SharedDefines.h CREATURE_ELITE_*.
|
|
262
|
+
*/
|
|
263
|
+
function eliteSurcharge(rank: number): number {
|
|
264
|
+
const r = Number.isFinite(rank) ? Math.trunc(rank) : CREATURE_ELITE.NORMAL;
|
|
265
|
+
if (r === CREATURE_ELITE.ELITE) return 1;
|
|
266
|
+
if (r === CREATURE_ELITE.RAREELITE) return 1.5;
|
|
267
|
+
if (r === CREATURE_ELITE.WORLDBOSS) return 2;
|
|
268
|
+
if (r === CREATURE_ELITE.RARE) return 0.5;
|
|
269
|
+
return 0;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Single-creature threat weight in EFFECTIVE-COMBATANT units — additive and
|
|
274
|
+
* bounded, so the budget stays headcount-shaped:
|
|
275
|
+
* 1 (a body) + eliteSurcharge + min(distinctHeavies, 2)·0.5
|
|
276
|
+
* + clamp(levelDelta, −2..+3)·0.25
|
|
277
|
+
* A plain at-level mob ≈ 1; an elite special-caster 2 levels up ≈ 3;
|
|
278
|
+
* nothing multiplies into the old runaway 6–34 range that shattered every
|
|
279
|
+
* authored pack into single-mob pulls.
|
|
280
|
+
* Cite: COMBAT-INTERACTION-V2 §Pack-strength budget (split, never nerf).
|
|
281
|
+
*/
|
|
282
|
+
export function creatureThreatWeight(
|
|
283
|
+
creature: CreatureDef | null | undefined,
|
|
284
|
+
partyLevel: number,
|
|
285
|
+
spellOf: SpellLookup,
|
|
286
|
+
): number {
|
|
287
|
+
const rank = creatureEliteRank(creature);
|
|
288
|
+
const heavy = heavyAbilityCount(creature, spellOf);
|
|
289
|
+
const lvl = creatureLevel(creature, partyLevel);
|
|
290
|
+
const pl = Number.isFinite(partyLevel) ? Math.trunc(partyLevel) : lvl;
|
|
291
|
+
const delta = Math.max(-2, Math.min(3, Math.trunc(lvl) - pl));
|
|
292
|
+
return 1 + eliteSurcharge(rank) + Math.min(heavy, 2) * 0.5 + delta * 0.25;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// ---- Pack aggregate ---------------------------------------------------------
|
|
296
|
+
|
|
297
|
+
/** One living hostile slot in a pull (primary or pack member copy). */
|
|
298
|
+
export interface PackCombatantSlot {
|
|
299
|
+
creatureEntry: number;
|
|
300
|
+
poolCandidates?: number[];
|
|
301
|
+
/** Source spawn guid when known (split preserves relative order). */
|
|
302
|
+
spawnGuid?: number;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/** Expand primary + pack[] into per-creature slots (stable authored order). */
|
|
306
|
+
export function expandEncounterCombatants(enc: EncounterDef): PackCombatantSlot[] {
|
|
307
|
+
const slots: PackCombatantSlot[] = [{ creatureEntry: enc.creatureEntry }];
|
|
308
|
+
if (enc.poolCandidates?.length) {
|
|
309
|
+
slots[0]!.poolCandidates = [...enc.poolCandidates];
|
|
310
|
+
}
|
|
311
|
+
const guids = enc.spawnGuids ?? [];
|
|
312
|
+
if (guids.length > 0) slots[0]!.spawnGuid = guids[0];
|
|
313
|
+
|
|
314
|
+
let guidIdx = 1;
|
|
315
|
+
for (const m of enc.pack ?? []) {
|
|
316
|
+
const count = m.count > 0 ? Math.trunc(m.count) : 0;
|
|
317
|
+
for (let i = 0; i < count; i++) {
|
|
318
|
+
const slot: PackCombatantSlot = { creatureEntry: m.creatureEntry };
|
|
319
|
+
if (m.poolCandidates?.length) slot.poolCandidates = [...m.poolCandidates];
|
|
320
|
+
if (guidIdx < guids.length) slot.spawnGuid = guids[guidIdx];
|
|
321
|
+
guidIdx++;
|
|
322
|
+
slots.push(slot);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
return slots;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
export interface PackThreatBreakdown {
|
|
329
|
+
threatWeight: number;
|
|
330
|
+
/** Creatures with ≥1 heavy special (simultaneous special streams). */
|
|
331
|
+
simultaneousHeavySpecials: number;
|
|
332
|
+
combatantCount: number;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
export function packThreatBreakdown(
|
|
336
|
+
slots: readonly PackCombatantSlot[],
|
|
337
|
+
partyLevel: number,
|
|
338
|
+
creatureOf: CreatureLookup,
|
|
339
|
+
spellOf: SpellLookup,
|
|
340
|
+
): PackThreatBreakdown {
|
|
341
|
+
let threatWeight = 0;
|
|
342
|
+
let simultaneousHeavySpecials = 0;
|
|
343
|
+
for (const s of slots) {
|
|
344
|
+
const c = creatureOf(s.creatureEntry);
|
|
345
|
+
const w = creatureThreatWeight(c, partyLevel, spellOf);
|
|
346
|
+
threatWeight += w;
|
|
347
|
+
if (heavyAbilityCount(c, spellOf) > 0) simultaneousHeavySpecials++;
|
|
348
|
+
}
|
|
349
|
+
return { threatWeight, simultaneousHeavySpecials, combatantCount: slots.length };
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export function packExceedsBudget(
|
|
353
|
+
breakdown: PackThreatBreakdown,
|
|
354
|
+
preset: PackBudgetPreset,
|
|
355
|
+
/** Party size the budget is for; >10 keeps the legacy raid table. */
|
|
356
|
+
groupSize?: number,
|
|
357
|
+
): boolean {
|
|
358
|
+
return (
|
|
359
|
+
breakdown.threatWeight > threatBudgetFor(preset, groupSize)
|
|
360
|
+
|| breakdown.simultaneousHeavySpecials > heavySpecialCapFor(preset)
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// ---- Split (not nerf) -------------------------------------------------------
|
|
365
|
+
|
|
366
|
+
function slotsFitBudget(
|
|
367
|
+
slots: readonly PackCombatantSlot[],
|
|
368
|
+
partyLevel: number,
|
|
369
|
+
creatureOf: CreatureLookup,
|
|
370
|
+
spellOf: SpellLookup,
|
|
371
|
+
preset: PackBudgetPreset,
|
|
372
|
+
groupSize?: number,
|
|
373
|
+
): boolean {
|
|
374
|
+
if (slots.length === 0) return true;
|
|
375
|
+
return !packExceedsBudget(
|
|
376
|
+
packThreatBreakdown(slots, partyLevel, creatureOf, spellOf), preset, groupSize,
|
|
377
|
+
);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Fusion absorb guard: refuse merging `next` over PACK_THREAT_BUDGET / heavy-special
|
|
382
|
+
* cap, and over MAYHEM_SOFT_CAP threat (body softCap alone still fused WC Fang packs
|
|
383
|
+
* to threat 12.75). First atom stays ungated in planFusionBatches.
|
|
384
|
+
*/
|
|
385
|
+
export function makeFusionBudgetGuard(
|
|
386
|
+
partyLevel: number,
|
|
387
|
+
creatureOf: CreatureLookup,
|
|
388
|
+
spellOf: SpellLookup,
|
|
389
|
+
preset: PackBudgetPreset,
|
|
390
|
+
groupSize?: number,
|
|
391
|
+
): FusionAbsorbGuard {
|
|
392
|
+
return (batchSoFar, next) => {
|
|
393
|
+
const slots = [...batchSoFar, next].flatMap(expandEncounterCombatants);
|
|
394
|
+
if (slots.length === 0) return true;
|
|
395
|
+
const bd = packThreatBreakdown(slots, partyLevel, creatureOf, spellOf);
|
|
396
|
+
const threatCap = Math.min(threatBudgetFor(preset, groupSize), MAYHEM_SOFT_CAP);
|
|
397
|
+
if (bd.threatWeight > threatCap) return false;
|
|
398
|
+
if (bd.simultaneousHeavySpecials > heavySpecialCapFor(preset)) return false;
|
|
399
|
+
return true;
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Greedy left-to-right bin pack: grow the current sub-pull while both caps hold;
|
|
405
|
+
* open a new sub-pull when the next creature would exceed. Deterministic.
|
|
406
|
+
* A single creature that alone exceeds budget still forms its own pull (never nerfed).
|
|
407
|
+
*/
|
|
408
|
+
export function partitionSlotsToBudget(
|
|
409
|
+
slots: readonly PackCombatantSlot[],
|
|
410
|
+
partyLevel: number,
|
|
411
|
+
creatureOf: CreatureLookup,
|
|
412
|
+
spellOf: SpellLookup,
|
|
413
|
+
preset: PackBudgetPreset,
|
|
414
|
+
/** Party size the budget is for; >10 keeps the legacy raid table. */
|
|
415
|
+
groupSize?: number,
|
|
416
|
+
): PackCombatantSlot[][] {
|
|
417
|
+
if (slots.length === 0) return [];
|
|
418
|
+
const bins: PackCombatantSlot[][] = [];
|
|
419
|
+
let cur: PackCombatantSlot[] = [];
|
|
420
|
+
for (const slot of slots) {
|
|
421
|
+
const trial = cur.length ? [...cur, slot] : [slot];
|
|
422
|
+
if (cur.length > 0 && !slotsFitBudget(trial, partyLevel, creatureOf, spellOf, preset, groupSize)) {
|
|
423
|
+
bins.push(cur);
|
|
424
|
+
cur = [slot];
|
|
425
|
+
} else {
|
|
426
|
+
cur = trial;
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
if (cur.length) bins.push(cur);
|
|
430
|
+
return bins;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
function slotsToEncounterShape(slots: readonly PackCombatantSlot[]): {
|
|
434
|
+
creatureEntry: number;
|
|
435
|
+
pack?: EncounterPackMember[];
|
|
436
|
+
poolCandidates?: number[];
|
|
437
|
+
spawnGuids?: number[];
|
|
438
|
+
} {
|
|
439
|
+
if (slots.length === 0) {
|
|
440
|
+
throw new Error('slotsToEncounterShape: empty');
|
|
441
|
+
}
|
|
442
|
+
const primary = slots[0]!;
|
|
443
|
+
const pack: EncounterPackMember[] = [];
|
|
444
|
+
// Collapse consecutive same-entry non-CSE copies into count rows; CSE stays count=1.
|
|
445
|
+
let i = 1;
|
|
446
|
+
while (i < slots.length) {
|
|
447
|
+
const s = slots[i]!;
|
|
448
|
+
if (s.poolCandidates?.length) {
|
|
449
|
+
pack.push({
|
|
450
|
+
creatureEntry: s.creatureEntry,
|
|
451
|
+
count: 1,
|
|
452
|
+
poolCandidates: [...s.poolCandidates],
|
|
453
|
+
});
|
|
454
|
+
i++;
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
let count = 1;
|
|
458
|
+
while (
|
|
459
|
+
i + count < slots.length
|
|
460
|
+
&& slots[i + count]!.creatureEntry === s.creatureEntry
|
|
461
|
+
&& !slots[i + count]!.poolCandidates?.length
|
|
462
|
+
) {
|
|
463
|
+
count++;
|
|
464
|
+
}
|
|
465
|
+
pack.push({ creatureEntry: s.creatureEntry, count });
|
|
466
|
+
i += count;
|
|
467
|
+
}
|
|
468
|
+
const spawnGuids = slots.map((s) => s.spawnGuid).filter((g): g is number => g != null);
|
|
469
|
+
return {
|
|
470
|
+
creatureEntry: primary.creatureEntry,
|
|
471
|
+
...(primary.poolCandidates?.length ? { poolCandidates: [...primary.poolCandidates] } : {}),
|
|
472
|
+
...(pack.length ? { pack } : {}),
|
|
473
|
+
...(spawnGuids.length === slots.length ? { spawnGuids } : {}),
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* objectGate that sets a flag the same encounter also requires — the item/use
|
|
479
|
+
* transforms the whole room at once (Dawn's Gambit). Door-trash objectGate that
|
|
480
|
+
* only unlocks a later pack is not this (Deadmines Cannon / Pirate / Shipbuilder).
|
|
481
|
+
* Cite: instance_scholomance.cpp:440-469 HandleDawnGambitEvent.
|
|
482
|
+
*/
|
|
483
|
+
function isSelfGatingObjectGate(enc: EncounterDef): boolean {
|
|
484
|
+
const required = new Set<string>();
|
|
485
|
+
const setByGate = new Set<string>();
|
|
486
|
+
for (const ev of enc.events ?? []) {
|
|
487
|
+
if (ev.kind === 'requiresFlag') required.add(ev.flag);
|
|
488
|
+
if (ev.kind === 'objectGate') setByGate.add(ev.setsFlag);
|
|
489
|
+
}
|
|
490
|
+
for (const flag of setByGate) {
|
|
491
|
+
if (required.has(flag)) return true;
|
|
492
|
+
}
|
|
493
|
+
return false;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
/**
|
|
497
|
+
* Bosses and multi-phase scripted trash stay one pull. Ordinary objectGate /
|
|
498
|
+
* requiresFlag trash may still split — those gates ride the first atom, and
|
|
499
|
+
* later atoms get requiresFlag so fusion cannot re-merge them (isFusionBreak).
|
|
500
|
+
*/
|
|
501
|
+
function isBudgetAtomic(enc: EncounterDef): boolean {
|
|
502
|
+
if (enc.kind === 'boss') return true;
|
|
503
|
+
if (isSelfGatingObjectGate(enc)) return true;
|
|
504
|
+
for (const ev of enc.events ?? []) {
|
|
505
|
+
if (ev.kind === 'onDeathSummon' || ev.kind === 'waves' || ev.kind === 'hpThreshold') {
|
|
506
|
+
return true;
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
return false;
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
/**
|
|
513
|
+
* Split one encounter into sequential sub-pulls when over budget.
|
|
514
|
+
* Bosses / multi-phase scripted pulls are never split. Under budget → [enc] untouched.
|
|
515
|
+
* Sub-pulls after the first carry requiresFlag so fusion cannot re-merge them
|
|
516
|
+
* (isFusionBreak) and route unlock stays sequential.
|
|
517
|
+
*/
|
|
518
|
+
export function splitEncounterToBudget(
|
|
519
|
+
enc: EncounterDef,
|
|
520
|
+
partyLevel: number,
|
|
521
|
+
creatureOf: CreatureLookup,
|
|
522
|
+
spellOf: SpellLookup,
|
|
523
|
+
preset: PackBudgetPreset,
|
|
524
|
+
/** Party size the budget is for; >10 keeps the legacy raid table. */
|
|
525
|
+
groupSize?: number,
|
|
526
|
+
): EncounterDef[] {
|
|
527
|
+
if (isBudgetAtomic(enc)) return [enc];
|
|
528
|
+
|
|
529
|
+
const slots = expandEncounterCombatants(enc);
|
|
530
|
+
if (slots.length <= 1) return [enc];
|
|
531
|
+
|
|
532
|
+
const breakdown = packThreatBreakdown(slots, partyLevel, creatureOf, spellOf);
|
|
533
|
+
// groupSize matters here too: without it a raid pack is judged against the 5-man budget,
|
|
534
|
+
// falls past this early-out, and only `bins.length <= 1` below saves it from being renamed.
|
|
535
|
+
if (!packExceedsBudget(breakdown, preset, groupSize)) return [enc];
|
|
536
|
+
|
|
537
|
+
const bins = partitionSlotsToBudget(slots, partyLevel, creatureOf, spellOf, preset, groupSize);
|
|
538
|
+
if (bins.length <= 1) return [enc];
|
|
539
|
+
|
|
540
|
+
const out: EncounterDef[] = [];
|
|
541
|
+
for (let bi = 0; bi < bins.length; bi++) {
|
|
542
|
+
const shape = slotsToEncounterShape(bins[bi]!);
|
|
543
|
+
const id = bi === 0 ? enc.id : `${enc.id}__budget${bi + 1}`;
|
|
544
|
+
const name =
|
|
545
|
+
bins.length > 1 ? `${enc.name} (${bi + 1}/${bins.length})` : enc.name;
|
|
546
|
+
|
|
547
|
+
// Preserve original requiresFlag / objectGate on the first atom only.
|
|
548
|
+
// Chain later atoms with requiresFlag so fusion cannot re-fuse them and
|
|
549
|
+
// unlock order stays sequential via flags set on prior clear.
|
|
550
|
+
const events: NonNullable<EncounterDef['events']> = [];
|
|
551
|
+
if (bi === 0) {
|
|
552
|
+
for (const ev of enc.events ?? []) {
|
|
553
|
+
if (ev.kind === 'requiresFlag' || ev.kind === 'objectGate') events.push(ev);
|
|
554
|
+
}
|
|
555
|
+
} else {
|
|
556
|
+
events.push({ kind: 'requiresFlag', flag: `__packBudget:${enc.id}:${bi}` });
|
|
557
|
+
}
|
|
558
|
+
// Intermediate setsFlag unlocks the next budget atom; final atom keeps original setsFlag.
|
|
559
|
+
if (bi < bins.length - 1) {
|
|
560
|
+
events.push({ kind: 'setsFlag', flag: `__packBudget:${enc.id}:${bi + 1}` });
|
|
561
|
+
} else {
|
|
562
|
+
for (const ev of enc.events ?? []) {
|
|
563
|
+
if (ev.kind === 'setsFlag') events.push(ev);
|
|
564
|
+
// Multi-phase scripted events stay on the final sub-pull only.
|
|
565
|
+
if (
|
|
566
|
+
ev.kind === 'onDeathSummon'
|
|
567
|
+
|| ev.kind === 'waves'
|
|
568
|
+
|| ev.kind === 'hpThreshold'
|
|
569
|
+
) {
|
|
570
|
+
events.push(ev);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
const sub: EncounterDef = {
|
|
576
|
+
id,
|
|
577
|
+
name,
|
|
578
|
+
kind: enc.kind,
|
|
579
|
+
creatureEntry: shape.creatureEntry,
|
|
580
|
+
...(shape.poolCandidates ? { poolCandidates: shape.poolCandidates } : {}),
|
|
581
|
+
...(shape.pack ? { pack: shape.pack } : {}),
|
|
582
|
+
...(enc.origin ? { origin: { ...enc.origin } } : {}),
|
|
583
|
+
// Room-sticky tour keys on these. Dropping them made every over-budget
|
|
584
|
+
// Scholomance Reliquary pack a singleton, so the tour walked Chamber first.
|
|
585
|
+
...(enc.roomId !== undefined ? { roomId: enc.roomId } : {}),
|
|
586
|
+
...(enc.roomName !== undefined ? { roomName: enc.roomName } : {}),
|
|
587
|
+
...(shape.spawnGuids ? { spawnGuids: shape.spawnGuids } : {}),
|
|
588
|
+
...(enc.intro && bi === 0 ? { intro: enc.intro } : {}),
|
|
589
|
+
...(enc.bossSpells && bi === 0 ? { bossSpells: [...enc.bossSpells] } : {}),
|
|
590
|
+
...(events.length ? { events } : {}),
|
|
591
|
+
};
|
|
592
|
+
out.push(sub);
|
|
593
|
+
}
|
|
594
|
+
return out;
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
// Expand a density-filtered route: each over-budget trash atom becomes sequential sub-pulls. Bosses /
|
|
598
|
+
// multi-phase scripted trash pass through. Deterministic.
|
|
599
|
+
export function expandRouteByPackBudget(
|
|
600
|
+
route: readonly EncounterDef[],
|
|
601
|
+
partyLevel: number,
|
|
602
|
+
creatureOf: CreatureLookup,
|
|
603
|
+
spellOf: SpellLookup,
|
|
604
|
+
preset: PackBudgetPreset,
|
|
605
|
+
/** Party size the budget is for; >10 keeps the legacy raid table. */
|
|
606
|
+
groupSize?: number,
|
|
607
|
+
): EncounterDef[] {
|
|
608
|
+
const out: EncounterDef[] = [];
|
|
609
|
+
for (const enc of route) {
|
|
610
|
+
out.push(...splitEncounterToBudget(enc, partyLevel, creatureOf, spellOf, preset, groupSize));
|
|
611
|
+
}
|
|
612
|
+
return out;
|
|
613
|
+
}
|