azeroth-shell 0.0.0-stage → 0.1.1
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 +35 -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 +144 -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,221 @@
|
|
|
1
|
+
// Loot rolling, faithful to CMaNGOS LootTemplate: group 0 rows roll independently, every non-zero
|
|
2
|
+
// group yields at most one, and reference rows expand recursively. Pure, with an injected Rng.
|
|
3
|
+
|
|
4
|
+
import type { LootEntryDef } from '../../data/schema.ts';
|
|
5
|
+
import type { Rng } from '../../engine/core/rng.ts';
|
|
6
|
+
|
|
7
|
+
export interface LootDrop {
|
|
8
|
+
item: number;
|
|
9
|
+
count: number;
|
|
10
|
+
/** ItemRandomProperties id when this drop was minted with a suffix. */
|
|
11
|
+
randomPropertyId?: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// A loot row that may point at reference_loot_template. When referenceLootId is set, the row is no
|
|
15
|
+
// item drop: after its chance succeeds the referenced table is processed maxCount times.
|
|
16
|
+
export type LootEntryWithRef = LootEntryDef & {
|
|
17
|
+
referenceLootId?: number;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/** Safety depth for nested reference expansion (CMaNGOS validates cycles at load). */
|
|
21
|
+
export const DEFAULT_REFERENCE_LOOT_DEPTH = 8;
|
|
22
|
+
|
|
23
|
+
/** Optional gate for FQ3 quest-required rows + QI2.5 conditionId rows during a production roll. */
|
|
24
|
+
export type LootRollContext = {
|
|
25
|
+
// True when the player may receive this entry's quest-required drop — any active quest listing
|
|
26
|
+
// the item as an objective. When omitted, quest-required rows are skipped entirely.
|
|
27
|
+
allowsQuestDrop?: (entry: LootEntryDef) => boolean;
|
|
28
|
+
// When entry.conditionId is non-zero the row rolls only if this returns true, as LootMgr consults
|
|
29
|
+
// conditions per row. When omitted, conditionId-bearing rows are skipped: fail closed.
|
|
30
|
+
allowsCondition?: (conditionId: number, entry: LootEntryDef) => boolean;
|
|
31
|
+
// Item-level veto, checked before either gate above and whatever the chance sign is: "this
|
|
32
|
+
// looter may not have this item at all". Alterac's faction-locked quest items are the case.
|
|
33
|
+
// When omitted, nothing is vetoed.
|
|
34
|
+
allowsItem?: (itemId: number) => boolean;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/** CMaNGOS ChanceOrQuestChance: negative chance or explicit flag → quest-gated. */
|
|
38
|
+
export function isQuestRequiredLootEntry(e: LootEntryDef): boolean {
|
|
39
|
+
return e.questRequired === true || e.chance < 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Exclusive quest-container row (gated or |chance| ≥ 100). World-chest group loot is not. */
|
|
43
|
+
export function isExclusiveQuestLootRow(e: LootEntryDef): boolean {
|
|
44
|
+
return isQuestRequiredLootEntry(e) || Math.abs(e.chance) >= 100;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Dedicated quest-container row for this item. Cite: buildItemDropperMap questGatedOnly. */
|
|
48
|
+
export function lootRowIsQuestItemSource(e: LootEntryDef, itemId: number): boolean {
|
|
49
|
+
return e.item === itemId && isExclusiveQuestLootRow(e);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Roll weight / percent magnitude (always non-negative). */
|
|
53
|
+
export function lootChanceMagnitude(e: LootEntryDef): number {
|
|
54
|
+
return Math.abs(e.chance);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Whether this entry may participate in the current roll. */
|
|
58
|
+
export function isLootEntryEligible(e: LootEntryDef, ctx?: LootRollContext): boolean {
|
|
59
|
+
// QI2.5 conditionId gate (independent of signed quest-chance). Fail closed when
|
|
60
|
+
// conditionId present and no allowsCondition, or when allowsCondition returns false.
|
|
61
|
+
const cid = (e.conditionId ?? 0) | 0;
|
|
62
|
+
if (cid !== 0) {
|
|
63
|
+
if (ctx?.allowsCondition?.(cid, e) !== true) return false;
|
|
64
|
+
}
|
|
65
|
+
// A drop the looter may not have AT ALL, whatever its chance sign. Alterac's Storm Crystal is
|
|
66
|
+
// a plain +80 row in ClassicDB while its Horde twin is a -100 quest row, so the quest gate below
|
|
67
|
+
// cannot express "the other faction's quest item" — this can. Absent predicate = allow.
|
|
68
|
+
if (ctx?.allowsItem && ctx.allowsItem(e.item) !== true) return false;
|
|
69
|
+
if (!isQuestRequiredLootEntry(e)) return true;
|
|
70
|
+
return ctx?.allowsQuestDrop?.(e) === true;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function isReferenceLootEntry(e: LootEntryWithRef): boolean {
|
|
74
|
+
return (e.referenceLootId ?? 0) > 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Lookup for any loot store by id — creature loot, pickpocket, reference. The live bake uses
|
|
78
|
+
// namespaced string keys like pickpocket:<n>; fixtures may use bare numbers.
|
|
79
|
+
export type LootTableLookup = (lootId: number | string) => readonly LootEntryWithRef[] | undefined;
|
|
80
|
+
|
|
81
|
+
export function rollLoot(
|
|
82
|
+
entries: readonly LootEntryDef[],
|
|
83
|
+
rng: Rng,
|
|
84
|
+
ctx?: LootRollContext,
|
|
85
|
+
): LootDrop[] {
|
|
86
|
+
return rollLootDeep(entries, () => undefined, rng, 0, DEFAULT_REFERENCE_LOOT_DEPTH, ctx);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Roll a table with recursive reference expansion. Plain entries behave as `rollLoot`; reference rows that
|
|
90
|
+
// pass their chance process the referenced template `maxCount` times (default 1).
|
|
91
|
+
export function rollLootDeep(
|
|
92
|
+
entries: readonly LootEntryWithRef[],
|
|
93
|
+
getTable: LootTableLookup,
|
|
94
|
+
rng: Rng,
|
|
95
|
+
depth: number = 0,
|
|
96
|
+
maxDepth: number = DEFAULT_REFERENCE_LOOT_DEPTH,
|
|
97
|
+
ctx?: LootRollContext,
|
|
98
|
+
): LootDrop[] {
|
|
99
|
+
if (depth > maxDepth) return [];
|
|
100
|
+
|
|
101
|
+
const out: LootDrop[] = [];
|
|
102
|
+
const groups = new Map<number, LootEntryWithRef[]>();
|
|
103
|
+
|
|
104
|
+
for (const e of entries) {
|
|
105
|
+
if (!isLootEntryEligible(e, ctx)) continue;
|
|
106
|
+
|
|
107
|
+
if (e.groupId === 0) {
|
|
108
|
+
const mag = lootChanceMagnitude(e);
|
|
109
|
+
if (isReferenceLootEntry(e)) {
|
|
110
|
+
// Ungrouped reference: independent chance, then expand (LootMgr.cpp:2624–2645).
|
|
111
|
+
if (mag > 0 && rng.chance(mag / 100)) {
|
|
112
|
+
pushReference(out, e, getTable, rng, depth, maxDepth, ctx);
|
|
113
|
+
}
|
|
114
|
+
} else if (mag > 0 && rng.chance(mag / 100)) {
|
|
115
|
+
out.push(rollCount(e, rng));
|
|
116
|
+
}
|
|
117
|
+
} else {
|
|
118
|
+
const g = groups.get(e.groupId);
|
|
119
|
+
if (g) g.push(e);
|
|
120
|
+
else groups.set(e.groupId, [e]);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
for (const group of groups.values()) {
|
|
125
|
+
const picked = rollGroup(group, rng);
|
|
126
|
+
if (!picked) continue;
|
|
127
|
+
if (isReferenceLootEntry(picked)) {
|
|
128
|
+
pushReference(out, picked, getTable, rng, depth, maxDepth, ctx);
|
|
129
|
+
} else {
|
|
130
|
+
out.push(rollCount(picked, rng));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function pushReference(
|
|
137
|
+
out: LootDrop[],
|
|
138
|
+
ref: LootEntryWithRef,
|
|
139
|
+
getTable: LootTableLookup,
|
|
140
|
+
rng: Rng,
|
|
141
|
+
depth: number,
|
|
142
|
+
maxDepth: number,
|
|
143
|
+
ctx?: LootRollContext,
|
|
144
|
+
): void {
|
|
145
|
+
const refId = ref.referenceLootId!;
|
|
146
|
+
const table = getTable(refId);
|
|
147
|
+
if (!table) return;
|
|
148
|
+
// maxCount is the reference multiplicator (at least 1).
|
|
149
|
+
const loops = Math.max(1, ref.maxCount || 1);
|
|
150
|
+
for (let i = 0; i < loops; i++) {
|
|
151
|
+
const nested = rollLootDeep(table, getTable, rng, depth + 1, maxDepth, ctx);
|
|
152
|
+
for (const d of nested) out.push(d);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
function rollCount(e: LootEntryDef, rng: Rng): LootDrop {
|
|
157
|
+
return { item: e.item, count: rng.int(e.minCount, e.maxCount) };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Pick at most one item from a group: explicitly-chanced rows are tried first against one 0..100
|
|
161
|
+
// roll, then an equal-chanced (chance 0) row uniformly. Chances summing under 100 can yield none.
|
|
162
|
+
function rollGroup(entries: readonly LootEntryWithRef[], rng: Rng): LootEntryWithRef | null {
|
|
163
|
+
// Explicit weight: non-zero chance (positive or negative signed quest rows that passed gate).
|
|
164
|
+
const explicit = entries.filter((e) => lootChanceMagnitude(e) > 0);
|
|
165
|
+
if (explicit.length) {
|
|
166
|
+
let roll = rng.next() * 100;
|
|
167
|
+
for (const e of explicit) {
|
|
168
|
+
const mag = lootChanceMagnitude(e);
|
|
169
|
+
if (mag >= 100) return e;
|
|
170
|
+
roll -= mag;
|
|
171
|
+
if (roll < 0) return e;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// Equal-chance fallback: chance === 0 only (FQ3 — not negative quest rows).
|
|
175
|
+
const equal = entries.filter((e) => e.chance === 0);
|
|
176
|
+
return equal.length ? equal[rng.int(0, equal.length - 1)]! : null;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Structurally expand reference rows into a flat list of plain entries for previews. Does NOT
|
|
180
|
+
// roll chances — each reference expands maxCount times into copies of its rows, depth-capped.
|
|
181
|
+
export function resolveReferenceLoot(
|
|
182
|
+
entries: readonly LootEntryWithRef[],
|
|
183
|
+
getTable: LootTableLookup,
|
|
184
|
+
maxDepth: number = DEFAULT_REFERENCE_LOOT_DEPTH,
|
|
185
|
+
depth: number = 0,
|
|
186
|
+
visited: ReadonlySet<number> = new Set(),
|
|
187
|
+
): LootEntryWithRef[] {
|
|
188
|
+
if (depth > maxDepth) return [];
|
|
189
|
+
|
|
190
|
+
const out: LootEntryWithRef[] = [];
|
|
191
|
+
for (const e of entries) {
|
|
192
|
+
if (!isReferenceLootEntry(e)) {
|
|
193
|
+
out.push(e);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
const refId = e.referenceLootId!;
|
|
197
|
+
if (visited.has(refId)) continue; // cycle guard (load-time in CMaNGOS)
|
|
198
|
+
const child = getTable(refId);
|
|
199
|
+
if (!child) continue;
|
|
200
|
+
const nextVisited = new Set(visited);
|
|
201
|
+
nextVisited.add(refId);
|
|
202
|
+
const loops = Math.max(1, e.maxCount || 1);
|
|
203
|
+
for (let i = 0; i < loops; i++) {
|
|
204
|
+
const expanded = resolveReferenceLoot(child, getTable, maxDepth, depth + 1, nextVisited);
|
|
205
|
+
for (const row of expanded) out.push(row);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return out;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Load a loot chain by id (creature loot, pickpocket, reference root, …). Pickpocket tables are just
|
|
212
|
+
// another lootId — same processor (LootMgr stores).
|
|
213
|
+
export function resolveLootChain(
|
|
214
|
+
lootId: number,
|
|
215
|
+
getTable: LootTableLookup,
|
|
216
|
+
maxDepth: number = DEFAULT_REFERENCE_LOOT_DEPTH,
|
|
217
|
+
): LootEntryWithRef[] {
|
|
218
|
+
const root = getTable(lootId);
|
|
219
|
+
if (!root) return [];
|
|
220
|
+
return resolveReferenceLoot(root, getTable, maxDepth, 0, new Set([lootId]));
|
|
221
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// Mounts and Riding skill. Pure domain: a gold sink plus a travel-time fraction ported from the
|
|
2
|
+
// mount auras — aura 32 gives 60 or 100%, and travelMs = baseMs / (1 + pct/100). One mount only.
|
|
3
|
+
|
|
4
|
+
import type { Character } from '../character/character.ts';
|
|
5
|
+
import type { ItemDef } from '../../data/schema.ts';
|
|
6
|
+
import { raceClassMaskMatches } from '../character/combatSkills.ts';
|
|
7
|
+
|
|
8
|
+
/** SharedDefines.h SKILL_RIDING = 762 (unified riding line). */
|
|
9
|
+
export const SKILL_RIDING = 762;
|
|
10
|
+
|
|
11
|
+
/** Apprentice Riding skill value (SkillTiers maximized; archive 3296_spell_learn_skill). */
|
|
12
|
+
export const RIDING_RANK_APPRENTICE = 75;
|
|
13
|
+
|
|
14
|
+
/** Journeyman Riding skill value. */
|
|
15
|
+
export const RIDING_RANK_JOURNEYMAN = 150;
|
|
16
|
+
|
|
17
|
+
// Phonecraft text-RPG pacing for one zone hop. This base is authoring for a readable delay; the
|
|
18
|
+
// FRACTION under mount speed is what is sourced. Not a CMaNGOS travel-ms value.
|
|
19
|
+
export const BASE_TRAVEL_MS = 10_000;
|
|
20
|
+
|
|
21
|
+
/** Baked DataBundle.ridingSpells row (skill-GRANT spells, not SpellDefs). */
|
|
22
|
+
export interface RidingSpellRow {
|
|
23
|
+
id: number;
|
|
24
|
+
trainerSpell: number;
|
|
25
|
+
rank: number;
|
|
26
|
+
step: number;
|
|
27
|
+
cost: number;
|
|
28
|
+
reqLevel: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface Check {
|
|
32
|
+
ok: boolean;
|
|
33
|
+
reason?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface CharResult extends Check {
|
|
37
|
+
char: Character;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export interface CanTrainRidingInput {
|
|
41
|
+
level: number;
|
|
42
|
+
gold: number;
|
|
43
|
+
/** Current riding skill value (0 if untrained). */
|
|
44
|
+
currentRank: number;
|
|
45
|
+
spell: RidingSpellRow;
|
|
46
|
+
/** GetReputationPriceDiscount; default 1 so existing callers stay undiscounted. */
|
|
47
|
+
discountMod?: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Whether the character may purchase this riding rank from a trainer. Journeyman requires Apprentice first
|
|
51
|
+
// (npc_trainer reqskill 762 on 33392).
|
|
52
|
+
export function canTrainRiding(input: CanTrainRidingInput): Check {
|
|
53
|
+
const { level, gold, currentRank, spell } = input;
|
|
54
|
+
if (currentRank >= spell.rank) {
|
|
55
|
+
return { ok: false, reason: 'Already trained' };
|
|
56
|
+
}
|
|
57
|
+
// Step order: cannot train 150 without 75 (reqskill 762 on Journeyman).
|
|
58
|
+
if (spell.step > 1 && currentRank < RIDING_RANK_APPRENTICE) {
|
|
59
|
+
return { ok: false, reason: 'Requires Apprentice Riding first' };
|
|
60
|
+
}
|
|
61
|
+
if (level < spell.reqLevel) {
|
|
62
|
+
return { ok: false, reason: `Requires level ${spell.reqLevel}` };
|
|
63
|
+
}
|
|
64
|
+
const cost = Math.floor(spell.cost * (input.discountMod ?? 1));
|
|
65
|
+
if (gold < cost) {
|
|
66
|
+
return { ok: false, reason: 'Not enough money' };
|
|
67
|
+
}
|
|
68
|
+
return { ok: true };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Train a riding rank: deduct gold, snap skill to rank (SkillTiers maximized). Cite: Player.cpp
|
|
72
|
+
// SetSkillStep + SKILL_FLAG_MAXIMIZED.
|
|
73
|
+
export function trainRiding(char: Character, spell: RidingSpellRow, discountMod = 1): CharResult {
|
|
74
|
+
const currentRank = char.ridingSkill ?? 0;
|
|
75
|
+
const chk = canTrainRiding({
|
|
76
|
+
level: char.level,
|
|
77
|
+
gold: char.gold,
|
|
78
|
+
currentRank,
|
|
79
|
+
spell,
|
|
80
|
+
discountMod,
|
|
81
|
+
});
|
|
82
|
+
if (!chk.ok) return { ok: false, reason: chk.reason, char };
|
|
83
|
+
const cost = Math.floor(spell.cost * discountMod);
|
|
84
|
+
return {
|
|
85
|
+
ok: true,
|
|
86
|
+
char: {
|
|
87
|
+
...char,
|
|
88
|
+
gold: char.gold - cost,
|
|
89
|
+
ridingSkill: spell.rank,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// AllowableRace mask gate (Player.cpp CanUseItem). mask 0 / absent = unrestricted; else bit (1 << (race -
|
|
95
|
+
// 1)). Cite: raceClassMaskMatches / unitRaceOrClassMask.
|
|
96
|
+
export function raceAllowedForMount(race: number, allowableRace?: number): boolean {
|
|
97
|
+
if (allowableRace == null || allowableRace === 0) return true;
|
|
98
|
+
return raceClassMaskMatches(allowableRace, race);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface CanUseMountOpts {
|
|
102
|
+
/** Text-RPG: mounts only out of combat (non-combat cast with damage interrupt). */
|
|
103
|
+
inCombat?: boolean;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// CanUseItem-shaped mount gate: level, riding rank, race mask and out-of-combat. Ownership is the
|
|
107
|
+
// caller's. Re-using the same mount is idempotent, and a different one replaces it.
|
|
108
|
+
export function canUseMount(
|
|
109
|
+
char: Character,
|
|
110
|
+
item: ItemDef,
|
|
111
|
+
opts: CanUseMountOpts = {},
|
|
112
|
+
): Check {
|
|
113
|
+
if (item.mountSpell == null && item.mountSpeedPct == null && item.requiredRidingRank == null) {
|
|
114
|
+
return { ok: false, reason: 'Not a mount' };
|
|
115
|
+
}
|
|
116
|
+
if (opts.inCombat) {
|
|
117
|
+
return { ok: false, reason: 'Cannot mount in combat' };
|
|
118
|
+
}
|
|
119
|
+
if (item.requiredLevel != null && char.level < item.requiredLevel) {
|
|
120
|
+
return { ok: false, reason: `Requires level ${item.requiredLevel}` };
|
|
121
|
+
}
|
|
122
|
+
const needRank = item.requiredRidingRank ?? 0;
|
|
123
|
+
const have = char.ridingSkill ?? 0;
|
|
124
|
+
if (have < needRank) {
|
|
125
|
+
return {
|
|
126
|
+
ok: false,
|
|
127
|
+
reason: needRank > 0
|
|
128
|
+
? `Requires Riding skill ${needRank}`
|
|
129
|
+
: 'Requires Riding skill',
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
if (!raceAllowedForMount(char.race, item.allowableRace)) {
|
|
133
|
+
return { ok: false, reason: 'Your race cannot use this mount' };
|
|
134
|
+
}
|
|
135
|
+
return { ok: true };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Mount: one mount only (never-stack). Replaces any previous mount item. Cite: SpellStacking.cpp
|
|
139
|
+
// SPELL_AURA_MOUNTED never stacking; Unit::Mount.
|
|
140
|
+
export function mount(char: Character, item: ItemDef, opts: CanUseMountOpts = {}): CharResult {
|
|
141
|
+
const chk = canUseMount(char, item, opts);
|
|
142
|
+
if (!chk.ok) return { ok: false, reason: chk.reason, char };
|
|
143
|
+
return {
|
|
144
|
+
ok: true,
|
|
145
|
+
char: { ...char, mountedItem: item.entry },
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** Clear mounted state. Cite: Unit::Unmount. */
|
|
150
|
+
export function dismount(char: Character): CharResult {
|
|
151
|
+
if (char.mountedItem == null) {
|
|
152
|
+
return { ok: false, reason: 'Not mounted', char };
|
|
153
|
+
}
|
|
154
|
+
const next = { ...char };
|
|
155
|
+
delete next.mountedItem;
|
|
156
|
+
return { ok: true, char: next };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Effective zone-hop travel time under mounted speed: baseMs / (1 + speedPct/100), so +60% is
|
|
160
|
+
// ×1/1.6. Unmounted is identity. Cite: Unit.cpp UpdateSpeed mounted bucket.
|
|
161
|
+
export function travelTimeMs(baseMs: number, mountedSpeedPct: number | null | undefined): number {
|
|
162
|
+
if (mountedSpeedPct == null || mountedSpeedPct <= 0) return baseMs;
|
|
163
|
+
return baseMs / (1 + mountedSpeedPct / 100);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Resolve travel ms for a character given the mounted item's speed (or walk). */
|
|
167
|
+
export function travelTimeForChar(
|
|
168
|
+
baseMs: number,
|
|
169
|
+
char: Character,
|
|
170
|
+
itemOf: (entry: number) => ItemDef | undefined,
|
|
171
|
+
): number {
|
|
172
|
+
const entry = char.mountedItem;
|
|
173
|
+
if (entry == null) return travelTimeMs(baseMs, null);
|
|
174
|
+
const pct = itemOf(entry)?.mountSpeedPct;
|
|
175
|
+
return travelTimeMs(baseMs, pct ?? null);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Pick a riding spell row by rank, skill-grant id, or trainer wrapper id. Prefer reading bake rows over
|
|
179
|
+
// hardcoding ids in callers.
|
|
180
|
+
export function findRidingSpell(
|
|
181
|
+
spells: readonly RidingSpellRow[],
|
|
182
|
+
rankOrSpellId: number,
|
|
183
|
+
): RidingSpellRow | undefined {
|
|
184
|
+
return spells.find(
|
|
185
|
+
(s) =>
|
|
186
|
+
s.rank === rankOrSpellId
|
|
187
|
+
|| s.id === rankOrSpellId
|
|
188
|
+
|| s.trainerSpell === rankOrSpellId,
|
|
189
|
+
);
|
|
190
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
// An on-use payload flattened through its trigger chain, plus implicit-target hostility.
|
|
2
|
+
// 134 items (every Protection Potion, the BG talismans, both rocket helms) matched no branch.
|
|
3
|
+
|
|
4
|
+
import type { SpellDef, SpellEffect } from '../../data/schema.ts';
|
|
5
|
+
import { resolveCombatSpell } from '../../engine/spells/interpreter/item-triggers.ts';
|
|
6
|
+
|
|
7
|
+
export type OnUseSpellLookup = { spell(id: number): SpellDef | undefined };
|
|
8
|
+
|
|
9
|
+
/** SpellTargetInfoTable rows whose filter is TARGET_HARMFUL. Cite: SpellTargets.cpp:33-91. */
|
|
10
|
+
const HARMFUL_IMPLICIT_TARGETS: ReadonlySet<number> = new Set([2, 6, 13, 15, 16, 24, 28, 36, 54]);
|
|
11
|
+
|
|
12
|
+
/** An effect slot that aims at an enemy — the server's own hostility answer for a cast. */
|
|
13
|
+
export function onUseAimsAtEnemy(spell: SpellDef | undefined): boolean {
|
|
14
|
+
return (spell?.rawEffects ?? []).some(
|
|
15
|
+
(e) => HARMFUL_IMPLICIT_TARGETS.has(e.targetA | 0)
|
|
16
|
+
|| HARMFUL_IMPLICIT_TARGETS.has(e.targetB | 0),
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// The spell an effect casts IMMEDIATELY. Cite: SpellEffects.cpp EffectTriggerSpell (64). A proc
|
|
21
|
+
// aura (42/23) fires later off the holder, so following it read Chili's breath as offensive.
|
|
22
|
+
function triggeredIds(e: SpellEffect): number[] {
|
|
23
|
+
return e.kind === 'trigger_spell' ? [e.spellId] : [];
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// effects[] plus everything a trigger reaches, breadth-first with a visited set. The cast path
|
|
27
|
+
// already follows these hops (applySpell.ts:1658); the two classifiers did not.
|
|
28
|
+
export function onUseEffects(
|
|
29
|
+
spell: SpellDef,
|
|
30
|
+
ds: OnUseSpellLookup,
|
|
31
|
+
maxDepth = 3,
|
|
32
|
+
): SpellEffect[] {
|
|
33
|
+
const out: SpellEffect[] = [];
|
|
34
|
+
const seen = new Set<number>([spell.id | 0]);
|
|
35
|
+
let frontier: SpellDef[] = [spell];
|
|
36
|
+
for (let depth = 0; depth <= maxDepth && frontier.length; depth++) {
|
|
37
|
+
const next: SpellDef[] = [];
|
|
38
|
+
for (const sp of frontier) {
|
|
39
|
+
const effs = sp.effects?.length ? sp.effects : (resolveCombatSpell(sp).effects ?? []);
|
|
40
|
+
for (const e of effs) {
|
|
41
|
+
out.push(e);
|
|
42
|
+
if (depth === maxDepth) continue;
|
|
43
|
+
for (const id of triggeredIds(e)) {
|
|
44
|
+
if (!id || seen.has(id)) continue;
|
|
45
|
+
seen.add(id);
|
|
46
|
+
const trig = ds.spell(id);
|
|
47
|
+
if (trig) next.push(trig);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
frontier = next;
|
|
52
|
+
}
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** A beneficial speed aura — a hostile slow shares the kind. */
|
|
57
|
+
export function isBeneficialSpeed(e: SpellEffect): boolean {
|
|
58
|
+
return e.kind === 'speed' && e.hostile !== true && (e.pct ?? 0) > 0;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export function hasFriendlyPayload(effects: readonly SpellEffect[]): boolean {
|
|
62
|
+
return effects.some(
|
|
63
|
+
(e) => e.kind === 'buff' || e.kind === 'heal' || e.kind === 'energize' || isBeneficialSpeed(e)
|
|
64
|
+
|| e.kind === 'reflect' || e.kind === 'summon_guardian',
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export function hasHostilePayload(effects: readonly SpellEffect[]): boolean {
|
|
69
|
+
return effects.some(
|
|
70
|
+
(e) => e.kind === 'direct_damage'
|
|
71
|
+
|| e.kind === 'dot'
|
|
72
|
+
|| (e.kind === 'cc' && !!e.mechanic)
|
|
73
|
+
|| e.kind === 'health_leech'
|
|
74
|
+
|| e.kind === 'root'
|
|
75
|
+
|| e.kind === 'power_burn'
|
|
76
|
+
|| e.kind === 'power_drain',
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Self payloads the cast path lands that no combatItems branch names. Cite: applySpell.ts:2456
|
|
81
|
+
// school_absorb, :1751 proc_trigger_spell; applySpellLate.ts:1842 owned_spell_mods.
|
|
82
|
+
const COMBAT_SELF_PAYLOAD: ReadonlySet<SpellEffect['kind']> = new Set([
|
|
83
|
+
'school_absorb', 'mana_shield', 'damage_shield', 'resist', 'proc_trigger_spell',
|
|
84
|
+
'owned_spell_mods', 'next_cast_mod', 'extra_attacks', 'threat', 'modify_threat_pct',
|
|
85
|
+
'combustion', 'sweeping_strikes', 'vampiric_embrace', 'magic_absorption', 'cheat_death',
|
|
86
|
+
'eye_for_an_eye', 'split_damage', 'split_damage_flat', 'mod_mechanic_resistance',
|
|
87
|
+
'resist_pushback', 'adaptive_warding', 'obsidian_armor', 'feign_death', 'stealth',
|
|
88
|
+
]);
|
|
89
|
+
|
|
90
|
+
export function hasCombatSelfPayload(effects: readonly SpellEffect[]): boolean {
|
|
91
|
+
return effects.some((e) => COMBAT_SELF_PAYLOAD.has(e.kind));
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// A meal, not a kit row: POSITIVE restore only (Skull of Impending Doom 5024's is a self-drain
|
|
95
|
+
// cost). The BG rations hide theirs two triggers down.
|
|
96
|
+
export function isFoodDrinkPayload(effects: readonly SpellEffect[]): boolean {
|
|
97
|
+
return effects.some((e) => {
|
|
98
|
+
if (e.kind !== 'restore_health' && e.kind !== 'restore_power') return false;
|
|
99
|
+
const r = e as { min?: number; max?: number; amountPerTick?: number };
|
|
100
|
+
return Math.max(r.min ?? 0, r.max ?? 0, r.amountPerTick ?? 0) > 0;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// The open loot container — the haul a corpse, chest, vein or bag-item HOLDS while the window is
|
|
2
|
+
// up. Outdoor leftovers despawn on close; an inventory container's remainder stays claimable.
|
|
3
|
+
|
|
4
|
+
import type { ItemInstance } from './itemInstance.ts';
|
|
5
|
+
import type { Inventory } from './inventory.ts';
|
|
6
|
+
import {
|
|
7
|
+
GAMEOBJECT_TYPE_CHEST, GAMEOBJECT_TYPE_FISHINGNODE, GAMEOBJECT_TYPE_FISHINGHOLE,
|
|
8
|
+
} from '../world/gameObjects.ts';
|
|
9
|
+
|
|
10
|
+
/** One row of held loot. `instance` carries a rolled suffix/enchant so taking never re-rolls it. */
|
|
11
|
+
export interface PendingLootRow {
|
|
12
|
+
item: number;
|
|
13
|
+
count: number;
|
|
14
|
+
/** Wave Q identity, rolled when the loot was generated (LOCK 1: never re-rolled on take). */
|
|
15
|
+
instance?: ItemInstance;
|
|
16
|
+
/** True once a take attempt failed for space — the UI shows why instead of silently no-oping. */
|
|
17
|
+
blocked?: boolean;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** What kind of thing is holding the loot. Drives the portrait, the title and the open cue. */
|
|
21
|
+
export type PendingLootKind =
|
|
22
|
+
| 'corpse' | 'chest' | 'object' | 'mining' | 'herbalism' | 'fishing' | 'skinning' | 'container';
|
|
23
|
+
|
|
24
|
+
export interface PendingLoot {
|
|
25
|
+
kind: PendingLootKind;
|
|
26
|
+
/** Frame title — the creature / object / node / container name. */
|
|
27
|
+
title: string;
|
|
28
|
+
rows: PendingLootRow[];
|
|
29
|
+
/** Copper still in the container (corpse gold). Taken as its own click, like WoW's coin row. */
|
|
30
|
+
copper: number;
|
|
31
|
+
/** Icon name for the portrait when there is no creature to draw. */
|
|
32
|
+
icon?: string;
|
|
33
|
+
/** Creature entry for a corpse — the portrait uses its baked sprite. */
|
|
34
|
+
creatureEntry?: number;
|
|
35
|
+
/** Item entry of the container that was opened (picks the open cue: clam vs lockbox vs crate). */
|
|
36
|
+
containerItem?: number;
|
|
37
|
+
/** A key/lockpick was consumed opening this — the metal click leads the cue. */
|
|
38
|
+
keyUsed?: boolean;
|
|
39
|
+
/** Footer line: skill-up, charges left, "bags full", "nothing usable". */
|
|
40
|
+
note?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Bags plus still-held loot rows so findUpgrades can score the corpse before take. */
|
|
44
|
+
export function inventoryPlusPending(
|
|
45
|
+
inv: Inventory,
|
|
46
|
+
pending: PendingLoot | null | undefined,
|
|
47
|
+
): Inventory {
|
|
48
|
+
if (!pending?.rows.length) return inv;
|
|
49
|
+
return {
|
|
50
|
+
stacks: [
|
|
51
|
+
...inv.stacks,
|
|
52
|
+
...pending.rows.map((r) => r.instance ?? { item: r.item, count: r.count }),
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** Nothing left to take: no rows and no money. An emptied container closes itself. */
|
|
58
|
+
export function isLootEmpty(loot: PendingLoot | null | undefined): boolean {
|
|
59
|
+
if (!loot) return true;
|
|
60
|
+
return loot.copper <= 0 && loot.rows.length === 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** How many separate things are still in there (money counts as one), for badges/labels. */
|
|
64
|
+
export function lootRowCount(loot: PendingLoot | null | undefined): number {
|
|
65
|
+
if (!loot) return 0;
|
|
66
|
+
return loot.rows.length + (loot.copper > 0 ? 1 : 0);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Drop the row at `index`, keeping the rest in order. Out-of-range returns the list unchanged. */
|
|
70
|
+
export function removeLootRow(loot: PendingLoot, index: number): PendingLoot {
|
|
71
|
+
if (index < 0 || index >= loot.rows.length) return loot;
|
|
72
|
+
return { ...loot, rows: loot.rows.filter((_, i) => i !== index) };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Mark the row at `index` as blocked (bags full) or clear that mark on every row. */
|
|
76
|
+
export function markLootBlocked(loot: PendingLoot, index: number, blocked: boolean): PendingLoot {
|
|
77
|
+
return {
|
|
78
|
+
...loot,
|
|
79
|
+
rows: loot.rows.map((r, i) => {
|
|
80
|
+
if (i !== index) return r;
|
|
81
|
+
const next = { ...r };
|
|
82
|
+
if (blocked) next.blocked = true; else delete next.blocked;
|
|
83
|
+
return next;
|
|
84
|
+
}),
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Loot-container kind for a gather node, by its profession line. */
|
|
89
|
+
export function gatherLootKind(skill: string | undefined): PendingLootKind {
|
|
90
|
+
if (skill === 'mining') return 'mining';
|
|
91
|
+
if (skill === 'herbalism') return 'herbalism';
|
|
92
|
+
if (skill === 'fishing') return 'fishing';
|
|
93
|
+
if (skill === 'skinning') return 'skinning';
|
|
94
|
+
return 'object';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Loot-container kind for a GameObject: a chest or anything locked gets the lid cue, a fishing
|
|
98
|
+
// node the water cue, everything else clickable is a plain object.
|
|
99
|
+
export function goLootKind(go: {
|
|
100
|
+
type?: number; lockId?: number; chest?: unknown; fishnode?: unknown; fishinghole?: unknown;
|
|
101
|
+
} | undefined): PendingLootKind {
|
|
102
|
+
if (!go) return 'object';
|
|
103
|
+
if (go.type === GAMEOBJECT_TYPE_FISHINGNODE || go.type === GAMEOBJECT_TYPE_FISHINGHOLE
|
|
104
|
+
|| go.fishnode != null || go.fishinghole != null) return 'fishing';
|
|
105
|
+
if (go.type === GAMEOBJECT_TYPE_CHEST || go.chest != null || (go.lockId ?? 0) > 0) return 'chest';
|
|
106
|
+
return 'object';
|
|
107
|
+
}
|