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,169 @@
|
|
|
1
|
+
import type { SpellDef } from '../../data/schema.ts';
|
|
2
|
+
|
|
3
|
+
export interface SpellBook {
|
|
4
|
+
known: number[];
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** Minimal lookup used when resolving LEARN_SPELL stubs → castable taught abilities. */
|
|
8
|
+
export type SpellLookup = { spell(id: number): SpellDef | undefined };
|
|
9
|
+
|
|
10
|
+
export function emptySpellBook(): SpellBook {
|
|
11
|
+
return { known: [] };
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function knows(sb: SpellBook, id: number): boolean {
|
|
15
|
+
return sb.known.includes(id);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// True when `teaches` points at a triggered payload rather than a LEARN_SPELL target. Following
|
|
19
|
+
// one grants the orphan proc instead of the castable ability (KI-254 Charge Stun and friends).
|
|
20
|
+
export function isTriggerPayloadTeaches(parent: SpellDef, taughtId: number, ds: SpellLookup): boolean {
|
|
21
|
+
if ((parent.effects ?? []).some((e) => e.kind === 'trigger_spell' && e.spellId === taughtId)) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
const taught = ds.spell(taughtId);
|
|
25
|
+
if (!taught) return false;
|
|
26
|
+
const taughtInert =
|
|
27
|
+
(taught.cost ?? 0) === 0
|
|
28
|
+
&& (taught.gcdMs ?? 0) === 0
|
|
29
|
+
&& (taught.cooldownMs ?? 0) === 0
|
|
30
|
+
&& (taught.castTimeMs ?? 0) === 0
|
|
31
|
+
&& !(taught.costPct && taught.costPct > 0)
|
|
32
|
+
&& !(taught.rageGenerated && taught.rageGenerated > 0);
|
|
33
|
+
const parentHasEconomy =
|
|
34
|
+
(parent.cost ?? 0) > 0
|
|
35
|
+
|| (parent.gcdMs ?? 0) > 0
|
|
36
|
+
|| (parent.cooldownMs ?? 0) > 0
|
|
37
|
+
|| (parent.castTimeMs ?? 0) > 0
|
|
38
|
+
|| (parent.costPct != null && parent.costPct > 0)
|
|
39
|
+
|| (parent.rageGenerated != null && parent.rageGenerated > 0);
|
|
40
|
+
return taughtInert && parentHasEconomy;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// True when `childId` is a trigger_spell or proc companion of `parent`. The bake sometimes stamps
|
|
44
|
+
// `teaches` at those, and that is not a LEARN stub — it must not rewrite the castable parent away.
|
|
45
|
+
function isTriggerCompanionOf(parent: SpellDef, childId: number): boolean {
|
|
46
|
+
return (parent.effects ?? []).some(
|
|
47
|
+
(e) =>
|
|
48
|
+
(e.kind === 'trigger_spell' && e.spellId === childId)
|
|
49
|
+
|| (e.kind === 'proc_trigger_spell' && e.triggerSpellId === childId),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Resolve a spell id for learning or casting: LEARN_SPELL (36) and LEARN_PET_SPELL (57) stubs keep
|
|
54
|
+
// the castable on `teaches`. Multi-slot stubs need learnGrantIds; `teaches` is a single stamp.
|
|
55
|
+
export function resolveSpellId(id: number, ds: SpellLookup): number {
|
|
56
|
+
let cur = id;
|
|
57
|
+
for (let n = 0; n < 4; n++) {
|
|
58
|
+
const sp = ds.spell(cur);
|
|
59
|
+
if (!sp) break;
|
|
60
|
+
const stamped = sp.teaches ?? 0;
|
|
61
|
+
const next = stamped > 0 ? stamped : learnTriggerFromRaw(sp);
|
|
62
|
+
if (next == null || next === cur) break;
|
|
63
|
+
if (isTriggerPayloadTeaches(sp, next, ds) || isTriggerCompanionOf(sp, next)) break;
|
|
64
|
+
cur = next;
|
|
65
|
+
}
|
|
66
|
+
return cur;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** SPELL_EFFECT_LEARN_SPELL — SharedDefines / SpellEffectDefines.h. */
|
|
70
|
+
export const SPELL_EFFECT_LEARN_SPELL = 36;
|
|
71
|
+
// SPELL_EFFECT_LEARN_PET_SPELL. Same EffectTriggerSpell hop as LEARN_SPELL — the stub is not the
|
|
72
|
+
// castable rank. Cite: SpellEffects.cpp:3386–3404 EffectLearnPetSpell; pin de8f729.
|
|
73
|
+
export const SPELL_EFFECT_LEARN_PET_SPELL = 57;
|
|
74
|
+
|
|
75
|
+
/** True when this raw slot is a learn stub (player 36 or pet 57). */
|
|
76
|
+
function isLearnStubEffect(effect: number): boolean {
|
|
77
|
+
return effect === SPELL_EFFECT_LEARN_SPELL || effect === SPELL_EFFECT_LEARN_PET_SPELL;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Last LEARN_SPELL / LEARN_PET_SPELL EffectTriggerSpell on the row. The bake stamps `teaches` for
|
|
81
|
+
// effect 36 only, so pet rank stubs need this hop at runtime: Firebolt 7886 → 3110, no re-bake.
|
|
82
|
+
export function learnTriggerFromRaw(sp: SpellDef): number | undefined {
|
|
83
|
+
let taught = 0;
|
|
84
|
+
for (const r of sp.rawEffects ?? []) {
|
|
85
|
+
if (!isLearnStubEffect(Number(r.effect) | 0)) continue;
|
|
86
|
+
const t = Number(r.triggerSpell) | 0;
|
|
87
|
+
if (t > 0) taught = t;
|
|
88
|
+
}
|
|
89
|
+
return taught > 0 ? taught : undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Stamp `teaches` from a LEARN_PET_SPELL (57) trigger when the bake left it empty. Effect 36
|
|
93
|
+
// already has it from spell.chain. Cite: SpellEffects.cpp:3386–3404; spell-chain-port.mjs.
|
|
94
|
+
export function withPetLearnTeachesIfEmpty(spell: SpellDef): SpellDef {
|
|
95
|
+
if ((spell.teaches ?? 0) > 0) return spell;
|
|
96
|
+
const taught = learnTriggerFromRaw(spell);
|
|
97
|
+
if (!taught) return spell;
|
|
98
|
+
return { ...spell, teaches: taught };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Every castable spell id a LEARN_SPELL / LEARN_PET_SPELL row grants. Multi-slot stubs teach
|
|
102
|
+
// several (Path of Defense 8121 → 71 + 7386 + 355), so read rawEffects 36/57, not `teaches`.
|
|
103
|
+
export function learnGrantIds(id: number, ds: SpellLookup): number[] {
|
|
104
|
+
const sp = ds.spell(id);
|
|
105
|
+
if (!sp) return [id];
|
|
106
|
+
const triggers = (sp.rawEffects ?? [])
|
|
107
|
+
.filter((r) => isLearnStubEffect(Number(r.effect) | 0) && (Number(r.triggerSpell) | 0) > 0)
|
|
108
|
+
.map((r) => Number(r.triggerSpell) | 0);
|
|
109
|
+
if (triggers.length > 0) {
|
|
110
|
+
const out: number[] = [];
|
|
111
|
+
for (const t of triggers) {
|
|
112
|
+
// Nested LEARN stubs on a trigger are rare; one resolve hop. Does not follow
|
|
113
|
+
// trigger_spell companions (Charge Stun) — those are not effect-36 targets.
|
|
114
|
+
const g = resolveSpellId(t, ds);
|
|
115
|
+
if (!out.includes(g)) out.push(g);
|
|
116
|
+
}
|
|
117
|
+
return out;
|
|
118
|
+
}
|
|
119
|
+
// No raw LEARN slots: single `teaches` hop (fixtures / older rows without rawEffects).
|
|
120
|
+
return [resolveSpellId(id, ds)];
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function learn(sb: SpellBook, id: number): SpellBook {
|
|
124
|
+
if (sb.known.includes(id)) return sb;
|
|
125
|
+
return { known: [...sb.known, id] };
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** Drop a known spell id (profession specialization unlearn, rank migration, etc.). */
|
|
129
|
+
export function forget(sb: SpellBook, id: number): SpellBook {
|
|
130
|
+
if (!sb.known.includes(id)) return sb;
|
|
131
|
+
return { known: sb.known.filter((x) => x !== id) };
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Learn `id`, resolving LEARN stubs to every castable taught ability (multi-slot aware). Cite:
|
|
135
|
+
// SpellEffects.cpp:2445–2465; learnGrantIds.
|
|
136
|
+
export function learnResolved(sb: SpellBook, id: number, ds: SpellLookup): SpellBook {
|
|
137
|
+
let next = sb;
|
|
138
|
+
for (const g of learnGrantIds(id, ds)) next = learn(next, g);
|
|
139
|
+
return next;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Replace any LEARN stub ids in the spellbook with their taught castables, expanding multi-slot
|
|
143
|
+
// stubs. Idempotent. Also returns the stub→taught pairs so callers rewrite bars and rotations.
|
|
144
|
+
export function migrateLearnStubs(
|
|
145
|
+
sb: SpellBook,
|
|
146
|
+
ds: SpellLookup,
|
|
147
|
+
): { spellbook: SpellBook; replacements: Array<{ from: number; to: number }> } {
|
|
148
|
+
const replacements: Array<{ from: number; to: number }> = [];
|
|
149
|
+
const next: number[] = [];
|
|
150
|
+
const seen = new Set<number>();
|
|
151
|
+
for (const id of sb.known) {
|
|
152
|
+
const grants = learnGrantIds(id, ds);
|
|
153
|
+
if (grants.length === 1 && grants[0] === id) {
|
|
154
|
+
if (!seen.has(id)) {
|
|
155
|
+
seen.add(id);
|
|
156
|
+
next.push(id);
|
|
157
|
+
}
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
for (const g of grants) {
|
|
161
|
+
if (g !== id) replacements.push({ from: id, to: g });
|
|
162
|
+
if (seen.has(g)) continue;
|
|
163
|
+
seen.add(g);
|
|
164
|
+
next.push(g);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (!replacements.length) return { spellbook: sb, replacements };
|
|
168
|
+
return { spellbook: { known: next }, replacements };
|
|
169
|
+
}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
// Stance bar and primary action-bar paging for Classic shapeshift and stance forms, off
|
|
2
|
+
// SpellShapeshiftForm.dbc BonusActionBar. Pure serializable helpers — the UI casts the real path.
|
|
3
|
+
|
|
4
|
+
import type { SpellDef } from '../../data/schema.ts';
|
|
5
|
+
import { CLASS, SHAPESHIFT_FORM } from '../../data/schema.ts';
|
|
6
|
+
import {
|
|
7
|
+
emptyItems,
|
|
8
|
+
emptyMacros,
|
|
9
|
+
emptyOutfits,
|
|
10
|
+
SLOTS_PER_BAR,
|
|
11
|
+
type ActionBar,
|
|
12
|
+
} from './actionbar.ts';
|
|
13
|
+
import { isMacroId } from '../macro/types.ts';
|
|
14
|
+
import { formIdFromSpell, isFormSpell } from './forms.ts';
|
|
15
|
+
import { SPELL_ATTR_EX2, hasAttrEx2 } from '../../engine/spells/spellAttributes.ts';
|
|
16
|
+
|
|
17
|
+
/** Classic BonusActionBar index for the primary (main) action bar. 0 = no swap / default. */
|
|
18
|
+
export type PrimaryBarPageId = 0 | 1 | 2 | 3;
|
|
19
|
+
|
|
20
|
+
/** Content of one primary-bar page (keys stay on actionBars[0] across pages). */
|
|
21
|
+
export interface PrimaryBarPageLayout {
|
|
22
|
+
slots: (number | null)[];
|
|
23
|
+
items: (number | null)[];
|
|
24
|
+
/** Macro ids per slot. Absent on pre-macro saves — normalizePrimaryPages backfills nulls. */
|
|
25
|
+
macros?: (string | null)[];
|
|
26
|
+
outfits?: (string | null)[];
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Optional map of primary pages keyed by page id string ("0"…"3"). */
|
|
30
|
+
export type PrimaryBarPages = Partial<Record<string, PrimaryBarPageLayout>>;
|
|
31
|
+
|
|
32
|
+
/** One button on the stance / shapeshift bar. */
|
|
33
|
+
export interface StanceBarSlot {
|
|
34
|
+
spellId: number;
|
|
35
|
+
formId: number;
|
|
36
|
+
name: string;
|
|
37
|
+
icon?: string;
|
|
38
|
+
/** Classic SetChecked — true while this form/stance is active. */
|
|
39
|
+
active: boolean;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Canonical form-enter spell ids per class in stance-bar order; only KNOWN ids become slots.
|
|
43
|
+
// Ghost Wolf 2645 is a normal action-bar spell (BonusActionBar 0), not a stance strip entry.
|
|
44
|
+
export const CLASS_STANCE_SPELLS: Readonly<Record<number, readonly number[]>> = {
|
|
45
|
+
[CLASS.WARRIOR]: [2457, 71, 2458], // Battle, Defensive, Berserker
|
|
46
|
+
// Bear, Aquatic, Cat, Travel, Moonkin, Dire Bear — common Classic strip order
|
|
47
|
+
[CLASS.DRUID]: [5487, 1066, 768, 783, 24858, 9634],
|
|
48
|
+
[CLASS.ROGUE]: [1784], // Stealth
|
|
49
|
+
[CLASS.PRIEST]: [15473], // Shadowform
|
|
50
|
+
// Shaman: no stance bar. Ghost Wolf is cast from the main action bar like any other spell.
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Primary action-bar page for the active form, from SpellShapeshiftForm.BonusActionBar only.
|
|
54
|
+
// Shadowform, Moonkin, Travel, Aquatic and Ghost Wolf stay on the default main bar.
|
|
55
|
+
export function primaryBarPageForForm(form: number): PrimaryBarPageId {
|
|
56
|
+
const f = form | 0;
|
|
57
|
+
switch (f) {
|
|
58
|
+
case SHAPESHIFT_FORM.CAT:
|
|
59
|
+
case SHAPESHIFT_FORM.BATTLESTANCE:
|
|
60
|
+
case SHAPESHIFT_FORM.STEALTH:
|
|
61
|
+
return 1;
|
|
62
|
+
case SHAPESHIFT_FORM.DEFENSIVESTANCE:
|
|
63
|
+
return 2;
|
|
64
|
+
case SHAPESHIFT_FORM.BEAR:
|
|
65
|
+
case SHAPESHIFT_FORM.DIREBEAR:
|
|
66
|
+
case SHAPESHIFT_FORM.BERSERKERSTANCE:
|
|
67
|
+
return 3;
|
|
68
|
+
default:
|
|
69
|
+
// BonusActionBar=0: humanoid, Travel, Aquatic, Ghost Wolf, Shadowform, Moonkin, …
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** True when this form replaces the main action bar page (BonusActionBar != 0). */
|
|
75
|
+
export function formPagesPrimaryBar(form: number): boolean {
|
|
76
|
+
return primaryBarPageForForm(form) !== 0;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function emptyLayout(): PrimaryBarPageLayout {
|
|
80
|
+
return {
|
|
81
|
+
slots: Array(SLOTS_PER_BAR).fill(null),
|
|
82
|
+
items: emptyItems(),
|
|
83
|
+
macros: emptyMacros(),
|
|
84
|
+
outfits: emptyOutfits(),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Macro ids of a layout / bar, normalized to exactly SLOTS_PER_BAR entries. */
|
|
89
|
+
function macroRow(src: { macros?: (string | null)[] } | undefined): (string | null)[] {
|
|
90
|
+
return Array.from({ length: SLOTS_PER_BAR }, (_, i) => (isMacroId(src?.macros?.[i]) ? src!.macros![i]! : null));
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function outfitRow(src: { outfits?: (string | null)[] } | undefined): (string | null)[] {
|
|
94
|
+
return Array.from({ length: SLOTS_PER_BAR }, (_, i) => {
|
|
95
|
+
const v = src?.outfits?.[i];
|
|
96
|
+
return typeof v === 'string' && v.trim() ? v.trim() : null;
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function cloneLayout(layout: PrimaryBarPageLayout): PrimaryBarPageLayout {
|
|
101
|
+
return {
|
|
102
|
+
slots: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
103
|
+
typeof layout.slots[i] === 'number' ? layout.slots[i]! : null),
|
|
104
|
+
items: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
105
|
+
typeof layout.items[i] === 'number' ? layout.items[i]! : null),
|
|
106
|
+
macros: macroRow(layout),
|
|
107
|
+
outfits: outfitRow(layout),
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** True when a page layout has no spells and no items. */
|
|
112
|
+
export function primaryPageLayoutEmpty(layout: PrimaryBarPageLayout | undefined | null): boolean {
|
|
113
|
+
if (!layout) return true;
|
|
114
|
+
return layout.slots.every((s) => s == null)
|
|
115
|
+
&& layout.items.every((e) => e == null)
|
|
116
|
+
&& (layout.macros ?? []).every((m) => m == null)
|
|
117
|
+
&& (layout.outfits ?? []).every((o) => o == null);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// When the form-selected primary page is empty but page "0" has content, copy page 0 onto it —
|
|
121
|
+
// warriors start in Battle Stance while autofill filled bar 0. Never overwrites a customized page.
|
|
122
|
+
export function seedFormPageFromDefaultIfEmpty(
|
|
123
|
+
pages: PrimaryBarPages,
|
|
124
|
+
form: number,
|
|
125
|
+
): PrimaryBarPages {
|
|
126
|
+
const pageId = primaryBarPageForForm(form | 0);
|
|
127
|
+
if (pageId === 0) return pages;
|
|
128
|
+
const key = String(pageId);
|
|
129
|
+
const def = pages['0'];
|
|
130
|
+
if (!def || primaryPageLayoutEmpty(def)) return pages;
|
|
131
|
+
if (!primaryPageLayoutEmpty(pages[key])) return pages;
|
|
132
|
+
return { ...pages, [key]: cloneLayout(def) };
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Normalize primary page storage. Legacy saves have only actionBars[0] as the default page — seed page "0"
|
|
136
|
+
// from bar 0 when pages are absent/partial. Extra multi-bars are never paged.
|
|
137
|
+
export function normalizePrimaryPages(
|
|
138
|
+
pages: PrimaryBarPages | undefined | null,
|
|
139
|
+
bar0: ActionBar | undefined,
|
|
140
|
+
): PrimaryBarPages {
|
|
141
|
+
const out: PrimaryBarPages = {};
|
|
142
|
+
if (pages && typeof pages === 'object') {
|
|
143
|
+
for (const [k, v] of Object.entries(pages)) {
|
|
144
|
+
if (!v || !Array.isArray(v.slots)) continue;
|
|
145
|
+
out[k] = {
|
|
146
|
+
slots: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
147
|
+
typeof v.slots[i] === 'number' ? v.slots[i]! : null),
|
|
148
|
+
items: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
149
|
+
typeof v.items?.[i] === 'number' ? v.items[i]! : null),
|
|
150
|
+
macros: macroRow(v),
|
|
151
|
+
outfits: outfitRow(v),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (!out['0'] && bar0) {
|
|
156
|
+
out['0'] = {
|
|
157
|
+
slots: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
158
|
+
typeof bar0.slots[i] === 'number' ? bar0.slots[i]! : null),
|
|
159
|
+
items: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
160
|
+
typeof bar0.items?.[i] === 'number' ? bar0.items[i]! : null),
|
|
161
|
+
macros: macroRow(bar0),
|
|
162
|
+
outfits: outfitRow(bar0),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (!out['0']) out['0'] = emptyLayout();
|
|
166
|
+
return out;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Layout for a primary page id, defaulting to bar0 content. A form page never written yet
|
|
170
|
+
// inherits the default rather than coming back empty, which dumped every known spell on one row.
|
|
171
|
+
export function primaryPageLayout(
|
|
172
|
+
bar0: ActionBar,
|
|
173
|
+
pages: PrimaryBarPages | undefined,
|
|
174
|
+
pageId: PrimaryBarPageId,
|
|
175
|
+
): PrimaryBarPageLayout {
|
|
176
|
+
const fromMap = pages?.[String(pageId)];
|
|
177
|
+
if (fromMap) return cloneLayout(fromMap);
|
|
178
|
+
const def = pageId !== 0 ? pages?.['0'] : undefined;
|
|
179
|
+
if (def) return cloneLayout(def);
|
|
180
|
+
return {
|
|
181
|
+
slots: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
182
|
+
typeof bar0.slots[i] === 'number' ? bar0.slots[i]! : null),
|
|
183
|
+
items: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
184
|
+
typeof bar0.items?.[i] === 'number' ? bar0.items[i]! : null),
|
|
185
|
+
macros: macroRow(bar0),
|
|
186
|
+
outfits: outfitRow(bar0),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Action bars with primary (bar 0) content swapped to the page for `form`. Extra bars (1+) are unchanged.
|
|
191
|
+
// Keys on bar 0 are stable across pages (Classic).
|
|
192
|
+
export function actionBarsForForm(
|
|
193
|
+
bars: ActionBar[],
|
|
194
|
+
pages: PrimaryBarPages | undefined,
|
|
195
|
+
form: number,
|
|
196
|
+
): ActionBar[] {
|
|
197
|
+
if (!bars.length) return bars;
|
|
198
|
+
const pageId = primaryBarPageForForm(form);
|
|
199
|
+
const layout = primaryPageLayout(bars[0]!, pages, pageId);
|
|
200
|
+
return bars.map((b, i) => {
|
|
201
|
+
if (i !== 0) return b;
|
|
202
|
+
return {
|
|
203
|
+
slots: [...layout.slots],
|
|
204
|
+
keys: [...b.keys],
|
|
205
|
+
items: [...layout.items],
|
|
206
|
+
macros: macroRow(layout),
|
|
207
|
+
outfits: outfitRow(layout),
|
|
208
|
+
};
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Apply a bars mutator against the form-visible layout, then persist primary page content. Bar 0
|
|
213
|
+
// always mirrors page "0" for legacy readers; other pages live only in primaryBarPages.
|
|
214
|
+
export function mutateActionBarsForForm(
|
|
215
|
+
bars: ActionBar[],
|
|
216
|
+
pages: PrimaryBarPages | undefined,
|
|
217
|
+
form: number,
|
|
218
|
+
mutator: (visible: ActionBar[]) => ActionBar[],
|
|
219
|
+
): { bars: ActionBar[]; primaryBarPages: PrimaryBarPages } {
|
|
220
|
+
const pageMap = normalizePrimaryPages(pages, bars[0]);
|
|
221
|
+
const pageId = primaryBarPageForForm(form);
|
|
222
|
+
const visible = actionBarsForForm(bars, pageMap, form);
|
|
223
|
+
const next = mutator(visible);
|
|
224
|
+
if (!next.length) return { bars: next, primaryBarPages: pageMap };
|
|
225
|
+
|
|
226
|
+
// Capture current form's primary layout from the mutator result.
|
|
227
|
+
pageMap[String(pageId)] = {
|
|
228
|
+
slots: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
229
|
+
typeof next[0]!.slots[i] === 'number' ? next[0]!.slots[i]! : null),
|
|
230
|
+
items: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
231
|
+
typeof next[0]!.items?.[i] === 'number' ? next[0]!.items![i]! : null),
|
|
232
|
+
macros: macroRow(next[0]!),
|
|
233
|
+
outfits: outfitRow(next[0]!),
|
|
234
|
+
};
|
|
235
|
+
|
|
236
|
+
// Default page snapshot on bars[0]; keys from mutator (keybinds are shared).
|
|
237
|
+
const defaultLayout = pageMap['0'] ?? emptyLayout();
|
|
238
|
+
const stored: ActionBar[] = next.map((b, i) => {
|
|
239
|
+
if (i !== 0) return {
|
|
240
|
+
slots: [...b.slots],
|
|
241
|
+
keys: [...b.keys],
|
|
242
|
+
items: Array.from({ length: SLOTS_PER_BAR }, (_, j) =>
|
|
243
|
+
typeof b.items?.[j] === 'number' ? b.items[j]! : null),
|
|
244
|
+
macros: macroRow(b),
|
|
245
|
+
outfits: outfitRow(b),
|
|
246
|
+
};
|
|
247
|
+
return {
|
|
248
|
+
slots: [...defaultLayout.slots],
|
|
249
|
+
keys: [...b.keys],
|
|
250
|
+
items: [...defaultLayout.items],
|
|
251
|
+
macros: macroRow(defaultLayout),
|
|
252
|
+
outfits: outfitRow(defaultLayout),
|
|
253
|
+
};
|
|
254
|
+
});
|
|
255
|
+
return { bars: stored, primaryBarPages: pageMap };
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** Write a full primary-page layout for `form` (tests / bulk set). Does not touch multi-bars. */
|
|
259
|
+
export function writePrimaryPageContent(
|
|
260
|
+
bars: ActionBar[],
|
|
261
|
+
pages: PrimaryBarPages | undefined,
|
|
262
|
+
form: number,
|
|
263
|
+
_barIndex: number,
|
|
264
|
+
_slot: number,
|
|
265
|
+
next: { slots: (number | null)[]; items: (number | null)[]; macros?: (string | null)[]; outfits?: (string | null)[] },
|
|
266
|
+
): { bars: ActionBar[]; primaryBarPages: PrimaryBarPages } {
|
|
267
|
+
const pageMap = normalizePrimaryPages(pages, bars[0]);
|
|
268
|
+
const pageId = primaryBarPageForForm(form);
|
|
269
|
+
pageMap[String(pageId)] = {
|
|
270
|
+
slots: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
271
|
+
typeof next.slots[i] === 'number' ? next.slots[i]! : null),
|
|
272
|
+
items: Array.from({ length: SLOTS_PER_BAR }, (_, i) =>
|
|
273
|
+
typeof next.items[i] === 'number' ? next.items[i]! : null),
|
|
274
|
+
macros: macroRow(next),
|
|
275
|
+
outfits: outfitRow(next),
|
|
276
|
+
};
|
|
277
|
+
if (!bars[0]) return { bars, primaryBarPages: pageMap };
|
|
278
|
+
const defaultLayout = pageMap['0'] ?? emptyLayout();
|
|
279
|
+
const nextBars = bars.map((b, i) => {
|
|
280
|
+
if (i !== 0) return b;
|
|
281
|
+
return {
|
|
282
|
+
slots: [...defaultLayout.slots],
|
|
283
|
+
keys: [...b.keys],
|
|
284
|
+
items: [...defaultLayout.items],
|
|
285
|
+
macros: macroRow(defaultLayout),
|
|
286
|
+
outfits: outfitRow(defaultLayout),
|
|
287
|
+
};
|
|
288
|
+
});
|
|
289
|
+
return { bars: nextBars, primaryBarPages: pageMap };
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Dire Bear (9634) supersedes Bear (5487) on the stance strip — one bear slot, since both share
|
|
293
|
+
// page 3. The spellbook still keeps Bear; the bar is the upgrade path.
|
|
294
|
+
const BEAR_FORM_SPELL = 5487;
|
|
295
|
+
const DIRE_BEAR_FORM_SPELL = 9634;
|
|
296
|
+
|
|
297
|
+
// Stance-bar slots for a character: known form spells only, in class order. Active = form id matches
|
|
298
|
+
// `activeForm` (or warrior default Battle when formless + known).
|
|
299
|
+
export function listStanceSlots(
|
|
300
|
+
classId: number,
|
|
301
|
+
knownSpellIds: ReadonlyArray<number>,
|
|
302
|
+
spellOf: (id: number) => SpellDef | undefined,
|
|
303
|
+
activeForm: number,
|
|
304
|
+
): StanceBarSlot[] {
|
|
305
|
+
const candidates = CLASS_STANCE_SPELLS[classId | 0];
|
|
306
|
+
if (!candidates?.length) return [];
|
|
307
|
+
const known = new Set(knownSpellIds);
|
|
308
|
+
const form = activeForm | 0;
|
|
309
|
+
const slots: StanceBarSlot[] = [];
|
|
310
|
+
for (const spellId of candidates) {
|
|
311
|
+
if (!known.has(spellId)) continue;
|
|
312
|
+
// One bear form at a time: hide Bear once Dire Bear is known.
|
|
313
|
+
if (spellId === BEAR_FORM_SPELL && known.has(DIRE_BEAR_FORM_SPELL)) continue;
|
|
314
|
+
const sp = spellOf(spellId);
|
|
315
|
+
if (!sp) continue;
|
|
316
|
+
if (hasAttrEx2(sp, SPELL_ATTR_EX2.NO_SHAPESHIFT_UI)) continue;
|
|
317
|
+
// Prefer real form spells; still accept known canonical ids if bake is thin.
|
|
318
|
+
if (!isFormSpell(sp) && sp.role !== 'stealth' && sp.role !== 'form' && !hasAttrEx2(sp, SPELL_ATTR_EX2.USE_SHAPESHIFT_BAR)) continue;
|
|
319
|
+
let formId = formIdFromSpell(sp);
|
|
320
|
+
if (!formId) {
|
|
321
|
+
// Canonical fallbacks when effects[] not yet resolved (rawEffects still present via isFormSpell).
|
|
322
|
+
formId = FORM_ID_BY_SPELL[spellId] ?? 0;
|
|
323
|
+
}
|
|
324
|
+
if (!formId) continue;
|
|
325
|
+
slots.push({
|
|
326
|
+
spellId,
|
|
327
|
+
formId,
|
|
328
|
+
name: sp.name,
|
|
329
|
+
icon: sp.icon,
|
|
330
|
+
active: form === formId,
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
return slots;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/** Form id for each canonical stance-bar spell (1.12). */
|
|
337
|
+
const FORM_ID_BY_SPELL: Readonly<Record<number, number>> = {
|
|
338
|
+
2457: SHAPESHIFT_FORM.BATTLESTANCE,
|
|
339
|
+
71: SHAPESHIFT_FORM.DEFENSIVESTANCE,
|
|
340
|
+
2458: SHAPESHIFT_FORM.BERSERKERSTANCE,
|
|
341
|
+
5487: SHAPESHIFT_FORM.BEAR,
|
|
342
|
+
9634: SHAPESHIFT_FORM.DIREBEAR,
|
|
343
|
+
768: SHAPESHIFT_FORM.CAT,
|
|
344
|
+
783: SHAPESHIFT_FORM.TRAVEL,
|
|
345
|
+
1066: SHAPESHIFT_FORM.AQUA,
|
|
346
|
+
24858: SHAPESHIFT_FORM.MOONKIN,
|
|
347
|
+
15473: SHAPESHIFT_FORM.SHADOWFORM,
|
|
348
|
+
1784: SHAPESHIFT_FORM.STEALTH,
|
|
349
|
+
};
|
|
350
|
+
|
|
351
|
+
/** Classes that show a stance bar when they know at least one form spell. */
|
|
352
|
+
export function classHasStanceBar(classId: number): boolean {
|
|
353
|
+
return !!CLASS_STANCE_SPELLS[classId | 0]?.length;
|
|
354
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// What a pressed ability wants from the stance bar: the form it must fire in, and the stance spell
|
|
2
|
+
// that gets there. The macro `/cast [stance:3] Pummel ; Berserker Stance` is the same two steps
|
|
3
|
+
// spelled by hand (domain/macro/templates.ts:125-128).
|
|
4
|
+
|
|
5
|
+
import type { ShapeshiftFormId, SpellDef } from '../../data/schema.ts';
|
|
6
|
+
import { formIdFromSpell, isFormSpell, isStealthShapeshift, shapeshiftCastError } from './forms.ts';
|
|
7
|
+
import { listStanceSlots } from './stanceBar.ts';
|
|
8
|
+
|
|
9
|
+
/** A press's claim on the stance bar. */
|
|
10
|
+
export interface StanceIntent {
|
|
11
|
+
/** Form the press must fire in — nothing may shift out of it while the press waits. */
|
|
12
|
+
holdForm: ShapeshiftFormId;
|
|
13
|
+
/** Stance spell to cast before the press, or null when already in `holdForm`. */
|
|
14
|
+
castSpellId: number | null;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The stance a press needs, or null when a stance change cannot affect it. `holdForm` is the
|
|
19
|
+
* CURRENT form when that already casts and some other stance on the bar would refuse — that is
|
|
20
|
+
* what stops a rotation stance row popping the player back between the swap and the press.
|
|
21
|
+
*/
|
|
22
|
+
export function stanceIntentForPress(
|
|
23
|
+
spell: SpellDef,
|
|
24
|
+
form: ShapeshiftFormId,
|
|
25
|
+
classId: number,
|
|
26
|
+
known: ReadonlyArray<number>,
|
|
27
|
+
spellOf: (id: number) => SpellDef | undefined,
|
|
28
|
+
): StanceIntent | null {
|
|
29
|
+
// A stance press is its own answer, and Stealth is an opener with a cooldown and a snare — the
|
|
30
|
+
// player enters it deliberately, never as a side effect of pressing Ambush.
|
|
31
|
+
if (isFormSpell(spell)) return null;
|
|
32
|
+
const slots = listStanceSlots(classId, known, spellOf, form)
|
|
33
|
+
.filter((s) => !isStealthShapeshift(s.formId));
|
|
34
|
+
if (!slots.length) return null;
|
|
35
|
+
|
|
36
|
+
if (shapeshiftCastError(spell, form) === 'ok') {
|
|
37
|
+
const fragile = slots.some((s) => s.formId !== form && shapeshiftCastError(spell, s.formId) !== 'ok');
|
|
38
|
+
return fragile ? { holdForm: form, castSpellId: null } : null;
|
|
39
|
+
}
|
|
40
|
+
// Class bar order (Battle, Defensive, Berserker): Execute is Battle|Berserker and comes back
|
|
41
|
+
// Battle, where the rest of an Arms rotation already lives.
|
|
42
|
+
const fix = slots.find((s) => shapeshiftCastError(spell, s.formId) === 'ok');
|
|
43
|
+
return fix ? { holdForm: fix.formId, castSpellId: fix.spellId } : null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** A live claim on the stance bar: what to hold, and when it lapses. */
|
|
47
|
+
export interface StanceHold {
|
|
48
|
+
form: ShapeshiftFormId;
|
|
49
|
+
// Session clock the claim lapses at. Null while a press is still queued for it — that press is
|
|
50
|
+
// the deadline, and cancelling it is how the player hands the stance back.
|
|
51
|
+
until: number | null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// A stance the player pressed by hand, with nothing queued behind it, holds this long. Five GCDs:
|
|
55
|
+
// enough to reach the ability they swapped for, short enough that a stray press is not permanent.
|
|
56
|
+
export const STANCE_HOLD_MS = 8000;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* True when a rotation pick shifts out of the stance a press claimed. Without it the warrior packs'
|
|
60
|
+
* own `Battle Stance when formId != 17` row re-casts on the tick after the swap, every time.
|
|
61
|
+
*/
|
|
62
|
+
export function rotationPickBlockedByHold(
|
|
63
|
+
spell: SpellDef,
|
|
64
|
+
hold: StanceHold | null,
|
|
65
|
+
now: number,
|
|
66
|
+
): boolean {
|
|
67
|
+
if (!hold) return false;
|
|
68
|
+
if (hold.until != null && now >= hold.until) return false;
|
|
69
|
+
return isFormSpell(spell) && formIdFromSpell(spell) !== hold.form;
|
|
70
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
// Named talent loadouts saved from the wiki calculator and assigned to a player or companion.
|
|
2
|
+
// The stored value is the classic Wowhead talent string; apply re-spends it at the target's level.
|
|
3
|
+
|
|
4
|
+
export interface TalentBuild {
|
|
5
|
+
id: string;
|
|
6
|
+
name: string;
|
|
7
|
+
cls: number;
|
|
8
|
+
/** Classic talent string, trees separated by '-'. */
|
|
9
|
+
link: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const MAX_TALENT_BUILDS = 20;
|
|
13
|
+
const DEFAULT_NAME = 'Build';
|
|
14
|
+
|
|
15
|
+
/** Deterministic id from the existing set — no RNG, no Date. */
|
|
16
|
+
export function nextTalentBuildId(existing: readonly TalentBuild[]): string {
|
|
17
|
+
let n = existing.length + 1;
|
|
18
|
+
const taken = new Set(existing.map((b) => b.id));
|
|
19
|
+
while (taken.has(`b${n}`)) n++;
|
|
20
|
+
return `b${n}`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Trim, collapse whitespace, cap length. Never returns ''. */
|
|
24
|
+
export function sanitizeTalentBuildName(raw: unknown, fallback = DEFAULT_NAME): string {
|
|
25
|
+
const s = typeof raw === 'string' ? raw.replace(/\s+/g, ' ').trim().slice(0, 32) : '';
|
|
26
|
+
return s || fallback;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** A name not already taken in this list ("Arms", "Arms 2", …). */
|
|
30
|
+
export function uniqueTalentBuildName(existing: readonly TalentBuild[], want: string): string {
|
|
31
|
+
const base = sanitizeTalentBuildName(want);
|
|
32
|
+
const taken = new Set(existing.map((b) => b.name.toLowerCase()));
|
|
33
|
+
if (!taken.has(base.toLowerCase())) return base;
|
|
34
|
+
for (let i = 2; i < 100; i++) {
|
|
35
|
+
const cand = `${base} ${i}`;
|
|
36
|
+
if (!taken.has(cand.toLowerCase())) return cand;
|
|
37
|
+
}
|
|
38
|
+
return base;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** Drop malformed rows, dedupe ids, cap length. Empty / junk input → []. */
|
|
42
|
+
export function normalizeTalentBuilds(raw: unknown): TalentBuild[] {
|
|
43
|
+
if (!Array.isArray(raw)) return [];
|
|
44
|
+
const out: TalentBuild[] = [];
|
|
45
|
+
const seen = new Set<string>();
|
|
46
|
+
for (const r of raw) {
|
|
47
|
+
if (!r || typeof r !== 'object') continue;
|
|
48
|
+
const row = r as { id?: unknown; name?: unknown; cls?: unknown; link?: unknown };
|
|
49
|
+
const id = typeof row.id === 'string' ? row.id.trim() : '';
|
|
50
|
+
const link = typeof row.link === 'string' ? row.link.trim() : '';
|
|
51
|
+
const cls = typeof row.cls === 'number' && Number.isInteger(row.cls) ? row.cls : 0;
|
|
52
|
+
if (!id || seen.has(id) || !link || cls < 1) continue;
|
|
53
|
+
seen.add(id);
|
|
54
|
+
out.push({
|
|
55
|
+
id,
|
|
56
|
+
name: sanitizeTalentBuildName(row.name),
|
|
57
|
+
cls,
|
|
58
|
+
link,
|
|
59
|
+
});
|
|
60
|
+
if (out.length >= MAX_TALENT_BUILDS) break;
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|