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,49 @@
|
|
|
1
|
+
// Which pool a Powers index names on a fighter, since a restore, an energize and a drain all carry
|
|
2
|
+
// EffectMiscValue. Cite: SharedDefines.h Powers; SpellAuras.cpp:4836-4844 PERIODIC_ENERGIZE.
|
|
3
|
+
|
|
4
|
+
import { POWER_MANA, POWER_RAGE, POWER_FOCUS, POWER_ENERGY } from '../spells/effects.ts';
|
|
5
|
+
import type { Fighter } from './types.ts';
|
|
6
|
+
|
|
7
|
+
export { powerTypeName } from '../spells/effects.ts';
|
|
8
|
+
|
|
9
|
+
export function powerOfType(f: Fighter, powerType: number): number {
|
|
10
|
+
if (powerType === POWER_MANA) return f.spec.powerType === 'mana' ? f.power : f.mana;
|
|
11
|
+
if (powerType === POWER_RAGE && f.spec.powerType === 'rage') return f.power;
|
|
12
|
+
if (powerType === POWER_FOCUS && f.spec.powerType === 'focus') return f.power;
|
|
13
|
+
if (powerType === POWER_ENERGY && f.spec.powerType === 'energy') return f.power;
|
|
14
|
+
return 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// 0 here is the C++ `GetMaxPower(power) == 0 → break`: the unit has no such pool, so the tick is a
|
|
18
|
+
// no-op rather than a credit to whatever bar it does have. Cite: SpellAuras.cpp:4838.
|
|
19
|
+
export function maxPowerOfType(f: Fighter, powerType: number): number {
|
|
20
|
+
if (powerType === POWER_MANA) return f.spec.powerType === 'mana' ? f.spec.maxPower : f.maxMana;
|
|
21
|
+
if (powerType === POWER_RAGE && f.spec.powerType === 'rage') return f.spec.maxPower;
|
|
22
|
+
if (powerType === POWER_FOCUS && f.spec.powerType === 'focus') return f.spec.maxPower;
|
|
23
|
+
if (powerType === POWER_ENERGY && f.spec.powerType === 'energy') return f.spec.maxPower;
|
|
24
|
+
return 0;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function setPowerOfType(f: Fighter, powerType: number, value: number): void {
|
|
28
|
+
const v = Math.max(0, Math.trunc(value));
|
|
29
|
+
if (powerType === POWER_MANA) {
|
|
30
|
+
if (f.spec.powerType === 'mana') f.power = Math.min(f.spec.maxPower, v);
|
|
31
|
+
else f.mana = Math.min(f.maxMana, v);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (
|
|
35
|
+
(powerType === POWER_RAGE && f.spec.powerType === 'rage')
|
|
36
|
+
|| (powerType === POWER_FOCUS && f.spec.powerType === 'focus')
|
|
37
|
+
|| (powerType === POWER_ENERGY && f.spec.powerType === 'energy')
|
|
38
|
+
) {
|
|
39
|
+
f.power = Math.min(f.spec.maxPower, v);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function casterPowerTypeId(f: Fighter): number {
|
|
44
|
+
if (f.spec.powerType === 'mana') return POWER_MANA;
|
|
45
|
+
if (f.spec.powerType === 'rage') return POWER_RAGE;
|
|
46
|
+
if (f.spec.powerType === 'focus') return POWER_FOCUS;
|
|
47
|
+
if (f.spec.powerType === 'energy') return POWER_ENERGY;
|
|
48
|
+
return POWER_MANA;
|
|
49
|
+
}
|
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
// Pure spell predicates (Wave 4 S25) — extracted from engine/combat.ts module head.
|
|
2
|
+
|
|
3
|
+
import type { SpellDef, SpellEffect } from '../../data/schema.ts';
|
|
4
|
+
import { PROC_FLAG } from '../spells/procs.ts';
|
|
5
|
+
import { SPELL_DAMAGE_CLASS } from './mitigation.ts';
|
|
6
|
+
import { CAST_FLAG } from '../../domain/creature/creatureAi.ts';
|
|
7
|
+
import {
|
|
8
|
+
passesTargetCreatureType,
|
|
9
|
+
isAbilityIneffectiveOnTarget,
|
|
10
|
+
type ImmunityState,
|
|
11
|
+
} from '../spells/immunity.ts';
|
|
12
|
+
import { roleOf, isSelfTargetedSpell, spellHeals } from './roles.ts';
|
|
13
|
+
import { isHostileSpeedEffect } from './speedAura.ts';
|
|
14
|
+
import { isNefarianClassCallSpell } from '../../domain/scriptdev/classFilter.ts';
|
|
15
|
+
import { hasAttr, hasAttrEx2, SPELL_ATTR, SPELL_ATTR_EX2, spellPiercesSchoolImmunity } from '../spells/spellAttributes.ts';
|
|
16
|
+
|
|
17
|
+
export { isSelfTargetedSpell } from './roles.ts';
|
|
18
|
+
|
|
19
|
+
function memoSpellFlag(fn: (s: SpellDef) => boolean): (s: SpellDef) => boolean {
|
|
20
|
+
const m = new WeakMap<SpellDef, boolean>();
|
|
21
|
+
return (s: SpellDef): boolean => {
|
|
22
|
+
const hit = m.get(s);
|
|
23
|
+
if (hit !== undefined) return hit;
|
|
24
|
+
const v = fn(s);
|
|
25
|
+
m.set(s, v);
|
|
26
|
+
return v;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Divine Intervention: the parent cast is sanctuary plus a trigger and a self instakill, and the
|
|
31
|
+
// protect aura targets a PARTY member. Combat applies it to the friendly, never the foe.
|
|
32
|
+
export const DIVINE_INTERVENTION_IDS = new Set([19752, 19753, 19754]);
|
|
33
|
+
/** Cast shells that trigger the protect aura + self-sacrifice. */
|
|
34
|
+
export const DIVINE_INTERVENTION_CAST_IDS = new Set([19752, 19754]);
|
|
35
|
+
/** Protect aura applied to the party member (cannot act, full school immunity, ~3 min). */
|
|
36
|
+
export const DIVINE_INTERVENTION_PROTECT_ID = 19753;
|
|
37
|
+
/** Tooltip "3 min" → DurationIndex for the DI protect aura. */
|
|
38
|
+
export const DIVINE_INTERVENTION_MS = 180_000;
|
|
39
|
+
|
|
40
|
+
export function isDivineInterventionSpell(s: SpellDef): boolean {
|
|
41
|
+
if (DIVINE_INTERVENTION_IDS.has(s.id | 0)) return true;
|
|
42
|
+
return /^divine intervention$/i.test(s.name ?? '');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function isDivineInterventionCast(s: SpellDef): boolean {
|
|
46
|
+
return DIVINE_INTERVENTION_CAST_IDS.has(s.id | 0) || (isDivineInterventionSpell(s) && (s.id | 0) !== DIVINE_INTERVENTION_PROTECT_ID);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Keep Divine Intervention a friendly buff role. Do not rewrite the parent cast when the raw row
|
|
50
|
+
// already carries its trigger and instakill — only a hostile stun-only shell is rewritten.
|
|
51
|
+
export function normalizeDivineIntervention(spell: SpellDef): SpellDef {
|
|
52
|
+
if (!isDivineInterventionSpell(spell)) return spell;
|
|
53
|
+
const id = spell.id | 0;
|
|
54
|
+
// Protect aura: role buff; combat routes MOD_STUN to the protect target (not the foe).
|
|
55
|
+
if (id === DIVINE_INTERVENTION_PROTECT_ID) {
|
|
56
|
+
if (spell.role === 'buff') return spell;
|
|
57
|
+
return { ...spell, role: 'buff' };
|
|
58
|
+
}
|
|
59
|
+
// Parent cast: preserve trigger_spell / sanctuary / instakill when present.
|
|
60
|
+
const hasTrigger = spell.effects.some(
|
|
61
|
+
(e) => e.kind === 'trigger_spell' && ((e.spellId | 0) === DIVINE_INTERVENTION_PROTECT_ID),
|
|
62
|
+
);
|
|
63
|
+
const hasInstakill = spell.effects.some((e) => e.kind === 'instakill');
|
|
64
|
+
const hasImmunity = spell.effects.some((e) => e.kind === 'school_immunity' || e.kind === 'damage_immunity');
|
|
65
|
+
if (hasTrigger || hasInstakill || hasImmunity) {
|
|
66
|
+
if (spell.role === 'buff') return spell;
|
|
67
|
+
return { ...spell, role: 'buff' };
|
|
68
|
+
}
|
|
69
|
+
// Hostile stun-only shell (legacy wrong mapping) → self immunity + pacify stand-in.
|
|
70
|
+
const onlyHostileStun = spell.effects.length > 0
|
|
71
|
+
&& spell.effects.every((e) => e.kind === 'cc' && e.control === 'stun');
|
|
72
|
+
if (!onlyHostileStun && spell.effects.length > 0) {
|
|
73
|
+
if (spell.role === 'buff') return spell;
|
|
74
|
+
return { ...spell, role: 'buff' };
|
|
75
|
+
}
|
|
76
|
+
return {
|
|
77
|
+
...spell,
|
|
78
|
+
role: 'buff',
|
|
79
|
+
effects: [
|
|
80
|
+
{ kind: 'school_immunity', schoolMask: 1, durationMs: DIVINE_INTERVENTION_MS, positive: true },
|
|
81
|
+
{ kind: 'school_immunity', schoolMask: 126, durationMs: DIVINE_INTERVENTION_MS, positive: true },
|
|
82
|
+
{ kind: 'pacify', durationMs: DIVINE_INTERVENTION_MS },
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Ice Block: the bake historically read its stun as hostile CC and could omit the two school-immunity
|
|
88
|
+
// slots. In 1.12 all three auras target the CASTER — immunity plus a self lockout, not enemy CC.
|
|
89
|
+
export const ICE_BLOCK_IDS = new Set([11958]);
|
|
90
|
+
/** DurationIndex 1 → 10_000ms (same as Divine Shield rank-1 duration). */
|
|
91
|
+
export const ICE_BLOCK_MS = 10_000;
|
|
92
|
+
|
|
93
|
+
export function isIceBlockSpell(s: SpellDef): boolean {
|
|
94
|
+
if (ICE_BLOCK_IDS.has(s.id)) return true;
|
|
95
|
+
return /^ice block$/i.test(s.name ?? '');
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Ensure Ice Block is a beneficial self buff: the school immunities plus a cannot-act lockout. The
|
|
99
|
+
// lockout is silence and pacify, not an enemy stun with its own DR and debuff bar.
|
|
100
|
+
export function normalizeIceBlock(spell: SpellDef): SpellDef {
|
|
101
|
+
if (!isIceBlockSpell(spell)) return spell;
|
|
102
|
+
let dur = ICE_BLOCK_MS;
|
|
103
|
+
for (const e of spell.effects) {
|
|
104
|
+
if (
|
|
105
|
+
(e.kind === 'cc' || e.kind === 'school_immunity' || e.kind === 'pacify')
|
|
106
|
+
&& (e.durationMs | 0) > 0
|
|
107
|
+
) {
|
|
108
|
+
dur = e.durationMs | 0;
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const hasPhys = spell.effects.some((e) => e.kind === 'school_immunity' && e.schoolMask === 1);
|
|
113
|
+
const hasMagic = spell.effects.some((e) => e.kind === 'school_immunity' && e.schoolMask === 126);
|
|
114
|
+
const hasAllSchools = spell.effects.some(
|
|
115
|
+
(e) => e.kind === 'school_immunity' && ((e.schoolMask | 0) & 127) === 127,
|
|
116
|
+
);
|
|
117
|
+
const hasPacify = spell.effects.some((e) => e.kind === 'pacify');
|
|
118
|
+
const hasSilence = spell.effects.some(
|
|
119
|
+
(e) => e.kind === 'cc' && e.control === 'silence',
|
|
120
|
+
);
|
|
121
|
+
const hasStunCc = spell.effects.some((e) => e.kind === 'cc' && e.control === 'stun');
|
|
122
|
+
if (((hasPhys && hasMagic) || hasAllSchools) && hasPacify && hasSilence && !hasStunCc) {
|
|
123
|
+
if (spell.role === 'buff') return spell;
|
|
124
|
+
return { ...spell, role: 'buff' };
|
|
125
|
+
}
|
|
126
|
+
const effects: SpellDef['effects'] = [
|
|
127
|
+
{ kind: 'school_immunity', schoolMask: 1, durationMs: dur, positive: true },
|
|
128
|
+
{ kind: 'school_immunity', schoolMask: 126, durationMs: dur, positive: true },
|
|
129
|
+
{ kind: 'pacify', durationMs: dur },
|
|
130
|
+
{ kind: 'cc', control: 'silence', mechanic: 'silence', durationMs: dur, school: 'frost' },
|
|
131
|
+
];
|
|
132
|
+
return { ...spell, role: 'buff', effects };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** Take-side ProcFlags bits for aura-42 on-hit-taken (Lightning Shield uses damage_shield). */
|
|
136
|
+
export const PROC_FLAGS_TAKE_MELEE =
|
|
137
|
+
PROC_FLAG.TAKE_MELEE_SWING
|
|
138
|
+
| PROC_FLAG.TAKE_MELEE_ABILITY
|
|
139
|
+
| PROC_FLAG.TAKE_ANY_DAMAGE;
|
|
140
|
+
|
|
141
|
+
// Any foe-directed effect, so the spell resolves against the hostile target and the target-side gates
|
|
142
|
+
// apply. Ice Block's self stun is not foe-directed and must not qualify.
|
|
143
|
+
const computeHostileSpellDef = (spell: SpellDef): boolean => {
|
|
144
|
+
if (isIceBlockSpell(spell)) return false;
|
|
145
|
+
// Empty-effects 100yd PBAoE (targetA 22 / targetB 15). Cite: Spell.cpp:8003-8040;
|
|
146
|
+
// boss_nefarian.cpp:63-71; SpellTargetDefines.h:36,46 TARGET_LOCATION_CASTER_SRC + ENEMY_AOE.
|
|
147
|
+
if (isNefarianClassCallSpell(spell.id | 0)) return true;
|
|
148
|
+
// All EffectImplicitTargetA = TARGET_UNIT_CASTER — not foe-directed (Spread 17772/17774).
|
|
149
|
+
// Cite: SpellTargetDefines.h TARGET_UNIT_CASTER=1; boss_jandice_barov.cpp:52-55,91; KI-1017.
|
|
150
|
+
if (isSelfTargetedSpell(spell)) return false;
|
|
151
|
+
// SPELL_ATTR_AURA_IS_DEBUFF (0x04000000) forces an apply-aura spell to be treated as negative/debuff
|
|
152
|
+
// for positivity / school-immunity pierce checks (Unit.cpp IsImmuneToSpell / IsPositiveEffectMask path).
|
|
153
|
+
if (hasAttr(spell, SPELL_ATTR.AURA_IS_DEBUFF)) return true;
|
|
154
|
+
// Feign Death is a self CombatStop, not a foe-directed threat pulse.
|
|
155
|
+
// Cite: Unit.cpp SetFeignDeath :10103 CombatStop; aura 66.
|
|
156
|
+
if (spell.effects.some((e) => e.kind === 'feign_death')) return false;
|
|
157
|
+
// A ranged channel holder bakes only a proc trigger on the parent, with no direct damage row, so it
|
|
158
|
+
// used to miss this gate and companions cast it into their own face while standing down.
|
|
159
|
+
if (
|
|
160
|
+
(spell.rangeMax ?? 0) > 0
|
|
161
|
+
&& spell.effects.some((e) => e.kind === 'proc_trigger_spell')
|
|
162
|
+
&& !spell.effects.some((e) => e.kind === 'damage_shield' || e.kind === 'buff')
|
|
163
|
+
) {
|
|
164
|
+
return true;
|
|
165
|
+
}
|
|
166
|
+
return spell.effects.some(
|
|
167
|
+
(e) => e.kind === 'direct_damage' || e.kind === 'dot' || e.kind === 'persistent_area'
|
|
168
|
+
|| e.kind === 'cc' || e.kind === 'root'
|
|
169
|
+
|| e.kind === 'interrupt_cast' || e.kind === 'trigger_spell'
|
|
170
|
+
// POWER_HAPPINESS (powerType 4) is pet mood (Dismiss Pet), not foe-directed mana drain.
|
|
171
|
+
// Cite: SpellEffects.cpp:1750–1791; SharedDefines.h POWER_HAPPINESS=4.
|
|
172
|
+
|| (e.kind === 'power_drain' && (e.powerType | 0) !== 4)
|
|
173
|
+
|| e.kind === 'power_burn' || e.kind === 'health_leech'
|
|
174
|
+
|| e.kind === 'weapon_percent_damage'
|
|
175
|
+
// SPELL_EFFECT_KNOCK_BACK (98) — foe push (Knock Away, Blast Wave, Geyser). Pure knock rows must stay
|
|
176
|
+
// foe-directed for range / magnet / immunity gates. Cite: SpellEffects.cpp:5113–5121 EffectKnockBack.
|
|
177
|
+
|| e.kind === 'knock_back'
|
|
178
|
+
// Threat pulses / taunt / threat-drop (Distracting Shot, Growl, Feint, Disengage).
|
|
179
|
+
// mod_taunt = SPELL_AURA_MOD_TAUNT hold (Mocking Blow / Challenging Shout aura-only).
|
|
180
|
+
|| e.kind === 'threat' || e.kind === 'taunt' || e.kind === 'mod_taunt'
|
|
181
|
+
|| e.kind === 'modify_threat_pct'
|
|
182
|
+
// A periodic mana leech bakes as restore_power with a negative per-tick amount. An explicit
|
|
183
|
+
// hostile:false is a self maintain cost and is not foe-directed.
|
|
184
|
+
|| (e.kind === 'restore_power' && e.amountPerTick < 0 && e.hostile !== false)
|
|
185
|
+
// A decrease-speed snare's ONLY effect is the speed aura, so without this it was not
|
|
186
|
+
// foe-directed and the engine applied it to the CASTER — a hunter snared himself.
|
|
187
|
+
|| (e.kind === 'speed' && isHostileSpeedEffect(e))
|
|
188
|
+
// SPELL_AURA_MOD_DETECT_RANGE (91) Mind Soothe / Soothe Animal — negative yards on enemy.
|
|
189
|
+
// Cite: SpellAuras.cpp:152; Unit.cpp:11772; KI-796.
|
|
190
|
+
|| (e.kind === 'mod_detect_range' && (e.amount ?? 0) < 0)
|
|
191
|
+
// 529 rows whose ONLY foe-directed effect is the enemy aura: Faerie Fire, Hunter's Mark,
|
|
192
|
+
// every curse, Sunder/Expose Armor. Same test applySpell picks the hostile target with.
|
|
193
|
+
|| (e.kind === 'buff' && isHostileBuffEffect(e, e.amount)),
|
|
194
|
+
);
|
|
195
|
+
};
|
|
196
|
+
export const isHostileSpellDef = memoSpellFlag(computeHostileSpellDef);
|
|
197
|
+
|
|
198
|
+
// Foe-landing effects applySpell dispatches through the late path. They are riders on the cast's one
|
|
199
|
+
// hit result, so a resisted cast must land none — the late branches carry no land roll of their own.
|
|
200
|
+
export const isFoeLandingLateEffect = (eff: SpellEffect): boolean => {
|
|
201
|
+
if (eff.kind === 'speed') return isHostileSpeedEffect(eff);
|
|
202
|
+
if (eff.kind === 'mod_detect_range') return (eff.amount ?? 0) < 0;
|
|
203
|
+
return eff.kind === 'mod_stalked' || eff.kind === 'knock_back' || eff.kind === 'pull_towards';
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
// The range gate: foe-directed casts with a positive rangeMax. It includes weapon strikes, which are
|
|
207
|
+
// not hostile by effect kind but still resolve against the combat target.
|
|
208
|
+
export const spellNeedsRangeGate = (spell: SpellDef): boolean => {
|
|
209
|
+
if (!((spell.rangeMax ?? 0) > 0)) return false;
|
|
210
|
+
if (isHostileSpellDef(spell)) return true;
|
|
211
|
+
if (spell.strikeBonus || spell.onNextSwing) return true;
|
|
212
|
+
const r = spell.role;
|
|
213
|
+
return r === 'strike' || r === 'shoot' || r === 'charge';
|
|
214
|
+
};
|
|
215
|
+
|
|
216
|
+
// Spell.cpp:6162 GetMinMaxRange(strict) returns {0, 100} for a next-melee-swing spell, so the ARM
|
|
217
|
+
// carries no range bound — the reach test belongs to the swing that later carries it.
|
|
218
|
+
export const NEXT_SWING_ARM_RANGE_YD = 100;
|
|
219
|
+
export const spellGateRangeMaxYd = (spell: SpellDef): number | undefined => (
|
|
220
|
+
spell.onNextSwing ? NEXT_SWING_ARM_RANGE_YD : spell.rangeMax
|
|
221
|
+
);
|
|
222
|
+
export const spellGateRangeMinYd = (spell: SpellDef): number | undefined => (
|
|
223
|
+
spell.onNextSwing ? 0 : spell.rangeMin
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
// SpellMgr.h:1418-1420 IsIgnoreLosSpellCast = rangeIndex==13 || IsIgnoreLosSpell
|
|
227
|
+
// SpellMgr.h:1415 IsIgnoreLosSpell returns HasAttribute(SPELL_ATTR_EX2_IGNORE_LINE_OF_SIGHT)
|
|
228
|
+
export const isIgnoreLosSpellCast = (spell: SpellDef): boolean => {
|
|
229
|
+
return spell.rangeIndex === 13 || hasAttrEx2(spell, SPELL_ATTR_EX2.IGNORE_LINE_OF_SIGHT);
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
// CheckCast unit-target LOS. Shoot/Auto Shot/Throw bake empty effects so isHostileSpellDef is
|
|
233
|
+
// false; spellFoeDirectedGeometry still matches them (opaque + role shoot). Cite: Spell.cpp:4742.
|
|
234
|
+
export const spellNeedsLosGate = (spell: SpellDef): boolean => {
|
|
235
|
+
if (isIgnoreLosSpellCast(spell)) return false;
|
|
236
|
+
return (isHostileSpellDef(spell) && spellNeedsRangeGate(spell)) || spellFoeDirectedGeometry(spell);
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// The same CheckCast gate for a cast aimed at ONE chosen ally. A party FAN is excluded, since its
|
|
240
|
+
// audience is enumerated per body rather than chosen. Cite: Spell.cpp:4742 (no friendly exemption).
|
|
241
|
+
/**
|
|
242
|
+
* The spell must be delivered to a FRIENDLY body: not self-only, not hostile, not a fan, and it
|
|
243
|
+
* has a range, so it names another unit. In 1.12 a positive spell whose target the caster cannot
|
|
244
|
+
* assist is refused outright, never landed for nothing. Cite: Spell.cpp:5947-5951 IsPositiveSpell
|
|
245
|
+
* -> CanAssistSpell -> SPELL_FAILED_BAD_TARGETS.
|
|
246
|
+
*/
|
|
247
|
+
export const spellWantsFriendlyTarget = (spell: SpellDef): boolean => {
|
|
248
|
+
if (isSelfTargetedSpell(spell) || isHostileSpellDef(spell) || spell.aoe) return false;
|
|
249
|
+
// A DISPEL is legal on either faction - Tranquilizing Shot, Purge and an offensive Dispel Magic
|
|
250
|
+
// strip an enemy. `EffectDispel` takes whatever `unitTarget` the caster aimed at and checks no
|
|
251
|
+
// faction; only `IsDispellableByMask(dispelMask, m_caster, m_spellInfo)` inside it does.
|
|
252
|
+
// Cite: SpellEffects.cpp:2467 EffectDispel.
|
|
253
|
+
if ((spell.effects ?? []).some((e) => e.kind === 'dispel')) return false;
|
|
254
|
+
return (spell.rangeMax ?? 0) > 0;
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
export const spellNeedsFriendlyLosGate = (spell: SpellDef): boolean => {
|
|
258
|
+
if (isIgnoreLosSpellCast(spell)) return false;
|
|
259
|
+
return spellWantsFriendlyTarget(spell) && spellHeals(spell);
|
|
260
|
+
};
|
|
261
|
+
|
|
262
|
+
// Self-centred or dest-at-caster AoE — Frost Nova, Arcane Explosion, War Stomp, Psychic Scream. These
|
|
263
|
+
// need no living focus, since they fan the hostiles around the caster.
|
|
264
|
+
export const isSelfCenteredAoe = (spell: SpellDef): boolean =>
|
|
265
|
+
!!spell.aoe && !((spell.rangeMax ?? 0) > 0);
|
|
266
|
+
|
|
267
|
+
// Caster-origin hostile AoE (rangeMax 0 disc, or cone). Tail Sweep 15847 is a cone with rangeMax 30 so
|
|
268
|
+
// isSelfCenteredAoe is false; C++ DoCast(nullptr). Cite: boss_onyxia.cpp:162-163.
|
|
269
|
+
export const isCasterOriginAoe = (spell: SpellDef): boolean =>
|
|
270
|
+
isSelfCenteredAoe(spell) || (!!spell.aoe && spell.aoeShape === 'cone');
|
|
271
|
+
|
|
272
|
+
// Offensive kit aimed at the current foe. A weapon strike with empty effects is not hostile by effect
|
|
273
|
+
// kind but still resolves against the target, which is how a Heroic Strike meets a protection blessing.
|
|
274
|
+
export const isFoeDirectedOffense = memoSpellFlag((spell: SpellDef): boolean => {
|
|
275
|
+
if (isSelfCenteredAoe(spell)) return false;
|
|
276
|
+
if (isHostileSpellDef(spell)) return true;
|
|
277
|
+
if (spell.strikeBonus || spell.onNextSwing) return true;
|
|
278
|
+
const r = roleOf(spell);
|
|
279
|
+
return r === 'strike' || r === 'nuke' || r === 'instant_nuke' || r === 'dot'
|
|
280
|
+
|| r === 'shoot' || r === 'charge' || r === 'judgement';
|
|
281
|
+
});
|
|
282
|
+
|
|
283
|
+
// The auto-rotation skip: the focus will be immune to this ability. Unit-targeted offense always, and
|
|
284
|
+
// a self-AoE only in 1v1 — a pack nova can still hit somebody else.
|
|
285
|
+
export const focusImmunityBlocksSpell = (
|
|
286
|
+
spell: SpellDef,
|
|
287
|
+
focus: {
|
|
288
|
+
immunity: ImmunityState;
|
|
289
|
+
spec: { schoolImmuneMask?: number; mechanicImmuneMask?: number; creatureType?: number };
|
|
290
|
+
creatureType?: number;
|
|
291
|
+
},
|
|
292
|
+
livingHostiles: number,
|
|
293
|
+
): boolean => {
|
|
294
|
+
const template = {
|
|
295
|
+
schoolImmuneMask: focus.spec.schoolImmuneMask,
|
|
296
|
+
mechanicImmuneMask: focus.spec.mechanicImmuneMask,
|
|
297
|
+
creatureType: focus.spec.creatureType ?? focus.creatureType,
|
|
298
|
+
};
|
|
299
|
+
// CheckCast is the gate the 156 pierce carriers actually meet first: without this a warded
|
|
300
|
+
// target refuses the cast outright and applySpell never runs. Cite: SpellMgr.h:1304.
|
|
301
|
+
if (!isAbilityIneffectiveOnTarget(
|
|
302
|
+
focus.immunity, spell, template, spellPiercesSchoolImmunity(spell),
|
|
303
|
+
)) return false;
|
|
304
|
+
if (isFoeDirectedOffense(spell)) return true;
|
|
305
|
+
return isSelfCenteredAoe(spell) && isHostileSpellDef(spell) && livingHostiles <= 1;
|
|
306
|
+
};
|
|
307
|
+
|
|
308
|
+
// Foe-directed casts the effect-based test cannot see: engine-scripted specials with empty resolved
|
|
309
|
+
// effects, and the scripted kinds. A raw shape test only, so friendly opaque rows match it too.
|
|
310
|
+
export const spellFoeDirectedOpaque = (spell: SpellDef): boolean => {
|
|
311
|
+
if (!((spell.rangeMax ?? 0) > 0)) return false;
|
|
312
|
+
if ((spell.effects?.length ?? 0) === 0) return true;
|
|
313
|
+
return spell.effects.some((e) => e.kind === 'judgement' || e.kind === 'holy_shock');
|
|
314
|
+
};
|
|
315
|
+
|
|
316
|
+
// The geometry gate for foe-directed casts the range test misses. Judgement and Holy Shock matched
|
|
317
|
+
// NOTHING — no range limit and no line of sight — so they landed across 490 yd and through walls.
|
|
318
|
+
export const spellFoeDirectedGeometry = (spell: SpellDef): boolean => {
|
|
319
|
+
if (!spellFoeDirectedOpaque(spell)) return false;
|
|
320
|
+
if (isHostileSpellDef(spell)) return true;
|
|
321
|
+
const r = roleOf(spell);
|
|
322
|
+
return r === 'nuke' || r === 'instant_nuke' || r === 'dot' || r === 'shoot'
|
|
323
|
+
|| r === 'strike' || r === 'charge' || r === 'judgement';
|
|
324
|
+
};
|
|
325
|
+
|
|
326
|
+
// The Classic total target cap, including the primary: the baked maxTargets, else the largest chain
|
|
327
|
+
// count across the fanned effects. Null is uncapped, and a default is never invented.
|
|
328
|
+
export const aoeTotalTargetCap = (spell: SpellDef): number | null => {
|
|
329
|
+
if (spell.maxTargets != null && spell.maxTargets > 0) return spell.maxTargets;
|
|
330
|
+
let chain = 0;
|
|
331
|
+
if (spell.rawEffects) {
|
|
332
|
+
for (const re of spell.rawEffects) {
|
|
333
|
+
if (re.chainTargets > chain) chain = re.chainTargets;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
if (chain > 0) return chain;
|
|
337
|
+
return null;
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
// The on-next-swing fan cap, the Cleave shape: an explicit cap when baked, else 2 for an aoe row with
|
|
341
|
+
// none. Null means no fan at all, which is Heroic Strike.
|
|
342
|
+
export const nextSwingFanCap = (spell: SpellDef): number | null => {
|
|
343
|
+
if (spell.maxTargets != null && spell.maxTargets > 1) return spell.maxTargets;
|
|
344
|
+
if (spell.aoe) {
|
|
345
|
+
const cap = aoeTotalTargetCap(spell);
|
|
346
|
+
// aoe next-swing without baked cap → Classic Cleave total 2 (primary + 1).
|
|
347
|
+
return cap ?? 2;
|
|
348
|
+
}
|
|
349
|
+
let chain = 0;
|
|
350
|
+
if (spell.rawEffects) {
|
|
351
|
+
for (const re of spell.rawEffects) {
|
|
352
|
+
if (re.chainTargets > chain) chain = re.chainTargets;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (chain > 1) return chain;
|
|
356
|
+
return null;
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
// The radius used when fanning an on-next-swing strike. Cleave bakes a chain count but often no
|
|
360
|
+
// radius, so without a yard gate a geometry session hit any living secondary on the side.
|
|
361
|
+
export const nextSwingFanRadiusYd = (spell: SpellDef, meleeReachYd = 5): number => {
|
|
362
|
+
if (spell.radiusYd != null && spell.radiusYd > 0) return spell.radiusYd;
|
|
363
|
+
if (spell.rangeMax != null && spell.rangeMax > 0) return spell.rangeMax;
|
|
364
|
+
return meleeReachYd;
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
// The minimum yards for a unit's ranged auto, from the highest positive minimum among its shoot-role
|
|
368
|
+
// spells. Memoized per kit array: the scan ran from the motion phase and cost 2.6% of a tick.
|
|
369
|
+
const shootMinByKit = new WeakMap<readonly SpellDef[], { len: number; min: number }>();
|
|
370
|
+
export const rangedAutoMinYards = (f: {
|
|
371
|
+
spec: { spells?: readonly SpellDef[]; ranged?: unknown; rangedWeaponSubclass?: number };
|
|
372
|
+
}): number => {
|
|
373
|
+
const spells = f.spec.spells;
|
|
374
|
+
let min = 0;
|
|
375
|
+
if (spells) {
|
|
376
|
+
const hit = shootMinByKit.get(spells);
|
|
377
|
+
if (hit !== undefined && hit.len === spells.length) {
|
|
378
|
+
min = hit.min;
|
|
379
|
+
} else {
|
|
380
|
+
for (const s of spells) {
|
|
381
|
+
if (s.role !== 'shoot') continue;
|
|
382
|
+
const rm = s.rangeMin ?? 0;
|
|
383
|
+
if (rm > min) min = rm;
|
|
384
|
+
}
|
|
385
|
+
shootMinByKit.set(spells, { len: spells.length, min });
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
if (min > 0) return min;
|
|
389
|
+
// Wand Shoot has NO min range (SpellRange 5019 min 0) — the invented floor below gave
|
|
390
|
+
// every wand caster a phantom dead zone and a permanent 1v1 backpedal (motion soft-kite).
|
|
391
|
+
if (f.spec.rangedWeaponSubclass === 19) return 0; // ITEM_SUBCLASS_WEAPON_WAND
|
|
392
|
+
// Equipped bow/gun/throw without stamped min — Classic dead zone floor.
|
|
393
|
+
if (f.spec.ranged) return 5;
|
|
394
|
+
return 0;
|
|
395
|
+
};
|
|
396
|
+
|
|
397
|
+
/** Deterministic side id order: enemy < enemy_1 < …; ally_0 < ally_1; player/pet/others by name. */
|
|
398
|
+
export const sideIdSortKey = (side: string): string => {
|
|
399
|
+
if (side === 'enemy') return 'enemy_0';
|
|
400
|
+
if (side === 'player') return '0_player';
|
|
401
|
+
if (side === 'pet') return '0_pet';
|
|
402
|
+
return side;
|
|
403
|
+
};
|
|
404
|
+
|
|
405
|
+
// CheckTargetCreatureType — the whole-spell valid-target gate driven by the baked type mask, so Scare
|
|
406
|
+
// Beast wants a beast and Banish a demon. An absent or zero mask is unrestricted.
|
|
407
|
+
export const spellTargetTypeAllowed = (spell: SpellDef, creatureType: number): boolean => {
|
|
408
|
+
return passesTargetCreatureType(spell.targetCreatureTypeMask ?? 0, creatureType);
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// Warlock Drain Soul rank 1, the trainer-taught id, kept for autopilot farm suppression rather than
|
|
412
|
+
// shard membership — that reads the baked grant flag. Do not use the reqLevel-1 twin.
|
|
413
|
+
export const DRAIN_SOUL_ID = 1120;
|
|
414
|
+
|
|
415
|
+
// True when a spell grants a Soul Shard on kill (Wave D `grantsSoulShardOnKill`). Prefer the baked flag;
|
|
416
|
+
// name fallback only for twin Drain Soul ids that may lack the flag.
|
|
417
|
+
export const isDrainSoulSpell = (
|
|
418
|
+
spell: { grantsSoulShardOnKill?: boolean; name?: string } | null | undefined,
|
|
419
|
+
): boolean => {
|
|
420
|
+
if (!spell) return false;
|
|
421
|
+
if (spell.grantsSoulShardOnKill === true) return true;
|
|
422
|
+
// Twin bake ids (7662 family) historically lacked EffectItemType → flag; name is last resort.
|
|
423
|
+
return spell.name === 'Drain Soul';
|
|
424
|
+
};
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
// Talent and gear proc payloads that bake as free castables and must never be player-cast: a pure
|
|
428
|
+
// combo-point grant and a pure free energize. Real builders cost energy or rage and a GCD.
|
|
429
|
+
export function isNonCastableTalentProc(spell: SpellDef): boolean {
|
|
430
|
+
if (spell.passive) return true;
|
|
431
|
+
if ((spell.cost ?? 0) > 0 || spell.costPct) return false;
|
|
432
|
+
if (((spell.cooldownMs ?? 0) | 0) > 0 || spell.requiresStealth) return false;
|
|
433
|
+
if (((spell.gcdMs ?? 0) | 0) > 0 || ((spell.castTimeMs ?? 0) | 0) > 0) return false;
|
|
434
|
+
if (spell.effects.length === 0) return false;
|
|
435
|
+
// Free CP grant (Ruthlessness companion) — not a builder/finisher.
|
|
436
|
+
if (
|
|
437
|
+
(spell.comboPointsGenerated ?? 0) > 0
|
|
438
|
+
&& !spell.requiresComboPoints
|
|
439
|
+
&& spell.effects.every((e) => e.kind === 'combo_points')
|
|
440
|
+
) {
|
|
441
|
+
return true;
|
|
442
|
+
}
|
|
443
|
+
// Free pure energize (Relentless Strikes Effect / Unbridled Wrath / set-bonus payloads).
|
|
444
|
+
return spell.effects.every((e) => e.kind === 'energize');
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Whether a buff effect applies to the spell's hostile target rather than the caster. Prefer the baked
|
|
448
|
+
// hostile flag from the implicit target; a negative amount is the legacy fallback.
|
|
449
|
+
export function isHostileBuffEffect(
|
|
450
|
+
eff: { hostile?: boolean; amount?: number },
|
|
451
|
+
amount: number,
|
|
452
|
+
): boolean {
|
|
453
|
+
if (eff.hostile === true) return true;
|
|
454
|
+
if (eff.hostile === false) return false;
|
|
455
|
+
return amount < 0;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// A periodic damage that sits on the CASTER, like Hellfire's self cost. Prefer the resolved flag, and
|
|
459
|
+
// fall back to the raw rows when every periodic slot names the caster.
|
|
460
|
+
export function isSelfTargetedDot(
|
|
461
|
+
spell: SpellDef,
|
|
462
|
+
eff: { kind?: string; hostile?: boolean },
|
|
463
|
+
): boolean {
|
|
464
|
+
if (eff.kind != null && eff.kind !== 'dot') return false;
|
|
465
|
+
if (eff.hostile === false) return true;
|
|
466
|
+
if (eff.hostile === true) return false;
|
|
467
|
+
const rows = spell.rawEffects?.filter((r) => (r.auraName | 0) === 3) ?? [];
|
|
468
|
+
if (rows.length === 0) return false;
|
|
469
|
+
return rows.every((r) => (r.targetA | 0) === 1);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
// Whether a gear-proc apply spell should target the hit foe rather than the wielder: damage, DoTs and
|
|
473
|
+
// CC, plus a hostile aura. A beneficial self proc stays on the attacker.
|
|
474
|
+
export function gearProcIsOffensive(spell: SpellDef): boolean {
|
|
475
|
+
return spell.effects.some((e) => {
|
|
476
|
+
if (e.kind === 'direct_damage' || e.kind === 'dot' || e.kind === 'cc') return true;
|
|
477
|
+
if (e.kind === 'buff') return isHostileBuffEffect(e, e.amount);
|
|
478
|
+
return false;
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// A ranged auto attack — free, instant and off the GCD. Multi-Shot and Aimed Shot also bake the
|
|
483
|
+
// shoot role but cost mana and take a GCD, so they are real casts and not autos.
|
|
484
|
+
export function isRangedAutoSpell(spell: SpellDef): boolean {
|
|
485
|
+
if (roleOf(spell) !== 'shoot') return false;
|
|
486
|
+
if ((spell.cost ?? 0) > 0) return false;
|
|
487
|
+
if ((spell.castTimeMs ?? 0) > 0) return false;
|
|
488
|
+
if ((spell.gcdMs ?? 0) > 0) return false;
|
|
489
|
+
return true;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// A pure auto-repeat toggle — Auto Shot and Shoot (wands). Throw is a ranged auto but NOT auto-repeat.
|
|
493
|
+
export function isRangedAutoRepeatToggle(spell: SpellDef): boolean {
|
|
494
|
+
if (roleOf(spell) !== 'shoot') return false;
|
|
495
|
+
return hasAttr(spell, SPELL_ATTR.USES_RANGED_SLOT) && hasAttrEx2(spell, SPELL_ATTR_EX2.AUTO_REPEAT);
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// Auto Shot 75 / Shoot 5019 / Throw 2764 — the kit toggle whose SpellEntry.speed the white
|
|
499
|
+
// ranged swing uses for missile travel. Cite: Spell.cpp GetSpellSpeed; IsAutoRepeatRangedSpell.
|
|
500
|
+
const AUTO_SHOT_ID = 75;
|
|
501
|
+
const WAND_SHOOT_ID = 5019;
|
|
502
|
+
const THROW_ID = 2764;
|
|
503
|
+
|
|
504
|
+
export function rangedAutoSpellOf(f: { spec: { spells?: readonly SpellDef[]; rangedWeaponSubclass?: number } }): SpellDef | null {
|
|
505
|
+
const sub = f.spec.rangedWeaponSubclass;
|
|
506
|
+
const prefer = sub === 19 ? WAND_SHOOT_ID : sub === 16 ? THROW_ID : AUTO_SHOT_ID;
|
|
507
|
+
let fallback: SpellDef | null = null;
|
|
508
|
+
for (const s of f.spec.spells ?? []) {
|
|
509
|
+
if (!isRangedAutoSpell(s)) continue;
|
|
510
|
+
if (s.id === prefer) return s;
|
|
511
|
+
if (!fallback) fallback = s;
|
|
512
|
+
}
|
|
513
|
+
return fallback;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
// A creature's ranged auto: physical direct damage at ranged damage class with no cast time. It must
|
|
517
|
+
// not stack with a white melee swing in the same window.
|
|
518
|
+
export function isCreatureRangedAuto(spell: SpellDef): boolean {
|
|
519
|
+
if (isRangedAutoSpell(spell)) return true;
|
|
520
|
+
// Paid/cast-time shoot-role shots (Multi/Aimed) are abilities, not creature auto.
|
|
521
|
+
if ((spell.dmgClass ?? -1) === SPELL_DAMAGE_CLASS.RANGED) return true;
|
|
522
|
+
if ((spell.castTimeMs ?? 0) > 0) return false;
|
|
523
|
+
// Instant physical direct damage with 5+ yard range is typically NPC Shoot.
|
|
524
|
+
const hasPhysDirect = spell.effects.some(
|
|
525
|
+
(e) => e.kind === 'direct_damage' && e.school === 'physical',
|
|
526
|
+
);
|
|
527
|
+
return hasPhysDirect && (spell.rangeMax ?? 0) >= 5 && (spell.gcdMs ?? 0) === 0;
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
/** MAIN_SPELL flag or Shoot-like filler — exclusive with white melee that window. */
|
|
531
|
+
export function isCreatureRangedMainAttack(spell: SpellDef, castFlags: number): boolean {
|
|
532
|
+
if ((castFlags & CAST_FLAG.MAIN_SPELL) !== 0) return true;
|
|
533
|
+
return isCreatureRangedAuto(spell);
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
// Same-side multi-unit constants + chain fan re-exports (createSession stays under ceiling).
|
|
537
|
+
export { applyFriendlyFan, wantsFriendlyFan, isFriendlyFannedEffect, FRIENDLY_MULTI_TARGETS } from './friendlyFan.ts';
|
|
538
|
+
export { wantsChainFan, applyChainFan, chainJumpMultiplier } from './chainFan.ts';
|