azeroth-shell 0.0.0-stage → 0.1.0
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 +26 -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 +126 -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,135 @@
|
|
|
1
|
+
// Classic aura-state cast gates, read from the baked caster and target states. The 1.12 server does not
|
|
2
|
+
// repeat the test — the client owns it — so this engine, which is both, gates here.
|
|
3
|
+
|
|
4
|
+
import type { SpellDef } from '../../data/schema.ts';
|
|
5
|
+
import { RECENT_DODGE_MS, RECENT_DEFENSE_REACT_MS } from './types.ts';
|
|
6
|
+
|
|
7
|
+
/** AuraState values a 1.12 spell row can require. Cite: SpellAuraDefines.h:341-348. */
|
|
8
|
+
export const AURA_STATE = {
|
|
9
|
+
DEFENSE: 1,
|
|
10
|
+
HEALTHLESS_20_PERCENT: 2,
|
|
11
|
+
BERSERKING: 3,
|
|
12
|
+
FROZEN: 4,
|
|
13
|
+
JUDGEMENT: 5,
|
|
14
|
+
HUNTER_PARRY: 7,
|
|
15
|
+
} as const;
|
|
16
|
+
|
|
17
|
+
/** SharedDefines.h Classes — only the two with an aura-state exclusion. */
|
|
18
|
+
const CLASS_HUNTER = 3;
|
|
19
|
+
const CLASS_ROGUE = 4;
|
|
20
|
+
|
|
21
|
+
/** Overpower ranks — "Only useable after the target dodges." */
|
|
22
|
+
export function isOverpowerSpell(spell: SpellDef): boolean {
|
|
23
|
+
return /^overpower$/i.test(spell.name ?? '');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Everything HasAuraState needs, as the Fighter already carries it. */
|
|
27
|
+
export interface AuraStateUnit {
|
|
28
|
+
hp: number;
|
|
29
|
+
spec: { maxHealth: number; classId?: number };
|
|
30
|
+
lastDefenseReactAt: number;
|
|
31
|
+
lastHunterParryAt: number;
|
|
32
|
+
activeSeal: { spellId: number } | null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface ReactiveGateCaster extends AuraStateUnit {
|
|
36
|
+
lastDodgedAt: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ReactiveGateTarget extends AuraStateUnit {
|
|
40
|
+
lastDodgedAt: number;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** UNIT_FIELD_AURASTATE test for one state. Cite: Unit.h:2163 HasAuraState. */
|
|
44
|
+
export function hasAuraState(state: number, u: AuraStateUnit, now: number): boolean {
|
|
45
|
+
switch (state | 0) {
|
|
46
|
+
case AURA_STATE.DEFENSE:
|
|
47
|
+
return now - u.lastDefenseReactAt <= RECENT_DEFENSE_REACT_MS;
|
|
48
|
+
case AURA_STATE.HEALTHLESS_20_PERCENT:
|
|
49
|
+
return u.hp < Math.max(1, u.spec.maxHealth) * 0.2;
|
|
50
|
+
case AURA_STATE.HUNTER_PARRY:
|
|
51
|
+
return now - u.lastHunterParryAt <= RECENT_DEFENSE_REACT_MS;
|
|
52
|
+
case AURA_STATE.JUDGEMENT:
|
|
53
|
+
return u.activeSeal != null;
|
|
54
|
+
// BERSERKING is set by the caster's own effect handler immediately before the triggered
|
|
55
|
+
// cast, and no 1.12 spell sets FROZEN — neither can be absent at cast time.
|
|
56
|
+
case AURA_STATE.BERSERKING:
|
|
57
|
+
case AURA_STATE.FROZEN:
|
|
58
|
+
return true;
|
|
59
|
+
default:
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/** The reason string the action bar shows for an absent state. */
|
|
65
|
+
function auraStateRefusal(state: number, u: AuraStateUnit, onTarget: boolean): string {
|
|
66
|
+
switch (state | 0) {
|
|
67
|
+
case AURA_STATE.DEFENSE: {
|
|
68
|
+
const cls = (u.spec.classId ?? 0) | 0;
|
|
69
|
+
if (cls === CLASS_ROGUE) return 'must parry first';
|
|
70
|
+
if (cls === CLASS_HUNTER) return 'must dodge first';
|
|
71
|
+
return 'must block, dodge or parry first';
|
|
72
|
+
}
|
|
73
|
+
case AURA_STATE.HEALTHLESS_20_PERCENT:
|
|
74
|
+
return onTarget ? 'target must be below 20% health' : 'must be below 20% health';
|
|
75
|
+
case AURA_STATE.HUNTER_PARRY:
|
|
76
|
+
return 'must parry first';
|
|
77
|
+
case AURA_STATE.JUDGEMENT:
|
|
78
|
+
return 'requires a seal';
|
|
79
|
+
default:
|
|
80
|
+
return onTarget ? 'target is missing a required aura' : 'missing a required aura';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Records the defender's own dodge/parry/block as the aura state it sets, with the two class exclusions.
|
|
85
|
+
// Cite: UnitAuraProcHandler.cpp:296-328.
|
|
86
|
+
export function stampDefensiveAuraState(
|
|
87
|
+
defender: ReactiveGateTarget,
|
|
88
|
+
result: 'dodge' | 'parry' | 'block',
|
|
89
|
+
t: number,
|
|
90
|
+
): void {
|
|
91
|
+
const cls = (defender.spec.classId ?? 0) | 0;
|
|
92
|
+
if (result === 'dodge') {
|
|
93
|
+
// The attacker-side Overpower marker is set for every class; only DEFENSE skips the rogue.
|
|
94
|
+
defender.lastDodgedAt = t;
|
|
95
|
+
if (cls !== CLASS_ROGUE) defender.lastDefenseReactAt = t;
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
if (result === 'parry') {
|
|
99
|
+
if (cls === CLASS_HUNTER) defender.lastHunterParryAt = t;
|
|
100
|
+
else defender.lastDefenseReactAt = t;
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
defender.lastDefenseReactAt = t;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Returns a short unusable reason when a required aura state is absent, else null. Does not mutate timers —
|
|
107
|
+
// call {@link consumeReactiveWindow} after a successful cast starts.
|
|
108
|
+
export function reactiveCastGate(
|
|
109
|
+
caster: ReactiveGateCaster,
|
|
110
|
+
target: ReactiveGateTarget,
|
|
111
|
+
spell: SpellDef,
|
|
112
|
+
now: number,
|
|
113
|
+
): string | null {
|
|
114
|
+
const cas = (spell.casterAuraState ?? 0) | 0;
|
|
115
|
+
if (cas && !hasAuraState(cas, caster, now)) return auraStateRefusal(cas, caster, false);
|
|
116
|
+
const tas = (spell.targetAuraState ?? 0) | 0;
|
|
117
|
+
if (tas && !hasAuraState(tas, target, now)) return auraStateRefusal(tas, target, true);
|
|
118
|
+
if (isOverpowerSpell(spell) && !(now - target.lastDodgedAt <= RECENT_DODGE_MS)) {
|
|
119
|
+
return 'target must dodge first';
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Close the react window after a successful cast of a reactive ability. Only the timed states are
|
|
125
|
+
// consumable: health and seal states are not windows, and clearing defense must not clear Overpower.
|
|
126
|
+
export function consumeReactiveWindow(
|
|
127
|
+
caster: ReactiveGateCaster,
|
|
128
|
+
target: ReactiveGateTarget,
|
|
129
|
+
spell: SpellDef,
|
|
130
|
+
): void {
|
|
131
|
+
const cas = (spell.casterAuraState ?? 0) | 0;
|
|
132
|
+
if (cas === AURA_STATE.DEFENSE) caster.lastDefenseReactAt = Number.NEGATIVE_INFINITY;
|
|
133
|
+
else if (cas === AURA_STATE.HUNTER_PARRY) caster.lastHunterParryAt = Number.NEGATIVE_INFINITY;
|
|
134
|
+
if (isOverpowerSpell(spell)) target.lastDodgedAt = Number.NEGATIVE_INFINITY;
|
|
135
|
+
}
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
// Spell role helpers (Wave 4 S26) — extracted from engine/combat.ts.
|
|
2
|
+
// Rotation layer may import from here instead of the combat.ts god-file.
|
|
3
|
+
|
|
4
|
+
import type { SpellDef, SpellRole } from '../../data/schema.ts';
|
|
5
|
+
import type { PendingSpellMod } from './types.ts';
|
|
6
|
+
import { isHostileSpeedEffect } from './speedAura.ts';
|
|
7
|
+
import { INSTANT_CAST_GUARD_MS } from '../spells/spellMods.ts';
|
|
8
|
+
import type { OwnedSpellMod } from '../spells/spellModIntents.ts';
|
|
9
|
+
import {
|
|
10
|
+
chargedSpellModsFromSpell,
|
|
11
|
+
isSpellAffectedByMod,
|
|
12
|
+
spellModCharges,
|
|
13
|
+
SPELLMOD_ALL_EFFECTS,
|
|
14
|
+
SPELLMOD_CASTING_TIME,
|
|
15
|
+
SPELLMOD_COOLDOWN,
|
|
16
|
+
SPELLMOD_COST,
|
|
17
|
+
SPELLMOD_CRITICAL_CHANCE,
|
|
18
|
+
} from '../spells/spellModIntents.ts';
|
|
19
|
+
|
|
20
|
+
/** SpellEntry.Dispel = DISPEL_CURSE. Cite: SharedDefines.h DispelType. */
|
|
21
|
+
const DISPEL_CURSE = 2;
|
|
22
|
+
/** SpellFamilyName for the warlock. Cite: SharedDefines.h SPELLFAMILY_WARLOCK = 5. */
|
|
23
|
+
const SPELLFAMILY_WARLOCK = 5;
|
|
24
|
+
|
|
25
|
+
// Every raw effect is TARGET_UNIT_CASTER (1) — self-only DBC targeting. Cite: SpellTargetDefines.h
|
|
26
|
+
// TARGET_UNIT_CASTER=1; boss_jandice_barov Spread 17772/17774.
|
|
27
|
+
export function isSelfTargetedSpell(s: SpellDef): boolean {
|
|
28
|
+
const rows = s.rawEffects;
|
|
29
|
+
if (!rows || rows.length === 0) return false;
|
|
30
|
+
return rows.every((r) => (r.targetA | 0) === 1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** How the combat AI should use a spell, inferred from its DB effects (data-driven). */
|
|
34
|
+
export function inferRole(s: SpellDef): SpellRole {
|
|
35
|
+
if (s.rageGenerated && s.cost === 0) return 'charge';
|
|
36
|
+
if (s.strikeBonus) return 'strike';
|
|
37
|
+
// Combo-point builders that are pure strikes (SS) keep role 'strike'; finishers that only deal
|
|
38
|
+
// damage look like instant nukes so the energy AI can prefer them at high CP.
|
|
39
|
+
if (s.requiresComboPoints && s.effects.some((e) => e.kind === 'direct_damage')) return 'instant_nuke';
|
|
40
|
+
if (s.requiresComboPoints && s.effects.some((e) => e.kind === 'buff' && e.mod === 'haste')) return 'buff';
|
|
41
|
+
const has = (k: SpellDef['effects'][number]['kind']): boolean => s.effects.some((e) => e.kind === k);
|
|
42
|
+
// Divine Intervention is self and party sacrifice immunity, not a gap-closer — its long cooldown,
|
|
43
|
+
// range and trigger would otherwise match the Charge heuristic below. A local id check avoids a cycle.
|
|
44
|
+
const sid = s.id | 0;
|
|
45
|
+
if (sid === 19752 || sid === 19753 || sid === 19754 || /^divine intervention$/i.test(s.name ?? '')) {
|
|
46
|
+
return 'buff';
|
|
47
|
+
}
|
|
48
|
+
// Self-only MOD_CONFUSE kits (Spread 17772/17774) are not rotation CC.
|
|
49
|
+
// Cite: boss_jandice_barov.cpp:52-55,91; SpellTargetDefines.h TARGET_UNIT_CASTER.
|
|
50
|
+
if (isSelfTargetedSpell(s) && (has('cc') || has('root'))) return 'utility';
|
|
51
|
+
// Gap-closers whose only resolved effects are a trigger, plus perhaps a charge energize. Resolve drops
|
|
52
|
+
// the baked role, and a bare trigger would fall to utility, so the parent gets dropped from the kit.
|
|
53
|
+
if (
|
|
54
|
+
has('trigger_spell')
|
|
55
|
+
&& (s.rangeMax ?? 0) >= 8
|
|
56
|
+
&& (s.cooldownMs ?? 0) >= 10_000
|
|
57
|
+
&& !has('root') && !has('cc') && !has('interrupt_cast') && !has('dot')
|
|
58
|
+
&& !has('direct_damage') && !has('buff') && !has('heal')
|
|
59
|
+
) {
|
|
60
|
+
return 'charge';
|
|
61
|
+
}
|
|
62
|
+
// Vanish: rogue family flag, only a trigger after resolve. The baked stealth role is dropped when the
|
|
63
|
+
// effects re-materialize, so without this the parent becomes utility and leaves the combat kit.
|
|
64
|
+
if (
|
|
65
|
+
has('trigger_spell')
|
|
66
|
+
&& s.spellFamilyName === 8
|
|
67
|
+
&& ((s.spellFamilyFlags ?? 0) & 0x800) !== 0
|
|
68
|
+
) {
|
|
69
|
+
return 'stealth';
|
|
70
|
+
}
|
|
71
|
+
// Pet management — Call Pet and Revive Pet. Deriving the role here means the kit survives a bake row
|
|
72
|
+
// with no stamp. Dismiss Pet keeps no ACTIVE role: it is a pet-frame action, not a rotation pick.
|
|
73
|
+
if (has('summon_pet') || has('revive_pet')) return 'pet_summon';
|
|
74
|
+
if (has('shapeshift') && !has('stealth')) return 'form';
|
|
75
|
+
if (has('stealth') || s.role === 'stealth') return 'stealth';
|
|
76
|
+
if (has('summon_totem')) return 'totem_summon';
|
|
77
|
+
if (has('seal')) return 'seal';
|
|
78
|
+
if (has('judgement')) return 'judgement';
|
|
79
|
+
if (has('root') || has('cc') || has('interrupt_cast')) return 'control';
|
|
80
|
+
// The dispel effects — Purge, Dispel Magic, Remove Curse, Cleanse. ACTIVE so the combat kit keeps
|
|
81
|
+
// them, since utility would drop them and a tick by id is a silent no-op. Never 'buff': a strip is
|
|
82
|
+
if (has('dispel') || has('cleanse') || has('dispel_mechanic')) return 'control';
|
|
83
|
+
// Taunt and mod-taunt — Taunt, Growl, Mocking Blow, Challenging Shout. Must be ACTIVE so the fight kit
|
|
84
|
+
// keeps them; utility would drop them and a tick by id is a silent no-op.
|
|
85
|
+
if (has('taunt') || has('mod_taunt')) return 'control';
|
|
86
|
+
// SPELL_EFFECT_THREAT (63) / MODIFY_THREAT_PERCENT (125) — Distracting Shot, Growl, Torment,
|
|
87
|
+
// Feint, Cower, Disengage. Same ACTIVE-role requirement as taunt (KI-102).
|
|
88
|
+
if (has('threat') || has('modify_threat_pct')) return 'control';
|
|
89
|
+
// SPELL_AURA_MOD_TOTAL_THREAT (103) — Fade: self buff that drops reverse-hate temporarily. ACTIVE buff so
|
|
90
|
+
// knownCombatSpells keeps it in the fight kit (not utility drop). Cite: SpellAuras.cpp:2841–2858; KI-774.
|
|
91
|
+
if (has('threat_temporary')) return 'buff';
|
|
92
|
+
// The power burn, drain and leech effects, already wired in applySpell, must not fall through to
|
|
93
|
+
// utility. A happiness drain is pet mood bookkeeping, not an enemy mana drain.
|
|
94
|
+
const hostilePowerDrain = s.effects.some(
|
|
95
|
+
(e) => e.kind === 'power_drain' && (e.powerType | 0) !== 4,
|
|
96
|
+
);
|
|
97
|
+
if (has('power_burn') || has('health_leech') || hostilePowerDrain) {
|
|
98
|
+
return s.castTimeMs > 0 ? 'nuke' : 'instant_nuke';
|
|
99
|
+
}
|
|
100
|
+
if (has('direct_damage')) return s.castTimeMs > 0 ? 'nuke' : 'instant_nuke';
|
|
101
|
+
// Holy Shock resolves to its own kind: an instant hostile holy hit or a friendly heal. ACTIVE so the
|
|
102
|
+
// fight kit keeps every rank, since utility would drop them and a tick by id does nothing.
|
|
103
|
+
if (has('holy_shock')) return s.castTimeMs > 0 ? 'nuke' : 'instant_nuke';
|
|
104
|
+
if (has('dot')) return 'dot';
|
|
105
|
+
// PERIODIC_MANA_LEECH (aura 64) bakes as restore_power with negative amountPerTick
|
|
106
|
+
// (Viper Sting, Drain Mana). Hostile mana-drain DoT — ACTIVE (dot) for the combat kit (KI-101).
|
|
107
|
+
if (s.effects.some((e) => e.kind === 'restore_power' && e.amountPerTick < 0)) return 'dot';
|
|
108
|
+
// A pure hostile snare. Damage-and-snare spells already returned above, but a pure one must not fall
|
|
109
|
+
// to utility or the kit drops it. An explicit hostile:false self-slow is not control.
|
|
110
|
+
if (s.effects.some((e) => e.kind === 'speed' && isHostileSpeedEffect(e))) {
|
|
111
|
+
return 'control';
|
|
112
|
+
}
|
|
113
|
+
// Direct heals and HoTs, which the bake spells as a health restore. A full-heal emergency takes the
|
|
114
|
+
// same ACTIVE buff path. Cite: SpellEffects.cpp EffectHealMaxHealth.
|
|
115
|
+
if (has('heal') || has('restore_health') || has('heal_max_health')) return 'buff';
|
|
116
|
+
// Positive restore_power (self mana channel / drink-style) — keep-up buff when used in combat.
|
|
117
|
+
if (has('restore_power')) return 'buff';
|
|
118
|
+
// Damage shields and weapon imbues are self-setup buffs kept up out of combat and refreshed in it. A
|
|
119
|
+
// ranged proc holder is a combat nuke — treating one as a self-buff was permanent mana thrash.
|
|
120
|
+
if (has('damage_shield') || has('weapon_imbue') || has('buff')) return 'buff';
|
|
121
|
+
// Resistance auras and buffs — the three schools, Shadow Protection, Aspect of the Wild. ACTIVE, so
|
|
122
|
+
// auto-setup and the action bars list them.
|
|
123
|
+
if (has('resist')) return 'buff';
|
|
124
|
+
// Blessing of Sacrifice / Soul Link style split damage — party-support buffs.
|
|
125
|
+
// Cite: SpellAuras.cpp split damage; schema split_damage / split_damage_flat.
|
|
126
|
+
if (has('split_damage') || has('split_damage_flat')) return 'buff';
|
|
127
|
+
// Blessing of Light (SESSION 11 kit) — typed buff, not generic `buff` kind.
|
|
128
|
+
if (has('blessing_of_light')) return 'buff';
|
|
129
|
+
// Inferno / similar warlock summons — pet kit (same as summon_pet).
|
|
130
|
+
// Cite: SpellEffects.cpp EffectSummonDemon; schema summon_demon.
|
|
131
|
+
if (has('summon_demon')) return 'pet_summon';
|
|
132
|
+
// Resurrect / Rebirth / Redemption — castable utility kept on bars + auto-setup pool
|
|
133
|
+
// (battle rez is a real combat decision). Cite: schema resurrect.
|
|
134
|
+
if (has('resurrect')) return 'buff';
|
|
135
|
+
if (has('proc_trigger_spell')) {
|
|
136
|
+
if ((s.rangeMax ?? 0) > 0 && !has('damage_shield') && !has('buff')) {
|
|
137
|
+
return s.castTimeMs > 0 ? 'nuke' : 'instant_nuke';
|
|
138
|
+
}
|
|
139
|
+
return 'buff';
|
|
140
|
+
}
|
|
141
|
+
// School/damage immunity + pacify (Divine Protection / BoP) are self/friendly buffs, not CC.
|
|
142
|
+
if (has('school_immunity') || has('damage_immunity') || has('mechanic_immunity') || has('pacify')) return 'buff';
|
|
143
|
+
// MOD_UNATTACKABLE — the imp's Phase Shift. An ACTIVE buff so pet keep-up and the combat kit hold it;
|
|
144
|
+
// dropping it to utility meant it was never autocast.
|
|
145
|
+
if (has('mod_unattackable')) return 'buff';
|
|
146
|
+
// Talent actives: the one-shot next-cast arms and the cooldown resets. ACTIVE so the fight kit keeps
|
|
147
|
+
// them — as utility, a companion granted one never cast it and autofill missed it too.
|
|
148
|
+
if (has('next_cast_mod') || has('reset_cooldowns')) return 'buff';
|
|
149
|
+
// Typed talent and absorb actives that resolve without a generic buff or damage kind. Without these
|
|
150
|
+
// branches they fall to utility and drop out of the setup picker and the action bars.
|
|
151
|
+
if (has('school_absorb') || has('mana_shield')) return 'buff';
|
|
152
|
+
if (
|
|
153
|
+
has('sweeping_strikes')
|
|
154
|
+
|| has('combustion')
|
|
155
|
+
|| has('vampiric_embrace')
|
|
156
|
+
|| has('demonic_sacrifice')
|
|
157
|
+
|| has('eye_for_an_eye')
|
|
158
|
+
|| has('oracle_healing_bonus')
|
|
159
|
+
|| has('obsidian_armor')
|
|
160
|
+
|| has('adaptive_warding')
|
|
161
|
+
|| has('class_power_set')
|
|
162
|
+
|| has('vestments_greater_heal')
|
|
163
|
+
|| has('dreamwalker_healing_touch')
|
|
164
|
+
|| has('idol_healing_touch_refund')
|
|
165
|
+
|| has('totem_lesser_healing_wave')
|
|
166
|
+
|| has('cheat_death')
|
|
167
|
+
|| has('master_of_elements')
|
|
168
|
+
|| has('magic_absorption')
|
|
169
|
+
|| has('ignite')
|
|
170
|
+
|| has('deep_wounds')
|
|
171
|
+
|| has('improved_sprint')
|
|
172
|
+
|| has('healing_way_talent')
|
|
173
|
+
|| has('healing_way')
|
|
174
|
+
|| has('add_target_trigger')
|
|
175
|
+
) return 'buff';
|
|
176
|
+
// Premeditation: pure combo_points grant (no damage). Builders with damage already returned
|
|
177
|
+
// strike/instant_nuke above. Cite: SpellEffects.cpp EffectAddComboPoints; Premeditation 14183.
|
|
178
|
+
if (has('combo_points')) return 'buff';
|
|
179
|
+
// Combustion: a self-only long-cooldown parent that materializes only the trigger of its stacking
|
|
180
|
+
// payload. Mid-range gap-closers already returned above, so zero range plus a long recovery is enough.
|
|
181
|
+
if (
|
|
182
|
+
has('trigger_spell')
|
|
183
|
+
&& (s.rangeMax ?? 0) === 0
|
|
184
|
+
&& (s.cooldownMs ?? 0) >= 30_000
|
|
185
|
+
&& !has('root') && !has('cc') && !has('interrupt_cast') && !has('dot')
|
|
186
|
+
&& !has('direct_damage') && !has('buff') && !has('heal')
|
|
187
|
+
) {
|
|
188
|
+
return 'buff';
|
|
189
|
+
}
|
|
190
|
+
// Warlock Life Tap, a core mid-fight rotation spell. Must be ACTIVE so every rank stays in the kit;
|
|
191
|
+
// utility drops it and turns both the tick and the rotation rule into silent no-ops.
|
|
192
|
+
if (has('life_tap')) return 'buff';
|
|
193
|
+
// Priest Lightwell — reactive party heal well (charges). Same ACTIVE kit requirement.
|
|
194
|
+
// Cite: SpellEffects.cpp EffectTransmitted :5271; applySpellLate lightwell; schema lightwell.
|
|
195
|
+
if (has('lightwell')) return 'buff';
|
|
196
|
+
// Self run-speed combat buffs — Sprint, Dash, Dive — are ACTIVE so the combat kit keeps them
|
|
197
|
+
// mid-fight. A world mount's speed and a swim-only aura stay utility: travel, not fight kit.
|
|
198
|
+
if (s.effects.some(
|
|
199
|
+
(e) => e.kind === 'speed' && !e.hostile && (e.pct ?? 0) > 0 && e.aura === 31,
|
|
200
|
+
)) {
|
|
201
|
+
return 'buff';
|
|
202
|
+
}
|
|
203
|
+
// Utility detection / soothe / vision auras — ACTIVE so combat kit lists them (not pure
|
|
204
|
+
// resource tax). Cite: SPELL_AURA_AURAS_VISIBLE / MOD_DETECT_RANGE / BIND_SIGHT; KI-124/186/187.
|
|
205
|
+
if (has('auras_visible') || has('mod_detect_range') || has('bind_sight')) return 'control';
|
|
206
|
+
// Flare (and similar) — strip stealth / anti-invis combat tools. Cite: schema dispel_immunity.
|
|
207
|
+
if (has('dispel_immunity')) return 'control';
|
|
208
|
+
// Distract / Pick Pocket — world utility stubs stay utility (OOC primary). Cite: KI-112/159.
|
|
209
|
+
if (has('conjure')) return 'conjure';
|
|
210
|
+
return 'utility';
|
|
211
|
+
}
|
|
212
|
+
// inferRole walks about 40 scans over the effects and is a pure function of a frozen bake object, yet
|
|
213
|
+
// it ran per unit per tick — 8.7% of an 80-unit profile. A spell def is interned, so the map evicts.
|
|
214
|
+
const roleCache = new WeakMap<SpellDef, SpellRole>();
|
|
215
|
+
|
|
216
|
+
export function roleOf(s: SpellDef): SpellRole {
|
|
217
|
+
if (s.role != null) return s.role;
|
|
218
|
+
const hit = roleCache.get(s);
|
|
219
|
+
if (hit !== undefined) return hit;
|
|
220
|
+
const role = inferRole(s);
|
|
221
|
+
roleCache.set(s, role);
|
|
222
|
+
return role;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/** A spell that restores health (heal / Lay on Hands / HoT / Holy Shock) — gates `next_cast_mod` for heals. */
|
|
226
|
+
const healsCache = new WeakMap<SpellDef, boolean>();
|
|
227
|
+
export function spellHeals(s: SpellDef): boolean {
|
|
228
|
+
const hit = healsCache.get(s);
|
|
229
|
+
if (hit !== undefined) return hit;
|
|
230
|
+
// holy_shock branches to heal on CanAssist targets. Cite: SpellEffects.cpp:1449–1450.
|
|
231
|
+
const v = s.effects.some(
|
|
232
|
+
(e) =>
|
|
233
|
+
e.kind === 'heal'
|
|
234
|
+
|| e.kind === 'heal_max_health'
|
|
235
|
+
|| e.kind === 'restore_health'
|
|
236
|
+
|| e.kind === 'holy_shock',
|
|
237
|
+
);
|
|
238
|
+
healsCache.set(s, v);
|
|
239
|
+
return v;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// Whether a +crit next-cast charge is worth consuming on this spell — deliberately broader than the
|
|
243
|
+
// sourced crit gate, because a mod landing on a DoT still counts as spent. Do not merge the two.
|
|
244
|
+
function spellConsumesCritMod(spell: SpellDef): boolean {
|
|
245
|
+
if (roleOf(spell) === 'strike') return true;
|
|
246
|
+
return spell.effects.some(
|
|
247
|
+
(e) =>
|
|
248
|
+
e.kind === 'direct_damage'
|
|
249
|
+
|| e.kind === 'dot'
|
|
250
|
+
|| e.kind === 'heal'
|
|
251
|
+
|| e.kind === 'heal_max_health'
|
|
252
|
+
|| e.kind === 'holy_shock'
|
|
253
|
+
|| e.kind === 'weapon_percent_damage',
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/** True when ApplySpellMod would apply this finite mod to `spell` (and therefore consume a charge). */
|
|
258
|
+
function nextCastModifierApplies(mod: PendingSpellMod, spell: SpellDef): boolean {
|
|
259
|
+
const castMs = spell.castTimeMs ?? 0;
|
|
260
|
+
// Player.h:2595–2596 — −100% CASTING_TIME skips base ≥ 10 s.
|
|
261
|
+
if (mod.instant && castMs > 0 && castMs < INSTANT_CAST_GUARD_MS) return true;
|
|
262
|
+
if (mod.castTimeFlat && castMs > 0) return true;
|
|
263
|
+
if ((mod.freeCost || (mod.costModPct != null && mod.costModPct !== 0)) && (spell.cost ?? 0) > 0) {
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
if (mod.effectPct) return true;
|
|
267
|
+
if (mod.critAdd && spellConsumesCritMod(spell)) return true;
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Would the cast pipeline query this op? The charge drops inside ApplySpellMod, so applying and
|
|
272
|
+
// spending are one question. Cite: Player.h:2575-2620; SpellDefines.h:396-424 SpellModOp.
|
|
273
|
+
function spellModOpApplies(row: OwnedSpellMod, spell: SpellDef): boolean {
|
|
274
|
+
switch (row.op) {
|
|
275
|
+
case SPELLMOD_CASTING_TIME: {
|
|
276
|
+
const castMs = spell.castTimeMs ?? 0;
|
|
277
|
+
if (castMs <= 0) return false;
|
|
278
|
+
// Player.h:2595–2596 — a −100% PCT is skipped on a base cast of 10 s or more.
|
|
279
|
+
if (row.type === 'pct' && row.value <= -100 && castMs >= INSTANT_CAST_GUARD_MS) return false;
|
|
280
|
+
return true;
|
|
281
|
+
}
|
|
282
|
+
case SPELLMOD_COST: return (spell.cost ?? 0) > 0;
|
|
283
|
+
case SPELLMOD_CRITICAL_CHANCE: return spellConsumesCritMod(spell);
|
|
284
|
+
case SPELLMOD_COOLDOWN: return (spell.cooldownMs ?? 0) > 0;
|
|
285
|
+
default: return true;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Whether this cast consumes the modifier. `rows` is the holder's own 107/108 list, so the DBC
|
|
290
|
+
// EffectItemType mask decides. Cite: Player.cpp:350–357 SpellModifier::isAffectedOnSpell.
|
|
291
|
+
export function nextCastModApplies(mod: PendingSpellMod, spell: SpellDef): boolean {
|
|
292
|
+
if (spell.id === mod.spellId) return false;
|
|
293
|
+
const role = roleOf(spell);
|
|
294
|
+
// Pure Auto Shot / Shoot toggle is not a cast that consumes next-cast mods.
|
|
295
|
+
// Multi-Shot / Aimed Shot (role shoot + cost/GCD) may consume them.
|
|
296
|
+
if (role === 'attack') return false;
|
|
297
|
+
if (
|
|
298
|
+
role === 'shoot'
|
|
299
|
+
&& (spell.cost ?? 0) <= 0
|
|
300
|
+
&& (spell.castTimeMs ?? 0) <= 0
|
|
301
|
+
&& (spell.gcdMs ?? 0) <= 0
|
|
302
|
+
) {
|
|
303
|
+
return false;
|
|
304
|
+
}
|
|
305
|
+
if (mod.rows?.length) {
|
|
306
|
+
for (const r of mod.rows) {
|
|
307
|
+
if (!isSpellAffectedByMod(r, spell)) continue;
|
|
308
|
+
if (spellModOpApplies(r, spell)) return true;
|
|
309
|
+
}
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
312
|
+
// No DBC rows (a scripted holder): the appliesTo shorthand stands in for the mask.
|
|
313
|
+
if (mod.appliesTo === 'nature' && spell.school !== 'nature') return false;
|
|
314
|
+
if (mod.appliesTo === 'heal' && !spellHeals(spell)) return false;
|
|
315
|
+
if (mod.appliesTo === 'summon') return spell.effects.some((e) => e.kind === 'summon_pet');
|
|
316
|
+
// A warlock curse is SpellFamilyName 5 with Dispel 2 CURSE. Cite: SpellAuras.cpp IsDispellableByMask.
|
|
317
|
+
if (mod.appliesTo === 'curse') {
|
|
318
|
+
return (spell.spellFamilyName ?? 0) === SPELLFAMILY_WARLOCK && (spell.dispel ?? 0) === DISPEL_CURSE;
|
|
319
|
+
}
|
|
320
|
+
// Same SpellFamilyName + EffectItemType mask. Family 0 (racials / items) is
|
|
321
|
+
// name-only. Cite: Player.cpp:350–357 SpellModifier::isAffectedOnSpell.
|
|
322
|
+
if (!isSpellAffectedByMod(mod, spell)) return false;
|
|
323
|
+
return nextCastModifierApplies(mod, spell);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
// The shorthand the cast sites read, folded out of the holder's own SpellModOp rows.
|
|
327
|
+
function payloadFromRows(rows: readonly OwnedSpellMod[]): Partial<PendingSpellMod> {
|
|
328
|
+
const out: Partial<PendingSpellMod> = {};
|
|
329
|
+
for (const r of rows) {
|
|
330
|
+
switch (r.op) {
|
|
331
|
+
case SPELLMOD_CASTING_TIME:
|
|
332
|
+
if (r.type === 'pct') { if (r.value <= -100) out.instant = true; }
|
|
333
|
+
else out.castTimeFlat = (out.castTimeFlat ?? 0) + r.value;
|
|
334
|
+
break;
|
|
335
|
+
case SPELLMOD_COST:
|
|
336
|
+
if (r.type !== 'pct') out.costFlat = (out.costFlat ?? 0) + r.value;
|
|
337
|
+
else if (r.value <= -100) out.freeCost = true;
|
|
338
|
+
else out.costModPct = (out.costModPct ?? 0) + r.value;
|
|
339
|
+
break;
|
|
340
|
+
// A FLAT crit mod is whole percent in the DBC; castCritAdd is a 0..1 fraction.
|
|
341
|
+
case SPELLMOD_CRITICAL_CHANCE:
|
|
342
|
+
out.critAdd = (out.critAdd ?? 0) + r.value / 100;
|
|
343
|
+
break;
|
|
344
|
+
case SPELLMOD_ALL_EFFECTS:
|
|
345
|
+
if (r.type === 'pct') out.effectPct = (out.effectPct ?? 0) + r.value;
|
|
346
|
+
break;
|
|
347
|
+
default: break;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return out;
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// The armed modifier for a charged 107/108 holder. DBC rows win; the scripted `next_cast_mod`
|
|
354
|
+
// effect is the fallback for holders that carry no raw rows.
|
|
355
|
+
export function pendingSpellModFromResolved(spell: SpellDef): PendingSpellMod | null {
|
|
356
|
+
const rows = chargedSpellModsFromSpell(spell);
|
|
357
|
+
const me = spell.effects.find((e) => e.kind === 'next_cast_mod');
|
|
358
|
+
const scripted = me && me.kind === 'next_cast_mod' ? me : null;
|
|
359
|
+
if (!rows.length && !scripted) return null;
|
|
360
|
+
const base: PendingSpellMod = {
|
|
361
|
+
spellId: spell.id,
|
|
362
|
+
name: spell.name,
|
|
363
|
+
appliesTo: scripted?.appliesTo ?? 'any',
|
|
364
|
+
spellFamilyName: spell.spellFamilyName,
|
|
365
|
+
};
|
|
366
|
+
if (rows.length) return { ...base, ...payloadFromRows(rows), rows };
|
|
367
|
+
return {
|
|
368
|
+
...base,
|
|
369
|
+
critAdd: scripted!.critAdd,
|
|
370
|
+
instant: !!scripted!.instant,
|
|
371
|
+
freeCost: !!scripted!.freeCost,
|
|
372
|
+
costModPct: scripted!.costModPct ?? scripted!.costPct,
|
|
373
|
+
effectPct: scripted!.effectPct,
|
|
374
|
+
castTimeFlat: scripted!.castTimeFlat,
|
|
375
|
+
familyFlags: scripted!.familyFlags,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
// An aura that lasts until the next matching cast — a charged add-modifier. Shadow Trance and
|
|
380
|
+
// Netherwind Focus carry one charge in the C++ though the DBC says zero.
|
|
381
|
+
export function isUntilNextCastAuraSpell(spell: SpellDef | undefined | null): boolean {
|
|
382
|
+
if (!spell) return false;
|
|
383
|
+
if (spell.effects.some((e) => e.kind === 'next_cast_mod')) return true;
|
|
384
|
+
if (spellModCharges(spell) <= 0) return false;
|
|
385
|
+
return (spell.rawEffects ?? []).some((r) => {
|
|
386
|
+
const aura = (r.auraName ?? 0) | 0;
|
|
387
|
+
return aura === 107 || aura === 108;
|
|
388
|
+
});
|
|
389
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// Subject extras the rotation evaluator already names. Filled here so pickAction
|
|
2
|
+
// does not grow another copy of "is this unit a caster / in the melee band / dead-rezzable".
|
|
3
|
+
|
|
4
|
+
import { CLASS } from '../../data/schema.ts';
|
|
5
|
+
import { MIN_AGGRO_DISTANCE } from '../../domain/creature/creatureAi.ts';
|
|
6
|
+
import { MELEE_PARK_SLACK_YD, isEnemyCasterKit } from './combatGeometry.ts';
|
|
7
|
+
import type { Fighter } from './types.ts';
|
|
8
|
+
import type { SpellDef } from '../../data/schema.ts';
|
|
9
|
+
import { castableKitIds } from './castableKit.ts';
|
|
10
|
+
import { isPlayerCharacterSide } from '../core/events.ts';
|
|
11
|
+
|
|
12
|
+
/** Contact band, not the 5.5 park knife-edge — ring float + closing mobs still count. */
|
|
13
|
+
export const ROTATION_MELEE_YD = MIN_AGGRO_DISTANCE + MELEE_PARK_SLACK_YD + 2;
|
|
14
|
+
|
|
15
|
+
// Cite: BattleGroundWS.h:54-59 WS_SPELL_WARSONG_FLAG / WS_SPELL_SILVERWING_FLAG.
|
|
16
|
+
const FLAG_AURAS = new Set([23333, 23335]);
|
|
17
|
+
|
|
18
|
+
// Per FIGHTER, not per kit array: the answer also reads maxPower and the seat's reachability filter,
|
|
19
|
+
// so two bodies sharing one kit array can differ. Both inputs are constant for a fighter's lifetime.
|
|
20
|
+
const enemyCasterKitCache = new WeakMap<Fighter, boolean>();
|
|
21
|
+
|
|
22
|
+
export function unitIsCaster(
|
|
23
|
+
u: Fighter,
|
|
24
|
+
/** The session's spell store, so the kit walk below skips what the unit cannot reach. */
|
|
25
|
+
spellOf?: (id: number) => SpellDef | undefined,
|
|
26
|
+
): boolean {
|
|
27
|
+
if (u.spec.rangedAuto) return true;
|
|
28
|
+
if (u.spec.groupRole === 'healer') return true;
|
|
29
|
+
if ((u.spec.standYards ?? 0) > MIN_AGGRO_DISTANCE + 1) return true;
|
|
30
|
+
const cls = u.spec.classId ?? 0;
|
|
31
|
+
if (cls === CLASS.PRIEST || cls === CLASS.MAGE || cls === CLASS.WARLOCK) return true;
|
|
32
|
+
// A player seat is stationed by stand.ts and the yards above already answered for it. The caster-kit
|
|
33
|
+
// test reads a CREATURE kit, and all nine classes train past its bar, so it said true for everyone.
|
|
34
|
+
if (cls !== 0) return false;
|
|
35
|
+
// The same filter placement takes (castableKit.ts): 22 creatures read as casters off a kit
|
|
36
|
+
// spell they cannot reach. Without a store this is unfiltered, which is a fixture's answer.
|
|
37
|
+
const hit = enemyCasterKitCache.get(u);
|
|
38
|
+
if (hit !== undefined) return hit;
|
|
39
|
+
const v = isEnemyCasterKit(u.spec.spells ?? [], {
|
|
40
|
+
maxPower: u.spec.maxPower,
|
|
41
|
+
castable: castableKitIds(u, spellOf),
|
|
42
|
+
});
|
|
43
|
+
enemyCasterKitCache.set(u, v);
|
|
44
|
+
return v;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Cite: SharedDefines.h CLASS_HUNTER = 3. Jeklik Charge bait is a hunter at range. */
|
|
48
|
+
export function unitIsHunter(u: Fighter): boolean {
|
|
49
|
+
return (u.spec.classId ?? 0) === CLASS.HUNTER;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Cite: SharedDefines.h CLASS_WARRIOR = 1 … CLASS_DRUID = 11. A creature carries none, so 0. */
|
|
53
|
+
export function unitClassId(u: Fighter): number {
|
|
54
|
+
return (u.spec.classId ?? 0) | 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function flagAuraId(buffs: ReadonlySet<number>): number | undefined {
|
|
58
|
+
for (const id of buffs) if (FLAG_AURAS.has(id)) return id;
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** No geometry (abstract 1v1) → in the pile. Else planar yards vs park/white band. */
|
|
63
|
+
export function inMeleeBand(dist: number | null, hasGeometry: boolean): boolean {
|
|
64
|
+
if (!hasGeometry) return true;
|
|
65
|
+
return dist != null && dist <= ROTATION_MELEE_YD;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// A corpse a battle rez can land on: down, and a PLAYER seat. One predicate, because three copies
|
|
69
|
+
// tested for a class id, which does not separate a pet — a pet carries the creature's unit class.
|
|
70
|
+
export function isRezzableCorpse(u: Fighter): boolean {
|
|
71
|
+
return !(u.hp > 0) && isPlayerCharacterSide(u.side);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function rezzableDeadCount(units: readonly Fighter[]): number {
|
|
75
|
+
let n = 0;
|
|
76
|
+
for (const u of units) if (isRezzableCorpse(u)) n++;
|
|
77
|
+
return n;
|
|
78
|
+
}
|