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,677 @@
|
|
|
1
|
+
// Professions: gathering and crafting. Pure and deterministic — every random outcome comes from an
|
|
2
|
+
// injected Rng. The gold, skill and bag math is here; what is reachable or stocked is the caller's.
|
|
3
|
+
|
|
4
|
+
import type { Character } from '../character/character.ts';
|
|
5
|
+
import type { Inventory } from '../items/inventory.ts';
|
|
6
|
+
import { addItem, addInstance, removeItem, countItem, canFit } from '../items/inventory.ts';
|
|
7
|
+
import { equippedEntry } from '../items/itemInstance.ts';
|
|
8
|
+
import { equipItem } from '../items/equipment.ts';
|
|
9
|
+
import type { LootDrop } from '../items/loot.ts';
|
|
10
|
+
import type { Rng } from '../../engine/core/rng.ts';
|
|
11
|
+
import type {
|
|
12
|
+
RecipeDef, GatherNodeDef, ProfessionDef, ProfessionRank, SkillLine, SkillCurve,
|
|
13
|
+
} from '../../data/schema.ts';
|
|
14
|
+
import { SKILL_LINE_BY_ID } from '../../data/schema/profession.ts';
|
|
15
|
+
import type { DataStore } from '../../data/dataStore.ts';
|
|
16
|
+
import type { SpellBook } from '../character/spellbook.ts';
|
|
17
|
+
import { skillBonusFor } from '../character/characterRatings.ts';
|
|
18
|
+
import { createItemInstance, type CreateItemData, type CreateItemOpts } from '../items/createItem.ts';
|
|
19
|
+
import { INSTANT_POISON_R1, isPoisonsProfession } from './poisons.ts';
|
|
20
|
+
import { recipeCooldownRemainingMs, type CraftCooldownMaps } from './craftCooldown.ts';
|
|
21
|
+
|
|
22
|
+
export interface Check {
|
|
23
|
+
ok: boolean;
|
|
24
|
+
reason?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface CharResult extends Check {
|
|
27
|
+
char: Character;
|
|
28
|
+
}
|
|
29
|
+
export interface CraftResult extends Check {
|
|
30
|
+
char: Character;
|
|
31
|
+
inventory: Inventory;
|
|
32
|
+
produced?: LootDrop; // what was made (on success)
|
|
33
|
+
skillUp?: number; // new skill value if a point was gained
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// ---- The orange/yellow/green/gray skill-up curve --------------------------
|
|
37
|
+
|
|
38
|
+
/** WoW difficulty colour of an action at a given skill. 'locked' = below requirement. */
|
|
39
|
+
export type SkillColor = 'locked' | 'orange' | 'yellow' | 'green' | 'gray';
|
|
40
|
+
|
|
41
|
+
export function actionColor(skill: number, c: SkillCurve): SkillColor {
|
|
42
|
+
if (skill < c.orange) return 'locked';
|
|
43
|
+
if (skill < c.yellow) return 'orange';
|
|
44
|
+
if (skill < c.green) return 'yellow';
|
|
45
|
+
if (skill < c.gray) return 'green';
|
|
46
|
+
return 'gray';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Chance (0..1) that an action of the given colour grants a skill point. */
|
|
50
|
+
export function skillUpChance(color: SkillColor): number {
|
|
51
|
+
switch (color) {
|
|
52
|
+
case 'orange': return 1;
|
|
53
|
+
case 'yellow': return 0.66;
|
|
54
|
+
case 'green': return 0.33;
|
|
55
|
+
default: return 0; // gray / locked
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// How the skill-up chance is read off `curve`. 'auto' routes the way {@link gainSkill} does:
|
|
60
|
+
// mining/skinning take the gather shift, everything else the orange/yellow/green/gray colours.
|
|
61
|
+
export type SkillGainMode = 'auto' | 'craft' | 'gather';
|
|
62
|
+
|
|
63
|
+
// The chance in tenths of a percent a skill-up roll would use — the SAME number the grant then
|
|
64
|
+
// rolls against. 0 means no roll at all, and fishing is an accumulator, so 0 there is not a no.
|
|
65
|
+
export function skillGainTenths(
|
|
66
|
+
line: SkillLine,
|
|
67
|
+
cur: { current: number; max: number },
|
|
68
|
+
curve: SkillCurve,
|
|
69
|
+
mode: SkillGainMode = 'auto',
|
|
70
|
+
): number {
|
|
71
|
+
if (cur.current >= cur.max) return 0;
|
|
72
|
+
const how = mode !== 'auto'
|
|
73
|
+
? mode
|
|
74
|
+
: (line === 'mining' || line === 'skinning')
|
|
75
|
+
? 'gather'
|
|
76
|
+
: line === 'fishing'
|
|
77
|
+
? 'fishing'
|
|
78
|
+
: 'craft';
|
|
79
|
+
if (how === 'fishing') return 0;
|
|
80
|
+
if (how === 'gather') {
|
|
81
|
+
// SkillGainChance * Multiplicator(1), then >> (SkillValue / 75). Cite Player.cpp:5117, 5123.
|
|
82
|
+
const base = gatherSkillGainChanceTenths(cur.current, curve.orange);
|
|
83
|
+
return base >> Math.floor(cur.current / GATHER_SKILL_CHANCE_STEPS);
|
|
84
|
+
}
|
|
85
|
+
return Math.round(skillUpChance(actionColor(cur.current, curve)) * 1000);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Roll a skill-up for `line` against `curve`, returning the advanced char and the new value. A cap
|
|
89
|
+
// or gray action is a no-op that consumes no randomness, so gray grinding cannot perturb the seed.
|
|
90
|
+
export function gainSkill(
|
|
91
|
+
char: Character,
|
|
92
|
+
line: SkillLine,
|
|
93
|
+
curve: SkillCurve,
|
|
94
|
+
rng: Rng,
|
|
95
|
+
): { char: Character; up?: number } {
|
|
96
|
+
// Gather skill-ups for mining/skinning: Player.cpp UpdateGatherSkill (RedLevel = node orange).
|
|
97
|
+
if (line === 'mining' || line === 'skinning') {
|
|
98
|
+
return gainGatherSkill(char, line, curve.orange, rng);
|
|
99
|
+
}
|
|
100
|
+
// Fishing: Player.cpp UpdateFishingSkill — not a color curve.
|
|
101
|
+
if (line === 'fishing') {
|
|
102
|
+
const r = gainFishingSkill(char);
|
|
103
|
+
return { char: r.char, up: r.up };
|
|
104
|
+
}
|
|
105
|
+
return gainCraftSkill(char, line, curve, rng);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Craft or enchant skill-up on the color curve, with NO gather shift. Crafts must call this
|
|
109
|
+
// directly: a smelting recipe carries skill 'mining' and gainSkill would halve its ups.
|
|
110
|
+
export function gainCraftSkill(
|
|
111
|
+
char: Character,
|
|
112
|
+
line: SkillLine,
|
|
113
|
+
curve: SkillCurve,
|
|
114
|
+
rng: Rng,
|
|
115
|
+
): { char: Character; up?: number } {
|
|
116
|
+
const cur = char.skills[line];
|
|
117
|
+
if (!cur) return { char };
|
|
118
|
+
const tenths = skillGainTenths(line, cur, curve, 'craft');
|
|
119
|
+
if (tenths <= 0 || !rng.chance(tenths / 1000)) return { char };
|
|
120
|
+
const value = cur.current + 1;
|
|
121
|
+
return { char: { ...char, skills: { ...char.skills, [line]: { ...cur, current: value } } }, up: value };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// ---- Gather skill-up (CMaNGOS UpdateGatherSkill) ---------------------------
|
|
125
|
+
// Mining and skinning shift chance >> (SkillValue / 75). Cite: Player.cpp:5098–5126; World.cpp:631.
|
|
126
|
+
|
|
127
|
+
/** Classic SkillChance.MiningSteps / SkillChance.SkinningSteps default (World.cpp:631–632). */
|
|
128
|
+
export const GATHER_SKILL_CHANCE_STEPS = 75;
|
|
129
|
+
|
|
130
|
+
// CMaNGOS SkillGainChance in tenths of a percent for a 1..1000 roll, with gray = red+100,
|
|
131
|
+
// green = red+50, yellow = red+25. RedLevel 1 is rewritten to 5 so low nodes gray at 105.
|
|
132
|
+
export function gatherSkillGainChanceTenths(skillValue: number, redLevel: number): number {
|
|
133
|
+
let red = redLevel;
|
|
134
|
+
if (red === 1) red = 5; // Player.cpp:5104–5105
|
|
135
|
+
const grayLevel = red + 100;
|
|
136
|
+
const greenLevel = red + 50;
|
|
137
|
+
const yellowLevel = red + 25;
|
|
138
|
+
if (skillValue >= grayLevel) return 0; // grey * 10
|
|
139
|
+
if (skillValue >= greenLevel) return 25 * 10;
|
|
140
|
+
if (skillValue >= yellowLevel) return 75 * 10;
|
|
141
|
+
return 100 * 10; // orange
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// Mining and skinning skill-up: the color chance from RedLevel, then chance >> (skill / 75).
|
|
145
|
+
// `redLevel` is the node's orange requirement. Pure — it uses the injected rng only.
|
|
146
|
+
export function gainGatherSkill(
|
|
147
|
+
char: Character,
|
|
148
|
+
line: SkillLine,
|
|
149
|
+
redLevel: number,
|
|
150
|
+
rng: Rng,
|
|
151
|
+
): { char: Character; up?: number } {
|
|
152
|
+
const cur = char.skills[line];
|
|
153
|
+
if (!cur) return { char };
|
|
154
|
+
const chance = skillGainTenths(line, cur, { orange: redLevel, yellow: 0, green: 0, gray: 0 }, 'gather');
|
|
155
|
+
// UpdateSkillPro: Chance <= 0 → miss without roll (Player.cpp:5170–5173).
|
|
156
|
+
// irand(1,1000) <= Chance ≡ uniform success probability Chance/1000.
|
|
157
|
+
if (chance <= 0 || !rng.chance(chance / 1000)) return { char };
|
|
158
|
+
const value = cur.current + 1;
|
|
159
|
+
return { char: { ...char, skills: { ...char.skills, [line]: { ...cur, current: value } } }, up: value };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// ---- Fishing skill-up (CMaNGOS UpdateFishingSkill) -------------------------
|
|
163
|
+
// Cite: Player.cpp:5131–5163. m_fishingSteps is Character.fishingSteps, not a CharacterSkill.
|
|
164
|
+
|
|
165
|
+
/** Player.cpp:5131–5141 GetFishingStepsNeededToLevelUp. */
|
|
166
|
+
export function fishingStepsNeededToLevelUp(skillValue: number): number {
|
|
167
|
+
if (skillValue < 75) return 1;
|
|
168
|
+
if (skillValue <= 300) return Math.floor(skillValue / 44);
|
|
169
|
+
return Math.floor(skillValue / 31);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Exact fishing step accumulator: increment steps, and at stepsNeeded grant +1 and reset to 0.
|
|
173
|
+
// No RNG — the C++ UpdateSkillPro at 100*10 after the threshold always succeeds.
|
|
174
|
+
export function advanceFishingSkill(
|
|
175
|
+
char: Character,
|
|
176
|
+
steps: number,
|
|
177
|
+
): { char: Character; up?: number; steps: number } {
|
|
178
|
+
const cur = char.skills.fishing;
|
|
179
|
+
if (!cur || cur.current >= cur.max) return { char, steps: 0 };
|
|
180
|
+
const needed = fishingStepsNeededToLevelUp(cur.current);
|
|
181
|
+
const next = steps + 1;
|
|
182
|
+
if (next < needed) return { char, steps: next };
|
|
183
|
+
const value = cur.current + 1;
|
|
184
|
+
return {
|
|
185
|
+
char: { ...char, skills: { ...char.skills, fishing: { ...cur, current: value } } },
|
|
186
|
+
up: value,
|
|
187
|
+
steps: 0,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Live fishing skill-up: persist `m_fishingSteps` on the character. Cite: Player.cpp:5143–5163
|
|
192
|
+
// UpdateFishingSkill; UpdateSkillPro 100*10 always succeeds.
|
|
193
|
+
export function gainFishingSkill(char: Character): { char: Character; up?: number } {
|
|
194
|
+
const r = advanceFishingSkill(char, char.fishingSteps ?? 0);
|
|
195
|
+
return { char: { ...r.char, fishingSteps: r.steps }, up: r.up };
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// ---- Gathering ------------------------------------------------------------
|
|
199
|
+
|
|
200
|
+
/** CMaNGOS skill-line id for a SkillLine key (mining=186, …). */
|
|
201
|
+
export function skillIdForLine(line: SkillLine): number | undefined {
|
|
202
|
+
for (const [id, l] of Object.entries(SKILL_LINE_BY_ID)) {
|
|
203
|
+
if (l === line) return Number(id);
|
|
204
|
+
}
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// GetSkillValue for a profession line: pure trained + MOD_SKILL (SIE gloves / auras). Cite: Player.h
|
|
209
|
+
// GetSkillValue; SpellAuras HandleAuraModSkill; KI-935.
|
|
210
|
+
export function professionSkillValue(
|
|
211
|
+
char: Character,
|
|
212
|
+
line: SkillLine,
|
|
213
|
+
ds?: DataStore | null,
|
|
214
|
+
sb?: SpellBook | null,
|
|
215
|
+
): number | undefined {
|
|
216
|
+
const pure = char.skills[line]?.current;
|
|
217
|
+
if (pure == null) return undefined;
|
|
218
|
+
if (!ds) return pure;
|
|
219
|
+
const sid = skillIdForLine(line);
|
|
220
|
+
return sid ? pure + skillBonusFor(char, ds, sid, sb) : pure;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/** @param skillValue optional GetSkillValue; defaults to trained current. Cite: KI-935. */
|
|
224
|
+
export function canGather(char: Character, node: GatherNodeDef, skillValue?: number): Check {
|
|
225
|
+
const skill = char.skills[node.skill];
|
|
226
|
+
if (!skill) return { ok: false, reason: `Requires ${node.skill}` };
|
|
227
|
+
const value = skillValue ?? skill.current;
|
|
228
|
+
if (value < node.orange) return { ok: false, reason: `Requires ${node.skill} skill ${node.orange}` };
|
|
229
|
+
return { ok: true };
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/** Roll a node's yields — each entry an independent chance, like ungrouped loot. */
|
|
233
|
+
export function rollGather(node: GatherNodeDef, rng: Rng): LootDrop[] {
|
|
234
|
+
const out: LootDrop[] = [];
|
|
235
|
+
for (const y of node.yield) {
|
|
236
|
+
if (y.chance > 0 && rng.chance(y.chance / 100)) {
|
|
237
|
+
out.push({ item: y.item, count: rng.int(y.minCount, y.maxCount) });
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return out;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// ---- Node charges & respawn (depletion) -----------------------------------
|
|
244
|
+
// Real counts are baked per node; these per-skill defaults only cover data predating that field.
|
|
245
|
+
|
|
246
|
+
/** Fallback respawn delay when a node doesn't bake its own `cooldownMs`. */
|
|
247
|
+
export const DEFAULT_GATHER_COOLDOWN_MS = 120_000; // 2 minutes
|
|
248
|
+
const DEFAULT_CHARGES: Partial<Record<SkillLine, [number, number]>> = {
|
|
249
|
+
mining: [2, 4], herbalism: [1, 1], fishing: [3, 3], skinning: [1, 1],
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
/** Runtime state of a placed node: charges left on this spawn + when it respawns. */
|
|
253
|
+
export interface NodeState {
|
|
254
|
+
charges: number; // harvests remaining before it depletes (0 => spent)
|
|
255
|
+
readyAt: number; // ms timestamp the depleted node respawns (0 => already up)
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/** The [min,max] harvests a fresh spawn of this node holds. */
|
|
259
|
+
export function nodeChargeRange(node: GatherNodeDef): [number, number] {
|
|
260
|
+
return node.charges ?? DEFAULT_CHARGES[node.skill] ?? [1, 1];
|
|
261
|
+
}
|
|
262
|
+
/** Respawn delay for a depleted node. */
|
|
263
|
+
export function nodeCooldownMs(node: GatherNodeDef): number {
|
|
264
|
+
return node.cooldownMs ?? DEFAULT_GATHER_COOLDOWN_MS;
|
|
265
|
+
}
|
|
266
|
+
/** Roll the charge count for a fresh spawn (random within the node's range). */
|
|
267
|
+
export function rollCharges(node: GatherNodeDef, rng: Rng): number {
|
|
268
|
+
const [lo, hi] = nodeChargeRange(node);
|
|
269
|
+
return rng.int(lo, hi);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Whether a node can be harvested right now. A node never touched, or one still holding charges,
|
|
273
|
+
// is ready; a depleted one waits for readyAt and then respawns with re-rolled charges.
|
|
274
|
+
export function nodeReady(state: NodeState | undefined, nowMs: number): boolean {
|
|
275
|
+
if (!state) return true;
|
|
276
|
+
if (state.charges > 0) return true;
|
|
277
|
+
return state.readyAt <= nowMs;
|
|
278
|
+
}
|
|
279
|
+
/** Ms until a depleted node respawns (0 if it's already available). */
|
|
280
|
+
export function respawnRemainingMs(state: NodeState | undefined, nowMs: number): number {
|
|
281
|
+
if (nodeReady(state, nowMs)) return 0;
|
|
282
|
+
return Math.max(0, state!.readyAt - nowMs);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** ItemPrototype.h ITEM_SUBCLASS_WEAPON_FISHING_POLE. */
|
|
286
|
+
export const ITEM_SUBCLASS_WEAPON_FISHING_POLE = 20;
|
|
287
|
+
|
|
288
|
+
/** A fishing-pole item — typeName or weapon subclass 20, not a name regex (guns/grenades match that). */
|
|
289
|
+
export function isFishingPole(item: {
|
|
290
|
+
typeName?: string;
|
|
291
|
+
itemClass?: number;
|
|
292
|
+
itemSubclass?: number;
|
|
293
|
+
weaponSubclass?: number;
|
|
294
|
+
} | undefined): boolean {
|
|
295
|
+
if (!item) return false;
|
|
296
|
+
if (item.typeName === 'Fishing Pole') return true;
|
|
297
|
+
if (item.weaponSubclass === ITEM_SUBCLASS_WEAPON_FISHING_POLE) return true;
|
|
298
|
+
return item.itemClass === 2 && item.itemSubclass === ITEM_SUBCLASS_WEAPON_FISHING_POLE;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export function fishingPoleEquipped(char: Character, ds: DataStore): boolean {
|
|
302
|
+
return Object.values(char.equipped).some((v) => {
|
|
303
|
+
const e = equippedEntry(v);
|
|
304
|
+
return e != null && isFishingPole(ds.item(e));
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
export function fishingPoleBagEntry(inv: Inventory, ds: DataStore): number | undefined {
|
|
309
|
+
for (const s of inv.stacks) {
|
|
310
|
+
if (isFishingPole(ds.item(s.item))) return s.item;
|
|
311
|
+
}
|
|
312
|
+
return undefined;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// Equip a bagged pole when none is worn. Fishing spells require EquippedItem subclass 20. Cite: Spell.cpp
|
|
316
|
+
// TotemCategory / EquippedItem*; ItemPrototype.h subclass 20.
|
|
317
|
+
export function ensureFishingPoleEquipped(
|
|
318
|
+
char: Character,
|
|
319
|
+
inv: Inventory,
|
|
320
|
+
ds: DataStore,
|
|
321
|
+
): { ok: true; char: Character; inventory: Inventory } | { ok: false } {
|
|
322
|
+
if (fishingPoleEquipped(char, ds)) return { ok: true, char, inventory: inv };
|
|
323
|
+
const entry = fishingPoleBagEntry(inv, ds);
|
|
324
|
+
if (entry == null) return { ok: false };
|
|
325
|
+
const res = equipItem(char, inv, ds, entry);
|
|
326
|
+
if (!res.ok) return { ok: false };
|
|
327
|
+
return { ok: true, char: res.char, inventory: res.inventory };
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Mining Pick (item 2901). Vanilla 1.12 requires one in bags or equipped to mine, and only one
|
|
331
|
+
// pick exists in Classic. Cite: item 2901 "Miners need a mining pick for digging."
|
|
332
|
+
export const MINING_PICK_ENTRY = 2901;
|
|
333
|
+
|
|
334
|
+
/** A Mining Pick item — entry 2901 or name match (bags or equipped both count). */
|
|
335
|
+
export function isMiningPick(item: { entry?: number; name?: string } | undefined): boolean {
|
|
336
|
+
if (!item) return false;
|
|
337
|
+
if (item.entry === MINING_PICK_ENTRY) return true;
|
|
338
|
+
return /mining pick/i.test(item.name ?? '');
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// Skinning Knife (item 7005), required in bags or equipped to skin — the same tool gate as the
|
|
342
|
+
// pick and the pole. Cite: SharedDefines.h TC_SKINNING_KNIFE=1; Spell.cpp TotemCategory.
|
|
343
|
+
export const SKINNING_KNIFE_ENTRY = 7005;
|
|
344
|
+
|
|
345
|
+
/** A Skinning Knife — entry 7005 or name match (bags or equipped both count). */
|
|
346
|
+
export function isSkinningKnife(item: { entry?: number; name?: string } | undefined): boolean {
|
|
347
|
+
if (!item) return false;
|
|
348
|
+
if (item.entry === SKINNING_KNIFE_ENTRY) return true;
|
|
349
|
+
return /skinning knife/i.test(item.name ?? '');
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// ---- Crafting -------------------------------------------------------------
|
|
353
|
+
|
|
354
|
+
// SpellFocusObject.dbc names for the refusal line. Only the ids recipes actually use. Cite:
|
|
355
|
+
// SpellFocusObject.dbc; measured on the 438 focus-requiring recipes.
|
|
356
|
+
const SPELL_FOCUS_NAME: Readonly<Record<number, string>> = {
|
|
357
|
+
1: 'an anvil',
|
|
358
|
+
3: 'a forge',
|
|
359
|
+
4: 'a cooking fire',
|
|
360
|
+
543: 'an alchemy lab',
|
|
361
|
+
623: 'a gnomish toolbox',
|
|
362
|
+
663: 'a goblin toolbox',
|
|
363
|
+
883: 'an inscription table',
|
|
364
|
+
1362: 'a moonwell',
|
|
365
|
+
};
|
|
366
|
+
|
|
367
|
+
// Totem1/2 item names. All 9 entries recipes use. Cite: item_template.name.
|
|
368
|
+
const TOOL_NAME: Readonly<Record<number, string>> = {
|
|
369
|
+
5956: 'Blacksmith Hammer',
|
|
370
|
+
6219: 'Arclight Spanner',
|
|
371
|
+
10498: 'Gyromatic Micro-Adjustor',
|
|
372
|
+
9149: "Philosopher's Stone",
|
|
373
|
+
11145: 'Runed Truesilver Rod',
|
|
374
|
+
6218: 'Runed Copper Rod',
|
|
375
|
+
11130: 'Runed Golden Rod',
|
|
376
|
+
16207: 'Runed Arcanite Rod',
|
|
377
|
+
6339: 'Runed Silver Rod',
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
export function canCraft(
|
|
381
|
+
char: Character,
|
|
382
|
+
inv: Inventory,
|
|
383
|
+
recipe: RecipeDef,
|
|
384
|
+
// SpellFocusObject ids the crafter can reach right now, from the zone's craftingFocus. ABSENT
|
|
385
|
+
// means no gate, so a caller that does not know where the player stands never refuses a craft.
|
|
386
|
+
focusAvailable?: ReadonlySet<number> | null,
|
|
387
|
+
// The world cooldown maps plus the clock to read them against. ABSENT means no cooldown gate, so
|
|
388
|
+
// a caller that has no world state never refuses a craft.
|
|
389
|
+
cooldowns?: (CraftCooldownMaps & { now: number }) | null,
|
|
390
|
+
// Held tools the party can reach outside `inv` (partyHeldTools). A tool is never spent, so one
|
|
391
|
+
// hammer or rod in any party bag serves every crafter.
|
|
392
|
+
sharedTools?: ReadonlySet<number> | null,
|
|
393
|
+
): Check {
|
|
394
|
+
if (!char.knownRecipes.includes(recipe.id)) return { ok: false, reason: 'Recipe not known' };
|
|
395
|
+
const skill = char.skills[recipe.skill];
|
|
396
|
+
if (!skill) return { ok: false, reason: `Requires ${recipe.skill}` };
|
|
397
|
+
if (skill.current < recipe.orange) return { ok: false, reason: `Requires ${recipe.skill} skill ${recipe.orange}` };
|
|
398
|
+
// Transmutes and Mooncloth sit on a real-time cooldown, the category one shared across all 12
|
|
399
|
+
// transmutes. Cite: Spell.cpp:4571-4578 CheckCast IsSpellReady, ahead of CheckItems.
|
|
400
|
+
if (cooldowns && recipeCooldownRemainingMs(recipe, cooldowns, cooldowns.now) > 0) {
|
|
401
|
+
return { ok: false, reason: 'Not ready yet' };
|
|
402
|
+
}
|
|
403
|
+
for (const rg of recipe.reagents) {
|
|
404
|
+
if (countItem(inv, rg.item) < rg.count) return { ok: false, reason: 'Missing reagents' };
|
|
405
|
+
}
|
|
406
|
+
// Tools are HELD, not spent: one of each Totem1/2 entry must be in the bags.
|
|
407
|
+
// Cite: Spell.cpp:6599-6615 CheckItems → SPELL_FAILED_TOTEMS.
|
|
408
|
+
for (const tool of recipe.requiredTools ?? []) {
|
|
409
|
+
if (countItem(inv, tool) < 1 && !sharedTools?.has(tool)) {
|
|
410
|
+
return { ok: false, reason: `Requires ${TOOL_NAME[tool] ?? `item ${tool}`}` };
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
// A focus-requiring craft needs the object in reach, at zone granularity: 36 of 46 zones have an
|
|
414
|
+
// anvil, so the refusal is "go to a town", not "this recipe is dead". Cite: Spell.cpp:5019.
|
|
415
|
+
const focus = recipe.requiresSpellFocus ?? 0;
|
|
416
|
+
if (focus > 0 && focusAvailable && !focusAvailable.has(focus)) {
|
|
417
|
+
return { ok: false, reason: `Requires ${SPELL_FOCUS_NAME[focus] ?? `spell focus ${focus}`}` };
|
|
418
|
+
}
|
|
419
|
+
return { ok: true };
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
// Consume the reagents, produce the item, then roll a skill-up; a failure returns the inventory
|
|
423
|
+
// untouched. With createDs the product mints via createItemInstance and may roll a suffix first.
|
|
424
|
+
export function craft(
|
|
425
|
+
char: Character,
|
|
426
|
+
inv: Inventory,
|
|
427
|
+
recipe: RecipeDef,
|
|
428
|
+
productMaxStack: number,
|
|
429
|
+
rng: Rng,
|
|
430
|
+
cap?: number,
|
|
431
|
+
createDs?: CreateItemData,
|
|
432
|
+
lookupProp?: CreateItemOpts['lookupProp'],
|
|
433
|
+
/** Reachable SpellFocusObject ids (the zone's `craftingFocus`). Absent = no focus gate. */
|
|
434
|
+
focusAvailable?: ReadonlySet<number> | null,
|
|
435
|
+
/** World cooldown maps + clock. Absent = no cooldown gate. The caller stamps them on success. */
|
|
436
|
+
cooldowns?: (CraftCooldownMaps & { now: number }) | null,
|
|
437
|
+
/** Held tools the party can reach outside `inv` (partyHeldTools). */
|
|
438
|
+
sharedTools?: ReadonlySet<number> | null,
|
|
439
|
+
): CraftResult {
|
|
440
|
+
const chk = canCraft(char, inv, recipe, focusAvailable, cooldowns, sharedTools);
|
|
441
|
+
if (!chk.ok) return { ok: false, reason: chk.reason, char, inventory: inv };
|
|
442
|
+
// Work on a copy so a bag-space failure after removing reagents can't corrupt the bags.
|
|
443
|
+
let working = inv;
|
|
444
|
+
for (const rg of recipe.reagents) working = removeItem(working, rg.item, rg.count)[0];
|
|
445
|
+
// num_to_add = irand(baseDice, dieSides) + bp, clamped to the item's stack: Iron Grenade makes
|
|
446
|
+
// 2-4, not a flat 2. Cite: SpellEffects.cpp:1971-1978; Object.cpp:2949.
|
|
447
|
+
const pLo = Math.max(1, recipe.product.count | 0);
|
|
448
|
+
const pHi = Math.max(pLo, (recipe.product.countMax ?? pLo) | 0);
|
|
449
|
+
const produced = Math.min(productMaxStack, pHi > pLo ? rng.int(pLo, pHi) : pLo);
|
|
450
|
+
if (!canFit(working, recipe.product.item, produced, productMaxStack, cap)) {
|
|
451
|
+
return { ok: false, reason: 'Not enough bag space', char, inventory: inv };
|
|
452
|
+
}
|
|
453
|
+
if (createDs) {
|
|
454
|
+
const inst = createItemInstance(
|
|
455
|
+
recipe.product.item,
|
|
456
|
+
produced,
|
|
457
|
+
createDs,
|
|
458
|
+
rng,
|
|
459
|
+
{ lookupProp },
|
|
460
|
+
);
|
|
461
|
+
working = addInstance(working, inst, productMaxStack);
|
|
462
|
+
} else {
|
|
463
|
+
working = addItem(working, recipe.product.item, produced, productMaxStack);
|
|
464
|
+
}
|
|
465
|
+
// Crafts stay on the color curve even when recipe.skill is a gather line (e.g. smelting
|
|
466
|
+
// is skill:'mining'): use gainCraftSkill directly so the gather >>(skill/75) shift never applies.
|
|
467
|
+
const gain = gainCraftSkill(char, recipe.skill, recipe, rng);
|
|
468
|
+
return {
|
|
469
|
+
ok: true, char: gain.char, inventory: working,
|
|
470
|
+
produced: { item: recipe.product.item, count: produced }, skillUp: gain.up,
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
// ---- Trainers: learning professions and recipes ---------------------------
|
|
475
|
+
|
|
476
|
+
/** The rank the character currently holds in a profession (undefined if untrained). */
|
|
477
|
+
export function currentRank(char: Character, prof: ProfessionDef): ProfessionRank | undefined {
|
|
478
|
+
const cur = char.skills[prof.id];
|
|
479
|
+
if (!cur) return undefined;
|
|
480
|
+
let best: ProfessionRank | undefined;
|
|
481
|
+
for (const r of prof.ranks) if (r.cap <= cur.max) best = r;
|
|
482
|
+
return best ?? prof.ranks[0];
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/** The next rank the character could train (undefined if untrained → the first rank). */
|
|
486
|
+
export function nextRank(char: Character, prof: ProfessionDef): ProfessionRank | undefined {
|
|
487
|
+
if (isPoisonsProfession(prof.id)) return undefined;
|
|
488
|
+
const cur = char.skills[prof.id];
|
|
489
|
+
return cur ? prof.ranks.find((r) => r.cap > cur.max) : prof.ranks[0];
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// ---- Secondary book-only ranks (vanilla 1.12) --------------------------------
|
|
493
|
+
// Cooking, First Aid and Fishing trainers teach ranks 1–2 only; Expert and Artisan come from books.
|
|
494
|
+
|
|
495
|
+
/** Journeyman skill cap — highest secondary rank taught by profession trainers. */
|
|
496
|
+
export const SECONDARY_TRAINER_MAX_CAP = 150;
|
|
497
|
+
|
|
498
|
+
/** True when this secondary rank is only obtainable from a tier book, not a trainer. */
|
|
499
|
+
export function isSecondaryBookOnlyRank(prof: ProfessionDef, rank: ProfessionRank): boolean {
|
|
500
|
+
return prof.kind === 'secondary' && rank.cap > SECONDARY_TRAINER_MAX_CAP;
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
/** Next rank a profession *trainer* can teach (secondaries stop at Journeyman). */
|
|
504
|
+
export function nextTrainerRank(char: Character, prof: ProfessionDef): ProfessionRank | undefined {
|
|
505
|
+
const next = nextRank(char, prof);
|
|
506
|
+
if (!next || isSecondaryBookOnlyRank(prof, next)) return undefined;
|
|
507
|
+
return next;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
// ---- Rank-up skill gates (classic npc_trainer.reqskillvalue) ----------------
|
|
511
|
+
// Journeyman, Expert and Artisan need 50 / 125 / 200 — 25 under the current cap. Apprentice needs 0.
|
|
512
|
+
|
|
513
|
+
/** Points below the current rank's skill cap required to train the next rank. */
|
|
514
|
+
export const RANK_UP_SKILL_MARGIN = 25;
|
|
515
|
+
|
|
516
|
+
// Minimum profession skill to train the next rank while holding `currentMax` as the cap: 75 → 50,
|
|
517
|
+
// 150 → 125, 225 → 200. Returns 0 on a first learn or a non-positive margin.
|
|
518
|
+
export function rankUpReqSkill(currentMax: number): number {
|
|
519
|
+
if (currentMax <= 0) return 0;
|
|
520
|
+
return Math.max(0, (currentMax | 0) - RANK_UP_SKILL_MARGIN);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
// Effective skill requirement for training `next` while holding `cur`, undefined when untrained.
|
|
524
|
+
// Prefers the baked next.reqSkill when it is present and above 0, else the classic margin.
|
|
525
|
+
export function nextRankReqSkill(
|
|
526
|
+
next: ProfessionRank,
|
|
527
|
+
cur: { current: number; max: number } | undefined,
|
|
528
|
+
): number {
|
|
529
|
+
if (!cur) return 0; // first rank — no prior skill
|
|
530
|
+
const baked = (next.reqSkill ?? 0) | 0;
|
|
531
|
+
if (baked > 0) return baked;
|
|
532
|
+
return rankUpReqSkill(cur.max);
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
// ---- Primary profession cap (CMaNGOS MaxPrimaryTradeSkill) -----------------
|
|
536
|
+
// Default 2. Primary is the Profession skill category; cooking, first aid and fishing are exempt.
|
|
537
|
+
|
|
538
|
+
/** Classic default MaxPrimaryTradeSkill (World.cpp:583). */
|
|
539
|
+
export const MAX_PRIMARY_PROFESSIONS = 2;
|
|
540
|
+
|
|
541
|
+
/** Skill lines that count toward the primary-profession cap (gathering + crafting). */
|
|
542
|
+
const PRIMARY_SKILL_LINES: readonly SkillLine[] = [
|
|
543
|
+
'mining', 'herbalism', 'skinning',
|
|
544
|
+
'blacksmithing', 'leatherworking', 'tailoring',
|
|
545
|
+
'alchemy', 'engineering', 'enchanting',
|
|
546
|
+
];
|
|
547
|
+
|
|
548
|
+
/** True when this profession counts as primary (not cooking/firstaid/fishing). */
|
|
549
|
+
export function isPrimaryProfession(prof: ProfessionDef): boolean {
|
|
550
|
+
return prof.kind === 'gathering' || prof.kind === 'crafting';
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
/** How many primary profession lines the character has already trained. */
|
|
554
|
+
export function countPrimaryProfessions(char: Character): number {
|
|
555
|
+
let n = 0;
|
|
556
|
+
for (const line of PRIMARY_SKILL_LINES) if (char.skills[line]) n++;
|
|
557
|
+
return n;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
// Learn a profession's first rank or raise its cap, paying the cost. opts.free skips the charge
|
|
561
|
+
// for the tier-book path, where the vendor already took the book's price. Cite: Player.cpp:3410.
|
|
562
|
+
export function trainProfession(
|
|
563
|
+
char: Character,
|
|
564
|
+
prof: ProfessionDef,
|
|
565
|
+
opts?: { free?: boolean; discountMod?: number },
|
|
566
|
+
): CharResult {
|
|
567
|
+
if (isPoisonsProfession(prof.id)) {
|
|
568
|
+
return { ok: false, reason: 'Poisons is learned from a quest', char };
|
|
569
|
+
}
|
|
570
|
+
const cur = char.skills[prof.id];
|
|
571
|
+
const next = nextRank(char, prof);
|
|
572
|
+
if (!next) return { ok: false, reason: 'Nothing more to train here', char };
|
|
573
|
+
// Trainer path: secondary Expert/Artisan are book-only (KI-758). Book path passes free.
|
|
574
|
+
if (isSecondaryBookOnlyRank(prof, next) && !opts?.free) {
|
|
575
|
+
return { ok: false, reason: `${next.name} ${prof.name} is learned from a book`, char };
|
|
576
|
+
}
|
|
577
|
+
if (char.level < next.reqLevel) return { ok: false, reason: `Requires level ${next.reqLevel}`, char };
|
|
578
|
+
const price = opts?.free ? 0 : Math.floor(next.cost * (opts?.discountMod ?? 1.0));
|
|
579
|
+
if (char.gold < price) return { ok: false, reason: 'Not enough money', char };
|
|
580
|
+
// Rank-up skill gate (Player.cpp:3985–3987 GetTrainerSpellState reqSkillValue).
|
|
581
|
+
// Apprentice has no prior skill; Journeyman/Expert/Artisan need 50/125/200.
|
|
582
|
+
const needSkill = nextRankReqSkill(next, cur);
|
|
583
|
+
if (needSkill > 0 && (cur?.current ?? 0) < needSkill) {
|
|
584
|
+
return { ok: false, reason: `Requires ${prof.name} skill ${needSkill}`, char };
|
|
585
|
+
}
|
|
586
|
+
// First rank of a new primary profession only — upgrades and secondaries skip the cap.
|
|
587
|
+
// Cite: Player.cpp IsPrimaryProfessionFirstRankSpell + MaxPrimaryTradeSkill (World.cpp:583).
|
|
588
|
+
if (!cur && isPrimaryProfession(prof) && countPrimaryProfessions(char) >= MAX_PRIMARY_PROFESSIONS) {
|
|
589
|
+
return { ok: false, reason: 'You may only learn 2 primary professions', char };
|
|
590
|
+
}
|
|
591
|
+
// A brand-new profession starts at skill 1; an upgrade keeps the current value.
|
|
592
|
+
const skills = { ...char.skills, [prof.id]: { current: cur?.current ?? 1, max: next.cap } };
|
|
593
|
+
return { ok: true, char: { ...char, gold: char.gold - price, skills } };
|
|
594
|
+
}
|
|
595
|
+
|
|
596
|
+
// Unlearn a profession: drop the skill line and every recipe for it, free, releasing a primary
|
|
597
|
+
// slot. Applied gear enchants stay — you only lose the ability to apply new ones.
|
|
598
|
+
export function unlearnProfession(
|
|
599
|
+
char: Character,
|
|
600
|
+
prof: ProfessionDef,
|
|
601
|
+
recipes: readonly RecipeDef[],
|
|
602
|
+
): CharResult {
|
|
603
|
+
if (!char.skills[prof.id]) {
|
|
604
|
+
return { ok: false, reason: `You don't know ${prof.name}`, char };
|
|
605
|
+
}
|
|
606
|
+
if (isPoisonsProfession(prof.id)) {
|
|
607
|
+
return { ok: false, reason: 'You cannot unlearn Poisons', char };
|
|
608
|
+
}
|
|
609
|
+
const skills = { ...char.skills };
|
|
610
|
+
delete skills[prof.id];
|
|
611
|
+
// Forget every craft recipe for this line (trainer, vendor, drop, quest — all of them).
|
|
612
|
+
const dropRecipe = new Set(recipes.filter((r) => r.skill === prof.id).map((r) => r.id));
|
|
613
|
+
const knownRecipes = char.knownRecipes.filter((id) => !dropRecipe.has(id));
|
|
614
|
+
// Enchant formulas live only on the Enchanting skill; wipe them with the profession.
|
|
615
|
+
const knownEnchants = prof.id === 'enchanting' ? [] : char.knownEnchants;
|
|
616
|
+
return {
|
|
617
|
+
ok: true,
|
|
618
|
+
char: {
|
|
619
|
+
...char,
|
|
620
|
+
skills,
|
|
621
|
+
knownRecipes,
|
|
622
|
+
...(knownEnchants !== undefined ? { knownEnchants } : {}),
|
|
623
|
+
},
|
|
624
|
+
};
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
// Trainer-source recipes for a profession line. The bake pins each recipe to one representative
|
|
628
|
+
// trainer entry, so matching on entry alone left most capital trainers empty — match on skill.
|
|
629
|
+
export function trainerRecipesForSkill(recipes: readonly RecipeDef[], skill: SkillLine): RecipeDef[] {
|
|
630
|
+
return recipes.filter((r) => r.skill === skill && r.source === 'trainer');
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
// Free apprentice starters: orange ≤ 1 trainer recipes not yet known, granted when the line is
|
|
634
|
+
// first trained or repaired on an older save. Cite: Player LearnSkillRewardedSpells.
|
|
635
|
+
export function grantStarterRecipes(
|
|
636
|
+
char: Character,
|
|
637
|
+
skill: SkillLine,
|
|
638
|
+
recipes: readonly RecipeDef[],
|
|
639
|
+
): { char: Character; granted: RecipeDef[] } {
|
|
640
|
+
if (!char.skills[skill]) return { char, granted: [] };
|
|
641
|
+
const granted = trainerRecipesForSkill(recipes, skill).filter((r) => {
|
|
642
|
+
if (char.knownRecipes.includes(r.id)) return false;
|
|
643
|
+
if (skill === 'poisons') return r.id === INSTANT_POISON_R1;
|
|
644
|
+
return (r.orange | 0) <= 1;
|
|
645
|
+
});
|
|
646
|
+
if (!granted.length) return { char, granted: [] };
|
|
647
|
+
return {
|
|
648
|
+
char: { ...char, knownRecipes: [...char.knownRecipes, ...granted.map((r) => r.id)] },
|
|
649
|
+
granted,
|
|
650
|
+
};
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// Learn a recipe, paying its cost. The trainer path also needs skill ≥ orange; reading a Recipe
|
|
654
|
+
// item does not, since craft still gates on orange. See game.learnRecipeFromItem.
|
|
655
|
+
export function learnRecipe(
|
|
656
|
+
char: Character,
|
|
657
|
+
recipe: RecipeDef,
|
|
658
|
+
opts?: { fromItem?: boolean; discountMod?: number },
|
|
659
|
+
): CharResult {
|
|
660
|
+
if (char.knownRecipes.includes(recipe.id)) return { ok: false, reason: 'Already learned', char };
|
|
661
|
+
const skill = char.skills[recipe.skill];
|
|
662
|
+
if (!skill) return { ok: false, reason: `Requires ${recipe.skill}`, char };
|
|
663
|
+
// Classic trainer gate only — not applied when learning from a world-drop / vendor recipe item.
|
|
664
|
+
if (!opts?.fromItem && skill.current < recipe.orange) {
|
|
665
|
+
return { ok: false, reason: `Requires ${recipe.skill} skill ${recipe.orange}`, char };
|
|
666
|
+
}
|
|
667
|
+
// npc_trainer.reqlevel, the second half of the trainer gate. Poison ranks carry a real one, and
|
|
668
|
+
// skill alone let a level-20 rogue at Poisons 100 buy the level-24 rank.
|
|
669
|
+
// Cite: Player.cpp:3970 GetTrainerSpellState level check.
|
|
670
|
+
const needLevel = recipe.reqLevel ?? 0;
|
|
671
|
+
if (!opts?.fromItem && needLevel > 0 && char.level < needLevel) {
|
|
672
|
+
return { ok: false, reason: `Requires level ${needLevel}`, char };
|
|
673
|
+
}
|
|
674
|
+
const cost = Math.floor((recipe.cost ?? 0) * (opts?.discountMod ?? 1.0));
|
|
675
|
+
if (char.gold < cost) return { ok: false, reason: 'Not enough money', char };
|
|
676
|
+
return { ok: true, char: { ...char, gold: char.gold - cost, knownRecipes: [...char.knownRecipes, recipe.id] } };
|
|
677
|
+
}
|