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,174 @@
|
|
|
1
|
+
// Whole categories the junk filter refuses to sell or destroy. Every test reads item_template
|
|
2
|
+
// CLASS, never the consumable SUBCLASS, which the 1.12 tier renumbers against the header enum.
|
|
3
|
+
|
|
4
|
+
import type { ItemDef, RecipeDef } from '../../data/schema.ts';
|
|
5
|
+
import { ITEM_CLASS_TRADE_GOODS } from '../bots/sendTradeGoods.ts';
|
|
6
|
+
import { itemTeachIntent, type TeachLookup } from './itemTeaches.ts';
|
|
7
|
+
import { isFishingPole, isMiningPick, isSkinningKnife } from '../professions/professions.ts';
|
|
8
|
+
import { SPELL_EFFECT_SUMMON_CRITTER } from '../../engine/spells/interpreter/opcodes.ts';
|
|
9
|
+
|
|
10
|
+
/** Cite: ItemPrototype.h:144-159. Only the classes a category asks about. */
|
|
11
|
+
const ITEM_CLASS_CONSUMABLE = 0;
|
|
12
|
+
const ITEM_CLASS_CONTAINER = 1;
|
|
13
|
+
const ITEM_CLASS_REAGENT = 5;
|
|
14
|
+
const ITEM_CLASS_PROJECTILE = 6;
|
|
15
|
+
const ITEM_CLASS_RECIPE = 9;
|
|
16
|
+
const ITEM_CLASS_QUIVER = 11;
|
|
17
|
+
const ITEM_CLASS_QUEST = 12;
|
|
18
|
+
const ITEM_CLASS_KEY = 13;
|
|
19
|
+
|
|
20
|
+
/** INVTYPE_AMMO. Cite: ItemPrototype.h InventoryType; Item.cpp ItemCanGoIntoBag. */
|
|
21
|
+
const INVTYPE_AMMO = 24;
|
|
22
|
+
/** item_template.BagFamily ARROWS / BULLETS. Cite: Item.cpp ItemCanGoIntoBag. */
|
|
23
|
+
const BAG_FAMILY_ARROWS = 1;
|
|
24
|
+
const BAG_FAMILY_BULLETS = 2;
|
|
25
|
+
|
|
26
|
+
export type JunkProtectCategory =
|
|
27
|
+
| 'ammo'
|
|
28
|
+
| 'quiver'
|
|
29
|
+
| 'foodDrink'
|
|
30
|
+
| 'consumable'
|
|
31
|
+
| 'reagent'
|
|
32
|
+
| 'tradeGoods'
|
|
33
|
+
| 'container'
|
|
34
|
+
| 'teaches'
|
|
35
|
+
| 'key'
|
|
36
|
+
| 'quest'
|
|
37
|
+
| 'mountPet'
|
|
38
|
+
| 'tool';
|
|
39
|
+
|
|
40
|
+
export interface JunkProtectCategoryDef {
|
|
41
|
+
id: JunkProtectCategory;
|
|
42
|
+
/** Checkbox label, in the player's own words. */
|
|
43
|
+
label: string;
|
|
44
|
+
/** One line of why, for the settings row and the skipped-row reason. */
|
|
45
|
+
hint: string;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Display order is "most likely to be in a bag" first. Every one is on by default: the point of the list is
|
|
49
|
+
// that a fresh player can press Sell All without reading it.
|
|
50
|
+
export const JUNK_PROTECT_CATEGORIES: readonly JunkProtectCategoryDef[] = [
|
|
51
|
+
{ id: 'ammo', label: 'Arrows and bullets', hint: 'Ammunition your bow or gun still needs' },
|
|
52
|
+
{ id: 'quiver', label: 'Quivers and ammo pouches', hint: 'The bag your ammo lives in' },
|
|
53
|
+
{ id: 'foodDrink', label: 'Food and drink', hint: 'What the party eats and drinks between pulls' },
|
|
54
|
+
{ id: 'consumable', label: 'Potions, scrolls and bandages', hint: 'Every other consumable' },
|
|
55
|
+
{ id: 'reagent', label: 'Spell reagents', hint: 'Powders, ankhs, symbols a spell consumes' },
|
|
56
|
+
{ id: 'tradeGoods', label: 'Crafting materials', hint: 'Cloth, ore, herbs, leather, essences' },
|
|
57
|
+
{ id: 'container', label: 'Bags and containers', hint: 'Spare bags, not the ones you wear' },
|
|
58
|
+
{ id: 'teaches', label: 'Recipes, formulas and books', hint: 'Anything somebody can still read' },
|
|
59
|
+
{ id: 'key', label: 'Keys and lockpicks', hint: 'Dungeon keys and skeleton keys' },
|
|
60
|
+
{ id: 'quest', label: 'Quest items', hint: 'Quest drops and items that start a quest' },
|
|
61
|
+
{ id: 'mountPet', label: 'Mounts and pets', hint: 'Reins, whistles, pet carriers' },
|
|
62
|
+
{ id: 'tool', label: 'Profession tools', hint: 'Hammer, spanner, rods, pick, knife, pole' },
|
|
63
|
+
];
|
|
64
|
+
|
|
65
|
+
const CATEGORY_IDS = new Set<string>(JUNK_PROTECT_CATEGORIES.map((c) => c.id));
|
|
66
|
+
|
|
67
|
+
export const DEFAULT_PROTECT_CATEGORIES: readonly JunkProtectCategory[] =
|
|
68
|
+
JUNK_PROTECT_CATEGORIES.map((c) => c.id);
|
|
69
|
+
|
|
70
|
+
export function junkProtectCategoryLabel(id: JunkProtectCategory): string {
|
|
71
|
+
return JUNK_PROTECT_CATEGORIES.find((c) => c.id === id)?.label ?? id;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Coerce a stored list. An ABSENT list means "never configured" and takes the defaults — an EMPTY array is
|
|
75
|
+
// a player who unchecked every box and must stay empty.
|
|
76
|
+
export function normalizeProtectCategories(raw: unknown): JunkProtectCategory[] {
|
|
77
|
+
if (!Array.isArray(raw)) return [...DEFAULT_PROTECT_CATEGORIES];
|
|
78
|
+
const out: JunkProtectCategory[] = [];
|
|
79
|
+
for (const x of raw) {
|
|
80
|
+
if (typeof x === 'string' && CATEGORY_IDS.has(x) && !out.includes(x as JunkProtectCategory)) {
|
|
81
|
+
out.push(x as JunkProtectCategory);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return out;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Item entries held, never spent, by some recipe — hammers, spanners, enchanting rods. Nine in the
|
|
88
|
+
// bake, all white with a real sell price, so "sell all common" ate the crafting kit.
|
|
89
|
+
export function craftToolEntries(recipes: readonly RecipeDef[]): Set<number> {
|
|
90
|
+
const out = new Set<number>();
|
|
91
|
+
for (const r of recipes) {
|
|
92
|
+
for (const t of r.requiredTools ?? []) if (t > 0) out.add(t);
|
|
93
|
+
}
|
|
94
|
+
return out;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export interface ProtectLookup extends TeachLookup {
|
|
98
|
+
/** From craftToolEntries(ds.recipes()). Empty set = tools fall through to their item class. */
|
|
99
|
+
craftTools: ReadonlySet<number>;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/** DataStore slice protectLookupFor needs. */
|
|
103
|
+
export type ProtectSource = TeachLookup & { recipes(): RecipeDef[] };
|
|
104
|
+
|
|
105
|
+
const toolsByStore = new WeakMap<object, Set<number>>();
|
|
106
|
+
|
|
107
|
+
// One craft-tool set per DataStore. dispositionForEntry runs per bag entry and ds.recipes() materializes
|
|
108
|
+
// 1,135 rows, so this must never be rebuilt inside the loop.
|
|
109
|
+
export function protectLookupFor(ds: ProtectSource): ProtectLookup {
|
|
110
|
+
let tools = toolsByStore.get(ds);
|
|
111
|
+
if (!tools) {
|
|
112
|
+
tools = craftToolEntries(ds.recipes());
|
|
113
|
+
toolsByStore.set(ds, tools);
|
|
114
|
+
}
|
|
115
|
+
return { spell: ds.spell, recipe: ds.recipe, enchant: ds.enchant, craftTools: tools };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// A mount or a mini-pet. mountSpell is the baked aura-78 marker; a critter has none, so its on-use
|
|
119
|
+
// spell is read for SPELL_EFFECT_SUMMON_CRITTER — a Cat Carrier is class 15 like any trinket.
|
|
120
|
+
function isMountOrPet(it: ItemDef, look: ProtectLookup): boolean {
|
|
121
|
+
if (it.mountSpell != null) return true;
|
|
122
|
+
if (it.useSpell == null) return false;
|
|
123
|
+
const sp = look.spell(it.useSpell);
|
|
124
|
+
return !!sp?.rawEffects?.some((e) => e.effect === SPELL_EFFECT_SUMMON_CRITTER);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Which protected category this item falls in, or null when nothing claims it. First match wins,
|
|
128
|
+
// since the earlier tests are the ones whose reason a player would recognise.
|
|
129
|
+
export function itemProtectCategory(
|
|
130
|
+
it: ItemDef | undefined | null,
|
|
131
|
+
look: ProtectLookup,
|
|
132
|
+
): JunkProtectCategory | null {
|
|
133
|
+
if (!it) return null;
|
|
134
|
+
const cls = it.itemClass;
|
|
135
|
+
|
|
136
|
+
if (it.questItem || (it.startQuest ?? 0) > 0 || cls === ITEM_CLASS_QUEST) return 'quest';
|
|
137
|
+
// Tools before their item class: the enchanting rods are class 7, the pick a class-2 weapon.
|
|
138
|
+
if (look.craftTools.has(it.entry) || isFishingPole(it) || isMiningPick(it) || isSkinningKnife(it)) {
|
|
139
|
+
return 'tool';
|
|
140
|
+
}
|
|
141
|
+
if (cls === ITEM_CLASS_PROJECTILE
|
|
142
|
+
|| it.inventoryType === INVTYPE_AMMO
|
|
143
|
+
|| it.bagFamily === BAG_FAMILY_ARROWS
|
|
144
|
+
|| it.bagFamily === BAG_FAMILY_BULLETS) {
|
|
145
|
+
return 'ammo';
|
|
146
|
+
}
|
|
147
|
+
if (cls === ITEM_CLASS_QUIVER) return 'quiver';
|
|
148
|
+
if (cls === ITEM_CLASS_CONSUMABLE) {
|
|
149
|
+
// The bake only stamps `consumable` on the food/drink rows it could derive (Skin of Dwarven
|
|
150
|
+
// Stout has none), so the split is cosmetic — both halves are class 0 and both are protected.
|
|
151
|
+
return it.consumable != null || it.foodType != null ? 'foodDrink' : 'consumable';
|
|
152
|
+
}
|
|
153
|
+
if (cls === ITEM_CLASS_REAGENT) return 'reagent';
|
|
154
|
+
if (cls === ITEM_CLASS_CONTAINER || it.slot === 'bag') return 'container';
|
|
155
|
+
if (cls === ITEM_CLASS_KEY) return 'key';
|
|
156
|
+
// itemTeachIntent, not the baked teach fields: 855 of the 1,672 teaching rows carry no field.
|
|
157
|
+
if (cls === ITEM_CLASS_RECIPE || itemTeachIntent(it, look) != null) return 'teaches';
|
|
158
|
+
if (isMountOrPet(it, look)) return 'mountPet';
|
|
159
|
+
if (cls === ITEM_CLASS_TRADE_GOODS) return 'tradeGoods';
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** The category blocking this item under `active`, or null when it is free to sell. */
|
|
164
|
+
export function protectedCategoryFor(
|
|
165
|
+
it: ItemDef | undefined | null,
|
|
166
|
+
active: Iterable<JunkProtectCategory>,
|
|
167
|
+
look: ProtectLookup,
|
|
168
|
+
): JunkProtectCategory | null {
|
|
169
|
+
const cat = itemProtectCategory(it, look);
|
|
170
|
+
if (cat == null) return null;
|
|
171
|
+
// Iterable, not array-or-Set: 12 ids at most, so a membership walk beats a cast either way.
|
|
172
|
+
for (const on of active) if (on === cat) return cat;
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
// Junk filter: Dejunk-style disposition over a character layer then a global one. Never sells a
|
|
2
|
+
// quest item or an upgrade; whole categories are guarded by junkCategories.ts.
|
|
3
|
+
|
|
4
|
+
import type { DataStore } from '../../data/dataStore.ts';
|
|
5
|
+
import type { Character } from '../character/character.ts';
|
|
6
|
+
import type { Inventory } from './inventory.ts';
|
|
7
|
+
import type { Companion } from '../bots/squad.ts';
|
|
8
|
+
import type { EquipOpts } from './equipment.ts';
|
|
9
|
+
import {
|
|
10
|
+
type AutoDisenchantConfig,
|
|
11
|
+
canAutoDisenchantEntry,
|
|
12
|
+
isUpgradeForParty,
|
|
13
|
+
type PartyEnchanter,
|
|
14
|
+
} from '../professions/autoDisenchant.ts';
|
|
15
|
+
import {
|
|
16
|
+
DEFAULT_PROTECT_CATEGORIES,
|
|
17
|
+
junkProtectCategoryLabel,
|
|
18
|
+
normalizeProtectCategories,
|
|
19
|
+
protectLookupFor,
|
|
20
|
+
protectedCategoryFor,
|
|
21
|
+
type JunkProtectCategory,
|
|
22
|
+
} from './junkCategories.ts';
|
|
23
|
+
|
|
24
|
+
/** Classic quality tiers used by sell/destroy include checkboxes (poor .. epic). */
|
|
25
|
+
export type JunkQuality = 0 | 1 | 2 | 3 | 4;
|
|
26
|
+
|
|
27
|
+
export type JunkDisposition = 'keep' | 'sell' | 'destroy';
|
|
28
|
+
|
|
29
|
+
/** One layer of junk rules (global or character). */
|
|
30
|
+
export interface JunkFilterConfig {
|
|
31
|
+
/** Auto-vendor matching sellable junk. Default true. */
|
|
32
|
+
autoSell: boolean;
|
|
33
|
+
/** Auto-discard matching destroy junk. Default false. */
|
|
34
|
+
autoDestroy: boolean;
|
|
35
|
+
/** Include-by-quality for sell. Default: only poor (0). */
|
|
36
|
+
sellQuality: Record<JunkQuality, boolean>;
|
|
37
|
+
/** Include-by-quality for destroy. Default: all false. */
|
|
38
|
+
destroyQuality: Record<JunkQuality, boolean>;
|
|
39
|
+
/** Never junk (exclusions). */
|
|
40
|
+
keepEntries: number[];
|
|
41
|
+
/** Always sell when sellable. */
|
|
42
|
+
sellEntries: number[];
|
|
43
|
+
/** Always destroy. */
|
|
44
|
+
destroyEntries: number[];
|
|
45
|
+
// Whole item categories never sold or destroyed however the quality boxes are set — arrows, food,
|
|
46
|
+
// reagents, mats, bags, recipes, keys, quest items, mounts, pets, tools. Default: all of them.
|
|
47
|
+
protectCategories: JunkProtectCategory[];
|
|
48
|
+
// The vendor's Sell All picker remembers its own tier boxes here, separate from `sellQuality`: a manual
|
|
49
|
+
// "sell my greens once" must never arm the automatic pass. Default: poor only.
|
|
50
|
+
sellAllQuality: Record<JunkQuality, boolean>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Per-character layer. When `characterSpecific` is false, quality/auto flags come from global; character
|
|
54
|
+
// lists still apply (Dejunk: lists are always both scopes).
|
|
55
|
+
export interface CharacterJunkFilterConfig extends JunkFilterConfig {
|
|
56
|
+
characterSpecific: boolean;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export type JunkListScope = 'global' | 'character';
|
|
60
|
+
|
|
61
|
+
const QUALITIES: JunkQuality[] = [0, 1, 2, 3, 4];
|
|
62
|
+
|
|
63
|
+
export const DEFAULT_JUNK_FILTER_CONFIG: JunkFilterConfig = {
|
|
64
|
+
autoSell: true,
|
|
65
|
+
autoDestroy: false,
|
|
66
|
+
sellQuality: { 0: true, 1: false, 2: false, 3: false, 4: false },
|
|
67
|
+
destroyQuality: { 0: false, 1: false, 2: false, 3: false, 4: false },
|
|
68
|
+
keepEntries: [],
|
|
69
|
+
sellEntries: [],
|
|
70
|
+
destroyEntries: [],
|
|
71
|
+
protectCategories: [...DEFAULT_PROTECT_CATEGORIES],
|
|
72
|
+
sellAllQuality: { 0: true, 1: false, 2: false, 3: false, 4: false },
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
export const DEFAULT_CHARACTER_JUNK_FILTER_CONFIG: CharacterJunkFilterConfig = {
|
|
76
|
+
...DEFAULT_JUNK_FILTER_CONFIG,
|
|
77
|
+
characterSpecific: false,
|
|
78
|
+
// Protection is a UNION of both layers, so a character copy of the defaults would make the global
|
|
79
|
+
// boxes un-unpickable. The character layer only ever ADDS.
|
|
80
|
+
protectCategories: [],
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
function qualityMap(
|
|
84
|
+
raw: unknown,
|
|
85
|
+
fallback: Record<JunkQuality, boolean>,
|
|
86
|
+
): Record<JunkQuality, boolean> {
|
|
87
|
+
const r = (raw && typeof raw === 'object' ? raw : {}) as Partial<Record<JunkQuality | string, unknown>>;
|
|
88
|
+
const out = { ...fallback };
|
|
89
|
+
for (const q of QUALITIES) {
|
|
90
|
+
const v = r[q] ?? r[String(q)];
|
|
91
|
+
if (typeof v === 'boolean') out[q] = v;
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function entryList(raw: unknown): number[] {
|
|
97
|
+
if (!Array.isArray(raw)) return [];
|
|
98
|
+
const seen = new Set<number>();
|
|
99
|
+
const out: number[] = [];
|
|
100
|
+
for (const x of raw) {
|
|
101
|
+
const n = typeof x === 'number' ? x : Number(x);
|
|
102
|
+
if (!Number.isInteger(n) || n <= 0 || seen.has(n)) continue;
|
|
103
|
+
seen.add(n);
|
|
104
|
+
out.push(n);
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// dispositionForEntry re-normalizes ctx.global/ctx.character per bag entry and both are already
|
|
110
|
+
// canonical: mark outputs so the second pass returns the same object instead of 5 allocations.
|
|
111
|
+
const canonical = new WeakSet<object>();
|
|
112
|
+
const canonicalCharacter = new WeakSet<object>();
|
|
113
|
+
|
|
114
|
+
/** Coerce stored value; missing/partial → defaults (auto-sell greys only). */
|
|
115
|
+
export function normalizeJunkFilterConfig(raw: unknown): JunkFilterConfig {
|
|
116
|
+
if (raw && typeof raw === 'object' && canonical.has(raw)) return raw as JunkFilterConfig;
|
|
117
|
+
const r = (raw && typeof raw === 'object' ? raw : {}) as Partial<JunkFilterConfig>;
|
|
118
|
+
const out: JunkFilterConfig = {
|
|
119
|
+
autoSell: typeof r.autoSell === 'boolean' ? r.autoSell : DEFAULT_JUNK_FILTER_CONFIG.autoSell,
|
|
120
|
+
autoDestroy: typeof r.autoDestroy === 'boolean' ? r.autoDestroy : DEFAULT_JUNK_FILTER_CONFIG.autoDestroy,
|
|
121
|
+
sellQuality: qualityMap(r.sellQuality, DEFAULT_JUNK_FILTER_CONFIG.sellQuality),
|
|
122
|
+
destroyQuality: qualityMap(r.destroyQuality, DEFAULT_JUNK_FILTER_CONFIG.destroyQuality),
|
|
123
|
+
keepEntries: entryList(r.keepEntries),
|
|
124
|
+
sellEntries: entryList(r.sellEntries),
|
|
125
|
+
destroyEntries: entryList(r.destroyEntries),
|
|
126
|
+
protectCategories: normalizeProtectCategories(r.protectCategories),
|
|
127
|
+
sellAllQuality: qualityMap(r.sellAllQuality, DEFAULT_JUNK_FILTER_CONFIG.sellAllQuality),
|
|
128
|
+
};
|
|
129
|
+
canonical.add(out);
|
|
130
|
+
return out;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export function normalizeCharacterJunkFilterConfig(raw: unknown): CharacterJunkFilterConfig {
|
|
134
|
+
if (raw && typeof raw === 'object' && canonicalCharacter.has(raw)) {
|
|
135
|
+
return raw as CharacterJunkFilterConfig;
|
|
136
|
+
}
|
|
137
|
+
const base = normalizeJunkFilterConfig(raw);
|
|
138
|
+
const r = (raw && typeof raw === 'object' ? raw : {}) as Partial<CharacterJunkFilterConfig>;
|
|
139
|
+
const out: CharacterJunkFilterConfig = {
|
|
140
|
+
...base,
|
|
141
|
+
characterSpecific: typeof r.characterSpecific === 'boolean' ? r.characterSpecific : false,
|
|
142
|
+
// Absent means "adds nothing" here, not "take the defaults" (see the constant above).
|
|
143
|
+
protectCategories: Array.isArray(r.protectCategories)
|
|
144
|
+
? normalizeProtectCategories(r.protectCategories)
|
|
145
|
+
: [],
|
|
146
|
+
};
|
|
147
|
+
canonical.add(out);
|
|
148
|
+
canonicalCharacter.add(out);
|
|
149
|
+
return out;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Build default config, optionally migrating legacy autopilot.autoSellGrays. */
|
|
153
|
+
export function junkFilterFromLegacy(autoSellGrays: boolean | undefined): JunkFilterConfig {
|
|
154
|
+
return normalizeJunkFilterConfig({
|
|
155
|
+
...DEFAULT_JUNK_FILTER_CONFIG,
|
|
156
|
+
autoSell: typeof autoSellGrays === 'boolean' ? autoSellGrays : DEFAULT_JUNK_FILTER_CONFIG.autoSell,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export type JunkListKind = 'keep' | 'sell' | 'destroy';
|
|
161
|
+
|
|
162
|
+
/** Assign entry to one list (mutually exclusive within that layer). Pass null to remove. */
|
|
163
|
+
export function setJunkListMembership(
|
|
164
|
+
cfg: JunkFilterConfig,
|
|
165
|
+
entry: number,
|
|
166
|
+
list: JunkListKind | null,
|
|
167
|
+
): JunkFilterConfig {
|
|
168
|
+
const n = normalizeJunkFilterConfig(cfg);
|
|
169
|
+
const strip = (arr: number[]) => arr.filter((e) => e !== entry);
|
|
170
|
+
const keepEntries = strip(n.keepEntries);
|
|
171
|
+
const sellEntries = strip(n.sellEntries);
|
|
172
|
+
const destroyEntries = strip(n.destroyEntries);
|
|
173
|
+
if (list === 'keep') keepEntries.push(entry);
|
|
174
|
+
else if (list === 'sell') sellEntries.push(entry);
|
|
175
|
+
else if (list === 'destroy') destroyEntries.push(entry);
|
|
176
|
+
return { ...n, keepEntries, sellEntries, destroyEntries };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
export function junkListKindFor(
|
|
180
|
+
cfg: JunkFilterConfig,
|
|
181
|
+
entry: number,
|
|
182
|
+
): JunkListKind | null {
|
|
183
|
+
const n = normalizeJunkFilterConfig(cfg);
|
|
184
|
+
if (n.keepEntries.includes(entry)) return 'keep';
|
|
185
|
+
if (n.sellEntries.includes(entry)) return 'sell';
|
|
186
|
+
if (n.destroyEntries.includes(entry)) return 'destroy';
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export function clearJunkList(cfg: JunkFilterConfig, list: JunkListKind): JunkFilterConfig {
|
|
191
|
+
const n = normalizeJunkFilterConfig(cfg);
|
|
192
|
+
if (list === 'keep') return { ...n, keepEntries: [] };
|
|
193
|
+
if (list === 'sell') return { ...n, sellEntries: [] };
|
|
194
|
+
return { ...n, destroyEntries: [] };
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const mergedRules = new WeakMap<object, WeakMap<object, JunkFilterConfig>>();
|
|
198
|
+
|
|
199
|
+
// Combined quality/auto from both layers (OR). Lists stay separate in disposition order. characterSpecific
|
|
200
|
+
// is ignored — both Global and Character tabs always fully apply.
|
|
201
|
+
export function effectiveJunkRules(
|
|
202
|
+
global: JunkFilterConfig,
|
|
203
|
+
character: CharacterJunkFilterConfig | JunkFilterConfig,
|
|
204
|
+
): JunkFilterConfig {
|
|
205
|
+
const g = normalizeJunkFilterConfig(global);
|
|
206
|
+
const c = normalizeJunkFilterConfig(character);
|
|
207
|
+
let byCharacter = mergedRules.get(g);
|
|
208
|
+
const hit = byCharacter?.get(c);
|
|
209
|
+
if (hit) return hit;
|
|
210
|
+
const sellQuality = { ...g.sellQuality };
|
|
211
|
+
const destroyQuality = { ...g.destroyQuality };
|
|
212
|
+
const sellAllQuality = { ...g.sellAllQuality };
|
|
213
|
+
for (const q of QUALITIES) {
|
|
214
|
+
sellQuality[q] = !!(g.sellQuality[q] || c.sellQuality[q]);
|
|
215
|
+
destroyQuality[q] = !!(g.destroyQuality[q] || c.destroyQuality[q]);
|
|
216
|
+
}
|
|
217
|
+
// Protection is additive, like a keep list: a category either layer guards stays guarded.
|
|
218
|
+
const protectCategories = [...new Set([...g.protectCategories, ...c.protectCategories])];
|
|
219
|
+
const out: JunkFilterConfig = {
|
|
220
|
+
autoSell: !!(g.autoSell || c.autoSell),
|
|
221
|
+
autoDestroy: !!(g.autoDestroy || c.autoDestroy),
|
|
222
|
+
sellQuality,
|
|
223
|
+
destroyQuality,
|
|
224
|
+
keepEntries: c.keepEntries,
|
|
225
|
+
sellEntries: c.sellEntries,
|
|
226
|
+
destroyEntries: c.destroyEntries,
|
|
227
|
+
protectCategories,
|
|
228
|
+
// NOT merged: the vendor's Sell All picker writes the global layer and reads it back, so a
|
|
229
|
+
// stale character copy must never keep a tier ticked that the player just unticked.
|
|
230
|
+
sellAllQuality,
|
|
231
|
+
};
|
|
232
|
+
canonical.add(out);
|
|
233
|
+
if (!byCharacter) { byCharacter = new WeakMap(); mergedRules.set(g, byCharacter); }
|
|
234
|
+
byCharacter.set(c, out);
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export interface JunkEvalContext {
|
|
239
|
+
global: JunkFilterConfig;
|
|
240
|
+
character: CharacterJunkFilterConfig;
|
|
241
|
+
deCfg: AutoDisenchantConfig;
|
|
242
|
+
player: Character;
|
|
243
|
+
playerInv: Inventory;
|
|
244
|
+
playerEquipOpts: EquipOpts;
|
|
245
|
+
companions: readonly Companion[];
|
|
246
|
+
enchanters: readonly PartyEnchanter[];
|
|
247
|
+
ds: DataStore;
|
|
248
|
+
questProtected: ReadonlySet<number>;
|
|
249
|
+
/** One findUpgrades pass per body. Absent → isUpgradeForParty per item (the old cost). */
|
|
250
|
+
upgradeEntries?: ReadonlySet<number>;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Disposition for a bag item (Dejunk priority): quest → char keep → char force destroy/sell → global keep →
|
|
254
|
+
// global force → upgrades → auto-DE claim → quality rules (char if characterSpecific else global).
|
|
255
|
+
export function dispositionForEntry(
|
|
256
|
+
entry: number,
|
|
257
|
+
ctx: JunkEvalContext,
|
|
258
|
+
): { disposition: JunkDisposition; reason: string } {
|
|
259
|
+
const global = normalizeJunkFilterConfig(ctx.global);
|
|
260
|
+
const character = normalizeCharacterJunkFilterConfig(ctx.character);
|
|
261
|
+
const item = ctx.ds.item(entry);
|
|
262
|
+
if (!item) return { disposition: 'keep', reason: 'Unknown item' };
|
|
263
|
+
|
|
264
|
+
if (ctx.questProtected.has(entry)) {
|
|
265
|
+
return { disposition: 'keep', reason: 'Needed for a quest' };
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Character lists (highest list priority).
|
|
269
|
+
if (character.keepEntries.includes(entry)) {
|
|
270
|
+
return { disposition: 'keep', reason: 'Character keep list' };
|
|
271
|
+
}
|
|
272
|
+
if (character.destroyEntries.includes(entry)) {
|
|
273
|
+
return { disposition: 'destroy', reason: 'Character destroy list' };
|
|
274
|
+
}
|
|
275
|
+
if (character.sellEntries.includes(entry)) {
|
|
276
|
+
if ((item.sellPrice ?? 0) > 0) return { disposition: 'sell', reason: 'Character sell list' };
|
|
277
|
+
return { disposition: 'destroy', reason: 'Character sell list (no vendor value)' };
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
// Global lists.
|
|
281
|
+
if (global.keepEntries.includes(entry)) {
|
|
282
|
+
return { disposition: 'keep', reason: 'Global keep list' };
|
|
283
|
+
}
|
|
284
|
+
if (global.destroyEntries.includes(entry)) {
|
|
285
|
+
return { disposition: 'destroy', reason: 'Global destroy list' };
|
|
286
|
+
}
|
|
287
|
+
if (global.sellEntries.includes(entry)) {
|
|
288
|
+
if ((item.sellPrice ?? 0) > 0) return { disposition: 'sell', reason: 'Global sell list' };
|
|
289
|
+
return { disposition: 'destroy', reason: 'Global sell list (no vendor value)' };
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
// Quality auto-sell/destroy must not eat the arrows, the food, the mats or the profession tool
|
|
293
|
+
// the next pull needs. The category list is the one gate the vendor's Sell All shares.
|
|
294
|
+
{
|
|
295
|
+
const cat = protectedCategoryFor(
|
|
296
|
+
item,
|
|
297
|
+
effectiveJunkRules(global, character).protectCategories,
|
|
298
|
+
protectLookupFor(ctx.ds),
|
|
299
|
+
);
|
|
300
|
+
if (cat) return { disposition: 'keep', reason: junkProtectCategoryLabel(cat) };
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
// Auto-DE owns disenchantable non-upgrades when that feature would accept them.
|
|
304
|
+
const q = (item.quality ?? 0) as number;
|
|
305
|
+
const isUpgrade = item.slot != null && q >= 1 && (
|
|
306
|
+
ctx.upgradeEntries
|
|
307
|
+
? ctx.upgradeEntries.has(entry)
|
|
308
|
+
: isUpgradeForParty(
|
|
309
|
+
entry,
|
|
310
|
+
ctx.player,
|
|
311
|
+
ctx.playerInv,
|
|
312
|
+
ctx.playerEquipOpts,
|
|
313
|
+
ctx.companions,
|
|
314
|
+
ctx.ds,
|
|
315
|
+
)
|
|
316
|
+
);
|
|
317
|
+
if (isUpgrade) {
|
|
318
|
+
return {
|
|
319
|
+
disposition: 'keep',
|
|
320
|
+
reason: ctx.companions.length > 0 ? 'Upgrade for you or a companion' : 'Upgrade for you',
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Gate before the call: reading ctx.enchanters builds a companionCharacter per raid member
|
|
325
|
+
// (16.6 ms at 39), and canAutoDisenchantEntry returns on !cfg.enabled as its first line.
|
|
326
|
+
if (ctx.deCfg.enabled) {
|
|
327
|
+
const de = canAutoDisenchantEntry(
|
|
328
|
+
entry,
|
|
329
|
+
ctx.deCfg,
|
|
330
|
+
ctx.player,
|
|
331
|
+
ctx.playerInv,
|
|
332
|
+
ctx.playerEquipOpts,
|
|
333
|
+
ctx.companions,
|
|
334
|
+
ctx.enchanters,
|
|
335
|
+
ctx.ds,
|
|
336
|
+
ctx.questProtected,
|
|
337
|
+
ctx.upgradeEntries,
|
|
338
|
+
);
|
|
339
|
+
if (de.ok) return { disposition: 'keep', reason: 'Auto-disenchant claims' };
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const rules = effectiveJunkRules(global, character);
|
|
343
|
+
const qKey: JunkQuality = q >= 0 && q <= 4 ? (q as JunkQuality) : 4;
|
|
344
|
+
if (rules.sellQuality[qKey] && (item.sellPrice ?? 0) > 0) {
|
|
345
|
+
return { disposition: 'sell', reason: 'Sell by quality' };
|
|
346
|
+
}
|
|
347
|
+
if (rules.destroyQuality[qKey]) {
|
|
348
|
+
return { disposition: 'destroy', reason: 'Destroy by quality' };
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
return { disposition: 'keep', reason: 'No filter matched' };
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/** Unique bag entries matching a disposition. */
|
|
355
|
+
export function bagEntriesWithDisposition(
|
|
356
|
+
inv: Inventory,
|
|
357
|
+
ctx: JunkEvalContext,
|
|
358
|
+
want: JunkDisposition,
|
|
359
|
+
): number[] {
|
|
360
|
+
const seen = new Set<number>();
|
|
361
|
+
const out: number[] = [];
|
|
362
|
+
for (const stk of inv.stacks) {
|
|
363
|
+
if (seen.has(stk.item)) continue;
|
|
364
|
+
seen.add(stk.item);
|
|
365
|
+
if (dispositionForEntry(stk.item, ctx).disposition === want) out.push(stk.item);
|
|
366
|
+
}
|
|
367
|
+
return out;
|
|
368
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// Keyring — a separate unbounded container for BagFamily KEYS items, so keys never flood backpack
|
|
2
|
+
// slots. The classic client grows 4→8→12 by level; we keep it unbounded. Cite: Player.cpp ~8613.
|
|
3
|
+
|
|
4
|
+
import type { ItemDef } from '../../data/schema.ts';
|
|
5
|
+
import type { Inventory, ItemStack } from './inventory.ts';
|
|
6
|
+
import {
|
|
7
|
+
addInstance,
|
|
8
|
+
addItem,
|
|
9
|
+
countItem,
|
|
10
|
+
emptyInventory,
|
|
11
|
+
removeItem,
|
|
12
|
+
takeStack,
|
|
13
|
+
} from './inventory.ts';
|
|
14
|
+
import type { ItemInstance } from './itemInstance.ts';
|
|
15
|
+
import { hasIdentity } from './itemInstance.ts';
|
|
16
|
+
|
|
17
|
+
/** ItemPrototype.h BagFamily KEYS. */
|
|
18
|
+
export const BAG_FAMILY_KEYS = 9;
|
|
19
|
+
|
|
20
|
+
/** ItemPrototype.h ITEM_CLASS_KEY (many keys; not exclusive — see isKeyItem). */
|
|
21
|
+
export const ITEM_CLASS_KEY = 13;
|
|
22
|
+
|
|
23
|
+
// True when the item belongs on the keyring, by BagFamily KEYS only. Class 13 alone is wrong —
|
|
24
|
+
// Defias Gunpowder and Soft-shelled Clam share that class.
|
|
25
|
+
export function isKeyItem(item: ItemDef | null | undefined): boolean {
|
|
26
|
+
if (!item) return false;
|
|
27
|
+
return item.bagFamily === BAG_FAMILY_KEYS;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** Count of a given entry across keyring stacks. */
|
|
31
|
+
export function countKeyring(keyring: Inventory, entry: number): number {
|
|
32
|
+
return countItem(keyring, entry);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Pull every key stack out of a bag inventory into the keyring. Non-keys stay in bags. Used on save migrate
|
|
36
|
+
// and after bulk adds. Pure. Preserves instance identity via addInstance when present.
|
|
37
|
+
export function migrateKeysToKeyring(
|
|
38
|
+
bags: Inventory,
|
|
39
|
+
keyring: Inventory,
|
|
40
|
+
itemDef: (entry: number) => ItemDef | undefined,
|
|
41
|
+
): { bags: Inventory; keyring: Inventory; moved: number } {
|
|
42
|
+
let nextBags = bags;
|
|
43
|
+
let nextKey = keyring;
|
|
44
|
+
let moved = 0;
|
|
45
|
+
// Walk a snapshot of indices so removals stay stable.
|
|
46
|
+
const snapshot = nextBags.stacks.map((s, i) => ({ s, i }));
|
|
47
|
+
// Remove from the end so earlier indices stay valid when we re-scan… easier:
|
|
48
|
+
// rebuild bags without keys.
|
|
49
|
+
const keep: ItemStack[] = [];
|
|
50
|
+
for (const s of nextBags.stacks) {
|
|
51
|
+
const def = itemDef(s.item);
|
|
52
|
+
if (isKeyItem(def)) {
|
|
53
|
+
const maxStack = Math.max(1, def?.stackable ?? 1);
|
|
54
|
+
if (hasIdentity(s)) nextKey = addInstance(nextKey, s, maxStack);
|
|
55
|
+
else nextKey = addItem(nextKey, s.item, s.count, maxStack);
|
|
56
|
+
moved += s.count;
|
|
57
|
+
} else {
|
|
58
|
+
keep.push({ ...s });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
nextBags = { stacks: keep };
|
|
62
|
+
return { bags: nextBags, keyring: nextKey, moved };
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Add a key quantity into the keyring (always succeeds — unbounded). Non-keys are rejected (caller should
|
|
66
|
+
// use bags). Pure.
|
|
67
|
+
export function addToKeyring(
|
|
68
|
+
keyring: Inventory,
|
|
69
|
+
entry: number,
|
|
70
|
+
count: number,
|
|
71
|
+
def: ItemDef | undefined,
|
|
72
|
+
instance?: ItemInstance,
|
|
73
|
+
): Inventory {
|
|
74
|
+
if (count <= 0) return keyring;
|
|
75
|
+
const maxStack = Math.max(1, def?.stackable ?? 1);
|
|
76
|
+
if (instance && hasIdentity(instance)) {
|
|
77
|
+
return addInstance(keyring, { ...instance, item: entry, count }, maxStack);
|
|
78
|
+
}
|
|
79
|
+
return addItem(keyring, entry, count, maxStack);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Remove up to `count` of `entry` from the keyring. Pure. Returns [newKeyring, removedCount]. */
|
|
83
|
+
export function removeFromKeyring(
|
|
84
|
+
keyring: Inventory,
|
|
85
|
+
entry: number,
|
|
86
|
+
count: number,
|
|
87
|
+
): [Inventory, number] {
|
|
88
|
+
return removeItem(keyring, entry, count);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Take the stack at index (for destroy / move). Pure. */
|
|
92
|
+
export function takeKeyringStack(
|
|
93
|
+
keyring: Inventory,
|
|
94
|
+
index: number,
|
|
95
|
+
count: number,
|
|
96
|
+
): [Inventory, ItemInstance | null] {
|
|
97
|
+
return takeStack(keyring, index, count);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export function emptyKeyring(): Inventory {
|
|
101
|
+
return emptyInventory();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Read-only union of bags, keyring and mailbox overflow, for "do I own this?" questions: the
|
|
105
|
+
// keyring broke every gate that asked countItem(inventory, key). Counting only, never written to.
|
|
106
|
+
export function ownedInventory(
|
|
107
|
+
bags: Inventory,
|
|
108
|
+
keyring: Inventory | undefined,
|
|
109
|
+
overflow?: Inventory,
|
|
110
|
+
): Inventory {
|
|
111
|
+
const extra: ItemStack[] = [];
|
|
112
|
+
if (keyring && keyring.stacks.length > 0) extra.push(...keyring.stacks);
|
|
113
|
+
if (overflow && overflow.stacks.length > 0) extra.push(...overflow.stacks);
|
|
114
|
+
if (extra.length === 0) return bags;
|
|
115
|
+
return { ...bags, stacks: [...bags.stacks, ...extra] };
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Spend `count` of `entry` from the bags first, then the keyring, returning how many were actually
|
|
119
|
+
// removed. A door key that had migrated to the keyring was being consumed from the bags, i.e. not.
|
|
120
|
+
export function spendOwned(
|
|
121
|
+
bags: Inventory,
|
|
122
|
+
keyring: Inventory | undefined,
|
|
123
|
+
entry: number,
|
|
124
|
+
count: number,
|
|
125
|
+
): { bags: Inventory; keyring: Inventory; removed: number } {
|
|
126
|
+
const keys = keyring ?? emptyInventory();
|
|
127
|
+
const [nextBags, fromBags] = removeItem(bags, entry, count);
|
|
128
|
+
if (fromBags >= count) return { bags: nextBags, keyring: keys, removed: fromBags };
|
|
129
|
+
const [nextKeys, fromKeys] = removeItem(keys, entry, count - fromBags);
|
|
130
|
+
return { bags: nextBags, keyring: nextKeys, removed: fromBags + fromKeys };
|
|
131
|
+
}
|