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,1855 @@
|
|
|
1
|
+
// Game facade types + pure type-adjacent helpers (Wave 2 S6). Extracted from engine/game.ts so game/*
|
|
2
|
+
// modules can import types without cycling back through the createGame facade.
|
|
3
|
+
|
|
4
|
+
import type { AllyActionProvider, CombatantSpec, CombatResult, CombatSession } from '../combat.ts';
|
|
5
|
+
import type { FloorDeathSummon } from './combatSession.ts';
|
|
6
|
+
import type {
|
|
7
|
+
Companion, CompanionAoeMode, SquadRole, SquadStrategy,
|
|
8
|
+
} from '../../domain/bots/squad.ts';
|
|
9
|
+
import type { BotSearchFilters, WorldBot } from '../../domain/bots/botPool.ts';
|
|
10
|
+
import type {
|
|
11
|
+
CompanionEnergyState,
|
|
12
|
+
CompanionMission,
|
|
13
|
+
MissionProgress,
|
|
14
|
+
MissionSkill,
|
|
15
|
+
MissionYieldRow,
|
|
16
|
+
} from '../../domain/bots/companionMissions.ts';
|
|
17
|
+
import type { GearProfile } from '../../domain/bots/botGear.ts';
|
|
18
|
+
import type { CompanionQuestOffer } from '../../domain/bots/companionQuests.ts';
|
|
19
|
+
import type { RaidTierId } from '../../domain/raid/raidRosterTemplate.ts';
|
|
20
|
+
import type { Character, EquippedMap } from '../../domain/character/character.ts';
|
|
21
|
+
import type { Rotation, RotationProfileId } from '../../domain/rotation/rotation.ts';
|
|
22
|
+
import type { RotationProfile } from '../../domain/rotation/rotationProfiles.ts';
|
|
23
|
+
import type { TalentBuild } from '../../domain/character/talentBuilds.ts';
|
|
24
|
+
import type { AutopilotConfig } from '../../autopilot/config.ts';
|
|
25
|
+
import type { EquipmentHelperConfig } from '../../domain/items/equipmentHelper.ts';
|
|
26
|
+
import type { AutoDisenchantConfig } from '../../domain/professions/autoDisenchant.ts';
|
|
27
|
+
import type { CharacterJunkFilterConfig, JunkFilterConfig } from '../../domain/items/junkFilter.ts';
|
|
28
|
+
import type { GatherFilterConfig } from '../../domain/professions/gatherFilter.ts';
|
|
29
|
+
import type { EquipSlot, SkillLine } from '../../data/schema.ts';
|
|
30
|
+
import type { Inventory } from '../../domain/items/inventory.ts';
|
|
31
|
+
import type { ActionBar } from '../../domain/character/actionbar.ts';
|
|
32
|
+
import type { MacroDef, MacroScope } from '../../domain/macro/types.ts';
|
|
33
|
+
import type { SpellBook } from '../../domain/character/spellbook.ts';
|
|
34
|
+
import type { QuestLog } from '../../domain/quests/questlog.ts';
|
|
35
|
+
import type { PickpocketRestockMap } from '../../domain/professions/pickpocket.ts';
|
|
36
|
+
import type { DeathFlowMode, DeathFlowState, GraveyardEntry } from '../../domain/run/death.ts';
|
|
37
|
+
import type { GossipMenu } from '../../domain/quests/gossip.ts';
|
|
38
|
+
import type { BankBags } from '../../domain/items/bank.ts';
|
|
39
|
+
import type { AuctionHouseState, Auction } from '../../domain/economy/auction.ts';
|
|
40
|
+
import type { Mailbox, MailMessage, MailAttachment } from '../../domain/economy/mail.ts';
|
|
41
|
+
import type { PendingLoot, PendingLootRow } from '../../domain/items/pendingLoot.ts';
|
|
42
|
+
import type { HonorWeekLedger } from '../../domain/run/honorWeek.ts';
|
|
43
|
+
import type { LootSourceInfo } from './loot.ts';
|
|
44
|
+
import type { NodeState } from '../../domain/professions/professions.ts';
|
|
45
|
+
import type { EntranceYardRow } from '../../domain/nav/travel.ts';
|
|
46
|
+
import type { JourneyLeg, JourneyProgress, HearthBind } from '../../domain/nav/travelTypes.ts';
|
|
47
|
+
import type { GoRuntimeState } from '../../domain/world/gameObjects.ts';
|
|
48
|
+
import type { HazardState } from '../../domain/world/hazards.ts';
|
|
49
|
+
import type { WeatherState } from '../../domain/world/weather.ts';
|
|
50
|
+
import type { InstanceRun, InstanceSaveMap, LockoutMap } from '../../world/instances.ts';
|
|
51
|
+
import type { BattlegroundId, BattlegroundRun } from '../../domain/run/battlegroundRun.ts';
|
|
52
|
+
import type { PullFusion, RouteDensity } from '../../world/dungeonRoute.ts';
|
|
53
|
+
import type { DungeonRunSummary } from '../../domain/run/dungeonRun.ts';
|
|
54
|
+
import type { PlannedBuff, PlannedHandout } from '../../domain/bots/prePullBuffs.ts';
|
|
55
|
+
import type { LootDrop } from '../../domain/items/loot.ts';
|
|
56
|
+
|
|
57
|
+
// Opt-in for the loot acts (gather / skin / interactObject / openContainerItem): with `hold`, drops
|
|
58
|
+
// go into `state.pendingLoot` for the player to click. The UI passes it; autopilot and bots do not.
|
|
59
|
+
export interface LootHoldOpts {
|
|
60
|
+
hold?: boolean;
|
|
61
|
+
/** Wall-clock for depletion/restock gates (default Date.now()). Gather nodes share nodeState with gather(). */
|
|
62
|
+
nowMs?: number;
|
|
63
|
+
// Roster companion whose lockpicking skill (L×5) opens a locked container item. Omitted,
|
|
64
|
+
// openContainerItem still falls back to the best qualified roster rogue.
|
|
65
|
+
lockpickerId?: string;
|
|
66
|
+
// openContainerItem, direct-to-bags only: refuse with 'Not enough bag space' instead of spilling
|
|
67
|
+
// part of the haul. The auto-opener sets it; a hand click keeps today's partial-take behaviour.
|
|
68
|
+
requireRoom?: boolean;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export type { PendingLoot, PendingLootRow, LootSourceInfo };
|
|
72
|
+
|
|
73
|
+
export interface GameState {
|
|
74
|
+
char: Character;
|
|
75
|
+
inventory: Inventory;
|
|
76
|
+
// Keyring — an unbounded BagFamily KEYS container (bagFamily 9); keys never take backpack slots.
|
|
77
|
+
// Optional on pre-v40 saves. Cite: Player.h KEYRING_SLOT_*; domain/items/keyring.ts.
|
|
78
|
+
keyring?: Inventory;
|
|
79
|
+
bank: Inventory; // personal bank storage (Phase 4)
|
|
80
|
+
// Purchased bank bag slots (WoW's 7), one entry per bought slot holding the slotted bag's entry
|
|
81
|
+
// or null. Length = slots owned; each bag adds its `bagSlots` to bankCapacity.
|
|
82
|
+
bankBags: BankBags;
|
|
83
|
+
spellbook: SpellBook;
|
|
84
|
+
actionBars: ActionBar[]; // player's configured action bars (spell-per-slot + keybinds)
|
|
85
|
+
// Raid bar (empty by default). Fires for every living raid member on the Settings global keybind.
|
|
86
|
+
// Optional on older saves — migrate back-fills an empty bar.
|
|
87
|
+
globalActionBar?: ActionBar;
|
|
88
|
+
// Classic primary action-bar pages by form (BonusActionBar). Pre-stance-bar saves omit it and
|
|
89
|
+
// page "0" seeds from actionBars[0]. Only the main bar swaps with form.
|
|
90
|
+
primaryBarPages?: import('../../domain/character/stanceBar.ts').PrimaryBarPages;
|
|
91
|
+
// This character's macros (`c1..c18`). Account-wide macros live outside the save, in
|
|
92
|
+
// CreateGameOptions.accountMacros. Cite: Blizzard_MacroUI.lua:31/:41.
|
|
93
|
+
macros?: import('../../domain/macro/types.ts').MacroDef[];
|
|
94
|
+
questlog: QuestLog;
|
|
95
|
+
rngSeed: number;
|
|
96
|
+
fightCounter: number; // monotonic nonce for every seeded action (fights, gathers, crafts)
|
|
97
|
+
activity: string[]; // recent human-readable log lines, newest first
|
|
98
|
+
// The most recent skinnable corpse, if any: gather it once, then it's gone.
|
|
99
|
+
corpse: { creatureEntry: number; node: number } | null;
|
|
100
|
+
// Creature type of the most recent kill (any kill), so an Undead can Cannibalize a fresh corpse.
|
|
101
|
+
// Set on a win, cleared on travel or the next fight.
|
|
102
|
+
lastCorpse?: { creatureType: number; creatureEntry?: number; hitBySpells?: number[] } | null;
|
|
103
|
+
// Per-node harvest state, keyed by `${zoneId}:${nodeId}`: how many charges a placed
|
|
104
|
+
// node has left and when a depleted one respawns. A missing key means a pristine node.
|
|
105
|
+
nodeState: Record<string, NodeState>;
|
|
106
|
+
// FI7 Pick Pocket restock map: spawnKey → nextReadyMs. Session runtime, not a bake field;
|
|
107
|
+
// absent on pre-FI7 saves means every target is ready. Cite: Creature.cpp restock.
|
|
108
|
+
pickpocketRestock?: PickpocketRestockMap;
|
|
109
|
+
// Per-GO runtime bookkeeping for restock / trap arm / charges, keyed `${zoneId}:${objectEntry}`
|
|
110
|
+
// (or entry alone when unzoned). Absent on pre-J saves, meaning every GO is pristine.
|
|
111
|
+
goRuntime?: Record<string, GoRuntimeState>;
|
|
112
|
+
// Temporary GameObjects placed by SPELL_EFFECT_SUMMON_OBJECT_WILD (76), session runtime only.
|
|
113
|
+
// Cite: SpellEffects.cpp:3620–3662 EffectSummonObjectWild.
|
|
114
|
+
wildSummonedObjects?: import('./summonObjectWild.ts').WildSummonedObject[];
|
|
115
|
+
/** m_ObjectSlotGuid[0..3] session GOs. Cite: SpellEffects.cpp:4734–4790; Unit.h:1979. */
|
|
116
|
+
objectSlots?: import('./summonObjectSlot.ts').SlotSummonedObject[];
|
|
117
|
+
// Meeting-stone LFG queue from SCRIPT_COMMAND_MEETINGSTONE (200). Cite: ScriptMgr.cpp:3287–3307;
|
|
118
|
+
// LFGMgr.cpp:38–90 AddToQueue.
|
|
119
|
+
meetingStoneQueue?: import('./meetingStoneQueue.ts').MeetingStoneQueueState | null;
|
|
120
|
+
// MirrorTimer-style environmental hazard state; absent on pre-J saves builds a fresh one on the
|
|
121
|
+
// first regenTick. Zones stay unflagged until authored, so this is inert by default.
|
|
122
|
+
hazards?: HazardState;
|
|
123
|
+
// Spell and category cooldowns (wall-clock readyAt ms), persisted across fights and used for OOC
|
|
124
|
+
// casts (racials, long CDs, potions via category). Old saves are back-filled on load.
|
|
125
|
+
spellCooldowns: Record<number, number>;
|
|
126
|
+
categoryCooldowns: Record<number, number>;
|
|
127
|
+
// The dungeon run you're currently inside (Phase 5), or null when in the world.
|
|
128
|
+
instance: InstanceRun | null;
|
|
129
|
+
// Session clock passed to the last instance entry; raid lockouts stamp from it so expiry compares
|
|
130
|
+
// on the same nowMs as `canEnter`. migrate must keep it or lockout falls to `?? 0` (KI-1022).
|
|
131
|
+
instanceEnteredAtMs?: number;
|
|
132
|
+
// Instances you walked out of. 5-mans hold for NORMAL_INSTANCE_RESET_TIME_MS; raids hold until lockout
|
|
133
|
+
// expiry. Absent ≡ nothing held (older saves too).
|
|
134
|
+
instanceSaves?: InstanceSaveMap;
|
|
135
|
+
// The battleground you are in (PVP-BG-RUNSHEET). Identity only — the live BgWorld is runtime. Optional:
|
|
136
|
+
// absent on every pre-BG save (you are in the world).
|
|
137
|
+
battleground?: BattlegroundRun | null;
|
|
138
|
+
// Map/realm worldstate variables (GetVariable / SetVariable) — OutdoorPvP SI/EP plus SET_WORLDSTATE
|
|
139
|
+
// writes. Cite: WorldStateVariableManager.cpp:45-70; OutdoorPvPSI.cpp:38-46.
|
|
140
|
+
worldStates?: Record<number, number>;
|
|
141
|
+
// dungeonId -> lockout expiry (ms); only timed lockouts (raids, later) populate it.
|
|
142
|
+
lockouts: LockoutMap;
|
|
143
|
+
// The auction house (Phase 4 economy + Phase 8 bot autofill). Per-character for now;
|
|
144
|
+
// a truly shared cross-player AH lands with the Phase 6 server.
|
|
145
|
+
auctionHouse: AuctionHouseState;
|
|
146
|
+
// Player inbox (CMaNGOS mail): AH settlement, bags-full instance loot, quest RewMailTemplateId and
|
|
147
|
+
// player sends all land here. Pre-wire saves stored Delivery[]; migrateMailbox wraps them.
|
|
148
|
+
mailbox: Mailbox;
|
|
149
|
+
// What the open LootFrame is holding. `closeLoot` discards outdoor leftovers but keeps a
|
|
150
|
+
// `kind: 'container'` remainder. Only loot acts passing `{ hold: true }` fill this.
|
|
151
|
+
pendingLoot?: PendingLoot | null;
|
|
152
|
+
// Limited-vendor stock (Creature.h VendorItemCount): vendorEntry → itemId → count +
|
|
153
|
+
// lastIncrementTime. Only vendors with baked npc_vendor maxcount rows appear.
|
|
154
|
+
vendorStock?: Record<number, Record<number, { count: number; lastIncrementTime: number }>>;
|
|
155
|
+
// The open honor week: every character who banked contribution, keyed by name (`@player` for the
|
|
156
|
+
// player). The weekly pass ranks against THIS population, not a curve. Cite: ObjectMgr.cpp:3765.
|
|
157
|
+
honorWeek?: HonorWeekLedger;
|
|
158
|
+
// Rungs of the 1v1 bot gauntlet this character has beaten. Only a WON `arena1` against the rung
|
|
159
|
+
// you faced advances it, and it never goes down. 0/absent → `gauntletLadder()[0]`.
|
|
160
|
+
gauntletRung?: number;
|
|
161
|
+
// Arena Elo per bracket (1, 2, 3, 5), keyed by bracket size. Absent or a missing key reads as
|
|
162
|
+
// ARENA_RATING_START. It REPLACES the Freemade..Apes picker for arena: the rating decides the
|
|
163
|
+
// comp and the tier. A loss lowers it and there is no floor. Cite: domain/bg/arenaRating.ts.
|
|
164
|
+
arenaRating?: Partial<Record<number, number>>;
|
|
165
|
+
// D2 squad: persistent AI companions (free composition, geared from the player's bags - bots never roll)
|
|
166
|
+
// and the player's chosen run role. Optional - absent on pre-v19 saves (no crew recruited yet).
|
|
167
|
+
squad?: Companion[];
|
|
168
|
+
squadRole?: SquadRole;
|
|
169
|
+
/** D3 run pacing: careful | aggressive | sip — see squad.ts SQUAD_PACING. */
|
|
170
|
+
squadStrategy?: SquadStrategy;
|
|
171
|
+
// D4 world pool: every bot ever hired, keyed by bot id, dismissed ones included — a dismissed bot
|
|
172
|
+
// keeps its gear, level and XP. Active members live in `squad`; no id is in both.
|
|
173
|
+
botRoster?: Record<string, Companion>;
|
|
174
|
+
// Shared companion-mission energy pool (100 max, refills at local 06:00). Absent ⇒ full for the current
|
|
175
|
+
// day. Not per-companion — one budget for the roster. Cite: domain/bots/companionMissions.ts partyEnergy.
|
|
176
|
+
companionEnergy?: CompanionEnergyState;
|
|
177
|
+
// DEV raid bench — raid-shaped bodies built free from a tier template, kept OUT of `botRoster` so
|
|
178
|
+
// a raid test cannot poison the hire economy. Only an `asRaid` instance entry fields them.
|
|
179
|
+
raidRoster?: {
|
|
180
|
+
dungeonId: string;
|
|
181
|
+
tier: RaidTierId;
|
|
182
|
+
members: Record<string, Companion>;
|
|
183
|
+
};
|
|
184
|
+
// The raid promotion in force, so leave / hearth / taxi / portal can undo it after a reload — as a
|
|
185
|
+
// closure variable it stranded 39 promoted companions. `benched` holds members set aside for a smaller cap.
|
|
186
|
+
// `fill` is a battleground merc generated for one match: it goes back to no roster at all.
|
|
187
|
+
raidParty?: {
|
|
188
|
+
dungeonId: string;
|
|
189
|
+
promoted: { id: string; from: 'bench' | 'raid' | 'fill' }[];
|
|
190
|
+
benched: Companion[];
|
|
191
|
+
};
|
|
192
|
+
// Hand-picked companion ids (squad + botRoster) for the next instance. When set for that dungeon,
|
|
193
|
+
// the entry path seats these instead of auto-promoting the bench. Leave puts them back.
|
|
194
|
+
instanceRoster?: {
|
|
195
|
+
dungeonId: string;
|
|
196
|
+
ids: string[];
|
|
197
|
+
};
|
|
198
|
+
// Raid group picked on the Companions tab (10/20/40), owned bodies only, used when that dungeon
|
|
199
|
+
// has no `instanceRoster`. Empty `ids` is a real pick: you walk in with nobody extra.
|
|
200
|
+
raidLineup?: {
|
|
201
|
+
size: 10 | 20 | 40;
|
|
202
|
+
ids: string[];
|
|
203
|
+
};
|
|
204
|
+
// The player's auto-combat rotation. Absent or class-mismatched regenerates on first read, and an
|
|
205
|
+
// untouched default refreshes when level, spec or spellbook drifts.
|
|
206
|
+
rotation?: Rotation;
|
|
207
|
+
// Second, separately edited DPS rotation for a tank/healer band, built on the class damage
|
|
208
|
+
// band. Absent until the DPS tab is opened; a DPS spec is never offered one.
|
|
209
|
+
rotationDps?: Rotation;
|
|
210
|
+
// Named rotation lists and the source of truth; `rotation` above is a MIRROR of the active one so
|
|
211
|
+
// the places that rewrite it in place (rank upgrade, quest reward, respec) keep working.
|
|
212
|
+
rotationProfiles?: RotationProfile[];
|
|
213
|
+
/** Which named profile drives play. Absent → the first. */
|
|
214
|
+
activeRotationProfileId?: string;
|
|
215
|
+
// Which of the two profiles is in force. Absent/'primary' => the role rotation above.
|
|
216
|
+
rotationProfile?: RotationProfileId;
|
|
217
|
+
// Rotation spec override ("autodetect but let me choose"). null/undefined => derive the primary
|
|
218
|
+
// tree from spent talents; a tree name (e.g. 'Feral Combat') forces that spec's suggestion bands.
|
|
219
|
+
rotationSpec?: string | null;
|
|
220
|
+
// Auto Quest / Autofarm settings (thresholds, speed, auto-eat toggles). Absent => defaults.
|
|
221
|
+
autopilot?: AutopilotConfig;
|
|
222
|
+
// Equipment helper (auto-equip better gear or only suggest). Uses StatCompare-grounded scoring.
|
|
223
|
+
// Absent => DEFAULT_EQUIPMENT_HELPER_CONFIG via normalizeEquipmentHelperConfig.
|
|
224
|
+
equipmentHelper?: EquipmentHelperConfig;
|
|
225
|
+
// Outfitter named gear sets for the player. Companions store their own on Companion.outfitter. Absent ⇒
|
|
226
|
+
// seeded on first open (Normal, Birthday Suit, smart resists, special stubs).
|
|
227
|
+
outfitter?: import('../../domain/bots/outfitter.ts').OutfitterState;
|
|
228
|
+
// Auto-disenchant bagged gear up to a quality ceiling when the party has Enchanting. Absent = off.
|
|
229
|
+
// Always keeps your upgrades, and companion upgrades when protectCompanionUpgrades.
|
|
230
|
+
autoDisenchant?: AutoDisenchantConfig;
|
|
231
|
+
// How Share consumables splits your bag stacks across the party or raid: a rule per rank ladder,
|
|
232
|
+
// the scope, the kit filter, and whether you keep a share. Absent => every ladder on auto, party, you included.
|
|
233
|
+
consumableShare?: import('../../domain/bots/consumableShare.ts').ConsumableShareState;
|
|
234
|
+
// PallyPower board: which Blessing each paladin puts on each class, and which Aura each runs.
|
|
235
|
+
// Absent/empty => every cell auto, the CMaNGOS chain in rotation/paladinBuffs.ts.
|
|
236
|
+
paladinAssignments?: import('../../domain/rotation/paladinBuffs.ts').PaladinAssignments;
|
|
237
|
+
// Per-character junk filter layer (lists always; quality/auto when characterSpecific). Global layer lives
|
|
238
|
+
// in client Settings. Absent => empty character lists, use global rules.
|
|
239
|
+
junkFilter?: CharacterJunkFilterConfig;
|
|
240
|
+
// Auto-quest mine/herb + fight-end auto-skin take-list (skill colour + skip/always). Absent => skip gray.
|
|
241
|
+
gatherFilter?: GatherFilterConfig;
|
|
242
|
+
// Named talent loadouts saved from the wiki calculator. Optional — pre-feature saves omit; empty list is
|
|
243
|
+
// the same as absent.
|
|
244
|
+
talentBuilds?: TalentBuild[];
|
|
245
|
+
// Last talent-respec cost charged in copper (CMaNGOS `m_resetTalentsCost`); absent/0 means the
|
|
246
|
+
// next respec is the 1g first-reset price. Cite: Player.cpp:3715.
|
|
247
|
+
resetTalentsCost?: number;
|
|
248
|
+
// Wall-clock ms of the last successful respec. CMaNGOS `m_resetTalentsTime`. Used for the 5g/month decay.
|
|
249
|
+
// Cite: Player.cpp:3726. Round-tripped through saveShape.migrate alongside resetTalentsCost.
|
|
250
|
+
resetTalentsTime?: number;
|
|
251
|
+
// Wave DF: full death-flow snapshot (CORPSE/GHOST). Absent/`ALIVE` when repair-only mode or after
|
|
252
|
+
// resurrect. Optional — pre-DF saves omit it.
|
|
253
|
+
deathFlow?: DeathFlowState;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Player listing lengths. Client minutes 120/480/1440. Cite: AuctionFrame.lua:790–796; Handler.cpp:256–258. */
|
|
257
|
+
export const AH_DURATIONS_MS = {
|
|
258
|
+
short: 2 * 60 * 60 * 1000,
|
|
259
|
+
medium: 8 * 60 * 60 * 1000,
|
|
260
|
+
long: 24 * 60 * 60 * 1000,
|
|
261
|
+
} as const;
|
|
262
|
+
export type AhDuration = keyof typeof AH_DURATIONS_MS;
|
|
263
|
+
|
|
264
|
+
export type { LootDrop };
|
|
265
|
+
|
|
266
|
+
/** Why `repeatQuest` stopped: bags ran dry, the per-call cap, the 20-slot log, or a refusal. */
|
|
267
|
+
export type QuestRepeatStop = 'materials' | 'cap' | 'log-full' | 'blocked';
|
|
268
|
+
|
|
269
|
+
// Safety cap on one repeatQuest call. A 250-stack turn-in that wants 3 items per round tops out at
|
|
270
|
+
// 83 rounds, so this only ever catches a data bug that makes the loop non-terminating.
|
|
271
|
+
export const MAX_QUEST_REPEATS = 500;
|
|
272
|
+
|
|
273
|
+
/** Why `consumeItemAll` stopped: the stack ran out, the per-call cap, or the item refused. */
|
|
274
|
+
export type UseAllStop = 'stack' | 'cap' | 'blocked';
|
|
275
|
+
export interface FightOutcome {
|
|
276
|
+
ok: true;
|
|
277
|
+
// `win` player killed the foe, `defeat` player HP hit 0, `timeout` combat cap with the player
|
|
278
|
+
// alive (no death penalties). Cite: KI-740 — settleFight must not treat timeout as death.
|
|
279
|
+
outcome: 'win' | 'defeat' | 'timeout';
|
|
280
|
+
result: CombatResult;
|
|
281
|
+
xpGained: number;
|
|
282
|
+
goldGained: number;
|
|
283
|
+
loot: LootDrop[];
|
|
284
|
+
leveledTo: number[];
|
|
285
|
+
/** Bodies that died and were paid — a defeat that took half the pull with it is not zero. */
|
|
286
|
+
killCount: number;
|
|
287
|
+
}
|
|
288
|
+
export interface BeginFight {
|
|
289
|
+
session: CombatSession;
|
|
290
|
+
enemyName: string;
|
|
291
|
+
enemyEntry: number; // the foe's CreatureDef entry - lets the UI show its portrait glyph
|
|
292
|
+
playerMax: number;
|
|
293
|
+
enemyMax: number;
|
|
294
|
+
// Nearby spawns within their GetAttackDistance of the pull origin — metadata for spatial hunt,
|
|
295
|
+
// not auto-joined on a player-initiated single pull (that is packAssist / CallForHelp).
|
|
296
|
+
spatialAdds?: Array<{ entry: number; distance: number; attackDistance: number }>;
|
|
297
|
+
// Wave 4B: pack members that joined via CallAssistance (CallForHelp radius + CanAssistTo). Already
|
|
298
|
+
// present as multi-enemy specs in `session` when non-empty.
|
|
299
|
+
packAssist?: Array<{ entry: number; distance: number; name: string }>;
|
|
300
|
+
// Player-chosen outdoor AoE extras (Autopilot pullNormalCount / pullEliteCount). Not CallAssistance.
|
|
301
|
+
aoePull?: Array<{ entry: number; distance: number; name: string }>;
|
|
302
|
+
// S4A / DR fusion: encounter ids folded into this pull (primary alone when unfused). Live UI mirrors this
|
|
303
|
+
// for Incoming / Pull +1 so already-fused packs are not re-shown.
|
|
304
|
+
fusedIds?: string[];
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/** Result of Game.pullAdditionalPack (S4A conveyor / mid-fight inject). */
|
|
308
|
+
export interface PullAdditionalPackResult {
|
|
309
|
+
encounterId: string;
|
|
310
|
+
name: string;
|
|
311
|
+
/** Newly injected enemies (side + entry + display name). */
|
|
312
|
+
injected: Array<{ side: string; name: string; entry: number }>;
|
|
313
|
+
// Soft warning when living hostiles after inject exceed MAYHEM_SOFT_CAP (10). Never a hard block — UI may
|
|
314
|
+
// surface it.
|
|
315
|
+
softCapWarning: boolean;
|
|
316
|
+
combatantCount: number;
|
|
317
|
+
/** Full fusion batch after this inject (primary + prior fused + newly pulled). */
|
|
318
|
+
fusedIds: string[];
|
|
319
|
+
}
|
|
320
|
+
export type ActionResult<T = {}> = ({ ok: true } & T) | { ok: false; reason: string };
|
|
321
|
+
|
|
322
|
+
export type OutfitWearResult = ActionResult<{
|
|
323
|
+
wearing: boolean;
|
|
324
|
+
name: string;
|
|
325
|
+
missing: number;
|
|
326
|
+
party?: Array<{ owner: string; name: string; ok: boolean; reason?: string }>;
|
|
327
|
+
}>;
|
|
328
|
+
|
|
329
|
+
/** One row of the roster-wide gearing view (Game.squadUpgradePlan). */
|
|
330
|
+
export interface SquadUpgradeRow {
|
|
331
|
+
companionId: string;
|
|
332
|
+
companionName: string;
|
|
333
|
+
/** True when this companion is on the bench rather than in the party. */
|
|
334
|
+
benched: boolean;
|
|
335
|
+
entry: number;
|
|
336
|
+
targetSlot: EquipSlot;
|
|
337
|
+
currentEntry?: number;
|
|
338
|
+
/** Spec-weighted score gain over what they are wearing now. */
|
|
339
|
+
delta: number;
|
|
340
|
+
/** Where the item is: the companion's own bags, your bags, your bank, or another companion's bags. */
|
|
341
|
+
from: 'theirs' | 'you' | 'bank' | 'mate';
|
|
342
|
+
/** The companion holding a 'mate' row (a crafter's product sits in the crafter's bags). */
|
|
343
|
+
holderId?: string;
|
|
344
|
+
holderName?: string;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Where an enchant-applying item should land. Omitted target ⇒ the player's own gear. A companion is
|
|
348
|
+
// addressed by id so the caller never hands the engine a stale copy of it.
|
|
349
|
+
export type EnchantTarget =
|
|
350
|
+
| { kind: 'self' }
|
|
351
|
+
| { kind: 'companion'; id: string };
|
|
352
|
+
|
|
353
|
+
/** Options for Game.consumeItem beyond the legacy food/drink preference. */
|
|
354
|
+
export interface ConsumeItemOpts {
|
|
355
|
+
preferEffect?: 'food' | 'drink';
|
|
356
|
+
/** Whose gear to enchant. Default: the player's. */
|
|
357
|
+
target?: EnchantTarget;
|
|
358
|
+
/** Which equipped slot to enchant. Omitted ⇒ the call returns `needsTarget` instead. */
|
|
359
|
+
slot?: EquipSlot;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// Returned with ok:false when an enchant item or weapon-imbue spell named no slot. `slots` is already
|
|
363
|
+
// filtered to what this wearer can take, so a picker built from it cannot offer a refused slot.
|
|
364
|
+
export interface EnchantNeedsTarget {
|
|
365
|
+
itemEntry?: number;
|
|
366
|
+
/** Shaman weapon imbue spell (Rockbiter / Flametongue / …) when the cast needs a hand. */
|
|
367
|
+
spellId?: number;
|
|
368
|
+
enchantId: number;
|
|
369
|
+
target: EnchantTarget;
|
|
370
|
+
slots: EquipSlot[];
|
|
371
|
+
/** Slots that hold an item but were refused, with the reason — for a greyed-out row. */
|
|
372
|
+
rejected: { slot: EquipSlot; reason: string }[];
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
/** One line of a vendor's stock, resolved for display (see Game.vendorOffers). */
|
|
376
|
+
export interface VendorOffer {
|
|
377
|
+
itemEntry: number;
|
|
378
|
+
/** Units delivered per purchase — item_template.BuyCount (1 for most items). */
|
|
379
|
+
unitsPerPurchase: number;
|
|
380
|
+
/** Copper for ONE purchase of `unitsPerPurchase` units, reputation discount applied. */
|
|
381
|
+
pricePerPurchase: number;
|
|
382
|
+
/** Undiscounted bundle price, so a surface can show the discount. */
|
|
383
|
+
basePricePerPurchase: number;
|
|
384
|
+
/** npc_vendor.maxcount, or null when the supply is unlimited. */
|
|
385
|
+
maxStock: number | null;
|
|
386
|
+
/** Units available right now after lazy restock; null when unlimited. */
|
|
387
|
+
stockRemaining: number | null;
|
|
388
|
+
/** ms until the next restock tick, or null when unlimited / already full. */
|
|
389
|
+
restockInMs: number | null;
|
|
390
|
+
/** npc_vendor.incrtime in seconds (one restock tick), null when unlimited. */
|
|
391
|
+
restockEverySec: number | null;
|
|
392
|
+
/** False when limited stock can't cover one purchase right now. */
|
|
393
|
+
inStock: boolean;
|
|
394
|
+
/** Can the player's bags take `unitsPerPurchase` units (family-aware)? */
|
|
395
|
+
fits: boolean;
|
|
396
|
+
// Honor Points for ONE purchase, or 0 when the line is paid in coin. PRODUCT RULE: PvP gear is
|
|
397
|
+
// bought with honor, so `pricePerPurchase` is 0 whenever this is set. Cite: honorPrice.ts.
|
|
398
|
+
honorPrice: number;
|
|
399
|
+
/** Can the player pay `pricePerPurchase`, or `honorPrice` when that is the price? */
|
|
400
|
+
affordable: boolean;
|
|
401
|
+
// False when a BuyItemFromVendor requirement gate refuses this line regardless of gold, bags or stock:
|
|
402
|
+
// RequiredReputation, requiredhonorrank, or npc_vendor.condition_id. Cite: Player.cpp:17528-17549.
|
|
403
|
+
meetsRequirements: boolean;
|
|
404
|
+
/** Why `meetsRequirements` is false ("Requires the rank of Knight"). Absent when it is true. */
|
|
405
|
+
requirementReason?: string;
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
// Encounter-open failures that must not hard-stop an auto or headless dungeon: missing templates and
|
|
409
|
+
// empty pulls are skipped with a log. Fatal state (spirit, not in dungeon, path locked) still stops.
|
|
410
|
+
export function isSkippableBeginFailure(reason: string | undefined): boolean {
|
|
411
|
+
if (reason == null || !reason.trim()) return true;
|
|
412
|
+
const r = reason.toLowerCase();
|
|
413
|
+
return (
|
|
414
|
+
r.includes('unknown creature')
|
|
415
|
+
|| r.includes('no pull')
|
|
416
|
+
|| r.includes('no template')
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/** One inn hire option: a world-pool bot + its premade spec + generated spawn-gear preview. */
|
|
421
|
+
export interface InnCandidate {
|
|
422
|
+
bot: WorldBot;
|
|
423
|
+
/** Premade playerbot spec (undefined when the bake predates seed-bot-specs). */
|
|
424
|
+
specName?: string;
|
|
425
|
+
/** Dungeon-role hint from the spec (vet your hires - a shadow priest is not a healer). */
|
|
426
|
+
specRole?: SquadRole;
|
|
427
|
+
/** The spawn gear the bot arrives wearing (generated from its template, deterministic). */
|
|
428
|
+
gear: EquippedMap;
|
|
429
|
+
// ICH1/ICH3 kit tier for this slate face (docs/archive/INN-COMPANION-HIRE-DESIGN.md §2, §5). Frozen onto
|
|
430
|
+
// Companion.gearProfile at hire. Assigned by pickProfile + slate mix.
|
|
431
|
+
gearProfile?: GearProfile;
|
|
432
|
+
// ICH2 first-hire price in copper (design §3). 0 for naked. Re-hire from roster is free and does not
|
|
433
|
+
// appear on the slate.
|
|
434
|
+
hireCostCopper?: number;
|
|
435
|
+
/** ICH3 display-only gear estimate (average worn itemLevel). Not used for price (design D3). */
|
|
436
|
+
gearScore?: number;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
/** Which container `Game.sortContainer` reorders. */
|
|
440
|
+
export type SortContainerTarget =
|
|
441
|
+
| 'bags'
|
|
442
|
+
| 'bank'
|
|
443
|
+
| 'companion-bags'
|
|
444
|
+
| 'companion-bank'
|
|
445
|
+
| 'companions';
|
|
446
|
+
|
|
447
|
+
export interface Game {
|
|
448
|
+
readonly state: GameState;
|
|
449
|
+
/** Auto-resolve a whole fight (AI plays the player). */
|
|
450
|
+
fight(
|
|
451
|
+
creatureEntry: number,
|
|
452
|
+
opts?: { withSquad?: boolean; noAoe?: boolean },
|
|
453
|
+
): ActionResult<Omit<FightOutcome, 'ok'>>;
|
|
454
|
+
// Start a live, interactive fight. `withSquad` brings hired companions (default: solo).
|
|
455
|
+
// `attack` reads the Attack dial; `noAoe` skips farm-dial extras (detected pickpocket).
|
|
456
|
+
beginFight(
|
|
457
|
+
creatureEntry: number,
|
|
458
|
+
opts?: { withSquad?: boolean; sitting?: boolean; attack?: boolean; noAoe?: boolean },
|
|
459
|
+
): ActionResult<BeginFight>;
|
|
460
|
+
// Free-floor dungeon pull: fight exactly these spawn guids at DB world coords. Not a route wave —
|
|
461
|
+
// composition is whatever the party pulled.
|
|
462
|
+
beginFloorPull(opts: {
|
|
463
|
+
dungeonId: string;
|
|
464
|
+
mapId: number;
|
|
465
|
+
members: readonly { guid: number; entry: number; x: number; y: number }[];
|
|
466
|
+
withSquad?: boolean;
|
|
467
|
+
elapsedMs?: number;
|
|
468
|
+
}): ActionResult<BeginFight>;
|
|
469
|
+
// Continuous dungeon: one endless combat session for the whole run (dead shell enemy). Mount combatView
|
|
470
|
+
// once; injectFloorMember for every pull — no fight-scene thrash.
|
|
471
|
+
beginFloorShell(opts: {
|
|
472
|
+
dungeonId: string;
|
|
473
|
+
mapId: number;
|
|
474
|
+
origin: { x: number; y: number; z?: number };
|
|
475
|
+
withSquad?: boolean;
|
|
476
|
+
}): ActionResult<BeginFight>;
|
|
477
|
+
// Inject one DB spawn into the open endless floor session at world coords. `passive: true` — in the
|
|
478
|
+
// combat pool with no AttackStart threat (not aggroed).
|
|
479
|
+
injectFloorMember(
|
|
480
|
+
session: CombatSession,
|
|
481
|
+
member: { guid: number; entry: number; x: number; y: number; z?: number },
|
|
482
|
+
opts?: { passive?: boolean },
|
|
483
|
+
): ActionResult<{ side: string; name: string; entry: number; level: number }>;
|
|
484
|
+
/** After a passive stream inject enters real combat — queue kill credit for that guid. */
|
|
485
|
+
noteFloorPackMember(
|
|
486
|
+
member: { guid: number; entry: number; level: number },
|
|
487
|
+
): ActionResult;
|
|
488
|
+
// Mid-run kill settlement for floor packs. Endless session stays open. Credits pending pack members since
|
|
489
|
+
// last call, then clears that list.
|
|
490
|
+
creditFloorKills(opts?: {
|
|
491
|
+
guids?: number[];
|
|
492
|
+
dropRest?: boolean;
|
|
493
|
+
/** Hold drops + coin in the loot window (boss kill) instead of bagging them. */
|
|
494
|
+
holdLoot?: boolean;
|
|
495
|
+
lootTitle?: string;
|
|
496
|
+
lootCreatureEntry?: number;
|
|
497
|
+
}): ActionResult<{
|
|
498
|
+
xpGained: number;
|
|
499
|
+
goldGained: number;
|
|
500
|
+
loot: LootDrop[];
|
|
501
|
+
killCount: number;
|
|
502
|
+
/** What each corpse's death script summoned. The floor owns where the body lands. */
|
|
503
|
+
summons: FloorDeathSummon[];
|
|
504
|
+
}>;
|
|
505
|
+
/** Apply the outcome of a (live or auto) fight: vitals, loot, gold, quest credit, xp. */
|
|
506
|
+
resolveFight(session: CombatSession, opts?: { holdLoot?: boolean }): FightOutcome;
|
|
507
|
+
// Plan and depart a wall-clock journey to `zoneId` (multi-leg; the destination need not be a
|
|
508
|
+
// neighbour). Fares prepay at departure and position derives from `now` via journeyTick.
|
|
509
|
+
travelTo(zoneId: string, nowMs?: number): ActionResult<{ travelMs: number; totalSeconds: number; totalCopper: number }>;
|
|
510
|
+
// Plan-only route preview for the map panel: legs, ETA seconds and copper with NO state change,
|
|
511
|
+
// assembled the same way travelTo does so the preview always matches departure.
|
|
512
|
+
previewTravel(zoneId: string, nowMs?: number): ActionResult<{ legs: JourneyLeg[]; totalSeconds: number; totalCopper: number }>;
|
|
513
|
+
// Derive journey progress at `nowMs`, apply zone handoffs + first-visit hooks, clear journey on arrival.
|
|
514
|
+
// Lazy-invoked by travel-relevant reads so state never goes stale.
|
|
515
|
+
journeyTick(nowMs?: number): void;
|
|
516
|
+
// Sim Pause: while true, journeyTick folds elapsed wall time into pausedMs and does not advance travel.
|
|
517
|
+
setIdlePaused(paused: boolean, nowMs?: number): void;
|
|
518
|
+
/** Read-only journey view for UI/autopilot, or null when idle. */
|
|
519
|
+
journeyStatus(nowMs?: number): {
|
|
520
|
+
progress: JourneyProgress;
|
|
521
|
+
legs: JourneyLeg[];
|
|
522
|
+
arrivalEpochMs: number;
|
|
523
|
+
destination: string;
|
|
524
|
+
/** Active fast-forward factor (D9 revised): 1, 2 or 4. */
|
|
525
|
+
timeScale: number;
|
|
526
|
+
} | null;
|
|
527
|
+
// Voluntary abort. Traveler stays in the derived current zone; prepaid taxi fares on incomplete legs are
|
|
528
|
+
// refunded (KI-901).
|
|
529
|
+
cancelJourney(nowMs?: number): ActionResult;
|
|
530
|
+
// Set the active journey's fast-forward factor (1×/2×/4× of real time), rebased for continuity and
|
|
531
|
+
// persisted. New journeys take it from `opts.travelPace`; this is for changing one underway.
|
|
532
|
+
setJourneySpeed(scale: number, nowMs?: number): ActionResult;
|
|
533
|
+
// Instant arrival. Refused unless the live travel pace (`opts.travelPace`) is 'instant' - a local
|
|
534
|
+
// single-player convenience (D3 amendment); the Phase-6 server path must never accept this call.
|
|
535
|
+
completeJourneyNow(nowMs?: number): ActionResult;
|
|
536
|
+
// Abandon the live (unresolved) combat session WITHOUT settling it, so the world loop cannot
|
|
537
|
+
// re-open it. No XP, loot or durability, and the hero keeps its pre-fight HP.
|
|
538
|
+
abandonLiveFight(nowMs?: number): ActionResult;
|
|
539
|
+
/** Bind hearthstone at the current zone's inn/tavern (K2). */
|
|
540
|
+
bindHearth(nowMs?: number): ActionResult<{ bind: HearthBind }>;
|
|
541
|
+
/** Cast hearthstone (spell 8690): depart a single-leg hearth journey to the bind. */
|
|
542
|
+
castHearth(nowMs?: number): ActionResult<{ totalSeconds: number }>;
|
|
543
|
+
// Known class teleports that have a baked `spellTeleports` row; spells without one never appear.
|
|
544
|
+
// `have` is the bag count via countItem. Warlock Ritual of Summoning is deferred.
|
|
545
|
+
classTravelOptions(nowMs?: number): Array<{
|
|
546
|
+
spellId: number;
|
|
547
|
+
name: string;
|
|
548
|
+
toZone: string;
|
|
549
|
+
castSeconds: number;
|
|
550
|
+
/** True for a City Defender's granted capital teleport: no rune, no mana. PRODUCT RULE. */
|
|
551
|
+
free: boolean;
|
|
552
|
+
reagents: Array<{ item: number; count: number; have: number }>;
|
|
553
|
+
}>;
|
|
554
|
+
// Cast a known teleport: gate reagents, then depart a single-leg `kind: 'portal'` journey for
|
|
555
|
+
// castTimeMs/1000 s. TakeReagents runs only on arrival, so a cancel mid-channel consumes nothing.
|
|
556
|
+
castTeleport(spellId: number, nowMs?: number): ActionResult<{ totalSeconds: number }>;
|
|
557
|
+
// Direct taxi options from the current zone's discovered, faction-usable nodes to other discovered nodes
|
|
558
|
+
// (single-hop view for the flight-master UI).
|
|
559
|
+
taxiOptions(nowMs?: number): Array<{ toZone: string; seconds: number; priceCopper: number; pathId: number }>;
|
|
560
|
+
// Live combat session from the most recent startFight. Null after resolveFight or when no fight is open.
|
|
561
|
+
// UI/tests drive tick + resolveFight.
|
|
562
|
+
liveFightSession(): CombatSession | null;
|
|
563
|
+
acceptQuest(entry: number, opts?: { atGo?: boolean }): ActionResult;
|
|
564
|
+
/** Drop a quest from the log, freeing its slot; the quest becomes offerable again. */
|
|
565
|
+
abandonQuest(entry: number): ActionResult;
|
|
566
|
+
// A degraded escort or event finish credits the event and refreshes completion, with no XP or money
|
|
567
|
+
// — the turn-in pays. Empty explore-trigger quests take the same path.
|
|
568
|
+
finishEscort(entry: number): ActionResult;
|
|
569
|
+
// FO4: use a quest source/provided item on a target for use-on-target credit. Validates inventory
|
|
570
|
+
// only. KI-439: a Taming Rod credits only when targetCreatureEntry is its sourced practice beast.
|
|
571
|
+
useQuestItemOnTarget(opts: {
|
|
572
|
+
itemEntry: number;
|
|
573
|
+
targetCreatureEntry?: number;
|
|
574
|
+
targetGoEntry?: number;
|
|
575
|
+
}): ActionResult;
|
|
576
|
+
// FO4: talk/gossip with an NPC — credits talk-candidate quests whose ender/starter name matches. Explicit
|
|
577
|
+
// player action; does not free-complete on accept. Cite: MASTER-ROADMAP FO4; domain recordTalkToNpc.
|
|
578
|
+
talkToNpc(opts: { creatureEntry?: number; npcName?: string }): ActionResult;
|
|
579
|
+
// Turn in a complete quest. `rewardChoice` is the 0-based index into `QuestDef.rewChoiceItems`;
|
|
580
|
+
// omit or 0 when there is no choice. Cite: Player.cpp:12544 RewardQuest `reward` arg.
|
|
581
|
+
turnInQuest(
|
|
582
|
+
entry: number,
|
|
583
|
+
rewardChoice?: number,
|
|
584
|
+
): ActionResult<{ xp: number; money: number; items: LootDrop[]; spells: import('./questTurnIn.ts').QuestTurnInSpell[]; buffs?: import('./questTurnIn.ts').QuestTurnInSpell[]; leveledTo: number[]; tempSpawns?: import('./questTurnIn.ts').QuestEndTempSpawn[] }>;
|
|
585
|
+
// Hand a repeatable in over and over while the bags still pay for it. Stops on the first round a
|
|
586
|
+
// fresh quest row would not already read complete, so nothing half-accepted is left behind.
|
|
587
|
+
repeatQuest(
|
|
588
|
+
entry: number,
|
|
589
|
+
opts?: { rewardChoice?: number; max?: number },
|
|
590
|
+
): ActionResult<{
|
|
591
|
+
turnedIn: number;
|
|
592
|
+
xp: number;
|
|
593
|
+
money: number;
|
|
594
|
+
items: LootDrop[];
|
|
595
|
+
leveledTo: number[];
|
|
596
|
+
stopped: QuestRepeatStop;
|
|
597
|
+
}>;
|
|
598
|
+
learnFromTrainer(trainerEntry: number, spellId: number): ActionResult;
|
|
599
|
+
// Read a class book that teaches a player ability (Grimoire of Inferno, the Codex/Tome family). Consumes
|
|
600
|
+
// the book, learns the ability + its dependants, and fixes bars/rotation ranks.
|
|
601
|
+
learnSpellFromItem(itemEntry: number): ActionResult<{ spell: number; name: string }>;
|
|
602
|
+
/** Buy `qty` of an item the given vendor stocks, spending gold and filling the bags. */
|
|
603
|
+
buyItem(vendorEntry: number, itemEntry: number, qty?: number): ActionResult<{ spent: number }>;
|
|
604
|
+
// Pre-run food and water (domain/bots/runSupply.ts): you plus the seated squad with their own bags; the
|
|
605
|
+
// plan a mageless party sees at Start the run; the buy off your purse into each member's bags (reagentBuyIn.ts).
|
|
606
|
+
runSupplyMembers(): import('../../domain/bots/runSupply.ts').SupplyMember[];
|
|
607
|
+
runSupplyPlan(prefs?: import('../../domain/bots/runSupply.ts').RunSupplyPrefs): import('../../domain/bots/runSupply.ts').RunSupplyPlan;
|
|
608
|
+
buyRunSupplies(
|
|
609
|
+
buys: readonly import('../../domain/bots/runSupply.ts').SupplyBuy[],
|
|
610
|
+
): ActionResult<{ spent: number; units: number; rows: number; refusal?: string }>;
|
|
611
|
+
// Everything a surface needs for one vendor line: units per purchase, bundle price after the rep
|
|
612
|
+
// discount, and stock left plus restock time. One query, so nothing disagrees with buyItem().
|
|
613
|
+
vendorOffers(vendorEntry: number, nowMs?: number): VendorOffer[];
|
|
614
|
+
// Bank one character's contribution into the open honor week; `key` is a name or `'player'`. Bots
|
|
615
|
+
// bank too — the weekly pass ranks against this population. Cite: Formulas.h:105 GenerateScores.
|
|
616
|
+
bankWeeklyHonor(key: string, cp: number, hk?: number): void;
|
|
617
|
+
// Honor for a duel WON against another player, in the same shape a BG kill takes and paying the
|
|
618
|
+
// same 160 at 60. The shipped falloff zeroes a farm loop after ten wins on one person in a day.
|
|
619
|
+
awardDuelHonor(opponent: { name: string; level: number; rankPoints?: number }): { cp: number };
|
|
620
|
+
// Bracket win bonus for the 1v1 and 2v2, which resolve on the combat surface rather than the BG
|
|
621
|
+
// screen. Same BG_WSG_WinMatchHonor number every other bracket pays. Cite: BattleGroundWS.h.
|
|
622
|
+
awardArenaWinHonor(): { cp: number };
|
|
623
|
+
// Run every maintenance-day (Wednesday) honor pass this save owes and return how many ran. Called
|
|
624
|
+
// on load; call again after banking so a session crossing the boundary ranks. Cite: World.h:461.
|
|
625
|
+
runWeeklyHonorPass(nowMs?: number): number;
|
|
626
|
+
// Select projectile ammo (PLAYER_AMMO_ID / SetAmmo). Entry must be INVTYPE_AMMO and pass CanUseAmmo
|
|
627
|
+
// (level/class). Cite: Player.cpp SetAmmo; ItemHandler HandleSetAmmoOpcode.
|
|
628
|
+
setAmmo(itemEntry: number): ActionResult;
|
|
629
|
+
/** Clear selected ammo (RemoveAmmo). Cite: Player.cpp RemoveAmmo. */
|
|
630
|
+
clearAmmo(): ActionResult;
|
|
631
|
+
/** Sell `qty` of an item from the bags for its sell price (any vendor buys). */
|
|
632
|
+
sellItem(itemEntry: number, qty?: number): ActionResult<{ earned: number; qty: number }>;
|
|
633
|
+
// Sell up to `qty` from the specific bag stack at `slotIndex` (does not drain other stacks of the same
|
|
634
|
+
// item). Prefer this for vendor UI clicks on a bag cell.
|
|
635
|
+
sellItemStack(slotIndex: number, qty?: number): ActionResult<{ earned: number; qty: number }>;
|
|
636
|
+
/** Sell every poor-quality (grey) item in the bags at once. */
|
|
637
|
+
sellAllJunk(): ActionResult<{ earned: number; count: number }>;
|
|
638
|
+
/** Permanently destroy `qty` of an item from bags and/or keyring. */
|
|
639
|
+
discardItem(itemEntry: number, qty?: number): ActionResult<{ discarded: number }>;
|
|
640
|
+
/** Destroy the bag stack at index only (multi-select destroy; does not drain other stacks). */
|
|
641
|
+
discardBagStack(index: number, qty?: number): ActionResult<{ discarded: number }>;
|
|
642
|
+
/** Destroy the keyring stack at index (UI keyring cells). */
|
|
643
|
+
discardKeyringStack(index: number, qty?: number): ActionResult<{ discarded: number }>;
|
|
644
|
+
// Rearrange the bags: move the stack in bag slot `from` to slot `to` (merge same items, swap
|
|
645
|
+
// different ones, or move to the end). `qty` must be a positive finite integer when given.
|
|
646
|
+
moveItem(from: number, to: number, qty?: number): ActionResult;
|
|
647
|
+
// Restack and reorder one container in the SortBags order (domain/items/sortContainer.ts).
|
|
648
|
+
// `companionId` is required for the two companion targets; 'companions' does the whole crew's
|
|
649
|
+
// bags and banks, which is what the merged Companion storage grid shows.
|
|
650
|
+
sortContainer(where: SortContainerTarget, companionId?: string): ActionResult<{ freed: number; changed: boolean }>;
|
|
651
|
+
// Repair all worn gear (any vendor repairs). `vendorEntry` applies that NPC's Honored+ discount;
|
|
652
|
+
// omitted, the best discount among canRepair vendors in the zone, or 1.0 if there are none.
|
|
653
|
+
repairAll(vendorEntry?: number): ActionResult<{ spent: number }>;
|
|
654
|
+
// Read-only bill `repairAll(vendorEntry)` would charge, plus the repair NPC it prices against.
|
|
655
|
+
// `vendorName` is null when no canRepair vendor is reachable (HUD gate).
|
|
656
|
+
repairQuote(vendorEntry?: number): {
|
|
657
|
+
cost: number;
|
|
658
|
+
vendorEntry: number | null;
|
|
659
|
+
vendorName: string | null;
|
|
660
|
+
};
|
|
661
|
+
/** Repair one equipped paperdoll slot (MerchantRepairItemButton / single-item path). */
|
|
662
|
+
repairSlot(slot: EquipSlot, vendorEntry?: number): ActionResult<{ spent: number }>;
|
|
663
|
+
// Wave DF: read-only death-flow view (null when ALIVE / repair-only). `canReclaim` / `reclaimReady` use
|
|
664
|
+
// `nowMs` (default Date.now()).
|
|
665
|
+
deathFlowStatus(nowMs?: number): {
|
|
666
|
+
deathState: DeathFlowState['deathState'];
|
|
667
|
+
canReclaim: boolean;
|
|
668
|
+
reclaimReady: boolean;
|
|
669
|
+
reclaimDelayMs: number;
|
|
670
|
+
reclaimReadyInMs: number;
|
|
671
|
+
corpseZoneId: number | string | null;
|
|
672
|
+
graveyardId: number | null;
|
|
673
|
+
} | null;
|
|
674
|
+
/** Move ghost to corpse position (corpse-run stand-in). Ghost only. */
|
|
675
|
+
runToCorpse(): ActionResult;
|
|
676
|
+
// Reclaim corpse when ghost is in range and reclaim delay has elapsed. Half HP, no resurrection sickness.
|
|
677
|
+
// Cite: MiscHandler.cpp HandleReclaimCorpseOpcode.
|
|
678
|
+
reclaimCorpse(nowMs?: number): ActionResult;
|
|
679
|
+
// Spirit healer resurrect at graveyard: half HP, res sickness (level-scaled), +25% durability loss. Cite:
|
|
680
|
+
// NPCHandler.cpp SendSpiritResurrect.
|
|
681
|
+
spiritHealerResurrect(nowMs?: number): ActionResult;
|
|
682
|
+
// Use/consume an item out of combat. `preferEffect` applies the food/drink consumable directly;
|
|
683
|
+
// a teach item routes to itemTeaches.ts. `needsTarget` rides the FAILURE branch, not ActionResult.
|
|
684
|
+
consumeItem(itemEntry: number, preferEffect?: 'food' | 'drink' | ConsumeItemOpts):
|
|
685
|
+
| ({ ok: true } & { restored: number; kind?: 'food' | 'drink'; buff?: { mod: string; amount: number; durationMs: number }; learned?: { kind: 'recipe' | 'enchant' | 'petSpell' | 'spell' | 'profRank'; name: string } })
|
|
686
|
+
| { ok: false; reason: string; needsTarget?: EnchantNeedsTarget };
|
|
687
|
+
// Use the WHOLE stack in one call, on the same route a single use takes — so a stack of clams
|
|
688
|
+
// opens, a stack of tokens is spent, and a shared cooldown stops the run at the first refusal.
|
|
689
|
+
consumeItemAll(itemEntry: number, max?: number): ActionResult<{
|
|
690
|
+
used: number;
|
|
691
|
+
restored: number;
|
|
692
|
+
stopped: UseAllStop;
|
|
693
|
+
/** The refusal that ended the run, when one did. */
|
|
694
|
+
lastReason?: string;
|
|
695
|
+
}>;
|
|
696
|
+
// FI9: wrap the bag stack at `targetSlot` with paper at `paperSlot`, consuming one of each and
|
|
697
|
+
// leaving a gift shell carrying `wrappedItemEntry`. Bind-on-wrap for BoP or bound targets.
|
|
698
|
+
wrapItem(paperSlot: number, targetSlot: number): ActionResult<{ giftEntry: number; wrappedEntry: number; bound: boolean }>;
|
|
699
|
+
// FI9: unwrap a filled gift stack at `slotIndex`, restoring the original entry. UI should play
|
|
700
|
+
// `sound.clip('unwrap')` on success.
|
|
701
|
+
unwrapItem(slotIndex: number): ActionResult<{ restoredEntry: number; bound: boolean }>;
|
|
702
|
+
regenTick(seconds: number, sitting: boolean, opts?: {
|
|
703
|
+
// The caller is replaying a background gap it already booked via accrueOfflineRest, so skip in-game
|
|
704
|
+
// rested accrual. Both paths pay the same rate inside an inn — see game.ts.
|
|
705
|
+
restAlreadyBooked?: boolean;
|
|
706
|
+
}): void;
|
|
707
|
+
// Accrue offline rested XP for a login gap (Player::ComputeRest offline path), called with
|
|
708
|
+
// `now - save.updatedAt` seconds. Capitals accrue at full rate, anywhere else at rate/4.
|
|
709
|
+
accrueOfflineRest(seconds: number): void;
|
|
710
|
+
// OOC cast (buffs, conjures, pet summon/tame, stealth). `targetCreature` is the beast entry for
|
|
711
|
+
// role `pet_tame`; `reviveTarget: 'self'` applies RESURRECT* to a dead caster.
|
|
712
|
+
castOutOfCombat(spellId: number, opts?: {
|
|
713
|
+
targetCreature?: number;
|
|
714
|
+
// GameObject template entry this cast targets (cast-on-GO quest credit). Cite: Spell.cpp:1581
|
|
715
|
+
// RewardPlayerAndGroupAtCast(go, spellId).
|
|
716
|
+
targetGoEntry?: number;
|
|
717
|
+
reviveTarget?: 'self';
|
|
718
|
+
// TEMP_ENCHANTMENT_SLOT hand for shaman weapon imbues. Omitted → empty-first MH then OH with
|
|
719
|
+
// two weapons, and ask when both are coated. Cite: domain/professions/weaponImbueHand.ts.
|
|
720
|
+
slot?: EquipSlot;
|
|
721
|
+
// Item entry for SPELL_EFFECT_FEED_PET (101) food or DISENCHANT (99) itemTarget. Feed omitted →
|
|
722
|
+
// first diet food in bags; DE omitted → no target. Cite: SpellEffects.cpp:4640 EffectDisEnchant.
|
|
723
|
+
itemEntry?: number;
|
|
724
|
+
}): { ok: true; conjured: LootDrop[] }
|
|
725
|
+
// `aggroCreature` is the entry a resisted Pick Pocket just alerted — the caller starts the fight.
|
|
726
|
+
| { ok: false; reason: string; needsTarget?: EnchantNeedsTarget; aggroCreature?: number };
|
|
727
|
+
/** Remaining cooldown (ms) for this spell id, taking the higher of per-spell and its category CD. 0 = ready. */
|
|
728
|
+
spellCooldownRemaining(spellId: number): number;
|
|
729
|
+
/** Forsaken racial: devour a fresh Humanoid/Undead corpse (from the last kill) to heal out of combat. */
|
|
730
|
+
cannibalize(): ActionResult<{ restored: number }>;
|
|
731
|
+
// CMSG_CANCEL_AURA — drop a buff you hold. Refuses passives, debuffs, channels, NO_AURA_CANCEL
|
|
732
|
+
// and NO_AURA_ICON, and also strips it from an open floor session. Cite: SpellHandler.cpp:422.
|
|
733
|
+
cancelAura(spellId: number): ActionResult<{ name: string }>;
|
|
734
|
+
// Would `cancelAura(spellId)` be allowed right now? The UI asks before drawing the right-click
|
|
735
|
+
// affordance, so hint and gesture cannot disagree. Does not check that you hold the aura.
|
|
736
|
+
canCancelAuraNow(spellId: number): boolean;
|
|
737
|
+
// Pets (hunter/warlock). Summoning a demon / calling a tamed pet goes through castOutOfCombat.
|
|
738
|
+
/** Read a pet-training book (warlock Grimoire): consumes it and unlocks the pet ability rank it teaches. */
|
|
739
|
+
trainPet(itemEntry: number): ActionResult<{ spell: number; name: string }>;
|
|
740
|
+
/** Tame a huntable beast into your pet (Hunter). */
|
|
741
|
+
tamePet(creatureEntry: number): ActionResult;
|
|
742
|
+
/** Feed the pet a food item to raise its happiness (diet-gated; sourced food benefit). */
|
|
743
|
+
feedPet(itemEntry: number): ActionResult;
|
|
744
|
+
// Set (or clear with null) the food the pet auto-feeds on out of combat: regenTick re-feeds it
|
|
745
|
+
// whenever happiness drops far enough to land without waste. Diet-gated like feedPet.
|
|
746
|
+
setPetAutoFeed(itemEntry: number | null): ActionResult<{ entry: number | null }>;
|
|
747
|
+
// Toggle an auto-consumable preference (food / drink / buff item), used OOC by regenTick. Pass
|
|
748
|
+
// the same entry again to clear that slot or drop it from the buff list.
|
|
749
|
+
setAutoConsumable(itemEntry: number): ActionResult<{ prefs: import('../../domain/bots/autoConsumables.ts').AutoConsumablePrefs | undefined }>;
|
|
750
|
+
// Unconditionally clear an auto-consumable from every slot. `setAutoConsumable` refuses anything
|
|
751
|
+
// not currently eligible, so it cannot clear an entry whose item has left the bags. This can.
|
|
752
|
+
clearAutoConsumable(itemEntry: number): ActionResult<{ prefs: import('../../domain/bots/autoConsumables.ts').AutoConsumablePrefs | undefined }>;
|
|
753
|
+
// Faction ids the player is at war with — the rep-pane toggle plus anything Hostile or below.
|
|
754
|
+
// Feed it to domain/creature/faction.ts so those NPCs refuse to talk and become legal targets.
|
|
755
|
+
atWarFactions(): ReadonlySet<number>;
|
|
756
|
+
// Reputation pane war toggle (CMSG_SET_FACTION_ATWAR). Refused for your own side and for hidden
|
|
757
|
+
// factions. At war, that faction's NPCs refuse to deal and turn attackable. Cite: SetAtWar.
|
|
758
|
+
setFactionAtWar(factionId: number, on: boolean): ActionResult<{ atWar: boolean }>;
|
|
759
|
+
// Park a faction at the bottom of the reputation pane (CMSG_SET_FACTION_INACTIVE). Only a visible faction
|
|
760
|
+
// can go inactive; re-activating is always allowed. Cite: ReputationMgr::SetInactive.
|
|
761
|
+
setFactionInactive(factionId: number, on: boolean): ActionResult<{ inactive: boolean }>;
|
|
762
|
+
// "Show as Experience Bar" — the faction whose standing replaces the XP bar. Pass 0, or the
|
|
763
|
+
// watched id again, to go back to XP. Cite: Player::SetWatchedFaction.
|
|
764
|
+
setWatchedFaction(factionId: number): ActionResult<{ watched: number }>;
|
|
765
|
+
// Buy a pet-ability rank from a pet trainer: GOLD ONCE into the character-wide Beast Training repertoire
|
|
766
|
+
// (`char.petSpells`). Hunters only; no pet required out.
|
|
767
|
+
buyPetSpell(trainerEntry: number, spellId: number): ActionResult;
|
|
768
|
+
// Beast Training (spell 5149): teach the CURRENT pet a rank from the repertoire, spending ITS training
|
|
769
|
+
// points (chain-aware). Cite: Pet.cpp GetTPForSpell/learnSpell.
|
|
770
|
+
teachPetSpell(spellId: number): ActionResult;
|
|
771
|
+
// Toggle autocast for a pet ability (right-click on the pet bar). Rank-agnostic by name chain; disabled
|
|
772
|
+
// abilities stay learned but leave the combat kit (buildPet).
|
|
773
|
+
togglePetAutocast(spellId: number): ActionResult<{ enabled: boolean }>;
|
|
774
|
+
// Pet bar command / react state (Ctrl-1..Ctrl-0), stored on the pet so the next fight opens where
|
|
775
|
+
// the player left it; a live session applies it at once. Cite: Unit.h CommandStates.
|
|
776
|
+
setPetCommand(command: 'follow' | 'stay'): ActionResult;
|
|
777
|
+
setPetReact(react: 'aggressive' | 'defensive' | 'passive'): ActionResult;
|
|
778
|
+
/** Dismiss the active pet. */
|
|
779
|
+
dismissPet(): ActionResult;
|
|
780
|
+
// Buy the next hunter stable slot (max 2). Price from StableSlotPrices.dbc: 500 then 50000 copper.
|
|
781
|
+
// Cite: NPCHandler.cpp HandleBuyStableSlot; Pet.h MAX_PET_STABLES.
|
|
782
|
+
buyStableSlot(): ActionResult<{ spent: number; stableSlots: number }>;
|
|
783
|
+
// Put the current hunter pet (or dismissed storedPet) into the first free purchased slot. Dead /
|
|
784
|
+
// non-hunter pets refuse. Cite: NPCHandler.cpp HandleStablePet.
|
|
785
|
+
stablePet(): ActionResult<{ slot: number }>;
|
|
786
|
+
// Call the pet in 1-based stable slot `slot`. Swaps with the current/dismissed hunter pet when one
|
|
787
|
+
// exists; otherwise the slot becomes empty. Cite: NPCHandler.cpp HandleUnstablePet / HandleStableSwapPet.
|
|
788
|
+
callStabledPet(slot: number): ActionResult;
|
|
789
|
+
// Auto-combat rotation + settings, read and written by the visual editor and autopilot. Returns
|
|
790
|
+
// the rotation, regenerating a default if absent or class-mismatched; no profile = the active one.
|
|
791
|
+
rotation(profile?: RotationProfileId): Rotation;
|
|
792
|
+
// The rotation as COMBAT sees it: `rotation()` with every `{ kind: 'macro' }` rule compiled. Read
|
|
793
|
+
// only — writing it back would replace the macro rule with its own output. Memoized.
|
|
794
|
+
rotationForCombat(profile?: RotationProfileId): Rotation;
|
|
795
|
+
// Spec band for player defaults: rotationSpec, else Holy/Resto/Protection when signed healer/tank, else
|
|
796
|
+
// talent primary (undefined → autodect).
|
|
797
|
+
playerRotationBand(): string | undefined;
|
|
798
|
+
// Build the role-adapted class default (Holy/Resto/Protection pack bands when squadRole is healer). Used
|
|
799
|
+
// by rotation()/resetRotation/setRotationSpec — not a second rotation store.
|
|
800
|
+
buildPlayerDefaultRotation(
|
|
801
|
+
specOverride?: string | null,
|
|
802
|
+
profile?: RotationProfileId,
|
|
803
|
+
/** `mode: 'pvp'` selects the authored pvp band for this class and tree. */
|
|
804
|
+
opts?: { mode?: 'pvp'; variant?: string },
|
|
805
|
+
): Rotation;
|
|
806
|
+
/** Replace the rotation (from the visual editor). Custom saves stay valid via isRotationValid. */
|
|
807
|
+
setRotation(rot: Rotation, profile?: RotationProfileId): void;
|
|
808
|
+
/** Discard edits and rebuild the recommended pack default for the current role band. */
|
|
809
|
+
resetRotation(profile?: RotationProfileId): Rotation;
|
|
810
|
+
/** Which rotation profile the player is playing ('primary' unless they picked the DPS tab). */
|
|
811
|
+
rotationProfile(): RotationProfileId;
|
|
812
|
+
/** Switch profiles. 'dps' is refused unless the band is a tank/healer tree. */
|
|
813
|
+
setRotationProfile(profile: RotationProfileId): ActionResult;
|
|
814
|
+
/** True when this character's band is tank/healer, so a second DPS rotation is offered. */
|
|
815
|
+
hasDpsRotationProfile(): boolean;
|
|
816
|
+
/** The active spec override for rotation generation, or null when autodetecting from talents. */
|
|
817
|
+
rotationSpec(): string | null;
|
|
818
|
+
/** The spec the rotation is actually built for (override if set, else the detected primary tree). */
|
|
819
|
+
effectiveRotationSpec(): string;
|
|
820
|
+
// Set the rotation spec override, accepting exact tree names, case variants and aliases ("feral" →
|
|
821
|
+
// "Feral Combat"); null or unresolvable reverts to talent detection. Returns the rebuilt rotation.
|
|
822
|
+
setRotationSpec(spec: string | null): Rotation;
|
|
823
|
+
/** True when the player's hand-edited rotation is stale vs the recommended default (editor prompt). */
|
|
824
|
+
rotationNeedsRefresh(): boolean;
|
|
825
|
+
// S1: per-companion rotations for the editor's companion picker. Lazily seeds and persists the
|
|
826
|
+
// role-adapted class default; null when the id is not in the active squad.
|
|
827
|
+
companionRotation(id: string, profile?: RotationProfileId): Rotation | null;
|
|
828
|
+
/** Replace a companion's rotation (from the visual editor's companion tab). */
|
|
829
|
+
setCompanionRotation(id: string, rot: Rotation, profile?: RotationProfileId): ActionResult;
|
|
830
|
+
/** Discard edits: rebuild + persist the role-adapted default for this companion. */
|
|
831
|
+
resetCompanionRotation(id: string, profile?: RotationProfileId): Rotation | null;
|
|
832
|
+
// ---- named rotation profiles (player) ------------------------------------------------
|
|
833
|
+
/** Every named rotation this character owns, in display order, with the active one flagged. */
|
|
834
|
+
rotationProfiles(): Array<{ id: string; name: string; active: boolean }>;
|
|
835
|
+
// Add a rotation. `copyFromId` duplicates an existing one; `fromBand` builds the recommended list for a
|
|
836
|
+
// talent band (the template path); neither ⇒ a copy of the active one.
|
|
837
|
+
addRotationProfile(opts?: {
|
|
838
|
+
name?: string;
|
|
839
|
+
copyFromId?: string;
|
|
840
|
+
fromBand?: string | null;
|
|
841
|
+
/** Build the new list off this class's authored PVP band instead of the PvE one. */
|
|
842
|
+
mode?: 'pvp';
|
|
843
|
+
}): ActionResult<{ id: string; name: string }>;
|
|
844
|
+
/** True when a pvp band really covers this character's level AND tree — what gates `+ PvP`. */
|
|
845
|
+
hasPvpRotationBand(): boolean;
|
|
846
|
+
renameRotationProfile(id: string, name: string): ActionResult;
|
|
847
|
+
/** Delete a rotation. The last one is never deletable. */
|
|
848
|
+
deleteRotationProfile(id: string): ActionResult;
|
|
849
|
+
/** Make one the active rotation — what the auto-battler actually fights with. */
|
|
850
|
+
selectRotationProfile(id: string): ActionResult;
|
|
851
|
+
moveRotationProfile(from: number, to: number): ActionResult;
|
|
852
|
+
|
|
853
|
+
/** Switch a tank/healer companion between its role list and its DPS list. */
|
|
854
|
+
setCompanionRotationProfile(id: string, profile: RotationProfileId): ActionResult;
|
|
855
|
+
/** Which slot drives this companion right now. 'primary' for anyone without a second profile. */
|
|
856
|
+
companionRotationProfile(id: string): RotationProfileId;
|
|
857
|
+
/** True when this companion's band is a tank/healer tree, i.e. it has a second profile. */
|
|
858
|
+
companionHasDpsRotationProfile(id: string): boolean;
|
|
859
|
+
|
|
860
|
+
// ---- named rotation profiles (companions) — same surface as the player's ---------------
|
|
861
|
+
companionRotationProfiles(id: string): Array<{ id: string; name: string; active: boolean }>;
|
|
862
|
+
addCompanionRotationProfile(id: string, opts?: {
|
|
863
|
+
name?: string;
|
|
864
|
+
copyFromId?: string;
|
|
865
|
+
fromBand?: string | null;
|
|
866
|
+
/** Build the new list off this class's authored PVP band instead of the PvE one. */
|
|
867
|
+
mode?: 'pvp';
|
|
868
|
+
}): ActionResult<{ id: string; name: string }>;
|
|
869
|
+
/** Same question for a companion, at the level they fight at. */
|
|
870
|
+
companionHasPvpRotationBand(id: string): boolean;
|
|
871
|
+
renameCompanionRotationProfile(id: string, profileId: string, name: string): ActionResult;
|
|
872
|
+
deleteCompanionRotationProfile(id: string, profileId: string): ActionResult;
|
|
873
|
+
selectCompanionRotationProfile(id: string, profileId: string): ActionResult;
|
|
874
|
+
// Companion action bars for party takeover (lazy-seed + autofill when empty). Null when id is not in the
|
|
875
|
+
// active squad. Keys at fight time overlay the player's.
|
|
876
|
+
companionActionBars(id: string): import('../../domain/character/actionbar.ts').ActionBar[] | null;
|
|
877
|
+
/** Place a spell (or clear) on a companion bar slot. Spell must be in their kit. */
|
|
878
|
+
setCompanionActionSlot(id: string, bar: number, slot: number, spellId: number | null): ActionResult;
|
|
879
|
+
/** Place a bag consumable (or clear) on a companion bar slot — from THEIR bags. */
|
|
880
|
+
setCompanionItemActionSlot(id: string, bar: number, slot: number, entry: number | null): ActionResult;
|
|
881
|
+
/** Add an extra action bar on a companion (up to MAX_BARS). */
|
|
882
|
+
addCompanionActionBar(id: string): ActionResult;
|
|
883
|
+
/** Remove the last companion action bar (never the first). */
|
|
884
|
+
removeCompanionActionBar(id: string): ActionResult;
|
|
885
|
+
/** Reset companion bars to autofilled kit on a single bar. */
|
|
886
|
+
resetCompanionActionBars(id: string): ActionResult;
|
|
887
|
+
// Engine-ready group-fight bundle for the active squad: `allySpecs` in state.squad order plus
|
|
888
|
+
// index-aligned `allyActionProviders`. `targetEntry` selects per-creature rotation overrides.
|
|
889
|
+
squadBattleParty(targetEntry?: number): {
|
|
890
|
+
allySpecs: CombatantSpec[];
|
|
891
|
+
allyActionProviders: (AllyActionProvider | null)[];
|
|
892
|
+
/** Human companion ally index → pet ally index (rotation pet subject). */
|
|
893
|
+
allyPetIndex: (number | null)[];
|
|
894
|
+
};
|
|
895
|
+
// "Buff up" before a dungeon pull: every party member contributes its raid buffs, the best rank of
|
|
896
|
+
// each family lands on the party, and mage/warlock companions conjure into your bags. Idempotent.
|
|
897
|
+
applyPrePullBuffs(): { buffs: PlannedBuff[]; handouts: PlannedHandout[] };
|
|
898
|
+
// Re-coat every companion's open weapon hands between pulls (poisons, stones, oils). Returns how
|
|
899
|
+
// many coats landed. The zone-in buff-up is the only other caller and a coat runs 30 minutes.
|
|
900
|
+
refreshPartyWeaponCoats(): number;
|
|
901
|
+
/** The autopilot settings, defaulted if unset. */
|
|
902
|
+
autopilotConfig(): AutopilotConfig;
|
|
903
|
+
/** Replace the autopilot settings. */
|
|
904
|
+
setAutopilotConfig(cfg: AutopilotConfig): void;
|
|
905
|
+
/** Equipment helper config (auto vs suggest upgrades). */
|
|
906
|
+
equipmentHelperConfig(): EquipmentHelperConfig;
|
|
907
|
+
/** Replace equipment helper config. */
|
|
908
|
+
setEquipmentHelperConfig(cfg: EquipmentHelperConfig): void;
|
|
909
|
+
/** Effective auto-disenchant (global OR character). */
|
|
910
|
+
autoDisenchantConfig(): AutoDisenchantConfig;
|
|
911
|
+
/** Global auto-disenchant layer. */
|
|
912
|
+
globalAutoDisenchantConfig(): AutoDisenchantConfig;
|
|
913
|
+
/** This character's auto-disenchant layer. */
|
|
914
|
+
characterAutoDisenchantConfig(): AutoDisenchantConfig;
|
|
915
|
+
/** @deprecated Prefer setCharacterAutoDisenchantConfig / setGlobalAutoDisenchantConfig. */
|
|
916
|
+
setAutoDisenchantConfig(cfg: AutoDisenchantConfig): void;
|
|
917
|
+
setGlobalAutoDisenchantConfig(cfg: AutoDisenchantConfig): void;
|
|
918
|
+
setCharacterAutoDisenchantConfig(cfg: AutoDisenchantConfig): void;
|
|
919
|
+
/** Effective quality/auto layer (character if characterSpecific, else global). */
|
|
920
|
+
junkFilterConfig(): JunkFilterConfig;
|
|
921
|
+
/** Global junk filter (all characters). */
|
|
922
|
+
globalJunkFilterConfig(): JunkFilterConfig;
|
|
923
|
+
/** Replace global junk filter. */
|
|
924
|
+
setGlobalJunkFilterConfig(cfg: JunkFilterConfig): void;
|
|
925
|
+
/** This character's junk filter layer. */
|
|
926
|
+
characterJunkFilterConfig(): CharacterJunkFilterConfig;
|
|
927
|
+
/** Replace this character's junk filter layer. */
|
|
928
|
+
setCharacterJunkFilterConfig(cfg: CharacterJunkFilterConfig): void;
|
|
929
|
+
/** @deprecated Use setGlobalJunkFilterConfig / setCharacterJunkFilterConfig. Writes global. */
|
|
930
|
+
setJunkFilterConfig(cfg: JunkFilterConfig): void;
|
|
931
|
+
/** Auto-quest mine/herb + auto-skin take-list (default skip gray). */
|
|
932
|
+
gatherFilterConfig(): GatherFilterConfig;
|
|
933
|
+
setGatherFilterConfig(cfg: GatherFilterConfig): void;
|
|
934
|
+
// With the helper enabled in 'auto' mode, equip strict bag upgrades (StatCompare-weighted),
|
|
935
|
+
// skipping ones that fail equip. Always runs auto-disenchant after, then auto-sell/destroy.
|
|
936
|
+
autoEquipUpgrades(max?: number): number;
|
|
937
|
+
// Disenchant bagged non-upgrade gear up to the quality ceiling when a party enchanter has enough skill.
|
|
938
|
+
// Returns how many items were destroyed into materials.
|
|
939
|
+
autoDisenchantUpgrades(max?: number): number;
|
|
940
|
+
// Open every unlocked, non-quest bag container that has room to unpack (clams, sacks, bloated
|
|
941
|
+
// fish). Returns how many were opened. Runs at the head of the post-bag hook when enabled.
|
|
942
|
+
autoOpenContainers(max?: number): number;
|
|
943
|
+
// Auto-sell then auto-destroy bag junk under junkFilter (respects autoSell/autoDestroy flags). Returns
|
|
944
|
+
// counts of sold stacks units and destroyed units.
|
|
945
|
+
runAutoJunk(max?: number): { sold: number; destroyed: number; earned: number };
|
|
946
|
+
/** Greys instant-vendored because bags were full (clears the tally). */
|
|
947
|
+
takeOverflowSold(): { count: number; gold: number };
|
|
948
|
+
/** Bag stacks the current junk filter would sell (for vendor button + buyback snapshot). */
|
|
949
|
+
junkSellPreview(): Array<{ entry: number; count: number; unitSell: number }>;
|
|
950
|
+
/** The junk filter run over one companion's bags — the vendor's Companions tab preview. */
|
|
951
|
+
companionJunkSellPreview(id: string): Array<{ entry: number; count: number; unitSell: number }>;
|
|
952
|
+
/** Sell every junk-filter match out of one companion's bags. `sold` feeds the caller's buyback. */
|
|
953
|
+
sellCompanionJunk(id: string): ActionResult<{
|
|
954
|
+
earned: number;
|
|
955
|
+
count: number;
|
|
956
|
+
sold: Array<{ entry: number; qty: number; refundCopper: number }>;
|
|
957
|
+
}>;
|
|
958
|
+
/** Current upgrade suggestions (for suggest mode UI). Empty when disabled or none. Optional `inv` scores a probe (bags + pending loot); without it companions' unbound stacks are read too, `holderId` naming whose bags. */
|
|
959
|
+
suggestedEquipmentUpgrades(inv?: Inventory): Array<{ entry: number; slot: EquipSlot; randomPropertyId?: number; currentEntry?: number; delta: number; displaces?: EquipSlot[]; holderId?: string; holderName?: string }>;
|
|
960
|
+
/** Equip one suggestion at its own slot, taking it from the holding companion first when it is theirs. */
|
|
961
|
+
equipSuggestedUpgrade(itemEntry: number): ActionResult<{ slot: EquipSlot }>;
|
|
962
|
+
// Equip from bags. Optional `preferred` picks which multi-slot to fill/replace (finger1/2, trinket1/2,
|
|
963
|
+
// dual-wield MH|OH). When omitted, first free target wins.
|
|
964
|
+
equip(itemEntry: number, preferred?: EquipSlot): ActionResult<{ slot: EquipSlot }>;
|
|
965
|
+
unequip(slot: EquipSlot): ActionResult;
|
|
966
|
+
// Action bars (spell-per-slot + keybinds; used by the world HUD and combat)
|
|
967
|
+
/** Assign `spellId` (or null to clear both spell and item) to a bar/slot. De-dupes the spell across bars. */
|
|
968
|
+
setActionSlot(bar: number, slot: number, spellId: number | null): void;
|
|
969
|
+
// Assign a bag consumable `entry` (or null to clear both spell and item) to a bar/slot. De-dupes the item
|
|
970
|
+
// across bars; requires count > 0 in bags when placing.
|
|
971
|
+
setItemActionSlot(bar: number, slot: number, entry: number | null): void;
|
|
972
|
+
// Assign macro `macroId` (or null to clear the slot) to a bar/slot. De-dupes across bars. Refuses an id
|
|
973
|
+
// this character cannot see, so a hand-edited save or DOM cannot place a phantom button.
|
|
974
|
+
setMacroActionSlot(bar: number, slot: number, macroId: string | null): void;
|
|
975
|
+
// Outfitter (named gear sets — player + each companion). Wear is OOC only.
|
|
976
|
+
outfitterEnabled(): boolean;
|
|
977
|
+
outfitterState(owner?: import('../../domain/bots/outfitter.ts').OutfitOwnerId): import('../../domain/bots/outfitter.ts').OutfitterState;
|
|
978
|
+
ensureOutfitter(owner?: import('../../domain/bots/outfitter.ts').OutfitOwnerId): import('../../domain/bots/outfitter.ts').OutfitterState;
|
|
979
|
+
createOutfit(opts: {
|
|
980
|
+
owner?: import('../../domain/bots/outfitter.ts').OutfitOwnerId;
|
|
981
|
+
name?: string;
|
|
982
|
+
empty?: boolean;
|
|
983
|
+
statId?: import('../../domain/bots/outfitter.ts').OutfitStatId;
|
|
984
|
+
party?: boolean;
|
|
985
|
+
}): ActionResult<{ id: string; name: string }>;
|
|
986
|
+
renameOutfit(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string, name: string): ActionResult;
|
|
987
|
+
deleteOutfit(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string): ActionResult;
|
|
988
|
+
rebuildOutfit(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string): ActionResult;
|
|
989
|
+
setOutfitSlot(
|
|
990
|
+
owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId,
|
|
991
|
+
id: string,
|
|
992
|
+
slot: import('../../data/schema.ts').EquipSlot,
|
|
993
|
+
enabled: boolean,
|
|
994
|
+
): ActionResult;
|
|
995
|
+
setOutfitSlotsAll(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string, enable: boolean): ActionResult;
|
|
996
|
+
setOutfitDisabled(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string, disabled: boolean): ActionResult;
|
|
997
|
+
selectOutfit(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string | null): ActionResult;
|
|
998
|
+
wearOutfit(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string): OutfitWearResult;
|
|
999
|
+
unwearOutfit(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string): OutfitWearResult;
|
|
1000
|
+
toggleOutfit(owner: import('../../domain/bots/outfitter.ts').OutfitOwnerId, id: string): OutfitWearResult;
|
|
1001
|
+
wearOutfitByName(name: string, opts?: {
|
|
1002
|
+
owner?: import('../../domain/bots/outfitter.ts').OutfitOwnerId;
|
|
1003
|
+
party?: boolean;
|
|
1004
|
+
}): OutfitWearResult;
|
|
1005
|
+
generateOutfit(statId: import('../../domain/bots/outfitter.ts').OutfitStatId, opts?: {
|
|
1006
|
+
owner?: import('../../domain/bots/outfitter.ts').OutfitOwnerId;
|
|
1007
|
+
name?: string;
|
|
1008
|
+
party?: boolean;
|
|
1009
|
+
}): ActionResult<{ id: string; name: string }>;
|
|
1010
|
+
setOutfitActionSlot(bar: number, slot: number, name: string | null): void;
|
|
1011
|
+
/** Place a consumable on the raid bar. Player or any companion must hold it (or it is already on the bar). */
|
|
1012
|
+
setGlobalItemSlot(slot: number, entry: number | null): void;
|
|
1013
|
+
/** Place an outfit name on the raid bar (party wear on fire). */
|
|
1014
|
+
setGlobalOutfitSlot(slot: number, name: string | null): void;
|
|
1015
|
+
clearGlobalActionSlot(slot: number): void;
|
|
1016
|
+
/** Fire every filled raid-bar slot for the living raid. */
|
|
1017
|
+
fireGlobalActionBar(): { tried: number };
|
|
1018
|
+
fireGlobalActionSlot(slot: number): { tried: number };
|
|
1019
|
+
syncOutfitterSpecials(): void;
|
|
1020
|
+
runOutfitterCommand(raw: string, opts?: { party?: boolean }): OutfitWearResult;
|
|
1021
|
+
// Macros (the MacroFrame). `character` lives on the save; `account` is shared by every character.
|
|
1022
|
+
/** Macros in one scope, or (no argument) character macros followed by account macros. */
|
|
1023
|
+
macros(scope?: MacroScope): MacroDef[];
|
|
1024
|
+
macroById(id: string): MacroDef | null;
|
|
1025
|
+
/** Name lookup for `{Other}` invocation and #showtooltip. Character macros win a tie. */
|
|
1026
|
+
macroByName(name: string): MacroDef | null;
|
|
1027
|
+
/** Create (no id) or overwrite (existing id). Normalizes name/icon/body; enforces the 18 cap. */
|
|
1028
|
+
saveMacro(
|
|
1029
|
+
scope: MacroScope,
|
|
1030
|
+
macro: { id?: string; name: string; icon?: string; body?: string },
|
|
1031
|
+
): ActionResult<{ id: string }>;
|
|
1032
|
+
/** Delete a macro AND clear it from every action bar / form page. */
|
|
1033
|
+
deleteMacro(id: string): ActionResult;
|
|
1034
|
+
/** Bind `key` (or null to clear) to a bar/slot. Keys are unique across all bars. */
|
|
1035
|
+
setActionKey(bar: number, slot: number, key: string | null): void;
|
|
1036
|
+
/** Add another action bar (up to the max). */
|
|
1037
|
+
addActionBar(): ActionResult;
|
|
1038
|
+
/** Remove the last action bar (never the first). */
|
|
1039
|
+
removeActionBar(): ActionResult;
|
|
1040
|
+
// Train a riding rank at a zone riding trainer. `rankOrSpellId` is a rank (75|150), a skill-grant
|
|
1041
|
+
// spell id or a trainer wrapper id. Riding NPCs sit in zone.ridingTrainers, not `trainers`.
|
|
1042
|
+
trainRiding(trainerNpcEntry: number, rankOrSpellId: number): ActionResult<{ rank: number; spent: number }>;
|
|
1043
|
+
/** Use a mount item from bags (does not consume the item). */
|
|
1044
|
+
useMount(itemEntry: number): ActionResult;
|
|
1045
|
+
/** Dismount if mounted. */
|
|
1046
|
+
dismount(): ActionResult;
|
|
1047
|
+
// Professions (Phase 4)
|
|
1048
|
+
/** Train (or rank up) a profession at the given profession trainer. */
|
|
1049
|
+
learnProfession(profTrainerEntry: number): ActionResult;
|
|
1050
|
+
// Unlearn a trained profession (skill + its recipes/formulas). Free; frees a primary slot. Classic
|
|
1051
|
+
// skills-panel unlearn — irreversible.
|
|
1052
|
+
unlearnProfession(skill: SkillLine): ActionResult;
|
|
1053
|
+
// ScriptDev npc_prof_blacksmith / npc_prof_leather gossip hello for specialization learn/unlearn. Pure
|
|
1054
|
+
// menu surface; select via {@link selectProfessionSpec}. Cite: npc_professions.cpp GossipHello_*.
|
|
1055
|
+
professionSpecGossip(trainerEntry: number): {
|
|
1056
|
+
script: 'npc_prof_blacksmith' | 'npc_prof_leather' | null;
|
|
1057
|
+
items: Array<{ kind: string; action: number; costCopper?: number; cite: string }>;
|
|
1058
|
+
cite: string;
|
|
1059
|
+
};
|
|
1060
|
+
// Apply a specialization gossip select (learn / unlearn / confirm), mutating the spellbook and
|
|
1061
|
+
// gold. Cite: npc_professions.cpp SendActionMenu_*; LEARN_SPELL EffectTriggerSpell.
|
|
1062
|
+
selectProfessionSpec(
|
|
1063
|
+
trainerEntry: number,
|
|
1064
|
+
opts: { sender: number; action: number; equippedOk?: boolean },
|
|
1065
|
+
): ActionResult<{
|
|
1066
|
+
phase: string;
|
|
1067
|
+
/** IR kind consumed by the host (`learn_armor`, `trade`, …). */
|
|
1068
|
+
kind?: string;
|
|
1069
|
+
grantedSpellId?: number;
|
|
1070
|
+
removedSpellId?: number;
|
|
1071
|
+
confirmCostCopper?: number;
|
|
1072
|
+
knownSpecializationSpells: number[];
|
|
1073
|
+
blacksmithUnlearnGap?: boolean;
|
|
1074
|
+
/** Scripted GOSSIP_ACTION_TRAIN → open trainer list (SEND_TRAINERLIST). */
|
|
1075
|
+
openTrainer?: boolean;
|
|
1076
|
+
/** Scripted GOSSIP_ACTION_TRADE → open vendor list (SEND_VENDORLIST). */
|
|
1077
|
+
openVendor?: boolean;
|
|
1078
|
+
}>;
|
|
1079
|
+
// ScriptDev npc_innkeeper gossip hello (What to do / Trick or Treat). Cite: npcs_special.cpp:771-788
|
|
1080
|
+
// GossipHello_npc_innkeeper.
|
|
1081
|
+
innkeeperGossip(nowMs?: number): {
|
|
1082
|
+
items: Array<{ kind: string; action: number; cite: string }>;
|
|
1083
|
+
cite: string;
|
|
1084
|
+
holidayHallowsEnd: boolean;
|
|
1085
|
+
};
|
|
1086
|
+
// Apply innkeeper gossip select — what_to_do text or Trick or Treat cast. Cite: npcs_special.cpp:791-811
|
|
1087
|
+
// GossipSelect_npc_innkeeper.
|
|
1088
|
+
selectInnkeeperGossip(
|
|
1089
|
+
action: number,
|
|
1090
|
+
nowMs?: number,
|
|
1091
|
+
): ActionResult<{
|
|
1092
|
+
phase: string;
|
|
1093
|
+
textId?: number;
|
|
1094
|
+
castSpellId?: number;
|
|
1095
|
+
closeMenu?: boolean;
|
|
1096
|
+
/** SEND_GOSSIP_MENU body for what_to_do (TEXT_ID_WHAT_TO_DO). */
|
|
1097
|
+
flavor?: string;
|
|
1098
|
+
}>;
|
|
1099
|
+
// Free apprentice starter recipes (orange≤1 trainer) for already-trained professions. Idempotent repair
|
|
1100
|
+
// for saves trained before auto-grant on learnProfession.
|
|
1101
|
+
ensureProfessionStarters(): ActionResult<{ granted: boolean }>;
|
|
1102
|
+
/** Learn a recipe (from a trainer listing). */
|
|
1103
|
+
learnRecipe(recipeId: number, trainerEntry?: number): ActionResult;
|
|
1104
|
+
|
|
1105
|
+
// Guide-screen test grants (devGrant.ts): no gate, no trainer, no cost. Scaffolding.
|
|
1106
|
+
/** Put `qty` of an item in the bags, honouring bag space, unique and MaxCount. */
|
|
1107
|
+
devGrantItem(entry: number, qty?: number): ActionResult<{ added: number }>;
|
|
1108
|
+
/** Accept if needed, satisfy every objective, then turn the quest in for its rewards. */
|
|
1109
|
+
devCompleteQuest(entry: number): ActionResult<{ xp: number; money: number }>;
|
|
1110
|
+
/** Train a profession line straight to its highest rank cap; `recipes` also learns every recipe. */
|
|
1111
|
+
devLearnProfession(skill: SkillLine, opts?: { recipes?: boolean }): ActionResult<{ cap: number; recipes: number }>;
|
|
1112
|
+
/** Learn one recipe free, skipping the trainer and the orange-skill gate. */
|
|
1113
|
+
devLearnRecipe(recipeId: number): ActionResult;
|
|
1114
|
+
/** Learn a recipe by USING a recipe item (Plans:/Pattern:/…) from bags - consumes the item. */
|
|
1115
|
+
learnRecipeFromItem(itemEntry: number): ActionResult<{ recipeId: number; name: string }>;
|
|
1116
|
+
// Teach a companion a recipe from a Plans/Pattern/… item in YOUR bags (consumes one). Companion must have
|
|
1117
|
+
// the profession; drop recipes are never auto-granted.
|
|
1118
|
+
learnRecipeFromItemOnCompanion(
|
|
1119
|
+
companionId: string,
|
|
1120
|
+
itemEntry: number,
|
|
1121
|
+
): ActionResult<{ recipeId: number; name: string }>;
|
|
1122
|
+
/** Teach a companion an enchant formula from a Formula: item in YOUR bags (consumes one). */
|
|
1123
|
+
learnEnchantFromItemOnCompanion(
|
|
1124
|
+
companionId: string,
|
|
1125
|
+
itemEntry: number,
|
|
1126
|
+
): ActionResult<{ enchantId: number; name: string }>;
|
|
1127
|
+
// Read a class book / tome / codex / libram ON a companion, consuming one from YOUR bags. Gated by
|
|
1128
|
+
// the item's AllowableClass + RequiredLevel and the taught spell's reqLevel against THEIR level.
|
|
1129
|
+
learnSpellFromItemOnCompanion(
|
|
1130
|
+
companionId: string,
|
|
1131
|
+
itemEntry: number,
|
|
1132
|
+
): ActionResult<{ spell: number; name: string }>;
|
|
1133
|
+
// Read a pet-training book ON a companion (warlock Grimoire, hunter pet tome) - consumes one from YOUR
|
|
1134
|
+
// bags. The rank is character-wide on them, so a re-summoned pet keeps it.
|
|
1135
|
+
learnPetSpellFromItemOnCompanion(
|
|
1136
|
+
companionId: string,
|
|
1137
|
+
itemEntry: number,
|
|
1138
|
+
): ActionResult<{ spell: number; name: string }>;
|
|
1139
|
+
// Everything the party can do with a companion's quests where it is standing right now — an
|
|
1140
|
+
// item-started accept out of their own bags, or a completed turn-in. Status is per body.
|
|
1141
|
+
companionQuestOffers(companionId?: string): CompanionQuestOffer[];
|
|
1142
|
+
/** Put a quest in ONE companion's log, gated by their level, class, race and standings. */
|
|
1143
|
+
acceptCompanionQuest(companionId: string, entry: number): ActionResult;
|
|
1144
|
+
// Hand in a companion's completed quest. Objective items leave THEIR bags; reward items,
|
|
1145
|
+
// reputation, XP and rewSpells land on them, and the money pays you.
|
|
1146
|
+
turnInCompanionQuest(
|
|
1147
|
+
companionId: string,
|
|
1148
|
+
entry: number,
|
|
1149
|
+
rewardChoice?: number,
|
|
1150
|
+
): ActionResult<{ xp: number; money: number; items: { item: number; count: number }[]; rep: { faction: number; delta: number }[]; leveledTo: number[] }>;
|
|
1151
|
+
/** Drop a quest from a companion's log (abandon). */
|
|
1152
|
+
abandonCompanionQuest(companionId: string, entry: number): ActionResult;
|
|
1153
|
+
// Raise a profession one tier by reading a tier book (Expert Cookbook → Expert Cooking). Free,
|
|
1154
|
+
// consumes the book, and refuses when the prior tier is untrained. See itemTeaches.ts.
|
|
1155
|
+
learnProfessionRankFromItem(itemEntry: number): ActionResult<{ skill: SkillLine; name: string }>;
|
|
1156
|
+
// Harvest a gather node in the current zone. `nowMs` drives depletion: a node holds a few charges then
|
|
1157
|
+
// respawns after a cooldown, so a spent node refuses until it's back.
|
|
1158
|
+
gather(nodeId: number, nowMs?: number, opts?: LootHoldOpts): ActionResult<{ yielded: LootDrop[]; skillUp?: number; workedBy?: string; depleted: boolean; chargesLeft: number; respawnMs: number; held?: PendingLoot }>;
|
|
1159
|
+
/** Whether a node can be harvested right now (skill/tool/depletion), for the UI. */
|
|
1160
|
+
gatherStatus(nodeId: number, nowMs: number): { ok: boolean; reason?: string; respawnMs: number; chargesLeft: number };
|
|
1161
|
+
/** Skin the current skinnable corpse, if any. */
|
|
1162
|
+
skin(opts?: LootHoldOpts): ActionResult<{ yielded: LootDrop[]; skillUp?: number; workedBy?: string; held?: PendingLoot }>;
|
|
1163
|
+
// Pick Pocket (921) a living creature; rogue + stealth. Loot id from `creature.pickpocketLootId`
|
|
1164
|
+
// else `opts`. A resisted cast returns `{ ok: false, aggro: true }` — the pocket is not spent, and
|
|
1165
|
+
// the caller decides whether the mob turns on you. Cite: SpellEffects.cpp:2673 normal spell resist.
|
|
1166
|
+
pickPocket(
|
|
1167
|
+
creatureEntry: number,
|
|
1168
|
+
opts?: { pickpocketLootId?: number; nowMs?: number },
|
|
1169
|
+
): { ok: true; drops: LootDrop[]; goldCopper?: number; aggro?: boolean }
|
|
1170
|
+
| { ok: false; reason: string; aggro?: boolean };
|
|
1171
|
+
// Use a world GameObject (quest node, chest, locked container, questgiver): checks key/lock,
|
|
1172
|
+
// advances objectTargets, yields loot. `opts` may be LootHoldOpts or a bare nowMs (KI-807).
|
|
1173
|
+
interactObject(objectEntry: number, opts?: LootHoldOpts | number): ActionResult<{
|
|
1174
|
+
yielded: LootDrop[];
|
|
1175
|
+
/** FO2: quest entries this GO can start for the player right now. */
|
|
1176
|
+
questsOffered?: number[];
|
|
1177
|
+
/** FO2: complete quest entries this GO can turn in right now. */
|
|
1178
|
+
questsTurnIn?: number[];
|
|
1179
|
+
// FO2: active incomplete quests this GO would finish — honest in-progress feedback, never listed
|
|
1180
|
+
// in questsTurnIn. Cite: QuestHandler.cpp getDialogStatus DIALOG_STATUS_INCOMPLETE.
|
|
1181
|
+
questsIncomplete?: number[];
|
|
1182
|
+
/** Key item entry consumed to open a LOCK_KEY_ITEM lock, when one was used. */
|
|
1183
|
+
keyUsed?: number;
|
|
1184
|
+
// Herb/mine GO open: new profession skill value when a skill-up landed (same path as gather() / CMaNGOS
|
|
1185
|
+
// EffectOpenLock → UpdateGatherSkill). KI-645.
|
|
1186
|
+
skillUp?: number;
|
|
1187
|
+
// The party/raid companion whose skill worked the node, when it was not the player's. The skill point
|
|
1188
|
+
// went to them. Cite: domain/professions/partyWork.ts pickPartyWorker.
|
|
1189
|
+
workedBy?: string;
|
|
1190
|
+
/** With `{ hold: true }`: the drops are HELD in the loot container, not in the bags. */
|
|
1191
|
+
held?: PendingLoot;
|
|
1192
|
+
/** Type-11 tram / type-15 boat-zep: the player stepped aboard; the depart follows on arrival. */
|
|
1193
|
+
boarded?: boolean;
|
|
1194
|
+
/** Type-11 tram / type-15 boat-zep: destination zone after board. */
|
|
1195
|
+
destination?: string;
|
|
1196
|
+
/** Transport hop length (wait + crossing) in ms from the travel/transports bake. */
|
|
1197
|
+
travelMs?: number;
|
|
1198
|
+
/** TEXT Use: page_text id the host must open. Cite: GameObject.h:159 text.pageID. */
|
|
1199
|
+
pageId?: number;
|
|
1200
|
+
/** MAILBOX Use: host opened the inbox (MailHandler.cpp:536–545 HandleGetMailList). */
|
|
1201
|
+
mailboxOpen?: boolean;
|
|
1202
|
+
/** Waiting deliveries listed at that open (state.mailbox). */
|
|
1203
|
+
mailbox?: Mailbox;
|
|
1204
|
+
}>;
|
|
1205
|
+
// Open a bagged container (bag/box/clam/crate/lockbox): roll its item_loot_template into the bags
|
|
1206
|
+
// and consume it, refusing with the client's own reason. Cite: SpellHandler.cpp:162.
|
|
1207
|
+
openContainerItem(slotIndex: number, opts?: LootHoldOpts): ActionResult<{
|
|
1208
|
+
yielded: LootDrop[];
|
|
1209
|
+
/** Rolled but undeliverable because the bags were full (direct-to-bags path only). */
|
|
1210
|
+
spilled: LootDrop[];
|
|
1211
|
+
/** Key item entry consumed to open a locked container, when one was used. */
|
|
1212
|
+
keyUsed?: number;
|
|
1213
|
+
/** New Lockpicking value when the player picked it and trained a point. */
|
|
1214
|
+
skillUp?: number;
|
|
1215
|
+
/** The party/raid rogue who picked it, when it was not the player. */
|
|
1216
|
+
openedBy?: string;
|
|
1217
|
+
/** With `{ hold: true }`: the contents are HELD, not in the bags — take them via takeLoot. */
|
|
1218
|
+
held?: PendingLoot;
|
|
1219
|
+
}>;
|
|
1220
|
+
|
|
1221
|
+
// ---- The loot container (WoW's LootFrame) -------------------------------------------------
|
|
1222
|
+
// Put a haul in by hand; anything still held from a previous source is collected into the bags.
|
|
1223
|
+
openLoot(info: LootSourceInfo, drops: readonly LootDrop[], copper?: number): PendingLoot;
|
|
1224
|
+
/** What the open container is still holding, or null. */
|
|
1225
|
+
pendingLoot(): PendingLoot | null;
|
|
1226
|
+
/** Take one held row into the bags (`emptied` when that was the last thing in there). */
|
|
1227
|
+
takeLoot(index: number): ActionResult<{
|
|
1228
|
+
item: number; count: number; remaining: number; emptied: boolean; mailed?: boolean; sold?: boolean; destroyed?: boolean;
|
|
1229
|
+
}>;
|
|
1230
|
+
/** Take the held money row. */
|
|
1231
|
+
takeLootMoney(): ActionResult<{ copper: number; emptied: boolean }>;
|
|
1232
|
+
/** Take everything that fits; rows that do not fit stay held and are counted in `remaining`. */
|
|
1233
|
+
takeAllLoot(): ActionResult<{
|
|
1234
|
+
taken: Array<{ item: number; count: number }>; copper: number; remaining: number; emptied: boolean;
|
|
1235
|
+
}>;
|
|
1236
|
+
// Close the window. Outdoor/corpse/node: discard leftovers. Inventory container: keep remainder held (bag
|
|
1237
|
+
// contents must not vanish).
|
|
1238
|
+
closeLoot(): ActionResult;
|
|
1239
|
+
/** Craft a known recipe, consuming reagents and rolling a skill-up. */
|
|
1240
|
+
craft(recipeId: number): ActionResult<{ produced: LootDrop; skillUp?: number; spent?: number }>;
|
|
1241
|
+
/** Craft a known recipe repeatedly - as many as reagents, the purse for vendor goods and bag space allow. */
|
|
1242
|
+
craftAll(recipeId: number): ActionResult<{ crafted: number; produced: LootDrop; skillBefore?: number; skillAfter?: number; spent?: number }>;
|
|
1243
|
+
// Enchanting
|
|
1244
|
+
/** Learn an enchant formula (from an enchanting-trainer listing). */
|
|
1245
|
+
learnEnchant(enchantId: number, trainerEntry?: number): ActionResult;
|
|
1246
|
+
/** Learn an enchant formula by USING a Formula: item from bags - consumes the item. */
|
|
1247
|
+
learnEnchantFromItem(itemEntry: number): ActionResult<{ enchantId: number; name: string }>;
|
|
1248
|
+
// Apply a known enchant to the item in `slot`, consuming reagents (needs a rod of its tier). Optional
|
|
1249
|
+
// `companionId` targets a party companion's paperdoll instead of yours.
|
|
1250
|
+
enchantItem(enchantId: number, slot: EquipSlot, companionId?: string): ActionResult<{ skillUp?: number }>;
|
|
1251
|
+
// Disenchant a bagged item into materials, rolling a skill-up. The worker is the group's — you,
|
|
1252
|
+
// then any roster enchanter covering the band. Mats land in YOUR bags; `workerId` pins one.
|
|
1253
|
+
disenchant(
|
|
1254
|
+
itemEntry: number,
|
|
1255
|
+
opts?: { workerId?: string },
|
|
1256
|
+
): ActionResult<{ yielded: LootDrop[]; skillUp?: number; worker?: string }>;
|
|
1257
|
+
// Disenchant a SPECIFIC stack by slot index, not the first stack of that entry: two "Archer's
|
|
1258
|
+
// Jerkin" with different suffixes are different items. Same contract as bankDepositStack.
|
|
1259
|
+
disenchantStack(
|
|
1260
|
+
slotIndex: number,
|
|
1261
|
+
opts?: { workerId?: string },
|
|
1262
|
+
): ActionResult<{ yielded: LootDrop[]; skillUp?: number; worker?: string }>;
|
|
1263
|
+
// Disenchant a stack out of a COMPANION's bags. Soulbound gear cannot come to you, but the mats
|
|
1264
|
+
// it yields carry no bind, so the item breaks down where it lies and the dust lands in your bags.
|
|
1265
|
+
disenchantCompanionBagStack(
|
|
1266
|
+
id: string,
|
|
1267
|
+
slotIndex: number,
|
|
1268
|
+
opts?: { workerId?: string },
|
|
1269
|
+
): ActionResult<{ yielded: LootDrop[]; skillUp?: number; worker?: string }>;
|
|
1270
|
+
/** Move items between the backpack and the bank. */
|
|
1271
|
+
bankDeposit(itemEntry: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1272
|
+
bankWithdraw(itemEntry: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1273
|
+
/** Move a *specific stack* (by its slot index in the array) between backpack and bank.
|
|
1274
|
+
* Default qty moves the entire chosen stack (the tap behavior). */
|
|
1275
|
+
bankDepositStack(slotIndex: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1276
|
+
bankWithdrawStack(slotIndex: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1277
|
+
/** Purchase the next bank bag slot (escalating gold cost, WoW-style). */
|
|
1278
|
+
buyBankBagSlot(): ActionResult<{ spent: number }>;
|
|
1279
|
+
/** Slot a bag from the bags into a purchased bank bag slot (grows bank capacity). */
|
|
1280
|
+
equipBankBag(itemEntry: number, slotIndex: number): ActionResult;
|
|
1281
|
+
/** Remove the bag in a bank bag slot, returning it to the bags. */
|
|
1282
|
+
unequipBankBag(slotIndex: number): ActionResult;
|
|
1283
|
+
// Step into a dungeon's portal, beginning a fresh run (level- and lockout-gated). Three DR axes,
|
|
1284
|
+
// never HP multipliers: `routeDensity`, `pullFusion`, and rest via GameState.squadStrategy.
|
|
1285
|
+
enterInstance(
|
|
1286
|
+
dungeonId: string,
|
|
1287
|
+
nowMs?: number,
|
|
1288
|
+
opts?: {
|
|
1289
|
+
routeDensity?: RouteDensity;
|
|
1290
|
+
pullFusion?: PullFusion;
|
|
1291
|
+
// Bring the bench in as a RAID, up to `instance_template.maxPlayers - 1`. Off by default:
|
|
1292
|
+
// your party is your party, and a sourced 10-man used to drag everyone you owned along.
|
|
1293
|
+
asRaid?: boolean;
|
|
1294
|
+
/** Alternate world door (areatrigger_teleport id) on this InstanceDef. */
|
|
1295
|
+
entranceTriggerId?: number;
|
|
1296
|
+
},
|
|
1297
|
+
): ActionResult;
|
|
1298
|
+
// D1 auto-first dungeon mode: auto-resolve every remaining encounter in order, resting to full
|
|
1299
|
+
// between pulls and stopping on a wipe. `keepLogs` attaches each pull's events for replay.
|
|
1300
|
+
runFullDungeon(opts?: { keepLogs?: boolean }): ActionResult<{ summary: DungeonRunSummary }>;
|
|
1301
|
+
// D2 squad (dev/test convenience): recruit a synthetic companion of `cls`, outside the world pool.
|
|
1302
|
+
// Level-syncs to the player like a v19 companion.
|
|
1303
|
+
recruitCompanion(
|
|
1304
|
+
cls: number,
|
|
1305
|
+
role: SquadRole,
|
|
1306
|
+
// Kit profile, the same axis as an inn hire (botGear GEAR_PROFILES). Omitted uses the default;
|
|
1307
|
+
// without it the dev recruiter shipped NAKED companions. Cite: docs/archive/raids/PLAN.md §7.8.
|
|
1308
|
+
gearProfile?: GearProfile,
|
|
1309
|
+
): ActionResult<{ id: string; name: string; benched?: boolean }>;
|
|
1310
|
+
// D4: dismiss to the ROSTER, not oblivion - the bot keeps its gear, level and XP (their loot stays
|
|
1311
|
+
// theirs) and can be re-hired at any inn.
|
|
1312
|
+
dismissCompanion(id: string): ActionResult;
|
|
1313
|
+
// Seat a benched companion into the 5-man party. Already owned — no inn, no gold. Party-full still
|
|
1314
|
+
// refuses (bench someone first). Combat refuses; the instance starting screen does not.
|
|
1315
|
+
activateCompanion(id: string): ActionResult<{ id: string; name: string }>;
|
|
1316
|
+
/** The player's own role for squad runs (report flavor + grades). */
|
|
1317
|
+
setSquadRole(role: SquadRole): ActionResult;
|
|
1318
|
+
/** D3 group-leader strategy toggle (careful/aggressive run pacing). */
|
|
1319
|
+
setSquadStrategy(strategy: SquadStrategy): ActionResult;
|
|
1320
|
+
// PallyPower tab. The board is derived (roster x class), the three setters write the overrides;
|
|
1321
|
+
// a null cell / aura is "back to auto". Cite: engine/game/paladinBoard.ts.
|
|
1322
|
+
paladinAssignments(): import('../../domain/rotation/paladinBuffs.ts').PaladinAssignments;
|
|
1323
|
+
paladinBoard(): import('./paladinBoard.ts').PaladinBoard;
|
|
1324
|
+
setPaladinBlessing(
|
|
1325
|
+
paladinKey: string,
|
|
1326
|
+
col: string,
|
|
1327
|
+
cell: import('../../domain/rotation/paladinBuffs.ts').BlessingCell | null,
|
|
1328
|
+
): ActionResult<{ board: import('./paladinBoard.ts').PaladinBoard }>;
|
|
1329
|
+
setPaladinAura(
|
|
1330
|
+
paladinKey: string,
|
|
1331
|
+
aura: import('../../domain/rotation/paladinBuffs.ts').PaladinAura | null,
|
|
1332
|
+
): ActionResult<{ board: import('./paladinBoard.ts').PaladinBoard }>;
|
|
1333
|
+
// A wheel notch or a swipe over one icon: `dir` is +1 down the cycle, -1 up it.
|
|
1334
|
+
stepPaladinBlessing(
|
|
1335
|
+
paladinKey: string,
|
|
1336
|
+
col: string,
|
|
1337
|
+
dir: 1 | -1,
|
|
1338
|
+
): ActionResult<{ board: import('./paladinBoard.ts').PaladinBoard }>;
|
|
1339
|
+
stepPaladinAura(
|
|
1340
|
+
paladinKey: string,
|
|
1341
|
+
dir: 1 | -1,
|
|
1342
|
+
): ActionResult<{ board: import('./paladinBoard.ts').PaladinBoard }>;
|
|
1343
|
+
// "Auto sort": write every cell at once — the sourced chain per column, and an improved family
|
|
1344
|
+
// handed to the paladin that took the talent. Refuses with no paladin in the party.
|
|
1345
|
+
autoSortPaladinAssignments(): ActionResult<{ board: import('./paladinBoard.ts').PaladinBoard }>;
|
|
1346
|
+
clearPaladinAssignments(): ActionResult<{ board: import('./paladinBoard.ts').PaladinBoard }>;
|
|
1347
|
+
// Cast what the board now says, skipping anything a body already carries from that paladin, and
|
|
1348
|
+
// re-author every paladin's keep-up rows. Returns the chips cast. Called when the grid changes.
|
|
1349
|
+
refreshPaladinBuffs(): number;
|
|
1350
|
+
// S4C: per-companion AoE ↔ single-target knob (`auto` | `aoe` | `single`). Mutates the live companion
|
|
1351
|
+
// object so an open fight's action provider re-reads next GCD.
|
|
1352
|
+
setCompanionAoeMode(id: string, mode: CompanionAoeMode): ActionResult;
|
|
1353
|
+
/** S4C: per-companion off-heal toggle (hybrid DPS emergency heals). Same live-object semantics. */
|
|
1354
|
+
setCompanionOffHeal(id: string, on: boolean): ActionResult;
|
|
1355
|
+
// ICH4: per-companion XP lock. When true, outdoor/dungeon XP grants no-op. Free toggle (design §3.4).
|
|
1356
|
+
// Missing on legacy companions → treated as unlocked.
|
|
1357
|
+
setCompanionXpLocked(id: string, locked: boolean): ActionResult;
|
|
1358
|
+
/** S4C: party-wide shortcut — set every companion's aoeMode (e.g. "everyone AoE"). */
|
|
1359
|
+
setAllCompanionsAoeMode(mode: CompanionAoeMode): ActionResult;
|
|
1360
|
+
// Gear the bot fast: auto-equip strict upgrades from its OWN bags first, then from yours (an item taken
|
|
1361
|
+
// from your bags becomes the bot's).
|
|
1362
|
+
equipCompanionBest(id: string): ActionResult<{ equipped: number }>;
|
|
1363
|
+
// The innkeeper in the CURRENT world zone (first of zone.innkeepers); undefined inside instances.
|
|
1364
|
+
// Fail-open before the ETL lands: a settlement offers a synthetic `{ entry: 0 }` innkeeper.
|
|
1365
|
+
innkeeperHere(): { entry: number; name: string } | undefined;
|
|
1366
|
+
// D4 world pool: the inn's hire slate — same-faction bots within ±2 levels (the window widens
|
|
1367
|
+
// when few match), each with a premade spec and spawn gear. Squad and roster bots are excluded.
|
|
1368
|
+
innCandidates(): InnCandidate[];
|
|
1369
|
+
// DEV: build a raid-shaped test roster for `dungeonId` from its tier template — free, level 60,
|
|
1370
|
+
// role-matched premades, kept in `state.raidRoster`. `tier` overrides the raid's entry tier.
|
|
1371
|
+
buildRaidRoster(opts: { dungeonId: string; tier?: RaidTierId }): ActionResult<{
|
|
1372
|
+
dungeonId: string;
|
|
1373
|
+
name: string;
|
|
1374
|
+
tier: RaidTierId;
|
|
1375
|
+
tierLabel: string;
|
|
1376
|
+
size: number;
|
|
1377
|
+
built: number;
|
|
1378
|
+
comp: string;
|
|
1379
|
+
gearScore: number;
|
|
1380
|
+
}>;
|
|
1381
|
+
/** DEV: drop the raid test roster. Never touches squad or botRoster. */
|
|
1382
|
+
clearRaidRoster(): ActionResult<{ cleared: number }>;
|
|
1383
|
+
// Who walks into `dungeonId` from the companions you own. Empty `ids` clears the pick and the
|
|
1384
|
+
// door falls back to auto. Does not require an inn — this is seating, not a re-hire.
|
|
1385
|
+
setInstanceRoster(dungeonId: string, ids: readonly string[]): ActionResult<{
|
|
1386
|
+
dungeonId: string;
|
|
1387
|
+
picked: number;
|
|
1388
|
+
cap: number;
|
|
1389
|
+
}>;
|
|
1390
|
+
/** Match owned companions to this instance's template (or a 5-man quota). UBRS keeps a mage. */
|
|
1391
|
+
fillInstanceRoster(dungeonId: string): ActionResult<{
|
|
1392
|
+
dungeonId: string;
|
|
1393
|
+
picked: number;
|
|
1394
|
+
cap: number;
|
|
1395
|
+
mage: boolean;
|
|
1396
|
+
}>;
|
|
1397
|
+
/** Drop the hand-picked lineup. The door goes back to auto. */
|
|
1398
|
+
clearInstanceRoster(): ActionResult<{ cleared: number }>;
|
|
1399
|
+
// Raid group for the next 10/20/40-man. Empty `ids` is a real pick. Does not require an inn — seating,
|
|
1400
|
+
// same as `setInstanceRoster`.
|
|
1401
|
+
setRaidLineup(size: 10 | 20 | 40, ids: readonly string[]): ActionResult<{
|
|
1402
|
+
size: 10 | 20 | 40;
|
|
1403
|
+
picked: number;
|
|
1404
|
+
cap: number;
|
|
1405
|
+
}>;
|
|
1406
|
+
/** Best tank / healer / damage from what you own, up to this raid size. */
|
|
1407
|
+
fillRaidLineup(size: 10 | 20 | 40): ActionResult<{
|
|
1408
|
+
size: 10 | 20 | 40;
|
|
1409
|
+
picked: number;
|
|
1410
|
+
cap: number;
|
|
1411
|
+
}>;
|
|
1412
|
+
/** Drop the raid group. Enter-as-raid goes back to auto-fill. */
|
|
1413
|
+
clearRaidLineup(): ActionResult<{ cleared: number }>;
|
|
1414
|
+
/** DEV: what `state.raidRoster` currently holds, for the UI read-out. */
|
|
1415
|
+
raidRosterInfo(): {
|
|
1416
|
+
dungeonId: string;
|
|
1417
|
+
name: string;
|
|
1418
|
+
tier: RaidTierId;
|
|
1419
|
+
tierLabel: string;
|
|
1420
|
+
size: number;
|
|
1421
|
+
built: number;
|
|
1422
|
+
comp: string;
|
|
1423
|
+
gearScore: number;
|
|
1424
|
+
levels: { min: number; max: number };
|
|
1425
|
+
} | null;
|
|
1426
|
+
// Permanently let companions go — the only path that REMOVES them, where `dismissCompanion` only
|
|
1427
|
+
// benches. Refunds each hire price. Pass `ids`, or `maxLevel` to sweep everyone at or below it.
|
|
1428
|
+
releaseCompanions(opts: { ids?: readonly string[]; maxLevel?: number }): ActionResult<{
|
|
1429
|
+
released: number;
|
|
1430
|
+
refundCopper: number;
|
|
1431
|
+
names: string[];
|
|
1432
|
+
}>;
|
|
1433
|
+
// Hire search across the whole same-faction population. Returns [] when `filters` narrows nothing — the
|
|
1434
|
+
// caller renders "choose filters, then search", never a wall of 2500 faces.
|
|
1435
|
+
searchInnCandidates(filters: BotSearchFilters): InnCandidate[];
|
|
1436
|
+
// D4 / ICH2: hire a bot. A slate bot joins at ITS level in its spawn gear and pays
|
|
1437
|
+
// hireCostCopper; a roster bot re-joins free. A full party benches the hire rather than refusing.
|
|
1438
|
+
hireCandidate(
|
|
1439
|
+
botId: string,
|
|
1440
|
+
role: SquadRole,
|
|
1441
|
+
): ActionResult<{ id: string; name: string; costCopper: number; benched?: boolean }>;
|
|
1442
|
+
// The 1v1 as ONE auto-battler fight: a duelist near your bracket-1 rating, seated where a mob
|
|
1443
|
+
// would be. Hands back a live session to mount, never resolving it; `settleArenaRating` moves the
|
|
1444
|
+
// Elo and `settleArenaDuel` stamps the highest rung beaten.
|
|
1445
|
+
arenaDuel(): ActionResult<{
|
|
1446
|
+
session: CombatSession;
|
|
1447
|
+
/** The comp beaten-or-not, for `settleArenaDuel`. */
|
|
1448
|
+
compId: string;
|
|
1449
|
+
/** Your rating going in, and the duelist's own - the two numbers `settleArenaRating` needs. */
|
|
1450
|
+
rating: number;
|
|
1451
|
+
oppRating: number;
|
|
1452
|
+
targetName: string;
|
|
1453
|
+
targetLevel: number;
|
|
1454
|
+
opponent: {
|
|
1455
|
+
race: number;
|
|
1456
|
+
cls: number;
|
|
1457
|
+
gender?: 0 | 1;
|
|
1458
|
+
equipped: Character['equipped'];
|
|
1459
|
+
};
|
|
1460
|
+
}>;
|
|
1461
|
+
// A team bracket (2v2, 3v3, 5v5) as ONE auto-battler fight: you plus the resolving allies (merc
|
|
1462
|
+
// backfill included) against an authored comp with pvp brains. Elimination, not yield-at-1-HP;
|
|
1463
|
+
// settled for honor. No `tier`: the bracket's rating picks the comp AND its tier.
|
|
1464
|
+
arenaMatch(opts?: {
|
|
1465
|
+
/** 2, 3 or 5. Absent = 2, the bracket that mounted here first. */
|
|
1466
|
+
bracket?: import('../../domain/bg/arenaComps.ts').ArenaBracket;
|
|
1467
|
+
allies?: string[];
|
|
1468
|
+
}): ActionResult<{
|
|
1469
|
+
session: CombatSession;
|
|
1470
|
+
/** Echoed back so the settle moves the right bracket's rating. */
|
|
1471
|
+
bracket: import('../../domain/bg/arenaComps.ts').ArenaBracket;
|
|
1472
|
+
/** The comp's own name - a factual team label, e.g. "Warrior and priest". */
|
|
1473
|
+
name: string;
|
|
1474
|
+
compId: string;
|
|
1475
|
+
rating: number;
|
|
1476
|
+
oppRating: number;
|
|
1477
|
+
opponents: {
|
|
1478
|
+
name: string;
|
|
1479
|
+
level: number;
|
|
1480
|
+
race: number;
|
|
1481
|
+
cls: number;
|
|
1482
|
+
gender?: 0 | 1;
|
|
1483
|
+
equipped: Character['equipped'];
|
|
1484
|
+
}[];
|
|
1485
|
+
/** Your own seats, in ally_0.. order — bracket-1 of them. */
|
|
1486
|
+
allies: {
|
|
1487
|
+
name: string;
|
|
1488
|
+
race: number;
|
|
1489
|
+
cls: number;
|
|
1490
|
+
gender?: 0 | 1;
|
|
1491
|
+
equipped: Character['equipped'];
|
|
1492
|
+
}[];
|
|
1493
|
+
}>;
|
|
1494
|
+
/** Advance the gauntlet rung for a finished `arenaDuel`. Honor is a separate awardDuelHonor. */
|
|
1495
|
+
settleArenaDuel(compId: string, won: boolean): { rung: number; of: number; advanced: boolean };
|
|
1496
|
+
// The Elo for a finished arena match, in any bracket. Runs on a LOSS as well as a win - that is
|
|
1497
|
+
// what makes it a rating and not the rung. `opponent` is a rating, or a comp id to resolve one.
|
|
1498
|
+
settleArenaRating(
|
|
1499
|
+
bracket: import('../../domain/bg/arenaComps.ts').ArenaBracket,
|
|
1500
|
+
opponent: number | string | null,
|
|
1501
|
+
outcome: import('../../domain/bg/arenaRating.ts').ArenaOutcome,
|
|
1502
|
+
): { rating: number; before: number; delta: number };
|
|
1503
|
+
// ICH5 tavern trial: an inn-gated duel against a hire-slate candidate or a roster/squad companion.
|
|
1504
|
+
// Yield at 1 HP, and no gold, loot, XP or durability loss. Cite: domain/run/duel.ts.
|
|
1505
|
+
tavernDuel(targetId: string): ActionResult<{
|
|
1506
|
+
session: CombatSession;
|
|
1507
|
+
targetName: string;
|
|
1508
|
+
/** The opponent's frame identity — a player-shaped foe portrait, as the BG builds its own. */
|
|
1509
|
+
opponent: {
|
|
1510
|
+
race: number;
|
|
1511
|
+
cls: number;
|
|
1512
|
+
gender?: 0 | 1;
|
|
1513
|
+
equipped: Character['equipped'];
|
|
1514
|
+
};
|
|
1515
|
+
}>;
|
|
1516
|
+
// Switch a companion onto another premade playerbot talent build for their class. Free respec —
|
|
1517
|
+
// talents re-derive from the link at their level, and the rotation is left alone.
|
|
1518
|
+
setCompanionSpec(id: string, specIdx: number): ActionResult<{ name: string }>;
|
|
1519
|
+
// Stamp a classic talent string onto a companion. Overrides their premade specIdx until a premade/role
|
|
1520
|
+
// restamp clears it. Free, like setCompanionSpec.
|
|
1521
|
+
setCompanionTalentLink(id: string, link: string | null): ActionResult<{ name: string }>;
|
|
1522
|
+
// Change a hired companion's squad role anytime, not only at hire. Free: re-stamps the matching
|
|
1523
|
+
// premade and rebuilds a non-custom rotation. Mid-fight it also dirties their live decision.
|
|
1524
|
+
setCompanionRole(id: string, role: SquadRole): ActionResult;
|
|
1525
|
+
// Companion pet selection (questless): hunter beast ≤ companion level, or unlocked warlock demon (Imp 1 /
|
|
1526
|
+
// VW 10 / Succubus 20 / Felhunter 30). Rebuilds kit + ranks.
|
|
1527
|
+
setCompanionPet(id: string, creatureEntry: number): ActionResult<{ name: string }>;
|
|
1528
|
+
/** Toggle autocast on a companion's pet ability (same name-chain rules as player pets). */
|
|
1529
|
+
setCompanionPetAutocast(id: string, spellId: number, on?: boolean): ActionResult<{ enabled: boolean }>;
|
|
1530
|
+
// Equip ONE item onto companion `id` under the real equipItem rules, sourcing the bot's bags
|
|
1531
|
+
// first then yours. Displaced gear goes to the BOT's bags. `preferred` targets a specific slot.
|
|
1532
|
+
equipCompanionSlot(id: string, itemEntry: number, preferred?: EquipSlot): ActionResult<{ slot: EquipSlot }>;
|
|
1533
|
+
/** Unequip one companion paperdoll slot into the BOT's bags (their loot stays theirs). */
|
|
1534
|
+
unequipCompanionSlot(id: string, slot: EquipSlot): ActionResult;
|
|
1535
|
+
// Upgrade suggestions for a companion over its own bags AND your bags (same shape as
|
|
1536
|
+
// suggestedEquipmentUpgrades, scored via findUpgrades).
|
|
1537
|
+
companionUpgradesFor(id: string, playerInv?: Inventory): Array<{ entry: number; slot: EquipSlot; randomPropertyId?: number; currentEntry?: number; delta: number; from: 'bot' | 'player' }>;
|
|
1538
|
+
// Roster-wide gearing: every companion (party AND benched) scored against their own bags, your
|
|
1539
|
+
// bags and your bank, with shared stacks claimed by their best taker.
|
|
1540
|
+
squadUpgradePlan(): SquadUpgradeRow[];
|
|
1541
|
+
/** Apply the plan best-first, recomputing after each equip. Withdraws bank rows as needed. */
|
|
1542
|
+
applySquadUpgrades(max?: number, allowKeys?: Iterable<string>): ActionResult<{ equipped: number }>;
|
|
1543
|
+
|
|
1544
|
+
// Share consumables: every shareable stack in your bags split across the party or the raid lineup
|
|
1545
|
+
// under the saved rules (auto = weightscale gain, like squadUpgradePlan). Companions carrying them
|
|
1546
|
+
// drink and throw them through their own bag item rules (syncCompanionBagItemRules).
|
|
1547
|
+
consumableShareState(): import('../../domain/bots/consumableShare.ts').ConsumableShareState;
|
|
1548
|
+
consumableShareMembers(): import('../../domain/bots/consumableShare.ts').ShareMember[];
|
|
1549
|
+
/** Per bag stack: who takes how many, what you keep, and why nobody can when nobody can. */
|
|
1550
|
+
squadConsumableDetail(): import('../../domain/bots/consumableShare.ts').SharePlanEntry[];
|
|
1551
|
+
squadConsumablePlan(): import('../../domain/bots/consumableShare.ts').ShareRow[];
|
|
1552
|
+
/** Hand planned rows over — all of them, one entry, or one rank ladder. A full bag is skipped and named. */
|
|
1553
|
+
applySquadConsumablePlan(pick?: number | { entry?: number; key?: string }): ActionResult<{ moved: number; rows: number; skipped: string[] }>;
|
|
1554
|
+
setConsumableShareRule(key: string, rule: import('../../domain/bots/consumableShare.ts').ShareRule | null): ActionResult;
|
|
1555
|
+
setConsumableShareScope(scope: import('../../domain/bots/consumableShare.ts').ShareScope): ActionResult;
|
|
1556
|
+
setConsumableShareIncludeYou(on: boolean): ActionResult;
|
|
1557
|
+
setConsumableShareCat(cat: import('../../domain/bots/consumableShare.ts').ShareCategory, on: boolean): ActionResult;
|
|
1558
|
+
|
|
1559
|
+
// ---- companion professions + send-out missions ----------------------------------------
|
|
1560
|
+
|
|
1561
|
+
/** Resolved trade skills for a companion (assigned set, else the seed-derived one). */
|
|
1562
|
+
companionProfessionsOf(id: string): {
|
|
1563
|
+
cap: number;
|
|
1564
|
+
/** True once the player has assigned professions (the derived set is frozen from then on). */
|
|
1565
|
+
assigned: boolean;
|
|
1566
|
+
/** `rank` is the trainer rank they hold (Apprentice … Artisan); absent when the line is new. */
|
|
1567
|
+
lines: Array<{ line: SkillLine; current: number; max: number; kind: string; rank?: string }>;
|
|
1568
|
+
} | null;
|
|
1569
|
+
/** Take up a profession. Same 2-primary limit the player has. */
|
|
1570
|
+
learnCompanionProfession(id: string, line: SkillLine): ActionResult;
|
|
1571
|
+
unlearnCompanionProfession(id: string, line: SkillLine): ActionResult;
|
|
1572
|
+
/** Shared mission energy remaining (0..100), after daily 06:00 refill. */
|
|
1573
|
+
companionPartyEnergy(nowMs?: number): number;
|
|
1574
|
+
/** Recommended zones for a companion's gathering skill. */
|
|
1575
|
+
companionMissionZones(
|
|
1576
|
+
id: string,
|
|
1577
|
+
skill: MissionSkill,
|
|
1578
|
+
): Array<{ zoneId: string; zoneName: string; preview: string[]; targetCount: number }>;
|
|
1579
|
+
// Send a companion to a zone to mine / herb / skin for N hours. Costs shared energy (10 per hour) up
|
|
1580
|
+
// front; resolution is by wall clock, so it completes while closed.
|
|
1581
|
+
sendCompanionOnMission(
|
|
1582
|
+
id: string,
|
|
1583
|
+
skill: MissionSkill,
|
|
1584
|
+
zoneId: string,
|
|
1585
|
+
hours: number,
|
|
1586
|
+
nowMs?: number,
|
|
1587
|
+
): ActionResult<{ mission: CompanionMission }>;
|
|
1588
|
+
/** Bring them home early. Forfeits the payout; the energy is not refunded. */
|
|
1589
|
+
recallCompanionMission(id: string): ActionResult;
|
|
1590
|
+
/** Claim a finished mission: skill-ups, and materials into bags / party storage. */
|
|
1591
|
+
collectCompanionMission(
|
|
1592
|
+
id: string,
|
|
1593
|
+
nowMs?: number,
|
|
1594
|
+
): ActionResult<{ skillUp: number; yielded: MissionYieldRow[] }>;
|
|
1595
|
+
// Yield + skill-up a finished (or still-away) trip would pay, from the same stamp Collect uses. Null when
|
|
1596
|
+
// they are not away. Away trips still report loot; the desk only shows it when done.
|
|
1597
|
+
previewCompanionMission(
|
|
1598
|
+
id: string,
|
|
1599
|
+
nowMs?: number,
|
|
1600
|
+
): { skillUp: number; yielded: MissionYieldRow[]; progress: MissionProgress } | null;
|
|
1601
|
+
/** Collect every finished trip on the party and the benched roster. */
|
|
1602
|
+
collectAllCompanionMissions(nowMs?: number): ActionResult<{
|
|
1603
|
+
collected: Array<{ id: string; name: string; skillUp: number; yielded: MissionYieldRow[] }>;
|
|
1604
|
+
}>;
|
|
1605
|
+
/** Craft a known recipe as this companion (reagents from party storage). */
|
|
1606
|
+
craftAsCompanion(id: string, recipeId: number): ActionResult<{ product: number; count: number; skillUp?: number; spent?: number }>;
|
|
1607
|
+
/** Enchant gear as this companion (their skill/rod/formulas). Target is player or a companion id. */
|
|
1608
|
+
enchantAsCompanion(
|
|
1609
|
+
enchanterId: string,
|
|
1610
|
+
enchantId: number,
|
|
1611
|
+
slot: EquipSlot,
|
|
1612
|
+
target: { kind: 'self' } | { kind: 'companion'; id: string },
|
|
1613
|
+
): ActionResult<{ skillUp?: number }>;
|
|
1614
|
+
// Give an item from your bags to the bot's bags. Party-internal transfer (free). Recipe items are learned
|
|
1615
|
+
// automatically when given.
|
|
1616
|
+
giveItemToBot(id: string, itemEntry: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1617
|
+
// Use a consumable from the companion's own bags, on the companion. A weapon imbue returns
|
|
1618
|
+
// `needsTarget` when both hands are eligible, the same picker contract as consumeItem.
|
|
1619
|
+
useCompanionItem(
|
|
1620
|
+
id: string,
|
|
1621
|
+
itemEntry: number,
|
|
1622
|
+
opts?: { slot?: EquipSlot },
|
|
1623
|
+
): { ok: true; used: number } | { ok: false; reason: string; needsTarget?: EnchantNeedsTarget };
|
|
1624
|
+
/** Take an item from a bot's bags into yours. Party-internal transfer (free). */
|
|
1625
|
+
takeItemFromBot(id: string, itemEntry: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1626
|
+
/** Move items between the bot's bags and its own bank (their stash - expandable like yours). */
|
|
1627
|
+
companionBankDeposit(id: string, itemEntry: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1628
|
+
companionBankWithdraw(id: string, itemEntry: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1629
|
+
// Stack-exact twins of the four above: `slotIndex` indexes the SOURCE container and an omitted
|
|
1630
|
+
// `qty` moves that ONE stack whole. The entry-keyed versions sweep every stack of that item.
|
|
1631
|
+
giveItemToBotStack(id: string, slotIndex: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1632
|
+
takeItemFromBotStack(id: string, slotIndex: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1633
|
+
/** One stack out of one companion's bags into another's. Soulbound stays put, as when you take it. */
|
|
1634
|
+
moveItemBetweenBots(fromId: string, slotIndex: number, toId: string, qty?: number): ActionResult<{ moved: number }>;
|
|
1635
|
+
/** Destroy one stack in a companion's bags (their grid's trash, same contract as discardBagStack). */
|
|
1636
|
+
discardCompanionBagStack(id: string, slotIndex: number, qty?: number): ActionResult<{ discarded: number }>;
|
|
1637
|
+
/** Sell one stack out of a companion's bags at the open vendor. Buyback is the caller's, as for sellItemStack. */
|
|
1638
|
+
sellCompanionItemStack(id: string, slotIndex: number, qty?: number): ActionResult<{ earned: number; qty: number }>;
|
|
1639
|
+
// Buy a stack sold off a companion back into THEIR bags, paid from your purse. The buyback list is
|
|
1640
|
+
// the caller's, so it hands back the entry it recorded on the sale.
|
|
1641
|
+
buyBackCompanionStack(
|
|
1642
|
+
id: string,
|
|
1643
|
+
itemEntry: number,
|
|
1644
|
+
qty: number,
|
|
1645
|
+
refundCopper: number,
|
|
1646
|
+
): ActionResult<{ qty: number }>;
|
|
1647
|
+
// Party storage → your bags: sweep one item out of every companion's bags and bank. Soulbound
|
|
1648
|
+
// stacks stay put and are reported in `bound`; `full` says your bags stopped the sweep.
|
|
1649
|
+
takeFromPartyStorage(itemEntry: number, qty?: number): ActionResult<{ moved: number; bound: number; full: boolean }>;
|
|
1650
|
+
companionBankDepositStack(id: string, slotIndex: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1651
|
+
companionBankWithdrawStack(id: string, slotIndex: number, qty?: number): ActionResult<{ moved: number }>;
|
|
1652
|
+
/** Buy the bot's next bank bag slot (escalating cost, paid with YOUR gold). */
|
|
1653
|
+
buyCompanionBankSlot(id: string): ActionResult<{ cost: number }>;
|
|
1654
|
+
/** Slot a bag from YOUR bags into the bot's purchased bank bag slot (the bag becomes theirs). */
|
|
1655
|
+
equipCompanionBankBag(id: string, itemEntry: number, slotIndex: number): ActionResult;
|
|
1656
|
+
/** Move a bank bag into the bot's bags (stays the bot's property). */
|
|
1657
|
+
unequipCompanionBankBag(id: string, slotIndex: number): ActionResult;
|
|
1658
|
+
// Exit the current dungeon back to the world. A 5-man's progress is held for 30 minutes and
|
|
1659
|
+
// restored on re-entry inside that window; pass the same wall clock the entry path got.
|
|
1660
|
+
leaveInstance(nowMs?: number): ActionResult;
|
|
1661
|
+
// Queue into a battleground. Path B of §0: you + your chosen companions take seats, mercs backfill both
|
|
1662
|
+
// teams. Refused inside a dungeon, or under the bracket's minimum level.
|
|
1663
|
+
enterBattleground(
|
|
1664
|
+
bgId?: BattlegroundId,
|
|
1665
|
+
opts?: {
|
|
1666
|
+
seed?: number;
|
|
1667
|
+
tier?: import('../../domain/bg/bgTier.ts').BgTierId;
|
|
1668
|
+
allies?: string[];
|
|
1669
|
+
},
|
|
1670
|
+
): ActionResult;
|
|
1671
|
+
/** Leave the battleground (the match is abandoned, exactly like leaving a real BG). */
|
|
1672
|
+
leaveBattleground(): ActionResult;
|
|
1673
|
+
/** Reset the current run's progress for another attempt (the on-demand 5-man reset). */
|
|
1674
|
+
resetInstance(): ActionResult;
|
|
1675
|
+
// Re-materialize the current run's route at a new pace WITHOUT re-entering. Refused once anything
|
|
1676
|
+
// is cleared, because changing density mid-run rewrites the route list `defeated` indexes into.
|
|
1677
|
+
setInstancePace(opts: {
|
|
1678
|
+
routeDensity?: RouteDensity;
|
|
1679
|
+
pullFusion?: PullFusion;
|
|
1680
|
+
}): ActionResult;
|
|
1681
|
+
// Begin an encounter fight inside the current instance (like beginFight, plus boss abilities).
|
|
1682
|
+
// `{ withSquad: true }` brings the active squad in as real allies; omitted keeps the solo session.
|
|
1683
|
+
beginEncounter(
|
|
1684
|
+
dungeonId: string,
|
|
1685
|
+
encounterId: string,
|
|
1686
|
+
opts?: {
|
|
1687
|
+
withSquad?: boolean;
|
|
1688
|
+
elapsedMs?: number;
|
|
1689
|
+
// Continuous floor pull (walk/aggro/skip product): skip sequential route isUnlocked. Party already
|
|
1690
|
+
// stands on those guids. Default false (headless hop/route scaffolding keeps sequential unlock).
|
|
1691
|
+
continuousFloor?: boolean;
|
|
1692
|
+
},
|
|
1693
|
+
): ActionResult<BeginFight>;
|
|
1694
|
+
// S4A conveyor / Pull +1: inject the next uncleared route TRASH pack into an OPEN session, never
|
|
1695
|
+
// a boss. Credits the pack on win like fusion, and no-ops with a reason when nothing is pullable.
|
|
1696
|
+
pullAdditionalPack(
|
|
1697
|
+
dungeonId: string,
|
|
1698
|
+
session: CombatSession,
|
|
1699
|
+
): ActionResult<PullAdditionalPackResult>;
|
|
1700
|
+
// Use an in-instance gameobject authored as an `objectGate` event. May require an inventory item;
|
|
1701
|
+
// multi-step gates set the flag only after needUses, and `once` defaults to once per instance.
|
|
1702
|
+
useInstanceObject(
|
|
1703
|
+
goEntry: number,
|
|
1704
|
+
// `ignoreRequiredItem` is the AUTO-RUN policy: `autoFireObjectGates` forces `okItem` true so a
|
|
1705
|
+
// key item cannot soft-lock a route (instances.ts:914-917). Never pass it from a player click.
|
|
1706
|
+
opts?: { ignoreRequiredItem?: boolean },
|
|
1707
|
+
): ActionResult<{
|
|
1708
|
+
flag: string;
|
|
1709
|
+
already: boolean;
|
|
1710
|
+
uses: number;
|
|
1711
|
+
needUses: number;
|
|
1712
|
+
completed: boolean;
|
|
1713
|
+
}>;
|
|
1714
|
+
// Loot an instance GO authored on `InstanceDef.lootObjects` by baked guid, once per run per guid.
|
|
1715
|
+
// Rolls the baked `go:<lootId>` table with quest/condition gating, straight into the bags.
|
|
1716
|
+
lootInstanceObject(goGuid: number): ActionResult<{ loot: LootDrop[]; name: string }>;
|
|
1717
|
+
// Auction house: settle expired always. The bot tick empties the house in one sell pass, else runs
|
|
1718
|
+
// at most one 120s CMaNGOS slice at Chance.Sell/Buy 10%. Cite: AuctionHouseBot.cpp:166.
|
|
1719
|
+
refillAuctions(nowMs: number, opts?: { bot?: boolean }): void;
|
|
1720
|
+
/** Active listings from others + bots (excludes your own), for browsing/buying. */
|
|
1721
|
+
browseAuctions(nowMs: number): Auction[];
|
|
1722
|
+
/** Your own live listings, for cancelling. */
|
|
1723
|
+
ownAuctions(): Auction[];
|
|
1724
|
+
/** Auctions you currently hold the high bid on (your gold is escrowed there). */
|
|
1725
|
+
myBidAuctions(): Auction[];
|
|
1726
|
+
// List from bags. `stacks` posts N same-size stacks (Auctionator GetNumStacks). Charges CMaNGOS deposit
|
|
1727
|
+
// (sellPrice × count × time/MIN_AUCTION_TIME × 5%).
|
|
1728
|
+
listAuction(itemEntry: number, quantity: number, bidCopper: number, buyoutCopper: number, duration: AhDuration, nowMs: number, stacks?: number): ActionResult<{ auctionId: number; listed: number }>;
|
|
1729
|
+
/** Buy a listing outright: pay its buyout, receive the items. */
|
|
1730
|
+
buyoutAuction(auctionId: number): ActionResult<{ spent: number }>;
|
|
1731
|
+
/** Place a bid on a listing, escrowing the gold until you win or are outbid. */
|
|
1732
|
+
bidAuction(auctionId: number, amount: number, nowMs: number): ActionResult<{ bid: number }>;
|
|
1733
|
+
/** Cancel your own listing and reclaim the items. */
|
|
1734
|
+
cancelAuction(auctionId: number): ActionResult;
|
|
1735
|
+
/** Pull everything in the mailbox that fits into your bags; returns how many stacks moved. */
|
|
1736
|
+
collectMail(): ActionResult<{ moved: number; abortedFull: boolean }>;
|
|
1737
|
+
/** Delivered, unexpired inbox (MailHandler.cpp:559–561). Purges expired first. */
|
|
1738
|
+
listMail(nowMs: number): MailMessage[];
|
|
1739
|
+
/** Unread delivered count for the Mail tab badge. */
|
|
1740
|
+
unreadMailCount(nowMs: number): number;
|
|
1741
|
+
markMailRead(mailId: number): ActionResult;
|
|
1742
|
+
takeMailItem(mailId: number, nowMs?: number): ActionResult<{ remittance?: { to: string; mail: MailMessage } }>;
|
|
1743
|
+
takeMailMoney(mailId: number, nowMs?: number): ActionResult<{ taken: number }>;
|
|
1744
|
+
deleteMail(mailId: number, nowMs?: number): ActionResult;
|
|
1745
|
+
returnMail(mailId: number, nowMs?: number): ActionResult<{ to: string; mail: MailMessage }>;
|
|
1746
|
+
// Player send. One mail may carry MAX_MAIL_ITEMS stacks (crate). Postage 30c.
|
|
1747
|
+
// `recipientMailbox` is the destination inbox, and the returned one is what the caller persists.
|
|
1748
|
+
sendMailTo(opts: {
|
|
1749
|
+
recipientName: string;
|
|
1750
|
+
recipientMailbox: Mailbox;
|
|
1751
|
+
subject?: string;
|
|
1752
|
+
body?: string;
|
|
1753
|
+
enclosedMoney?: number;
|
|
1754
|
+
cod?: number;
|
|
1755
|
+
attachments?: readonly MailAttachment[];
|
|
1756
|
+
nowMs: number;
|
|
1757
|
+
crossFaction?: boolean;
|
|
1758
|
+
}): ActionResult<{ mail: MailMessage; destMailbox: Mailbox; cost: number }>;
|
|
1759
|
+
// Postal send queue: every attached stack rides one mail. Cite: Postal.lua:25 tray.
|
|
1760
|
+
sendMailBatch(opts: {
|
|
1761
|
+
recipientName: string;
|
|
1762
|
+
recipientMailbox: Mailbox;
|
|
1763
|
+
subject?: string;
|
|
1764
|
+
body?: string;
|
|
1765
|
+
enclosedMoney?: number;
|
|
1766
|
+
cod?: number;
|
|
1767
|
+
attachments: readonly MailAttachment[];
|
|
1768
|
+
nowMs: number;
|
|
1769
|
+
crossFaction?: boolean;
|
|
1770
|
+
}): ActionResult<{ mails: MailMessage[]; destMailbox: Mailbox; cost: number }>;
|
|
1771
|
+
snapshot(): GameState;
|
|
1772
|
+
/** Spend one point in the given talent (if prereqs, tier, points, and rank allow). */
|
|
1773
|
+
spendTalent(talentId: number): ActionResult;
|
|
1774
|
+
/** Refund one point from the given talent (if any spent on it). */
|
|
1775
|
+
refundTalent(talentId: number): ActionResult;
|
|
1776
|
+
// Full respec: clear all spent talent points, charging the CMaNGOS escalating trainer cost.
|
|
1777
|
+
// `nowMs` is wall clock for monthly decay. Cite: Player.cpp:3715 resetTalentsCost.
|
|
1778
|
+
respec(nowMs?: number): ActionResult<{ cost: number }>;
|
|
1779
|
+
// Next talent-respec price in copper (CMaNGOS ladder + monthly decay). 0 when nothing is spent (a blank
|
|
1780
|
+
// tree needs no reset). `nowMs` defaults to Date.now().
|
|
1781
|
+
respecCost(nowMs?: number): number;
|
|
1782
|
+
// Apply a premade playerbot talent build, replacing the talent map with the level-scaled link.
|
|
1783
|
+
// A paid respec when points are already spent, free when the tree is empty or already matches.
|
|
1784
|
+
applyPremadeSpec(specIdx: number, nowMs?: number): ActionResult<{ name: string; cost: number }>;
|
|
1785
|
+
/** Store a named talent string for this class. Caps at MAX_TALENT_BUILDS. */
|
|
1786
|
+
saveTalentBuild(name: string, cls: number, link: string): ActionResult<{ id: string; name: string }>;
|
|
1787
|
+
/** Drop a saved loadout. Companions that already copied the string keep it. */
|
|
1788
|
+
deleteTalentBuild(id: string): ActionResult;
|
|
1789
|
+
// Apply a saved loadout to the player. Paid respec when the tree is spent, same ladder as
|
|
1790
|
+
// `applyPremadeSpec`.
|
|
1791
|
+
applyTalentBuild(id: string, nowMs?: number): ActionResult<{ name: string; cost: number }>;
|
|
1792
|
+
// Apply a classic talent string to the player at their current level. Same cost rules as
|
|
1793
|
+
// `applyTalentBuild`.
|
|
1794
|
+
applyTalentLink(link: string, nowMs?: number): ActionResult<{ name: string; cost: number }>;
|
|
1795
|
+
// NPC talk / right-click: gossip options from the baked menu id when present, else today's
|
|
1796
|
+
// quest/vendor/trainer/taxi/innkeeper shortcuts. Pass `menuId` explicitly; never invents lines.
|
|
1797
|
+
npcGossip(npcEntry: number, opts?: { menuId?: number }): GossipMenu;
|
|
1798
|
+
// Closest graveyard for the current zone's AreaTable id + player faction. Pure bake lookup — DF owns the
|
|
1799
|
+
// death loop; call this for yard selection.
|
|
1800
|
+
closestGraveyard(pos?: { x: number; y: number; z: number }): GraveyardEntry | undefined;
|
|
1801
|
+
/** Whether a baked game event is active at `nowMs` (default Date.now()). */
|
|
1802
|
+
isGameEventActive(eventId: number, nowMs?: number): boolean;
|
|
1803
|
+
// Roll one pool member guid via domain/pools (not first-entry). Returns undefined when pool missing or at
|
|
1804
|
+
// maxLimit.
|
|
1805
|
+
rollPoolGuid(poolId: number, spawned?: readonly number[]): number | undefined;
|
|
1806
|
+
/** Entrance yardage row by areatrigger id, or all rows for a zone string. */
|
|
1807
|
+
entranceYard(query: { trigger: number } | { zone: string }): EntranceYardRow | EntranceYardRow[] | undefined;
|
|
1808
|
+
// Current session weather for a zone (default char.zoneId) — an ephemeral Map on the Game
|
|
1809
|
+
// instance, NOT saved. Missing → fine weather. Cite: Weather.cpp; domain/world/weather.ts.
|
|
1810
|
+
weather(opts?: { zoneId?: string }): WeatherState;
|
|
1811
|
+
// One weather regeneration step for the zone (areaId → zoneWeather rates), with injected
|
|
1812
|
+
// day-of-year and a fightCounter sub-seed rather than wall clock. Cite: Weather.cpp ReGenerate.
|
|
1813
|
+
stepZoneWeather(opts?: { zoneId?: string; dayOfYear?: number }): WeatherState;
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
// The client's persistent travel pace, a settings MODE rather than a per-journey dial: 1/2/4 is the
|
|
1817
|
+
// fast-forward factor applied at departure; 'instant' completes a journey the moment it departs.
|
|
1818
|
+
export type TravelPace = 1 | 2 | 4 | 'instant';
|
|
1819
|
+
|
|
1820
|
+
/** Options for createGame (travel / dev cheats). */
|
|
1821
|
+
export interface CreateGameOptions {
|
|
1822
|
+
// Persistent travel pace applied to EVERY journey at departure. A getter is read at call time so
|
|
1823
|
+
// the settings control applies at once. 'instant' also unlocks `completeJourneyNow` (local only).
|
|
1824
|
+
travelPace?: TravelPace | (() => TravelPace);
|
|
1825
|
+
// Wave DF death loop. Getter is read on each defeat so the settings control applies without re-enter.
|
|
1826
|
+
// Default `repair-only` (immediate half-HP revive).
|
|
1827
|
+
deathFlowMode?: DeathFlowMode | (() => DeathFlowMode);
|
|
1828
|
+
// Global junk filter (all characters). Getter is read live so Settings → Loot filter applies without
|
|
1829
|
+
// re-enter. Default: auto-sell greys only.
|
|
1830
|
+
junkFilter?: JunkFilterConfig | (() => JunkFilterConfig);
|
|
1831
|
+
// Unpack bagged containers (clam, sack, bloated fish) as soon as they land, so junk containers do
|
|
1832
|
+
// not fill the bags. Live getter like junkFilter. Default true; locked and quest containers never.
|
|
1833
|
+
autoOpenContainers?: boolean | (() => boolean);
|
|
1834
|
+
// Outfitter master enable (chrome + auto specials). Live getter so Settings applies without re-enter.
|
|
1835
|
+
// Default true. Explicit bar clicks still wear when false.
|
|
1836
|
+
outfitterEnabled?: boolean | (() => boolean);
|
|
1837
|
+
/** Persist global junk filter when the player edits global Loot filter settings. */
|
|
1838
|
+
onJunkFilterChange?: (cfg: JunkFilterConfig) => void;
|
|
1839
|
+
/** Global auto-disenchant (all characters). Live getter; character layer is GameState.autoDisenchant. */
|
|
1840
|
+
autoDisenchant?: import('../../domain/professions/autoDisenchant.ts').AutoDisenchantConfig
|
|
1841
|
+
| (() => import('../../domain/professions/autoDisenchant.ts').AutoDisenchantConfig);
|
|
1842
|
+
/** Persist global auto-disenchant. */
|
|
1843
|
+
onAutoDisenchantChange?: (cfg: import('../../domain/professions/autoDisenchant.ts').AutoDisenchantConfig) => void;
|
|
1844
|
+
// Account-wide macros — the MacroFrame "General" tab, shared by every character, so they do not
|
|
1845
|
+
// live on the save. A live getter like junkFilter. Cite: Blizzard_MacroUI.lua:31.
|
|
1846
|
+
accountMacros?: MacroDef[] | (() => MacroDef[]);
|
|
1847
|
+
/** Persist account-wide macros (localStorage in the browser host). */
|
|
1848
|
+
onAccountMacrosChange?: (macros: MacroDef[]) => void;
|
|
1849
|
+
// Stamp world timers (aura expiry, cooldowns, mail, pickpocket restock) on the wall clock instead
|
|
1850
|
+
// of the fight chain. The live app sets it; headless runs keep the chain (KI-956).
|
|
1851
|
+
wallWorldClock?: boolean;
|
|
1852
|
+
// Offline time gap for timers like offline rested XP or offline aura duration decay.
|
|
1853
|
+
offlineTimeMs?: number;
|
|
1854
|
+
}
|
|
1855
|
+
|