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,105 @@
|
|
|
1
|
+
// Relic class gate. AllowableClass is 32767 on all 19 classic relics; lock is subclass × class.
|
|
2
|
+
// Cite: Player.cpp ViableEquipSlots 8039–8083 (6 idol / 7 libram / 6 totem).
|
|
3
|
+
|
|
4
|
+
import { CLASS } from '../../data/schema.ts';
|
|
5
|
+
import type { ItemDef } from '../../data/schema.ts';
|
|
6
|
+
import type { EquipGateResult } from './itemRestrictions.ts';
|
|
7
|
+
|
|
8
|
+
/** INVTYPE_RELIC — equips into EQUIPMENT_SLOT_RANGED. */
|
|
9
|
+
export const INVTYPE_RELIC = 28;
|
|
10
|
+
/** ITEM_SUBCLASS_ARMOR_LIBRAM */
|
|
11
|
+
export const ITEM_SUBCLASS_ARMOR_LIBRAM = 7;
|
|
12
|
+
/** ITEM_SUBCLASS_ARMOR_IDOL */
|
|
13
|
+
export const ITEM_SUBCLASS_ARMOR_IDOL = 8;
|
|
14
|
+
/** ITEM_SUBCLASS_ARMOR_TOTEM */
|
|
15
|
+
export const ITEM_SUBCLASS_ARMOR_TOTEM = 9;
|
|
16
|
+
/** ITEM_SUBCLASS_ARMOR_MISC (ViableEquipSlots warlock branch) */
|
|
17
|
+
export const ITEM_SUBCLASS_ARMOR_MISC = 0;
|
|
18
|
+
|
|
19
|
+
export type RelicKind = 'libram' | 'idol' | 'totem' | 'misc';
|
|
20
|
+
|
|
21
|
+
// Armor subclass for relic gates. Prefer armorSubclass — a bare itemSubclass is shared across ALL
|
|
22
|
+
// item classes (tradegoods Herb 9 is the totem enum), so use it only for armor or a fixture.
|
|
23
|
+
function armorSubclassOf(item: ItemDef): number | undefined {
|
|
24
|
+
if (item.armorSubclass != null) return item.armorSubclass;
|
|
25
|
+
if (item.itemClass === 4) return item.itemSubclass;
|
|
26
|
+
if (item.itemClass == null && (item.inventoryType === INVTYPE_RELIC || item.typeName != null)) {
|
|
27
|
+
return item.itemSubclass;
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** True when the item is a relic (libram / idol / totem / invtype 28). */
|
|
33
|
+
export function isRelicItem(item: ItemDef | undefined): boolean {
|
|
34
|
+
if (!item) return false;
|
|
35
|
+
if (item.inventoryType === INVTYPE_RELIC) return true;
|
|
36
|
+
const sub = armorSubclassOf(item);
|
|
37
|
+
if (sub === ITEM_SUBCLASS_ARMOR_LIBRAM
|
|
38
|
+
|| sub === ITEM_SUBCLASS_ARMOR_IDOL
|
|
39
|
+
|| sub === ITEM_SUBCLASS_ARMOR_TOTEM) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
const tn = (item.typeName ?? '').toLowerCase();
|
|
43
|
+
return tn === 'libram' || tn === 'idol' || tn === 'totem' || tn === 'relic';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function relicKindOf(item: ItemDef): RelicKind | undefined {
|
|
47
|
+
const sub = armorSubclassOf(item);
|
|
48
|
+
const tn = (item.typeName ?? '').toLowerCase();
|
|
49
|
+
if (sub === ITEM_SUBCLASS_ARMOR_LIBRAM || tn === 'libram') return 'libram';
|
|
50
|
+
if (sub === ITEM_SUBCLASS_ARMOR_IDOL || tn === 'idol') return 'idol';
|
|
51
|
+
if (sub === ITEM_SUBCLASS_ARMOR_TOTEM || tn === 'totem') return 'totem';
|
|
52
|
+
if (sub === ITEM_SUBCLASS_ARMOR_MISC && item.inventoryType === INVTYPE_RELIC) return 'misc';
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** Class ids ViableEquipSlots accepts for this relic, or undefined if not a relic. */
|
|
57
|
+
export function relicRequiredClasses(item: ItemDef | undefined): number[] | undefined {
|
|
58
|
+
if (!item || !isRelicItem(item)) return undefined;
|
|
59
|
+
const kind = relicKindOf(item);
|
|
60
|
+
if (kind === 'libram') return [CLASS.PALADIN];
|
|
61
|
+
if (kind === 'idol') return [CLASS.DRUID];
|
|
62
|
+
if (kind === 'totem') return [CLASS.SHAMAN];
|
|
63
|
+
if (kind === 'misc') return [CLASS.WARLOCK];
|
|
64
|
+
if (item.allowClass?.length) return item.allowClass;
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Class gate for INVTYPE_RELIC into the ranged paperdoll slot. Non-relics return ok (no-op). Wrong class →
|
|
69
|
+
// refuse.
|
|
70
|
+
export function canEquipRelic(
|
|
71
|
+
char: { cls: number },
|
|
72
|
+
item: ItemDef | undefined,
|
|
73
|
+
): EquipGateResult {
|
|
74
|
+
if (!item || !isRelicItem(item)) return { ok: true };
|
|
75
|
+
|
|
76
|
+
if (item.allowClass && !item.allowClass.includes(char.cls)) {
|
|
77
|
+
return { ok: false, reason: 'Your class cannot use that relic' };
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const kind = relicKindOf(item);
|
|
81
|
+
if (kind == null) {
|
|
82
|
+
if (item.allowClass?.length) return { ok: true };
|
|
83
|
+
return { ok: false, reason: 'Your class cannot use that relic' };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
switch (kind) {
|
|
87
|
+
case 'libram':
|
|
88
|
+
if (char.cls === CLASS.PALADIN) return { ok: true };
|
|
89
|
+
return { ok: false, reason: 'Only paladins can equip librams' };
|
|
90
|
+
case 'idol':
|
|
91
|
+
if (char.cls === CLASS.DRUID) return { ok: true };
|
|
92
|
+
return { ok: false, reason: 'Only druids can equip idols' };
|
|
93
|
+
case 'totem':
|
|
94
|
+
if (char.cls === CLASS.SHAMAN) return { ok: true };
|
|
95
|
+
return { ok: false, reason: 'Only shamans can equip totems' };
|
|
96
|
+
case 'misc':
|
|
97
|
+
if (char.cls === CLASS.WARLOCK) return { ok: true };
|
|
98
|
+
return { ok: false, reason: 'Your class cannot use that relic' };
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** Paladin / Druid / Shaman use Relic.blp and hide ammo. Cite: Player.cpp:8046-8065; PaperDollFrame.lua UnitHasRelicSlot. */
|
|
103
|
+
export function classHasRelicSlot(cls: number): boolean {
|
|
104
|
+
return cls === CLASS.PALADIN || cls === CLASS.DRUID || cls === CLASS.SHAMAN;
|
|
105
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Goblin Rocket Boots (7189) — the on-use +70% run buff that can blow up on you.
|
|
2
|
+
// Cite: Spell.dbc 8892 description "They are prone to explode however, so use with caution.";
|
|
3
|
+
// aura text "Increases run speed. Explosive malfunction is possible."
|
|
4
|
+
|
|
5
|
+
import type { DataStore } from '../../data/dataStore.ts';
|
|
6
|
+
import type { SpellDef } from '../../data/schema.ts';
|
|
7
|
+
|
|
8
|
+
export const GOBLIN_ROCKET_BOOTS = 7189;
|
|
9
|
+
/** src_spell_template 8893 EffectItemType3 — what a malfunction leaves in your bags. */
|
|
10
|
+
export const SCORCHED_ROCKET_BOOTS = 7190;
|
|
11
|
+
/** 8893 "Rocket Boots Malfunction": 2 s stun + 57-93 fire to self + conjure 7190. */
|
|
12
|
+
export const ROCKET_BOOTS_MALFUNCTION_SPELL = 8893;
|
|
13
|
+
|
|
14
|
+
// UNSOURCED RATE. The malfunction payload and its player-facing warning are tier-2/tier-3 data, but
|
|
15
|
+
// no tier carries the odds: src_spell_template 8892 has one effect and no trigger, 8893 has no
|
|
16
|
+
// caster, a full sweep of every src_* table for 8892/8893 returns nothing, and CMaNGOS never casts
|
|
17
|
+
// 8893 (grep over src/, 2026-08-30). This number is the operator's to set.
|
|
18
|
+
export const ROCKET_BOOTS_MALFUNCTION_PCT = 5;
|
|
19
|
+
|
|
20
|
+
/** The malfunction rider `combatItems` hangs on the boots, or undefined for every other item. */
|
|
21
|
+
export function rocketBootsMalfunction(
|
|
22
|
+
entry: number,
|
|
23
|
+
ds: DataStore,
|
|
24
|
+
resolve: (raw: SpellDef) => SpellDef,
|
|
25
|
+
): { chancePct: number; spell: SpellDef; destroysInto: number } | undefined {
|
|
26
|
+
if (entry !== GOBLIN_ROCKET_BOOTS) return undefined;
|
|
27
|
+
const raw = ds.spell(ROCKET_BOOTS_MALFUNCTION_SPELL);
|
|
28
|
+
if (!raw) return undefined;
|
|
29
|
+
// 8893's fire damage is EffectImplicitTargetA 1 (TARGET_UNIT_CASTER) — it burns the WEARER, and
|
|
30
|
+
// effects-core.ts stamps that as hostile:false so applySpell routes it to the caster.
|
|
31
|
+
return {
|
|
32
|
+
chancePct: ROCKET_BOOTS_MALFUNCTION_PCT,
|
|
33
|
+
spell: resolve(raw),
|
|
34
|
+
destroysInto: SCORCHED_ROCKET_BOOTS,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
// One sort order for every container in the game — your bags, your bank, a companion's bags and
|
|
2
|
+
// their bank. Ported from the SortBags addon's `Item()` tier list (addons/SortBags/SortBags.lua:398-461)
|
|
3
|
+
// with this tree's own predicates standing in for its hardcoded id sets: `mountSpell` for MOUNTS,
|
|
4
|
+
// isKeyItem for KEYS, itemProtectCategory for TOOLS, and the disenchant table for ENCHANTING_MATERIALS.
|
|
5
|
+
// Pure: every function returns a new value.
|
|
6
|
+
|
|
7
|
+
import type { DataStore } from '../../data/dataStore.ts';
|
|
8
|
+
import type { ItemDef } from '../../data/schema.ts';
|
|
9
|
+
import type { Inventory, ItemStack } from './inventory.ts';
|
|
10
|
+
import { addInstance, emptyInventory } from './inventory.ts';
|
|
11
|
+
import { isKeyItem } from './keyring.ts';
|
|
12
|
+
import {
|
|
13
|
+
itemProtectCategory,
|
|
14
|
+
protectLookupFor,
|
|
15
|
+
type ProtectLookup,
|
|
16
|
+
type ProtectSource,
|
|
17
|
+
} from './junkCategories.ts';
|
|
18
|
+
|
|
19
|
+
/** Hearthstone — first tile in the addon's order. Cite: SortBags.lua:411. */
|
|
20
|
+
export const HEARTHSTONE_ITEM = 6948;
|
|
21
|
+
|
|
22
|
+
/** Soul Shard — bucketed with junk so a warlock's shards never split the gear block. Cite: SortBags.lua:423. */
|
|
23
|
+
export const SOUL_SHARD_ITEM = 6265;
|
|
24
|
+
|
|
25
|
+
/** item_template.class TRADE_GOODS / subclass HERB. Cite: ItemPrototype.h; item-data.json Peacebloom (7/9). */
|
|
26
|
+
const ITEM_CLASS_TRADE_GOODS = 7;
|
|
27
|
+
const ITEM_SUBCLASS_HERB = 9;
|
|
28
|
+
|
|
29
|
+
/** The DataStore slice a sort needs: junkCategories' lookup plus the disenchant table. */
|
|
30
|
+
export type SortSource = ProtectSource & Pick<DataStore, 'disenchantRules' | 'item'>;
|
|
31
|
+
|
|
32
|
+
export interface SortLookup extends ProtectLookup {
|
|
33
|
+
/** Every dust / essence / shard / crystal the disenchant table yields (24 rows). */
|
|
34
|
+
enchantMats: ReadonlySet<number>;
|
|
35
|
+
item: (entry: number) => ItemDef | undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const matsByStore = new WeakMap<object, Set<number>>();
|
|
39
|
+
|
|
40
|
+
// Enchanting materials, derived instead of listed: disenchantRules' yield IS the addon's
|
|
41
|
+
// ENCHANTING_MATERIALS set, and both come to 24 entries.
|
|
42
|
+
export function enchantMaterialEntries(ds: SortSource): ReadonlySet<number> {
|
|
43
|
+
let mats = matsByStore.get(ds);
|
|
44
|
+
if (!mats) {
|
|
45
|
+
mats = new Set<number>();
|
|
46
|
+
for (const rule of ds.disenchantRules()) {
|
|
47
|
+
for (const y of rule.yield ?? []) if (y.item > 0) mats.add(y.item);
|
|
48
|
+
}
|
|
49
|
+
matsByStore.set(ds, mats);
|
|
50
|
+
}
|
|
51
|
+
return mats;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** One lookup per DataStore — protectLookupFor materializes 1,135 recipe rows. */
|
|
55
|
+
export function sortLookupFor(ds: SortSource): SortLookup {
|
|
56
|
+
return { ...protectLookupFor(ds), enchantMats: enchantMaterialEntries(ds), item: ds.item };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// The addon's tier number, in the addon's own evaluation order (SortBags.lua:410-460). Lower sorts
|
|
60
|
+
// first. 3 is unused: its SPECIAL set is six unexplained ids, so those items take their own tier.
|
|
61
|
+
export function itemSortTier(
|
|
62
|
+
stack: ItemStack,
|
|
63
|
+
it: ItemDef | undefined,
|
|
64
|
+
look: SortLookup,
|
|
65
|
+
): number {
|
|
66
|
+
if (!it) return 16;
|
|
67
|
+
const cat = itemProtectCategory(it, look);
|
|
68
|
+
if (it.entry === HEARTHSTONE_ITEM) return 1;
|
|
69
|
+
if (it.mountSpell != null || cat === 'mountPet') return 2;
|
|
70
|
+
if (cat === 'key' || isKeyItem(it)) return 4;
|
|
71
|
+
if (cat === 'tool') return 5;
|
|
72
|
+
if (it.entry === SOUL_SHARD_ITEM) return 14;
|
|
73
|
+
if (it.conjured) return 15;
|
|
74
|
+
if (stack.bound) return 6;
|
|
75
|
+
if (cat === 'reagent') return 7;
|
|
76
|
+
if (cat === 'quest') return 9;
|
|
77
|
+
if (cat === 'foodDrink' || cat === 'consumable') return 8;
|
|
78
|
+
if (look.enchantMats.has(it.entry)) return 11;
|
|
79
|
+
if (it.itemClass === ITEM_CLASS_TRADE_GOODS && it.itemSubclass === ITEM_SUBCLASS_HERB) return 12;
|
|
80
|
+
if (it.quality > 1) return 10;
|
|
81
|
+
if (it.quality === 0) return 14;
|
|
82
|
+
return 13;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Tier, then the addon's own tie-breakers. Entry rather than name groups an item's ranks
|
|
86
|
+
// (Minor → Lesser → Healing Potion) the way SortBags.lua:452-460 does.
|
|
87
|
+
export function itemSortKey(
|
|
88
|
+
stack: ItemStack,
|
|
89
|
+
it: ItemDef | undefined,
|
|
90
|
+
look: SortLookup,
|
|
91
|
+
): number[] {
|
|
92
|
+
return [
|
|
93
|
+
itemSortTier(stack, it, look),
|
|
94
|
+
it?.itemClass ?? 99,
|
|
95
|
+
it?.inventoryType ?? 0,
|
|
96
|
+
it?.itemSubclass ?? 0,
|
|
97
|
+
-(it?.quality ?? 0),
|
|
98
|
+
it?.entry ?? 0,
|
|
99
|
+
-(stack.charges ?? 0),
|
|
100
|
+
stack.randomPropertyId ?? 0,
|
|
101
|
+
stack.permEnchantId ?? 0,
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Element-wise compare; equal-length keys, so a shorter vector never appears. */
|
|
106
|
+
export function compareSortKeys(a: readonly number[], b: readonly number[]): number {
|
|
107
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
108
|
+
const d = (a[i] ?? 0) - (b[i] ?? 0);
|
|
109
|
+
if (d !== 0) return d;
|
|
110
|
+
}
|
|
111
|
+
return 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export interface SortContainerResult {
|
|
115
|
+
inventory: Inventory;
|
|
116
|
+
/** Slots the restack handed back (used before − used after). Never negative. */
|
|
117
|
+
freed: number;
|
|
118
|
+
/** True when the stack order or count actually changed. */
|
|
119
|
+
changed: boolean;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// The addon's two halves (Stack() then Sort()) in one pass. addInstance merges only what
|
|
123
|
+
// instancesStackable allows, so a suffix, an enchant or a bound flag keeps its own slot.
|
|
124
|
+
export function sortInventory(inv: Inventory, ds: SortSource): SortContainerResult {
|
|
125
|
+
const look = sortLookupFor(ds);
|
|
126
|
+
let packed = emptyInventory();
|
|
127
|
+
for (const s of inv.stacks) {
|
|
128
|
+
packed = addInstance(packed, s, ds.item(s.item)?.stackable ?? 1);
|
|
129
|
+
}
|
|
130
|
+
const keyed = packed.stacks.map((s) => ({ s, k: itemSortKey(s, ds.item(s.item), look) }));
|
|
131
|
+
keyed.sort((a, b) => compareSortKeys(a.k, b.k));
|
|
132
|
+
const stacks = keyed.map((x) => x.s);
|
|
133
|
+
const freed = Math.max(0, inv.stacks.length - stacks.length);
|
|
134
|
+
const changed = freed > 0 || stacks.some((s, i) => {
|
|
135
|
+
const was = inv.stacks[i];
|
|
136
|
+
return !was || was.item !== s.item || was.count !== s.count;
|
|
137
|
+
});
|
|
138
|
+
return { inventory: { stacks }, freed, changed };
|
|
139
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Spare bags and quivers Multi sell may offer. The "Bags and containers" / "Quivers and ammo
|
|
2
|
+
// pouches" boxes exist for the bag you are about to wear; a 6-slot pack sitting behind four 16s is
|
|
3
|
+
// not that bag, it is 50 copper.
|
|
4
|
+
//
|
|
5
|
+
// "Not an upgrade" is findUpgrades' own answer (equipmentHelper.ts:185-190 scores a bag by bagSlots
|
|
6
|
+
// and replaces the SMALLEST worn one), taken for the player AND every companion via
|
|
7
|
+
// partyUpgradeEntries. That alone is not enough for a class-11 quiver: quiverPouchValue returns 0
|
|
8
|
+
// for a wrong ranged family, so an unarmed hunter's only spare quiver reads "not an upgrade". Both
|
|
9
|
+
// families therefore also have to be beaten by something the body is ALREADY WEARING.
|
|
10
|
+
|
|
11
|
+
import type { DataStore } from '../../data/dataStore.ts';
|
|
12
|
+
import type { ItemDef } from '../../data/schema.ts';
|
|
13
|
+
import type { EquippedMap } from '../character/character.ts';
|
|
14
|
+
import { isQuiverOrPouch } from './ammo.ts';
|
|
15
|
+
import { BAG_SLOTS } from './equipment.ts';
|
|
16
|
+
import { equippedEntry } from './itemInstance.ts';
|
|
17
|
+
import type { Inventory } from './inventory.ts';
|
|
18
|
+
|
|
19
|
+
/** item_template.class 1 CONTAINER / 11 QUIVER. Cite: ItemPrototype.h:144-159. */
|
|
20
|
+
const ITEM_CLASS_CONTAINER = 1;
|
|
21
|
+
const ITEM_CLASS_QUIVER = 11;
|
|
22
|
+
|
|
23
|
+
type ContainerFamily = 'bag' | 'quiver';
|
|
24
|
+
|
|
25
|
+
/** Which of the two never-sell boxes owns this row, or null when it is not a container at all. */
|
|
26
|
+
export function containerFamily(it: ItemDef | undefined): ContainerFamily | null {
|
|
27
|
+
if (!it) return null;
|
|
28
|
+
if (isQuiverOrPouch(it) || it.itemClass === ITEM_CLASS_QUIVER) return 'quiver';
|
|
29
|
+
if (it.itemClass === ITEM_CLASS_CONTAINER || it.slot === 'bag') return 'bag';
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Biggest worn container of each family. A body wearing nothing keeps every spare it carries. */
|
|
34
|
+
function wornSlotsByFamily(equipped: EquippedMap, ds: DataStore): Map<ContainerFamily, number> {
|
|
35
|
+
const out = new Map<ContainerFamily, number>();
|
|
36
|
+
for (const slot of BAG_SLOTS) {
|
|
37
|
+
const entry = equippedEntry(equipped[slot]);
|
|
38
|
+
const it = entry != null ? ds.item(entry) : undefined;
|
|
39
|
+
const fam = containerFamily(it);
|
|
40
|
+
if (!fam || !it) continue;
|
|
41
|
+
out.set(fam, Math.max(out.get(fam) ?? 0, it.bagSlots ?? 0));
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Bag entries that are a container nobody would wear: not an upgrade for the party, and no bigger
|
|
48
|
+
* than what this body already has on in the same family.
|
|
49
|
+
*/
|
|
50
|
+
export function spareContainerEntries(
|
|
51
|
+
inv: Inventory,
|
|
52
|
+
ds: DataStore,
|
|
53
|
+
equipped: EquippedMap,
|
|
54
|
+
upgradeEntries: ReadonlySet<number> | undefined,
|
|
55
|
+
): Set<number> {
|
|
56
|
+
const worn = wornSlotsByFamily(equipped, ds);
|
|
57
|
+
const out = new Set<number>();
|
|
58
|
+
const seen = new Set<number>();
|
|
59
|
+
for (const stk of inv.stacks) {
|
|
60
|
+
if (seen.has(stk.item)) continue;
|
|
61
|
+
seen.add(stk.item);
|
|
62
|
+
if (upgradeEntries?.has(stk.item)) continue;
|
|
63
|
+
const it = ds.item(stk.item);
|
|
64
|
+
const fam = containerFamily(it);
|
|
65
|
+
if (!it || !fam) continue;
|
|
66
|
+
const wornSlots = worn.get(fam);
|
|
67
|
+
if (wornSlots == null || wornSlots < (it.bagSlots ?? 0)) continue;
|
|
68
|
+
out.add(it.entry);
|
|
69
|
+
}
|
|
70
|
+
return out;
|
|
71
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// What a spell reagent is FOR: the non-craft spells that spend it, the classes that cast those, and
|
|
2
|
+
// the book that teaches one. Party-independent, so a shaman reagent reads as one with no shaman here.
|
|
3
|
+
// Cite: spell_template.Reagent1..8; SkillLineAbility.classMask (Player.cpp:18369
|
|
4
|
+
// IsSpellFitByClassAndRace); SpellEffects.cpp:2445 EffectLearnSpell.
|
|
5
|
+
|
|
6
|
+
import type { DataStore } from '../../data/dataStore.ts';
|
|
7
|
+
import type { ItemDef, SpellDef } from '../../data/schema.ts';
|
|
8
|
+
import { itemTeachIntent } from './itemTeaches.ts';
|
|
9
|
+
|
|
10
|
+
/** SPELL_EFFECT_CREATE_ITEM / ENCHANT_ITEM / ENCHANT_ITEM_TEMPORARY. Cite: SharedDefines.h:24/53/54. */
|
|
11
|
+
const EFFECT_CREATE_ITEM = 24;
|
|
12
|
+
const EFFECT_ENCHANT_ITEM = 53;
|
|
13
|
+
const EFFECT_ENCHANT_ITEM_TEMPORARY = 54;
|
|
14
|
+
|
|
15
|
+
/** Highest classic class id, so a classMask walk stops at Druid. Cite: SharedDefines.h CLASS_DRUID 11. */
|
|
16
|
+
const MAX_CLASS_ID = 11;
|
|
17
|
+
|
|
18
|
+
// A craft spends reagents to mint or enchant an item and buys vendor rows itself (258922bf5).
|
|
19
|
+
// Enchanting is effect 53, not 24 — those dusts are trade goods, never a spell reagent.
|
|
20
|
+
export function isCraftSpell(sp: SpellDef): boolean {
|
|
21
|
+
if (!(sp.reagents ?? []).some((r) => r.item > 0)) return false;
|
|
22
|
+
const raw = sp.rawEffects ?? [];
|
|
23
|
+
if (raw.length) {
|
|
24
|
+
return raw.some((e) =>
|
|
25
|
+
e.effect === EFFECT_CREATE_ITEM
|
|
26
|
+
|| e.effect === EFFECT_ENCHANT_ITEM
|
|
27
|
+
|| e.effect === EFFECT_ENCHANT_ITEM_TEMPORARY);
|
|
28
|
+
}
|
|
29
|
+
return (sp.effects ?? []).some((e) =>
|
|
30
|
+
e.kind === 'conjure' || e.kind === 'enchant_item_perm' || e.kind === 'enchant_held_item');
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ReagentSpender {
|
|
34
|
+
spell: number;
|
|
35
|
+
/** Classes this spell's SLA classMask lets cast it. Empty = no mask restricts it. */
|
|
36
|
+
classes: readonly number[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface ReagentDemand {
|
|
40
|
+
/** Non-craft spells that list this item, lowest spell level first. */
|
|
41
|
+
spenders: readonly ReagentSpender[];
|
|
42
|
+
/** Union of the spenders' classes, so a wrong-class seat can be named and refused. */
|
|
43
|
+
classes: readonly number[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const DEMAND = new WeakMap<DataStore, Map<number, ReagentDemand>>();
|
|
47
|
+
const SPENDERS = new WeakMap<DataStore, ReadonlySet<number>>();
|
|
48
|
+
|
|
49
|
+
function demandIndex(ds: DataStore): Map<number, ReagentDemand> {
|
|
50
|
+
const hit = DEMAND.get(ds);
|
|
51
|
+
if (hit) return hit;
|
|
52
|
+
const meta = ds.combatSkillMeta?.();
|
|
53
|
+
const spellsOf = new Map<number, SpellDef[]>();
|
|
54
|
+
for (const sp of ds.allSpells()) {
|
|
55
|
+
if (isCraftSpell(sp)) continue;
|
|
56
|
+
for (const r of sp.reagents ?? []) {
|
|
57
|
+
if (!(r.item > 0)) continue;
|
|
58
|
+
const arr = spellsOf.get(r.item);
|
|
59
|
+
if (arr) arr.push(sp);
|
|
60
|
+
else spellsOf.set(r.item, [sp]);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const classesOf = (spellId: number): number[] => {
|
|
64
|
+
let mask = 0;
|
|
65
|
+
for (const ab of meta?.spellAbilities?.[spellId] ?? []) mask |= ab.classMask | 0;
|
|
66
|
+
const out: number[] = [];
|
|
67
|
+
for (let cls = 1; cls <= MAX_CLASS_ID; cls++) if (mask & (1 << (cls - 1))) out.push(cls);
|
|
68
|
+
return out;
|
|
69
|
+
};
|
|
70
|
+
const out = new Map<number, ReagentDemand>();
|
|
71
|
+
for (const [item, sps] of spellsOf) {
|
|
72
|
+
sps.sort((a, b) => (a.spellLevel ?? 0) - (b.spellLevel ?? 0) || a.id - b.id);
|
|
73
|
+
const spenders = sps.map((sp) => ({ spell: sp.id, classes: classesOf(sp.id) }));
|
|
74
|
+
const classes = [...new Set(spenders.flatMap((sp) => sp.classes))].sort((a, b) => a - b);
|
|
75
|
+
// No classMask anywhere is a world spell, not a class reagent: Linen Cloth is spent by
|
|
76
|
+
// Defias Disguise (5169) and belongs in nobody's spellbook kit.
|
|
77
|
+
if (!classes.length) continue;
|
|
78
|
+
out.set(item, { spenders, classes });
|
|
79
|
+
}
|
|
80
|
+
DEMAND.set(ds, out);
|
|
81
|
+
return out;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Whether any non-craft spell spends this item. One map lookup — called per item per seat. */
|
|
85
|
+
export function spendsAsReagent(ds: DataStore, entry: number): boolean {
|
|
86
|
+
return demandIndex(ds).has(entry);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Every item a non-craft spell spends. */
|
|
90
|
+
export function reagentSpenders(ds: DataStore): ReadonlySet<number> {
|
|
91
|
+
let set = SPENDERS.get(ds);
|
|
92
|
+
if (!set) SPENDERS.set(ds, (set = new Set(demandIndex(ds).keys())));
|
|
93
|
+
return set;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/** What spends this item, or undefined when no class spell does. */
|
|
97
|
+
export function reagentDemand(ds: DataStore, entry: number): ReagentDemand | undefined {
|
|
98
|
+
return demandIndex(ds).get(entry);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** The lowest-rank spell of `cls` that spends this item — the one a blocked row should name. */
|
|
102
|
+
export function reagentSpellFor(ds: DataStore, entry: number, cls: number): number | undefined {
|
|
103
|
+
const spenders = demandIndex(ds).get(entry)?.spenders ?? [];
|
|
104
|
+
return spenders.find((sp) => sp.classes.includes(cls))?.spell;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
type BookIndex = { catalogSize: number; bySpell: Map<number, number> };
|
|
108
|
+
const BOOKS = new WeakMap<DataStore, BookIndex>();
|
|
109
|
+
|
|
110
|
+
// Keyed on the catalogue size, because attachItems merges the lazy chunk in after boot and a memo
|
|
111
|
+
// built off the keep set alone would answer "no book" forever. Cite: playerbotEquipCache.ts:44.
|
|
112
|
+
function bookIndex(ds: DataStore): Map<number, number> {
|
|
113
|
+
const catalogSize = ds.items().length;
|
|
114
|
+
const hit = BOOKS.get(ds);
|
|
115
|
+
if (hit && hit.catalogSize === catalogSize) return hit.bySpell;
|
|
116
|
+
const bySpell = new Map<number, number>();
|
|
117
|
+
for (const it of ds.items()) {
|
|
118
|
+
if (it.useSpell == null) continue;
|
|
119
|
+
const teach = itemTeachIntent(it, ds);
|
|
120
|
+
if (teach?.kind !== 'spell' || bySpell.has(teach.id)) continue;
|
|
121
|
+
bySpell.set(teach.id, it.entry);
|
|
122
|
+
}
|
|
123
|
+
BOOKS.set(ds, { catalogSize, bySpell });
|
|
124
|
+
return bySpell;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** The book whose on-use teaches `spellId`, when the catalogue holds one. */
|
|
128
|
+
export function spellTeachBook(ds: DataStore, spellId: number): ItemDef | undefined {
|
|
129
|
+
const entry = bookIndex(ds).get(spellId | 0);
|
|
130
|
+
return entry != null ? ds.item(entry) : undefined;
|
|
131
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// Food and drink the bags have OUTGROWN. Multi sell's "Food and drink" box exists so a fresh player
|
|
2
|
+
// never vendors the stack the next pull needs — but at 60 that box also guards the Tough Jerky and
|
|
3
|
+
// the Refreshing Spring Water nobody has eaten since Westfall.
|
|
4
|
+
//
|
|
5
|
+
// Rank comes off the RequiredLevel gate the ladder is built on (item_template.RequiredLevel, mirrored
|
|
6
|
+
// into the bake as consumable.reqLevel). Measured over the 17,603-row catalog, the gates are
|
|
7
|
+
// food 1/5/(10,12)/15/(20)/25/(26)/35/(40)/45/(53)/55 and drink 1/(4)/5/15/25/35/(40)/45/(54)/55, so
|
|
8
|
+
// a decade bucket puts each real gate on its own rank and folds the strays onto the gate they sit
|
|
9
|
+
// beside — no table to keep in step with a re-bake.
|
|
10
|
+
|
|
11
|
+
import type { DataStore } from '../../data/dataStore.ts';
|
|
12
|
+
import type { ItemDef } from '../../data/schema.ts';
|
|
13
|
+
import type { Inventory } from './inventory.ts';
|
|
14
|
+
|
|
15
|
+
/** How far below the best rank in the bags a stack has to fall before it is vendor stock. */
|
|
16
|
+
export const FOOD_TIER_MARGIN = 1;
|
|
17
|
+
|
|
18
|
+
/** Rank of a food/drink gate. Cite: item_template.RequiredLevel; the gate histogram above. */
|
|
19
|
+
export function foodDrinkTier(reqLevel: number): number {
|
|
20
|
+
return Math.floor(Math.max(0, reqLevel | 0) / 10);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** The gate this stack is actually held behind — the bake's own stamp first, then the item row. */
|
|
24
|
+
export function foodDrinkReqLevel(it: ItemDef): number {
|
|
25
|
+
return Math.max(it.consumable?.reqLevel ?? 0, it.requiredLevel | 0);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Only a REAL food/drink row ranks. Raw meat and fish carry item_template.FoodType with no
|
|
29
|
+
// consumable block — that is pet food, and Feed Pet reads the same rows, so it never ranks here.
|
|
30
|
+
// A stat food (useBuff) is kept whatever its gate: it is worn for the buff, not the bite.
|
|
31
|
+
function rankedEffect(it: ItemDef | undefined): 'food' | 'drink' | null {
|
|
32
|
+
if (!it || it.useBuff != null) return null;
|
|
33
|
+
return it.consumable?.effect ?? null;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Bag entries at least `margin` ranks below the best rank of the SAME kind the bags already hold and
|
|
38
|
+
* the body can eat. Reading the bags, not the catalog, is the whole safety property: the only stack
|
|
39
|
+
* you carry is always the best one you carry, so it can never be the thing that gets sold.
|
|
40
|
+
*/
|
|
41
|
+
export function outdatedFoodDrinkEntries(
|
|
42
|
+
inv: Inventory,
|
|
43
|
+
ds: DataStore,
|
|
44
|
+
level: number,
|
|
45
|
+
margin: number = FOOD_TIER_MARGIN,
|
|
46
|
+
): Set<number> {
|
|
47
|
+
const ranked = new Map<number, { effect: 'food' | 'drink'; tier: number }>();
|
|
48
|
+
const best = new Map<'food' | 'drink', number>();
|
|
49
|
+
for (const stk of inv.stacks) {
|
|
50
|
+
if (ranked.has(stk.item)) continue;
|
|
51
|
+
const it = ds.item(stk.item);
|
|
52
|
+
const effect = rankedEffect(it);
|
|
53
|
+
if (!it || !effect) continue;
|
|
54
|
+
const req = foodDrinkReqLevel(it);
|
|
55
|
+
// Held for later, not outgrown: a gate above the body's level never sets or loses the bar.
|
|
56
|
+
if (req > level) continue;
|
|
57
|
+
const tier = foodDrinkTier(req);
|
|
58
|
+
ranked.set(it.entry, { effect, tier });
|
|
59
|
+
best.set(effect, Math.max(best.get(effect) ?? 0, tier));
|
|
60
|
+
}
|
|
61
|
+
const out = new Set<number>();
|
|
62
|
+
for (const [entry, { effect, tier }] of ranked) {
|
|
63
|
+
if ((best.get(effect) ?? 0) - tier >= margin) out.add(entry);
|
|
64
|
+
}
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// The weapon-damage ability a rotation holds down, and the DPS a weapon reaches through it: the
|
|
2
|
+
// scale prices listed DPS, the engine rolls the weapon at its real speed (weapon.ts:770). Pure.
|
|
3
|
+
|
|
4
|
+
import type { DataStore } from '../../data/dataStore.ts';
|
|
5
|
+
import type { ItemDef, SpellDef } from '../../data/schema.ts';
|
|
6
|
+
import type { SpellBook } from '../character/spellbook.ts';
|
|
7
|
+
import { SHAPESHIFT_FORM } from '../../data/schema/constants.ts';
|
|
8
|
+
import { TUNING, calculateMinMaxDamage } from '../../engine/combat/formulas.ts';
|
|
9
|
+
|
|
10
|
+
/** A resource spender that lands as a weapon hit (Sinister Strike, Cleave, Mortal Strike). */
|
|
11
|
+
export interface WeaponSpender {
|
|
12
|
+
spellId: number;
|
|
13
|
+
/** SpellDef.cost — energy per cast. */
|
|
14
|
+
cost: number;
|
|
15
|
+
/** weapon_percent_damage pct; 100 for a plain weapon hit (SS r8 = roll + strikeBonus 68). */
|
|
16
|
+
pct: number;
|
|
17
|
+
/** SpellDef.rank, the tie-break when several ranks are known. */
|
|
18
|
+
rank: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// A spell whose damage IS the weapon roll: strikeBonus is the DBC basePoints on
|
|
22
|
+
// SPELL_EFFECT_WEAPON_DAMAGE* and weapon_percent_damage multiplies that roll (weapon.ts:775-779).
|
|
23
|
+
function weaponHitPct(sp: SpellDef): number | null {
|
|
24
|
+
const pctEff = (sp.effects ?? []).find((e) => e.kind === 'weapon_percent_damage');
|
|
25
|
+
if (pctEff) {
|
|
26
|
+
const pct = (pctEff as { pct?: number }).pct ?? 0;
|
|
27
|
+
return pct > 0 ? pct : null;
|
|
28
|
+
}
|
|
29
|
+
return sp.strikeBonus != null ? 100 : null;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Held-down means castable from the front, out of stealth, off cooldown: the schema gates that rule
|
|
33
|
+
// out Backstab and Ambush (requiresBehind / requiresStealth) and Riposte (cooldownMs).
|
|
34
|
+
function isSpammable(sp: SpellDef): boolean {
|
|
35
|
+
if (sp.requiresBehind || sp.requiresStealth) return false;
|
|
36
|
+
return (sp.cooldownMs || 0) === 0;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// SpellEntry.Stances bit for the forms that replace weapon damage with a level×speed band
|
|
40
|
+
// (forms.ts:79 isAttackSpeedOverriddenShapeShift): cat, bear, dire bear.
|
|
41
|
+
const FORM_OVERRIDES_WEAPON_MASK =
|
|
42
|
+
(1 << (SHAPESHIFT_FORM.CAT - 1))
|
|
43
|
+
| (1 << (SHAPESHIFT_FORM.BEAR - 1))
|
|
44
|
+
| (1 << (SHAPESHIFT_FORM.DIREBEAR - 1));
|
|
45
|
+
|
|
46
|
+
// A spender castable ONLY inside such a form (a druid's Claw) rolls that band and never this
|
|
47
|
+
// weapon, so its weapon keeps the listed-DPS ranking.
|
|
48
|
+
function rollsTheEquippedWeapon(sp: SpellDef): boolean {
|
|
49
|
+
const stances = sp.stances ?? 0;
|
|
50
|
+
if (stances === 0) return true;
|
|
51
|
+
return (stances & ~FORM_OVERRIDES_WEAPON_MASK) !== 0;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const SPENDER_MEMO = new WeakMap<SpellBook, WeaponSpender | null>();
|
|
55
|
+
|
|
56
|
+
// The spender to price a weapon against. Energy only: TUNING.energyPerSec is a constant regen
|
|
57
|
+
// (Player.cpp POWER_ENERGY), while rage income has no sustainable rate to read here.
|
|
58
|
+
export function resolveWeaponSpender(
|
|
59
|
+
spellbook: SpellBook | undefined | null,
|
|
60
|
+
ds: Pick<DataStore, 'spell'>,
|
|
61
|
+
): WeaponSpender | null {
|
|
62
|
+
if (!spellbook) return null;
|
|
63
|
+
const hit = SPENDER_MEMO.get(spellbook);
|
|
64
|
+
if (hit !== undefined) return hit;
|
|
65
|
+
let best: WeaponSpender | null = null;
|
|
66
|
+
for (const id of spellbook.known) {
|
|
67
|
+
let sp: SpellDef | undefined;
|
|
68
|
+
try {
|
|
69
|
+
sp = ds.spell(id);
|
|
70
|
+
} catch {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (!sp || sp.powerType !== 'energy' || !(sp.cost > 0)) continue;
|
|
74
|
+
if (!isSpammable(sp) || !rollsTheEquippedWeapon(sp)) continue;
|
|
75
|
+
const pct = weaponHitPct(sp);
|
|
76
|
+
if (pct == null) continue;
|
|
77
|
+
const cand: WeaponSpender = { spellId: sp.id, cost: sp.cost, pct, rank: sp.rank ?? 0 };
|
|
78
|
+
if (!best || pct > best.pct || (pct === best.pct && cand.rank > best.rank)) best = cand;
|
|
79
|
+
}
|
|
80
|
+
SPENDER_MEMO.set(spellbook, best);
|
|
81
|
+
return best;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Listed weapon DPS — what the weightscale prices today (playerbotStatWeight mledps). */
|
|
85
|
+
export function listedWeaponDps(it: ItemDef): number {
|
|
86
|
+
const w = it.weapon;
|
|
87
|
+
if (!w) return 0;
|
|
88
|
+
const speedSec = (w.delayMs || 2000) / 1000;
|
|
89
|
+
return (w.dmgMin + w.dmgMax) / 2 / speedSec;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// DPS the spender adds, in the unit the scale prices: the engine's own ability roll at the weapon's
|
|
93
|
+
// real speed, at the rate the resource allows. The flat strikeBonus is weapon-independent, so it is out.
|
|
94
|
+
export function spenderWeaponDps(
|
|
95
|
+
it: ItemDef,
|
|
96
|
+
attackPower: number,
|
|
97
|
+
spender: WeaponSpender | null | undefined,
|
|
98
|
+
): number {
|
|
99
|
+
const w = it.weapon;
|
|
100
|
+
if (!w || !spender || !(spender.cost > 0)) return 0;
|
|
101
|
+
const castsPerSec = TUNING.energyPerSec / spender.cost;
|
|
102
|
+
const range = calculateMinMaxDamage({
|
|
103
|
+
weaponMin: w.dmgMin,
|
|
104
|
+
weaponMax: w.dmgMax,
|
|
105
|
+
attackPower,
|
|
106
|
+
speedMs: w.delayMs || 2000,
|
|
107
|
+
});
|
|
108
|
+
const perCast = ((range.min + range.max) / 2) * (spender.pct / 100);
|
|
109
|
+
return castsPerSec * perCast;
|
|
110
|
+
}
|