azeroth-shell 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -2
- package/bin/azsh.mjs +19 -0
- package/docs/aifid/eventai-texts.json +4414 -0
- package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
- package/docs/dungeons/survey/pack-id-migration.json +2418 -0
- package/package.json +26 -4
- package/src/autopilot/bossSkip.ts +26 -0
- package/src/autopilot/combatRotation.ts +824 -0
- package/src/autopilot/config.ts +533 -0
- package/src/autopilot/consumables.ts +58 -0
- package/src/autopilot/encounterStand.ts +121 -0
- package/src/autopilot/objectGatePlan.ts +53 -0
- package/src/autopilot/pathEngage.ts +229 -0
- package/src/autopilot/plan.ts +1643 -0
- package/src/autopilot/questPolicy.ts +274 -0
- package/src/autopilot/routeStep.ts +69 -0
- package/src/autopilot/sessionReport.ts +88 -0
- package/src/autopilot/topOffPower.ts +26 -0
- package/src/autopilot/view.ts +476 -0
- package/src/cli/bootCheck.mjs +34 -0
- package/src/cli/bootData.mjs +57 -0
- package/src/cli/combatLogFilter.ts +153 -0
- package/src/cli/combatLogFormat.ts +613 -0
- package/src/cli/fileRepository.mjs +105 -0
- package/src/cli/gzLoader.mjs +31 -0
- package/src/cli/liveGauntletEscort.ts +978 -0
- package/src/cli/liveStratUndead.ts +305 -0
- package/src/cli/macroHostCombat.ts +545 -0
- package/src/cli/macroHostWorld.ts +330 -0
- package/src/cli/prefs.mjs +31 -0
- package/src/cli/register.mjs +4 -0
- package/src/cli/repl.mjs +693 -0
- package/src/cli/rotationText.mjs +226 -0
- package/src/cli/squad.mjs +105 -0
- package/src/cli/term.mjs +126 -0
- package/src/cli/text.mjs +122 -0
- package/src/cli/tui.mjs +626 -0
- package/src/cli/tuiArena.mjs +109 -0
- package/src/cli/tuiAutopilotSettings.mjs +93 -0
- package/src/cli/tuiBags.mjs +180 -0
- package/src/cli/tuiBars.mjs +133 -0
- package/src/cli/tuiBg.mjs +243 -0
- package/src/cli/tuiBulk.mjs +162 -0
- package/src/cli/tuiCheck.mjs +1882 -0
- package/src/cli/tuiCity.mjs +396 -0
- package/src/cli/tuiCompanionKit.mjs +300 -0
- package/src/cli/tuiCompanions.mjs +471 -0
- package/src/cli/tuiDev.mjs +62 -0
- package/src/cli/tuiDungeon.mjs +606 -0
- package/src/cli/tuiEnchantTarget.mjs +120 -0
- package/src/cli/tuiFight.mjs +577 -0
- package/src/cli/tuiFightPanes.mjs +228 -0
- package/src/cli/tuiFloor.mjs +506 -0
- package/src/cli/tuiGear.mjs +158 -0
- package/src/cli/tuiHonor.mjs +74 -0
- package/src/cli/tuiLoot.mjs +97 -0
- package/src/cli/tuiMacros.mjs +144 -0
- package/src/cli/tuiOutfitter.mjs +115 -0
- package/src/cli/tuiPet.mjs +116 -0
- package/src/cli/tuiProfessions.mjs +800 -0
- package/src/cli/tuiRaid.mjs +127 -0
- package/src/cli/tuiRep.mjs +65 -0
- package/src/cli/tuiSaves.mjs +69 -0
- package/src/cli/tuiSearch.mjs +363 -0
- package/src/cli/tuiSettings.mjs +151 -0
- package/src/cli/tuiSimLab.mjs +80 -0
- package/src/cli/tuiTalents.mjs +60 -0
- package/src/cli/tuiViews.mjs +1178 -0
- package/src/cli/tuiWiki.mjs +181 -0
- package/src/cli/tuiWorld.mjs +361 -0
- package/src/cli/wikiIndex.ts +259 -0
- package/src/cli/wikiSources.ts +355 -0
- package/src/data/alteracValley.ts +176 -0
- package/src/data/appearanceOptions.ts +534 -0
- package/src/data/applyLootChanceSanity.ts +21 -0
- package/src/data/createFlavor.ts +96 -0
- package/src/data/customItems.ts +33 -0
- package/src/data/dataStore.ts +1904 -0
- package/src/data/dungeonGameObjects.ts +84 -0
- package/src/data/dungeonPlateCover.ts +66 -0
- package/src/data/dungeonSpawns.ts +294 -0
- package/src/data/dungeons/alterac-valley.ts +135 -0
- package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
- package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
- package/src/data/dungeons/apply-instance-geometry.ts +65 -0
- package/src/data/dungeons/apply-spawn-placement.ts +171 -0
- package/src/data/dungeons/blackfathom-deeps.ts +539 -0
- package/src/data/dungeons/blackrock-depths.ts +1410 -0
- package/src/data/dungeons/blackwing-lair.ts +129 -0
- package/src/data/dungeons/boss-eventai.ts +8 -0
- package/src/data/dungeons/deadmines.ts +410 -0
- package/src/data/dungeons/dire-maul-east.ts +980 -0
- package/src/data/dungeons/dire-maul-north.ts +661 -0
- package/src/data/dungeons/dire-maul-west.ts +785 -0
- package/src/data/dungeons/dungeon-rooms.json +5479 -0
- package/src/data/dungeons/encounter-outdoors.json +359 -0
- package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
- package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
- package/src/data/dungeons/eventai/deadmines.ts +264 -0
- package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
- package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
- package/src/data/dungeons/eventai/helpers.ts +79 -0
- package/src/data/dungeons/eventai/index.ts +133 -0
- package/src/data/dungeons/eventai/lbrs.ts +372 -0
- package/src/data/dungeons/eventai/maraudon.ts +323 -0
- package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
- package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
- package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
- package/src/data/dungeons/eventai/scholomance.ts +680 -0
- package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
- package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
- package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
- package/src/data/dungeons/eventai/sm-library.ts +55 -0
- package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
- package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
- package/src/data/dungeons/eventai/the-stockade.ts +228 -0
- package/src/data/dungeons/eventai/ubrs.ts +225 -0
- package/src/data/dungeons/eventai/uldaman.ts +355 -0
- package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
- package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
- package/src/data/dungeons/gnomeregan.ts +909 -0
- package/src/data/dungeons/index.ts +126 -0
- package/src/data/dungeons/instance-geometry.json +5233 -0
- package/src/data/dungeons/key-sources.json +169 -0
- package/src/data/dungeons/lbrs.ts +996 -0
- package/src/data/dungeons/maraudon.ts +786 -0
- package/src/data/dungeons/molten-core.ts +194 -0
- package/src/data/dungeons/naxxramas.ts +173 -0
- package/src/data/dungeons/onyxias-lair.ts +71 -0
- package/src/data/dungeons/pack-from-clusters.ts +1256 -0
- package/src/data/dungeons/ragefire-chasm.ts +238 -0
- package/src/data/dungeons/razorfen-downs.ts +698 -0
- package/src/data/dungeons/razorfen-kraul.ts +766 -0
- package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
- package/src/data/dungeons/scholomance.ts +1076 -0
- package/src/data/dungeons/shadowfang-keep.ts +740 -0
- package/src/data/dungeons/sm-armory.ts +266 -0
- package/src/data/dungeons/sm-cathedral.ts +430 -0
- package/src/data/dungeons/sm-graveyard.ts +482 -0
- package/src/data/dungeons/sm-library.ts +337 -0
- package/src/data/dungeons/stratholme-live.ts +808 -0
- package/src/data/dungeons/stratholme-undead.ts +1164 -0
- package/src/data/dungeons/sunken-temple.ts +931 -0
- package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
- package/src/data/dungeons/the-stockade.ts +282 -0
- package/src/data/dungeons/ubrs.ts +1286 -0
- package/src/data/dungeons/uldaman.ts +685 -0
- package/src/data/dungeons/wailing-caverns.ts +356 -0
- package/src/data/dungeons/zul-farrak.ts +686 -0
- package/src/data/dungeons/zul-gurub.ts +142 -0
- package/src/data/dungeons.ts +42 -0
- package/src/data/fixtures.ts +446 -0
- package/src/data/gameobject-data.json.gz +0 -0
- package/src/data/item-data.json.gz +0 -0
- package/src/data/loot-data.json.gz +0 -0
- package/src/data/maps/atlas-approach-maps.json +1425 -0
- package/src/data/maps/atlas-landmarks.json +1711 -0
- package/src/data/maps/dungeon-viewports.json +392 -0
- package/src/data/materializeModDamagePercentTaken.ts +70 -0
- package/src/data/materializeModHealthRegen.ts +89 -0
- package/src/data/materializeSpellReputation.ts +26 -0
- package/src/data/pageTexts.ts +19 -0
- package/src/data/profession-data.json.gz +0 -0
- package/src/data/raid-plans/blackfathom-deeps.json +86 -0
- package/src/data/raid-plans/blackrock-depths.json +419 -0
- package/src/data/raid-plans/blackwing-lair.json +328 -0
- package/src/data/raid-plans/deadmines.json +55 -0
- package/src/data/raid-plans/dire-maul-east.json +94 -0
- package/src/data/raid-plans/dire-maul-north.json +70 -0
- package/src/data/raid-plans/dire-maul-west.json +75 -0
- package/src/data/raid-plans/gnomeregan.json +131 -0
- package/src/data/raid-plans/lbrs.json +176 -0
- package/src/data/raid-plans/maraudon.json +102 -0
- package/src/data/raid-plans/molten-core.json +169 -0
- package/src/data/raid-plans/naxxramas.json +354 -0
- package/src/data/raid-plans/onyxias-lair.json +18 -0
- package/src/data/raid-plans/ragefire-chasm.json +30 -0
- package/src/data/raid-plans/razorfen-downs.json +75 -0
- package/src/data/raid-plans/razorfen-kraul.json +53 -0
- package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
- package/src/data/raid-plans/scholomance.json +170 -0
- package/src/data/raid-plans/shadowfang-keep.json +87 -0
- package/src/data/raid-plans/sm-armory.json +53 -0
- package/src/data/raid-plans/sm-cathedral.json +72 -0
- package/src/data/raid-plans/sm-graveyard.json +63 -0
- package/src/data/raid-plans/sm-library.json +23 -0
- package/src/data/raid-plans/stratholme-live.json +129 -0
- package/src/data/raid-plans/stratholme-undead.json +73 -0
- package/src/data/raid-plans/sunken-temple.json +159 -0
- package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
- package/src/data/raid-plans/the-stockade.json +42 -0
- package/src/data/raid-plans/ubrs.json +53 -0
- package/src/data/raid-plans/uldaman.json +131 -0
- package/src/data/raid-plans/wailing-caverns.json +90 -0
- package/src/data/raid-plans/zul-farrak.json +156 -0
- package/src/data/raid-plans/zul-gurub.json +307 -0
- package/src/data/raidInstanceCreatures.mjs +473 -0
- package/src/data/rotations/index.ts +152 -0
- package/src/data/rotations/layout.mjs +72 -0
- package/src/data/rotations/pve/druid/balance.json +754 -0
- package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
- package/src/data/rotations/pve/druid/feral.json +2660 -0
- package/src/data/rotations/pve/druid/restoration.json +424 -0
- package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
- package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
- package/src/data/rotations/pve/hunter/survival.json +1373 -0
- package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
- package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
- package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
- package/src/data/rotations/pve/paladin/holy.json +755 -0
- package/src/data/rotations/pve/paladin/protection.json +962 -0
- package/src/data/rotations/pve/paladin/retribution.json +924 -0
- package/src/data/rotations/pve/priest/discipline.json +772 -0
- package/src/data/rotations/pve/priest/holy.json +707 -0
- package/src/data/rotations/pve/priest/shadow.json +787 -0
- package/src/data/rotations/pve/rogue/assassination.json +2477 -0
- package/src/data/rotations/pve/rogue/combat.json +2483 -0
- package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
- package/src/data/rotations/pve/shaman/elemental.json +1157 -0
- package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
- package/src/data/rotations/pve/shaman/restoration.json +592 -0
- package/src/data/rotations/pve/warlock/affliction.json +1185 -0
- package/src/data/rotations/pve/warlock/demonology.json +1165 -0
- package/src/data/rotations/pve/warlock/destruction.json +1177 -0
- package/src/data/rotations/pve/warrior/arms.json +3020 -0
- package/src/data/rotations/pve/warrior/fury.json +2996 -0
- package/src/data/rotations/pve/warrior/protection.json +2509 -0
- package/src/data/rotations/pvp/druid/balance.json +593 -0
- package/src/data/rotations/pvp/druid/feral.json +3276 -0
- package/src/data/rotations/pvp/druid/restoration.json +662 -0
- package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
- package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
- package/src/data/rotations/pvp/hunter/survival.json +635 -0
- package/src/data/rotations/pvp/mage/arcane.json +574 -0
- package/src/data/rotations/pvp/mage/fire.json +570 -0
- package/src/data/rotations/pvp/mage/frost.json +4048 -0
- package/src/data/rotations/pvp/paladin/holy.json +1498 -0
- package/src/data/rotations/pvp/paladin/protection.json +567 -0
- package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
- package/src/data/rotations/pvp/priest/discipline.json +1848 -0
- package/src/data/rotations/pvp/priest/holy.json +6340 -0
- package/src/data/rotations/pvp/priest/shadow.json +2329 -0
- package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
- package/src/data/rotations/pvp/rogue/combat.json +5258 -0
- package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
- package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
- package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
- package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
- package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
- package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
- package/src/data/rotations/pvp/warlock/destruction.json +638 -0
- package/src/data/rotations/pvp/warrior/arms.json +5665 -0
- package/src/data/rotations/pvp/warrior/fury.json +850 -0
- package/src/data/rotations/pvp/warrior/protection.json +777 -0
- package/src/data/schema/bundle.ts +511 -0
- package/src/data/schema/constants.ts +49 -0
- package/src/data/schema/creature.ts +454 -0
- package/src/data/schema/encounter.ts +155 -0
- package/src/data/schema/faction.ts +48 -0
- package/src/data/schema/item.ts +297 -0
- package/src/data/schema/itemEnchant.ts +105 -0
- package/src/data/schema/npc.ts +44 -0
- package/src/data/schema/primitives.ts +295 -0
- package/src/data/schema/profession.ts +226 -0
- package/src/data/schema/quest.ts +154 -0
- package/src/data/schema/spell.ts +1149 -0
- package/src/data/schema/talent.ts +74 -0
- package/src/data/schema/world.ts +124 -0
- package/src/data/schema.ts +19 -0
- package/src/data/skinNodeGapFill.ts +68 -0
- package/src/data/spell-data.json.gz +0 -0
- package/src/data/spell-script-targets.json +1 -0
- package/src/data/tables/ahItemValues.json.gz +0 -0
- package/src/data/tables/alteracValley.json.gz +0 -0
- package/src/data/tables/areatriggerTeleports.json.gz +0 -0
- package/src/data/tables/botNames.json.gz +0 -0
- package/src/data/tables/botPopulation.json.gz +0 -0
- package/src/data/tables/botSpecs.json.gz +0 -0
- package/src/data/tables/classLevelStats.json.gz +0 -0
- package/src/data/tables/combatConditions.json.gz +0 -0
- package/src/data/tables/combatSkillMeta.json.gz +0 -0
- package/src/data/tables/conditions.json.gz +0 -0
- package/src/data/tables/createInfo.json.gz +0 -0
- package/src/data/tables/creatureAggroGroups.json.gz +0 -0
- package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
- package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
- package/src/data/tables/creatureWeapons.json.gz +0 -0
- package/src/data/tables/creatures.json.gz +0 -0
- package/src/data/tables/dbScripts.json.gz +0 -0
- package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
- package/src/data/tables/dungeonCensus.json.gz +0 -0
- package/src/data/tables/dungeonGameObjects.json.gz +0 -0
- package/src/data/tables/dungeonPacks.json.gz +0 -0
- package/src/data/tables/dungeonPlateCover.json.gz +0 -0
- package/src/data/tables/dungeonSpawns.json.gz +0 -0
- package/src/data/tables/dungeonSurvey.json.gz +0 -0
- package/src/data/tables/durabilityCosts.json.gz +0 -0
- package/src/data/tables/durabilityQuality.json.gz +0 -0
- package/src/data/tables/enchantApplicators.json.gz +0 -0
- package/src/data/tables/entranceYards.json.gz +0 -0
- package/src/data/tables/explorationBasexp.json.gz +0 -0
- package/src/data/tables/factionTemplates.json.gz +0 -0
- package/src/data/tables/factions.json.gz +0 -0
- package/src/data/tables/gameEvents.json.gz +0 -0
- package/src/data/tables/gameObjects.json.gz +0 -0
- package/src/data/tables/gossipMenus.json.gz +0 -0
- package/src/data/tables/graveyards.json.gz +0 -0
- package/src/data/tables/instanceMaps.json.gz +0 -0
- package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
- package/src/data/tables/itemEnchants.json.gz +0 -0
- package/src/data/tables/itemRandomProperties.json.gz +0 -0
- package/src/data/tables/itemSets.json.gz +0 -0
- package/src/data/tables/items.json.gz +0 -0
- package/src/data/tables/levelStats.json.gz +0 -0
- package/src/data/tables/locks.json.gz +0 -0
- package/src/data/tables/map-pin-overrides.json.gz +0 -0
- package/src/data/tables/nonCombatTrash.json.gz +0 -0
- package/src/data/tables/npcTexts.json.gz +0 -0
- package/src/data/tables/pageTexts.json.gz +0 -0
- package/src/data/tables/petAbilityTP.json.gz +0 -0
- package/src/data/tables/petGenericSpells.json.gz +0 -0
- package/src/data/tables/petLevelStats.json.gz +0 -0
- package/src/data/tables/playerbot-weightscales.json.gz +0 -0
- package/src/data/tables/pools.json.gz +0 -0
- package/src/data/tables/quests.json.gz +0 -0
- package/src/data/tables/races.json.gz +0 -0
- package/src/data/tables/reputationRanks.json.gz +0 -0
- package/src/data/tables/reputationRates.json.gz +0 -0
- package/src/data/tables/reputationSpillover.json.gz +0 -0
- package/src/data/tables/ridingSpells.json.gz +0 -0
- package/src/data/tables/scriptTexts.json.gz +0 -0
- package/src/data/tables/soundClipVolume.json.gz +0 -0
- package/src/data/tables/spellChain.json.gz +0 -0
- package/src/data/tables/spellTeleports.json.gz +0 -0
- package/src/data/tables/spells.json.gz +0 -0
- package/src/data/tables/talents.json.gz +0 -0
- package/src/data/tables/tavernTriggers.json.gz +0 -0
- package/src/data/tables/taxiNodes.json.gz +0 -0
- package/src/data/tables/taxiRoutes.json.gz +0 -0
- package/src/data/tables/trainers.json.gz +0 -0
- package/src/data/tables/transports.json.gz +0 -0
- package/src/data/tables/travelAnchors.json.gz +0 -0
- package/src/data/tables/travelEdges.json.gz +0 -0
- package/src/data/tables/unitConditions.json.gz +0 -0
- package/src/data/tables/vendors.json.gz +0 -0
- package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
- package/src/data/tables/xp.json.gz +0 -0
- package/src/data/tables/zoneWeather.json.gz +0 -0
- package/src/data/tables/zones.json.gz +0 -0
- package/src/data/world-data.ts +56 -0
- package/src/data/zone-music-sets.json +2751 -0
- package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
- package/src/domain/audioQuality.mjs +145 -0
- package/src/domain/bg/ab.ts +433 -0
- package/src/domain/bg/arenaComps.ts +644 -0
- package/src/domain/bg/arenaLab.ts +695 -0
- package/src/domain/bg/arenaPace.ts +31 -0
- package/src/domain/bg/arenaRating.ts +110 -0
- package/src/domain/bg/av.ts +758 -0
- package/src/domain/bg/avEnemyPush.ts +219 -0
- package/src/domain/bg/avField.ts +283 -0
- package/src/domain/bg/avInstanceNodes.ts +197 -0
- package/src/domain/bg/avInstanceScore.ts +123 -0
- package/src/domain/bg/avQuestItems.ts +55 -0
- package/src/domain/bg/avQuests.ts +210 -0
- package/src/domain/bg/avSession.ts +196 -0
- package/src/domain/bg/bgConsumes.ts +269 -0
- package/src/domain/bg/bgPrebuff.ts +153 -0
- package/src/domain/bg/bgRest.ts +91 -0
- package/src/domain/bg/bgRoster.ts +305 -0
- package/src/domain/bg/bgTier.ts +61 -0
- package/src/domain/bg/bgWorld.ts +862 -0
- package/src/domain/bg/match.ts +215 -0
- package/src/domain/bg/strategies.ts +552 -0
- package/src/domain/bg/types.ts +291 -0
- package/src/domain/bg/wsg.ts +264 -0
- package/src/domain/bots/actionProviderSpec.ts +38 -0
- package/src/domain/bots/autoConsumables.ts +285 -0
- package/src/domain/bots/betweenPullRest.ts +239 -0
- package/src/domain/bots/botGear.ts +248 -0
- package/src/domain/bots/botInventory.ts +486 -0
- package/src/domain/bots/botPet.ts +535 -0
- package/src/domain/bots/botPool.ts +291 -0
- package/src/domain/bots/botProfessions.ts +334 -0
- package/src/domain/bots/companionActionBar.ts +209 -0
- package/src/domain/bots/companionHireCost.ts +236 -0
- package/src/domain/bots/companionMissions.ts +582 -0
- package/src/domain/bots/companionPrep.ts +254 -0
- package/src/domain/bots/companionQuests.ts +270 -0
- package/src/domain/bots/companionRep.ts +75 -0
- package/src/domain/bots/companionRotation.ts +708 -0
- package/src/domain/bots/companionXp.ts +66 -0
- package/src/domain/bots/consumableShare.ts +811 -0
- package/src/domain/bots/dpsMate.ts +1072 -0
- package/src/domain/bots/groupCompReport.ts +132 -0
- package/src/domain/bots/healthstoneSupply.ts +198 -0
- package/src/domain/bots/outfitter.ts +1056 -0
- package/src/domain/bots/paladinPrePull.ts +231 -0
- package/src/domain/bots/partyRole.ts +40 -0
- package/src/domain/bots/playerbotEquipCache.ts +412 -0
- package/src/domain/bots/playerbotItemEligibility.ts +60 -0
- package/src/domain/bots/playerbotStatWeight.ts +853 -0
- package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
- package/src/domain/bots/prePullBuffs.ts +219 -0
- package/src/domain/bots/prePullStealth.ts +82 -0
- package/src/domain/bots/runSupply.ts +251 -0
- package/src/domain/bots/runSupplyPrefs.ts +28 -0
- package/src/domain/bots/sendTradeGoods.ts +394 -0
- package/src/domain/bots/soulShardCap.ts +35 -0
- package/src/domain/bots/squad.ts +842 -0
- package/src/domain/bots/squadRun.ts +81 -0
- package/src/domain/character/actionbar.ts +346 -0
- package/src/domain/character/appearance.ts +165 -0
- package/src/domain/character/buildCombatant.ts +1726 -0
- package/src/domain/character/character.ts +356 -0
- package/src/domain/character/characterName.ts +43 -0
- package/src/domain/character/characterRatings.ts +424 -0
- package/src/domain/character/characterSpells.ts +282 -0
- package/src/domain/character/characterStats.ts +1559 -0
- package/src/domain/character/characterTalents.ts +398 -0
- package/src/domain/character/combatSkills.ts +994 -0
- package/src/domain/character/displayForm.ts +72 -0
- package/src/domain/character/formTalentAuras.ts +171 -0
- package/src/domain/character/forms.ts +499 -0
- package/src/domain/character/races.ts +40 -0
- package/src/domain/character/resurrectionSickness.ts +49 -0
- package/src/domain/character/spellbook.ts +169 -0
- package/src/domain/character/stanceBar.ts +354 -0
- package/src/domain/character/stancePrereq.ts +70 -0
- package/src/domain/character/talentBuilds.ts +63 -0
- package/src/domain/character/talentImport.ts +130 -0
- package/src/domain/character/talentLink.ts +123 -0
- package/src/domain/character/talents.ts +201 -0
- package/src/domain/core/conditionSnapshot.ts +92 -0
- package/src/domain/core/hover.ts +14 -0
- package/src/domain/core/ids.ts +58 -0
- package/src/domain/core/internalNameTags.ts +5 -0
- package/src/domain/core/runtimeDataPatches.ts +357 -0
- package/src/domain/creature/aiTargeting.ts +588 -0
- package/src/domain/creature/combatCondition.ts +157 -0
- package/src/domain/creature/creatureAggro.ts +804 -0
- package/src/domain/creature/creatureAi.ts +206 -0
- package/src/domain/creature/creatureAiConstants.ts +661 -0
- package/src/domain/creature/creatureCastList.ts +1007 -0
- package/src/domain/creature/creatureEventAi.ts +1409 -0
- package/src/domain/creature/creatureGroups.ts +144 -0
- package/src/domain/creature/creatureLinking.ts +333 -0
- package/src/domain/creature/creatureScaling.ts +320 -0
- package/src/domain/creature/creatureTrigger.ts +53 -0
- package/src/domain/creature/creatureWander.ts +74 -0
- package/src/domain/creature/eventAiTexts.ts +145 -0
- package/src/domain/creature/faction.ts +287 -0
- package/src/domain/creature/forcedReaction.ts +48 -0
- package/src/domain/creature/outdoorHuntable.ts +74 -0
- package/src/domain/creature/patrolPacks.ts +210 -0
- package/src/domain/creature/reputation.ts +967 -0
- package/src/domain/creature/unitFlags.ts +74 -0
- package/src/domain/creature/worldBosses.ts +393 -0
- package/src/domain/dungeonMusic.mjs +48 -0
- package/src/domain/economy/auction.ts +282 -0
- package/src/domain/economy/auctionBot.ts +1060 -0
- package/src/domain/economy/honorPrice.ts +100 -0
- package/src/domain/economy/mail.ts +958 -0
- package/src/domain/economy/money.ts +42 -0
- package/src/domain/economy/syntheticClassTrainers.ts +62 -0
- package/src/domain/economy/trading.ts +296 -0
- package/src/domain/economy/vendorSellAll.ts +252 -0
- package/src/domain/economy/vendorStock.ts +146 -0
- package/src/domain/items/ammo.ts +817 -0
- package/src/domain/items/bank.ts +162 -0
- package/src/domain/items/consumableFamily.ts +205 -0
- package/src/domain/items/craftUpgrades.ts +83 -0
- package/src/domain/items/createItem.ts +93 -0
- package/src/domain/items/durability.ts +581 -0
- package/src/domain/items/equipment.ts +441 -0
- package/src/domain/items/equipmentHelper.ts +767 -0
- package/src/domain/items/inventory.ts +561 -0
- package/src/domain/items/itemBonding.ts +93 -0
- package/src/domain/items/itemContainer.ts +245 -0
- package/src/domain/items/itemDisplayName.ts +33 -0
- package/src/domain/items/itemInstance.ts +181 -0
- package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
- package/src/domain/items/itemRandomProps.ts +77 -0
- package/src/domain/items/itemRestrictions.ts +329 -0
- package/src/domain/items/itemTeaches.ts +82 -0
- package/src/domain/items/itemUseCooldown.ts +52 -0
- package/src/domain/items/itemUseTarget.ts +90 -0
- package/src/domain/items/junkCategories.ts +174 -0
- package/src/domain/items/junkFilter.ts +368 -0
- package/src/domain/items/keyring.ts +131 -0
- package/src/domain/items/loot.ts +221 -0
- package/src/domain/items/mounts.ts +190 -0
- package/src/domain/items/onUsePayload.ts +102 -0
- package/src/domain/items/pendingLoot.ts +107 -0
- package/src/domain/items/relic.ts +105 -0
- package/src/domain/items/rocketBoots.ts +36 -0
- package/src/domain/items/sortContainer.ts +139 -0
- package/src/domain/items/spareContainers.ts +71 -0
- package/src/domain/items/spellReagentIndex.ts +131 -0
- package/src/domain/items/staleConsumables.ts +66 -0
- package/src/domain/items/weaponSpender.ts +110 -0
- package/src/domain/listDungeonIds.mjs +28 -0
- package/src/domain/macro/compose.ts +239 -0
- package/src/domain/macro/conditions.ts +260 -0
- package/src/domain/macro/creatureTypes.ts +40 -0
- package/src/domain/macro/describe.ts +169 -0
- package/src/domain/macro/icon.ts +60 -0
- package/src/domain/macro/index.ts +20 -0
- package/src/domain/macro/normalize.ts +112 -0
- package/src/domain/macro/parse.ts +316 -0
- package/src/domain/macro/plan.ts +288 -0
- package/src/domain/macro/rotation.ts +590 -0
- package/src/domain/macro/rotationEnv.ts +173 -0
- package/src/domain/macro/slots.ts +101 -0
- package/src/domain/macro/snapshot.ts +114 -0
- package/src/domain/macro/templates.ts +446 -0
- package/src/domain/macro/types.ts +70 -0
- package/src/domain/macro/units.ts +93 -0
- package/src/domain/macro/weaponTypes.ts +83 -0
- package/src/domain/nav/cityTeleports.ts +10 -0
- package/src/domain/nav/mounting.ts +113 -0
- package/src/domain/nav/nav.ts +43 -0
- package/src/domain/nav/navCollision.ts +606 -0
- package/src/domain/nav/navOutdoors.ts +91 -0
- package/src/domain/nav/navRegistry.ts +179 -0
- package/src/domain/nav/navRoomGraph.ts +302 -0
- package/src/domain/nav/navTypes.ts +43 -0
- package/src/domain/nav/navmesh.ts +1715 -0
- package/src/domain/nav/speed.ts +200 -0
- package/src/domain/nav/storey.ts +10 -0
- package/src/domain/nav/travel.ts +725 -0
- package/src/domain/nav/travelTypes.ts +75 -0
- package/src/domain/pet/pet.ts +1150 -0
- package/src/domain/pet/petActionBar.ts +180 -0
- package/src/domain/pet/petSpellbook.ts +39 -0
- package/src/domain/pet/petStable.ts +81 -0
- package/src/domain/professions/autoDisenchant.ts +236 -0
- package/src/domain/professions/characterEnchants.ts +176 -0
- package/src/domain/professions/craftCooldown.ts +52 -0
- package/src/domain/professions/enchantApply.ts +62 -0
- package/src/domain/professions/enchantTargets.ts +114 -0
- package/src/domain/professions/enchanting.ts +236 -0
- package/src/domain/professions/gatherFilter.ts +149 -0
- package/src/domain/professions/gearEnchant.ts +137 -0
- package/src/domain/professions/heldTools.ts +29 -0
- package/src/domain/professions/learnAllRecipes.ts +146 -0
- package/src/domain/professions/miningHarvest.ts +69 -0
- package/src/domain/professions/partyDisenchant.ts +294 -0
- package/src/domain/professions/partyWork.ts +83 -0
- package/src/domain/professions/pickpocket.ts +172 -0
- package/src/domain/professions/poisons.ts +240 -0
- package/src/domain/professions/professions.ts +677 -0
- package/src/domain/professions/rareNodes.ts +45 -0
- package/src/domain/professions/skinLoot.ts +27 -0
- package/src/domain/professions/vendorReagents.ts +152 -0
- package/src/domain/professions/weaponImbueHand.ts +171 -0
- package/src/domain/questFarmFilter.mjs +42 -0
- package/src/domain/quests/doQuest.ts +1204 -0
- package/src/domain/quests/gossip.ts +308 -0
- package/src/domain/quests/gossipTalk.ts +298 -0
- package/src/domain/quests/interpreter/canComplete.ts +150 -0
- package/src/domain/quests/interpreter/claim.ts +137 -0
- package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
- package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
- package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
- package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
- package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
- package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
- package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
- package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
- package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
- package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
- package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
- package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
- package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
- package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
- package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
- package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
- package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
- package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
- package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
- package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
- package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
- package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
- package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
- package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
- package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
- package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
- package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
- package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
- package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
- package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
- package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
- package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
- package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
- package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
- package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
- package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
- package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
- package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
- package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
- package/src/domain/quests/interpreter/diff.ts +349 -0
- package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
- package/src/domain/quests/interpreter/flags.ts +101 -0
- package/src/domain/quests/interpreter/index.ts +113 -0
- package/src/domain/quests/interpreter/live.ts +178 -0
- package/src/domain/quests/interpreter/types.ts +81 -0
- package/src/domain/quests/interpreter/updaters.ts +412 -0
- package/src/domain/quests/questCorpseUse.ts +155 -0
- package/src/domain/quests/questDialog.ts +43 -0
- package/src/domain/quests/questFight.ts +34 -0
- package/src/domain/quests/questObjectiveLabel.ts +39 -0
- package/src/domain/quests/questRewardChoice.ts +85 -0
- package/src/domain/quests/questScriptCredit.ts +26 -0
- package/src/domain/quests/questScriptItemUse.ts +74 -0
- package/src/domain/quests/questTameRods.ts +79 -0
- package/src/domain/quests/questlog.ts +1545 -0
- package/src/domain/quests/talkDeliver.ts +170 -0
- package/src/domain/raid/globalActionBar.ts +195 -0
- package/src/domain/raid/instanceRoster.ts +194 -0
- package/src/domain/raid/partySummon.ts +198 -0
- package/src/domain/raid/partyVault.ts +320 -0
- package/src/domain/raid/raidBossAbilities.ts +268 -0
- package/src/domain/raid/raidComp.ts +335 -0
- package/src/domain/raid/raidCustomRows.ts +453 -0
- package/src/domain/raid/raidEncounterGear.ts +298 -0
- package/src/domain/raid/raidEncounterTactics.ts +412 -0
- package/src/domain/raid/raidPlan.ts +509 -0
- package/src/domain/raid/raidPlanEdits.ts +98 -0
- package/src/domain/raid/raidPlanPacks.ts +480 -0
- package/src/domain/raid/raidRecovery.ts +183 -0
- package/src/domain/raid/raidRosterTemplate.ts +138 -0
- package/src/domain/rotation/auraSide.ts +68 -0
- package/src/domain/rotation/build.ts +3031 -0
- package/src/domain/rotation/classes/druid.ts +58 -0
- package/src/domain/rotation/classes/hooks.ts +59 -0
- package/src/domain/rotation/classes/hunter.ts +156 -0
- package/src/domain/rotation/classes/index.ts +104 -0
- package/src/domain/rotation/classes/mage.ts +99 -0
- package/src/domain/rotation/classes/paladin.ts +296 -0
- package/src/domain/rotation/classes/priest.ts +94 -0
- package/src/domain/rotation/classes/pullOpener.ts +92 -0
- package/src/domain/rotation/classes/rogue.ts +69 -0
- package/src/domain/rotation/classes/shaman.ts +29 -0
- package/src/domain/rotation/classes/supportSpec.ts +94 -0
- package/src/domain/rotation/classes/warlock.ts +81 -0
- package/src/domain/rotation/classes/warrior.ts +402 -0
- package/src/domain/rotation/classify.ts +1381 -0
- package/src/domain/rotation/condMetricPicker.ts +379 -0
- package/src/domain/rotation/consumables.ts +242 -0
- package/src/domain/rotation/evaluate.ts +1115 -0
- package/src/domain/rotation/finisherLadder.ts +145 -0
- package/src/domain/rotation/invent.ts +938 -0
- package/src/domain/rotation/killOrder.ts +30 -0
- package/src/domain/rotation/openerForm.ts +22 -0
- package/src/domain/rotation/paladinBuffs.ts +568 -0
- package/src/domain/rotation/prebuff.ts +283 -0
- package/src/domain/rotation/raidRowTuning.ts +34 -0
- package/src/domain/rotation/rotation.ts +11 -0
- package/src/domain/rotation/rotationProfiles.ts +180 -0
- package/src/domain/rotation/rotationSuggestions.ts +851 -0
- package/src/domain/rotation/ruleAfterChain.ts +49 -0
- package/src/domain/rotation/spec.ts +70 -0
- package/src/domain/rotation/spellPicker.ts +140 -0
- package/src/domain/rotation/stand.ts +143 -0
- package/src/domain/rotation/types.ts +718 -0
- package/src/domain/run/battlegroundRun.ts +111 -0
- package/src/domain/run/canEnterContext.ts +32 -0
- package/src/domain/run/death.ts +561 -0
- package/src/domain/run/deathRecovery.ts +289 -0
- package/src/domain/run/duel.ts +141 -0
- package/src/domain/run/dungeonRun.ts +344 -0
- package/src/domain/run/floorRest.ts +159 -0
- package/src/domain/run/honor.ts +557 -0
- package/src/domain/run/honorWeek.ts +180 -0
- package/src/domain/run/whenMap.ts +977 -0
- package/src/domain/scriptdev/arathiHighlands.ts +445 -0
- package/src/domain/scriptdev/ashenvale.ts +635 -0
- package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
- package/src/domain/scriptdev/azshara.ts +892 -0
- package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
- package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
- package/src/domain/scriptdev/blackrockSpire.ts +730 -0
- package/src/domain/scriptdev/blackwingLair.ts +521 -0
- package/src/domain/scriptdev/burningSteppes.ts +62 -0
- package/src/domain/scriptdev/classFilter.ts +43 -0
- package/src/domain/scriptdev/darkshore.ts +817 -0
- package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
- package/src/domain/scriptdev/deadmines.ts +331 -0
- package/src/domain/scriptdev/desolace.ts +1239 -0
- package/src/domain/scriptdev/direMaul.ts +859 -0
- package/src/domain/scriptdev/durotar.ts +532 -0
- package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
- package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
- package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
- package/src/domain/scriptdev/felwood.ts +1055 -0
- package/src/domain/scriptdev/feralas.ts +571 -0
- package/src/domain/scriptdev/feralasHelpers.ts +838 -0
- package/src/domain/scriptdev/gnomeregan.ts +466 -0
- package/src/domain/scriptdev/guards.ts +616 -0
- package/src/domain/scriptdev/hinterlands.ts +693 -0
- package/src/domain/scriptdev/host.ts +1134 -0
- package/src/domain/scriptdev/index.ts +123 -0
- package/src/domain/scriptdev/instanceRaids.ts +136 -0
- package/src/domain/scriptdev/itemScripts.ts +37 -0
- package/src/domain/scriptdev/lochModan.ts +283 -0
- package/src/domain/scriptdev/maraudon.ts +232 -0
- package/src/domain/scriptdev/moltenCore.ts +831 -0
- package/src/domain/scriptdev/moonglade.ts +659 -0
- package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
- package/src/domain/scriptdev/naxxramas.ts +577 -0
- package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
- package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
- package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
- package/src/domain/scriptdev/npcProfessions.ts +1025 -0
- package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
- package/src/domain/scriptdev/onyxiasLair.ts +313 -0
- package/src/domain/scriptdev/orgrimmar.ts +147 -0
- package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
- package/src/domain/scriptdev/razorfenDowns.ts +468 -0
- package/src/domain/scriptdev/razorfenKraul.ts +410 -0
- package/src/domain/scriptdev/redridgeMountains.ts +163 -0
- package/src/domain/scriptdev/registry.ts +945 -0
- package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
- package/src/domain/scriptdev/scarletMonastery.ts +713 -0
- package/src/domain/scriptdev/scholomance.ts +682 -0
- package/src/domain/scriptdev/searingGorge.ts +295 -0
- package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
- package/src/domain/scriptdev/silithus.ts +71 -0
- package/src/domain/scriptdev/silverpineForest.ts +662 -0
- package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
- package/src/domain/scriptdev/stormwindCity.ts +1192 -0
- package/src/domain/scriptdev/stranglethornVale.ts +402 -0
- package/src/domain/scriptdev/stratholme.ts +650 -0
- package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
- package/src/domain/scriptdev/sunkenTemple.ts +736 -0
- package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
- package/src/domain/scriptdev/tanaris.ts +391 -0
- package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
- package/src/domain/scriptdev/teldrassil.ts +143 -0
- package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
- package/src/domain/scriptdev/theBarrens.ts +709 -0
- package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
- package/src/domain/scriptdev/thousandNeedles.ts +426 -0
- package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
- package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
- package/src/domain/scriptdev/types.ts +1026 -0
- package/src/domain/scriptdev/uldaman.ts +437 -0
- package/src/domain/scriptdev/ungoroCrater.ts +549 -0
- package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
- package/src/domain/scriptdev/wailingCaverns.ts +700 -0
- package/src/domain/scriptdev/warEffort.ts +371 -0
- package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
- package/src/domain/scriptdev/westfall.ts +767 -0
- package/src/domain/scriptdev/wetlands.ts +660 -0
- package/src/domain/scriptdev/winterspring.ts +482 -0
- package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
- package/src/domain/scriptdev/worldBosses.ts +605 -0
- package/src/domain/scriptdev/zulfarrak.ts +478 -0
- package/src/domain/scriptdev/zulgurub.ts +1152 -0
- package/src/domain/sim/dummySim.ts +408 -0
- package/src/domain/sim/targetDummy.ts +29 -0
- package/src/domain/social/guild.ts +148 -0
- package/src/domain/spells/areaAuraMembership.ts +93 -0
- package/src/domain/spells/breakableStunCc.ts +166 -0
- package/src/domain/spells/cancelAura.ts +80 -0
- package/src/domain/spells/diminishing.ts +167 -0
- package/src/domain/spells/dispel.ts +149 -0
- package/src/domain/spells/dispelMechanic.ts +105 -0
- package/src/domain/spells/equipSpells.ts +247 -0
- package/src/domain/spells/learnOnTargets.ts +260 -0
- package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
- package/src/domain/spells/resurrectSpell.ts +124 -0
- package/src/domain/spells/spellPushback.ts +39 -0
- package/src/domain/spells/spellReflect.ts +43 -0
- package/src/domain/spells/stealth.ts +183 -0
- package/src/domain/spells/totem.ts +394 -0
- package/src/domain/spells/worldCast.ts +187 -0
- package/src/domain/world/areaTriggerLocks.ts +177 -0
- package/src/domain/world/dungeonMusic.ts +108 -0
- package/src/domain/world/gameEvents.ts +119 -0
- package/src/domain/world/gameObjects.ts +1030 -0
- package/src/domain/world/goEventFire.ts +234 -0
- package/src/domain/world/goMoTransport.ts +74 -0
- package/src/domain/world/goTransport.ts +81 -0
- package/src/domain/world/hazards.ts +459 -0
- package/src/domain/world/openLock.ts +398 -0
- package/src/domain/world/pools.ts +470 -0
- package/src/domain/world/restArea.ts +37 -0
- package/src/domain/world/weather.ts +201 -0
- package/src/domain/zoneAmbience.mjs +87 -0
- package/src/domain/zoneMusic.mjs +62 -0
- package/src/domain/zoneMusicQueue.mjs +7 -0
- package/src/engine/combat/activeSeal.ts +39 -0
- package/src/engine/combat/aiTargetResolve.ts +64 -0
- package/src/engine/combat/aoeCast.ts +289 -0
- package/src/engine/combat/applyConsumeAura.ts +74 -0
- package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
- package/src/engine/combat/applyDispelMechanic.ts +30 -0
- package/src/engine/combat/applyHealEffect.ts +301 -0
- package/src/engine/combat/applySchoolAbsorb.ts +114 -0
- package/src/engine/combat/applySpell.ts +3169 -0
- package/src/engine/combat/applySpellLate.ts +2026 -0
- package/src/engine/combat/applySpellLateBag.ts +144 -0
- package/src/engine/combat/areaAura.ts +283 -0
- package/src/engine/combat/attackTable.ts +508 -0
- package/src/engine/combat/battleRez.ts +87 -0
- package/src/engine/combat/castAction.ts +36 -0
- package/src/engine/combat/castTargetGates.ts +75 -0
- package/src/engine/combat/castableKit.ts +68 -0
- package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
- package/src/engine/combat/chainFan.ts +210 -0
- package/src/engine/combat/channel.ts +423 -0
- package/src/engine/combat/chaseCloseness.ts +95 -0
- package/src/engine/combat/cmangosCastGates.ts +129 -0
- package/src/engine/combat/combatFlag.ts +77 -0
- package/src/engine/combat/combatGeometry.ts +1329 -0
- package/src/engine/combat/combustion.ts +68 -0
- package/src/engine/combat/context.ts +730 -0
- package/src/engine/combat/createSession.ts +1165 -0
- package/src/engine/combat/creatureLeash.ts +38 -0
- package/src/engine/combat/crowdControl.ts +1259 -0
- package/src/engine/combat/dispelDuty.ts +54 -0
- package/src/engine/combat/dispelReflect.ts +609 -0
- package/src/engine/combat/displaceFloor.ts +113 -0
- package/src/engine/combat/duelBounds.ts +47 -0
- package/src/engine/combat/equippedItemGate.ts +297 -0
- package/src/engine/combat/evadeLifecycle.ts +63 -0
- package/src/engine/combat/eventAi.ts +2220 -0
- package/src/engine/combat/facing.ts +74 -0
- package/src/engine/combat/fearFlee.ts +137 -0
- package/src/engine/combat/fighterFactory.ts +1144 -0
- package/src/engine/combat/forceDespawnAction.ts +51 -0
- package/src/engine/combat/formulas.ts +807 -0
- package/src/engine/combat/friendlyFan.ts +55 -0
- package/src/engine/combat/groundPoolTick.ts +210 -0
- package/src/engine/combat/hazards.ts +114 -0
- package/src/engine/combat/healTargets.ts +226 -0
- package/src/engine/combat/heartbeatResist.ts +49 -0
- package/src/engine/combat/hostileItemUse.ts +75 -0
- package/src/engine/combat/interruptAuras.ts +66 -0
- package/src/engine/combat/itemRescue.ts +49 -0
- package/src/engine/combat/itemUse.ts +260 -0
- package/src/engine/combat/kitById.ts +23 -0
- package/src/engine/combat/knockBack.ts +201 -0
- package/src/engine/combat/leap.ts +89 -0
- package/src/engine/combat/mitigation.ts +587 -0
- package/src/engine/combat/modTaunt.ts +43 -0
- package/src/engine/combat/motionClaim.ts +268 -0
- package/src/engine/combat/motionGate.ts +150 -0
- package/src/engine/combat/motionGenerator.ts +27 -0
- package/src/engine/combat/navSight.ts +138 -0
- package/src/engine/combat/perfSink.ts +28 -0
- package/src/engine/combat/periodicDue.ts +55 -0
- package/src/engine/combat/petAuras.ts +86 -0
- package/src/engine/combat/pickAction.ts +3449 -0
- package/src/engine/combat/powerForm.ts +735 -0
- package/src/engine/combat/powerPools.ts +49 -0
- package/src/engine/combat/predicates.ts +538 -0
- package/src/engine/combat/procsDamage.ts +1823 -0
- package/src/engine/combat/reactiveGates.ts +135 -0
- package/src/engine/combat/roles.ts +389 -0
- package/src/engine/combat/rotationSubject.ts +78 -0
- package/src/engine/combat/ruleAfter.ts +106 -0
- package/src/engine/combat/seedDisplayAuras.ts +203 -0
- package/src/engine/combat/seedOocEffects.ts +317 -0
- package/src/engine/combat/seedSchoolImmunities.ts +45 -0
- package/src/engine/combat/session-types.ts +458 -0
- package/src/engine/combat/sessionApi.ts +1785 -0
- package/src/engine/combat/sessionCharge.ts +124 -0
- package/src/engine/combat/sessionChase.ts +869 -0
- package/src/engine/combat/sessionDeaths.ts +469 -0
- package/src/engine/combat/sessionFocus.ts +506 -0
- package/src/engine/combat/sessionFollow.ts +167 -0
- package/src/engine/combat/sessionGeometry.ts +188 -0
- package/src/engine/combat/sessionHome.ts +75 -0
- package/src/engine/combat/sessionInject.ts +719 -0
- package/src/engine/combat/sessionMechanicMove.ts +555 -0
- package/src/engine/combat/sessionMotion.ts +1553 -0
- package/src/engine/combat/sessionMotionKit.ts +247 -0
- package/src/engine/combat/sessionMoveIntent.ts +49 -0
- package/src/engine/combat/sessionMoveOrder.ts +200 -0
- package/src/engine/combat/sessionPathTo.ts +657 -0
- package/src/engine/combat/sessionPools.ts +688 -0
- package/src/engine/combat/sessionSteer.ts +144 -0
- package/src/engine/combat/sessionStepBack.ts +151 -0
- package/src/engine/combat/sessionStepWrap.ts +116 -0
- package/src/engine/combat/sessionView.ts +442 -0
- package/src/engine/combat/simEffects.ts +32 -0
- package/src/engine/combat/simFacade.ts +620 -0
- package/src/engine/combat/simPump.ts +264 -0
- package/src/engine/combat/simSnapshot.ts +165 -0
- package/src/engine/combat/simThreadPool.ts +35 -0
- package/src/engine/combat/skeramImages.ts +57 -0
- package/src/engine/combat/slowUpdate.ts +178 -0
- package/src/engine/combat/snapToFloor.ts +42 -0
- package/src/engine/combat/speedAura.ts +29 -0
- package/src/engine/combat/spellReagents.ts +71 -0
- package/src/engine/combat/stealthDetect.ts +93 -0
- package/src/engine/combat/stepBackMotion.ts +171 -0
- package/src/engine/combat/stepSession.ts +3102 -0
- package/src/engine/combat/summonCast.ts +243 -0
- package/src/engine/combat/thaddiusPolarity.ts +97 -0
- package/src/engine/combat/threat.ts +388 -0
- package/src/engine/combat/threatOps.ts +272 -0
- package/src/engine/combat/tickWorkerBody.ts +211 -0
- package/src/engine/combat/totemAuras.ts +122 -0
- package/src/engine/combat/triggerPayload.ts +42 -0
- package/src/engine/combat/triggeredCompanion.ts +63 -0
- package/src/engine/combat/types.ts +1897 -0
- package/src/engine/combat/useObjectTrap.ts +140 -0
- package/src/engine/combat/walkSurface.ts +54 -0
- package/src/engine/combat/weapon.ts +1248 -0
- package/src/engine/combat/worldFrame.ts +43 -0
- package/src/engine/combat.solo-golden.json +2242 -0
- package/src/engine/combat.ts +84 -0
- package/src/engine/core/detMath.ts +289 -0
- package/src/engine/core/events.ts +357 -0
- package/src/engine/core/rng.ts +36 -0
- package/src/engine/game/actionBars.ts +124 -0
- package/src/engine/game/activateObjectFromSpell.ts +320 -0
- package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
- package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
- package/src/engine/game/applyDoorFromDbScript.ts +388 -0
- package/src/engine/game/applyEscortFromDbScript.ts +290 -0
- package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
- package/src/engine/game/applyHoverFromDbScript.ts +110 -0
- package/src/engine/game/applyOocResurrect.ts +71 -0
- package/src/engine/game/applySpellDurability.ts +115 -0
- package/src/engine/game/applyTailFromDbScript.ts +478 -0
- package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
- package/src/engine/game/auctionMail.ts +269 -0
- package/src/engine/game/bagOverflow.ts +130 -0
- package/src/engine/game/bank.ts +110 -0
- package/src/engine/game/barAutofill.ts +26 -0
- package/src/engine/game/battleground.ts +369 -0
- package/src/engine/game/combatEnemySpec.ts +216 -0
- package/src/engine/game/combatObjectTraps.ts +167 -0
- package/src/engine/game/combatSeed.ts +320 -0
- package/src/engine/game/combatSession.ts +3241 -0
- package/src/engine/game/combatSessionClock.ts +62 -0
- package/src/engine/game/companionQuestActions.ts +242 -0
- package/src/engine/game/companionTraining.ts +40 -0
- package/src/engine/game/consumables.ts +624 -0
- package/src/engine/game/context.ts +53 -0
- package/src/engine/game/createHealthstone.ts +45 -0
- package/src/engine/game/deathFlow.ts +127 -0
- package/src/engine/game/devGrant.ts +117 -0
- package/src/engine/game/dynamicObject.ts +365 -0
- package/src/engine/game/enchantItem.ts +177 -0
- package/src/engine/game/equipmentHelper.ts +806 -0
- package/src/engine/game/factionState.ts +108 -0
- package/src/engine/game/garmentsOoc.ts +69 -0
- package/src/engine/game/globalActionBar.ts +179 -0
- package/src/engine/game/goInteractQuestCredit.ts +51 -0
- package/src/engine/game/goMoTransportUse.ts +61 -0
- package/src/engine/game/goTransportUse.ts +60 -0
- package/src/engine/game/healthstoneUpkeep.ts +59 -0
- package/src/engine/game/killSkin.ts +124 -0
- package/src/engine/game/learnFromItem.ts +118 -0
- package/src/engine/game/loadReconcile.ts +551 -0
- package/src/engine/game/loot.ts +294 -0
- package/src/engine/game/macros.ts +125 -0
- package/src/engine/game/mail.ts +293 -0
- package/src/engine/game/meetingStoneQueue.ts +75 -0
- package/src/engine/game/meetingStoneUse.ts +54 -0
- package/src/engine/game/newGameState.ts +363 -0
- package/src/engine/game/oocAuraInterrupt.ts +92 -0
- package/src/engine/game/oocCast.ts +241 -0
- package/src/engine/game/oocCastEffects.ts +803 -0
- package/src/engine/game/oocCastMethods.ts +1077 -0
- package/src/engine/game/openLockFromSpell.ts +174 -0
- package/src/engine/game/outdoorPvp.ts +187 -0
- package/src/engine/game/outfitter.ts +644 -0
- package/src/engine/game/paladinBoard.ts +393 -0
- package/src/engine/game/partyAuras.ts +121 -0
- package/src/engine/game/persistCombatAuras.ts +91 -0
- package/src/engine/game/pets.ts +459 -0
- package/src/engine/game/prePullHealthstones.ts +154 -0
- package/src/engine/game/professions.ts +2227 -0
- package/src/engine/game/pruneStaleRuntime.ts +39 -0
- package/src/engine/game/questFightCredit.ts +36 -0
- package/src/engine/game/questItemOnCorpse.ts +166 -0
- package/src/engine/game/questItemOnCreature.ts +103 -0
- package/src/engine/game/questLog.ts +879 -0
- package/src/engine/game/questSpellComplete.ts +21 -0
- package/src/engine/game/questTurnIn.ts +598 -0
- package/src/engine/game/raidParty.ts +32 -0
- package/src/engine/game/reagentBuyIn.ts +39 -0
- package/src/engine/game/regenRest.ts +186 -0
- package/src/engine/game/rotation.ts +425 -0
- package/src/engine/game/runFullDungeon.ts +611 -0
- package/src/engine/game/runSupply.ts +80 -0
- package/src/engine/game/sanitizeDriftedItems.ts +135 -0
- package/src/engine/game/scriptDevGoUse.ts +397 -0
- package/src/engine/game/scriptDevInnkeeper.ts +150 -0
- package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
- package/src/engine/game/sendEventFromSpell.ts +87 -0
- package/src/engine/game/sortContainers.ts +85 -0
- package/src/engine/game/spellReputation.ts +69 -0
- package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
- package/src/engine/game/squadDungeon.ts +4222 -0
- package/src/engine/game/squadQuestShare.ts +260 -0
- package/src/engine/game/summonObjectSlot.ts +69 -0
- package/src/engine/game/summonObjectWild.ts +73 -0
- package/src/engine/game/summoningRitualUse.ts +141 -0
- package/src/engine/game/talents.ts +356 -0
- package/src/engine/game/tamingRodUse.ts +66 -0
- package/src/engine/game/tempSpawnCreature.ts +136 -0
- package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
- package/src/engine/game/tickTimedQuests.ts +28 -0
- package/src/engine/game/trade.ts +586 -0
- package/src/engine/game/travel.ts +1155 -0
- package/src/engine/game/types.ts +1855 -0
- package/src/engine/game/vendorOffers.ts +244 -0
- package/src/engine/game/weaponImbueItem.ts +281 -0
- package/src/engine/game/worldSession.ts +183 -0
- package/src/engine/game/worldState.ts +166 -0
- package/src/engine/game.ts +968 -0
- package/src/engine/spells/GAP.md +67 -0
- package/src/engine/spells/absorbs.ts +376 -0
- package/src/engine/spells/addTargetTrigger.ts +53 -0
- package/src/engine/spells/auraPerSecondCost.ts +50 -0
- package/src/engine/spells/auraStacking.ts +497 -0
- package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
- package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
- package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
- package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
- package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
- package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
- package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
- package/src/engine/spells/cmangos-special-cases.ts +1570 -0
- package/src/engine/spells/conditions.ts +718 -0
- package/src/engine/spells/effects.ts +203 -0
- package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
- package/src/engine/spells/immunity.ts +942 -0
- package/src/engine/spells/intentEffects.ts +351 -0
- package/src/engine/spells/interpreter/GAPS.md +21 -0
- package/src/engine/spells/interpreter/amount.ts +109 -0
- package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
- package/src/engine/spells/interpreter/diff.ts +246 -0
- package/src/engine/spells/interpreter/duration.ts +90 -0
- package/src/engine/spells/interpreter/form-attrs.json +1 -0
- package/src/engine/spells/interpreter/form-attrs.ts +95 -0
- package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
- package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
- package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
- package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
- package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
- package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
- package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
- package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
- package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
- package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
- package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
- package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
- package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
- package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
- package/src/engine/spells/interpreter/handlers.ts +9 -0
- package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
- package/src/engine/spells/interpreter/index.ts +525 -0
- package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
- package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
- package/src/engine/spells/interpreter/mage-portals.ts +37 -0
- package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
- package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
- package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
- package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
- package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
- package/src/engine/spells/interpreter/opcodes.ts +789 -0
- package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
- package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
- package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
- package/src/engine/spells/interpreter/proc.ts +443 -0
- package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
- package/src/engine/spells/interpreter/registry/index.ts +216 -0
- package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
- package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
- package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
- package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
- package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
- package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
- package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
- package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
- package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
- package/src/engine/spells/interpreter/registry/types.ts +48 -0
- package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
- package/src/engine/spells/interpreter/targeting.ts +90 -0
- package/src/engine/spells/interpreter/types-intent.ts +1501 -0
- package/src/engine/spells/interpreter/types.ts +419 -0
- package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
- package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
- package/src/engine/spells/interrupt.ts +217 -0
- package/src/engine/spells/meleeAttackReset.ts +60 -0
- package/src/engine/spells/oocTriggerSpell.ts +49 -0
- package/src/engine/spells/overrideClassScripts.ts +319 -0
- package/src/engine/spells/parryHaste.ts +20 -0
- package/src/engine/spells/procs.ts +300 -0
- package/src/engine/spells/recovery.ts +203 -0
- package/src/engine/spells/scriptTargetDest.ts +76 -0
- package/src/engine/spells/scriptTargets.ts +85 -0
- package/src/engine/spells/singleTargetAura.ts +82 -0
- package/src/engine/spells/specialCasePayloads.ts +57 -0
- package/src/engine/spells/spellAttributes.ts +249 -0
- package/src/engine/spells/spellBonus.ts +143 -0
- package/src/engine/spells/spellModIntents.ts +419 -0
- package/src/engine/spells/spellMods.ts +283 -0
- package/src/engine/spells/spellRadius.ts +15 -0
- package/src/engine/spells/trapObjects.ts +26 -0
- package/src/json.d.ts +7 -0
- package/src/persistence/memoryRepository.ts +23 -0
- package/src/persistence/saveBackups.ts +162 -0
- package/src/persistence/saveFile.ts +68 -0
- package/src/persistence/saveRepository.ts +11 -0
- package/src/persistence/saveShape.ts +668 -0
- package/src/progression/leveling.ts +89 -0
- package/src/progression/rest.ts +1434 -0
- package/src/progression/training.ts +226 -0
- package/src/progression/xpGain.ts +369 -0
- package/src/quests/quests.ts +1580 -0
- package/src/world/aoePull.ts +198 -0
- package/src/world/areaTableDbc.ts +39 -0
- package/src/world/areaTableMapIdPairs.ts +141 -0
- package/src/world/bakeSlug.ts +43 -0
- package/src/world/continuousDungeon.ts +1250 -0
- package/src/world/dungeonBakeProjection.ts +190 -0
- package/src/world/dungeonMapDensity.ts +342 -0
- package/src/world/dungeonMapProjection.ts +135 -0
- package/src/world/dungeonNav.ts +904 -0
- package/src/world/dungeonNpcSim.ts +147 -0
- package/src/world/dungeonObjectives.ts +234 -0
- package/src/world/dungeonPreset.ts +35 -0
- package/src/world/dungeonRoute.ts +311 -0
- package/src/world/dungeonRouteGeometry.ts +732 -0
- package/src/world/dungeonRouteOrder.ts +1037 -0
- package/src/world/dungeonWingRooms.ts +426 -0
- package/src/world/escort.ts +296 -0
- package/src/world/goPoolRoll.ts +75 -0
- package/src/world/instanceObjects.ts +785 -0
- package/src/world/instances.ts +1572 -0
- package/src/world/meetingStones.ts +56 -0
- package/src/world/navmeshFloors.ts +145 -0
- package/src/world/nearGrid.ts +167 -0
- package/src/world/packBudget.ts +613 -0
- package/src/world/rareRoll.ts +335 -0
- package/src/world/routeAuthoring.ts +132 -0
- package/src/world/routeEdit.ts +209 -0
- package/src/world/world.ts +812 -0
- package/src/world/zoneHazards.ts +47 -0
|
@@ -0,0 +1,718 @@
|
|
|
1
|
+
// PURE: no DOM/RNG/Date. Rotation condition/config types and pure constants.
|
|
2
|
+
|
|
3
|
+
import type { TotemSlot } from '../../data/schema.ts';
|
|
4
|
+
|
|
5
|
+
// ---- Config data model ----------------------------------------------------
|
|
6
|
+
|
|
7
|
+
// `'ally'` is the most-hurt living friendly matching the condition's own {@link AllyFilter} — the
|
|
8
|
+
// same body the row's `{ lowestHp }` aim casts on, so gate and heal read one bar.
|
|
9
|
+
export type CondSubject = 'self' | 'target' | 'pet' | 'ally';
|
|
10
|
+
|
|
11
|
+
// Which friendly `subject: 'ally'` means: every field given must match, empty = the most-hurt one.
|
|
12
|
+
// `unit` is a seat id, the identity `stack_on` and raidPlan.mainTank already name.
|
|
13
|
+
export interface AllyFilter {
|
|
14
|
+
role?: 'tank' | 'healer' | 'damage';
|
|
15
|
+
notRole?: 'tank' | 'healer' | 'damage';
|
|
16
|
+
/** Player class id (SharedDefines.h CLASS_WARRIOR = 1 … CLASS_DRUID = 11). */
|
|
17
|
+
classId?: number;
|
|
18
|
+
unit?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** True when the filter narrows nothing — the plain "most-hurt ally" every stored row means. */
|
|
22
|
+
export function allyFilterIsAny(f: AllyFilter | undefined): boolean {
|
|
23
|
+
return !f || (f.role == null && f.notRole == null && f.classId == null && !f.unit);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type CondMetric =
|
|
27
|
+
| 'alive' // 1 if the subject exists and is not dead, else 0 (works when subject is absent)
|
|
28
|
+
| 'healthPct' // 0..100
|
|
29
|
+
| 'powerPct' // 0..100 (mana/rage/focus/energy, whatever the subject uses)
|
|
30
|
+
// 0..100 of the MANA bar specifically. A shifted druid's powerPct is energy or rage, so every
|
|
31
|
+
// mana gate on a feral read the wrong bar. No mana pool -> null, and the condition is false.
|
|
32
|
+
| 'manaPct'
|
|
33
|
+
| 'level'
|
|
34
|
+
| 'buffPresent' // 1 if `ref` (a spellId) is an active buff on the subject, else 0
|
|
35
|
+
| 'debuffPresent' // 1 if `ref` (a spellId) is an active debuff on the subject, else 0
|
|
36
|
+
| 'itemCount' // count of `ref` (an itemEntry) carried in bags (subject ignored)
|
|
37
|
+
| 'itemEquipped' // 1 if `ref` is on the paperdoll, else 0 (subject ignored)
|
|
38
|
+
| 'petHappiness' // pet only, 0..100
|
|
39
|
+
| 'combatTimeMs' // ms since THIS unit entered combat (0 if OOC)
|
|
40
|
+
| 'inCombat' // 1 if THIS unit is in combat, else 0 (not party-wide)
|
|
41
|
+
| 'comboPoints' // 0..5 combo points the subject currently has (rogue/feral; 0 if none)
|
|
42
|
+
// Ms to 0 health at the rate THIS fight has shown: combatTimeMs * healthPct / (100 - healthPct).
|
|
43
|
+
// Unknown under {@link TIME_TO_DIE_MIN_SAMPLE_MS} of sample or on an untouched subject.
|
|
44
|
+
| 'timeToDieMs'
|
|
45
|
+
| 'enemyCount' // living enemies in the fight (subject ignored; Wave 1B multi-target)
|
|
46
|
+
| 'formId' // active shapeshift form / stance id (0 = humanoid; Wave 1A)
|
|
47
|
+
| 'totemPresent' // 1 if `ref` is an occupied totem slot index (0=fire…3=air), else 0 (Wave 1D)
|
|
48
|
+
/** 1 if hand has TEMP enchant: ref 0=MH, 1=OH, 2=all eligible weapon hands coated (open-hand gate). */
|
|
49
|
+
| 'weaponImbuePresent'
|
|
50
|
+
| 'castingPresent' // 1 while the subject has a cast in flight (interrupt gates), else 0
|
|
51
|
+
| 'castingSchool' // school index of the in-flight cast (0=physical…6=arcane); no cast → condition false
|
|
52
|
+
| 'castingIsHeal' // 1 if the in-flight cast is a heal, 0 if damage/other; no cast → condition false
|
|
53
|
+
// spellId of the in-flight cast, for "kick THIS one". castingPresent is a boolean, so every
|
|
54
|
+
// named-cast row in the six guides was the same row. No cast reads null, so the condition fails.
|
|
55
|
+
| 'castingSpellId'
|
|
56
|
+
// How many landings of ref's diminishing group the subject has taken in the 15 s window: 0 full,
|
|
57
|
+
// 1 half, 2 a quarter, 3 immune. Against a creature a player-only group stays 0 forever.
|
|
58
|
+
| 'drLevel'
|
|
59
|
+
| 'buffStacks' // stack count of buff `ref` on the subject (0 when absent; 1 when unstacked)
|
|
60
|
+
| 'debuffStacks' // stack count of debuff `ref` on the subject (0 when absent; Sunder x5)
|
|
61
|
+
// Ms left on buff `ref`: 0 when absent, Infinity while permanent. One condition says "not on us
|
|
62
|
+
// OR about to fall off", which two ANDed rows cannot — a HoT refresh needs both halves.
|
|
63
|
+
| 'buffRemainingMs'
|
|
64
|
+
/** Ms left on debuff `ref`, 0 when absent, Infinity while permanent. The DoT-clip half. */
|
|
65
|
+
| 'debuffRemainingMs'
|
|
66
|
+
// 1 when the subject can pay for spell `ref` right now, else 0. Cat/Bear Form cost 55% of BASE
|
|
67
|
+
// mana (spells.json costPct 55), which no percentage of the CURRENT bar stands in for.
|
|
68
|
+
| 'canAfford'
|
|
69
|
+
| 'dodgedRecently' // 1 within 5s of the subject dodging a melee swing (Overpower gate), else 0
|
|
70
|
+
// 1 when the subject's creatureType bit is set in condition `ref`, the SpellEntry mask. Gates
|
|
71
|
+
// Exorcism, Holy Wrath and Turn Evil on Undead or Demon. An absent creatureType reads 0.
|
|
72
|
+
| 'creatureTypeMask'
|
|
73
|
+
/** 1 within 5s of the subject dodge/parry/block (Revenge react gate), else 0. */
|
|
74
|
+
| 'defenseReactRecently'
|
|
75
|
+
/** 1 within 5s of a HUNTER's own parry (Counterattack gate), else 0. */
|
|
76
|
+
| 'hunterParryRecently'
|
|
77
|
+
// 1 while the subject is in the melee band of the ACTING unit (≤ reach + park slack). self = you are in
|
|
78
|
+
// the pile (any hostile). target = THIS enemy is on you. Absent → 0.
|
|
79
|
+
| 'inMelee'
|
|
80
|
+
// 1 when the subject is under an active charm or possess side-switch, 0 when free or absent.
|
|
81
|
+
// Distinct from hard CC: a charmed unit still acts, against its former friends.
|
|
82
|
+
| 'charmed'
|
|
83
|
+
// ---- BG / PvP vocabulary (W10) ------------------------------------------------------------
|
|
84
|
+
// Each is a pure read off a snapshot the BG layer fills. 1 while the subject carries a BG flag.
|
|
85
|
+
| 'hasFlag'
|
|
86
|
+
/** 1 if any living FRIENDLY (incl. self) carries a flag. Subject ignored. */
|
|
87
|
+
| 'allyHasFlag'
|
|
88
|
+
/** 1 if any living enemy carries a flag. Subject ignored. */
|
|
89
|
+
| 'enemyHasFlag'
|
|
90
|
+
/** 1 if the subject is the enemy flag carrier — the focus-fire target. */
|
|
91
|
+
| 'isFlagCarrier'
|
|
92
|
+
/** 1 if the subject's group role is healer. Kill the healer first. */
|
|
93
|
+
| 'isHealer'
|
|
94
|
+
/** 1 if the subject is a caster (interrupt / LoS / gap-close gates). */
|
|
95
|
+
| 'isCaster'
|
|
96
|
+
/** 1 if the subject's classId is CLASS_HUNTER (3). Jeklik Charge bait. */
|
|
97
|
+
| 'isHunter'
|
|
98
|
+
// The subject's player class id (SharedDefines.h CLASS_*: 1 warrior … 11 druid), 0 for a creature.
|
|
99
|
+
// The "vs who" gate: which poison, which pet, which totem, which form. isCaster/isHealer answer
|
|
100
|
+
// the archetype; only this separates a warlock from a mage.
|
|
101
|
+
| 'classId'
|
|
102
|
+
// Living enemies within `ref` yards of an anchor, default 10. For self it is planar yards from the
|
|
103
|
+
// acting unit, a PBAoE or cleave; for target it is from the focus, a ground rain's drop point.
|
|
104
|
+
| 'enemiesWithinYd'
|
|
105
|
+
/** Living friendlies within `ref` yards of the acting unit (ref default 10). Subject ignored. */
|
|
106
|
+
| 'alliesWithinYd'
|
|
107
|
+
/** Living FRIENDLY healers within `ref` yards (ref default 30). Gates disengage. */
|
|
108
|
+
| 'healersWithinYd'
|
|
109
|
+
/** Living ENEMY healers within `ref` yards (ref default 30). Gates focus-fire. */
|
|
110
|
+
| 'enemyHealersWithinYd'
|
|
111
|
+
/** 1 while the subject is rooted (MECHANIC_ROOT). Gates the trinket / FAP row. */
|
|
112
|
+
| 'rooted'
|
|
113
|
+
/** 1 while the subject is feared (MECHANIC_FEAR). */
|
|
114
|
+
| 'feared'
|
|
115
|
+
/** 1 while the subject is stunned (MECHANIC_STUN). */
|
|
116
|
+
| 'stunned'
|
|
117
|
+
/** 1 while the subject is snared (MECHANIC_SNARE — a hostile speed aura). */
|
|
118
|
+
| 'snared'
|
|
119
|
+
/** 1 while the subject is silenced (UNIT_FLAG_SILENCED). Cite: Spell.cpp:6049-6050. */
|
|
120
|
+
| 'silenced'
|
|
121
|
+
/** 1 while the subject is under ANY of rooted/feared/stunned/snared. The one-row CC gate. */
|
|
122
|
+
| 'controlled'
|
|
123
|
+
// 1 while a living enemy has a cast in flight AND its threat victim is a friendly other than the
|
|
124
|
+
// acting unit. Reads 0 solo and 0 when the enemy swings at us, so no PvE decision moves.
|
|
125
|
+
| 'enemyCastingOnAlly'
|
|
126
|
+
// 1 while a living enemy is casting at the acting unit. Cite: Unit.cpp:6894-6916 SelectMagnetTarget.
|
|
127
|
+
| 'enemyCastingOnSelf'
|
|
128
|
+
/** 1 if the acting unit's objective (flag / node) is contested right now. Subject ignored. */
|
|
129
|
+
| 'objectiveContested'
|
|
130
|
+
/** 1 if the acting unit's nearest objective is owned by its own team. Subject ignored. */
|
|
131
|
+
| 'objectiveOwnedByUs'
|
|
132
|
+
/** Yards to the acting unit's current objective. Absent → condition is false. */
|
|
133
|
+
| 'objectiveDistanceYd'
|
|
134
|
+
// ---- Group metrics (S1, GROUPING-PLAN) — subject ignored, they describe the acting unit's group view.
|
|
135
|
+
| 'allyLowestHpPct' // lowest health % among living friendlies incl. self (healer triage gate); solo = own health %
|
|
136
|
+
// 1 if the lowest-HP living friendly — the unit the engine heals for party triage — has buff
|
|
137
|
+
// `ref`. Solo means self buffs. Gates pure HoTs so Renew is not recast every GCD into OOM.
|
|
138
|
+
| 'allyLowestBuffPresent'
|
|
139
|
+
// Count of living friendlies (incl. self) with healthPct < `ref` (ref defaults to 75 when omitted/0).
|
|
140
|
+
// Gate multi-heals: e.g. `alliesBelowHpCount >= 2` + ref 80 → two under 80%.
|
|
141
|
+
| 'alliesBelowHpCount'
|
|
142
|
+
// Living friendlies within `ref` yards, default 30, that are also under the triage band. Missing
|
|
143
|
+
// geometry treats everyone as in range, so a headless run still gets Chain Heal when two are hurt.
|
|
144
|
+
| 'nearbyAlliesBelowHpCount'
|
|
145
|
+
// Power % of the party's HEALER seat, the lowest when there are several and 0 for a dead one. The
|
|
146
|
+
// off-heal gate: a hybrid heals when the healer is dead or dry. Solo is absent, so it never fires.
|
|
147
|
+
| 'healerPowerPct'
|
|
148
|
+
// Party SEATS on the acting unit's side, the unit itself included: 1 solo, 5 a full five-man. Seats,
|
|
149
|
+
// not living bodies, so a wipe in progress never reads as solo. Absent -> 1. The healer damage gate.
|
|
150
|
+
| 'partySeats'
|
|
151
|
+
| 'hasAggro' // 1 if ANY living enemy's threat victim is the acting unit (DPS throttle), else 0
|
|
152
|
+
// 1 if ANY living enemy's GetVictim / threat victim is a living ally OTHER than the acting unit.
|
|
153
|
+
// Arena peel Blind: the trainer on the healer, not self. Cite: PlayerbotRogueAI.cpp:208-219.
|
|
154
|
+
| 'allyHasAggro'
|
|
155
|
+
// 1 if the unit the current target is attacking — the tank — has debuff `ref`. The tank-swap gate:
|
|
156
|
+
// the off-tank taunts when the main tank has Shadow of Ebonroc or Mortal Wound.
|
|
157
|
+
| 'aggroHolderDebuffPresent'
|
|
158
|
+
// Stacks of debuff `ref` on the unit the current target is attacking, 0 when absent. The stacking
|
|
159
|
+
// tank swap: the off-tank taunts at N, not at the first application.
|
|
160
|
+
| 'aggroHolderDebuffStacks'
|
|
161
|
+
// 1 if any living friendly, including self, holds aura `ref`. The Raid tab's "who has it: anyone".
|
|
162
|
+
// Subject ignored, and an absent snapshot reads 0.
|
|
163
|
+
| 'allyAuraPresent'
|
|
164
|
+
// Max stacks of aura `ref` on any living friendly (0 absent, 1 present-unstacked). The stacking half of
|
|
165
|
+
// allyAuraPresent, same pair as aggroHolderDebuffPresent/Stacks.
|
|
166
|
+
| 'allyAuraStacks'
|
|
167
|
+
| 'targetAttackingMe' // 1 if the CURRENT TARGET's threat victim is the acting unit (tank taunt gate), else 0
|
|
168
|
+
// Living hostiles that are currently charmed, typically a possessed ally. A rotation may burn, CC
|
|
169
|
+
// the body or ignore it. A player's own Mind Control does not raise this.
|
|
170
|
+
| 'charmedHostileCount'
|
|
171
|
+
// Living melee friendlies in the party: non-healer units currently in melee attack mode. Gates
|
|
172
|
+
// group buffs that only pay off with melee beneficiaries, such as Windfury Totem.
|
|
173
|
+
| 'meleeAllyCount'
|
|
174
|
+
// Dead friendlies in the party — corpses eligible for a resurrection. Subject ignored, and absent
|
|
175
|
+
// or solo reads 0 so a rez keep-up never thrash-casts for 75–90% base mana with nothing dead.
|
|
176
|
+
| 'deadAllyCount'
|
|
177
|
+
// S4C companion knobs (COMBAT-INTERACTION-V2): subject ignored.
|
|
178
|
+
// aoeMode: 0=auto, 1=aoe (prefer multi when enemyCount≥2), 2=single (suppress multi). Absent → 0.
|
|
179
|
+
| 'aoeMode'
|
|
180
|
+
// offHealAllowed: 1 when the companion's off-heal knob is on (hybrid DPS emergency heal), else 0. Absent → 0.
|
|
181
|
+
| 'offHealAllowed'
|
|
182
|
+
// 1 if a dispellable aura of category `ref` is present. Subject self means a debuff on any living
|
|
183
|
+
// friendly; subject target means a buff on the enemy. An absent or OOC snapshot reads 0.
|
|
184
|
+
| 'dispellablePresent'
|
|
185
|
+
// Planar yards to the nearest live HAZARD edge, 0 while inside. A hazard is a lingering pool OR a
|
|
186
|
+
// hostile whose kit carries a ground-shaped spell. Same registry the avoid move reads.
|
|
187
|
+
| 'hazardProximityYd'
|
|
188
|
+
// Planar yards from the acting unit to the current target. Absent / no geometry → false. Gate keep_range
|
|
189
|
+
// so the row stops once the caster is outside the disc.
|
|
190
|
+
| 'targetDistanceYd'
|
|
191
|
+
// Planar yards to the nearest living hostile with creature entry `ref`. Jeklik's Sonic Burst keys
|
|
192
|
+
// on 14517, not the current focus, so a kill order onto a bat cannot walk the caster back in.
|
|
193
|
+
| 'creatureDistanceYd'
|
|
194
|
+
| 'allyWithoutAuraNearYd'
|
|
195
|
+
// ---- Raid plan (E6) — subject ignored; the acting unit's own assignment ----
|
|
196
|
+
// Filled from raidPlan.ts in the BgRole shape; absent reads 0. 1 if the unit is the main tank.
|
|
197
|
+
| 'isMainTank'
|
|
198
|
+
/** 1 if the acting unit is an off-tank in the plan. */
|
|
199
|
+
| 'isOffTank'
|
|
200
|
+
// Raid job code: 0=dps, 1=healer, 2=off-tank, 3=main-tank (`RAID_JOB_CODE`). Gate OT swap rows / MT-only
|
|
201
|
+
// taunts without a second brain.
|
|
202
|
+
| 'myJob'
|
|
203
|
+
/** Camp code: 0=unassigned, 1=a, 2=b, … (`raidCampCode`). */
|
|
204
|
+
| 'myCamp'
|
|
205
|
+
// Subgroup this healer is assigned to heal. Non-healers / unassigned → condition false. Compare with `==`
|
|
206
|
+
// to a subgroup index (0..7 on a 40-man).
|
|
207
|
+
| 'assignedHealSubgroup'
|
|
208
|
+
// 1 while the acting unit stands inside the CURRENT TARGET's frontal arc, the default 60-degree
|
|
209
|
+
// cone. It goes false the moment you are behind, so a get-out row stops eating the GCD.
|
|
210
|
+
| 'inTargetCone'
|
|
211
|
+
// soul shards are real items (SOUL_SHARD_ITEM = 6265). Use the existing 'itemCount' metric with that ref.
|
|
212
|
+
export type CondOp = '<' | '<=' | '>' | '>=' | '==' | '!=';
|
|
213
|
+
|
|
214
|
+
/** One guard on a rule. All conditions on a rule are ANDed. `ref` is a DB id (spell/item), never a name. */
|
|
215
|
+
export interface Condition {
|
|
216
|
+
subject: CondSubject;
|
|
217
|
+
metric: CondMetric;
|
|
218
|
+
op: CondOp;
|
|
219
|
+
value: number;
|
|
220
|
+
ref?: number;
|
|
221
|
+
/** Which friendly `subject: 'ally'` means. Ignored on every other subject. */
|
|
222
|
+
ally?: AllyFilter;
|
|
223
|
+
// How this condition joins the one above it. Absent = AND (every stored rotation ever written).
|
|
224
|
+
// `'or'` STARTS A NEW GROUP, so the list reads as OR-of-AND runs: `A and B or C` is
|
|
225
|
+
// `(A and B) or (C)`. Ignored on the first condition. See {@link conditionsPass}.
|
|
226
|
+
join?: CondJoin;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/** Join between two conditions in a rule's list. Absent reads `'and'`. */
|
|
230
|
+
export type CondJoin = 'and' | 'or';
|
|
231
|
+
|
|
232
|
+
// Who an item rule should apply to when it fires. Omitted / `'self'` = the acting player (backward
|
|
233
|
+
// compatible with stored rotations).
|
|
234
|
+
export type ItemRuleTarget = 'self' | 'lowest_ally' | 'pet';
|
|
235
|
+
|
|
236
|
+
/** Which weapon hand an imbue item (sharpening stone / oil / poison) coats. */
|
|
237
|
+
export type ItemRuleHand = 'mainhand' | 'offhand';
|
|
238
|
+
|
|
239
|
+
// Which enemy a spell rule fires at: `focus` is the current target, `other` a living hostile that is
|
|
240
|
+
// neither the focus nor already controlled, and the object forms name an entry, role or kill order.
|
|
241
|
+
export type RuleSpellTarget =
|
|
242
|
+
| 'focus'
|
|
243
|
+
| 'other'
|
|
244
|
+
| { creatureEntry: number }
|
|
245
|
+
| { role: 'tank' | 'healer' | 'damage' }
|
|
246
|
+
| { priority: readonly number[] }
|
|
247
|
+
// The nearest living friendly OTHER than the caster who does not hold aura `allyMissingAura`. A
|
|
248
|
+
// single-target buff otherwise routes to the caster, so every companion rebuffed only itself.
|
|
249
|
+
// `among` narrows the pool the same way `{ lowestHp }` does: the PallyPower board hands out one
|
|
250
|
+
// family per target CLASS, and a class-blind row blessed whoever it reached instead.
|
|
251
|
+
| { allyMissingAura: number; among?: AllyFilter }
|
|
252
|
+
// The lowest-HP living friendly (heal triage), stamped at evaluate when the row gates on
|
|
253
|
+
// allyLowestHpPct / allyLowestBuffPresent / an `ally` subject. `among` is that gate's filter.
|
|
254
|
+
| { lowestHp: true; among?: AllyFilter };
|
|
255
|
+
|
|
256
|
+
// Mechanic move vocabulary (PLAN §7.5 / AUTOPILOT P3). Authored in the rotation editor — no second hidden
|
|
257
|
+
// brain. Yards come from the caller (baked explosion radius, formation reach).
|
|
258
|
+
export type RuleMove =
|
|
259
|
+
| { kind: 'spread'; minYd: number }
|
|
260
|
+
| { kind: 'flee_raid'; yd: number }
|
|
261
|
+
| { kind: 'stack_on'; role: 'tank' | 'healer' | 'damage' }
|
|
262
|
+
| { kind: 'stack_on'; unit: string }
|
|
263
|
+
// The one move whose distance scales with the mover's CURRENT range, so a ranged raider 30 yd out
|
|
264
|
+
// walks about 60 and the run-out yields first. Every other move here is bounded by a radius.
|
|
265
|
+
| { kind: 'behind_target' }
|
|
266
|
+
// Perpendicular to what the target FACES, at our own current radius. "Behind" only clears a front
|
|
267
|
+
// cone, and a boss with a rear cone as well leaves the flank as the only clear ground.
|
|
268
|
+
| { kind: 'flank_target' }
|
|
269
|
+
| { kind: 'move_to'; x: number; y: number; z?: number }
|
|
270
|
+
| { kind: 'avoid_zone'; id: string }
|
|
271
|
+
// Walk away from the current focus until the gap exceeds minYd. A 20 yd radius hits at <=, so
|
|
272
|
+
// 20.5 is the first safe yard. Melee never pick this row.
|
|
273
|
+
| { kind: 'keep_range'; minYd: number; entry?: number }
|
|
274
|
+
// Two camps keyed on who holds `aura`: back off every ally who does NOT hold it until they are
|
|
275
|
+
// awayYd clear, then close on the ones who do. The charge's own payload radius is the number.
|
|
276
|
+
| { kind: 'split_by_aura'; aura: number; awayYd: number };
|
|
277
|
+
|
|
278
|
+
export type RuleAction =
|
|
279
|
+
| { kind: 'spell'; spellId: number; target?: RuleSpellTarget; after?: RuleAfter }
|
|
280
|
+
// `family` makes the row a RANK LADDER instead of one entry, resolved to the best rank in the bags
|
|
281
|
+
// at use time. `itemEntry` is the display rung, and a family row carries no itemCount gate.
|
|
282
|
+
| {
|
|
283
|
+
kind: 'item'; itemEntry: number; family?: string; target?: ItemRuleTarget;
|
|
284
|
+
hand?: ItemRuleHand; after?: RuleAfter;
|
|
285
|
+
}
|
|
286
|
+
// One of the player's macros, COMPILED to spell and item rules where the rotation is handed to
|
|
287
|
+
// combat. The evaluator never sees this variant, so an uncompiled macro rule cannot fire.
|
|
288
|
+
| { kind: 'macro'; macroId: string }
|
|
289
|
+
// Walk for a mechanic — a bomb run-out, a spread, a stack, a pool to avoid. Executed at the TOP of
|
|
290
|
+
// advanceGapClose so engage and leash cannot drag the runner back into the raid.
|
|
291
|
+
| { kind: 'move'; move: RuleMove }
|
|
292
|
+
// Stop casting damage this tick. `school` is 'all', one School, or a set. `entries` scopes it to
|
|
293
|
+
// those bodies, so a both-up phase can halt on the invulnerable one only. Absent means every body.
|
|
294
|
+
| { kind: 'halt_dps'; school?: HaltDpsSchool; entries?: readonly number[] }
|
|
295
|
+
// Never auto-remove this aura. A filter like halt_dps; pickAction skips it in dispellableAurasOn. Cite:
|
|
296
|
+
// raidCustomRows.ts response `keep`.
|
|
297
|
+
| { kind: 'keep_aura'; spellId: number }
|
|
298
|
+
// Raid-wide kill order: DPS focus the first living entry in `entries`. A filter like halt_dps, not
|
|
299
|
+
// a GCD winner. A NEGATIVE entry means "any living hostile that is not this one".
|
|
300
|
+
| { kind: 'kill_order'; entries: readonly number[] }
|
|
301
|
+
// Click a GameObject by entry, usable while it is in the session's bag. `goEntries` is the SET one
|
|
302
|
+
// row may press, resolved per tick to whichever is usable — Thermaplugg lights one of six.
|
|
303
|
+
| { kind: 'use_object'; goEntry: number; goEntries?: readonly number[] };
|
|
304
|
+
|
|
305
|
+
/** Armed halt: every damaging school, one school, or a set (Chromaggus four-plus-holy). */
|
|
306
|
+
export type HaltDpsSchool = 'all' | string | readonly string[];
|
|
307
|
+
|
|
308
|
+
// One "then cast" step. `conditions` gate THIS step only, read as the OR-of-AND runs a rule's list is
|
|
309
|
+
// ({@link conditionsPass}); a step whose gate is false is SKIPPED, so the chain moves on to the next.
|
|
310
|
+
export interface RuleAfterStep {
|
|
311
|
+
spellId: number;
|
|
312
|
+
conditions?: Condition[];
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// After this rule's cast lands: step back N yards from the focus, and/or walk a chain of follow-up
|
|
316
|
+
// casts, one per GCD. Authored on the rule — the auto-battler, not a side brain. Read through
|
|
317
|
+
// `ruleAfterChain`, never field by field: `spellId` is the pre-chain single follow-up and folds into
|
|
318
|
+
// step 1. 0 / omitted = off.
|
|
319
|
+
export interface RuleAfter {
|
|
320
|
+
stepBackYd?: number;
|
|
321
|
+
/** Legacy single follow-up, kept so every stored rotation still runs. */
|
|
322
|
+
spellId?: number;
|
|
323
|
+
/** The chain, in cast order. Capped at RULE_AFTER_STEPS_MAX. */
|
|
324
|
+
steps?: RuleAfterStep[];
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
// Before this rule's action: spend one GCD on `spellId` first, then the action itself on the next.
|
|
328
|
+
// Skipped when the prep spell is unusable or its aura / form is already up, so a satisfied prep
|
|
329
|
+
// never eats the GCD. Authored on the rule, like `after`.
|
|
330
|
+
export interface RuleBefore {
|
|
331
|
+
spellId: number;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
export interface RotationRule {
|
|
335
|
+
id: string;
|
|
336
|
+
action: RuleAction;
|
|
337
|
+
/** ANDed by default; a condition carrying `join: 'or'` starts a new OR group ({@link conditionsPass}). */
|
|
338
|
+
conditions: Condition[];
|
|
339
|
+
enabled: boolean;
|
|
340
|
+
/** After-cast: step back and/or queue a follow-up spell. */
|
|
341
|
+
after?: RuleAfter;
|
|
342
|
+
/** Pre-cast: fire this spell on the GCD before the action. */
|
|
343
|
+
before?: RuleBefore;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// `prebuff` is the only BUTTON-DRIVEN phase: nothing in the automatic loop reads it. The in-dungeon
|
|
347
|
+
// order walks it across the party at real mana cost. `buffs` stays the automatic keep-up pass.
|
|
348
|
+
export type RotationPhase = 'prebuff' | 'buffs' | 'pull' | 'combat' | 'recovery';
|
|
349
|
+
export const ROTATION_PHASES: readonly RotationPhase[] = ['prebuff', 'buffs', 'pull', 'combat', 'recovery'];
|
|
350
|
+
// Phases a stored rotation MUST have to be readable. `prebuff` is deliberately absent: adding it
|
|
351
|
+
// would fail validation on every save ever written and silently wipe hand-edited rotations.
|
|
352
|
+
export const REQUIRED_ROTATION_PHASES: readonly RotationPhase[] = ['buffs', 'pull', 'combat', 'recovery'];
|
|
353
|
+
|
|
354
|
+
// Signature an auto-generated default was built for, present only on generated rotations. An
|
|
355
|
+
// untouched default rebuilds when it drifts. A legacy save has none, so it refreshes once.
|
|
356
|
+
export interface RotationAutoSig {
|
|
357
|
+
/** Primary talent tree / spec override the bands were picked for. */
|
|
358
|
+
spec: string;
|
|
359
|
+
/** Character level (bands + reqLevel gating change with it). */
|
|
360
|
+
level: number;
|
|
361
|
+
/** Count of known spells (rises when a new ability like Bear Form is trained). */
|
|
362
|
+
spells: number;
|
|
363
|
+
// Companion squad role the default was built for. Absent on player rotations and on older
|
|
364
|
+
// companion saves. When the live role drifts, the default rebuilds; custom edits never do.
|
|
365
|
+
role?: string;
|
|
366
|
+
// The ROTATION_PACK_REV this default was generated at; absent reads 0 and refreshes once. The
|
|
367
|
+
// other fields all describe the CHARACTER, so a pack change was invisible to them.
|
|
368
|
+
packRev?: number;
|
|
369
|
+
// `'pvp'` when this list was built off a `"mode": "pvp"` band (duel / BG / arena). Absent = the PvE
|
|
370
|
+
// ladder. Carried so a stored PvE list is drift the moment a pvp one is wanted.
|
|
371
|
+
mode?: 'pvp';
|
|
372
|
+
/** The pvp band VARIANT this list was built off (rotationSuggestions selectBand). */
|
|
373
|
+
variant?: string;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
// Which rotation slot a list fills. A tank / healer keeps its role list as `primary` and an optional second
|
|
377
|
+
// `dps` list built on the class DPS band; a DPS spec only ever has `primary`.
|
|
378
|
+
export type RotationProfileId = 'primary' | 'dps';
|
|
379
|
+
|
|
380
|
+
export interface Rotation {
|
|
381
|
+
version: 1;
|
|
382
|
+
cls: number; // the class this rotation was generated for (so we can regenerate on mismatch)
|
|
383
|
+
phases: Record<RotationPhase, RotationRule[]>;
|
|
384
|
+
/** Slot this list fills. Absent = 'primary' (every save written before the DPS profile). */
|
|
385
|
+
profile?: RotationProfileId;
|
|
386
|
+
/** Optional per-creature-entry combat overrides (replaces the base combat list for that mob). */
|
|
387
|
+
overrides?: Record<number, RotationRule[]>;
|
|
388
|
+
/** Signature this default was generated for (untouched auto rotations only). */
|
|
389
|
+
autoSig?: RotationAutoSig;
|
|
390
|
+
/** True once the player edits it in the visual editor — suppresses silent auto-refresh. */
|
|
391
|
+
custom?: boolean;
|
|
392
|
+
// Yards to hold from the focus in auto-combat. 0 / omitted = derive (ranged 20–30, melee 5). Set 5 for a
|
|
393
|
+
// melee Arcane Explosion mage; 25 to park a caster.
|
|
394
|
+
standYards?: number;
|
|
395
|
+
// COMPOSED ONLY, never saved: the Raid tab's two knobs, carried to the per-focus prepend inside
|
|
396
|
+
// withEncounterRows. Reading a save back strips both off.
|
|
397
|
+
raidRowsOff?: readonly string[];
|
|
398
|
+
raidRowYd?: Readonly<Record<string, number>>;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// ---- The snapshot the evaluator reasons over ------------------------------
|
|
402
|
+
// Plain data assembled by the caller from the live session and character, which keeps it pure.
|
|
403
|
+
|
|
404
|
+
export interface SubjectState {
|
|
405
|
+
alive: boolean;
|
|
406
|
+
healthPct: number; // 0..100
|
|
407
|
+
powerPct: number; // 0..100
|
|
408
|
+
// 0..100 of the parallel MANA bar (CombatantView.mana/maxMana), for a unit whose ACTIVE power is
|
|
409
|
+
// not mana — a shifted druid. Absent when there is no mana pool, and `manaPct` then reads null.
|
|
410
|
+
manaPct?: number;
|
|
411
|
+
level: number;
|
|
412
|
+
buffs: ReadonlySet<number>; // active buff spellIds on this subject
|
|
413
|
+
debuffs: ReadonlySet<number>; // active debuff spellIds on this subject
|
|
414
|
+
happiness?: number; // pet only (0..100)
|
|
415
|
+
comboPoints?: number; // 0..5 (player only; absent => 0)
|
|
416
|
+
// Diminishing step per group, indexed by DIMINISHING_GROUP_ORDER: 0 is full duration and 3 is
|
|
417
|
+
// immune. Absent or short reads 0, which is what an untouched group and an expired window mean.
|
|
418
|
+
drSteps?: readonly number[];
|
|
419
|
+
// Active shapeshift form or warrior stance id; 0 or absent is humanoid. Prefer this over
|
|
420
|
+
// buffPresent for form enter and in-form gates.
|
|
421
|
+
formId?: number;
|
|
422
|
+
// The subject's in-flight cast, for interrupt gates: `school` is a SpellSchools index with -1
|
|
423
|
+
// unknown, and `isHeal` says whether it is a heal. Null or absent means not casting.
|
|
424
|
+
casting?: { school: number; isHeal: boolean; spellId?: number } | null;
|
|
425
|
+
// Stack counts for stacked auras (spellId → stacks ≥ 2, e.g. Sunder Armor x5). A spellId present in
|
|
426
|
+
// buffs/debuffs but absent here counts as 1 stack.
|
|
427
|
+
buffStacks?: ReadonlyMap<number, number>;
|
|
428
|
+
debuffStacks?: ReadonlyMap<number, number>;
|
|
429
|
+
// Ms left per aura id; a missing entry is permanent (Infinity). Built in the same walk the id set
|
|
430
|
+
// is, and only once an aura carries a finite remainingMs, so a fight of permanents allocates none.
|
|
431
|
+
buffRemainingMs?: ReadonlyMap<number, number>;
|
|
432
|
+
debuffRemainingMs?: ReadonlyMap<number, number>;
|
|
433
|
+
/** Spell ids this subject can pay for right now. Absent → `canAfford` reads null (false). */
|
|
434
|
+
affordableSpellIds?: ReadonlySet<number>;
|
|
435
|
+
/** True within 5s of this subject DODGING a melee swing (Overpower-style gates). */
|
|
436
|
+
dodgedRecently?: boolean;
|
|
437
|
+
// CMaNGOS CreatureType id (1 Beast … 6 Undead … 7 Humanoid). Used by `creatureTypeMask` gates (Exorcism /
|
|
438
|
+
// Holy Wrath). Absent → mask match fails.
|
|
439
|
+
creatureType?: number;
|
|
440
|
+
// True within 5s of this subject dodging, parrying, or blocking a melee swing (Revenge / defense-react
|
|
441
|
+
// gates). Distinct from {@link dodgedRecently} (dodge only).
|
|
442
|
+
defenseReactRecently?: boolean;
|
|
443
|
+
// True within 5s of a hunter's own parry (AURA_STATE_HUNTER_PARRY, Counterattack's gate). A hunter's
|
|
444
|
+
// dodge sets defenseReactRecently instead, so the two never overlap.
|
|
445
|
+
hunterParryRecently?: boolean;
|
|
446
|
+
// True while in the melee band of the acting unit (self = any hostile; target = pairwise). Absent →
|
|
447
|
+
// evaluate as 0 (not in melee). Snapshot always fills this when geometry exists.
|
|
448
|
+
inMelee?: boolean;
|
|
449
|
+
// True while this subject is under charm / possess side-switch (acts for the other team). Absent → false.
|
|
450
|
+
// Surface from CombatantView.controlled.control === 'charm'.
|
|
451
|
+
charmed?: boolean;
|
|
452
|
+
// ---- BG / PvP (W10). All optional; absent → the matching condition reads 0. ----
|
|
453
|
+
/** Flag aura this subject carries (23333 Warsong / 23335 Silverwing). Absent → not carrying. */
|
|
454
|
+
carryingFlag?: number;
|
|
455
|
+
/** Group role, for `isHealer`. */
|
|
456
|
+
groupRole?: 'tank' | 'healer' | 'damage';
|
|
457
|
+
/** True when this subject's kit is primarily casts (interrupt / gap-close gates). */
|
|
458
|
+
isCaster?: boolean;
|
|
459
|
+
/** True when classId is CLASS_HUNTER. Cite: SharedDefines.h CLASS_HUNTER = 3. */
|
|
460
|
+
isHunter?: boolean;
|
|
461
|
+
/** Player class id, 0 for a creature. Cite: SharedDefines.h CLASS_WARRIOR = 1 … CLASS_DRUID = 11. */
|
|
462
|
+
classId?: number;
|
|
463
|
+
// Live crowd control on this subject, by mechanic. These are what gate a trinket or Free Action Potion
|
|
464
|
+
// row — a rotation cannot decide to break CC it cannot see.
|
|
465
|
+
rooted?: boolean;
|
|
466
|
+
feared?: boolean;
|
|
467
|
+
stunned?: boolean;
|
|
468
|
+
snared?: boolean;
|
|
469
|
+
/** UNIT_FLAG_SILENCED. Cite: Spell.cpp:6049-6050 CheckCast SPELL_FAILED_SILENCED. */
|
|
470
|
+
silenced?: boolean;
|
|
471
|
+
// Spell ids whose hostile aura CANNOT land on this subject. debuffPresent reads these as already
|
|
472
|
+
// present, so a keep-up gated on the aura's absence is not unsatisfiable. Absent means no immunity.
|
|
473
|
+
immuneAuraSpellIds?: ReadonlySet<number>;
|
|
474
|
+
// Offensive spell ids that will fully fail on this subject, so a GCD is not spent into Divine
|
|
475
|
+
// Shield or a school-immune mob. Heals are not listed. Cite: Unit.cpp IsImmuneToSpell ~7329.
|
|
476
|
+
immuneSpellIds?: ReadonlySet<number>;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
export interface RotationSnapshot {
|
|
480
|
+
self: SubjectState;
|
|
481
|
+
target: SubjectState | null; // null out of combat / no target
|
|
482
|
+
pet: SubjectState | null; // null until the character has a living pet
|
|
483
|
+
combatTimeMs: number;
|
|
484
|
+
// The session clock (ctx.t). `combatTimeMs` is 0 while this unit is OOC, so a cadence read off it
|
|
485
|
+
// stalls on a seat nobody has hit yet (arenaPace.ts). Absent on fixture snapshots.
|
|
486
|
+
sessionMs?: number;
|
|
487
|
+
// This unit's UNIT_FLAG_IN_COMBAT. Absent (legacy snapshots) → opener uses combatTimeMs only. False =
|
|
488
|
+
// still OOC: stay in the pull sequence (Charge) even if the session clock is old.
|
|
489
|
+
inCombat?: boolean;
|
|
490
|
+
/** Living enemies remaining in the session (1 in pure 1v1; 0 OOC). Wave 1B. */
|
|
491
|
+
enemyCount: number;
|
|
492
|
+
// Planar yards from the acting unit to each living combat enemy (geometry sessions). `enemiesWithinYd`
|
|
493
|
+
// subject self — PBAoE pack density at the caster. Absent → degrades to `enemyCount` (no geometry).
|
|
494
|
+
enemyDists?: readonly number[];
|
|
495
|
+
// Planar yards from the current focus to each living enemy, the focus itself at 0. Feeds
|
|
496
|
+
// enemiesWithinYd with subject target — ground-rain density at the cast point.
|
|
497
|
+
enemyDistsFromTarget?: readonly number[];
|
|
498
|
+
// Self-centred hard-control AoE ids with no body in their disc the control can hold. The rule is
|
|
499
|
+
// unsatisfiable, and the authored step-back would walk the caster out of range for nothing.
|
|
500
|
+
unholdableAoeCcSpellIds?: ReadonlySet<number>;
|
|
501
|
+
/** True when any living hostile holds an interruptible bar (not only the kill focus). */
|
|
502
|
+
kickableCastPresent?: boolean;
|
|
503
|
+
// False only on a dungeon pull the bake measured under a WMO roof; ABSENT MEANS OUTDOORS, matching
|
|
504
|
+
// TerrainInfo::IsOutdoors. Read to refuse outdoors-only spells before the GCD is spent.
|
|
505
|
+
outdoors?: boolean;
|
|
506
|
+
// Occupied shaman totem element slots (fight-scoped). Empty OOC / no totems. Wave 1D — gate summons with
|
|
507
|
+
// `totemPresent == 0` + slot index ref, not only summon spell id.
|
|
508
|
+
totemSlots: ReadonlySet<TotemSlot>;
|
|
509
|
+
// Hands with an active temporary weapon enchant (imbue / poison). ref 0 = mainhand, 1 = offhand. Gate
|
|
510
|
+
// with `weaponImbuePresent == 0`. Absent → treat as empty (tests / legacy snapshots).
|
|
511
|
+
weaponImbueHands?: ReadonlySet<'mainhand' | 'offhand'>;
|
|
512
|
+
// Eligible weapon hands (not shield) still missing a TEMP coat. ref 2 on weaponImbuePresent: 1 when this
|
|
513
|
+
// set is empty (fully coated), else 0. Absent → degrade to MH-only via weaponImbueHands.
|
|
514
|
+
weaponImbueOpenHands?: ReadonlySet<'mainhand' | 'offhand'>;
|
|
515
|
+
itemCounts: ReadonlyMap<number, number>; // itemEntry -> count in bags
|
|
516
|
+
/** Paperdoll entries. `itemEquipped` reads this; absent → 0. Cite: buildCombatant equippedItemEntries. */
|
|
517
|
+
equippedItemEntries?: ReadonlySet<number>;
|
|
518
|
+
// Group metrics, all optional. allyLowestHpPct is the lowest health % among living friendlies
|
|
519
|
+
// INCLUDING the actor, falling back to self when absent; the boolean pair is false when absent.
|
|
520
|
+
allyLowestHpPct?: number;
|
|
521
|
+
// Active buff spell ids on the lowest-HP living friendly (heal triage target). Used by
|
|
522
|
+
// `allyLowestBuffPresent`. Absent → degrade to self.buffs.
|
|
523
|
+
allyTriageBuffs?: ReadonlySet<number>;
|
|
524
|
+
// The body behind `subject: 'ally'`, so every SUBJECT metric reads a friendly the way it reads the
|
|
525
|
+
// enemy. Lazy like allyAuraStacks: absent, or nobody matching, reads null and the row is off.
|
|
526
|
+
allySubject?: (filter?: AllyFilter) => SubjectState | null;
|
|
527
|
+
/** That same body's seat id, so the CAST lands where the gate read. One resolver, not two. */
|
|
528
|
+
allyAimSide?: (filter?: AllyFilter) => string | null;
|
|
529
|
+
/** Living friendly health percents (incl. self). Used by `alliesBelowHpCount`. */
|
|
530
|
+
allyHpPcts?: readonly number[];
|
|
531
|
+
// Living friendlies near the actor: hp% + planar yards (null dist = treat as in range). Used by
|
|
532
|
+
// `nearbyAlliesBelowHpCount`.
|
|
533
|
+
allyDistHp?: ReadonlyArray<{ hpPct: number; distYd: number | null; isHealer?: boolean }>;
|
|
534
|
+
/** Planar yards to living enemy healers (groupRole healer). Absent → enemyHealersWithinYd is 0. */
|
|
535
|
+
enemyHealerDists?: readonly number[];
|
|
536
|
+
// Power % of every OTHER healer seat on this side, dead seats at 0, and [0] when the group has no
|
|
537
|
+
// healer. Absent or empty makes that condition false — solo, or the group's own healer asking.
|
|
538
|
+
healerPowerPcts?: readonly number[];
|
|
539
|
+
// Party seats incl. the acting unit (1 = solo). Absent reads 1, so an unfilled snapshot keeps the
|
|
540
|
+
// solo behaviour. Cite: pickAction.ts healerSeatsOf `groupSeats`.
|
|
541
|
+
partySeats?: number;
|
|
542
|
+
hasAggro?: boolean;
|
|
543
|
+
// True while a living enemy is swinging at a living ally other than the acting unit. Absent → 0.
|
|
544
|
+
// Cite: PlayerbotRogueAI.cpp:208-219 FindAttacker(AIT_VICTIMSELF) Blind, party form.
|
|
545
|
+
allyHasAggro?: boolean;
|
|
546
|
+
targetAttackingMe?: boolean;
|
|
547
|
+
/** Debuff spell ids on the current target's threat victim. Absent → aggroHolderDebuffPresent is 0. */
|
|
548
|
+
aggroHolderDebuffs?: ReadonlySet<number>;
|
|
549
|
+
/** Stack counts for those, when above 1. A present-but-unstacked aura reads 1. */
|
|
550
|
+
aggroHolderDebuffStacks?: ReadonlyMap<number, number>;
|
|
551
|
+
// Max stacks of `aura` on any living friendly (0 absent). Lazy like allyWithoutAuraNearYd: a closure
|
|
552
|
+
// until an `anyone` row asks. Cite: raidCustomRows RaidTriggerOn 'anyone'.
|
|
553
|
+
allyAuraStacks?: (aura: number) => number;
|
|
554
|
+
// Count of living charmed hostiles (possessed allies). Absent → 0. See CondMetric `charmedHostileCount`.
|
|
555
|
+
charmedHostileCount?: number;
|
|
556
|
+
/** Living melee (non-healer, melee-mode) friendlies incl. the acting unit. Absent → 0. */
|
|
557
|
+
meleeAllyCount?: number;
|
|
558
|
+
/** Dead friendlies eligible for party rez. Absent → 0 (see CondMetric deadAllyCount). */
|
|
559
|
+
deadAllyCount?: number;
|
|
560
|
+
// Companion knobs, subject ignored. Optional: aoeMode defaults to 0 auto and offHealAllowed to 0
|
|
561
|
+
// off. Encoding: 0 auto, 1 aoe, 2 single.
|
|
562
|
+
aoeMode?: number;
|
|
563
|
+
offHealAllowed?: number;
|
|
564
|
+
// Dispel gates computed by the engine's ally snapshot: one set for a debuff on any living friendly
|
|
565
|
+
// and one for a buff on the enemy target. Absent makes those conditions false.
|
|
566
|
+
dispellableOnFriendlies?: ReadonlySet<number>;
|
|
567
|
+
dispellableOnTarget?: ReadonlySet<number>;
|
|
568
|
+
// Yards to the nearest ground-pool edge (0 inside). Absent → `hazardProximityYd` is false. Cite:
|
|
569
|
+
// sessionApi.ts groundPools(); AUTOPILOT-PLAN §4 row 3.
|
|
570
|
+
hazardProximityYd?: number;
|
|
571
|
+
// True while a living enemy is casting at a friendly of the acting unit other than itself. Absent
|
|
572
|
+
// reads 0. Cite: pickAction.ts threatOf(e)?.getCurrentVictimId(), the read hasAggro makes.
|
|
573
|
+
enemyCastingOnAlly?: boolean;
|
|
574
|
+
// True while a living enemy is casting at the acting unit. Absent reads 0. Same threat-victim
|
|
575
|
+
// walk as enemyCastingOnAlly; vid === f.side is this flag, not that one.
|
|
576
|
+
enemyCastingOnSelf?: boolean;
|
|
577
|
+
// Yards to the current target. Absent → `targetDistanceYd` is false. Cite: keep_range / Sonic Burst 23918
|
|
578
|
+
// radiusYd 20.
|
|
579
|
+
targetDistanceYd?: number;
|
|
580
|
+
/** Yards to nearest living hostile of entry `ref`. Absent → false. */
|
|
581
|
+
creatureDistanceYd?: (entry: number) => number | null;
|
|
582
|
+
// Yards to the nearest living friendly who does NOT hold `ref`. A camp-split row needs this or it
|
|
583
|
+
// can never stop firing, and the two camps drift back into one ball. Absent reads null.
|
|
584
|
+
allyWithoutAuraNearYd?: (aura: number) => number | null;
|
|
585
|
+
// True when a living friendly other than the acting unit is missing `aura` — the usability gate on
|
|
586
|
+
// an `{ allyMissingAura }` row, shaped like `offTargetSpell`. Absent → the row is unusable.
|
|
587
|
+
// `among` is the row's own filter, so the gate and the aim read one pool.
|
|
588
|
+
allyMissingAura?: (aura: number, among?: AllyFilter) => boolean;
|
|
589
|
+
// True while this unit sits in the current target's frontal arc. Absent (no geometry, no facing target) →
|
|
590
|
+
// `inTargetCone` is false. Cite: combatGeometry isWithinConeYd.
|
|
591
|
+
inTargetCone?: boolean;
|
|
592
|
+
// Living hostile creature_template.entry values this unit can see. Used by `RuleSpellTarget {
|
|
593
|
+
// creatureEntry }` (Mind Control that Worshipper). Absent → entry targets are unusable.
|
|
594
|
+
hostileCreatureEntries?: ReadonlySet<number>;
|
|
595
|
+
// E6 raid plan reads for the acting unit. Absent (solo / legacy) → raid metrics read 0. Codes match
|
|
596
|
+
// `RAID_JOB_CODE` / `raidCampCode` in `src/domain/raid/raidPlan.ts`.
|
|
597
|
+
isMainTank?: boolean;
|
|
598
|
+
isOffTank?: boolean;
|
|
599
|
+
myJob?: number;
|
|
600
|
+
myCamp?: number;
|
|
601
|
+
/** Healer's assigned subgroup; absent → `assignedHealSubgroup` condition is false. */
|
|
602
|
+
assignedHealSubgroup?: number;
|
|
603
|
+
// Battleground view, filled by the BG layer. Absent means every BG condition reads 0, so a PvE
|
|
604
|
+
// rotation is unaffected. Distances are planar yards, and enemies are only those we perceive.
|
|
605
|
+
bg?: {
|
|
606
|
+
/** Living friendlies (excl. self) with distance and role. */
|
|
607
|
+
allyUnits: ReadonlyArray<{ distYd: number; isHealer: boolean; carryingFlag?: number }>;
|
|
608
|
+
/** Living, PERCEIVED enemies with distance and role. */
|
|
609
|
+
enemyUnits: ReadonlyArray<{ distYd: number; isHealer: boolean; carryingFlag?: number }>;
|
|
610
|
+
/** Is the acting unit's nearest objective contested? */
|
|
611
|
+
objectiveContested?: boolean;
|
|
612
|
+
/** Is it owned by the acting unit's team? */
|
|
613
|
+
objectiveOwnedByUs?: boolean;
|
|
614
|
+
/** Yards from the acting unit to that objective. */
|
|
615
|
+
objectiveDistYd?: number;
|
|
616
|
+
};
|
|
617
|
+
// True when `ids` already hold `ref` or a same-or-stronger rank / stack sibling. Absent → exact
|
|
618
|
+
// id. Cite: Unit.cpp:5013-5015; keepUpAlreadyPresent.
|
|
619
|
+
auraCovered?: (ids: ReadonlySet<number>, ref: number) => boolean;
|
|
620
|
+
/** Is the spell castable right now (off GCD/cooldown, affordable, learned)? */
|
|
621
|
+
// "Does the body this lands on already carry what I am applying?" — periodic damage on the
|
|
622
|
+
// focus, a periodic heal on the selected friendly or the caster. Cite: Spell.cpp:2298-2306.
|
|
623
|
+
periodicAlreadyOnAimedBody?: (spellId: number, triageAim: boolean) => boolean;
|
|
624
|
+
usableSpell: (spellId: number) => boolean;
|
|
625
|
+
// Ready except for the stance: every usableSpell gate but the shapeshift one. A rotation stance
|
|
626
|
+
// row cannot ask "is Disarm ready" while standing in the wrong stance without it.
|
|
627
|
+
usableSpellIgnoringForm?: (spellId: number) => boolean;
|
|
628
|
+
/** Form-enter spell in this unit's kit that reaches `formId`, or null when it knows none. */
|
|
629
|
+
stanceSpellForForm?: (formId: number) => number | null;
|
|
630
|
+
/** Form this spell ENTERS, or null when it is not a form spell. The inverse of the above. */
|
|
631
|
+
formEnteredBySpell?: (spellId: number) => number | null;
|
|
632
|
+
// Creature-entry target: can this spell land on THAT body? usableSpell gates the FOCUS, so a
|
|
633
|
+
// charm-immune boss made Mind Control unusable even where the row aims at an add.
|
|
634
|
+
usableOnCreatureEntry?: (spellId: number, creatureEntry: number) => boolean;
|
|
635
|
+
// For a `target: 'other'` rule: is there a second mob this CC could land on? Without it the rule
|
|
636
|
+
// wins the tick and the ENGINE refuses the cast, and the unit stands still for that GCD.
|
|
637
|
+
offTargetSpell?: (spellId: number) => boolean;
|
|
638
|
+
// The body that same selector picked. A subject-`target` gate on an off-target row must read it,
|
|
639
|
+
// or the row describes the focus, casts at a second mob, and never closes.
|
|
640
|
+
offTargetSubject?: (spellId: number) => SubjectState | null;
|
|
641
|
+
// For a FOCUS-aimed break-on-damage CC: did our own damage already knock the hold off? The party is
|
|
642
|
+
// killing it, so re-applying spends a GCD fighting our own group and the rule must yield.
|
|
643
|
+
ccBrokenOnTarget?: (spellId: number) => boolean;
|
|
644
|
+
/** Is the item usable right now (in bags, off cooldown, in combat)? */
|
|
645
|
+
usableItem: (itemEntry: number) => boolean;
|
|
646
|
+
// Best carried rank of a consumable family, or null when the unit carries none. An absent provider
|
|
647
|
+
// falls back to the row's authored itemEntry, which is the pre-family behaviour.
|
|
648
|
+
bestFamilyEntry?: (family: string) => number | null;
|
|
649
|
+
/** Is this gameobject_template.entry present (and not yet consumed) in the fight? */
|
|
650
|
+
usableObject?: (goEntry: number) => boolean;
|
|
651
|
+
// Spell ids and item entries the player already used this fight, from the combat log. The pull
|
|
652
|
+
// phase treats them as spent so the opener walks the list instead of thrashing the first rule.
|
|
653
|
+
pullSpentSpellIds?: ReadonlySet<number>;
|
|
654
|
+
pullSpentItemEntries?: ReadonlySet<number>;
|
|
655
|
+
// After-cast follow-up chain the previous rule queued, in cast order. chooseCombatAction walks it
|
|
656
|
+
// (after recovery) before the combat list, skipping any step whose own gate is false. Absent /
|
|
657
|
+
// expired → ignored.
|
|
658
|
+
followUpChain?: readonly RuleAfterStep[];
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
// Under this much sample one swing moves the answer, so the metric reads unknown and its rows are off.
|
|
662
|
+
export const TIME_TO_DIE_MIN_SAMPLE_MS = 2000;
|
|
663
|
+
|
|
664
|
+
// Ms to 0 health at the rate this fight has shown, or null when the sample cannot answer. No damage
|
|
665
|
+
// model: `combatTimeMs` is the ACTING unit's clock, so a late add errs long, which is the safe side.
|
|
666
|
+
export function timeToDieMs(healthPct: number, combatTimeMs: number): number | null {
|
|
667
|
+
if (!(combatTimeMs >= TIME_TO_DIE_MIN_SAMPLE_MS)) return null;
|
|
668
|
+
if (!(healthPct > 0)) return 0;
|
|
669
|
+
const lost = 100 - healthPct;
|
|
670
|
+
if (!(lost > 0)) return null; // untouched: nothing has been measured yet
|
|
671
|
+
return Math.round((combatTimeMs * healthPct) / lost);
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// Base pull/opener window (ms). Multi-rule openers scale up via {@link pullWindowMs} so Charge → shout →
|
|
675
|
+
// sunder can complete before combat steals the GCD.
|
|
676
|
+
export const PULL_WINDOW_MS = 2000;
|
|
677
|
+
|
|
678
|
+
/** Per pull-rule GCD-ish step when sizing the opener window. Classic base GCD = 1500. */
|
|
679
|
+
export const PULL_STEP_MS = 1500;
|
|
680
|
+
|
|
681
|
+
// How long recovery+pull stay ahead of the combat list. One step per enabled pull rule (min {@link
|
|
682
|
+
// PULL_WINDOW_MS}) so full openers fit.
|
|
683
|
+
export function pullWindowMs(enabledPullRules: number): number {
|
|
684
|
+
if (enabledPullRules <= 0) return 0;
|
|
685
|
+
return Math.max(PULL_WINDOW_MS, enabledPullRules * PULL_STEP_MS);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
/** Default guard thresholds. Editable later via the visual editor; kept here as the sane preset. */
|
|
689
|
+
export const DEFAULT_THRESHOLDS = {
|
|
690
|
+
healLowPct: 50, // self-heal below this health %
|
|
691
|
+
potionLowPct: 35, // use a healing potion/healthstone below this health % (emergency backup to heals)
|
|
692
|
+
/** Divine Shield / Ice Block / Shield Wall / Last Stand panic CDs (KI-213 / 259 / 375 / 395). */
|
|
693
|
+
emergencyDefensivePct: 35,
|
|
694
|
+
manaRestoreLowPct: 20, // mana gem / Evocation below this mana %
|
|
695
|
+
// A mana potion is only worth its shared category-4 lock (itemUseCooldown.ts) while health is
|
|
696
|
+
// safe. Drunk at 40% health it costs the health potion that would have saved the pull.
|
|
697
|
+
manaRestoreSafeHpPct: 70,
|
|
698
|
+
petHealLowPct: 60, // Mend Pet below this pet health %
|
|
699
|
+
petFeedHappyPct: 60, // Feed Pet below this happiness %
|
|
700
|
+
conjureBelow: 5, // conjure food/water: stock a few stacks for long sessions
|
|
701
|
+
/** Soulstone / Firestone / Spellstone / Healthstone / Blinding Powder / mana gem: hold one. */
|
|
702
|
+
conjureUtilityBelow: 1,
|
|
703
|
+
/** Create Healthstone / Soulstone: stock at most one (carry limit), not a pile of 5. */
|
|
704
|
+
conjureConsumableBelow: 1,
|
|
705
|
+
shootBelowPowerPct: 20, // caster wand Shoot: free ranged filler below this mana %
|
|
706
|
+
/** Execute window for Hammer of Wrath / Execute / Shadowburn / Soul Fire (vanilla tooltip ≤20%). */
|
|
707
|
+
executeHealthPct: 20,
|
|
708
|
+
/** Bloodrage: only when rage is thin — not an unconditional opener (KI-330). */
|
|
709
|
+
bloodrageBelowPowerPct: 30,
|
|
710
|
+
// Self combat cooldowns at or above this length use health gates, or are omitted as keep-ups, and
|
|
711
|
+
// never permanent buff or debuff thrash — Shield Wall, Divine Shield, Recklessness, Last Stand.
|
|
712
|
+
combatCdKeepUpMinMs: 60_000,
|
|
713
|
+
// Damage cooldowns and racials: how far into a fight the burst fires. Policy, not WoW data. A short
|
|
714
|
+
// CD waits out the opener; a long one waits for a fight that lasts, which trash never does.
|
|
715
|
+
burstOpenMs: 3_000,
|
|
716
|
+
burstLongFightMs: 15_000,
|
|
717
|
+
burstLongCdMs: 300_000,
|
|
718
|
+
} as const;
|