azeroth-shell 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -2
- package/bin/azsh.mjs +19 -0
- package/docs/aifid/eventai-texts.json +4414 -0
- package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
- package/docs/dungeons/survey/pack-id-migration.json +2418 -0
- package/package.json +35 -4
- package/src/autopilot/bossSkip.ts +26 -0
- package/src/autopilot/combatRotation.ts +824 -0
- package/src/autopilot/config.ts +533 -0
- package/src/autopilot/consumables.ts +58 -0
- package/src/autopilot/encounterStand.ts +121 -0
- package/src/autopilot/objectGatePlan.ts +53 -0
- package/src/autopilot/pathEngage.ts +229 -0
- package/src/autopilot/plan.ts +1643 -0
- package/src/autopilot/questPolicy.ts +274 -0
- package/src/autopilot/routeStep.ts +69 -0
- package/src/autopilot/sessionReport.ts +88 -0
- package/src/autopilot/topOffPower.ts +26 -0
- package/src/autopilot/view.ts +476 -0
- package/src/cli/bootCheck.mjs +34 -0
- package/src/cli/bootData.mjs +57 -0
- package/src/cli/combatLogFilter.ts +153 -0
- package/src/cli/combatLogFormat.ts +613 -0
- package/src/cli/fileRepository.mjs +105 -0
- package/src/cli/gzLoader.mjs +31 -0
- package/src/cli/liveGauntletEscort.ts +978 -0
- package/src/cli/liveStratUndead.ts +305 -0
- package/src/cli/macroHostCombat.ts +545 -0
- package/src/cli/macroHostWorld.ts +330 -0
- package/src/cli/prefs.mjs +31 -0
- package/src/cli/register.mjs +4 -0
- package/src/cli/repl.mjs +693 -0
- package/src/cli/rotationText.mjs +226 -0
- package/src/cli/squad.mjs +105 -0
- package/src/cli/term.mjs +144 -0
- package/src/cli/text.mjs +122 -0
- package/src/cli/tui.mjs +626 -0
- package/src/cli/tuiArena.mjs +109 -0
- package/src/cli/tuiAutopilotSettings.mjs +93 -0
- package/src/cli/tuiBags.mjs +180 -0
- package/src/cli/tuiBars.mjs +133 -0
- package/src/cli/tuiBg.mjs +243 -0
- package/src/cli/tuiBulk.mjs +162 -0
- package/src/cli/tuiCheck.mjs +1882 -0
- package/src/cli/tuiCity.mjs +396 -0
- package/src/cli/tuiCompanionKit.mjs +300 -0
- package/src/cli/tuiCompanions.mjs +471 -0
- package/src/cli/tuiDev.mjs +62 -0
- package/src/cli/tuiDungeon.mjs +606 -0
- package/src/cli/tuiEnchantTarget.mjs +120 -0
- package/src/cli/tuiFight.mjs +577 -0
- package/src/cli/tuiFightPanes.mjs +228 -0
- package/src/cli/tuiFloor.mjs +506 -0
- package/src/cli/tuiGear.mjs +158 -0
- package/src/cli/tuiHonor.mjs +74 -0
- package/src/cli/tuiLoot.mjs +97 -0
- package/src/cli/tuiMacros.mjs +144 -0
- package/src/cli/tuiOutfitter.mjs +115 -0
- package/src/cli/tuiPet.mjs +116 -0
- package/src/cli/tuiProfessions.mjs +800 -0
- package/src/cli/tuiRaid.mjs +127 -0
- package/src/cli/tuiRep.mjs +65 -0
- package/src/cli/tuiSaves.mjs +69 -0
- package/src/cli/tuiSearch.mjs +363 -0
- package/src/cli/tuiSettings.mjs +151 -0
- package/src/cli/tuiSimLab.mjs +80 -0
- package/src/cli/tuiTalents.mjs +60 -0
- package/src/cli/tuiViews.mjs +1178 -0
- package/src/cli/tuiWiki.mjs +181 -0
- package/src/cli/tuiWorld.mjs +361 -0
- package/src/cli/wikiIndex.ts +259 -0
- package/src/cli/wikiSources.ts +355 -0
- package/src/data/alteracValley.ts +176 -0
- package/src/data/appearanceOptions.ts +534 -0
- package/src/data/applyLootChanceSanity.ts +21 -0
- package/src/data/createFlavor.ts +96 -0
- package/src/data/customItems.ts +33 -0
- package/src/data/dataStore.ts +1904 -0
- package/src/data/dungeonGameObjects.ts +84 -0
- package/src/data/dungeonPlateCover.ts +66 -0
- package/src/data/dungeonSpawns.ts +294 -0
- package/src/data/dungeons/alterac-valley.ts +135 -0
- package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
- package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
- package/src/data/dungeons/apply-instance-geometry.ts +65 -0
- package/src/data/dungeons/apply-spawn-placement.ts +171 -0
- package/src/data/dungeons/blackfathom-deeps.ts +539 -0
- package/src/data/dungeons/blackrock-depths.ts +1410 -0
- package/src/data/dungeons/blackwing-lair.ts +129 -0
- package/src/data/dungeons/boss-eventai.ts +8 -0
- package/src/data/dungeons/deadmines.ts +410 -0
- package/src/data/dungeons/dire-maul-east.ts +980 -0
- package/src/data/dungeons/dire-maul-north.ts +661 -0
- package/src/data/dungeons/dire-maul-west.ts +785 -0
- package/src/data/dungeons/dungeon-rooms.json +5479 -0
- package/src/data/dungeons/encounter-outdoors.json +359 -0
- package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
- package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
- package/src/data/dungeons/eventai/deadmines.ts +264 -0
- package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
- package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
- package/src/data/dungeons/eventai/helpers.ts +79 -0
- package/src/data/dungeons/eventai/index.ts +133 -0
- package/src/data/dungeons/eventai/lbrs.ts +372 -0
- package/src/data/dungeons/eventai/maraudon.ts +323 -0
- package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
- package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
- package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
- package/src/data/dungeons/eventai/scholomance.ts +680 -0
- package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
- package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
- package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
- package/src/data/dungeons/eventai/sm-library.ts +55 -0
- package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
- package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
- package/src/data/dungeons/eventai/the-stockade.ts +228 -0
- package/src/data/dungeons/eventai/ubrs.ts +225 -0
- package/src/data/dungeons/eventai/uldaman.ts +355 -0
- package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
- package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
- package/src/data/dungeons/gnomeregan.ts +909 -0
- package/src/data/dungeons/index.ts +126 -0
- package/src/data/dungeons/instance-geometry.json +5233 -0
- package/src/data/dungeons/key-sources.json +169 -0
- package/src/data/dungeons/lbrs.ts +996 -0
- package/src/data/dungeons/maraudon.ts +786 -0
- package/src/data/dungeons/molten-core.ts +194 -0
- package/src/data/dungeons/naxxramas.ts +173 -0
- package/src/data/dungeons/onyxias-lair.ts +71 -0
- package/src/data/dungeons/pack-from-clusters.ts +1256 -0
- package/src/data/dungeons/ragefire-chasm.ts +238 -0
- package/src/data/dungeons/razorfen-downs.ts +698 -0
- package/src/data/dungeons/razorfen-kraul.ts +766 -0
- package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
- package/src/data/dungeons/scholomance.ts +1076 -0
- package/src/data/dungeons/shadowfang-keep.ts +740 -0
- package/src/data/dungeons/sm-armory.ts +266 -0
- package/src/data/dungeons/sm-cathedral.ts +430 -0
- package/src/data/dungeons/sm-graveyard.ts +482 -0
- package/src/data/dungeons/sm-library.ts +337 -0
- package/src/data/dungeons/stratholme-live.ts +808 -0
- package/src/data/dungeons/stratholme-undead.ts +1164 -0
- package/src/data/dungeons/sunken-temple.ts +931 -0
- package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
- package/src/data/dungeons/the-stockade.ts +282 -0
- package/src/data/dungeons/ubrs.ts +1286 -0
- package/src/data/dungeons/uldaman.ts +685 -0
- package/src/data/dungeons/wailing-caverns.ts +356 -0
- package/src/data/dungeons/zul-farrak.ts +686 -0
- package/src/data/dungeons/zul-gurub.ts +142 -0
- package/src/data/dungeons.ts +42 -0
- package/src/data/fixtures.ts +446 -0
- package/src/data/gameobject-data.json.gz +0 -0
- package/src/data/item-data.json.gz +0 -0
- package/src/data/loot-data.json.gz +0 -0
- package/src/data/maps/atlas-approach-maps.json +1425 -0
- package/src/data/maps/atlas-landmarks.json +1711 -0
- package/src/data/maps/dungeon-viewports.json +392 -0
- package/src/data/materializeModDamagePercentTaken.ts +70 -0
- package/src/data/materializeModHealthRegen.ts +89 -0
- package/src/data/materializeSpellReputation.ts +26 -0
- package/src/data/pageTexts.ts +19 -0
- package/src/data/profession-data.json.gz +0 -0
- package/src/data/raid-plans/blackfathom-deeps.json +86 -0
- package/src/data/raid-plans/blackrock-depths.json +419 -0
- package/src/data/raid-plans/blackwing-lair.json +328 -0
- package/src/data/raid-plans/deadmines.json +55 -0
- package/src/data/raid-plans/dire-maul-east.json +94 -0
- package/src/data/raid-plans/dire-maul-north.json +70 -0
- package/src/data/raid-plans/dire-maul-west.json +75 -0
- package/src/data/raid-plans/gnomeregan.json +131 -0
- package/src/data/raid-plans/lbrs.json +176 -0
- package/src/data/raid-plans/maraudon.json +102 -0
- package/src/data/raid-plans/molten-core.json +169 -0
- package/src/data/raid-plans/naxxramas.json +354 -0
- package/src/data/raid-plans/onyxias-lair.json +18 -0
- package/src/data/raid-plans/ragefire-chasm.json +30 -0
- package/src/data/raid-plans/razorfen-downs.json +75 -0
- package/src/data/raid-plans/razorfen-kraul.json +53 -0
- package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
- package/src/data/raid-plans/scholomance.json +170 -0
- package/src/data/raid-plans/shadowfang-keep.json +87 -0
- package/src/data/raid-plans/sm-armory.json +53 -0
- package/src/data/raid-plans/sm-cathedral.json +72 -0
- package/src/data/raid-plans/sm-graveyard.json +63 -0
- package/src/data/raid-plans/sm-library.json +23 -0
- package/src/data/raid-plans/stratholme-live.json +129 -0
- package/src/data/raid-plans/stratholme-undead.json +73 -0
- package/src/data/raid-plans/sunken-temple.json +159 -0
- package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
- package/src/data/raid-plans/the-stockade.json +42 -0
- package/src/data/raid-plans/ubrs.json +53 -0
- package/src/data/raid-plans/uldaman.json +131 -0
- package/src/data/raid-plans/wailing-caverns.json +90 -0
- package/src/data/raid-plans/zul-farrak.json +156 -0
- package/src/data/raid-plans/zul-gurub.json +307 -0
- package/src/data/raidInstanceCreatures.mjs +473 -0
- package/src/data/rotations/index.ts +152 -0
- package/src/data/rotations/layout.mjs +72 -0
- package/src/data/rotations/pve/druid/balance.json +754 -0
- package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
- package/src/data/rotations/pve/druid/feral.json +2660 -0
- package/src/data/rotations/pve/druid/restoration.json +424 -0
- package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
- package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
- package/src/data/rotations/pve/hunter/survival.json +1373 -0
- package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
- package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
- package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
- package/src/data/rotations/pve/paladin/holy.json +755 -0
- package/src/data/rotations/pve/paladin/protection.json +962 -0
- package/src/data/rotations/pve/paladin/retribution.json +924 -0
- package/src/data/rotations/pve/priest/discipline.json +772 -0
- package/src/data/rotations/pve/priest/holy.json +707 -0
- package/src/data/rotations/pve/priest/shadow.json +787 -0
- package/src/data/rotations/pve/rogue/assassination.json +2477 -0
- package/src/data/rotations/pve/rogue/combat.json +2483 -0
- package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
- package/src/data/rotations/pve/shaman/elemental.json +1157 -0
- package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
- package/src/data/rotations/pve/shaman/restoration.json +592 -0
- package/src/data/rotations/pve/warlock/affliction.json +1185 -0
- package/src/data/rotations/pve/warlock/demonology.json +1165 -0
- package/src/data/rotations/pve/warlock/destruction.json +1177 -0
- package/src/data/rotations/pve/warrior/arms.json +3020 -0
- package/src/data/rotations/pve/warrior/fury.json +2996 -0
- package/src/data/rotations/pve/warrior/protection.json +2509 -0
- package/src/data/rotations/pvp/druid/balance.json +593 -0
- package/src/data/rotations/pvp/druid/feral.json +3276 -0
- package/src/data/rotations/pvp/druid/restoration.json +662 -0
- package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
- package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
- package/src/data/rotations/pvp/hunter/survival.json +635 -0
- package/src/data/rotations/pvp/mage/arcane.json +574 -0
- package/src/data/rotations/pvp/mage/fire.json +570 -0
- package/src/data/rotations/pvp/mage/frost.json +4048 -0
- package/src/data/rotations/pvp/paladin/holy.json +1498 -0
- package/src/data/rotations/pvp/paladin/protection.json +567 -0
- package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
- package/src/data/rotations/pvp/priest/discipline.json +1848 -0
- package/src/data/rotations/pvp/priest/holy.json +6340 -0
- package/src/data/rotations/pvp/priest/shadow.json +2329 -0
- package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
- package/src/data/rotations/pvp/rogue/combat.json +5258 -0
- package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
- package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
- package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
- package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
- package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
- package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
- package/src/data/rotations/pvp/warlock/destruction.json +638 -0
- package/src/data/rotations/pvp/warrior/arms.json +5665 -0
- package/src/data/rotations/pvp/warrior/fury.json +850 -0
- package/src/data/rotations/pvp/warrior/protection.json +777 -0
- package/src/data/schema/bundle.ts +511 -0
- package/src/data/schema/constants.ts +49 -0
- package/src/data/schema/creature.ts +454 -0
- package/src/data/schema/encounter.ts +155 -0
- package/src/data/schema/faction.ts +48 -0
- package/src/data/schema/item.ts +297 -0
- package/src/data/schema/itemEnchant.ts +105 -0
- package/src/data/schema/npc.ts +44 -0
- package/src/data/schema/primitives.ts +295 -0
- package/src/data/schema/profession.ts +226 -0
- package/src/data/schema/quest.ts +154 -0
- package/src/data/schema/spell.ts +1149 -0
- package/src/data/schema/talent.ts +74 -0
- package/src/data/schema/world.ts +124 -0
- package/src/data/schema.ts +19 -0
- package/src/data/skinNodeGapFill.ts +68 -0
- package/src/data/spell-data.json.gz +0 -0
- package/src/data/spell-script-targets.json +1 -0
- package/src/data/tables/ahItemValues.json.gz +0 -0
- package/src/data/tables/alteracValley.json.gz +0 -0
- package/src/data/tables/areatriggerTeleports.json.gz +0 -0
- package/src/data/tables/botNames.json.gz +0 -0
- package/src/data/tables/botPopulation.json.gz +0 -0
- package/src/data/tables/botSpecs.json.gz +0 -0
- package/src/data/tables/classLevelStats.json.gz +0 -0
- package/src/data/tables/combatConditions.json.gz +0 -0
- package/src/data/tables/combatSkillMeta.json.gz +0 -0
- package/src/data/tables/conditions.json.gz +0 -0
- package/src/data/tables/createInfo.json.gz +0 -0
- package/src/data/tables/creatureAggroGroups.json.gz +0 -0
- package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
- package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
- package/src/data/tables/creatureWeapons.json.gz +0 -0
- package/src/data/tables/creatures.json.gz +0 -0
- package/src/data/tables/dbScripts.json.gz +0 -0
- package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
- package/src/data/tables/dungeonCensus.json.gz +0 -0
- package/src/data/tables/dungeonGameObjects.json.gz +0 -0
- package/src/data/tables/dungeonPacks.json.gz +0 -0
- package/src/data/tables/dungeonPlateCover.json.gz +0 -0
- package/src/data/tables/dungeonSpawns.json.gz +0 -0
- package/src/data/tables/dungeonSurvey.json.gz +0 -0
- package/src/data/tables/durabilityCosts.json.gz +0 -0
- package/src/data/tables/durabilityQuality.json.gz +0 -0
- package/src/data/tables/enchantApplicators.json.gz +0 -0
- package/src/data/tables/entranceYards.json.gz +0 -0
- package/src/data/tables/explorationBasexp.json.gz +0 -0
- package/src/data/tables/factionTemplates.json.gz +0 -0
- package/src/data/tables/factions.json.gz +0 -0
- package/src/data/tables/gameEvents.json.gz +0 -0
- package/src/data/tables/gameObjects.json.gz +0 -0
- package/src/data/tables/gossipMenus.json.gz +0 -0
- package/src/data/tables/graveyards.json.gz +0 -0
- package/src/data/tables/instanceMaps.json.gz +0 -0
- package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
- package/src/data/tables/itemEnchants.json.gz +0 -0
- package/src/data/tables/itemRandomProperties.json.gz +0 -0
- package/src/data/tables/itemSets.json.gz +0 -0
- package/src/data/tables/items.json.gz +0 -0
- package/src/data/tables/levelStats.json.gz +0 -0
- package/src/data/tables/locks.json.gz +0 -0
- package/src/data/tables/map-pin-overrides.json.gz +0 -0
- package/src/data/tables/nonCombatTrash.json.gz +0 -0
- package/src/data/tables/npcTexts.json.gz +0 -0
- package/src/data/tables/pageTexts.json.gz +0 -0
- package/src/data/tables/petAbilityTP.json.gz +0 -0
- package/src/data/tables/petGenericSpells.json.gz +0 -0
- package/src/data/tables/petLevelStats.json.gz +0 -0
- package/src/data/tables/playerbot-weightscales.json.gz +0 -0
- package/src/data/tables/pools.json.gz +0 -0
- package/src/data/tables/quests.json.gz +0 -0
- package/src/data/tables/races.json.gz +0 -0
- package/src/data/tables/reputationRanks.json.gz +0 -0
- package/src/data/tables/reputationRates.json.gz +0 -0
- package/src/data/tables/reputationSpillover.json.gz +0 -0
- package/src/data/tables/ridingSpells.json.gz +0 -0
- package/src/data/tables/scriptTexts.json.gz +0 -0
- package/src/data/tables/soundClipVolume.json.gz +0 -0
- package/src/data/tables/spellChain.json.gz +0 -0
- package/src/data/tables/spellTeleports.json.gz +0 -0
- package/src/data/tables/spells.json.gz +0 -0
- package/src/data/tables/talents.json.gz +0 -0
- package/src/data/tables/tavernTriggers.json.gz +0 -0
- package/src/data/tables/taxiNodes.json.gz +0 -0
- package/src/data/tables/taxiRoutes.json.gz +0 -0
- package/src/data/tables/trainers.json.gz +0 -0
- package/src/data/tables/transports.json.gz +0 -0
- package/src/data/tables/travelAnchors.json.gz +0 -0
- package/src/data/tables/travelEdges.json.gz +0 -0
- package/src/data/tables/unitConditions.json.gz +0 -0
- package/src/data/tables/vendors.json.gz +0 -0
- package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
- package/src/data/tables/xp.json.gz +0 -0
- package/src/data/tables/zoneWeather.json.gz +0 -0
- package/src/data/tables/zones.json.gz +0 -0
- package/src/data/world-data.ts +56 -0
- package/src/data/zone-music-sets.json +2751 -0
- package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
- package/src/domain/audioQuality.mjs +145 -0
- package/src/domain/bg/ab.ts +433 -0
- package/src/domain/bg/arenaComps.ts +644 -0
- package/src/domain/bg/arenaLab.ts +695 -0
- package/src/domain/bg/arenaPace.ts +31 -0
- package/src/domain/bg/arenaRating.ts +110 -0
- package/src/domain/bg/av.ts +758 -0
- package/src/domain/bg/avEnemyPush.ts +219 -0
- package/src/domain/bg/avField.ts +283 -0
- package/src/domain/bg/avInstanceNodes.ts +197 -0
- package/src/domain/bg/avInstanceScore.ts +123 -0
- package/src/domain/bg/avQuestItems.ts +55 -0
- package/src/domain/bg/avQuests.ts +210 -0
- package/src/domain/bg/avSession.ts +196 -0
- package/src/domain/bg/bgConsumes.ts +269 -0
- package/src/domain/bg/bgPrebuff.ts +153 -0
- package/src/domain/bg/bgRest.ts +91 -0
- package/src/domain/bg/bgRoster.ts +305 -0
- package/src/domain/bg/bgTier.ts +61 -0
- package/src/domain/bg/bgWorld.ts +862 -0
- package/src/domain/bg/match.ts +215 -0
- package/src/domain/bg/strategies.ts +552 -0
- package/src/domain/bg/types.ts +291 -0
- package/src/domain/bg/wsg.ts +264 -0
- package/src/domain/bots/actionProviderSpec.ts +38 -0
- package/src/domain/bots/autoConsumables.ts +285 -0
- package/src/domain/bots/betweenPullRest.ts +239 -0
- package/src/domain/bots/botGear.ts +248 -0
- package/src/domain/bots/botInventory.ts +486 -0
- package/src/domain/bots/botPet.ts +535 -0
- package/src/domain/bots/botPool.ts +291 -0
- package/src/domain/bots/botProfessions.ts +334 -0
- package/src/domain/bots/companionActionBar.ts +209 -0
- package/src/domain/bots/companionHireCost.ts +236 -0
- package/src/domain/bots/companionMissions.ts +582 -0
- package/src/domain/bots/companionPrep.ts +254 -0
- package/src/domain/bots/companionQuests.ts +270 -0
- package/src/domain/bots/companionRep.ts +75 -0
- package/src/domain/bots/companionRotation.ts +708 -0
- package/src/domain/bots/companionXp.ts +66 -0
- package/src/domain/bots/consumableShare.ts +811 -0
- package/src/domain/bots/dpsMate.ts +1072 -0
- package/src/domain/bots/groupCompReport.ts +132 -0
- package/src/domain/bots/healthstoneSupply.ts +198 -0
- package/src/domain/bots/outfitter.ts +1056 -0
- package/src/domain/bots/paladinPrePull.ts +231 -0
- package/src/domain/bots/partyRole.ts +40 -0
- package/src/domain/bots/playerbotEquipCache.ts +412 -0
- package/src/domain/bots/playerbotItemEligibility.ts +60 -0
- package/src/domain/bots/playerbotStatWeight.ts +853 -0
- package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
- package/src/domain/bots/prePullBuffs.ts +219 -0
- package/src/domain/bots/prePullStealth.ts +82 -0
- package/src/domain/bots/runSupply.ts +251 -0
- package/src/domain/bots/runSupplyPrefs.ts +28 -0
- package/src/domain/bots/sendTradeGoods.ts +394 -0
- package/src/domain/bots/soulShardCap.ts +35 -0
- package/src/domain/bots/squad.ts +842 -0
- package/src/domain/bots/squadRun.ts +81 -0
- package/src/domain/character/actionbar.ts +346 -0
- package/src/domain/character/appearance.ts +165 -0
- package/src/domain/character/buildCombatant.ts +1726 -0
- package/src/domain/character/character.ts +356 -0
- package/src/domain/character/characterName.ts +43 -0
- package/src/domain/character/characterRatings.ts +424 -0
- package/src/domain/character/characterSpells.ts +282 -0
- package/src/domain/character/characterStats.ts +1559 -0
- package/src/domain/character/characterTalents.ts +398 -0
- package/src/domain/character/combatSkills.ts +994 -0
- package/src/domain/character/displayForm.ts +72 -0
- package/src/domain/character/formTalentAuras.ts +171 -0
- package/src/domain/character/forms.ts +499 -0
- package/src/domain/character/races.ts +40 -0
- package/src/domain/character/resurrectionSickness.ts +49 -0
- package/src/domain/character/spellbook.ts +169 -0
- package/src/domain/character/stanceBar.ts +354 -0
- package/src/domain/character/stancePrereq.ts +70 -0
- package/src/domain/character/talentBuilds.ts +63 -0
- package/src/domain/character/talentImport.ts +130 -0
- package/src/domain/character/talentLink.ts +123 -0
- package/src/domain/character/talents.ts +201 -0
- package/src/domain/core/conditionSnapshot.ts +92 -0
- package/src/domain/core/hover.ts +14 -0
- package/src/domain/core/ids.ts +58 -0
- package/src/domain/core/internalNameTags.ts +5 -0
- package/src/domain/core/runtimeDataPatches.ts +357 -0
- package/src/domain/creature/aiTargeting.ts +588 -0
- package/src/domain/creature/combatCondition.ts +157 -0
- package/src/domain/creature/creatureAggro.ts +804 -0
- package/src/domain/creature/creatureAi.ts +206 -0
- package/src/domain/creature/creatureAiConstants.ts +661 -0
- package/src/domain/creature/creatureCastList.ts +1007 -0
- package/src/domain/creature/creatureEventAi.ts +1409 -0
- package/src/domain/creature/creatureGroups.ts +144 -0
- package/src/domain/creature/creatureLinking.ts +333 -0
- package/src/domain/creature/creatureScaling.ts +320 -0
- package/src/domain/creature/creatureTrigger.ts +53 -0
- package/src/domain/creature/creatureWander.ts +74 -0
- package/src/domain/creature/eventAiTexts.ts +145 -0
- package/src/domain/creature/faction.ts +287 -0
- package/src/domain/creature/forcedReaction.ts +48 -0
- package/src/domain/creature/outdoorHuntable.ts +74 -0
- package/src/domain/creature/patrolPacks.ts +210 -0
- package/src/domain/creature/reputation.ts +967 -0
- package/src/domain/creature/unitFlags.ts +74 -0
- package/src/domain/creature/worldBosses.ts +393 -0
- package/src/domain/dungeonMusic.mjs +48 -0
- package/src/domain/economy/auction.ts +282 -0
- package/src/domain/economy/auctionBot.ts +1060 -0
- package/src/domain/economy/honorPrice.ts +100 -0
- package/src/domain/economy/mail.ts +958 -0
- package/src/domain/economy/money.ts +42 -0
- package/src/domain/economy/syntheticClassTrainers.ts +62 -0
- package/src/domain/economy/trading.ts +296 -0
- package/src/domain/economy/vendorSellAll.ts +252 -0
- package/src/domain/economy/vendorStock.ts +146 -0
- package/src/domain/items/ammo.ts +817 -0
- package/src/domain/items/bank.ts +162 -0
- package/src/domain/items/consumableFamily.ts +205 -0
- package/src/domain/items/craftUpgrades.ts +83 -0
- package/src/domain/items/createItem.ts +93 -0
- package/src/domain/items/durability.ts +581 -0
- package/src/domain/items/equipment.ts +441 -0
- package/src/domain/items/equipmentHelper.ts +767 -0
- package/src/domain/items/inventory.ts +561 -0
- package/src/domain/items/itemBonding.ts +93 -0
- package/src/domain/items/itemContainer.ts +245 -0
- package/src/domain/items/itemDisplayName.ts +33 -0
- package/src/domain/items/itemInstance.ts +181 -0
- package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
- package/src/domain/items/itemRandomProps.ts +77 -0
- package/src/domain/items/itemRestrictions.ts +329 -0
- package/src/domain/items/itemTeaches.ts +82 -0
- package/src/domain/items/itemUseCooldown.ts +52 -0
- package/src/domain/items/itemUseTarget.ts +90 -0
- package/src/domain/items/junkCategories.ts +174 -0
- package/src/domain/items/junkFilter.ts +368 -0
- package/src/domain/items/keyring.ts +131 -0
- package/src/domain/items/loot.ts +221 -0
- package/src/domain/items/mounts.ts +190 -0
- package/src/domain/items/onUsePayload.ts +102 -0
- package/src/domain/items/pendingLoot.ts +107 -0
- package/src/domain/items/relic.ts +105 -0
- package/src/domain/items/rocketBoots.ts +36 -0
- package/src/domain/items/sortContainer.ts +139 -0
- package/src/domain/items/spareContainers.ts +71 -0
- package/src/domain/items/spellReagentIndex.ts +131 -0
- package/src/domain/items/staleConsumables.ts +66 -0
- package/src/domain/items/weaponSpender.ts +110 -0
- package/src/domain/listDungeonIds.mjs +28 -0
- package/src/domain/macro/compose.ts +239 -0
- package/src/domain/macro/conditions.ts +260 -0
- package/src/domain/macro/creatureTypes.ts +40 -0
- package/src/domain/macro/describe.ts +169 -0
- package/src/domain/macro/icon.ts +60 -0
- package/src/domain/macro/index.ts +20 -0
- package/src/domain/macro/normalize.ts +112 -0
- package/src/domain/macro/parse.ts +316 -0
- package/src/domain/macro/plan.ts +288 -0
- package/src/domain/macro/rotation.ts +590 -0
- package/src/domain/macro/rotationEnv.ts +173 -0
- package/src/domain/macro/slots.ts +101 -0
- package/src/domain/macro/snapshot.ts +114 -0
- package/src/domain/macro/templates.ts +446 -0
- package/src/domain/macro/types.ts +70 -0
- package/src/domain/macro/units.ts +93 -0
- package/src/domain/macro/weaponTypes.ts +83 -0
- package/src/domain/nav/cityTeleports.ts +10 -0
- package/src/domain/nav/mounting.ts +113 -0
- package/src/domain/nav/nav.ts +43 -0
- package/src/domain/nav/navCollision.ts +606 -0
- package/src/domain/nav/navOutdoors.ts +91 -0
- package/src/domain/nav/navRegistry.ts +179 -0
- package/src/domain/nav/navRoomGraph.ts +302 -0
- package/src/domain/nav/navTypes.ts +43 -0
- package/src/domain/nav/navmesh.ts +1715 -0
- package/src/domain/nav/speed.ts +200 -0
- package/src/domain/nav/storey.ts +10 -0
- package/src/domain/nav/travel.ts +725 -0
- package/src/domain/nav/travelTypes.ts +75 -0
- package/src/domain/pet/pet.ts +1150 -0
- package/src/domain/pet/petActionBar.ts +180 -0
- package/src/domain/pet/petSpellbook.ts +39 -0
- package/src/domain/pet/petStable.ts +81 -0
- package/src/domain/professions/autoDisenchant.ts +236 -0
- package/src/domain/professions/characterEnchants.ts +176 -0
- package/src/domain/professions/craftCooldown.ts +52 -0
- package/src/domain/professions/enchantApply.ts +62 -0
- package/src/domain/professions/enchantTargets.ts +114 -0
- package/src/domain/professions/enchanting.ts +236 -0
- package/src/domain/professions/gatherFilter.ts +149 -0
- package/src/domain/professions/gearEnchant.ts +137 -0
- package/src/domain/professions/heldTools.ts +29 -0
- package/src/domain/professions/learnAllRecipes.ts +146 -0
- package/src/domain/professions/miningHarvest.ts +69 -0
- package/src/domain/professions/partyDisenchant.ts +294 -0
- package/src/domain/professions/partyWork.ts +83 -0
- package/src/domain/professions/pickpocket.ts +172 -0
- package/src/domain/professions/poisons.ts +240 -0
- package/src/domain/professions/professions.ts +677 -0
- package/src/domain/professions/rareNodes.ts +45 -0
- package/src/domain/professions/skinLoot.ts +27 -0
- package/src/domain/professions/vendorReagents.ts +152 -0
- package/src/domain/professions/weaponImbueHand.ts +171 -0
- package/src/domain/questFarmFilter.mjs +42 -0
- package/src/domain/quests/doQuest.ts +1204 -0
- package/src/domain/quests/gossip.ts +308 -0
- package/src/domain/quests/gossipTalk.ts +298 -0
- package/src/domain/quests/interpreter/canComplete.ts +150 -0
- package/src/domain/quests/interpreter/claim.ts +137 -0
- package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
- package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
- package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
- package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
- package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
- package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
- package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
- package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
- package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
- package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
- package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
- package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
- package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
- package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
- package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
- package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
- package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
- package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
- package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
- package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
- package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
- package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
- package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
- package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
- package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
- package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
- package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
- package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
- package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
- package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
- package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
- package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
- package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
- package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
- package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
- package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
- package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
- package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
- package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
- package/src/domain/quests/interpreter/diff.ts +349 -0
- package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
- package/src/domain/quests/interpreter/flags.ts +101 -0
- package/src/domain/quests/interpreter/index.ts +113 -0
- package/src/domain/quests/interpreter/live.ts +178 -0
- package/src/domain/quests/interpreter/types.ts +81 -0
- package/src/domain/quests/interpreter/updaters.ts +412 -0
- package/src/domain/quests/questCorpseUse.ts +155 -0
- package/src/domain/quests/questDialog.ts +43 -0
- package/src/domain/quests/questFight.ts +34 -0
- package/src/domain/quests/questObjectiveLabel.ts +39 -0
- package/src/domain/quests/questRewardChoice.ts +85 -0
- package/src/domain/quests/questScriptCredit.ts +26 -0
- package/src/domain/quests/questScriptItemUse.ts +74 -0
- package/src/domain/quests/questTameRods.ts +79 -0
- package/src/domain/quests/questlog.ts +1545 -0
- package/src/domain/quests/talkDeliver.ts +170 -0
- package/src/domain/raid/globalActionBar.ts +195 -0
- package/src/domain/raid/instanceRoster.ts +194 -0
- package/src/domain/raid/partySummon.ts +198 -0
- package/src/domain/raid/partyVault.ts +320 -0
- package/src/domain/raid/raidBossAbilities.ts +268 -0
- package/src/domain/raid/raidComp.ts +335 -0
- package/src/domain/raid/raidCustomRows.ts +453 -0
- package/src/domain/raid/raidEncounterGear.ts +298 -0
- package/src/domain/raid/raidEncounterTactics.ts +412 -0
- package/src/domain/raid/raidPlan.ts +509 -0
- package/src/domain/raid/raidPlanEdits.ts +98 -0
- package/src/domain/raid/raidPlanPacks.ts +480 -0
- package/src/domain/raid/raidRecovery.ts +183 -0
- package/src/domain/raid/raidRosterTemplate.ts +138 -0
- package/src/domain/rotation/auraSide.ts +68 -0
- package/src/domain/rotation/build.ts +3031 -0
- package/src/domain/rotation/classes/druid.ts +58 -0
- package/src/domain/rotation/classes/hooks.ts +59 -0
- package/src/domain/rotation/classes/hunter.ts +156 -0
- package/src/domain/rotation/classes/index.ts +104 -0
- package/src/domain/rotation/classes/mage.ts +99 -0
- package/src/domain/rotation/classes/paladin.ts +296 -0
- package/src/domain/rotation/classes/priest.ts +94 -0
- package/src/domain/rotation/classes/pullOpener.ts +92 -0
- package/src/domain/rotation/classes/rogue.ts +69 -0
- package/src/domain/rotation/classes/shaman.ts +29 -0
- package/src/domain/rotation/classes/supportSpec.ts +94 -0
- package/src/domain/rotation/classes/warlock.ts +81 -0
- package/src/domain/rotation/classes/warrior.ts +402 -0
- package/src/domain/rotation/classify.ts +1381 -0
- package/src/domain/rotation/condMetricPicker.ts +379 -0
- package/src/domain/rotation/consumables.ts +242 -0
- package/src/domain/rotation/evaluate.ts +1115 -0
- package/src/domain/rotation/finisherLadder.ts +145 -0
- package/src/domain/rotation/invent.ts +938 -0
- package/src/domain/rotation/killOrder.ts +30 -0
- package/src/domain/rotation/openerForm.ts +22 -0
- package/src/domain/rotation/paladinBuffs.ts +568 -0
- package/src/domain/rotation/prebuff.ts +283 -0
- package/src/domain/rotation/raidRowTuning.ts +34 -0
- package/src/domain/rotation/rotation.ts +11 -0
- package/src/domain/rotation/rotationProfiles.ts +180 -0
- package/src/domain/rotation/rotationSuggestions.ts +851 -0
- package/src/domain/rotation/ruleAfterChain.ts +49 -0
- package/src/domain/rotation/spec.ts +70 -0
- package/src/domain/rotation/spellPicker.ts +140 -0
- package/src/domain/rotation/stand.ts +143 -0
- package/src/domain/rotation/types.ts +718 -0
- package/src/domain/run/battlegroundRun.ts +111 -0
- package/src/domain/run/canEnterContext.ts +32 -0
- package/src/domain/run/death.ts +561 -0
- package/src/domain/run/deathRecovery.ts +289 -0
- package/src/domain/run/duel.ts +141 -0
- package/src/domain/run/dungeonRun.ts +344 -0
- package/src/domain/run/floorRest.ts +159 -0
- package/src/domain/run/honor.ts +557 -0
- package/src/domain/run/honorWeek.ts +180 -0
- package/src/domain/run/whenMap.ts +977 -0
- package/src/domain/scriptdev/arathiHighlands.ts +445 -0
- package/src/domain/scriptdev/ashenvale.ts +635 -0
- package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
- package/src/domain/scriptdev/azshara.ts +892 -0
- package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
- package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
- package/src/domain/scriptdev/blackrockSpire.ts +730 -0
- package/src/domain/scriptdev/blackwingLair.ts +521 -0
- package/src/domain/scriptdev/burningSteppes.ts +62 -0
- package/src/domain/scriptdev/classFilter.ts +43 -0
- package/src/domain/scriptdev/darkshore.ts +817 -0
- package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
- package/src/domain/scriptdev/deadmines.ts +331 -0
- package/src/domain/scriptdev/desolace.ts +1239 -0
- package/src/domain/scriptdev/direMaul.ts +859 -0
- package/src/domain/scriptdev/durotar.ts +532 -0
- package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
- package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
- package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
- package/src/domain/scriptdev/felwood.ts +1055 -0
- package/src/domain/scriptdev/feralas.ts +571 -0
- package/src/domain/scriptdev/feralasHelpers.ts +838 -0
- package/src/domain/scriptdev/gnomeregan.ts +466 -0
- package/src/domain/scriptdev/guards.ts +616 -0
- package/src/domain/scriptdev/hinterlands.ts +693 -0
- package/src/domain/scriptdev/host.ts +1134 -0
- package/src/domain/scriptdev/index.ts +123 -0
- package/src/domain/scriptdev/instanceRaids.ts +136 -0
- package/src/domain/scriptdev/itemScripts.ts +37 -0
- package/src/domain/scriptdev/lochModan.ts +283 -0
- package/src/domain/scriptdev/maraudon.ts +232 -0
- package/src/domain/scriptdev/moltenCore.ts +831 -0
- package/src/domain/scriptdev/moonglade.ts +659 -0
- package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
- package/src/domain/scriptdev/naxxramas.ts +577 -0
- package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
- package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
- package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
- package/src/domain/scriptdev/npcProfessions.ts +1025 -0
- package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
- package/src/domain/scriptdev/onyxiasLair.ts +313 -0
- package/src/domain/scriptdev/orgrimmar.ts +147 -0
- package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
- package/src/domain/scriptdev/razorfenDowns.ts +468 -0
- package/src/domain/scriptdev/razorfenKraul.ts +410 -0
- package/src/domain/scriptdev/redridgeMountains.ts +163 -0
- package/src/domain/scriptdev/registry.ts +945 -0
- package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
- package/src/domain/scriptdev/scarletMonastery.ts +713 -0
- package/src/domain/scriptdev/scholomance.ts +682 -0
- package/src/domain/scriptdev/searingGorge.ts +295 -0
- package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
- package/src/domain/scriptdev/silithus.ts +71 -0
- package/src/domain/scriptdev/silverpineForest.ts +662 -0
- package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
- package/src/domain/scriptdev/stormwindCity.ts +1192 -0
- package/src/domain/scriptdev/stranglethornVale.ts +402 -0
- package/src/domain/scriptdev/stratholme.ts +650 -0
- package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
- package/src/domain/scriptdev/sunkenTemple.ts +736 -0
- package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
- package/src/domain/scriptdev/tanaris.ts +391 -0
- package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
- package/src/domain/scriptdev/teldrassil.ts +143 -0
- package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
- package/src/domain/scriptdev/theBarrens.ts +709 -0
- package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
- package/src/domain/scriptdev/thousandNeedles.ts +426 -0
- package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
- package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
- package/src/domain/scriptdev/types.ts +1026 -0
- package/src/domain/scriptdev/uldaman.ts +437 -0
- package/src/domain/scriptdev/ungoroCrater.ts +549 -0
- package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
- package/src/domain/scriptdev/wailingCaverns.ts +700 -0
- package/src/domain/scriptdev/warEffort.ts +371 -0
- package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
- package/src/domain/scriptdev/westfall.ts +767 -0
- package/src/domain/scriptdev/wetlands.ts +660 -0
- package/src/domain/scriptdev/winterspring.ts +482 -0
- package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
- package/src/domain/scriptdev/worldBosses.ts +605 -0
- package/src/domain/scriptdev/zulfarrak.ts +478 -0
- package/src/domain/scriptdev/zulgurub.ts +1152 -0
- package/src/domain/sim/dummySim.ts +408 -0
- package/src/domain/sim/targetDummy.ts +29 -0
- package/src/domain/social/guild.ts +148 -0
- package/src/domain/spells/areaAuraMembership.ts +93 -0
- package/src/domain/spells/breakableStunCc.ts +166 -0
- package/src/domain/spells/cancelAura.ts +80 -0
- package/src/domain/spells/diminishing.ts +167 -0
- package/src/domain/spells/dispel.ts +149 -0
- package/src/domain/spells/dispelMechanic.ts +105 -0
- package/src/domain/spells/equipSpells.ts +247 -0
- package/src/domain/spells/learnOnTargets.ts +260 -0
- package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
- package/src/domain/spells/resurrectSpell.ts +124 -0
- package/src/domain/spells/spellPushback.ts +39 -0
- package/src/domain/spells/spellReflect.ts +43 -0
- package/src/domain/spells/stealth.ts +183 -0
- package/src/domain/spells/totem.ts +394 -0
- package/src/domain/spells/worldCast.ts +187 -0
- package/src/domain/world/areaTriggerLocks.ts +177 -0
- package/src/domain/world/dungeonMusic.ts +108 -0
- package/src/domain/world/gameEvents.ts +119 -0
- package/src/domain/world/gameObjects.ts +1030 -0
- package/src/domain/world/goEventFire.ts +234 -0
- package/src/domain/world/goMoTransport.ts +74 -0
- package/src/domain/world/goTransport.ts +81 -0
- package/src/domain/world/hazards.ts +459 -0
- package/src/domain/world/openLock.ts +398 -0
- package/src/domain/world/pools.ts +470 -0
- package/src/domain/world/restArea.ts +37 -0
- package/src/domain/world/weather.ts +201 -0
- package/src/domain/zoneAmbience.mjs +87 -0
- package/src/domain/zoneMusic.mjs +62 -0
- package/src/domain/zoneMusicQueue.mjs +7 -0
- package/src/engine/combat/activeSeal.ts +39 -0
- package/src/engine/combat/aiTargetResolve.ts +64 -0
- package/src/engine/combat/aoeCast.ts +289 -0
- package/src/engine/combat/applyConsumeAura.ts +74 -0
- package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
- package/src/engine/combat/applyDispelMechanic.ts +30 -0
- package/src/engine/combat/applyHealEffect.ts +301 -0
- package/src/engine/combat/applySchoolAbsorb.ts +114 -0
- package/src/engine/combat/applySpell.ts +3169 -0
- package/src/engine/combat/applySpellLate.ts +2026 -0
- package/src/engine/combat/applySpellLateBag.ts +144 -0
- package/src/engine/combat/areaAura.ts +283 -0
- package/src/engine/combat/attackTable.ts +508 -0
- package/src/engine/combat/battleRez.ts +87 -0
- package/src/engine/combat/castAction.ts +36 -0
- package/src/engine/combat/castTargetGates.ts +75 -0
- package/src/engine/combat/castableKit.ts +68 -0
- package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
- package/src/engine/combat/chainFan.ts +210 -0
- package/src/engine/combat/channel.ts +423 -0
- package/src/engine/combat/chaseCloseness.ts +95 -0
- package/src/engine/combat/cmangosCastGates.ts +129 -0
- package/src/engine/combat/combatFlag.ts +77 -0
- package/src/engine/combat/combatGeometry.ts +1329 -0
- package/src/engine/combat/combustion.ts +68 -0
- package/src/engine/combat/context.ts +730 -0
- package/src/engine/combat/createSession.ts +1165 -0
- package/src/engine/combat/creatureLeash.ts +38 -0
- package/src/engine/combat/crowdControl.ts +1259 -0
- package/src/engine/combat/dispelDuty.ts +54 -0
- package/src/engine/combat/dispelReflect.ts +609 -0
- package/src/engine/combat/displaceFloor.ts +113 -0
- package/src/engine/combat/duelBounds.ts +47 -0
- package/src/engine/combat/equippedItemGate.ts +297 -0
- package/src/engine/combat/evadeLifecycle.ts +63 -0
- package/src/engine/combat/eventAi.ts +2220 -0
- package/src/engine/combat/facing.ts +74 -0
- package/src/engine/combat/fearFlee.ts +137 -0
- package/src/engine/combat/fighterFactory.ts +1144 -0
- package/src/engine/combat/forceDespawnAction.ts +51 -0
- package/src/engine/combat/formulas.ts +807 -0
- package/src/engine/combat/friendlyFan.ts +55 -0
- package/src/engine/combat/groundPoolTick.ts +210 -0
- package/src/engine/combat/hazards.ts +114 -0
- package/src/engine/combat/healTargets.ts +226 -0
- package/src/engine/combat/heartbeatResist.ts +49 -0
- package/src/engine/combat/hostileItemUse.ts +75 -0
- package/src/engine/combat/interruptAuras.ts +66 -0
- package/src/engine/combat/itemRescue.ts +49 -0
- package/src/engine/combat/itemUse.ts +260 -0
- package/src/engine/combat/kitById.ts +23 -0
- package/src/engine/combat/knockBack.ts +201 -0
- package/src/engine/combat/leap.ts +89 -0
- package/src/engine/combat/mitigation.ts +587 -0
- package/src/engine/combat/modTaunt.ts +43 -0
- package/src/engine/combat/motionClaim.ts +268 -0
- package/src/engine/combat/motionGate.ts +150 -0
- package/src/engine/combat/motionGenerator.ts +27 -0
- package/src/engine/combat/navSight.ts +138 -0
- package/src/engine/combat/perfSink.ts +28 -0
- package/src/engine/combat/periodicDue.ts +55 -0
- package/src/engine/combat/petAuras.ts +86 -0
- package/src/engine/combat/pickAction.ts +3449 -0
- package/src/engine/combat/powerForm.ts +735 -0
- package/src/engine/combat/powerPools.ts +49 -0
- package/src/engine/combat/predicates.ts +538 -0
- package/src/engine/combat/procsDamage.ts +1823 -0
- package/src/engine/combat/reactiveGates.ts +135 -0
- package/src/engine/combat/roles.ts +389 -0
- package/src/engine/combat/rotationSubject.ts +78 -0
- package/src/engine/combat/ruleAfter.ts +106 -0
- package/src/engine/combat/seedDisplayAuras.ts +203 -0
- package/src/engine/combat/seedOocEffects.ts +317 -0
- package/src/engine/combat/seedSchoolImmunities.ts +45 -0
- package/src/engine/combat/session-types.ts +458 -0
- package/src/engine/combat/sessionApi.ts +1785 -0
- package/src/engine/combat/sessionCharge.ts +124 -0
- package/src/engine/combat/sessionChase.ts +869 -0
- package/src/engine/combat/sessionDeaths.ts +469 -0
- package/src/engine/combat/sessionFocus.ts +506 -0
- package/src/engine/combat/sessionFollow.ts +167 -0
- package/src/engine/combat/sessionGeometry.ts +188 -0
- package/src/engine/combat/sessionHome.ts +75 -0
- package/src/engine/combat/sessionInject.ts +719 -0
- package/src/engine/combat/sessionMechanicMove.ts +555 -0
- package/src/engine/combat/sessionMotion.ts +1553 -0
- package/src/engine/combat/sessionMotionKit.ts +247 -0
- package/src/engine/combat/sessionMoveIntent.ts +49 -0
- package/src/engine/combat/sessionMoveOrder.ts +200 -0
- package/src/engine/combat/sessionPathTo.ts +657 -0
- package/src/engine/combat/sessionPools.ts +688 -0
- package/src/engine/combat/sessionSteer.ts +144 -0
- package/src/engine/combat/sessionStepBack.ts +151 -0
- package/src/engine/combat/sessionStepWrap.ts +116 -0
- package/src/engine/combat/sessionView.ts +442 -0
- package/src/engine/combat/simEffects.ts +32 -0
- package/src/engine/combat/simFacade.ts +620 -0
- package/src/engine/combat/simPump.ts +264 -0
- package/src/engine/combat/simSnapshot.ts +165 -0
- package/src/engine/combat/simThreadPool.ts +35 -0
- package/src/engine/combat/skeramImages.ts +57 -0
- package/src/engine/combat/slowUpdate.ts +178 -0
- package/src/engine/combat/snapToFloor.ts +42 -0
- package/src/engine/combat/speedAura.ts +29 -0
- package/src/engine/combat/spellReagents.ts +71 -0
- package/src/engine/combat/stealthDetect.ts +93 -0
- package/src/engine/combat/stepBackMotion.ts +171 -0
- package/src/engine/combat/stepSession.ts +3102 -0
- package/src/engine/combat/summonCast.ts +243 -0
- package/src/engine/combat/thaddiusPolarity.ts +97 -0
- package/src/engine/combat/threat.ts +388 -0
- package/src/engine/combat/threatOps.ts +272 -0
- package/src/engine/combat/tickWorkerBody.ts +211 -0
- package/src/engine/combat/totemAuras.ts +122 -0
- package/src/engine/combat/triggerPayload.ts +42 -0
- package/src/engine/combat/triggeredCompanion.ts +63 -0
- package/src/engine/combat/types.ts +1897 -0
- package/src/engine/combat/useObjectTrap.ts +140 -0
- package/src/engine/combat/walkSurface.ts +54 -0
- package/src/engine/combat/weapon.ts +1248 -0
- package/src/engine/combat/worldFrame.ts +43 -0
- package/src/engine/combat.solo-golden.json +2242 -0
- package/src/engine/combat.ts +84 -0
- package/src/engine/core/detMath.ts +289 -0
- package/src/engine/core/events.ts +357 -0
- package/src/engine/core/rng.ts +36 -0
- package/src/engine/game/actionBars.ts +124 -0
- package/src/engine/game/activateObjectFromSpell.ts +320 -0
- package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
- package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
- package/src/engine/game/applyDoorFromDbScript.ts +388 -0
- package/src/engine/game/applyEscortFromDbScript.ts +290 -0
- package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
- package/src/engine/game/applyHoverFromDbScript.ts +110 -0
- package/src/engine/game/applyOocResurrect.ts +71 -0
- package/src/engine/game/applySpellDurability.ts +115 -0
- package/src/engine/game/applyTailFromDbScript.ts +478 -0
- package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
- package/src/engine/game/auctionMail.ts +269 -0
- package/src/engine/game/bagOverflow.ts +130 -0
- package/src/engine/game/bank.ts +110 -0
- package/src/engine/game/barAutofill.ts +26 -0
- package/src/engine/game/battleground.ts +369 -0
- package/src/engine/game/combatEnemySpec.ts +216 -0
- package/src/engine/game/combatObjectTraps.ts +167 -0
- package/src/engine/game/combatSeed.ts +320 -0
- package/src/engine/game/combatSession.ts +3241 -0
- package/src/engine/game/combatSessionClock.ts +62 -0
- package/src/engine/game/companionQuestActions.ts +242 -0
- package/src/engine/game/companionTraining.ts +40 -0
- package/src/engine/game/consumables.ts +624 -0
- package/src/engine/game/context.ts +53 -0
- package/src/engine/game/createHealthstone.ts +45 -0
- package/src/engine/game/deathFlow.ts +127 -0
- package/src/engine/game/devGrant.ts +117 -0
- package/src/engine/game/dynamicObject.ts +365 -0
- package/src/engine/game/enchantItem.ts +177 -0
- package/src/engine/game/equipmentHelper.ts +806 -0
- package/src/engine/game/factionState.ts +108 -0
- package/src/engine/game/garmentsOoc.ts +69 -0
- package/src/engine/game/globalActionBar.ts +179 -0
- package/src/engine/game/goInteractQuestCredit.ts +51 -0
- package/src/engine/game/goMoTransportUse.ts +61 -0
- package/src/engine/game/goTransportUse.ts +60 -0
- package/src/engine/game/healthstoneUpkeep.ts +59 -0
- package/src/engine/game/killSkin.ts +124 -0
- package/src/engine/game/learnFromItem.ts +118 -0
- package/src/engine/game/loadReconcile.ts +551 -0
- package/src/engine/game/loot.ts +294 -0
- package/src/engine/game/macros.ts +125 -0
- package/src/engine/game/mail.ts +293 -0
- package/src/engine/game/meetingStoneQueue.ts +75 -0
- package/src/engine/game/meetingStoneUse.ts +54 -0
- package/src/engine/game/newGameState.ts +363 -0
- package/src/engine/game/oocAuraInterrupt.ts +92 -0
- package/src/engine/game/oocCast.ts +241 -0
- package/src/engine/game/oocCastEffects.ts +803 -0
- package/src/engine/game/oocCastMethods.ts +1077 -0
- package/src/engine/game/openLockFromSpell.ts +174 -0
- package/src/engine/game/outdoorPvp.ts +187 -0
- package/src/engine/game/outfitter.ts +644 -0
- package/src/engine/game/paladinBoard.ts +393 -0
- package/src/engine/game/partyAuras.ts +121 -0
- package/src/engine/game/persistCombatAuras.ts +91 -0
- package/src/engine/game/pets.ts +459 -0
- package/src/engine/game/prePullHealthstones.ts +154 -0
- package/src/engine/game/professions.ts +2227 -0
- package/src/engine/game/pruneStaleRuntime.ts +39 -0
- package/src/engine/game/questFightCredit.ts +36 -0
- package/src/engine/game/questItemOnCorpse.ts +166 -0
- package/src/engine/game/questItemOnCreature.ts +103 -0
- package/src/engine/game/questLog.ts +879 -0
- package/src/engine/game/questSpellComplete.ts +21 -0
- package/src/engine/game/questTurnIn.ts +598 -0
- package/src/engine/game/raidParty.ts +32 -0
- package/src/engine/game/reagentBuyIn.ts +39 -0
- package/src/engine/game/regenRest.ts +186 -0
- package/src/engine/game/rotation.ts +425 -0
- package/src/engine/game/runFullDungeon.ts +611 -0
- package/src/engine/game/runSupply.ts +80 -0
- package/src/engine/game/sanitizeDriftedItems.ts +135 -0
- package/src/engine/game/scriptDevGoUse.ts +397 -0
- package/src/engine/game/scriptDevInnkeeper.ts +150 -0
- package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
- package/src/engine/game/sendEventFromSpell.ts +87 -0
- package/src/engine/game/sortContainers.ts +85 -0
- package/src/engine/game/spellReputation.ts +69 -0
- package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
- package/src/engine/game/squadDungeon.ts +4222 -0
- package/src/engine/game/squadQuestShare.ts +260 -0
- package/src/engine/game/summonObjectSlot.ts +69 -0
- package/src/engine/game/summonObjectWild.ts +73 -0
- package/src/engine/game/summoningRitualUse.ts +141 -0
- package/src/engine/game/talents.ts +356 -0
- package/src/engine/game/tamingRodUse.ts +66 -0
- package/src/engine/game/tempSpawnCreature.ts +136 -0
- package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
- package/src/engine/game/tickTimedQuests.ts +28 -0
- package/src/engine/game/trade.ts +586 -0
- package/src/engine/game/travel.ts +1155 -0
- package/src/engine/game/types.ts +1855 -0
- package/src/engine/game/vendorOffers.ts +244 -0
- package/src/engine/game/weaponImbueItem.ts +281 -0
- package/src/engine/game/worldSession.ts +183 -0
- package/src/engine/game/worldState.ts +166 -0
- package/src/engine/game.ts +968 -0
- package/src/engine/spells/GAP.md +67 -0
- package/src/engine/spells/absorbs.ts +376 -0
- package/src/engine/spells/addTargetTrigger.ts +53 -0
- package/src/engine/spells/auraPerSecondCost.ts +50 -0
- package/src/engine/spells/auraStacking.ts +497 -0
- package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
- package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
- package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
- package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
- package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
- package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
- package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
- package/src/engine/spells/cmangos-special-cases.ts +1570 -0
- package/src/engine/spells/conditions.ts +718 -0
- package/src/engine/spells/effects.ts +203 -0
- package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
- package/src/engine/spells/immunity.ts +942 -0
- package/src/engine/spells/intentEffects.ts +351 -0
- package/src/engine/spells/interpreter/GAPS.md +21 -0
- package/src/engine/spells/interpreter/amount.ts +109 -0
- package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
- package/src/engine/spells/interpreter/diff.ts +246 -0
- package/src/engine/spells/interpreter/duration.ts +90 -0
- package/src/engine/spells/interpreter/form-attrs.json +1 -0
- package/src/engine/spells/interpreter/form-attrs.ts +95 -0
- package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
- package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
- package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
- package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
- package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
- package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
- package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
- package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
- package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
- package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
- package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
- package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
- package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
- package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
- package/src/engine/spells/interpreter/handlers.ts +9 -0
- package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
- package/src/engine/spells/interpreter/index.ts +525 -0
- package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
- package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
- package/src/engine/spells/interpreter/mage-portals.ts +37 -0
- package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
- package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
- package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
- package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
- package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
- package/src/engine/spells/interpreter/opcodes.ts +789 -0
- package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
- package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
- package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
- package/src/engine/spells/interpreter/proc.ts +443 -0
- package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
- package/src/engine/spells/interpreter/registry/index.ts +216 -0
- package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
- package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
- package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
- package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
- package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
- package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
- package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
- package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
- package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
- package/src/engine/spells/interpreter/registry/types.ts +48 -0
- package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
- package/src/engine/spells/interpreter/targeting.ts +90 -0
- package/src/engine/spells/interpreter/types-intent.ts +1501 -0
- package/src/engine/spells/interpreter/types.ts +419 -0
- package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
- package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
- package/src/engine/spells/interrupt.ts +217 -0
- package/src/engine/spells/meleeAttackReset.ts +60 -0
- package/src/engine/spells/oocTriggerSpell.ts +49 -0
- package/src/engine/spells/overrideClassScripts.ts +319 -0
- package/src/engine/spells/parryHaste.ts +20 -0
- package/src/engine/spells/procs.ts +300 -0
- package/src/engine/spells/recovery.ts +203 -0
- package/src/engine/spells/scriptTargetDest.ts +76 -0
- package/src/engine/spells/scriptTargets.ts +85 -0
- package/src/engine/spells/singleTargetAura.ts +82 -0
- package/src/engine/spells/specialCasePayloads.ts +57 -0
- package/src/engine/spells/spellAttributes.ts +249 -0
- package/src/engine/spells/spellBonus.ts +143 -0
- package/src/engine/spells/spellModIntents.ts +419 -0
- package/src/engine/spells/spellMods.ts +283 -0
- package/src/engine/spells/spellRadius.ts +15 -0
- package/src/engine/spells/trapObjects.ts +26 -0
- package/src/json.d.ts +7 -0
- package/src/persistence/memoryRepository.ts +23 -0
- package/src/persistence/saveBackups.ts +162 -0
- package/src/persistence/saveFile.ts +68 -0
- package/src/persistence/saveRepository.ts +11 -0
- package/src/persistence/saveShape.ts +668 -0
- package/src/progression/leveling.ts +89 -0
- package/src/progression/rest.ts +1434 -0
- package/src/progression/training.ts +226 -0
- package/src/progression/xpGain.ts +369 -0
- package/src/quests/quests.ts +1580 -0
- package/src/world/aoePull.ts +198 -0
- package/src/world/areaTableDbc.ts +39 -0
- package/src/world/areaTableMapIdPairs.ts +141 -0
- package/src/world/bakeSlug.ts +43 -0
- package/src/world/continuousDungeon.ts +1250 -0
- package/src/world/dungeonBakeProjection.ts +190 -0
- package/src/world/dungeonMapDensity.ts +342 -0
- package/src/world/dungeonMapProjection.ts +135 -0
- package/src/world/dungeonNav.ts +904 -0
- package/src/world/dungeonNpcSim.ts +147 -0
- package/src/world/dungeonObjectives.ts +234 -0
- package/src/world/dungeonPreset.ts +35 -0
- package/src/world/dungeonRoute.ts +311 -0
- package/src/world/dungeonRouteGeometry.ts +732 -0
- package/src/world/dungeonRouteOrder.ts +1037 -0
- package/src/world/dungeonWingRooms.ts +426 -0
- package/src/world/escort.ts +296 -0
- package/src/world/goPoolRoll.ts +75 -0
- package/src/world/instanceObjects.ts +785 -0
- package/src/world/instances.ts +1572 -0
- package/src/world/meetingStones.ts +56 -0
- package/src/world/navmeshFloors.ts +145 -0
- package/src/world/nearGrid.ts +167 -0
- package/src/world/packBudget.ts +613 -0
- package/src/world/rareRoll.ts +335 -0
- package/src/world/routeAuthoring.ts +132 -0
- package/src/world/routeEdit.ts +209 -0
- package/src/world/world.ts +812 -0
- package/src/world/zoneHazards.ts +47 -0
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
// The shipped default fight plan for every raid boss, from the hand-editable packs under
|
|
2
|
+
// src/data/raid-plans. Validated on load: a silently dropped field reads as a working tactic.
|
|
3
|
+
|
|
4
|
+
import { ALL_COND_METRICS } from '../rotation/condMetricPicker.ts';
|
|
5
|
+
import type { Condition, CondMetric, CondOp, CondSubject, RotationRule, RuleAction } from '../rotation/types.ts';
|
|
6
|
+
|
|
7
|
+
import ubrsPack from '../../data/raid-plans/ubrs.json' with { type: 'json' };
|
|
8
|
+
import onyxiaPack from '../../data/raid-plans/onyxias-lair.json' with { type: 'json' };
|
|
9
|
+
import moltenCorePack from '../../data/raid-plans/molten-core.json' with { type: 'json' };
|
|
10
|
+
import zulGurubPack from '../../data/raid-plans/zul-gurub.json' with { type: 'json' };
|
|
11
|
+
import blackwingLairPack from '../../data/raid-plans/blackwing-lair.json' with { type: 'json' };
|
|
12
|
+
import ruinsPack from '../../data/raid-plans/ruins-of-ahnqiraj.json' with { type: 'json' };
|
|
13
|
+
import templePack from '../../data/raid-plans/temple-of-ahnqiraj.json' with { type: 'json' };
|
|
14
|
+
import naxxramasPack from '../../data/raid-plans/naxxramas.json' with { type: 'json' };
|
|
15
|
+
// First FIVE-MAN pack (E5.4). The packs were always instance plans, not 40-man plans — ubrs has
|
|
16
|
+
// been one since it shipped — so a five-man needs a file and this line, nothing else.
|
|
17
|
+
import smArmoryPack from '../../data/raid-plans/sm-armory.json' with { type: 'json' };
|
|
18
|
+
import stockadePack from '../../data/raid-plans/the-stockade.json' with { type: 'json' };
|
|
19
|
+
import deadminesPack from '../../data/raid-plans/deadmines.json' with { type: 'json' };
|
|
20
|
+
import ragefirePack from '../../data/raid-plans/ragefire-chasm.json' with { type: 'json' };
|
|
21
|
+
import wailingCavernsPack from '../../data/raid-plans/wailing-caverns.json' with { type: 'json' };
|
|
22
|
+
import shadowfangPack from '../../data/raid-plans/shadowfang-keep.json' with { type: 'json' };
|
|
23
|
+
import blackfathomPack from '../../data/raid-plans/blackfathom-deeps.json' with { type: 'json' };
|
|
24
|
+
import gnomereganPack from '../../data/raid-plans/gnomeregan.json' with { type: 'json' };
|
|
25
|
+
import razorfenKraulPack from '../../data/raid-plans/razorfen-kraul.json' with { type: 'json' };
|
|
26
|
+
import smGraveyardPack from '../../data/raid-plans/sm-graveyard.json' with { type: 'json' };
|
|
27
|
+
import smLibraryPack from '../../data/raid-plans/sm-library.json' with { type: 'json' };
|
|
28
|
+
import smCathedralPack from '../../data/raid-plans/sm-cathedral.json' with { type: 'json' };
|
|
29
|
+
import razorfenDownsPack from '../../data/raid-plans/razorfen-downs.json' with { type: 'json' };
|
|
30
|
+
import uldamanPack from '../../data/raid-plans/uldaman.json' with { type: 'json' };
|
|
31
|
+
import zulFarrakPack from '../../data/raid-plans/zul-farrak.json' with { type: 'json' };
|
|
32
|
+
import maraudonPack from '../../data/raid-plans/maraudon.json' with { type: 'json' };
|
|
33
|
+
import sunkenTemplePack from '../../data/raid-plans/sunken-temple.json' with { type: 'json' };
|
|
34
|
+
import blackrockDepthsPack from '../../data/raid-plans/blackrock-depths.json' with { type: 'json' };
|
|
35
|
+
import lbrsPack from '../../data/raid-plans/lbrs.json' with { type: 'json' };
|
|
36
|
+
import direMaulEastPack from '../../data/raid-plans/dire-maul-east.json' with { type: 'json' };
|
|
37
|
+
import direMaulWestPack from '../../data/raid-plans/dire-maul-west.json' with { type: 'json' };
|
|
38
|
+
import direMaulNorthPack from '../../data/raid-plans/dire-maul-north.json' with { type: 'json' };
|
|
39
|
+
import scholomancePack from '../../data/raid-plans/scholomance.json' with { type: 'json' };
|
|
40
|
+
import stratholmeLivePack from '../../data/raid-plans/stratholme-live.json' with { type: 'json' };
|
|
41
|
+
import stratholmeUndeadPack from '../../data/raid-plans/stratholme-undead.json' with { type: 'json' };
|
|
42
|
+
|
|
43
|
+
export type RaidTacticKind =
|
|
44
|
+
| 'cloak'
|
|
45
|
+
| 'resist'
|
|
46
|
+
| 'tank-swap'
|
|
47
|
+
| 'camp-split'
|
|
48
|
+
| 'flee'
|
|
49
|
+
| 'spread'
|
|
50
|
+
| 'halt-dps'
|
|
51
|
+
| 'mc'
|
|
52
|
+
| 'kill-order'
|
|
53
|
+
| 'use-object'
|
|
54
|
+
/** Stand somewhere the boss's own shape cannot reach (out of a frontal cone / pbaoe disc). */
|
|
55
|
+
| 'position'
|
|
56
|
+
/** Strip this aura. Composed per-body off that unit's own cure spell. */
|
|
57
|
+
| 'dispel';
|
|
58
|
+
|
|
59
|
+
/** Every kind, in the order the Raid tab lists them. */
|
|
60
|
+
export const RAID_TACTIC_KINDS: readonly RaidTacticKind[] = [
|
|
61
|
+
'resist', 'cloak', 'flee', 'spread', 'position', 'camp-split',
|
|
62
|
+
'tank-swap', 'halt-dps', 'kill-order', 'mc', 'use-object', 'dispel',
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
export type ResistSchool = 'fire' | 'nature' | 'frost' | 'shadow';
|
|
66
|
+
const RESIST_SCHOOLS: readonly ResistSchool[] = ['fire', 'nature', 'frost', 'shadow'];
|
|
67
|
+
|
|
68
|
+
/** Who must wear a named item at pull. */
|
|
69
|
+
export type GearWho = 'tanks' | 'raid';
|
|
70
|
+
|
|
71
|
+
/** A bomb the holder walks out with. `radiusYd` is the BAKED payload radius. */
|
|
72
|
+
export interface RaidFleeAura {
|
|
73
|
+
/** The aura on the raider. */
|
|
74
|
+
aura: number;
|
|
75
|
+
/** radiusYd of the payload the aura fires on removal. */
|
|
76
|
+
radiusYd: number;
|
|
77
|
+
cite: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** An add the raid mind-controls mid-fight (priest 605 on this creature_template.entry). */
|
|
81
|
+
export interface RaidMcTarget {
|
|
82
|
+
entry: number;
|
|
83
|
+
cite: string;
|
|
84
|
+
/** Boss aura that must be up. Faerlina Enrage 28798 — MC on pull burns the Worshippers. */
|
|
85
|
+
requireTargetBuff?: number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Who the aura-trigger of a shipped cure row reads. Same four as a player-written row. */
|
|
89
|
+
export type RaidCureOn = 'self' | 'boss' | 'tank' | 'anyone';
|
|
90
|
+
const CURE_ONS: readonly RaidCureOn[] = ['self', 'boss', 'tank', 'anyone'];
|
|
91
|
+
|
|
92
|
+
/** An aura this fight's default plan tells whoever can to strip. */
|
|
93
|
+
export interface RaidCureAura {
|
|
94
|
+
aura: number;
|
|
95
|
+
on: RaidCureOn;
|
|
96
|
+
cite: string;
|
|
97
|
+
/** Player-facing one-liner for the Raid tab. */
|
|
98
|
+
label?: string;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** A row this ONE fight adds on top of the class rotation, prepended at its own entry. */
|
|
102
|
+
export interface RaidEncounterTacticRow {
|
|
103
|
+
/** Which kind on `kinds` this row discharges - the census scores authored off this. */
|
|
104
|
+
kind: RaidTacticKind;
|
|
105
|
+
rule: RotationRule;
|
|
106
|
+
/** Player-facing one-liner for the rotation editor. */
|
|
107
|
+
label: string;
|
|
108
|
+
cite: string;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface RaidBossTactics {
|
|
112
|
+
/** creature_template.entry of the encounter primary. */
|
|
113
|
+
entry: number;
|
|
114
|
+
slug: string;
|
|
115
|
+
name: string;
|
|
116
|
+
special: boolean;
|
|
117
|
+
kinds: readonly RaidTacticKind[];
|
|
118
|
+
/** SpellEffects.cpp:3756 GetDummyAura(22683) — item 15138. */
|
|
119
|
+
cloak?: { item: number; dummySpell: number; who: GearWho };
|
|
120
|
+
resist?: ResistSchool;
|
|
121
|
+
/** Debuff on the current tank that forces an OT taunt. */
|
|
122
|
+
tankSwapAura?: number;
|
|
123
|
+
/** Bombs the default rotation authors a run-out row for. */
|
|
124
|
+
fleeAuras?: readonly RaidFleeAura[];
|
|
125
|
+
/** Adds the default rotation authors a priest MC row for. */
|
|
126
|
+
mcEntries?: readonly RaidMcTarget[];
|
|
127
|
+
/** Auras the default rotation authors a cure row for, composed per-body. */
|
|
128
|
+
cureAuras?: readonly RaidCureAura[];
|
|
129
|
+
/** Rows only this fight gets, prepended when the target is this entry. */
|
|
130
|
+
encounterRows?: readonly RaidEncounterTacticRow[];
|
|
131
|
+
/** Plain-English "why this plan", shown under the boss on the Raid tab. */
|
|
132
|
+
note?: string;
|
|
133
|
+
// Kinds this fight asks for that no raid row can reach yet, and the gap blocking each. Dev-facing: the
|
|
134
|
+
// census reads it, the Raid tab never shows it.
|
|
135
|
+
blockedBy?: Readonly<Partial<Record<RaidTacticKind, string>>>;
|
|
136
|
+
cite: string;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** One `src/data/raid-plans/<raid>.json` file. */
|
|
140
|
+
export interface RaidPlanPack {
|
|
141
|
+
raid: string;
|
|
142
|
+
note?: string;
|
|
143
|
+
bosses: readonly RaidBossTactics[];
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// ---- load + validate ------------------------------------------------------
|
|
147
|
+
|
|
148
|
+
const KIND_SET = new Set<string>(RAID_TACTIC_KINDS);
|
|
149
|
+
const METRIC_SET = new Set<string>(ALL_COND_METRICS);
|
|
150
|
+
const SUBJECTS: readonly CondSubject[] = ['self', 'target', 'pet'];
|
|
151
|
+
const OPS: readonly CondOp[] = ['<', '<=', '>', '>=', '==', '!='];
|
|
152
|
+
|
|
153
|
+
/** Every complaint the packs raised on load, so a bad hand-edit is visible and not silent. */
|
|
154
|
+
const LOAD_ERRORS: string[] = [];
|
|
155
|
+
|
|
156
|
+
const isObj = (v: unknown): v is Record<string, unknown> =>
|
|
157
|
+
typeof v === 'object' && v !== null && !Array.isArray(v);
|
|
158
|
+
|
|
159
|
+
const str = (v: unknown): string | null =>
|
|
160
|
+
(typeof v === 'string' && v.trim().length > 0 ? v : null);
|
|
161
|
+
|
|
162
|
+
const int = (v: unknown): number | null =>
|
|
163
|
+
(typeof v === 'number' && Number.isFinite(v) ? Math.trunc(v) : null);
|
|
164
|
+
|
|
165
|
+
function bad(where: string, why: string): null {
|
|
166
|
+
LOAD_ERRORS.push(`${where}: ${why}`);
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
function parseCondition(raw: unknown, where: string): Condition | null {
|
|
171
|
+
if (!isObj(raw)) return bad(where, 'condition is not an object');
|
|
172
|
+
const subject = SUBJECTS.find((s) => s === raw.subject);
|
|
173
|
+
const op = OPS.find((o) => o === raw.op);
|
|
174
|
+
const metric = str(raw.metric);
|
|
175
|
+
const value = typeof raw.value === 'number' && Number.isFinite(raw.value) ? raw.value : null;
|
|
176
|
+
if (!subject) return bad(where, `condition subject "${String(raw.subject)}" is not self/target/pet`);
|
|
177
|
+
if (!op) return bad(where, `condition op "${String(raw.op)}" is not a comparison`);
|
|
178
|
+
if (!metric || !METRIC_SET.has(metric)) {
|
|
179
|
+
return bad(where, `condition metric "${String(raw.metric)}" is not a CondMetric - it would never fire`);
|
|
180
|
+
}
|
|
181
|
+
if (value == null) return bad(where, 'condition value is not a number');
|
|
182
|
+
const ref = int(raw.ref);
|
|
183
|
+
return { subject, metric: metric as CondMetric, op, value, ...(ref != null ? { ref } : {}) };
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/** Every `RuleAction.kind`, with the payload field a row of that kind must carry. */
|
|
187
|
+
const ACTION_PAYLOAD: Readonly<Record<string, 'number' | 'string' | 'array' | 'object' | 'none'>> = {
|
|
188
|
+
spell: 'number', // spellId
|
|
189
|
+
item: 'number', // itemEntry
|
|
190
|
+
macro: 'string', // macroId
|
|
191
|
+
move: 'object', // move
|
|
192
|
+
halt_dps: 'none',
|
|
193
|
+
kill_order: 'array', // entries
|
|
194
|
+
use_object: 'number', // goEntry
|
|
195
|
+
};
|
|
196
|
+
const ACTION_FIELD: Readonly<Record<string, string>> = {
|
|
197
|
+
spell: 'spellId',
|
|
198
|
+
item: 'itemEntry',
|
|
199
|
+
macro: 'macroId',
|
|
200
|
+
move: 'move',
|
|
201
|
+
kill_order: 'entries',
|
|
202
|
+
use_object: 'goEntry',
|
|
203
|
+
};
|
|
204
|
+
/** Every `RuleMove.kind` the motion executor answers. */
|
|
205
|
+
const MOVE_KINDS: ReadonlySet<string> = new Set([
|
|
206
|
+
'spread', 'flee_raid', 'stack_on', 'behind_target', 'flank_target',
|
|
207
|
+
'move_to', 'avoid_zone', 'keep_range', 'split_by_aura',
|
|
208
|
+
]);
|
|
209
|
+
|
|
210
|
+
/** Checked as far as the executor acts on: a known kind and the payload it needs. */
|
|
211
|
+
function parseAction(raw: unknown, where: string): RuleAction | null {
|
|
212
|
+
if (!isObj(raw)) return bad(where, 'action is not an object');
|
|
213
|
+
const kind = str(raw.kind);
|
|
214
|
+
if (!kind) return bad(where, 'action has no kind');
|
|
215
|
+
const want = ACTION_PAYLOAD[kind];
|
|
216
|
+
if (!want) return bad(where, `action kind "${kind}" is not one the rotation performs`);
|
|
217
|
+
const field = ACTION_FIELD[kind];
|
|
218
|
+
const got = field ? raw[field] : undefined;
|
|
219
|
+
if (want === 'number' && int(got) == null) return bad(where, `action ${kind} needs a numeric ${field}`);
|
|
220
|
+
if (want === 'string' && !str(got)) return bad(where, `action ${kind} needs a ${field}`);
|
|
221
|
+
if (want === 'array' && (!Array.isArray(got) || !got.length)) {
|
|
222
|
+
return bad(where, `action ${kind} needs a non-empty ${field}`);
|
|
223
|
+
}
|
|
224
|
+
if (want === 'object') {
|
|
225
|
+
if (!isObj(got)) return bad(where, `action ${kind} needs a ${field} object`);
|
|
226
|
+
const moveKind = str(got.kind);
|
|
227
|
+
if (!moveKind || !MOVE_KINDS.has(moveKind)) {
|
|
228
|
+
return bad(where, `move kind "${String(got.kind)}" is not one sessionMotion executes`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// A click may also name the SET it presses; every member has to be a real entry, because a
|
|
232
|
+
// typo there is a button the party walks to and cannot use. Cite: rotation/types.ts goEntries.
|
|
233
|
+
if (kind === 'use_object' && raw.goEntries !== undefined) {
|
|
234
|
+
const list = raw.goEntries;
|
|
235
|
+
if (!Array.isArray(list) || !list.length) {
|
|
236
|
+
return bad(where, 'action use_object goEntries is not a non-empty array');
|
|
237
|
+
}
|
|
238
|
+
if (list.some((e) => int(e) == null || (int(e) as number) <= 0)) {
|
|
239
|
+
return bad(where, 'action use_object goEntries holds a non-numeric entry');
|
|
240
|
+
}
|
|
241
|
+
if (!list.map((e) => int(e)).includes(int(got))) {
|
|
242
|
+
return bad(where, 'action use_object goEntry is not one of its own goEntries');
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
// Validated above: the kind is one of the seven and its required payload is present.
|
|
246
|
+
return raw as unknown as RuleAction;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function parseRule(raw: unknown, where: string): RotationRule | null {
|
|
250
|
+
if (!isObj(raw)) return bad(where, 'rule is not an object');
|
|
251
|
+
const id = str(raw.id);
|
|
252
|
+
if (!id) return bad(where, 'rule has no id');
|
|
253
|
+
const action = parseAction(raw.action, `${where} ${id}`);
|
|
254
|
+
if (!action) return null;
|
|
255
|
+
if (!Array.isArray(raw.conditions)) return bad(where, `rule ${id} has no conditions array`);
|
|
256
|
+
const conditions: Condition[] = [];
|
|
257
|
+
for (const c of raw.conditions) {
|
|
258
|
+
const cond = parseCondition(c, `${where} ${id}`);
|
|
259
|
+
if (!cond) return null;
|
|
260
|
+
conditions.push(cond);
|
|
261
|
+
}
|
|
262
|
+
return { id, action, conditions, enabled: raw.enabled !== false };
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
function parseEncounterRow(raw: unknown, where: string): RaidEncounterTacticRow | null {
|
|
266
|
+
if (!isObj(raw)) return bad(where, 'row is not an object');
|
|
267
|
+
const kind = str(raw.kind);
|
|
268
|
+
if (!kind || !KIND_SET.has(kind)) return bad(where, `row kind "${String(raw.kind)}" is not a tactic kind`);
|
|
269
|
+
const label = str(raw.label);
|
|
270
|
+
if (!label) return bad(where, `row ${kind} has no label - the Raid tab cannot name it`);
|
|
271
|
+
const cite = str(raw.cite);
|
|
272
|
+
if (!cite) return bad(where, `row "${label}" has no cite`);
|
|
273
|
+
const rule = parseRule(raw.rule, `${where} "${label}"`);
|
|
274
|
+
if (!rule) return null;
|
|
275
|
+
return { kind: kind as RaidTacticKind, label, cite, rule };
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
function parseFleeAura(raw: unknown, where: string): RaidFleeAura | null {
|
|
279
|
+
if (!isObj(raw)) return bad(where, 'fleeAura is not an object');
|
|
280
|
+
const aura = int(raw.aura);
|
|
281
|
+
const radiusYd = typeof raw.radiusYd === 'number' && Number.isFinite(raw.radiusYd) ? raw.radiusYd : null;
|
|
282
|
+
const cite = str(raw.cite);
|
|
283
|
+
if (aura == null || aura <= 0) return bad(where, 'fleeAura has no aura id');
|
|
284
|
+
if (radiusYd == null || radiusYd <= 0) return bad(where, `fleeAura ${aura} has no baked radiusYd`);
|
|
285
|
+
if (!cite) return bad(where, `fleeAura ${aura} has no cite`);
|
|
286
|
+
return { aura, radiusYd, cite };
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function parseMcTarget(raw: unknown, where: string): RaidMcTarget | null {
|
|
290
|
+
if (!isObj(raw)) return bad(where, 'mcEntry is not an object');
|
|
291
|
+
const entry = int(raw.entry);
|
|
292
|
+
const cite = str(raw.cite);
|
|
293
|
+
if (entry == null || entry <= 0) return bad(where, 'mcEntry has no creature entry');
|
|
294
|
+
if (!cite) return bad(where, `mcEntry ${entry} has no cite`);
|
|
295
|
+
const requireTargetBuff = int(raw.requireTargetBuff);
|
|
296
|
+
return {
|
|
297
|
+
entry,
|
|
298
|
+
cite,
|
|
299
|
+
...(requireTargetBuff != null && requireTargetBuff > 0 ? { requireTargetBuff } : {}),
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
function parseCureAura(raw: unknown, where: string): RaidCureAura | null {
|
|
304
|
+
if (!isObj(raw)) return bad(where, 'cureAura is not an object');
|
|
305
|
+
const aura = int(raw.aura);
|
|
306
|
+
const cite = str(raw.cite);
|
|
307
|
+
if (aura == null || aura <= 0) return bad(where, 'cureAura has no aura id');
|
|
308
|
+
if (!cite) return bad(where, `cureAura ${aura} has no cite`);
|
|
309
|
+
const on = CURE_ONS.find((o) => o === raw.on) ?? 'anyone';
|
|
310
|
+
const label = str(raw.label);
|
|
311
|
+
return { aura, on, cite, ...(label ? { label } : {}) };
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
function parseBlockedBy(raw: unknown, where: string): RaidBossTactics['blockedBy'] {
|
|
315
|
+
if (!isObj(raw)) return undefined;
|
|
316
|
+
const out: Partial<Record<RaidTacticKind, string>> = {};
|
|
317
|
+
for (const [kind, why] of Object.entries(raw)) {
|
|
318
|
+
const reason = str(why);
|
|
319
|
+
if (!KIND_SET.has(kind)) {
|
|
320
|
+
bad(where, `blockedBy names "${kind}", which is not a tactic kind`);
|
|
321
|
+
continue;
|
|
322
|
+
}
|
|
323
|
+
if (!reason) {
|
|
324
|
+
bad(where, `blockedBy.${kind} has no reason`);
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
out[kind as RaidTacticKind] = reason;
|
|
328
|
+
}
|
|
329
|
+
return Object.keys(out).length ? out : undefined;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function parseBoss(raw: unknown, slug: string): RaidBossTactics | null {
|
|
333
|
+
if (!isObj(raw)) return bad(slug, 'boss is not an object');
|
|
334
|
+
const entry = int(raw.entry);
|
|
335
|
+
const name = str(raw.name);
|
|
336
|
+
if (entry == null || entry <= 0) return bad(slug, `boss "${String(raw.name)}" has no creature entry`);
|
|
337
|
+
const where = `${slug} ${name ?? entry}`;
|
|
338
|
+
if (!name) return bad(where, 'boss has no name');
|
|
339
|
+
const cite = str(raw.cite);
|
|
340
|
+
if (!cite) return bad(where, 'boss has no cite - AI.md forbids an unsourced row');
|
|
341
|
+
|
|
342
|
+
const kindsRaw = Array.isArray(raw.kinds) ? raw.kinds : [];
|
|
343
|
+
const kinds: RaidTacticKind[] = [];
|
|
344
|
+
for (const k of kindsRaw) {
|
|
345
|
+
if (typeof k === 'string' && KIND_SET.has(k)) kinds.push(k as RaidTacticKind);
|
|
346
|
+
else bad(where, `kind "${String(k)}" is not a tactic kind`);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
const rowsRaw = Array.isArray(raw.encounterRows) ? raw.encounterRows : [];
|
|
350
|
+
const encounterRows: RaidEncounterTacticRow[] = [];
|
|
351
|
+
for (const r of rowsRaw) {
|
|
352
|
+
const row = parseEncounterRow(r, where);
|
|
353
|
+
if (row) encounterRows.push(row);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
const fleeRaw = Array.isArray(raw.fleeAuras) ? raw.fleeAuras : [];
|
|
357
|
+
const fleeAuras: RaidFleeAura[] = [];
|
|
358
|
+
for (const f of fleeRaw) {
|
|
359
|
+
const aura = parseFleeAura(f, where);
|
|
360
|
+
if (aura) fleeAuras.push(aura);
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
const mcRaw = Array.isArray(raw.mcEntries) ? raw.mcEntries : [];
|
|
364
|
+
const mcEntries: RaidMcTarget[] = [];
|
|
365
|
+
for (const m of mcRaw) {
|
|
366
|
+
const mc = parseMcTarget(m, where);
|
|
367
|
+
if (mc) mcEntries.push(mc);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const cureRaw = Array.isArray(raw.cureAuras) ? raw.cureAuras : [];
|
|
371
|
+
const cureAuras: RaidCureAura[] = [];
|
|
372
|
+
for (const c of cureRaw) {
|
|
373
|
+
const cure = parseCureAura(c, where);
|
|
374
|
+
if (cure) cureAuras.push(cure);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
let cloak: RaidBossTactics['cloak'];
|
|
378
|
+
if (isObj(raw.cloak)) {
|
|
379
|
+
const item = int(raw.cloak.item);
|
|
380
|
+
const dummySpell = int(raw.cloak.dummySpell);
|
|
381
|
+
const who = raw.cloak.who === 'raid' ? 'raid' : 'tanks';
|
|
382
|
+
if (item == null || dummySpell == null) bad(where, 'cloak needs both an item and a dummySpell');
|
|
383
|
+
else cloak = { item, dummySpell, who };
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
const resist = RESIST_SCHOOLS.find((s) => s === raw.resist);
|
|
387
|
+
if (raw.resist != null && !resist) bad(where, `resist "${String(raw.resist)}" is not a school`);
|
|
388
|
+
const tankSwapAura = int(raw.tankSwapAura);
|
|
389
|
+
const note = str(raw.note);
|
|
390
|
+
const blockedBy = parseBlockedBy(raw.blockedBy, where);
|
|
391
|
+
|
|
392
|
+
return {
|
|
393
|
+
entry,
|
|
394
|
+
slug,
|
|
395
|
+
name,
|
|
396
|
+
// A fight is "special" when it asks the raid for something beyond tank-and-spank.
|
|
397
|
+
special: kinds.length > 0,
|
|
398
|
+
kinds,
|
|
399
|
+
cite,
|
|
400
|
+
...(note ? { note } : {}),
|
|
401
|
+
...(resist ? { resist } : {}),
|
|
402
|
+
...(cloak ? { cloak } : {}),
|
|
403
|
+
...(tankSwapAura != null && tankSwapAura > 0 ? { tankSwapAura } : {}),
|
|
404
|
+
...(fleeAuras.length ? { fleeAuras } : {}),
|
|
405
|
+
...(mcEntries.length ? { mcEntries } : {}),
|
|
406
|
+
...(cureAuras.length ? { cureAuras } : {}),
|
|
407
|
+
...(encounterRows.length ? { encounterRows } : {}),
|
|
408
|
+
...(blockedBy ? { blockedBy } : {}),
|
|
409
|
+
};
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/** Parse one pack file. Exported so the materializer's `--check` and smoke read the same path. */
|
|
413
|
+
export function parseRaidPlanPack(raw: unknown): RaidPlanPack | null {
|
|
414
|
+
if (!isObj(raw)) return bad('pack', 'file is not an object');
|
|
415
|
+
const slug = str(raw.raid);
|
|
416
|
+
if (!slug) return bad('pack', 'file has no "raid" slug');
|
|
417
|
+
if (!Array.isArray(raw.bosses)) return bad(slug, 'file has no "bosses" array');
|
|
418
|
+
const bosses: RaidBossTactics[] = [];
|
|
419
|
+
for (const b of raw.bosses) {
|
|
420
|
+
const boss = parseBoss(b, slug);
|
|
421
|
+
if (boss) bosses.push(boss);
|
|
422
|
+
}
|
|
423
|
+
const note = str(raw.note);
|
|
424
|
+
return { raid: slug, ...(note ? { note } : {}), bosses };
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
// Every pack, raids in progression order then the five-mans in level order — the order `RAID_BOSS_TACTICS`
|
|
428
|
+
// concatenates them.
|
|
429
|
+
const PACK_SOURCES: readonly unknown[] = [
|
|
430
|
+
ubrsPack,
|
|
431
|
+
onyxiaPack,
|
|
432
|
+
moltenCorePack,
|
|
433
|
+
zulGurubPack,
|
|
434
|
+
blackwingLairPack,
|
|
435
|
+
ruinsPack,
|
|
436
|
+
templePack,
|
|
437
|
+
naxxramasPack,
|
|
438
|
+
ragefirePack,
|
|
439
|
+
deadminesPack,
|
|
440
|
+
wailingCavernsPack,
|
|
441
|
+
stockadePack,
|
|
442
|
+
shadowfangPack,
|
|
443
|
+
blackfathomPack,
|
|
444
|
+
gnomereganPack,
|
|
445
|
+
razorfenKraulPack,
|
|
446
|
+
smGraveyardPack,
|
|
447
|
+
smLibraryPack,
|
|
448
|
+
smArmoryPack,
|
|
449
|
+
smCathedralPack,
|
|
450
|
+
razorfenDownsPack,
|
|
451
|
+
uldamanPack,
|
|
452
|
+
zulFarrakPack,
|
|
453
|
+
maraudonPack,
|
|
454
|
+
sunkenTemplePack,
|
|
455
|
+
blackrockDepthsPack,
|
|
456
|
+
lbrsPack,
|
|
457
|
+
direMaulEastPack,
|
|
458
|
+
direMaulWestPack,
|
|
459
|
+
direMaulNorthPack,
|
|
460
|
+
scholomancePack,
|
|
461
|
+
stratholmeLivePack,
|
|
462
|
+
stratholmeUndeadPack,
|
|
463
|
+
];
|
|
464
|
+
|
|
465
|
+
export const RAID_PLAN_PACKS: readonly RaidPlanPack[] =
|
|
466
|
+
PACK_SOURCES.map((p) => parseRaidPlanPack(p)).filter((p): p is RaidPlanPack => p != null);
|
|
467
|
+
|
|
468
|
+
/** Every boss plan the game ships, flattened in progression order. */
|
|
469
|
+
export const RAID_BOSS_TACTICS: readonly RaidBossTactics[] =
|
|
470
|
+
RAID_PLAN_PACKS.flatMap((p) => p.bosses);
|
|
471
|
+
|
|
472
|
+
/** The per-raid note, for the Raid tab's header. */
|
|
473
|
+
export function raidPlanPackNote(slug: string): string | undefined {
|
|
474
|
+
return RAID_PLAN_PACKS.find((p) => p.raid === slug)?.note;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
/** Everything the packs refused on load. Smoke fails on any entry. */
|
|
478
|
+
export function raidPlanPackErrors(): readonly string[] {
|
|
479
|
+
return LOAD_ERRORS;
|
|
480
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Between-pull resurrection: who can stand a corpse back up, with which spell. Read off the bake —
|
|
2
|
+
// a resurrect spell is any whose rawEffects carry effect 18 or 113, and the payload is its own.
|
|
3
|
+
|
|
4
|
+
import type { SpellDef } from '../../data/schema.ts';
|
|
5
|
+
import { resurrectEffectsFromRaw, applyResurrectEffect, type ResurrectEffect } from '../spells/resurrectSpell.ts';
|
|
6
|
+
import type { ResurrectDeathFlow } from '../spells/resurrectSpell.ts';
|
|
7
|
+
|
|
8
|
+
/** One party member considered as a resurrector. */
|
|
9
|
+
export interface RecoveryCaster {
|
|
10
|
+
name: string;
|
|
11
|
+
/** Companion level (its own curve, not the player's). */
|
|
12
|
+
level: number;
|
|
13
|
+
/** 'tank' | 'healer' | 'dps' — only used to prefer a healer when several can cast. */
|
|
14
|
+
role: string;
|
|
15
|
+
/** False when the member ended the last pull dead. A corpse cannot cast. */
|
|
16
|
+
alive: boolean;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface ResurrectOption {
|
|
20
|
+
casterName: string;
|
|
21
|
+
spellId: number;
|
|
22
|
+
spellName: string;
|
|
23
|
+
/** Real cast time; the caller charges it as downtime. Resurrection is a 10 s cast. */
|
|
24
|
+
castTimeMs: number;
|
|
25
|
+
/** Flat health this rank restores (or the percent form's resolved payload). */
|
|
26
|
+
effect: ResurrectEffect;
|
|
27
|
+
/** Reagent this rank burns (Rebirth's seed). Absent on the reagent-free rezzes. */
|
|
28
|
+
consumesItem?: number;
|
|
29
|
+
/** The spell's own cooldown, for the caller to stamp (Rebirth: 30 min). */
|
|
30
|
+
cooldownMs?: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Health this option restores, for ranking only (percent forms rank below flat ones). */
|
|
34
|
+
function restoredHealth(o: ResurrectOption): number {
|
|
35
|
+
return o.effect.kind === 'resurrect' ? o.effect.health : 0;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Reagent-paying rezzes sort behind free ones however much health they restore: Rebirth rank 5
|
|
39
|
+
// would otherwise always win, burning a seed and a 30-minute cooldown a priest could spare.
|
|
40
|
+
function isCostly(o: ResurrectOption): boolean {
|
|
41
|
+
return o.consumesItem != null || (o.cooldownMs ?? 0) > 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Caller-supplied bag lookup. Default (nothing carried) reproduces the reagent-free behaviour. */
|
|
45
|
+
export type HasItemFn = (casterName: string, item: number) => number;
|
|
46
|
+
|
|
47
|
+
const NO_ITEMS: HasItemFn = () => 0;
|
|
48
|
+
|
|
49
|
+
// Best resurrect spell one caster knows at its level: the highest learnable rank. A rank with
|
|
50
|
+
// reagents is only offered when hasItem proves every one of them is in the bags.
|
|
51
|
+
export function bestResurrectSpellFor(
|
|
52
|
+
caster: RecoveryCaster,
|
|
53
|
+
spells: readonly SpellDef[],
|
|
54
|
+
hasItem: HasItemFn = NO_ITEMS,
|
|
55
|
+
): ResurrectOption | null {
|
|
56
|
+
let best: ResurrectOption | null = null;
|
|
57
|
+
for (const s of spells) {
|
|
58
|
+
const lvl = s.spellLevel ?? 0;
|
|
59
|
+
if (lvl > caster.level) continue;
|
|
60
|
+
const fx = resurrectEffectsFromRaw(s.rawEffects);
|
|
61
|
+
if (!fx.length) continue;
|
|
62
|
+
const reagents = s.reagents ?? [];
|
|
63
|
+
if (reagents.some((r) => hasItem(caster.name, r.item) < Math.max(1, r.count | 0))) continue;
|
|
64
|
+
const option: ResurrectOption = {
|
|
65
|
+
casterName: caster.name,
|
|
66
|
+
spellId: s.id,
|
|
67
|
+
spellName: s.name,
|
|
68
|
+
castTimeMs: Math.max(0, s.castTimeMs | 0),
|
|
69
|
+
effect: fx[0]!,
|
|
70
|
+
...(reagents.length ? { consumesItem: reagents[0]!.item } : {}),
|
|
71
|
+
...((s.cooldownMs ?? 0) > 0 ? { cooldownMs: s.cooldownMs } : {}),
|
|
72
|
+
};
|
|
73
|
+
// Free beats costly first; within a tier, the strongest rank wins.
|
|
74
|
+
if (!best) { best = option; continue; }
|
|
75
|
+
if (isCostly(best) !== isCostly(option)) {
|
|
76
|
+
if (isCostly(best)) best = option;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (restoredHealth(option) > restoredHealth(best)) best = option;
|
|
80
|
+
}
|
|
81
|
+
return best;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Pick who resurrects: a living member with a rez, cheap first, then healers, then the strongest
|
|
85
|
+
// rank. Null with no candidate. `onCooldown` refuses a caster whose Rebirth is still ticking.
|
|
86
|
+
export function pickResurrector(
|
|
87
|
+
casters: readonly RecoveryCaster[],
|
|
88
|
+
spellsOf: (caster: RecoveryCaster) => readonly SpellDef[],
|
|
89
|
+
opts?: { hasItem?: HasItemFn; onCooldown?: (casterName: string, spellId: number) => boolean },
|
|
90
|
+
): ResurrectOption | null {
|
|
91
|
+
const hasItem = opts?.hasItem ?? NO_ITEMS;
|
|
92
|
+
const onCooldown = opts?.onCooldown;
|
|
93
|
+
const offers: Array<{ option: ResurrectOption; healer: boolean }> = [];
|
|
94
|
+
for (const c of casters) {
|
|
95
|
+
if (!c.alive) continue;
|
|
96
|
+
const usable = spellsOf(c).filter((s) => !onCooldown?.(c.name, s.id));
|
|
97
|
+
const option = bestResurrectSpellFor(c, usable, hasItem);
|
|
98
|
+
if (option) offers.push({ option, healer: c.role === 'healer' });
|
|
99
|
+
}
|
|
100
|
+
if (!offers.length) return null;
|
|
101
|
+
offers.sort((a, b) => {
|
|
102
|
+
const ac = isCostly(a.option);
|
|
103
|
+
const bc = isCostly(b.option);
|
|
104
|
+
if (ac !== bc) return ac ? 1 : -1;
|
|
105
|
+
if (a.healer !== b.healer) return a.healer ? -1 : 1;
|
|
106
|
+
return restoredHealth(b.option) - restoredHealth(a.option);
|
|
107
|
+
});
|
|
108
|
+
return offers[0]!.option;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface PartyResurrectApply {
|
|
112
|
+
/** Health to set on the revived character (null = nothing to revive). */
|
|
113
|
+
health: number | null;
|
|
114
|
+
mana: number | null;
|
|
115
|
+
clearDeathFlow?: { deathState: 'ALIVE'; deathExpireTimeSec: number };
|
|
116
|
+
/** Player-facing line: who stood you up and with what. */
|
|
117
|
+
log: string;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Resolve the revive numbers for a chosen option. Thin wrapper over `applyResurrectEffect` (the same pure
|
|
121
|
+
// apply the player's own OOC cast path uses), so a party res and a self res cannot drift apart.
|
|
122
|
+
export function resolvePartyResurrect(
|
|
123
|
+
option: ResurrectOption,
|
|
124
|
+
target: {
|
|
125
|
+
maxHealth: number;
|
|
126
|
+
maxMana: number;
|
|
127
|
+
powerType: string;
|
|
128
|
+
hasParallelMana: boolean;
|
|
129
|
+
// Present only in deathFlowMode 'full'. The default 'repair-only' mode has no flow object, so
|
|
130
|
+
// applyResurrectEffect alone reads "no dead target" and refuses.
|
|
131
|
+
deathFlow: ResurrectDeathFlow | null | undefined;
|
|
132
|
+
},
|
|
133
|
+
): PartyResurrectApply {
|
|
134
|
+
const res = applyResurrectEffect({
|
|
135
|
+
effect: option.effect,
|
|
136
|
+
maxHealth: target.maxHealth,
|
|
137
|
+
maxMana: target.maxMana,
|
|
138
|
+
deathFlow: target.deathFlow,
|
|
139
|
+
// The caller has already established the target is a corpse (isPlayerAlive false), and this
|
|
140
|
+
// is a PARTY res on that corpse, so force it rather than re-deriving death from the flow.
|
|
141
|
+
forceSelf: true,
|
|
142
|
+
powerType: target.powerType,
|
|
143
|
+
hasParallelMana: target.hasParallelMana,
|
|
144
|
+
});
|
|
145
|
+
return {
|
|
146
|
+
health: res.health,
|
|
147
|
+
mana: res.mana,
|
|
148
|
+
...(res.clearDeathFlow ? { clearDeathFlow: res.clearDeathFlow } : {}),
|
|
149
|
+
log: res.health == null
|
|
150
|
+
? res.log
|
|
151
|
+
: `${option.casterName} casts ${option.spellName} on you. You return to life with ${res.health} health.`,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
// Release, walk back, reclaim at half health with no sickness, paying the death-count delay.
|
|
157
|
+
// Cite: MiscHandler.cpp HandleReclaimCorpseOpcode -> ResurrectPlayer(0.5f); corpseReclaimDelay.
|
|
158
|
+
export interface CorpseRunApply {
|
|
159
|
+
/** Health to restore the player to. */
|
|
160
|
+
health: number;
|
|
161
|
+
/** Mana to restore, or null for a rage/energy body. */
|
|
162
|
+
mana: number | null;
|
|
163
|
+
/** Seconds the walk back and the reclaim delay cost the run. */
|
|
164
|
+
downtimeSec: number;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/** MiscHandler.cpp ResurrectPlayer(0.5f) — the reclaim restores half. */
|
|
168
|
+
export const CORPSE_RECLAIM_RESTORE_PERCENT = 0.5;
|
|
169
|
+
|
|
170
|
+
export function resolveCorpseRun(target: {
|
|
171
|
+
maxHealth: number;
|
|
172
|
+
maxMana: number;
|
|
173
|
+
powerType: string;
|
|
174
|
+
/** Deaths so far this run — indexes the reclaim delay table. */
|
|
175
|
+
deaths: number;
|
|
176
|
+
reclaimDelayMs: number;
|
|
177
|
+
}): CorpseRunApply {
|
|
178
|
+
const health = Math.max(1, Math.round(target.maxHealth * CORPSE_RECLAIM_RESTORE_PERCENT));
|
|
179
|
+
const mana = target.powerType === 'rage' || target.powerType === 'energy'
|
|
180
|
+
? null
|
|
181
|
+
: Math.max(0, Math.round(target.maxMana * CORPSE_RECLAIM_RESTORE_PERCENT));
|
|
182
|
+
return { health, mana, downtimeSec: Math.round(target.reclaimDelayMs / 1000) };
|
|
183
|
+
}
|