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,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alterac Valley's reinforcement race, for the instance surface.
|
|
3
|
+
*
|
|
4
|
+
* `av.ts` runs the full battleground on `BgWorld` — nodes, mines, graveyard cycle, the lot. The
|
|
5
|
+
* raid surface has none of that machinery and does not need most of it: on a push the score moves
|
|
6
|
+
* on exactly three things, and all three are already state the instance run keeps.
|
|
7
|
+
*
|
|
8
|
+
* - a tower falls -75 its owner (BattleGroundAV.h:62 BG_AV_RES_TOWER)
|
|
9
|
+
* - a captain dies -100 their team (BattleGroundAV.h:57 BG_AV_RES_CAPTAIN)
|
|
10
|
+
* - one of yours dies -1 your team (BattleGroundAV.cpp:38-45 HandleKillPlayer)
|
|
11
|
+
*
|
|
12
|
+
* and the general's death ends it outright (BattleGroundAV.cpp:57), which on this surface IS the
|
|
13
|
+
* run completing, because the general is the last encounter.
|
|
14
|
+
*
|
|
15
|
+
* So this is a PURE READ of the run: the cleared encounter ids give the enemy's losses and
|
|
16
|
+
* `avDeaths` gives yours. Nothing here ticks, holds state, or has to be kept in sync — a re-mount
|
|
17
|
+
* recomputes the same number from the same `defeated` list.
|
|
18
|
+
*
|
|
19
|
+
* NOT MODELLED HERE, and deliberately: the mines' one-reinforcement-per-45s tick and node capture
|
|
20
|
+
* (BattleGroundAV.cpp:319-341, :645/:687). Those need an owner per node and a clock, which is the
|
|
21
|
+
* battleground screen's job and the next thing to port.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import type { InstanceDef } from '../../data/schema/encounter.ts';
|
|
25
|
+
import type { InstanceRun } from '../../world/instances.ts';
|
|
26
|
+
import { isCleared } from '../../world/instances.ts';
|
|
27
|
+
import {
|
|
28
|
+
AV_RES_CAPTAIN, AV_RES_TOWER, AV_SCORE_INITIAL_POINTS, AV_SCORE_NEAR_LOSE,
|
|
29
|
+
} from './av.ts';
|
|
30
|
+
import type { AvTeam } from '../../data/alteracValley.ts';
|
|
31
|
+
import { avMineBoard, avNodeBoard } from './avInstanceNodes.ts';
|
|
32
|
+
import { avEnemyStateAt, type AvEnemyState } from './avEnemyPush.ts';
|
|
33
|
+
|
|
34
|
+
export interface AvInstanceScore {
|
|
35
|
+
/** The side the player's raid is on — the def's own wing. */
|
|
36
|
+
team: AvTeam;
|
|
37
|
+
foe: AvTeam;
|
|
38
|
+
/** Reinforcements left, both sides, against `initial`. */
|
|
39
|
+
own: number;
|
|
40
|
+
enemy: number;
|
|
41
|
+
initial: number;
|
|
42
|
+
/** Under BG_AV_NEAR_LOSE — the point the client starts warning. */
|
|
43
|
+
ownNearLose: boolean;
|
|
44
|
+
enemyNearLose: boolean;
|
|
45
|
+
/** Towers of the foe's this raid has taken, and whether the captain is down. */
|
|
46
|
+
towersDown: number;
|
|
47
|
+
captainDown: boolean;
|
|
48
|
+
/** Graveyards this side holds outright, and mines paying into `own`. */
|
|
49
|
+
graveyardsHeld: number;
|
|
50
|
+
minesHeld: number;
|
|
51
|
+
/** The other side's push: what they have taken, what they are on, and whether they won. */
|
|
52
|
+
enemyPush: AvEnemyState;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** An AV wing def, by the id `alterac-valley.ts` builds. */
|
|
56
|
+
export function isAvInstance(instanceId: string): boolean {
|
|
57
|
+
return instanceId === 'alterac-valley-alliance' || instanceId === 'alterac-valley-horde';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function teamOf(def: InstanceDef): AvTeam | null {
|
|
61
|
+
if (!isAvInstance(def.id)) return null;
|
|
62
|
+
return def.wing === 'horde' ? 'horde' : 'alliance';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The reinforcement race for this run, or null when the def is not an AV wing.
|
|
67
|
+
*
|
|
68
|
+
* Encounter ids are `captain-<entry>` / `lieutenant-<entry>` / `general-<entry>`, which
|
|
69
|
+
* `commandersOf` builds off the creature entry — the DB's own key, stable across bakes.
|
|
70
|
+
*/
|
|
71
|
+
export function avInstanceScore(
|
|
72
|
+
def: InstanceDef,
|
|
73
|
+
run: InstanceRun,
|
|
74
|
+
/** Run clock, ms. Drives the enemy push; omit for a board with no opposing raid. */
|
|
75
|
+
elapsedMs = 0,
|
|
76
|
+
): AvInstanceScore | null {
|
|
77
|
+
const team = teamOf(def);
|
|
78
|
+
if (!team) return null;
|
|
79
|
+
const foe: AvTeam = team === 'alliance' ? 'horde' : 'alliance';
|
|
80
|
+
|
|
81
|
+
let towersDown = 0;
|
|
82
|
+
let captainDown = false;
|
|
83
|
+
for (const enc of def.encounters) {
|
|
84
|
+
if (!isCleared(run, enc.id)) continue;
|
|
85
|
+
if (enc.id.startsWith('lieutenant-')) towersDown++;
|
|
86
|
+
else if (enc.id.startsWith('captain-')) captainDown = true;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const enemy = Math.max(
|
|
90
|
+
0,
|
|
91
|
+
AV_SCORE_INITIAL_POINTS - towersDown * AV_RES_TOWER - (captainDown ? AV_RES_CAPTAIN : 0),
|
|
92
|
+
);
|
|
93
|
+
// Your own bar: one off per death, one BACK per mine tick you have banked. Cite:
|
|
94
|
+
// BattleGroundAV.cpp:38-45 HandleKillPlayer; :319-341 the 45 s mine tick. Never above the start,
|
|
95
|
+
// because UpdateScore clamps and a side cannot bank past its opening reinforcements.
|
|
96
|
+
// ...and the other side's push takes YOUR towers and captain on its own clock, which is what
|
|
97
|
+
// makes this a race rather than a one-sided countdown. avEnemyPush.ts owns that cursor.
|
|
98
|
+
const push = avEnemyStateAt(team, elapsedMs);
|
|
99
|
+
const own = Math.max(0, Math.min(
|
|
100
|
+
AV_SCORE_INITIAL_POINTS,
|
|
101
|
+
AV_SCORE_INITIAL_POINTS
|
|
102
|
+
- Math.max(0, run.avDeaths ?? 0)
|
|
103
|
+
- push.costSoFar
|
|
104
|
+
+ Math.max(0, run.avMineIncome ?? 0),
|
|
105
|
+
));
|
|
106
|
+
|
|
107
|
+
const board = avNodeBoard(run);
|
|
108
|
+
const mines = avMineBoard(run);
|
|
109
|
+
return {
|
|
110
|
+
enemyPush: push,
|
|
111
|
+
graveyardsHeld: board.filter((n) => n.owner === team && n.state === 'owned').length,
|
|
112
|
+
minesHeld: mines.filter((m) => m.owner === team).length,
|
|
113
|
+
team,
|
|
114
|
+
foe,
|
|
115
|
+
own,
|
|
116
|
+
enemy,
|
|
117
|
+
initial: AV_SCORE_INITIAL_POINTS,
|
|
118
|
+
ownNearLose: own < AV_SCORE_NEAR_LOSE,
|
|
119
|
+
enemyNearLose: enemy < AV_SCORE_NEAR_LOSE,
|
|
120
|
+
towersDown,
|
|
121
|
+
captainDown,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alterac Valley quest items that belong to ONE faction, so the other side never loots them.
|
|
3
|
+
*
|
|
4
|
+
* ClassicDB z2815 is asymmetric here and our bake is faithful to it:
|
|
5
|
+
*
|
|
6
|
+
* item 17306 "Blood" (Horde, A Gallon of Blood / Lokholar) 126 rows, ALL -100 -> quest drop
|
|
7
|
+
* item 17423 "Storm Crystal" (Alliance, Crystal Cluster / Ivus) 129 rows, ALL +80 -> PLAIN loot
|
|
8
|
+
* item 17422 "Armor Scraps" / "Enemy Booty" (BOTH sides) 183 rows, +80
|
|
9
|
+
*
|
|
10
|
+
* A positive ChanceOrQuestChance is not a quest drop, so `allowsQuestDrop` never runs on the
|
|
11
|
+
* Alliance rows and a Horde player loots Storm Crystals at 80% — which is what the operator saw.
|
|
12
|
+
* The Horde equivalent is gated correctly, so this cannot be fixed by treating the whole table
|
|
13
|
+
* one way: the lock has to come from WHOSE QUEST the item belongs to.
|
|
14
|
+
*
|
|
15
|
+
* That is exactly what `AV_DATA.quests` carries — every AV turn-in with its `team` and its `item`.
|
|
16
|
+
* An item used by both sides (17422 scraps/booty, and the two mine supply runs, which each side
|
|
17
|
+
* turns in at its own mine) stays open to everyone. An item used by ONE side is locked to it.
|
|
18
|
+
*
|
|
19
|
+
* Cite: BattleGroundAV.cpp:161-256 m_teamQuestStatus, baked to AV_DATA.quests.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { AV_QUESTS, type AvTeam } from '../../data/alteracValley.ts';
|
|
23
|
+
|
|
24
|
+
/** item id -> the only team that may loot it. Absent = both sides may. */
|
|
25
|
+
let lockedByItem: Map<number, AvTeam> | null = null;
|
|
26
|
+
|
|
27
|
+
function build(): Map<number, AvTeam> {
|
|
28
|
+
const teamsOf = new Map<number, Set<AvTeam>>();
|
|
29
|
+
for (const q of AV_QUESTS) {
|
|
30
|
+
if (!q.item) continue;
|
|
31
|
+
let set = teamsOf.get(q.item);
|
|
32
|
+
if (!set) { set = new Set(); teamsOf.set(q.item, set); }
|
|
33
|
+
set.add(q.team);
|
|
34
|
+
}
|
|
35
|
+
const out = new Map<number, AvTeam>();
|
|
36
|
+
for (const [item, teams] of teamsOf) {
|
|
37
|
+
if (teams.size === 1) out.set(item, [...teams][0]!);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The team an AV quest item is locked to, or null when both sides use it (or it is not one). */
|
|
43
|
+
export function avQuestItemTeam(itemId: number): AvTeam | null {
|
|
44
|
+
lockedByItem ??= build();
|
|
45
|
+
return lockedByItem.get(itemId) ?? null;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* May `team` loot this item? True for everything that is not a one-faction AV quest item, so a
|
|
50
|
+
* caller can ask about every drop without knowing whether Alterac is involved.
|
|
51
|
+
*/
|
|
52
|
+
export function avAllowsLoot(itemId: number, team: AvTeam): boolean {
|
|
53
|
+
const locked = avQuestItemTeam(itemId);
|
|
54
|
+
return locked == null || locked === team;
|
|
55
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// Alterac's war economy: what a body drops, what a team banks, and what the turn-ins buy.
|
|
2
|
+
// Cite: BattleGroundAV.cpp:156-266 HandleQuestComplete (the nine counters and their thresholds);
|
|
3
|
+
// `reference_loot_template` 1 (battleground_template.PlayerSkinReflootId — AV is the only BG where
|
|
4
|
+
// an enemy player is lootable) and `creature_loot_template` for the field.
|
|
5
|
+
|
|
6
|
+
import type { BgTeam } from './types.ts';
|
|
7
|
+
import type { Rng } from '../../engine/core/rng.ts';
|
|
8
|
+
import { AV_DATA } from '../../data/alteracValley.ts';
|
|
9
|
+
import type { AvQuestRow } from '../../data/alteracValley.ts';
|
|
10
|
+
|
|
11
|
+
/** One stack the auto-loot banked. */
|
|
12
|
+
export interface AvDrop {
|
|
13
|
+
item: number;
|
|
14
|
+
count: number;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** A loot row as the shipped bake holds it, narrowed to what a roll needs. */
|
|
18
|
+
export interface AvLootRow {
|
|
19
|
+
item: number;
|
|
20
|
+
/** ChanceOrQuestChance — negative rows are quest drops and their magnitude is the percent. */
|
|
21
|
+
chance: number;
|
|
22
|
+
min: number;
|
|
23
|
+
max: number;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The milestones a team's turn-ins reach. Thresholds are BattleGroundAV.cpp's own; what each one
|
|
28
|
+
* SPAWNS is a product decision, because CMaNGOS logs a TODO at every one of them (:190, :196, :202,
|
|
29
|
+
* :214, :222, :231, :240, :249). Only waves the DB names a creature for are spawned — the
|
|
30
|
+
* mine-supply "ground assault" has none, so it pays reputation and announces, and spawns nothing.
|
|
31
|
+
*/
|
|
32
|
+
export type AvMilestone =
|
|
33
|
+
| 'air-fleet-1' | 'air-fleet-2' | 'air-fleet-3'
|
|
34
|
+
| 'boss-summon'
|
|
35
|
+
| 'ground-assault'
|
|
36
|
+
| 'cavalry';
|
|
37
|
+
|
|
38
|
+
export interface AvMilestoneEvent {
|
|
39
|
+
milestone: AvMilestone;
|
|
40
|
+
team: BgTeam;
|
|
41
|
+
/** Creature entries the milestone puts on the field, empty when none is sourced. */
|
|
42
|
+
spawns: readonly number[];
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** Cite: .cpp:188/:194/:200 — 120 soldier, 60 lieutenant, 30 commander turn-ins. */
|
|
46
|
+
export const AV_FLEET_THRESHOLDS = [120, 60, 30] as const;
|
|
47
|
+
/** Cite: .cpp:212 — the crystal/blood counter arms the summon at 200. */
|
|
48
|
+
export const AV_BOSS_SUMMON_AT = 200;
|
|
49
|
+
/** Cite: .cpp:220/:229 — 28 home-mine and 7 enemy-mine turn-ins. */
|
|
50
|
+
export const AV_GROUND_ASSAULT_AT = { home: 28, enemy: 7 } as const;
|
|
51
|
+
/** Cite: .cpp:238/:247 — 25 harnesses and 25 emptied stables. */
|
|
52
|
+
export const AV_CAVALRY_AT = 25;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* The beast each side leads home for Empty Stables. Cite: quest 7027 "Locate an Alterac Ram …
|
|
56
|
+
* use the Stormpike Training Collar when you are near"; 7001 the same for a Frostwolf. The
|
|
57
|
+
* collar 17689 / muzzle 17626 is the quest's OWN srcItem, so the verb is standing next to the
|
|
58
|
+
* beast, never a drop — which is why the auto-turn-in pass cannot see this one.
|
|
59
|
+
*/
|
|
60
|
+
export const AV_TAME_BEAST: Readonly<Record<BgTeam, number>> = Object.freeze({
|
|
61
|
+
alliance: 10990, // Alterac Ram
|
|
62
|
+
horde: 10981, // Frostwolf
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The wave each milestone puts on the field. Every entry is the creature the quest is named for:
|
|
67
|
+
* the three wing commanders' own mounts, the two ram/wolf rider units, and the two summoned lords.
|
|
68
|
+
* Cite: `creature_template` 14946/14947/14948 (Slidore/Ichman/Vipore), 14943/14944/14945
|
|
69
|
+
* (Guse/Jeztor/Mulverick), 13576/13577 and 13440/13441, 13419 Ivus and 13256 Lokholar.
|
|
70
|
+
*/
|
|
71
|
+
export const AV_WAVES: Readonly<Record<AvMilestone, Readonly<Record<BgTeam, readonly number[]>>>> =
|
|
72
|
+
Object.freeze({
|
|
73
|
+
'air-fleet-1': { alliance: [14946], horde: [14943] },
|
|
74
|
+
'air-fleet-2': { alliance: [14948], horde: [14944] },
|
|
75
|
+
'air-fleet-3': { alliance: [14947], horde: [14945] },
|
|
76
|
+
'boss-summon': { alliance: [13419], horde: [13256] },
|
|
77
|
+
'ground-assault': { alliance: [], horde: [] },
|
|
78
|
+
cavalry: { alliance: [13577, 13576, 13576, 13576], horde: [13441, 13440, 13440, 13440] },
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
/** Counter slot → the wave it arms. Keyed, not built from the slot, so no cast is needed. */
|
|
82
|
+
const FLEET_MILESTONE: Readonly<Record<number, AvMilestone | undefined>> = Object.freeze({
|
|
83
|
+
1: 'air-fleet-1', 2: 'air-fleet-2', 3: 'air-fleet-3',
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
export interface AvQuestLedgerOpts {
|
|
87
|
+
rng: Rng;
|
|
88
|
+
/** Loot rows for one creature entry. Empty when the creature has no table. */
|
|
89
|
+
lootOf(entry: number): readonly AvLootRow[];
|
|
90
|
+
/** reference_loot_template 1 — what an enemy player's corpse carries in AV. */
|
|
91
|
+
playerLoot(): readonly AvLootRow[];
|
|
92
|
+
/** A turn-in landed; the caller steps the match counter (av.ts completeQuest). */
|
|
93
|
+
onTurnIn(questId: number, team: BgTeam): void;
|
|
94
|
+
/** A milestone was reached — the caller puts its wave on the field. */
|
|
95
|
+
onMilestone?(e: AvMilestoneEvent): void;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export interface AvQuestLedger {
|
|
99
|
+
/** Auto-loot a dead creature for the team that killed it. Returns what was banked. */
|
|
100
|
+
creditKill(entry: number, killer: BgTeam): AvDrop[];
|
|
101
|
+
/** Auto-loot a dead enemy PLAYER. Cite: battleground_template.PlayerSkinReflootId 1. */
|
|
102
|
+
creditPlayerKill(killer: BgTeam): AvDrop[];
|
|
103
|
+
/** Hand in everything this team can, in quest order. Returns the quest ids completed. */
|
|
104
|
+
turnIn(team: BgTeam): number[];
|
|
105
|
+
/** One beast led back to the stable master: steps Empty Stables, half of the cavalry gate.
|
|
106
|
+
* Returns the quest id, or null when this team has no stables row. */
|
|
107
|
+
creditTame(team: BgTeam): number | null;
|
|
108
|
+
held(team: BgTeam): ReadonlyMap<number, number>;
|
|
109
|
+
/** Milestones already reached, so a caller can render the war state. */
|
|
110
|
+
milestones(team: BgTeam): readonly AvMilestone[];
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/** Quests whose turn-in the ledger can complete on its own — the ones with a required item. */
|
|
114
|
+
function autoTurnInQuests(team: BgTeam): AvQuestRow[] {
|
|
115
|
+
// 7027 / 7001 "Empty Stables" carry no ReqItem: they are the return half of the ram quest and
|
|
116
|
+
// are handed in by riding a mount home, which this ledger has no way to observe.
|
|
117
|
+
return AV_DATA.quests.filter((q) => q.team === team && q.item && q.count);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function createAvQuestLedger(o: AvQuestLedgerOpts): AvQuestLedger {
|
|
121
|
+
const bank: Record<BgTeam, Map<number, number>> = { alliance: new Map(), horde: new Map() };
|
|
122
|
+
const counters: Record<BgTeam, number[]> = {
|
|
123
|
+
alliance: new Array<number>(9).fill(0),
|
|
124
|
+
horde: new Array<number>(9).fill(0),
|
|
125
|
+
};
|
|
126
|
+
const reached: Record<BgTeam, Set<AvMilestone>> = { alliance: new Set(), horde: new Set() };
|
|
127
|
+
const questsFor = { alliance: autoTurnInQuests('alliance'), horde: autoTurnInQuests('horde') };
|
|
128
|
+
/** Item ids any AV quest asks for — nothing else is worth banking. */
|
|
129
|
+
const wanted = new Set(AV_DATA.quests.map((q) => q.item).filter((i): i is number => !!i));
|
|
130
|
+
|
|
131
|
+
function roll(rows: readonly AvLootRow[], team: BgTeam): AvDrop[] {
|
|
132
|
+
const out: AvDrop[] = [];
|
|
133
|
+
for (const r of rows) {
|
|
134
|
+
if (!wanted.has(r.item)) continue;
|
|
135
|
+
// A quest row is stored negative and drops for anyone who can use it; a plain row rolls.
|
|
136
|
+
const pct = Math.abs(r.chance);
|
|
137
|
+
if (pct < 100 && o.rng.next() * 100 >= pct) continue;
|
|
138
|
+
const lo = Math.max(1, r.min | 0);
|
|
139
|
+
const hi = Math.max(lo, r.max | 0);
|
|
140
|
+
const count = lo === hi ? lo : lo + o.rng.int(0, hi - lo);
|
|
141
|
+
out.push({ item: r.item, count });
|
|
142
|
+
bank[team].set(r.item, (bank[team].get(r.item) ?? 0) + count);
|
|
143
|
+
}
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function fire(team: BgTeam, m: AvMilestone): void {
|
|
148
|
+
if (reached[team].has(m)) return;
|
|
149
|
+
reached[team].add(m);
|
|
150
|
+
o.onMilestone?.({ milestone: m, team, spawns: AV_WAVES[m][team] });
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** The counter thresholds, read after a turn-in stepped `slot`. */
|
|
154
|
+
function checkMilestones(team: BgTeam, slot: number): void {
|
|
155
|
+
const c = counters[team];
|
|
156
|
+
const fleet = FLEET_MILESTONE[slot];
|
|
157
|
+
if (fleet && c[slot]! >= AV_FLEET_THRESHOLDS[slot - 1]!) fire(team, fleet);
|
|
158
|
+
if (slot === 4 && c[4]! >= AV_BOSS_SUMMON_AT) fire(team, 'boss-summon');
|
|
159
|
+
if ((slot === 5 || slot === 6)
|
|
160
|
+
&& c[5]! >= AV_GROUND_ASSAULT_AT.home && c[6]! >= AV_GROUND_ASSAULT_AT.enemy) {
|
|
161
|
+
fire(team, 'ground-assault');
|
|
162
|
+
}
|
|
163
|
+
if ((slot === 7 || slot === 8) && c[7]! >= AV_CAVALRY_AT && c[8]! >= AV_CAVALRY_AT) {
|
|
164
|
+
fire(team, 'cavalry');
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
creditKill(entry, killer) {
|
|
170
|
+
return roll(o.lootOf(entry), killer);
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
creditPlayerKill(killer) {
|
|
174
|
+
return roll(o.playerLoot(), killer);
|
|
175
|
+
},
|
|
176
|
+
|
|
177
|
+
turnIn(team) {
|
|
178
|
+
const done: number[] = [];
|
|
179
|
+
const held = bank[team];
|
|
180
|
+
// A pass per quest, repeated while anything still fits: 60 scraps is three turn-ins.
|
|
181
|
+
let moved = true;
|
|
182
|
+
while (moved) {
|
|
183
|
+
moved = false;
|
|
184
|
+
for (const q of questsFor[team]) {
|
|
185
|
+
const have = held.get(q.item!) ?? 0;
|
|
186
|
+
if (have < q.count!) continue;
|
|
187
|
+
held.set(q.item!, have - q.count!);
|
|
188
|
+
counters[team][q.slot] = (counters[team][q.slot] ?? 0) + q.step;
|
|
189
|
+
o.onTurnIn(q.id, team);
|
|
190
|
+
checkMilestones(team, q.slot);
|
|
191
|
+
done.push(q.id);
|
|
192
|
+
moved = true;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return done;
|
|
196
|
+
},
|
|
197
|
+
|
|
198
|
+
creditTame(team) {
|
|
199
|
+
const q = AV_DATA.quests.find((r) => r.team === team && r.counter === 'empty-stables');
|
|
200
|
+
if (!q) return null;
|
|
201
|
+
counters[team][q.slot] = (counters[team][q.slot] ?? 0) + (q.step || 1);
|
|
202
|
+
o.onTurnIn(q.id, team);
|
|
203
|
+
checkMilestones(team, q.slot);
|
|
204
|
+
return q.id;
|
|
205
|
+
},
|
|
206
|
+
|
|
207
|
+
held: (team) => bank[team],
|
|
208
|
+
milestones: (team) => [...reached[team]],
|
|
209
|
+
};
|
|
210
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
// Streams an AV creature into the one endless session when a player seat comes near, and hands the
|
|
2
|
+
// seat back when the fight leaves — both halves, as liveAggroStream.ts:545-612 does for the floor.
|
|
3
|
+
|
|
4
|
+
import type { BgTeam, BgUnit, BgUnitId } from './types.ts';
|
|
5
|
+
import type { BgWorld } from './bgWorld.ts';
|
|
6
|
+
import type { AvField } from './avField.ts';
|
|
7
|
+
import type { CombatantSpec } from '../../engine/combat.ts';
|
|
8
|
+
import { COMBAT_DROP_YD } from '../../engine/combat/creatureLeash.ts';
|
|
9
|
+
import { STOREY_DZ_YD } from '../nav/storey.ts';
|
|
10
|
+
|
|
11
|
+
/** How close an NPC gets to a player seat before it becomes a combat body. */
|
|
12
|
+
export const AV_SEAT_YD = 55;
|
|
13
|
+
/** Seat handed back at this range. Wider than AV_SEAT_YD by the floor's own margin (48 -> 64), so a
|
|
14
|
+
* body on the band edge is not streamed in and dropped on the same sync. */
|
|
15
|
+
export const AV_UNSEAT_YD = 73;
|
|
16
|
+
/** Seats an AV match hands to NPCs, live at once. The ally figure leaves room under MAX_ALLIES (78)
|
|
17
|
+
* for the 39 player seats and their pets. */
|
|
18
|
+
export const AV_MAX_NPC_ALLIES = 24;
|
|
19
|
+
export const AV_MAX_NPC_ENEMIES = 40;
|
|
20
|
+
|
|
21
|
+
/** Only the part of CombatSession this bridge touches — domain does not depend on the whole API. */
|
|
22
|
+
export interface AvCombatSession {
|
|
23
|
+
injectEnemy(spec: CombatantSpec, position?: { x: number; y: number; z?: number }): string | null;
|
|
24
|
+
injectAlly?(spec: CombatantSpec, position?: { x: number; y: number; z?: number }): string | null;
|
|
25
|
+
setUnitPosYd(side: string, pos: { x: number; y: number; z?: number }): void;
|
|
26
|
+
unitPosYd?(side: string): { x: number; y: number; z?: number } | null | undefined;
|
|
27
|
+
viewOfSide?(side: string): { hp: number; maxHp: number; engaged?: boolean } | null;
|
|
28
|
+
disengageEnemySides?(sides: readonly string[]): number;
|
|
29
|
+
disengageAllySides?(sides: readonly string[]): number;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface AvSessionOpts {
|
|
33
|
+
world: BgWorld;
|
|
34
|
+
field: AvField;
|
|
35
|
+
session: AvCombatSession;
|
|
36
|
+
/** The side the PLAYER is on — an NPC of this team is injected as an ally, else as an enemy. */
|
|
37
|
+
playerTeam: BgTeam;
|
|
38
|
+
/** CombatantSpec for a creature entry; null leaves the body world-only. */
|
|
39
|
+
specOf(entry: number): CombatantSpec | null;
|
|
40
|
+
/** Called once per injected body, so the screen can keep its own side ↔ unit maps. */
|
|
41
|
+
onSeated?(unit: BgUnit, side: string): void;
|
|
42
|
+
/** The seat this body held is being handed back — the screen drops its own side ↔ unit maps. */
|
|
43
|
+
onReleased?(unit: BgUnit, side: string): void;
|
|
44
|
+
/** An injected NPC just died in the session — the caller banks the AV kill. */
|
|
45
|
+
onKilled?(unit: BgUnit, entry: number, by: BgTeam): void;
|
|
46
|
+
seatYd?: number;
|
|
47
|
+
unseatYd?: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export interface AvSessionBridge {
|
|
51
|
+
/** Seat what is in reach, mirror what is seated, release what the fight left. */
|
|
52
|
+
sync(): void;
|
|
53
|
+
/** side ↔ npc unit id, for the caller's chip/feed lookups. */
|
|
54
|
+
sideOf(unitId: BgUnitId): string | undefined;
|
|
55
|
+
seatedCount(): { allies: number; enemies: number };
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function createAvSessionBridge(o: AvSessionOpts): AvSessionBridge {
|
|
59
|
+
const { world, field, session } = o;
|
|
60
|
+
const seatYd = o.seatYd ?? AV_SEAT_YD;
|
|
61
|
+
const unseatYd = Math.max(o.unseatYd ?? AV_UNSEAT_YD, seatYd + 1);
|
|
62
|
+
const sideByNpc = new Map<BgUnitId, string>();
|
|
63
|
+
const npcBySide = new Map<string, BgUnitId>();
|
|
64
|
+
/** Seats held RIGHT NOW. Counting lifetime injects instead is what made the field go inert. */
|
|
65
|
+
let allies = 0;
|
|
66
|
+
let enemies = 0;
|
|
67
|
+
|
|
68
|
+
/** Player seats — every unit that is NOT an NPC. Both teams: an enemy bot pulls guards too. */
|
|
69
|
+
function seats(): BgUnit[] {
|
|
70
|
+
const out: BgUnit[] = [];
|
|
71
|
+
for (const u of world.units.values()) {
|
|
72
|
+
if (u.npc || !world.alive(u)) continue;
|
|
73
|
+
out.push(u);
|
|
74
|
+
}
|
|
75
|
+
return out;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Nearest player seat ON THE SAME STOREY. Irondeep Mine sits 28-49 yd under the Alliance start,
|
|
79
|
+
* so a planar band gave all 40 enemy seats to troggs in a cave and the match never left the gate. */
|
|
80
|
+
function nearestSeatDist(u: BgUnit, near: readonly BgUnit[]): number {
|
|
81
|
+
let best = Infinity;
|
|
82
|
+
for (const s of near) {
|
|
83
|
+
if (Math.abs((s.z ?? 0) - (u.z ?? 0)) > STOREY_DZ_YD) continue;
|
|
84
|
+
const dx = s.pos.x - u.pos.x;
|
|
85
|
+
const dy = s.pos.y - u.pos.y;
|
|
86
|
+
const d2 = dx * dx + dy * dy;
|
|
87
|
+
if (d2 < best) best = d2;
|
|
88
|
+
}
|
|
89
|
+
return best === Infinity ? Infinity : Math.sqrt(best);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function seat(unit: BgUnit): void {
|
|
93
|
+
const spec = o.specOf(unit.npc!.entry);
|
|
94
|
+
if (!spec) return;
|
|
95
|
+
const pos = { x: unit.pos.x, y: unit.pos.y, z: unit.z };
|
|
96
|
+
let side: string | null = null;
|
|
97
|
+
// A neutral body is hostile to everyone, so it only ever takes an ENEMY seat. Seating it as an
|
|
98
|
+
// ally put half the valley's wildlife — boars, wolves, dreadmaws — inside the player's raid.
|
|
99
|
+
if (unit.team === o.playerTeam && !unit.npc?.neutral) {
|
|
100
|
+
if (allies >= AV_MAX_NPC_ALLIES || !session.injectAlly) return;
|
|
101
|
+
side = session.injectAlly(spec, pos);
|
|
102
|
+
if (side) allies++;
|
|
103
|
+
} else {
|
|
104
|
+
if (enemies >= AV_MAX_NPC_ENEMIES) return;
|
|
105
|
+
side = session.injectEnemy(spec, pos);
|
|
106
|
+
if (side) enemies++;
|
|
107
|
+
}
|
|
108
|
+
if (!side) return;
|
|
109
|
+
// A seat the session recycled off a corpse still carries the dead body's mapping. Drop that
|
|
110
|
+
// first, or two npc ids answer to one side and the corpse keeps writing over the new occupant.
|
|
111
|
+
const previous = npcBySide.get(side);
|
|
112
|
+
if (previous != null && previous !== unit.id) sideByNpc.delete(previous);
|
|
113
|
+
sideByNpc.set(unit.id, side);
|
|
114
|
+
npcBySide.set(side, unit.id);
|
|
115
|
+
o.onSeated?.(unit, side);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/** Give the seat back. `dropOnly` is a body the session already took off the board (a corpse). */
|
|
119
|
+
function release(id: BgUnitId, side: string, dropOnly: boolean): void {
|
|
120
|
+
sideByNpc.delete(id);
|
|
121
|
+
npcBySide.delete(side);
|
|
122
|
+
const u = world.units.get(id);
|
|
123
|
+
const wasAlly = u ? (u.team === o.playerTeam && !u.npc?.neutral) : side.startsWith('ally');
|
|
124
|
+
if (wasAlly) allies = Math.max(0, allies - 1);
|
|
125
|
+
else enemies = Math.max(0, enemies - 1);
|
|
126
|
+
if (!dropOnly) {
|
|
127
|
+
if (wasAlly) session.disengageAllySides?.([side]);
|
|
128
|
+
else session.disengageEnemySides?.([side]);
|
|
129
|
+
// De-streaming a LIVING body is an evade, and an evade heals: the same reset
|
|
130
|
+
// releaseEnemyToPassive does, so the chip and the next inject agree. Cite: EnterEvadeMode.
|
|
131
|
+
if (u) u.hp = u.maxHp;
|
|
132
|
+
}
|
|
133
|
+
if (u) o.onReleased?.(u, side);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return {
|
|
137
|
+
sync() {
|
|
138
|
+
if (world.ended || !world.gatesOpen) return;
|
|
139
|
+
const near = seats();
|
|
140
|
+
|
|
141
|
+
// 1. release what the fight left, FIRST, so the freed seats are available this same sync. An
|
|
142
|
+
// engaged body keeps its seat out to COMBAT_DROP_YD. Cite: liveAggroStream.ts:571-605.
|
|
143
|
+
for (const [id, side] of [...sideByNpc]) {
|
|
144
|
+
const u = world.units.get(id);
|
|
145
|
+
if (!u) { release(id, side, true); continue; }
|
|
146
|
+
if (!world.alive(u)) continue; // the mirror below owns the death, and it drops the seat
|
|
147
|
+
const v = session.viewOfSide?.(side);
|
|
148
|
+
const engaged = !!v && v.hp > 0 && v.hp < v.maxHp;
|
|
149
|
+
if (nearestSeatDist(u, near) > (engaged ? COMBAT_DROP_YD : unseatYd)) release(id, side, false);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// 2. seat what the fight has reached
|
|
153
|
+
for (const u of field.npcs()) {
|
|
154
|
+
if (!world.alive(u) || sideByNpc.has(u.id)) continue;
|
|
155
|
+
if (nearestSeatDist(u, near) <= seatYd) seat(u);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// 3. mirror the seated bodies: world position in, session health out
|
|
159
|
+
for (const [id, side] of [...sideByNpc]) {
|
|
160
|
+
const u = world.units.get(id);
|
|
161
|
+
if (!u) { release(id, side, true); continue; }
|
|
162
|
+
// Chase on top of wander: session owns while engaged; world wander owns OOC.
|
|
163
|
+
// Cite: MotionMaster.cpp:615 Interrupt + :130 top()->Update.
|
|
164
|
+
const v = session.viewOfSide?.(side);
|
|
165
|
+
if (world.alive(u)) {
|
|
166
|
+
if (v?.engaged === true) {
|
|
167
|
+
const at = session.unitPosYd?.(side);
|
|
168
|
+
if (at) {
|
|
169
|
+
u.pos = { x: at.x, y: at.y };
|
|
170
|
+
world.settleZ(u);
|
|
171
|
+
}
|
|
172
|
+
} else {
|
|
173
|
+
session.setUnitPosYd(side, { x: u.pos.x, y: u.pos.y, z: u.z });
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!v || v.maxHp <= 0) continue;
|
|
177
|
+
u.hp = Math.max(0, Math.min(u.maxHp, Math.round((v.hp / v.maxHp) * u.maxHp)));
|
|
178
|
+
if (u.hp > 0 || u.deadUntilMs != null) continue;
|
|
179
|
+
// The killer is whoever it was fighting: an NPC only ever dies to the other side. A
|
|
180
|
+
// NEUTRAL body has no side to be opposite of — it only ever takes an enemy seat here, so
|
|
181
|
+
// the kill is the player team's, not the team `neutralSideFor` parked its body on.
|
|
182
|
+
const by: BgTeam = u.npc!.neutral
|
|
183
|
+
? o.playerTeam
|
|
184
|
+
: (u.team === 'alliance' ? 'horde' : 'alliance');
|
|
185
|
+
// A battleground creature does not respawn on the 30 s cycle - its node event does it.
|
|
186
|
+
world.kill(u, Number.MAX_SAFE_INTEGER);
|
|
187
|
+
o.onKilled?.(u, u.npc!.entry, by);
|
|
188
|
+
// The corpse is the session's to recycle; the bridge stops holding the seat for it.
|
|
189
|
+
release(id, side, true);
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
|
|
193
|
+
sideOf: (unitId) => sideByNpc.get(unitId),
|
|
194
|
+
seatedCount: () => ({ allies, enemies }),
|
|
195
|
+
};
|
|
196
|
+
}
|