azeroth-shell 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -2
- package/bin/azsh.mjs +19 -0
- package/docs/aifid/eventai-texts.json +4414 -0
- package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
- package/docs/dungeons/survey/pack-id-migration.json +2418 -0
- package/package.json +26 -4
- package/src/autopilot/bossSkip.ts +26 -0
- package/src/autopilot/combatRotation.ts +824 -0
- package/src/autopilot/config.ts +533 -0
- package/src/autopilot/consumables.ts +58 -0
- package/src/autopilot/encounterStand.ts +121 -0
- package/src/autopilot/objectGatePlan.ts +53 -0
- package/src/autopilot/pathEngage.ts +229 -0
- package/src/autopilot/plan.ts +1643 -0
- package/src/autopilot/questPolicy.ts +274 -0
- package/src/autopilot/routeStep.ts +69 -0
- package/src/autopilot/sessionReport.ts +88 -0
- package/src/autopilot/topOffPower.ts +26 -0
- package/src/autopilot/view.ts +476 -0
- package/src/cli/bootCheck.mjs +34 -0
- package/src/cli/bootData.mjs +57 -0
- package/src/cli/combatLogFilter.ts +153 -0
- package/src/cli/combatLogFormat.ts +613 -0
- package/src/cli/fileRepository.mjs +105 -0
- package/src/cli/gzLoader.mjs +31 -0
- package/src/cli/liveGauntletEscort.ts +978 -0
- package/src/cli/liveStratUndead.ts +305 -0
- package/src/cli/macroHostCombat.ts +545 -0
- package/src/cli/macroHostWorld.ts +330 -0
- package/src/cli/prefs.mjs +31 -0
- package/src/cli/register.mjs +4 -0
- package/src/cli/repl.mjs +693 -0
- package/src/cli/rotationText.mjs +226 -0
- package/src/cli/squad.mjs +105 -0
- package/src/cli/term.mjs +126 -0
- package/src/cli/text.mjs +122 -0
- package/src/cli/tui.mjs +626 -0
- package/src/cli/tuiArena.mjs +109 -0
- package/src/cli/tuiAutopilotSettings.mjs +93 -0
- package/src/cli/tuiBags.mjs +180 -0
- package/src/cli/tuiBars.mjs +133 -0
- package/src/cli/tuiBg.mjs +243 -0
- package/src/cli/tuiBulk.mjs +162 -0
- package/src/cli/tuiCheck.mjs +1882 -0
- package/src/cli/tuiCity.mjs +396 -0
- package/src/cli/tuiCompanionKit.mjs +300 -0
- package/src/cli/tuiCompanions.mjs +471 -0
- package/src/cli/tuiDev.mjs +62 -0
- package/src/cli/tuiDungeon.mjs +606 -0
- package/src/cli/tuiEnchantTarget.mjs +120 -0
- package/src/cli/tuiFight.mjs +577 -0
- package/src/cli/tuiFightPanes.mjs +228 -0
- package/src/cli/tuiFloor.mjs +506 -0
- package/src/cli/tuiGear.mjs +158 -0
- package/src/cli/tuiHonor.mjs +74 -0
- package/src/cli/tuiLoot.mjs +97 -0
- package/src/cli/tuiMacros.mjs +144 -0
- package/src/cli/tuiOutfitter.mjs +115 -0
- package/src/cli/tuiPet.mjs +116 -0
- package/src/cli/tuiProfessions.mjs +800 -0
- package/src/cli/tuiRaid.mjs +127 -0
- package/src/cli/tuiRep.mjs +65 -0
- package/src/cli/tuiSaves.mjs +69 -0
- package/src/cli/tuiSearch.mjs +363 -0
- package/src/cli/tuiSettings.mjs +151 -0
- package/src/cli/tuiSimLab.mjs +80 -0
- package/src/cli/tuiTalents.mjs +60 -0
- package/src/cli/tuiViews.mjs +1178 -0
- package/src/cli/tuiWiki.mjs +181 -0
- package/src/cli/tuiWorld.mjs +361 -0
- package/src/cli/wikiIndex.ts +259 -0
- package/src/cli/wikiSources.ts +355 -0
- package/src/data/alteracValley.ts +176 -0
- package/src/data/appearanceOptions.ts +534 -0
- package/src/data/applyLootChanceSanity.ts +21 -0
- package/src/data/createFlavor.ts +96 -0
- package/src/data/customItems.ts +33 -0
- package/src/data/dataStore.ts +1904 -0
- package/src/data/dungeonGameObjects.ts +84 -0
- package/src/data/dungeonPlateCover.ts +66 -0
- package/src/data/dungeonSpawns.ts +294 -0
- package/src/data/dungeons/alterac-valley.ts +135 -0
- package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
- package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
- package/src/data/dungeons/apply-instance-geometry.ts +65 -0
- package/src/data/dungeons/apply-spawn-placement.ts +171 -0
- package/src/data/dungeons/blackfathom-deeps.ts +539 -0
- package/src/data/dungeons/blackrock-depths.ts +1410 -0
- package/src/data/dungeons/blackwing-lair.ts +129 -0
- package/src/data/dungeons/boss-eventai.ts +8 -0
- package/src/data/dungeons/deadmines.ts +410 -0
- package/src/data/dungeons/dire-maul-east.ts +980 -0
- package/src/data/dungeons/dire-maul-north.ts +661 -0
- package/src/data/dungeons/dire-maul-west.ts +785 -0
- package/src/data/dungeons/dungeon-rooms.json +5479 -0
- package/src/data/dungeons/encounter-outdoors.json +359 -0
- package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
- package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
- package/src/data/dungeons/eventai/deadmines.ts +264 -0
- package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
- package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
- package/src/data/dungeons/eventai/helpers.ts +79 -0
- package/src/data/dungeons/eventai/index.ts +133 -0
- package/src/data/dungeons/eventai/lbrs.ts +372 -0
- package/src/data/dungeons/eventai/maraudon.ts +323 -0
- package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
- package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
- package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
- package/src/data/dungeons/eventai/scholomance.ts +680 -0
- package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
- package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
- package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
- package/src/data/dungeons/eventai/sm-library.ts +55 -0
- package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
- package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
- package/src/data/dungeons/eventai/the-stockade.ts +228 -0
- package/src/data/dungeons/eventai/ubrs.ts +225 -0
- package/src/data/dungeons/eventai/uldaman.ts +355 -0
- package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
- package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
- package/src/data/dungeons/gnomeregan.ts +909 -0
- package/src/data/dungeons/index.ts +126 -0
- package/src/data/dungeons/instance-geometry.json +5233 -0
- package/src/data/dungeons/key-sources.json +169 -0
- package/src/data/dungeons/lbrs.ts +996 -0
- package/src/data/dungeons/maraudon.ts +786 -0
- package/src/data/dungeons/molten-core.ts +194 -0
- package/src/data/dungeons/naxxramas.ts +173 -0
- package/src/data/dungeons/onyxias-lair.ts +71 -0
- package/src/data/dungeons/pack-from-clusters.ts +1256 -0
- package/src/data/dungeons/ragefire-chasm.ts +238 -0
- package/src/data/dungeons/razorfen-downs.ts +698 -0
- package/src/data/dungeons/razorfen-kraul.ts +766 -0
- package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
- package/src/data/dungeons/scholomance.ts +1076 -0
- package/src/data/dungeons/shadowfang-keep.ts +740 -0
- package/src/data/dungeons/sm-armory.ts +266 -0
- package/src/data/dungeons/sm-cathedral.ts +430 -0
- package/src/data/dungeons/sm-graveyard.ts +482 -0
- package/src/data/dungeons/sm-library.ts +337 -0
- package/src/data/dungeons/stratholme-live.ts +808 -0
- package/src/data/dungeons/stratholme-undead.ts +1164 -0
- package/src/data/dungeons/sunken-temple.ts +931 -0
- package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
- package/src/data/dungeons/the-stockade.ts +282 -0
- package/src/data/dungeons/ubrs.ts +1286 -0
- package/src/data/dungeons/uldaman.ts +685 -0
- package/src/data/dungeons/wailing-caverns.ts +356 -0
- package/src/data/dungeons/zul-farrak.ts +686 -0
- package/src/data/dungeons/zul-gurub.ts +142 -0
- package/src/data/dungeons.ts +42 -0
- package/src/data/fixtures.ts +446 -0
- package/src/data/gameobject-data.json.gz +0 -0
- package/src/data/item-data.json.gz +0 -0
- package/src/data/loot-data.json.gz +0 -0
- package/src/data/maps/atlas-approach-maps.json +1425 -0
- package/src/data/maps/atlas-landmarks.json +1711 -0
- package/src/data/maps/dungeon-viewports.json +392 -0
- package/src/data/materializeModDamagePercentTaken.ts +70 -0
- package/src/data/materializeModHealthRegen.ts +89 -0
- package/src/data/materializeSpellReputation.ts +26 -0
- package/src/data/pageTexts.ts +19 -0
- package/src/data/profession-data.json.gz +0 -0
- package/src/data/raid-plans/blackfathom-deeps.json +86 -0
- package/src/data/raid-plans/blackrock-depths.json +419 -0
- package/src/data/raid-plans/blackwing-lair.json +328 -0
- package/src/data/raid-plans/deadmines.json +55 -0
- package/src/data/raid-plans/dire-maul-east.json +94 -0
- package/src/data/raid-plans/dire-maul-north.json +70 -0
- package/src/data/raid-plans/dire-maul-west.json +75 -0
- package/src/data/raid-plans/gnomeregan.json +131 -0
- package/src/data/raid-plans/lbrs.json +176 -0
- package/src/data/raid-plans/maraudon.json +102 -0
- package/src/data/raid-plans/molten-core.json +169 -0
- package/src/data/raid-plans/naxxramas.json +354 -0
- package/src/data/raid-plans/onyxias-lair.json +18 -0
- package/src/data/raid-plans/ragefire-chasm.json +30 -0
- package/src/data/raid-plans/razorfen-downs.json +75 -0
- package/src/data/raid-plans/razorfen-kraul.json +53 -0
- package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
- package/src/data/raid-plans/scholomance.json +170 -0
- package/src/data/raid-plans/shadowfang-keep.json +87 -0
- package/src/data/raid-plans/sm-armory.json +53 -0
- package/src/data/raid-plans/sm-cathedral.json +72 -0
- package/src/data/raid-plans/sm-graveyard.json +63 -0
- package/src/data/raid-plans/sm-library.json +23 -0
- package/src/data/raid-plans/stratholme-live.json +129 -0
- package/src/data/raid-plans/stratholme-undead.json +73 -0
- package/src/data/raid-plans/sunken-temple.json +159 -0
- package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
- package/src/data/raid-plans/the-stockade.json +42 -0
- package/src/data/raid-plans/ubrs.json +53 -0
- package/src/data/raid-plans/uldaman.json +131 -0
- package/src/data/raid-plans/wailing-caverns.json +90 -0
- package/src/data/raid-plans/zul-farrak.json +156 -0
- package/src/data/raid-plans/zul-gurub.json +307 -0
- package/src/data/raidInstanceCreatures.mjs +473 -0
- package/src/data/rotations/index.ts +152 -0
- package/src/data/rotations/layout.mjs +72 -0
- package/src/data/rotations/pve/druid/balance.json +754 -0
- package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
- package/src/data/rotations/pve/druid/feral.json +2660 -0
- package/src/data/rotations/pve/druid/restoration.json +424 -0
- package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
- package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
- package/src/data/rotations/pve/hunter/survival.json +1373 -0
- package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
- package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
- package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
- package/src/data/rotations/pve/paladin/holy.json +755 -0
- package/src/data/rotations/pve/paladin/protection.json +962 -0
- package/src/data/rotations/pve/paladin/retribution.json +924 -0
- package/src/data/rotations/pve/priest/discipline.json +772 -0
- package/src/data/rotations/pve/priest/holy.json +707 -0
- package/src/data/rotations/pve/priest/shadow.json +787 -0
- package/src/data/rotations/pve/rogue/assassination.json +2477 -0
- package/src/data/rotations/pve/rogue/combat.json +2483 -0
- package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
- package/src/data/rotations/pve/shaman/elemental.json +1157 -0
- package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
- package/src/data/rotations/pve/shaman/restoration.json +592 -0
- package/src/data/rotations/pve/warlock/affliction.json +1185 -0
- package/src/data/rotations/pve/warlock/demonology.json +1165 -0
- package/src/data/rotations/pve/warlock/destruction.json +1177 -0
- package/src/data/rotations/pve/warrior/arms.json +3020 -0
- package/src/data/rotations/pve/warrior/fury.json +2996 -0
- package/src/data/rotations/pve/warrior/protection.json +2509 -0
- package/src/data/rotations/pvp/druid/balance.json +593 -0
- package/src/data/rotations/pvp/druid/feral.json +3276 -0
- package/src/data/rotations/pvp/druid/restoration.json +662 -0
- package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
- package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
- package/src/data/rotations/pvp/hunter/survival.json +635 -0
- package/src/data/rotations/pvp/mage/arcane.json +574 -0
- package/src/data/rotations/pvp/mage/fire.json +570 -0
- package/src/data/rotations/pvp/mage/frost.json +4048 -0
- package/src/data/rotations/pvp/paladin/holy.json +1498 -0
- package/src/data/rotations/pvp/paladin/protection.json +567 -0
- package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
- package/src/data/rotations/pvp/priest/discipline.json +1848 -0
- package/src/data/rotations/pvp/priest/holy.json +6340 -0
- package/src/data/rotations/pvp/priest/shadow.json +2329 -0
- package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
- package/src/data/rotations/pvp/rogue/combat.json +5258 -0
- package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
- package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
- package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
- package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
- package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
- package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
- package/src/data/rotations/pvp/warlock/destruction.json +638 -0
- package/src/data/rotations/pvp/warrior/arms.json +5665 -0
- package/src/data/rotations/pvp/warrior/fury.json +850 -0
- package/src/data/rotations/pvp/warrior/protection.json +777 -0
- package/src/data/schema/bundle.ts +511 -0
- package/src/data/schema/constants.ts +49 -0
- package/src/data/schema/creature.ts +454 -0
- package/src/data/schema/encounter.ts +155 -0
- package/src/data/schema/faction.ts +48 -0
- package/src/data/schema/item.ts +297 -0
- package/src/data/schema/itemEnchant.ts +105 -0
- package/src/data/schema/npc.ts +44 -0
- package/src/data/schema/primitives.ts +295 -0
- package/src/data/schema/profession.ts +226 -0
- package/src/data/schema/quest.ts +154 -0
- package/src/data/schema/spell.ts +1149 -0
- package/src/data/schema/talent.ts +74 -0
- package/src/data/schema/world.ts +124 -0
- package/src/data/schema.ts +19 -0
- package/src/data/skinNodeGapFill.ts +68 -0
- package/src/data/spell-data.json.gz +0 -0
- package/src/data/spell-script-targets.json +1 -0
- package/src/data/tables/ahItemValues.json.gz +0 -0
- package/src/data/tables/alteracValley.json.gz +0 -0
- package/src/data/tables/areatriggerTeleports.json.gz +0 -0
- package/src/data/tables/botNames.json.gz +0 -0
- package/src/data/tables/botPopulation.json.gz +0 -0
- package/src/data/tables/botSpecs.json.gz +0 -0
- package/src/data/tables/classLevelStats.json.gz +0 -0
- package/src/data/tables/combatConditions.json.gz +0 -0
- package/src/data/tables/combatSkillMeta.json.gz +0 -0
- package/src/data/tables/conditions.json.gz +0 -0
- package/src/data/tables/createInfo.json.gz +0 -0
- package/src/data/tables/creatureAggroGroups.json.gz +0 -0
- package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
- package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
- package/src/data/tables/creatureWeapons.json.gz +0 -0
- package/src/data/tables/creatures.json.gz +0 -0
- package/src/data/tables/dbScripts.json.gz +0 -0
- package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
- package/src/data/tables/dungeonCensus.json.gz +0 -0
- package/src/data/tables/dungeonGameObjects.json.gz +0 -0
- package/src/data/tables/dungeonPacks.json.gz +0 -0
- package/src/data/tables/dungeonPlateCover.json.gz +0 -0
- package/src/data/tables/dungeonSpawns.json.gz +0 -0
- package/src/data/tables/dungeonSurvey.json.gz +0 -0
- package/src/data/tables/durabilityCosts.json.gz +0 -0
- package/src/data/tables/durabilityQuality.json.gz +0 -0
- package/src/data/tables/enchantApplicators.json.gz +0 -0
- package/src/data/tables/entranceYards.json.gz +0 -0
- package/src/data/tables/explorationBasexp.json.gz +0 -0
- package/src/data/tables/factionTemplates.json.gz +0 -0
- package/src/data/tables/factions.json.gz +0 -0
- package/src/data/tables/gameEvents.json.gz +0 -0
- package/src/data/tables/gameObjects.json.gz +0 -0
- package/src/data/tables/gossipMenus.json.gz +0 -0
- package/src/data/tables/graveyards.json.gz +0 -0
- package/src/data/tables/instanceMaps.json.gz +0 -0
- package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
- package/src/data/tables/itemEnchants.json.gz +0 -0
- package/src/data/tables/itemRandomProperties.json.gz +0 -0
- package/src/data/tables/itemSets.json.gz +0 -0
- package/src/data/tables/items.json.gz +0 -0
- package/src/data/tables/levelStats.json.gz +0 -0
- package/src/data/tables/locks.json.gz +0 -0
- package/src/data/tables/map-pin-overrides.json.gz +0 -0
- package/src/data/tables/nonCombatTrash.json.gz +0 -0
- package/src/data/tables/npcTexts.json.gz +0 -0
- package/src/data/tables/pageTexts.json.gz +0 -0
- package/src/data/tables/petAbilityTP.json.gz +0 -0
- package/src/data/tables/petGenericSpells.json.gz +0 -0
- package/src/data/tables/petLevelStats.json.gz +0 -0
- package/src/data/tables/playerbot-weightscales.json.gz +0 -0
- package/src/data/tables/pools.json.gz +0 -0
- package/src/data/tables/quests.json.gz +0 -0
- package/src/data/tables/races.json.gz +0 -0
- package/src/data/tables/reputationRanks.json.gz +0 -0
- package/src/data/tables/reputationRates.json.gz +0 -0
- package/src/data/tables/reputationSpillover.json.gz +0 -0
- package/src/data/tables/ridingSpells.json.gz +0 -0
- package/src/data/tables/scriptTexts.json.gz +0 -0
- package/src/data/tables/soundClipVolume.json.gz +0 -0
- package/src/data/tables/spellChain.json.gz +0 -0
- package/src/data/tables/spellTeleports.json.gz +0 -0
- package/src/data/tables/spells.json.gz +0 -0
- package/src/data/tables/talents.json.gz +0 -0
- package/src/data/tables/tavernTriggers.json.gz +0 -0
- package/src/data/tables/taxiNodes.json.gz +0 -0
- package/src/data/tables/taxiRoutes.json.gz +0 -0
- package/src/data/tables/trainers.json.gz +0 -0
- package/src/data/tables/transports.json.gz +0 -0
- package/src/data/tables/travelAnchors.json.gz +0 -0
- package/src/data/tables/travelEdges.json.gz +0 -0
- package/src/data/tables/unitConditions.json.gz +0 -0
- package/src/data/tables/vendors.json.gz +0 -0
- package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
- package/src/data/tables/xp.json.gz +0 -0
- package/src/data/tables/zoneWeather.json.gz +0 -0
- package/src/data/tables/zones.json.gz +0 -0
- package/src/data/world-data.ts +56 -0
- package/src/data/zone-music-sets.json +2751 -0
- package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
- package/src/domain/audioQuality.mjs +145 -0
- package/src/domain/bg/ab.ts +433 -0
- package/src/domain/bg/arenaComps.ts +644 -0
- package/src/domain/bg/arenaLab.ts +695 -0
- package/src/domain/bg/arenaPace.ts +31 -0
- package/src/domain/bg/arenaRating.ts +110 -0
- package/src/domain/bg/av.ts +758 -0
- package/src/domain/bg/avEnemyPush.ts +219 -0
- package/src/domain/bg/avField.ts +283 -0
- package/src/domain/bg/avInstanceNodes.ts +197 -0
- package/src/domain/bg/avInstanceScore.ts +123 -0
- package/src/domain/bg/avQuestItems.ts +55 -0
- package/src/domain/bg/avQuests.ts +210 -0
- package/src/domain/bg/avSession.ts +196 -0
- package/src/domain/bg/bgConsumes.ts +269 -0
- package/src/domain/bg/bgPrebuff.ts +153 -0
- package/src/domain/bg/bgRest.ts +91 -0
- package/src/domain/bg/bgRoster.ts +305 -0
- package/src/domain/bg/bgTier.ts +61 -0
- package/src/domain/bg/bgWorld.ts +862 -0
- package/src/domain/bg/match.ts +215 -0
- package/src/domain/bg/strategies.ts +552 -0
- package/src/domain/bg/types.ts +291 -0
- package/src/domain/bg/wsg.ts +264 -0
- package/src/domain/bots/actionProviderSpec.ts +38 -0
- package/src/domain/bots/autoConsumables.ts +285 -0
- package/src/domain/bots/betweenPullRest.ts +239 -0
- package/src/domain/bots/botGear.ts +248 -0
- package/src/domain/bots/botInventory.ts +486 -0
- package/src/domain/bots/botPet.ts +535 -0
- package/src/domain/bots/botPool.ts +291 -0
- package/src/domain/bots/botProfessions.ts +334 -0
- package/src/domain/bots/companionActionBar.ts +209 -0
- package/src/domain/bots/companionHireCost.ts +236 -0
- package/src/domain/bots/companionMissions.ts +582 -0
- package/src/domain/bots/companionPrep.ts +254 -0
- package/src/domain/bots/companionQuests.ts +270 -0
- package/src/domain/bots/companionRep.ts +75 -0
- package/src/domain/bots/companionRotation.ts +708 -0
- package/src/domain/bots/companionXp.ts +66 -0
- package/src/domain/bots/consumableShare.ts +811 -0
- package/src/domain/bots/dpsMate.ts +1072 -0
- package/src/domain/bots/groupCompReport.ts +132 -0
- package/src/domain/bots/healthstoneSupply.ts +198 -0
- package/src/domain/bots/outfitter.ts +1056 -0
- package/src/domain/bots/paladinPrePull.ts +231 -0
- package/src/domain/bots/partyRole.ts +40 -0
- package/src/domain/bots/playerbotEquipCache.ts +412 -0
- package/src/domain/bots/playerbotItemEligibility.ts +60 -0
- package/src/domain/bots/playerbotStatWeight.ts +853 -0
- package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
- package/src/domain/bots/prePullBuffs.ts +219 -0
- package/src/domain/bots/prePullStealth.ts +82 -0
- package/src/domain/bots/runSupply.ts +251 -0
- package/src/domain/bots/runSupplyPrefs.ts +28 -0
- package/src/domain/bots/sendTradeGoods.ts +394 -0
- package/src/domain/bots/soulShardCap.ts +35 -0
- package/src/domain/bots/squad.ts +842 -0
- package/src/domain/bots/squadRun.ts +81 -0
- package/src/domain/character/actionbar.ts +346 -0
- package/src/domain/character/appearance.ts +165 -0
- package/src/domain/character/buildCombatant.ts +1726 -0
- package/src/domain/character/character.ts +356 -0
- package/src/domain/character/characterName.ts +43 -0
- package/src/domain/character/characterRatings.ts +424 -0
- package/src/domain/character/characterSpells.ts +282 -0
- package/src/domain/character/characterStats.ts +1559 -0
- package/src/domain/character/characterTalents.ts +398 -0
- package/src/domain/character/combatSkills.ts +994 -0
- package/src/domain/character/displayForm.ts +72 -0
- package/src/domain/character/formTalentAuras.ts +171 -0
- package/src/domain/character/forms.ts +499 -0
- package/src/domain/character/races.ts +40 -0
- package/src/domain/character/resurrectionSickness.ts +49 -0
- package/src/domain/character/spellbook.ts +169 -0
- package/src/domain/character/stanceBar.ts +354 -0
- package/src/domain/character/stancePrereq.ts +70 -0
- package/src/domain/character/talentBuilds.ts +63 -0
- package/src/domain/character/talentImport.ts +130 -0
- package/src/domain/character/talentLink.ts +123 -0
- package/src/domain/character/talents.ts +201 -0
- package/src/domain/core/conditionSnapshot.ts +92 -0
- package/src/domain/core/hover.ts +14 -0
- package/src/domain/core/ids.ts +58 -0
- package/src/domain/core/internalNameTags.ts +5 -0
- package/src/domain/core/runtimeDataPatches.ts +357 -0
- package/src/domain/creature/aiTargeting.ts +588 -0
- package/src/domain/creature/combatCondition.ts +157 -0
- package/src/domain/creature/creatureAggro.ts +804 -0
- package/src/domain/creature/creatureAi.ts +206 -0
- package/src/domain/creature/creatureAiConstants.ts +661 -0
- package/src/domain/creature/creatureCastList.ts +1007 -0
- package/src/domain/creature/creatureEventAi.ts +1409 -0
- package/src/domain/creature/creatureGroups.ts +144 -0
- package/src/domain/creature/creatureLinking.ts +333 -0
- package/src/domain/creature/creatureScaling.ts +320 -0
- package/src/domain/creature/creatureTrigger.ts +53 -0
- package/src/domain/creature/creatureWander.ts +74 -0
- package/src/domain/creature/eventAiTexts.ts +145 -0
- package/src/domain/creature/faction.ts +287 -0
- package/src/domain/creature/forcedReaction.ts +48 -0
- package/src/domain/creature/outdoorHuntable.ts +74 -0
- package/src/domain/creature/patrolPacks.ts +210 -0
- package/src/domain/creature/reputation.ts +967 -0
- package/src/domain/creature/unitFlags.ts +74 -0
- package/src/domain/creature/worldBosses.ts +393 -0
- package/src/domain/dungeonMusic.mjs +48 -0
- package/src/domain/economy/auction.ts +282 -0
- package/src/domain/economy/auctionBot.ts +1060 -0
- package/src/domain/economy/honorPrice.ts +100 -0
- package/src/domain/economy/mail.ts +958 -0
- package/src/domain/economy/money.ts +42 -0
- package/src/domain/economy/syntheticClassTrainers.ts +62 -0
- package/src/domain/economy/trading.ts +296 -0
- package/src/domain/economy/vendorSellAll.ts +252 -0
- package/src/domain/economy/vendorStock.ts +146 -0
- package/src/domain/items/ammo.ts +817 -0
- package/src/domain/items/bank.ts +162 -0
- package/src/domain/items/consumableFamily.ts +205 -0
- package/src/domain/items/craftUpgrades.ts +83 -0
- package/src/domain/items/createItem.ts +93 -0
- package/src/domain/items/durability.ts +581 -0
- package/src/domain/items/equipment.ts +441 -0
- package/src/domain/items/equipmentHelper.ts +767 -0
- package/src/domain/items/inventory.ts +561 -0
- package/src/domain/items/itemBonding.ts +93 -0
- package/src/domain/items/itemContainer.ts +245 -0
- package/src/domain/items/itemDisplayName.ts +33 -0
- package/src/domain/items/itemInstance.ts +181 -0
- package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
- package/src/domain/items/itemRandomProps.ts +77 -0
- package/src/domain/items/itemRestrictions.ts +329 -0
- package/src/domain/items/itemTeaches.ts +82 -0
- package/src/domain/items/itemUseCooldown.ts +52 -0
- package/src/domain/items/itemUseTarget.ts +90 -0
- package/src/domain/items/junkCategories.ts +174 -0
- package/src/domain/items/junkFilter.ts +368 -0
- package/src/domain/items/keyring.ts +131 -0
- package/src/domain/items/loot.ts +221 -0
- package/src/domain/items/mounts.ts +190 -0
- package/src/domain/items/onUsePayload.ts +102 -0
- package/src/domain/items/pendingLoot.ts +107 -0
- package/src/domain/items/relic.ts +105 -0
- package/src/domain/items/rocketBoots.ts +36 -0
- package/src/domain/items/sortContainer.ts +139 -0
- package/src/domain/items/spareContainers.ts +71 -0
- package/src/domain/items/spellReagentIndex.ts +131 -0
- package/src/domain/items/staleConsumables.ts +66 -0
- package/src/domain/items/weaponSpender.ts +110 -0
- package/src/domain/listDungeonIds.mjs +28 -0
- package/src/domain/macro/compose.ts +239 -0
- package/src/domain/macro/conditions.ts +260 -0
- package/src/domain/macro/creatureTypes.ts +40 -0
- package/src/domain/macro/describe.ts +169 -0
- package/src/domain/macro/icon.ts +60 -0
- package/src/domain/macro/index.ts +20 -0
- package/src/domain/macro/normalize.ts +112 -0
- package/src/domain/macro/parse.ts +316 -0
- package/src/domain/macro/plan.ts +288 -0
- package/src/domain/macro/rotation.ts +590 -0
- package/src/domain/macro/rotationEnv.ts +173 -0
- package/src/domain/macro/slots.ts +101 -0
- package/src/domain/macro/snapshot.ts +114 -0
- package/src/domain/macro/templates.ts +446 -0
- package/src/domain/macro/types.ts +70 -0
- package/src/domain/macro/units.ts +93 -0
- package/src/domain/macro/weaponTypes.ts +83 -0
- package/src/domain/nav/cityTeleports.ts +10 -0
- package/src/domain/nav/mounting.ts +113 -0
- package/src/domain/nav/nav.ts +43 -0
- package/src/domain/nav/navCollision.ts +606 -0
- package/src/domain/nav/navOutdoors.ts +91 -0
- package/src/domain/nav/navRegistry.ts +179 -0
- package/src/domain/nav/navRoomGraph.ts +302 -0
- package/src/domain/nav/navTypes.ts +43 -0
- package/src/domain/nav/navmesh.ts +1715 -0
- package/src/domain/nav/speed.ts +200 -0
- package/src/domain/nav/storey.ts +10 -0
- package/src/domain/nav/travel.ts +725 -0
- package/src/domain/nav/travelTypes.ts +75 -0
- package/src/domain/pet/pet.ts +1150 -0
- package/src/domain/pet/petActionBar.ts +180 -0
- package/src/domain/pet/petSpellbook.ts +39 -0
- package/src/domain/pet/petStable.ts +81 -0
- package/src/domain/professions/autoDisenchant.ts +236 -0
- package/src/domain/professions/characterEnchants.ts +176 -0
- package/src/domain/professions/craftCooldown.ts +52 -0
- package/src/domain/professions/enchantApply.ts +62 -0
- package/src/domain/professions/enchantTargets.ts +114 -0
- package/src/domain/professions/enchanting.ts +236 -0
- package/src/domain/professions/gatherFilter.ts +149 -0
- package/src/domain/professions/gearEnchant.ts +137 -0
- package/src/domain/professions/heldTools.ts +29 -0
- package/src/domain/professions/learnAllRecipes.ts +146 -0
- package/src/domain/professions/miningHarvest.ts +69 -0
- package/src/domain/professions/partyDisenchant.ts +294 -0
- package/src/domain/professions/partyWork.ts +83 -0
- package/src/domain/professions/pickpocket.ts +172 -0
- package/src/domain/professions/poisons.ts +240 -0
- package/src/domain/professions/professions.ts +677 -0
- package/src/domain/professions/rareNodes.ts +45 -0
- package/src/domain/professions/skinLoot.ts +27 -0
- package/src/domain/professions/vendorReagents.ts +152 -0
- package/src/domain/professions/weaponImbueHand.ts +171 -0
- package/src/domain/questFarmFilter.mjs +42 -0
- package/src/domain/quests/doQuest.ts +1204 -0
- package/src/domain/quests/gossip.ts +308 -0
- package/src/domain/quests/gossipTalk.ts +298 -0
- package/src/domain/quests/interpreter/canComplete.ts +150 -0
- package/src/domain/quests/interpreter/claim.ts +137 -0
- package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
- package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
- package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
- package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
- package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
- package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
- package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
- package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
- package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
- package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
- package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
- package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
- package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
- package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
- package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
- package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
- package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
- package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
- package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
- package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
- package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
- package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
- package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
- package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
- package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
- package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
- package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
- package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
- package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
- package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
- package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
- package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
- package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
- package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
- package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
- package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
- package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
- package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
- package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
- package/src/domain/quests/interpreter/diff.ts +349 -0
- package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
- package/src/domain/quests/interpreter/flags.ts +101 -0
- package/src/domain/quests/interpreter/index.ts +113 -0
- package/src/domain/quests/interpreter/live.ts +178 -0
- package/src/domain/quests/interpreter/types.ts +81 -0
- package/src/domain/quests/interpreter/updaters.ts +412 -0
- package/src/domain/quests/questCorpseUse.ts +155 -0
- package/src/domain/quests/questDialog.ts +43 -0
- package/src/domain/quests/questFight.ts +34 -0
- package/src/domain/quests/questObjectiveLabel.ts +39 -0
- package/src/domain/quests/questRewardChoice.ts +85 -0
- package/src/domain/quests/questScriptCredit.ts +26 -0
- package/src/domain/quests/questScriptItemUse.ts +74 -0
- package/src/domain/quests/questTameRods.ts +79 -0
- package/src/domain/quests/questlog.ts +1545 -0
- package/src/domain/quests/talkDeliver.ts +170 -0
- package/src/domain/raid/globalActionBar.ts +195 -0
- package/src/domain/raid/instanceRoster.ts +194 -0
- package/src/domain/raid/partySummon.ts +198 -0
- package/src/domain/raid/partyVault.ts +320 -0
- package/src/domain/raid/raidBossAbilities.ts +268 -0
- package/src/domain/raid/raidComp.ts +335 -0
- package/src/domain/raid/raidCustomRows.ts +453 -0
- package/src/domain/raid/raidEncounterGear.ts +298 -0
- package/src/domain/raid/raidEncounterTactics.ts +412 -0
- package/src/domain/raid/raidPlan.ts +509 -0
- package/src/domain/raid/raidPlanEdits.ts +98 -0
- package/src/domain/raid/raidPlanPacks.ts +480 -0
- package/src/domain/raid/raidRecovery.ts +183 -0
- package/src/domain/raid/raidRosterTemplate.ts +138 -0
- package/src/domain/rotation/auraSide.ts +68 -0
- package/src/domain/rotation/build.ts +3031 -0
- package/src/domain/rotation/classes/druid.ts +58 -0
- package/src/domain/rotation/classes/hooks.ts +59 -0
- package/src/domain/rotation/classes/hunter.ts +156 -0
- package/src/domain/rotation/classes/index.ts +104 -0
- package/src/domain/rotation/classes/mage.ts +99 -0
- package/src/domain/rotation/classes/paladin.ts +296 -0
- package/src/domain/rotation/classes/priest.ts +94 -0
- package/src/domain/rotation/classes/pullOpener.ts +92 -0
- package/src/domain/rotation/classes/rogue.ts +69 -0
- package/src/domain/rotation/classes/shaman.ts +29 -0
- package/src/domain/rotation/classes/supportSpec.ts +94 -0
- package/src/domain/rotation/classes/warlock.ts +81 -0
- package/src/domain/rotation/classes/warrior.ts +402 -0
- package/src/domain/rotation/classify.ts +1381 -0
- package/src/domain/rotation/condMetricPicker.ts +379 -0
- package/src/domain/rotation/consumables.ts +242 -0
- package/src/domain/rotation/evaluate.ts +1115 -0
- package/src/domain/rotation/finisherLadder.ts +145 -0
- package/src/domain/rotation/invent.ts +938 -0
- package/src/domain/rotation/killOrder.ts +30 -0
- package/src/domain/rotation/openerForm.ts +22 -0
- package/src/domain/rotation/paladinBuffs.ts +568 -0
- package/src/domain/rotation/prebuff.ts +283 -0
- package/src/domain/rotation/raidRowTuning.ts +34 -0
- package/src/domain/rotation/rotation.ts +11 -0
- package/src/domain/rotation/rotationProfiles.ts +180 -0
- package/src/domain/rotation/rotationSuggestions.ts +851 -0
- package/src/domain/rotation/ruleAfterChain.ts +49 -0
- package/src/domain/rotation/spec.ts +70 -0
- package/src/domain/rotation/spellPicker.ts +140 -0
- package/src/domain/rotation/stand.ts +143 -0
- package/src/domain/rotation/types.ts +718 -0
- package/src/domain/run/battlegroundRun.ts +111 -0
- package/src/domain/run/canEnterContext.ts +32 -0
- package/src/domain/run/death.ts +561 -0
- package/src/domain/run/deathRecovery.ts +289 -0
- package/src/domain/run/duel.ts +141 -0
- package/src/domain/run/dungeonRun.ts +344 -0
- package/src/domain/run/floorRest.ts +159 -0
- package/src/domain/run/honor.ts +557 -0
- package/src/domain/run/honorWeek.ts +180 -0
- package/src/domain/run/whenMap.ts +977 -0
- package/src/domain/scriptdev/arathiHighlands.ts +445 -0
- package/src/domain/scriptdev/ashenvale.ts +635 -0
- package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
- package/src/domain/scriptdev/azshara.ts +892 -0
- package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
- package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
- package/src/domain/scriptdev/blackrockSpire.ts +730 -0
- package/src/domain/scriptdev/blackwingLair.ts +521 -0
- package/src/domain/scriptdev/burningSteppes.ts +62 -0
- package/src/domain/scriptdev/classFilter.ts +43 -0
- package/src/domain/scriptdev/darkshore.ts +817 -0
- package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
- package/src/domain/scriptdev/deadmines.ts +331 -0
- package/src/domain/scriptdev/desolace.ts +1239 -0
- package/src/domain/scriptdev/direMaul.ts +859 -0
- package/src/domain/scriptdev/durotar.ts +532 -0
- package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
- package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
- package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
- package/src/domain/scriptdev/felwood.ts +1055 -0
- package/src/domain/scriptdev/feralas.ts +571 -0
- package/src/domain/scriptdev/feralasHelpers.ts +838 -0
- package/src/domain/scriptdev/gnomeregan.ts +466 -0
- package/src/domain/scriptdev/guards.ts +616 -0
- package/src/domain/scriptdev/hinterlands.ts +693 -0
- package/src/domain/scriptdev/host.ts +1134 -0
- package/src/domain/scriptdev/index.ts +123 -0
- package/src/domain/scriptdev/instanceRaids.ts +136 -0
- package/src/domain/scriptdev/itemScripts.ts +37 -0
- package/src/domain/scriptdev/lochModan.ts +283 -0
- package/src/domain/scriptdev/maraudon.ts +232 -0
- package/src/domain/scriptdev/moltenCore.ts +831 -0
- package/src/domain/scriptdev/moonglade.ts +659 -0
- package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
- package/src/domain/scriptdev/naxxramas.ts +577 -0
- package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
- package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
- package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
- package/src/domain/scriptdev/npcProfessions.ts +1025 -0
- package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
- package/src/domain/scriptdev/onyxiasLair.ts +313 -0
- package/src/domain/scriptdev/orgrimmar.ts +147 -0
- package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
- package/src/domain/scriptdev/razorfenDowns.ts +468 -0
- package/src/domain/scriptdev/razorfenKraul.ts +410 -0
- package/src/domain/scriptdev/redridgeMountains.ts +163 -0
- package/src/domain/scriptdev/registry.ts +945 -0
- package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
- package/src/domain/scriptdev/scarletMonastery.ts +713 -0
- package/src/domain/scriptdev/scholomance.ts +682 -0
- package/src/domain/scriptdev/searingGorge.ts +295 -0
- package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
- package/src/domain/scriptdev/silithus.ts +71 -0
- package/src/domain/scriptdev/silverpineForest.ts +662 -0
- package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
- package/src/domain/scriptdev/stormwindCity.ts +1192 -0
- package/src/domain/scriptdev/stranglethornVale.ts +402 -0
- package/src/domain/scriptdev/stratholme.ts +650 -0
- package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
- package/src/domain/scriptdev/sunkenTemple.ts +736 -0
- package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
- package/src/domain/scriptdev/tanaris.ts +391 -0
- package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
- package/src/domain/scriptdev/teldrassil.ts +143 -0
- package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
- package/src/domain/scriptdev/theBarrens.ts +709 -0
- package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
- package/src/domain/scriptdev/thousandNeedles.ts +426 -0
- package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
- package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
- package/src/domain/scriptdev/types.ts +1026 -0
- package/src/domain/scriptdev/uldaman.ts +437 -0
- package/src/domain/scriptdev/ungoroCrater.ts +549 -0
- package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
- package/src/domain/scriptdev/wailingCaverns.ts +700 -0
- package/src/domain/scriptdev/warEffort.ts +371 -0
- package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
- package/src/domain/scriptdev/westfall.ts +767 -0
- package/src/domain/scriptdev/wetlands.ts +660 -0
- package/src/domain/scriptdev/winterspring.ts +482 -0
- package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
- package/src/domain/scriptdev/worldBosses.ts +605 -0
- package/src/domain/scriptdev/zulfarrak.ts +478 -0
- package/src/domain/scriptdev/zulgurub.ts +1152 -0
- package/src/domain/sim/dummySim.ts +408 -0
- package/src/domain/sim/targetDummy.ts +29 -0
- package/src/domain/social/guild.ts +148 -0
- package/src/domain/spells/areaAuraMembership.ts +93 -0
- package/src/domain/spells/breakableStunCc.ts +166 -0
- package/src/domain/spells/cancelAura.ts +80 -0
- package/src/domain/spells/diminishing.ts +167 -0
- package/src/domain/spells/dispel.ts +149 -0
- package/src/domain/spells/dispelMechanic.ts +105 -0
- package/src/domain/spells/equipSpells.ts +247 -0
- package/src/domain/spells/learnOnTargets.ts +260 -0
- package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
- package/src/domain/spells/resurrectSpell.ts +124 -0
- package/src/domain/spells/spellPushback.ts +39 -0
- package/src/domain/spells/spellReflect.ts +43 -0
- package/src/domain/spells/stealth.ts +183 -0
- package/src/domain/spells/totem.ts +394 -0
- package/src/domain/spells/worldCast.ts +187 -0
- package/src/domain/world/areaTriggerLocks.ts +177 -0
- package/src/domain/world/dungeonMusic.ts +108 -0
- package/src/domain/world/gameEvents.ts +119 -0
- package/src/domain/world/gameObjects.ts +1030 -0
- package/src/domain/world/goEventFire.ts +234 -0
- package/src/domain/world/goMoTransport.ts +74 -0
- package/src/domain/world/goTransport.ts +81 -0
- package/src/domain/world/hazards.ts +459 -0
- package/src/domain/world/openLock.ts +398 -0
- package/src/domain/world/pools.ts +470 -0
- package/src/domain/world/restArea.ts +37 -0
- package/src/domain/world/weather.ts +201 -0
- package/src/domain/zoneAmbience.mjs +87 -0
- package/src/domain/zoneMusic.mjs +62 -0
- package/src/domain/zoneMusicQueue.mjs +7 -0
- package/src/engine/combat/activeSeal.ts +39 -0
- package/src/engine/combat/aiTargetResolve.ts +64 -0
- package/src/engine/combat/aoeCast.ts +289 -0
- package/src/engine/combat/applyConsumeAura.ts +74 -0
- package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
- package/src/engine/combat/applyDispelMechanic.ts +30 -0
- package/src/engine/combat/applyHealEffect.ts +301 -0
- package/src/engine/combat/applySchoolAbsorb.ts +114 -0
- package/src/engine/combat/applySpell.ts +3169 -0
- package/src/engine/combat/applySpellLate.ts +2026 -0
- package/src/engine/combat/applySpellLateBag.ts +144 -0
- package/src/engine/combat/areaAura.ts +283 -0
- package/src/engine/combat/attackTable.ts +508 -0
- package/src/engine/combat/battleRez.ts +87 -0
- package/src/engine/combat/castAction.ts +36 -0
- package/src/engine/combat/castTargetGates.ts +75 -0
- package/src/engine/combat/castableKit.ts +68 -0
- package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
- package/src/engine/combat/chainFan.ts +210 -0
- package/src/engine/combat/channel.ts +423 -0
- package/src/engine/combat/chaseCloseness.ts +95 -0
- package/src/engine/combat/cmangosCastGates.ts +129 -0
- package/src/engine/combat/combatFlag.ts +77 -0
- package/src/engine/combat/combatGeometry.ts +1329 -0
- package/src/engine/combat/combustion.ts +68 -0
- package/src/engine/combat/context.ts +730 -0
- package/src/engine/combat/createSession.ts +1165 -0
- package/src/engine/combat/creatureLeash.ts +38 -0
- package/src/engine/combat/crowdControl.ts +1259 -0
- package/src/engine/combat/dispelDuty.ts +54 -0
- package/src/engine/combat/dispelReflect.ts +609 -0
- package/src/engine/combat/displaceFloor.ts +113 -0
- package/src/engine/combat/duelBounds.ts +47 -0
- package/src/engine/combat/equippedItemGate.ts +297 -0
- package/src/engine/combat/evadeLifecycle.ts +63 -0
- package/src/engine/combat/eventAi.ts +2220 -0
- package/src/engine/combat/facing.ts +74 -0
- package/src/engine/combat/fearFlee.ts +137 -0
- package/src/engine/combat/fighterFactory.ts +1144 -0
- package/src/engine/combat/forceDespawnAction.ts +51 -0
- package/src/engine/combat/formulas.ts +807 -0
- package/src/engine/combat/friendlyFan.ts +55 -0
- package/src/engine/combat/groundPoolTick.ts +210 -0
- package/src/engine/combat/hazards.ts +114 -0
- package/src/engine/combat/healTargets.ts +226 -0
- package/src/engine/combat/heartbeatResist.ts +49 -0
- package/src/engine/combat/hostileItemUse.ts +75 -0
- package/src/engine/combat/interruptAuras.ts +66 -0
- package/src/engine/combat/itemRescue.ts +49 -0
- package/src/engine/combat/itemUse.ts +260 -0
- package/src/engine/combat/kitById.ts +23 -0
- package/src/engine/combat/knockBack.ts +201 -0
- package/src/engine/combat/leap.ts +89 -0
- package/src/engine/combat/mitigation.ts +587 -0
- package/src/engine/combat/modTaunt.ts +43 -0
- package/src/engine/combat/motionClaim.ts +268 -0
- package/src/engine/combat/motionGate.ts +150 -0
- package/src/engine/combat/motionGenerator.ts +27 -0
- package/src/engine/combat/navSight.ts +138 -0
- package/src/engine/combat/perfSink.ts +28 -0
- package/src/engine/combat/periodicDue.ts +55 -0
- package/src/engine/combat/petAuras.ts +86 -0
- package/src/engine/combat/pickAction.ts +3449 -0
- package/src/engine/combat/powerForm.ts +735 -0
- package/src/engine/combat/powerPools.ts +49 -0
- package/src/engine/combat/predicates.ts +538 -0
- package/src/engine/combat/procsDamage.ts +1823 -0
- package/src/engine/combat/reactiveGates.ts +135 -0
- package/src/engine/combat/roles.ts +389 -0
- package/src/engine/combat/rotationSubject.ts +78 -0
- package/src/engine/combat/ruleAfter.ts +106 -0
- package/src/engine/combat/seedDisplayAuras.ts +203 -0
- package/src/engine/combat/seedOocEffects.ts +317 -0
- package/src/engine/combat/seedSchoolImmunities.ts +45 -0
- package/src/engine/combat/session-types.ts +458 -0
- package/src/engine/combat/sessionApi.ts +1785 -0
- package/src/engine/combat/sessionCharge.ts +124 -0
- package/src/engine/combat/sessionChase.ts +869 -0
- package/src/engine/combat/sessionDeaths.ts +469 -0
- package/src/engine/combat/sessionFocus.ts +506 -0
- package/src/engine/combat/sessionFollow.ts +167 -0
- package/src/engine/combat/sessionGeometry.ts +188 -0
- package/src/engine/combat/sessionHome.ts +75 -0
- package/src/engine/combat/sessionInject.ts +719 -0
- package/src/engine/combat/sessionMechanicMove.ts +555 -0
- package/src/engine/combat/sessionMotion.ts +1553 -0
- package/src/engine/combat/sessionMotionKit.ts +247 -0
- package/src/engine/combat/sessionMoveIntent.ts +49 -0
- package/src/engine/combat/sessionMoveOrder.ts +200 -0
- package/src/engine/combat/sessionPathTo.ts +657 -0
- package/src/engine/combat/sessionPools.ts +688 -0
- package/src/engine/combat/sessionSteer.ts +144 -0
- package/src/engine/combat/sessionStepBack.ts +151 -0
- package/src/engine/combat/sessionStepWrap.ts +116 -0
- package/src/engine/combat/sessionView.ts +442 -0
- package/src/engine/combat/simEffects.ts +32 -0
- package/src/engine/combat/simFacade.ts +620 -0
- package/src/engine/combat/simPump.ts +264 -0
- package/src/engine/combat/simSnapshot.ts +165 -0
- package/src/engine/combat/simThreadPool.ts +35 -0
- package/src/engine/combat/skeramImages.ts +57 -0
- package/src/engine/combat/slowUpdate.ts +178 -0
- package/src/engine/combat/snapToFloor.ts +42 -0
- package/src/engine/combat/speedAura.ts +29 -0
- package/src/engine/combat/spellReagents.ts +71 -0
- package/src/engine/combat/stealthDetect.ts +93 -0
- package/src/engine/combat/stepBackMotion.ts +171 -0
- package/src/engine/combat/stepSession.ts +3102 -0
- package/src/engine/combat/summonCast.ts +243 -0
- package/src/engine/combat/thaddiusPolarity.ts +97 -0
- package/src/engine/combat/threat.ts +388 -0
- package/src/engine/combat/threatOps.ts +272 -0
- package/src/engine/combat/tickWorkerBody.ts +211 -0
- package/src/engine/combat/totemAuras.ts +122 -0
- package/src/engine/combat/triggerPayload.ts +42 -0
- package/src/engine/combat/triggeredCompanion.ts +63 -0
- package/src/engine/combat/types.ts +1897 -0
- package/src/engine/combat/useObjectTrap.ts +140 -0
- package/src/engine/combat/walkSurface.ts +54 -0
- package/src/engine/combat/weapon.ts +1248 -0
- package/src/engine/combat/worldFrame.ts +43 -0
- package/src/engine/combat.solo-golden.json +2242 -0
- package/src/engine/combat.ts +84 -0
- package/src/engine/core/detMath.ts +289 -0
- package/src/engine/core/events.ts +357 -0
- package/src/engine/core/rng.ts +36 -0
- package/src/engine/game/actionBars.ts +124 -0
- package/src/engine/game/activateObjectFromSpell.ts +320 -0
- package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
- package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
- package/src/engine/game/applyDoorFromDbScript.ts +388 -0
- package/src/engine/game/applyEscortFromDbScript.ts +290 -0
- package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
- package/src/engine/game/applyHoverFromDbScript.ts +110 -0
- package/src/engine/game/applyOocResurrect.ts +71 -0
- package/src/engine/game/applySpellDurability.ts +115 -0
- package/src/engine/game/applyTailFromDbScript.ts +478 -0
- package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
- package/src/engine/game/auctionMail.ts +269 -0
- package/src/engine/game/bagOverflow.ts +130 -0
- package/src/engine/game/bank.ts +110 -0
- package/src/engine/game/barAutofill.ts +26 -0
- package/src/engine/game/battleground.ts +369 -0
- package/src/engine/game/combatEnemySpec.ts +216 -0
- package/src/engine/game/combatObjectTraps.ts +167 -0
- package/src/engine/game/combatSeed.ts +320 -0
- package/src/engine/game/combatSession.ts +3241 -0
- package/src/engine/game/combatSessionClock.ts +62 -0
- package/src/engine/game/companionQuestActions.ts +242 -0
- package/src/engine/game/companionTraining.ts +40 -0
- package/src/engine/game/consumables.ts +624 -0
- package/src/engine/game/context.ts +53 -0
- package/src/engine/game/createHealthstone.ts +45 -0
- package/src/engine/game/deathFlow.ts +127 -0
- package/src/engine/game/devGrant.ts +117 -0
- package/src/engine/game/dynamicObject.ts +365 -0
- package/src/engine/game/enchantItem.ts +177 -0
- package/src/engine/game/equipmentHelper.ts +806 -0
- package/src/engine/game/factionState.ts +108 -0
- package/src/engine/game/garmentsOoc.ts +69 -0
- package/src/engine/game/globalActionBar.ts +179 -0
- package/src/engine/game/goInteractQuestCredit.ts +51 -0
- package/src/engine/game/goMoTransportUse.ts +61 -0
- package/src/engine/game/goTransportUse.ts +60 -0
- package/src/engine/game/healthstoneUpkeep.ts +59 -0
- package/src/engine/game/killSkin.ts +124 -0
- package/src/engine/game/learnFromItem.ts +118 -0
- package/src/engine/game/loadReconcile.ts +551 -0
- package/src/engine/game/loot.ts +294 -0
- package/src/engine/game/macros.ts +125 -0
- package/src/engine/game/mail.ts +293 -0
- package/src/engine/game/meetingStoneQueue.ts +75 -0
- package/src/engine/game/meetingStoneUse.ts +54 -0
- package/src/engine/game/newGameState.ts +363 -0
- package/src/engine/game/oocAuraInterrupt.ts +92 -0
- package/src/engine/game/oocCast.ts +241 -0
- package/src/engine/game/oocCastEffects.ts +803 -0
- package/src/engine/game/oocCastMethods.ts +1077 -0
- package/src/engine/game/openLockFromSpell.ts +174 -0
- package/src/engine/game/outdoorPvp.ts +187 -0
- package/src/engine/game/outfitter.ts +644 -0
- package/src/engine/game/paladinBoard.ts +393 -0
- package/src/engine/game/partyAuras.ts +121 -0
- package/src/engine/game/persistCombatAuras.ts +91 -0
- package/src/engine/game/pets.ts +459 -0
- package/src/engine/game/prePullHealthstones.ts +154 -0
- package/src/engine/game/professions.ts +2227 -0
- package/src/engine/game/pruneStaleRuntime.ts +39 -0
- package/src/engine/game/questFightCredit.ts +36 -0
- package/src/engine/game/questItemOnCorpse.ts +166 -0
- package/src/engine/game/questItemOnCreature.ts +103 -0
- package/src/engine/game/questLog.ts +879 -0
- package/src/engine/game/questSpellComplete.ts +21 -0
- package/src/engine/game/questTurnIn.ts +598 -0
- package/src/engine/game/raidParty.ts +32 -0
- package/src/engine/game/reagentBuyIn.ts +39 -0
- package/src/engine/game/regenRest.ts +186 -0
- package/src/engine/game/rotation.ts +425 -0
- package/src/engine/game/runFullDungeon.ts +611 -0
- package/src/engine/game/runSupply.ts +80 -0
- package/src/engine/game/sanitizeDriftedItems.ts +135 -0
- package/src/engine/game/scriptDevGoUse.ts +397 -0
- package/src/engine/game/scriptDevInnkeeper.ts +150 -0
- package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
- package/src/engine/game/sendEventFromSpell.ts +87 -0
- package/src/engine/game/sortContainers.ts +85 -0
- package/src/engine/game/spellReputation.ts +69 -0
- package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
- package/src/engine/game/squadDungeon.ts +4222 -0
- package/src/engine/game/squadQuestShare.ts +260 -0
- package/src/engine/game/summonObjectSlot.ts +69 -0
- package/src/engine/game/summonObjectWild.ts +73 -0
- package/src/engine/game/summoningRitualUse.ts +141 -0
- package/src/engine/game/talents.ts +356 -0
- package/src/engine/game/tamingRodUse.ts +66 -0
- package/src/engine/game/tempSpawnCreature.ts +136 -0
- package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
- package/src/engine/game/tickTimedQuests.ts +28 -0
- package/src/engine/game/trade.ts +586 -0
- package/src/engine/game/travel.ts +1155 -0
- package/src/engine/game/types.ts +1855 -0
- package/src/engine/game/vendorOffers.ts +244 -0
- package/src/engine/game/weaponImbueItem.ts +281 -0
- package/src/engine/game/worldSession.ts +183 -0
- package/src/engine/game/worldState.ts +166 -0
- package/src/engine/game.ts +968 -0
- package/src/engine/spells/GAP.md +67 -0
- package/src/engine/spells/absorbs.ts +376 -0
- package/src/engine/spells/addTargetTrigger.ts +53 -0
- package/src/engine/spells/auraPerSecondCost.ts +50 -0
- package/src/engine/spells/auraStacking.ts +497 -0
- package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
- package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
- package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
- package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
- package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
- package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
- package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
- package/src/engine/spells/cmangos-special-cases.ts +1570 -0
- package/src/engine/spells/conditions.ts +718 -0
- package/src/engine/spells/effects.ts +203 -0
- package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
- package/src/engine/spells/immunity.ts +942 -0
- package/src/engine/spells/intentEffects.ts +351 -0
- package/src/engine/spells/interpreter/GAPS.md +21 -0
- package/src/engine/spells/interpreter/amount.ts +109 -0
- package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
- package/src/engine/spells/interpreter/diff.ts +246 -0
- package/src/engine/spells/interpreter/duration.ts +90 -0
- package/src/engine/spells/interpreter/form-attrs.json +1 -0
- package/src/engine/spells/interpreter/form-attrs.ts +95 -0
- package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
- package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
- package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
- package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
- package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
- package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
- package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
- package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
- package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
- package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
- package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
- package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
- package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
- package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
- package/src/engine/spells/interpreter/handlers.ts +9 -0
- package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
- package/src/engine/spells/interpreter/index.ts +525 -0
- package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
- package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
- package/src/engine/spells/interpreter/mage-portals.ts +37 -0
- package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
- package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
- package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
- package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
- package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
- package/src/engine/spells/interpreter/opcodes.ts +789 -0
- package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
- package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
- package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
- package/src/engine/spells/interpreter/proc.ts +443 -0
- package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
- package/src/engine/spells/interpreter/registry/index.ts +216 -0
- package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
- package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
- package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
- package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
- package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
- package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
- package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
- package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
- package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
- package/src/engine/spells/interpreter/registry/types.ts +48 -0
- package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
- package/src/engine/spells/interpreter/targeting.ts +90 -0
- package/src/engine/spells/interpreter/types-intent.ts +1501 -0
- package/src/engine/spells/interpreter/types.ts +419 -0
- package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
- package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
- package/src/engine/spells/interrupt.ts +217 -0
- package/src/engine/spells/meleeAttackReset.ts +60 -0
- package/src/engine/spells/oocTriggerSpell.ts +49 -0
- package/src/engine/spells/overrideClassScripts.ts +319 -0
- package/src/engine/spells/parryHaste.ts +20 -0
- package/src/engine/spells/procs.ts +300 -0
- package/src/engine/spells/recovery.ts +203 -0
- package/src/engine/spells/scriptTargetDest.ts +76 -0
- package/src/engine/spells/scriptTargets.ts +85 -0
- package/src/engine/spells/singleTargetAura.ts +82 -0
- package/src/engine/spells/specialCasePayloads.ts +57 -0
- package/src/engine/spells/spellAttributes.ts +249 -0
- package/src/engine/spells/spellBonus.ts +143 -0
- package/src/engine/spells/spellModIntents.ts +419 -0
- package/src/engine/spells/spellMods.ts +283 -0
- package/src/engine/spells/spellRadius.ts +15 -0
- package/src/engine/spells/trapObjects.ts +26 -0
- package/src/json.d.ts +7 -0
- package/src/persistence/memoryRepository.ts +23 -0
- package/src/persistence/saveBackups.ts +162 -0
- package/src/persistence/saveFile.ts +68 -0
- package/src/persistence/saveRepository.ts +11 -0
- package/src/persistence/saveShape.ts +668 -0
- package/src/progression/leveling.ts +89 -0
- package/src/progression/rest.ts +1434 -0
- package/src/progression/training.ts +226 -0
- package/src/progression/xpGain.ts +369 -0
- package/src/quests/quests.ts +1580 -0
- package/src/world/aoePull.ts +198 -0
- package/src/world/areaTableDbc.ts +39 -0
- package/src/world/areaTableMapIdPairs.ts +141 -0
- package/src/world/bakeSlug.ts +43 -0
- package/src/world/continuousDungeon.ts +1250 -0
- package/src/world/dungeonBakeProjection.ts +190 -0
- package/src/world/dungeonMapDensity.ts +342 -0
- package/src/world/dungeonMapProjection.ts +135 -0
- package/src/world/dungeonNav.ts +904 -0
- package/src/world/dungeonNpcSim.ts +147 -0
- package/src/world/dungeonObjectives.ts +234 -0
- package/src/world/dungeonPreset.ts +35 -0
- package/src/world/dungeonRoute.ts +311 -0
- package/src/world/dungeonRouteGeometry.ts +732 -0
- package/src/world/dungeonRouteOrder.ts +1037 -0
- package/src/world/dungeonWingRooms.ts +426 -0
- package/src/world/escort.ts +296 -0
- package/src/world/goPoolRoll.ts +75 -0
- package/src/world/instanceObjects.ts +785 -0
- package/src/world/instances.ts +1572 -0
- package/src/world/meetingStones.ts +56 -0
- package/src/world/navmeshFloors.ts +145 -0
- package/src/world/nearGrid.ts +167 -0
- package/src/world/packBudget.ts +613 -0
- package/src/world/rareRoll.ts +335 -0
- package/src/world/routeAuthoring.ts +132 -0
- package/src/world/routeEdit.ts +209 -0
- package/src/world/world.ts +812 -0
- package/src/world/zoneHazards.ts +47 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// MOD_STUN to the Phonecraft CC surface. CMaNGOS uses aura 12 for hard stuns AND for sleep, shackle,
|
|
2
|
+
// sap and banish, so the Mechanic and AuraInterruptFlags decide the real behaviour.
|
|
3
|
+
|
|
4
|
+
import type { ControlKind, Mechanic, School, SpellDef, SpellEffect } from '../../data/schema.ts';
|
|
5
|
+
import { CREATURE_TYPE } from '../../data/schema.ts';
|
|
6
|
+
|
|
7
|
+
/** SharedDefines.h Mechanics (1-based). */
|
|
8
|
+
export const MECHANIC_SLEEP = 10;
|
|
9
|
+
export const MECHANIC_STUN = 12;
|
|
10
|
+
export const MECHANIC_FREEZE = 13;
|
|
11
|
+
export const MECHANIC_KNOCKOUT = 14;
|
|
12
|
+
export const MECHANIC_BANISH = 18;
|
|
13
|
+
export const MECHANIC_SHACKLE = 20;
|
|
14
|
+
export const MECHANIC_SAPPED = 30;
|
|
15
|
+
|
|
16
|
+
// Resolve the spell-level mechanic id for a MOD_STUN slot: the raw mechanic wins, with the DBC name
|
|
17
|
+
// and tooltip as the fallback for extracts that lost the column.
|
|
18
|
+
export function resolveModStunMechanicId(
|
|
19
|
+
spell: Pick<SpellDef, 'name' | 'description'>,
|
|
20
|
+
rawMechanic: number,
|
|
21
|
+
): number {
|
|
22
|
+
const fromRaw = rawMechanic | 0;
|
|
23
|
+
if (fromRaw > 0) return fromRaw;
|
|
24
|
+
|
|
25
|
+
const name = (spell.name || '').toLowerCase();
|
|
26
|
+
// Exact DBC English names (Sleep ranks, Hibernate ranks, Shackle Undead ranks).
|
|
27
|
+
if (name === 'sleep' || name === 'hibernate' || name.startsWith('zzoldsleep')) {
|
|
28
|
+
return MECHANIC_SLEEP;
|
|
29
|
+
}
|
|
30
|
+
if (name === 'shackle undead') return MECHANIC_SHACKLE;
|
|
31
|
+
|
|
32
|
+
// Creature-cast sleeps sometimes use unique names; tooltip still says awaken.
|
|
33
|
+
const desc = (spell.description || '').toLowerCase();
|
|
34
|
+
if (desc.includes('awaken') && (desc.includes('to sleep') || desc.includes('puts') && desc.includes('sleep'))) {
|
|
35
|
+
return MECHANIC_SLEEP;
|
|
36
|
+
}
|
|
37
|
+
if (desc.includes('shackle') && desc.includes('undead')) return MECHANIC_SHACKLE;
|
|
38
|
+
|
|
39
|
+
return 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export interface ModStunCcShape {
|
|
43
|
+
control: ControlKind;
|
|
44
|
+
mechanic: Mechanic;
|
|
45
|
+
breakOnDamage?: boolean;
|
|
46
|
+
onlyTypes?: number[];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Map a mechanic id to the engine CC shape for MOD_STUN. A hard stun stays control plus mechanic with
|
|
50
|
+
// no break-on-damage. Sap and Gouge share knockout with bombs, so the name separates them.
|
|
51
|
+
export function modStunCcShape(mechanicId: number, spellName?: string): ModStunCcShape {
|
|
52
|
+
const name = (spellName || '').toLowerCase();
|
|
53
|
+
// Sap / Gouge: classic stores MECHANIC_KNOCKOUT (14); play surface is incap+sap.
|
|
54
|
+
// Cite: SpellMgr.h MECHANIC_KNOCKOUT Includes Sap, Gouge; enrich-stealth.mjs.
|
|
55
|
+
if (name === 'sap' || name === 'gouge') {
|
|
56
|
+
return { control: 'incapacitate', mechanic: 'sap', breakOnDamage: true };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
switch (mechanicId | 0) {
|
|
60
|
+
case MECHANIC_SLEEP:
|
|
61
|
+
// Sleep / Hibernate: break-on-damage incapacitate. DR track = sleep.
|
|
62
|
+
// Cite: SpellMgr.h MECHANIC_SLEEP; tooltip "Any damage caused will awaken".
|
|
63
|
+
return { control: 'incapacitate', mechanic: 'sleep', breakOnDamage: true };
|
|
64
|
+
case MECHANIC_SHACKLE:
|
|
65
|
+
// Shackle Undead: break-on-damage incap, undead only. The mechanic is SHACKLE, not sleep, so
|
|
66
|
+
// Will of the Forsaken must not purge it. Cite: SharedDefines MECHANIC_SHACKLE=20.
|
|
67
|
+
return {
|
|
68
|
+
control: 'incapacitate',
|
|
69
|
+
mechanic: 'shackle',
|
|
70
|
+
breakOnDamage: true,
|
|
71
|
+
onlyTypes: [CREATURE_TYPE.UNDEAD],
|
|
72
|
+
};
|
|
73
|
+
case MECHANIC_SAPPED:
|
|
74
|
+
return { control: 'incapacitate', mechanic: 'sap', breakOnDamage: true };
|
|
75
|
+
case MECHANIC_KNOCKOUT:
|
|
76
|
+
// Bombs, Gouge and Sap share knockout. Without a Sap or Gouge name above, keep break-on-damage
|
|
77
|
+
// with the real mechanic id rather than collapsing it to a stun.
|
|
78
|
+
return { control: 'stun', mechanic: 'knockout', breakOnDamage: true };
|
|
79
|
+
case MECHANIC_BANISH:
|
|
80
|
+
// Banish isolation rides mechanic banish; control stays stun-like lockout.
|
|
81
|
+
// Cite: SpellAuras.cpp ~3025 MECHANIC_BANISH → UNIT_STAT_ISOLATED.
|
|
82
|
+
return { control: 'stun', mechanic: 'banish' };
|
|
83
|
+
case MECHANIC_FREEZE:
|
|
84
|
+
// Freezing Trap Effect: MOD_STUN + damage break. Cite: spell_template 3355 AIF=2.
|
|
85
|
+
return { control: 'stun', mechanic: 'freeze', breakOnDamage: true };
|
|
86
|
+
default:
|
|
87
|
+
// MECHANIC_STUN (12) or 0 / unknown → hard stun.
|
|
88
|
+
return { control: 'stun', mechanic: 'stun' };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// AURA_INTERRUPT_FLAG_DAMAGE — any damage removes the aura. The dump has 0 on every row, so the live
|
|
93
|
+
// source is Spell.dbc field 18. Cite: SpellDefines.h:362–386; Unit.cpp DealDamage.
|
|
94
|
+
export const AURA_INTERRUPT_FLAG_DAMAGE = 0x2;
|
|
95
|
+
|
|
96
|
+
/** Build a cc SpellEffect for a MOD_STUN slot. */
|
|
97
|
+
export function buildModStunCcEffect(
|
|
98
|
+
mechanicId: number,
|
|
99
|
+
durationMs: number,
|
|
100
|
+
school: School,
|
|
101
|
+
spellName?: string,
|
|
102
|
+
/** Spell.dbc AuraInterruptFlags (or 0). When DAMAGE is set, stamp breakOnDamage. */
|
|
103
|
+
auraInterruptFlags = 0,
|
|
104
|
+
): SpellEffect {
|
|
105
|
+
const shape = modStunCcShape(mechanicId, spellName);
|
|
106
|
+
const eff: SpellEffect = {
|
|
107
|
+
kind: 'cc',
|
|
108
|
+
control: shape.control,
|
|
109
|
+
mechanic: shape.mechanic,
|
|
110
|
+
durationMs,
|
|
111
|
+
school,
|
|
112
|
+
};
|
|
113
|
+
// Mechanic-driven break (sleep/knockout/freeze) OR DBC AIF_DAMAGE (Tidal Charm, bombs, Encage).
|
|
114
|
+
// Hammer of Justice has AIF=0 so stays hard. Cite: Spell.dbc field 18; census dimension I.
|
|
115
|
+
if (shape.breakOnDamage || ((auraInterruptFlags | 0) & AURA_INTERRUPT_FLAG_DAMAGE) !== 0) {
|
|
116
|
+
(eff as { breakOnDamage?: boolean }).breakOnDamage = true;
|
|
117
|
+
}
|
|
118
|
+
if (shape.onlyTypes) (eff as { onlyTypes?: number[] }).onlyTypes = shape.onlyTypes;
|
|
119
|
+
return eff;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** SPELL_AURA_MOD_CONFUSE — SetConfused, never SetStunned. Cite: SpellAuras.cpp:2354–2366. */
|
|
123
|
+
const SPELL_AURA_MOD_CONFUSE = 5;
|
|
124
|
+
|
|
125
|
+
// In-place retag of a MOD_CONFUSE disorient the bake surfaced as a hard stun: Blind and Scatter Shot
|
|
126
|
+
// read as stuns that no damage ended. Gated on an actual aura-5 slot, so a real stun cannot be caught.
|
|
127
|
+
export function retagDisorientOnSpell(spell: SpellDef): boolean {
|
|
128
|
+
if (!spell.effects?.length) return false;
|
|
129
|
+
if (!spell.rawEffects?.some((r) => (r.auraName | 0) === SPELL_AURA_MOD_CONFUSE)) return false;
|
|
130
|
+
let changed = false;
|
|
131
|
+
for (const e of spell.effects) {
|
|
132
|
+
if (e.kind !== 'cc' || e.mechanic !== 'disoriented') continue;
|
|
133
|
+
if (e.control === 'incapacitate' && e.breakOnDamage === true) continue;
|
|
134
|
+
(e as { control: ControlKind }).control = 'incapacitate';
|
|
135
|
+
(e as { breakOnDamage?: boolean }).breakOnDamage = true;
|
|
136
|
+
changed = true;
|
|
137
|
+
}
|
|
138
|
+
return changed;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// In-place retag of bake-surface hard-stun CC that is really sleep, shackle or hibernate, for repros
|
|
142
|
+
// and kits that read bake effects before resolve. Real stuns are untouched.
|
|
143
|
+
export function retagBreakableStunOnSpell(spell: SpellDef): boolean {
|
|
144
|
+
if (!spell.effects?.length) return false;
|
|
145
|
+
const mechId = resolveModStunMechanicId(spell, 0);
|
|
146
|
+
if (!mechId || mechId === MECHANIC_STUN) return false;
|
|
147
|
+
// Only retag when the slot still looks like generic MOD_STUN hard stun.
|
|
148
|
+
let changed = false;
|
|
149
|
+
for (let i = 0; i < spell.effects.length; i++) {
|
|
150
|
+
const e = spell.effects[i]!;
|
|
151
|
+
if (e.kind !== 'cc') continue;
|
|
152
|
+
if (e.control !== 'stun' || e.mechanic !== 'stun') continue;
|
|
153
|
+
const next = buildModStunCcEffect(mechId, e.durationMs, e.school, spell.name);
|
|
154
|
+
spell.effects[i] = next;
|
|
155
|
+
changed = true;
|
|
156
|
+
}
|
|
157
|
+
// Also stamp raw.mechanic so later SI paths see the sourced id without name fallback.
|
|
158
|
+
if (changed && spell.rawEffects) {
|
|
159
|
+
for (const raw of spell.rawEffects) {
|
|
160
|
+
if ((raw.auraName | 0) === 12 && (raw.mechanic | 0) === 0) {
|
|
161
|
+
raw.mechanic = mechId;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return changed;
|
|
166
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// CMSG_CANCEL_AURA — right-clicking a buff drops the aura. A port of HandleCancelAuraOpcode. Word 0
|
|
2
|
+
// and word 1 attributes are both baked, so every bit this gate needs is readable.
|
|
3
|
+
|
|
4
|
+
import type { SpellDef } from '../../data/schema/spell.ts';
|
|
5
|
+
import { SPELL_ATTR } from '../../engine/spells/spellAttributes.ts';
|
|
6
|
+
import { isPartyAreaAura } from './areaAuraMembership.ts';
|
|
7
|
+
|
|
8
|
+
/** SPELL_ATTR_AURA_IS_DEBUFF. Cite: SpellDefines.h:56 (word 0 bit 26). */
|
|
9
|
+
export const SPELL_ATTR_AURA_IS_DEBUFF = 0x04000000;
|
|
10
|
+
/** SPELL_ATTR_EX_NO_AURA_ICON. Cite: SpellDefines.h:94 (word 1 bit 28). */
|
|
11
|
+
export const SPELL_ATTR_EX_NO_AURA_ICON = 0x10000000;
|
|
12
|
+
|
|
13
|
+
/** Why a right-click did nothing, or null when the aura may be cancelled. */
|
|
14
|
+
export type AuraCancelRefusal =
|
|
15
|
+
| 'unknown-spell'
|
|
16
|
+
| 'passive'
|
|
17
|
+
| 'debuff'
|
|
18
|
+
| 'no-aura-cancel'
|
|
19
|
+
| 'no-aura-icon'
|
|
20
|
+
| 'channeled'
|
|
21
|
+
| 'possessed'
|
|
22
|
+
| 'foreign-area-aura';
|
|
23
|
+
|
|
24
|
+
// The two gate inputs that are state rather than spell data, both straight off the opcode: is the
|
|
25
|
+
// player possessed or charmed, and is the holder's caster the player.
|
|
26
|
+
export interface AuraCancelState {
|
|
27
|
+
/** True while something else drives the player. Refuses every cancel. */
|
|
28
|
+
possessed?: boolean;
|
|
29
|
+
// True when the player is the holder's caster. Only consulted for an area aura, and `undefined` counts as
|
|
30
|
+
// NOT own — an unknown caster must not open a cancel the core refuses.
|
|
31
|
+
ownAura?: boolean;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// HandleCancelAuraOpcode in the core's own order, so the reason reported is the gate the client would
|
|
35
|
+
// have hit. Only the holder lookup is left to the caller, which already holds the aura.
|
|
36
|
+
export function auraCancelRefusal(
|
|
37
|
+
sp: SpellDef | null | undefined,
|
|
38
|
+
st: AuraCancelState = {},
|
|
39
|
+
): AuraCancelRefusal | null {
|
|
40
|
+
if (!sp) return 'unknown-spell';
|
|
41
|
+
const attr = (sp.attributes ?? 0) >>> 0;
|
|
42
|
+
// :431 SPELL_ATTR_NO_AURA_CANCEL.
|
|
43
|
+
if (attr & SPELL_ATTR.NO_AURA_CANCEL) return 'no-aura-cancel';
|
|
44
|
+
// :434 SPELL_ATTR_EX_NO_AURA_ICON. Word 1 is baked; 933 rows carry the bit.
|
|
45
|
+
if (((sp.attributesEx ?? 0) >>> 0) & SPELL_ATTR_EX_NO_AURA_ICON) return 'no-aura-icon';
|
|
46
|
+
// :437 IsPassiveSpell (SpellMgr.h:340); `passive` is the baked word-0 bit 6, exact on every row.
|
|
47
|
+
if (sp.passive) return 'passive';
|
|
48
|
+
// :446 "cant remove any auras while possessed" — UNIT_FLAG_POSSESSED || HasCharmer().
|
|
49
|
+
if (st.possessed) return 'possessed';
|
|
50
|
+
// :450 !holder->IsPositive() (SpellAuras.cpp:5846). The engine's own buffs/debuffs split covers
|
|
51
|
+
// the hostile-caster case; this is the attribute half (IsPositiveAuraEffect, SpellMgr.h:1214).
|
|
52
|
+
if (attr & SPELL_ATTR_AURA_IS_DEBUFF) return 'debuff';
|
|
53
|
+
// :475 IsChanneledSpell (SpellMgr.h:1373) — the core interrupts the channel, not the holder.
|
|
54
|
+
if (sp.channelMs) return 'channeled';
|
|
55
|
+
// "Not own area auras can't be cancelled". isPartyAreaAura is this tree's predicate for
|
|
56
|
+
// effect 35 and also catches the bake rows carrying only that — the auras you hold but did not cast.
|
|
57
|
+
if (!st.ownAura && isPartyAreaAura(sp)) return 'foreign-area-aura';
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Reason text for a refused cancel. The real client draws no cancelable flag on these and a
|
|
62
|
+
// right-click does nothing, so a caller should prefer silence; these exist for the dev log.
|
|
63
|
+
export const CANCEL_AURA_REFUSAL_TEXT: Record<AuraCancelRefusal, string> = {
|
|
64
|
+
'unknown-spell': 'Unknown spell',
|
|
65
|
+
passive: 'That is a passive effect',
|
|
66
|
+
debuff: 'You cannot remove a debuff',
|
|
67
|
+
'no-aura-cancel': 'That effect cannot be cancelled',
|
|
68
|
+
'no-aura-icon': 'That effect cannot be cancelled',
|
|
69
|
+
channeled: 'Stop the channel instead',
|
|
70
|
+
possessed: 'You are not in control of yourself',
|
|
71
|
+
'foreign-area-aura': 'Only the caster can cancel that aura',
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/** True when a buff chip for `sp` should respond to a right-click. */
|
|
75
|
+
export function canCancelAura(
|
|
76
|
+
sp: SpellDef | null | undefined,
|
|
77
|
+
st: AuraCancelState = {},
|
|
78
|
+
): boolean {
|
|
79
|
+
return auraCancelRefusal(sp, st) === null;
|
|
80
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// Pure CC diminishing returns. Cite: Unit.cpp ApplyDiminishingToDuration ~8851; Unit.h
|
|
2
|
+
// DiminishingLevels; SpellMgr.cpp GetDiminishingReturnsGroupForSpell ~2636. No DOM, no I/O.
|
|
3
|
+
|
|
4
|
+
/** DiminishingLevels (Unit.h). */
|
|
5
|
+
export const DIMINISHING_LEVEL = {
|
|
6
|
+
LEVEL_1: 0,
|
|
7
|
+
LEVEL_2: 1,
|
|
8
|
+
LEVEL_3: 2,
|
|
9
|
+
IMMUNE: 3,
|
|
10
|
+
} as const;
|
|
11
|
+
|
|
12
|
+
/** Duration multiplier by level (Unit.cpp ApplyDiminishingToDuration). */
|
|
13
|
+
export function diminishingDurationMod(level: number): number {
|
|
14
|
+
switch (level) {
|
|
15
|
+
case DIMINISHING_LEVEL.LEVEL_1: return 1.0;
|
|
16
|
+
case DIMINISHING_LEVEL.LEVEL_2: return 0.5;
|
|
17
|
+
case DIMINISHING_LEVEL.LEVEL_3: return 0.25;
|
|
18
|
+
case DIMINISHING_LEVEL.IMMUNE: return 0.0;
|
|
19
|
+
default: return 1.0;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Apply DR to duration ms. Permanent (-1) and NONE group skip. Cite: Unit.cpp ~8851–8878. */
|
|
24
|
+
export function applyDiminishingToDuration(durationMs: number, level: number): number {
|
|
25
|
+
if (durationMs < 0) return durationMs; // permanent
|
|
26
|
+
const mod = diminishingDurationMod(level);
|
|
27
|
+
return Math.floor(durationMs * mod);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** 15s DR hit window (Unit.h DiminishingReturn hitTime comment). */
|
|
31
|
+
export const DR_HIT_WINDOW_MS = 15_000;
|
|
32
|
+
|
|
33
|
+
export interface DrState {
|
|
34
|
+
/** group id → { level, hitTimeMs } */
|
|
35
|
+
groups: Record<string, { level: number; hitTimeMs: number }>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function emptyDrState(): DrState {
|
|
39
|
+
return { groups: {} };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Get current level for a group, resetting to L1 if >15s since last hit. */
|
|
43
|
+
export function getDiminishingLevel(state: DrState, group: string, nowMs: number): number {
|
|
44
|
+
const g = state.groups[group];
|
|
45
|
+
if (!g) return DIMINISHING_LEVEL.LEVEL_1;
|
|
46
|
+
if (nowMs - g.hitTimeMs > DR_HIT_WINDOW_MS) return DIMINISHING_LEVEL.LEVEL_1;
|
|
47
|
+
return g.level;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** After a CC lands: bump level (L1→L2→L3→IMMUNE) and refresh hitTime. Returns new state (immutable). */
|
|
51
|
+
export function bumpDiminishing(state: DrState, group: string, nowMs: number): DrState {
|
|
52
|
+
const cur = getDiminishingLevel(state, group, nowMs);
|
|
53
|
+
const nextLevel = Math.min(DIMINISHING_LEVEL.IMMUNE, cur + 1);
|
|
54
|
+
return {
|
|
55
|
+
groups: {
|
|
56
|
+
...state.groups,
|
|
57
|
+
[group]: { level: nextLevel, hitTimeMs: nowMs },
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Map mechanic string → DR group key (simplified SpellMgr grouping). */
|
|
63
|
+
export function diminishingGroupForMechanic(mechanic: string, triggered = false): string {
|
|
64
|
+
switch (mechanic) {
|
|
65
|
+
case 'stun':
|
|
66
|
+
return triggered ? 'trigger_stun' : 'control_stun';
|
|
67
|
+
// MECHANIC_FREEZE has its OWN group and it is player-only, not the all-targets stun track, so
|
|
68
|
+
// Freezing Trap diminishes against players alone. Cite: SpellMgr.cpp:2700-2701.
|
|
69
|
+
case 'freeze':
|
|
70
|
+
return 'freeze';
|
|
71
|
+
case 'root':
|
|
72
|
+
case 'snare':
|
|
73
|
+
case 'daze':
|
|
74
|
+
return triggered ? 'trigger_root' : 'control_root';
|
|
75
|
+
case 'fear':
|
|
76
|
+
case 'turn':
|
|
77
|
+
return 'fear';
|
|
78
|
+
case 'horror': return 'deathcoil';
|
|
79
|
+
case 'polymorph':
|
|
80
|
+
case 'disoriented':
|
|
81
|
+
return 'polymorph';
|
|
82
|
+
case 'sleep':
|
|
83
|
+
case 'shackle':
|
|
84
|
+
return 'sleep';
|
|
85
|
+
case 'sap':
|
|
86
|
+
case 'knockout': return 'knockout';
|
|
87
|
+
case 'charm': return 'charm';
|
|
88
|
+
case 'silence':
|
|
89
|
+
case 'interrupt':
|
|
90
|
+
return 'silence';
|
|
91
|
+
case 'disarm': return 'disarm';
|
|
92
|
+
case 'banish': return 'banish';
|
|
93
|
+
default: return 'none';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// DiminishingReturnsType: 'all' applies even against creatures, 'player' only when the target is
|
|
98
|
+
// player-controlled, and 'none' is not subject to level DR at all.
|
|
99
|
+
export type DiminishingReturnsType = 'all' | 'player' | 'none';
|
|
100
|
+
|
|
101
|
+
// The groups a rotation may ASK ABOUT, in a stable order, so drLevel's ref is an index the editor can
|
|
102
|
+
// name. APPEND-ONLY: inserting or removing would change what a shipped row means.
|
|
103
|
+
export const DIMINISHING_GROUP_ORDER: readonly string[] = [
|
|
104
|
+
'control_stun', 'trigger_stun', 'control_root', 'trigger_root', 'fear',
|
|
105
|
+
'polymorph', 'sleep', 'knockout', 'charm', 'silence',
|
|
106
|
+
'disarm', 'banish', 'freeze', 'deathcoil',
|
|
107
|
+
] as const;
|
|
108
|
+
|
|
109
|
+
/** Cite: SpellMgr.cpp GetDiminishingReturnsGroupType ~2748 (CHARM → DRTYPE_ALL @2756). */
|
|
110
|
+
export function getDiminishingReturnsGroupType(group: string): DiminishingReturnsType {
|
|
111
|
+
switch (group) {
|
|
112
|
+
case 'control_stun':
|
|
113
|
+
case 'trigger_stun':
|
|
114
|
+
case 'kidneyshot':
|
|
115
|
+
case 'blind':
|
|
116
|
+
case 'charm':
|
|
117
|
+
// combat.ts simplified keys that map to the same DRTYPE_ALL groups:
|
|
118
|
+
case 'stun':
|
|
119
|
+
return 'all';
|
|
120
|
+
case 'sleep':
|
|
121
|
+
case 'control_root':
|
|
122
|
+
case 'trigger_root':
|
|
123
|
+
case 'fear':
|
|
124
|
+
case 'polymorph':
|
|
125
|
+
case 'deathcoil':
|
|
126
|
+
case 'freeze':
|
|
127
|
+
case 'banish':
|
|
128
|
+
case 'warlock_fear':
|
|
129
|
+
case 'knockout':
|
|
130
|
+
// combat.ts simplified shared tracks:
|
|
131
|
+
case 'incapacitate':
|
|
132
|
+
case 'root':
|
|
133
|
+
return 'player';
|
|
134
|
+
// 'silence' and 'disarm' fall through to 'none' ON PURPOSE, a departure from the source tier:
|
|
135
|
+
// both groups are marked "From 2.3.0", and 1.12 the game had no DR on either.
|
|
136
|
+
default:
|
|
137
|
+
return 'none';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Whether duration is scaled by DR level for this group. Charm is special: duration diminish only in PvP.
|
|
142
|
+
// Cite: SpellMgr.cpp IsDiminishingReturnsGroupDurationDiminished ~2737 (CHARM → pvp @2741).
|
|
143
|
+
export function isDiminishingReturnsGroupDurationDiminished(group: string, pvp: boolean): boolean {
|
|
144
|
+
if (group === 'charm') return pvp;
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Whether DR levels apply (step advances / immune tracking). Cite: SpellMgr.cpp
|
|
149
|
+
// IsSubjectToDiminishingLevels ~2778. true if (type == DRTYPE_PLAYER && pvp) || type == DRTYPE_ALL
|
|
150
|
+
export function isSubjectToDiminishingLevels(group: string, pvp: boolean): boolean {
|
|
151
|
+
const type = getDiminishingReturnsGroupType(group);
|
|
152
|
+
return type === 'all' || (type === 'player' && pvp);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Apply duration DR for a group, honoring charm's PvP-only duration diminish. Levels may still
|
|
156
|
+
// advance in PvE while the duration stays full. Cite: Unit.cpp ApplyDiminishingToDuration ~8851.
|
|
157
|
+
export function applyDiminishingToDurationForGroup(
|
|
158
|
+
durationMs: number,
|
|
159
|
+
level: number,
|
|
160
|
+
group: string,
|
|
161
|
+
pvp: boolean,
|
|
162
|
+
): number {
|
|
163
|
+
if (durationMs < 0) return durationMs; // permanent
|
|
164
|
+
if (!isSubjectToDiminishingLevels(group, pvp)) return durationMs;
|
|
165
|
+
if (!isDiminishingReturnsGroupDurationDiminished(group, pvp)) return durationMs;
|
|
166
|
+
return applyDiminishingToDuration(durationMs, level);
|
|
167
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// Dispel type masks plus a pure ProcessDispelList selection. Pure, with an injected rng for the
|
|
2
|
+
// selection; the miss chance is 0 until a spellmod says otherwise. Cite: SpellEffects.cpp ~2521.
|
|
3
|
+
|
|
4
|
+
/** SPELL_EFFECT_DISPEL — SpellEffectDefines.h. */
|
|
5
|
+
export const SPELL_EFFECT_DISPEL = 38;
|
|
6
|
+
|
|
7
|
+
export const DISPEL_TYPE = {
|
|
8
|
+
NONE: 0,
|
|
9
|
+
MAGIC: 1,
|
|
10
|
+
CURSE: 2,
|
|
11
|
+
DISEASE: 3,
|
|
12
|
+
POISON: 4,
|
|
13
|
+
STEALTH: 5,
|
|
14
|
+
INVISIBILITY: 6,
|
|
15
|
+
ALL: 7,
|
|
16
|
+
SPE_NPC_ONLY: 8,
|
|
17
|
+
ENRAGE: 9,
|
|
18
|
+
ZG_TICKET: 10,
|
|
19
|
+
} as const;
|
|
20
|
+
|
|
21
|
+
/** DISPEL_ALL_MASK = MAGIC|CURSE|DISEASE|POISON */
|
|
22
|
+
export const DISPEL_ALL_MASK =
|
|
23
|
+
(1 << DISPEL_TYPE.MAGIC) |
|
|
24
|
+
(1 << DISPEL_TYPE.CURSE) |
|
|
25
|
+
(1 << DISPEL_TYPE.DISEASE) |
|
|
26
|
+
(1 << DISPEL_TYPE.POISON);
|
|
27
|
+
|
|
28
|
+
/** GetDispellMask(DispelType) — bit for type, or ALL mask. */
|
|
29
|
+
export function getDispelMask(dispelType: number): number {
|
|
30
|
+
if (dispelType === DISPEL_TYPE.ALL) return DISPEL_ALL_MASK;
|
|
31
|
+
if (dispelType <= 0) return 0;
|
|
32
|
+
return 1 << dispelType;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface DispellableAura {
|
|
36
|
+
spellId: number;
|
|
37
|
+
/** Aura Dispel field from SpellEntry. */
|
|
38
|
+
dispelType: number;
|
|
39
|
+
stacks: number;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function isDispellableByMask(aura: DispellableAura, mask: number): boolean {
|
|
43
|
+
if (!mask) return false;
|
|
44
|
+
if (aura.dispelType === DISPEL_TYPE.NONE) return false;
|
|
45
|
+
return (getDispelMask(aura.dispelType) & mask) !== 0;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface DispelRng {
|
|
49
|
+
/** [0,1) uniform */
|
|
50
|
+
next(): number;
|
|
51
|
+
/** inclusive int */
|
|
52
|
+
int(min: number, max: number): number;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// ProcessDispelList: pick up to `count` auras, 0 meaning 1, uniformly among those remaining, each
|
|
56
|
+
// pick reducing the stack by one. The miss chance is SPELLMOD_RESIST_DISPEL_CHANCE, base 0.
|
|
57
|
+
export function processDispelList(
|
|
58
|
+
candidates: DispellableAura[],
|
|
59
|
+
count: number,
|
|
60
|
+
rng: DispelRng,
|
|
61
|
+
missChance = 0,
|
|
62
|
+
): { success: Array<{ spellId: number }>; fail: number[] } {
|
|
63
|
+
const need = count > 0 ? count : 1;
|
|
64
|
+
// Work on stack counts
|
|
65
|
+
const pool = candidates.map((a) => ({ ...a }));
|
|
66
|
+
const success: Array<{ spellId: number }> = [];
|
|
67
|
+
const fail: number[] = [];
|
|
68
|
+
|
|
69
|
+
for (let i = 0; i < need && pool.length > 0; i++) {
|
|
70
|
+
const idx = rng.int(0, pool.length - 1);
|
|
71
|
+
const aura = pool[idx]!;
|
|
72
|
+
// resist roll: roll_chance_i(miss_chance)
|
|
73
|
+
if (missChance > 0 && rng.next() * 100 < missChance) {
|
|
74
|
+
fail.push(aura.spellId);
|
|
75
|
+
} else {
|
|
76
|
+
success.push({ spellId: aura.spellId });
|
|
77
|
+
}
|
|
78
|
+
aura.stacks -= 1;
|
|
79
|
+
if (aura.stacks <= 0) pool.splice(idx, 1);
|
|
80
|
+
}
|
|
81
|
+
return { success, fail };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export function collectDispellable(
|
|
85
|
+
auras: readonly DispellableAura[],
|
|
86
|
+
mask: number,
|
|
87
|
+
): DispellableAura[] {
|
|
88
|
+
return auras.filter((a) => isDispellableByMask(a, mask));
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// The Classic CheckCast pure-dispel shape: effect 0 is DISPEL and the others are NONE. Those fail
|
|
92
|
+
// with nothing-to-dispel on an empty target, while a multi-effect spell keeps casting.
|
|
93
|
+
export function isPureDispelSpell(spell: {
|
|
94
|
+
effects: ReadonlyArray<{ kind: string }>;
|
|
95
|
+
rawEffects?: ReadonlyArray<{ effect: number }> | null;
|
|
96
|
+
}): boolean {
|
|
97
|
+
const raw = spell.rawEffects;
|
|
98
|
+
if (raw && raw.length > 0) {
|
|
99
|
+
const e0 = raw[0];
|
|
100
|
+
if (!e0 || (e0.effect | 0) !== SPELL_EFFECT_DISPEL) return false;
|
|
101
|
+
for (let i = 1; i < 3; i++) {
|
|
102
|
+
const e = raw[i];
|
|
103
|
+
if (e && (e.effect | 0) !== 0) return false;
|
|
104
|
+
}
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return spell.effects.length === 1 && spell.effects[0]!.kind === 'dispel';
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** First resolved `dispel` effect on the spell, if any. */
|
|
111
|
+
export function firstDispelEffect(
|
|
112
|
+
spell: { effects: ReadonlyArray<{ kind: string; dispelType?: number; count?: number }> },
|
|
113
|
+
): { kind: 'dispel'; dispelType: number; count: number } | null {
|
|
114
|
+
for (const e of spell.effects) {
|
|
115
|
+
if (e.kind === 'dispel' && typeof e.dispelType === 'number') {
|
|
116
|
+
return { kind: 'dispel', dispelType: e.dispelType, count: e.count ?? 1 };
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Party claim map key. Cite: AUTOPILOT-PLAN §4 row 21 (copy of interruptClaim). */
|
|
123
|
+
export function dispelClaimKey(targetId: string, cat: number): string {
|
|
124
|
+
return `${targetId}:${cat}`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Drop stale party dispel claims: claimer/target dead, category gone, or the claimer is no longer mid-cast
|
|
128
|
+
// (kick / move-cancel / fizzle). Instant Tranq/Purge also release in applySpell.
|
|
129
|
+
export function pruneDispelClaims(
|
|
130
|
+
claim: Map<string, string>,
|
|
131
|
+
isAlive: (id: string) => boolean,
|
|
132
|
+
hasCat: (targetId: string, cat: number) => boolean,
|
|
133
|
+
isCasting?: (id: string) => boolean,
|
|
134
|
+
): void {
|
|
135
|
+
for (const [key, claimerId] of [...claim.entries()]) {
|
|
136
|
+
const sep = key.lastIndexOf(':');
|
|
137
|
+
if (sep <= 0) {
|
|
138
|
+
claim.delete(key);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const targetId = key.slice(0, sep);
|
|
142
|
+
const cat = Number(key.slice(sep + 1));
|
|
143
|
+
if (!Number.isFinite(cat) || !isAlive(claimerId) || !isAlive(targetId) || !hasCat(targetId, cat)) {
|
|
144
|
+
claim.delete(key);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (isCasting && !isCasting(claimerId)) claim.delete(key);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
// SPELL_EFFECT_DISPEL_MECHANIC holder match + ProcessDispelList peel. Cite: SpellEffects.cpp:2499–2519;
|
|
2
|
+
// SpellAuras.cpp:5788–5796 HasMechanic.
|
|
3
|
+
|
|
4
|
+
import type { Mechanic } from '../../data/schema.ts';
|
|
5
|
+
import { MECHANIC_ID } from '../creature/creatureAiConstants.ts';
|
|
6
|
+
import {
|
|
7
|
+
processDispelList,
|
|
8
|
+
type DispelRng,
|
|
9
|
+
type DispellableAura,
|
|
10
|
+
} from './dispel.ts';
|
|
11
|
+
|
|
12
|
+
/** SharedDefines.h:374 MECHANIC_MOUNT. */
|
|
13
|
+
export const MECHANIC_MOUNT = 21;
|
|
14
|
+
|
|
15
|
+
export type MechanicSpellView = {
|
|
16
|
+
mechanic?: string | number | null;
|
|
17
|
+
rawEffects?: ReadonlyArray<{ mechanic?: number }> | null;
|
|
18
|
+
// SpellEffect.mechanic is a Mechanic string on cc/root/speed and a raw id on dispel_mechanic.
|
|
19
|
+
effects?: ReadonlyArray<{ kind: string; mechanic?: string | number | null }> | null;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export function mechanicIdOf(mechanic: string | number | null | undefined): number {
|
|
23
|
+
if (mechanic == null) return 0;
|
|
24
|
+
if (typeof mechanic === 'number') return Number.isFinite(mechanic) ? mechanic | 0 : 0;
|
|
25
|
+
const id = MECHANIC_ID[mechanic as Mechanic];
|
|
26
|
+
return id ?? 0;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** SpellAuraHolder::HasMechanic — proto Mechanic / EffectMechanic; skip dispel_mechanic misc. Cite: SpellAuras.cpp:5788–5796. */
|
|
30
|
+
export function holderHasMechanic(
|
|
31
|
+
spell: MechanicSpellView | null | undefined,
|
|
32
|
+
mechanic: number,
|
|
33
|
+
): boolean {
|
|
34
|
+
if (!mechanic || !spell) return false;
|
|
35
|
+
if (mechanicIdOf(spell.mechanic) === mechanic) return true;
|
|
36
|
+
for (const raw of spell.rawEffects ?? []) {
|
|
37
|
+
if (((raw.mechanic ?? 0) | 0) === mechanic) return true;
|
|
38
|
+
}
|
|
39
|
+
for (const effect of spell.effects ?? []) {
|
|
40
|
+
if (effect.kind === 'dispel_mechanic') continue;
|
|
41
|
+
if (effect.mechanic && mechanicIdOf(effect.mechanic) === mechanic) return true;
|
|
42
|
+
}
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Live-row fallback for when the holder's SpellDef is on no kit: a stamped mechanic wins, a root maps
|
|
47
|
+
// to MECHANIC_ROOT and a hostile speed effect to MECHANIC_SNARE.
|
|
48
|
+
export function liveEffectHasMechanic(
|
|
49
|
+
e: { kind?: string; mechanic?: string | number; hostile?: boolean },
|
|
50
|
+
mechanic: number,
|
|
51
|
+
): boolean {
|
|
52
|
+
if (mechanic <= 0) return false;
|
|
53
|
+
if (e.mechanic != null && mechanicIdOf(e.mechanic) === mechanic) return true;
|
|
54
|
+
if (e.kind === 'root' && mechanic === MECHANIC_ID.root) return true;
|
|
55
|
+
if (e.kind === 'speed' && e.hostile === true && mechanic === MECHANIC_ID.snare) return true;
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export type MechanicLiveView = {
|
|
60
|
+
spellId: number;
|
|
61
|
+
stacks?: number;
|
|
62
|
+
mechanic?: string | number;
|
|
63
|
+
kind?: string;
|
|
64
|
+
hostile?: boolean;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export function collectMechanicHolders(
|
|
68
|
+
auras: ReadonlyArray<MechanicLiveView>,
|
|
69
|
+
mechanic: number,
|
|
70
|
+
lookup: (spellId: number) => MechanicSpellView | null | undefined,
|
|
71
|
+
): DispellableAura[] {
|
|
72
|
+
const out: DispellableAura[] = [];
|
|
73
|
+
for (const aura of auras) {
|
|
74
|
+
if (liveEffectHasMechanic(aura, mechanic) || holderHasMechanic(lookup(aura.spellId), mechanic)) {
|
|
75
|
+
out.push({ spellId: aura.spellId, dispelType: 0, stacks: aura.stacks ?? 1 });
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function peelMechanicAuras<T extends { spellId: number }>(
|
|
82
|
+
auras: readonly T[],
|
|
83
|
+
mechanic: number,
|
|
84
|
+
count: number,
|
|
85
|
+
lookup: (spellId: number) => MechanicSpellView | null | undefined,
|
|
86
|
+
rng: DispelRng,
|
|
87
|
+
): { kept: T[]; removed: T[] } {
|
|
88
|
+
const candidates = collectMechanicHolders(auras, mechanic, lookup);
|
|
89
|
+
if (!candidates.length) return { kept: auras.slice(), removed: [] };
|
|
90
|
+
const { success } = processDispelList(candidates, count, rng);
|
|
91
|
+
const left = new Map<number, number>();
|
|
92
|
+
for (const row of success) left.set(row.spellId, (left.get(row.spellId) ?? 0) + 1);
|
|
93
|
+
const kept: T[] = [];
|
|
94
|
+
const removed: T[] = [];
|
|
95
|
+
for (const aura of auras) {
|
|
96
|
+
const n = left.get(aura.spellId) ?? 0;
|
|
97
|
+
if (n > 0) {
|
|
98
|
+
left.set(aura.spellId, n - 1);
|
|
99
|
+
removed.push(aura);
|
|
100
|
+
} else {
|
|
101
|
+
kept.push(aura);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return { kept, removed };
|
|
105
|
+
}
|