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,219 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The other side's push, simulated as ONE agent instead of forty bodies.
|
|
3
|
+
*
|
|
4
|
+
* Operator direction (2026-09-01): "there must be an enemy team doing pve tactics as in running to
|
|
5
|
+
* balinda and galv and clearing their way down the lieutenant bosses, and towers etc until they
|
|
6
|
+
* reach base where they capture it and start boss themselves. preferably coded smart where its
|
|
7
|
+
* same fog of war and we dont need to do all their calculations if we dont see them."
|
|
8
|
+
*
|
|
9
|
+
* So this is deliberately NOT a second raid of live bodies. It is a cursor walking the mirror of
|
|
10
|
+
* your own objective list — their captain, their four tower garrisons, their general — on a clock.
|
|
11
|
+
* The valley is 2,800 yards; you cannot see their push from yours, and a body you never see costs
|
|
12
|
+
* nothing to be right about. What you DO see is the consequence, which is the half that matters:
|
|
13
|
+
*
|
|
14
|
+
* - they take one of your towers -> you lose 75 reinforcements (BattleGroundAV.h:62)
|
|
15
|
+
* - they kill your captain -> you lose 100 (BattleGroundAV.h:57)
|
|
16
|
+
* - they reach and kill YOUR general -> you lose the battle (BattleGroundAV.cpp:57)
|
|
17
|
+
*
|
|
18
|
+
* That is what makes the 600/600 a RACE rather than a decoration: their bar falls because you push,
|
|
19
|
+
* yours falls because they do, and the first general to die ends it.
|
|
20
|
+
*
|
|
21
|
+
* PACE, and the MARCH is why nobody stands on your captain at the horn. `elapsedMs` is time since
|
|
22
|
+
* the horn (the instance surface's own prep is AV_PREP_MS, and it ends before this clock starts):
|
|
23
|
+
* they walk their gate to the first commander and then commander to commander at BASE_RUN_SPEED
|
|
24
|
+
* over corridor yards — their gate to Galvangar is 1,455 yd straight, so ~6.5 min before they touch
|
|
25
|
+
* him — then FIGHT for `AV_CAPTIME_MS` per objective, AV's own node assault clock and one constant
|
|
26
|
+
* to tune rather than a behaviour tree nobody can see.
|
|
27
|
+
*
|
|
28
|
+
* MATERIALISING. `avEnemyVisible` says whether the player is close enough to the cursor to see the
|
|
29
|
+
* push. A caller that wants real bodies spawns them ONLY then — everywhere else the cursor is the
|
|
30
|
+
* whole simulation. That is the fog of war, and it is why this is cheap.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
import { AV_CAPTIME_MS, AV_RES_CAPTAIN, AV_RES_TOWER } from './av.ts';
|
|
34
|
+
import { AV_DATA, avNode, type AvTeam } from '../../data/alteracValley.ts';
|
|
35
|
+
import { BASE_RUN_SPEED } from '../nav/speed.ts';
|
|
36
|
+
import { detHypot } from '../../engine/core/detMath.ts';
|
|
37
|
+
|
|
38
|
+
/** How near the push you must be to see it at all. */
|
|
39
|
+
export const AV_ENEMY_SIGHT_YD = 120;
|
|
40
|
+
|
|
41
|
+
/** Corridor over straight line, mean 1.94 of the four gate-to-commander legs (routed vs straight
|
|
42
|
+
* 2 yd samples 963/417, 1249/729, 1695/830, 1917/1132). Cite: src/dev/capabilities/avRoute.mjs. */
|
|
43
|
+
export const AV_PATH_FACTOR = 1.9;
|
|
44
|
+
|
|
45
|
+
export type AvEnemyObjectiveKind = 'captain' | 'tower' | 'general';
|
|
46
|
+
|
|
47
|
+
export interface AvEnemyObjective {
|
|
48
|
+
kind: AvEnemyObjectiveKind;
|
|
49
|
+
/** Creature entry of the commander they are killing. */
|
|
50
|
+
entry: number;
|
|
51
|
+
name: string;
|
|
52
|
+
x: number;
|
|
53
|
+
y: number;
|
|
54
|
+
z: number;
|
|
55
|
+
/** Reinforcements the defender loses when this falls. */
|
|
56
|
+
cost: number;
|
|
57
|
+
/** Where this leg starts — their gate for the first, the last commander after that. */
|
|
58
|
+
from: { x: number; y: number; z: number };
|
|
59
|
+
/** Corridor yards walked on this leg. */
|
|
60
|
+
marchYd: number;
|
|
61
|
+
/** Time on the road before this fight starts, ms. */
|
|
62
|
+
marchMs: number;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** One objective per this many ms of FIGHTING. Cite: AV_CAPTIME_MS, AV's own node assault clock. */
|
|
66
|
+
export const AV_ENEMY_OBJECTIVE_MS = AV_CAPTIME_MS;
|
|
67
|
+
|
|
68
|
+
/** Corridor yards between two field points, and what walking them costs. */
|
|
69
|
+
function marchOf(
|
|
70
|
+
from: { x: number; y: number },
|
|
71
|
+
to: { x: number; y: number },
|
|
72
|
+
): { marchYd: number; marchMs: number } {
|
|
73
|
+
const marchYd = detHypot(to.x - from.x, to.y - from.y) * AV_PATH_FACTOR;
|
|
74
|
+
return { marchYd, marchMs: (marchYd / BASE_RUN_SPEED) * 1000 };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* What the enemy of `team` works through, in order: your captain, your four towers nearest their
|
|
79
|
+
* gate first, then your general — each leg carrying the walk that reaches it. The mirror of
|
|
80
|
+
* `commandersOf` in data/dungeons/alterac-valley.ts, read off the same bake.
|
|
81
|
+
*/
|
|
82
|
+
export function avEnemyRoute(team: AvTeam): AvEnemyObjective[] {
|
|
83
|
+
const c = AV_DATA.commanders;
|
|
84
|
+
const foe: AvTeam = team === 'alliance' ? 'horde' : 'alliance';
|
|
85
|
+
const gate = AV_DATA.start[foe] ?? { x: 0, y: 0, z: 0 };
|
|
86
|
+
const out: AvEnemyObjective[] = [];
|
|
87
|
+
let from = { x: gate.x, y: gate.y, z: gate.z ?? 0 };
|
|
88
|
+
const push = (o: Omit<AvEnemyObjective, 'from' | 'marchYd' | 'marchMs'>): void => {
|
|
89
|
+
out.push({ ...o, from, ...marchOf(from, o) });
|
|
90
|
+
from = { x: o.x, y: o.y, z: o.z };
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
const captain = c.captain[team];
|
|
94
|
+
if (captain) {
|
|
95
|
+
push({
|
|
96
|
+
kind: 'captain',
|
|
97
|
+
entry: captain.entry,
|
|
98
|
+
name: captain.name,
|
|
99
|
+
x: captain.x,
|
|
100
|
+
y: captain.y,
|
|
101
|
+
z: captain.z,
|
|
102
|
+
cost: AV_RES_CAPTAIN,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
// Your towers, nearest THEIR gate first — the order a push actually meets them.
|
|
106
|
+
const towers = c.lieutenants
|
|
107
|
+
.map((l) => ({ l, node: l.node ? avNode(l.node) : undefined }))
|
|
108
|
+
.filter((r) => r.l.entry != null && r.node != null && r.node.owner === team)
|
|
109
|
+
.sort((a, b) => detHypot(a.node!.x - gate.x, a.node!.y - gate.y)
|
|
110
|
+
- detHypot(b.node!.x - gate.x, b.node!.y - gate.y));
|
|
111
|
+
for (const { l, node } of towers) {
|
|
112
|
+
push({
|
|
113
|
+
kind: 'tower',
|
|
114
|
+
entry: l.entry!,
|
|
115
|
+
name: l.name ?? node!.name,
|
|
116
|
+
x: node!.x,
|
|
117
|
+
y: node!.y,
|
|
118
|
+
z: node!.z,
|
|
119
|
+
cost: AV_RES_TOWER,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
const general = c.boss[team];
|
|
123
|
+
if (general) {
|
|
124
|
+
push({
|
|
125
|
+
kind: 'general',
|
|
126
|
+
entry: general.entry,
|
|
127
|
+
name: general.name,
|
|
128
|
+
x: general.x,
|
|
129
|
+
y: general.y,
|
|
130
|
+
z: general.z,
|
|
131
|
+
// The general ending the battle is not a reinforcement cost — it is the end.
|
|
132
|
+
cost: 0,
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** On the road, in the fight, or finished. */
|
|
139
|
+
export type AvEnemyPhase = 'march' | 'fight' | 'done';
|
|
140
|
+
|
|
141
|
+
export interface AvEnemyState {
|
|
142
|
+
/** How many objectives they have taken. */
|
|
143
|
+
taken: number;
|
|
144
|
+
/** What they are working on now, or null once the general is down. */
|
|
145
|
+
current: AvEnemyObjective | null;
|
|
146
|
+
/** Reinforcements this push has cost the defender so far. */
|
|
147
|
+
costSoFar: number;
|
|
148
|
+
/** Their general kill — the defender has lost. */
|
|
149
|
+
generalDown: boolean;
|
|
150
|
+
/** Fraction of the current FIGHT done, 0..1 — still 0 while they are walking to it. */
|
|
151
|
+
progress: number;
|
|
152
|
+
phase: AvEnemyPhase;
|
|
153
|
+
/** ms left in this phase; 0 once the push is done. */
|
|
154
|
+
phaseLeftMs: number;
|
|
155
|
+
/** Where the push is right now, interpolated along the leg it is walking. */
|
|
156
|
+
at: { x: number; y: number; z: number };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function lerp(
|
|
160
|
+
a: { x: number; y: number; z: number },
|
|
161
|
+
b: { x: number; y: number; z: number },
|
|
162
|
+
f: number,
|
|
163
|
+
): { x: number; y: number; z: number } {
|
|
164
|
+
return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f, z: a.z + (b.z - a.z) * f };
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Where the enemy push stands at `elapsedMs`. Pure: the same clock always gives the same board, so
|
|
169
|
+
* nothing has to be ticked, stored or kept in sync, and a re-mount recomputes it exactly.
|
|
170
|
+
*/
|
|
171
|
+
export function avEnemyStateAt(team: AvTeam, elapsedMs: number): AvEnemyState {
|
|
172
|
+
const route = avEnemyRoute(team);
|
|
173
|
+
const first = route[0];
|
|
174
|
+
if (!first) {
|
|
175
|
+
const nowhere = { x: 0, y: 0, z: 0 };
|
|
176
|
+
return {
|
|
177
|
+
taken: 0, current: null, costSoFar: 0, generalDown: true, progress: 1,
|
|
178
|
+
phase: 'done', phaseLeftMs: 0, at: nowhere,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
let t = Math.max(0, elapsedMs);
|
|
182
|
+
let cost = 0;
|
|
183
|
+
for (let i = 0; i < route.length; i++) {
|
|
184
|
+
const o = route[i]!;
|
|
185
|
+
if (t < o.marchMs) {
|
|
186
|
+
return {
|
|
187
|
+
taken: i, current: o, costSoFar: cost, generalDown: false, progress: 0,
|
|
188
|
+
phase: 'march', phaseLeftMs: o.marchMs - t,
|
|
189
|
+
at: lerp(o.from, o, o.marchMs > 0 ? t / o.marchMs : 1),
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
t -= o.marchMs;
|
|
193
|
+
if (t < AV_ENEMY_OBJECTIVE_MS) {
|
|
194
|
+
return {
|
|
195
|
+
taken: i, current: o, costSoFar: cost, generalDown: false,
|
|
196
|
+
progress: t / AV_ENEMY_OBJECTIVE_MS,
|
|
197
|
+
phase: 'fight', phaseLeftMs: AV_ENEMY_OBJECTIVE_MS - t,
|
|
198
|
+
at: { x: o.x, y: o.y, z: o.z },
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
t -= AV_ENEMY_OBJECTIVE_MS;
|
|
202
|
+
cost += o.cost;
|
|
203
|
+
}
|
|
204
|
+
const last = route[route.length - 1]!;
|
|
205
|
+
return {
|
|
206
|
+
taken: route.length, current: null, costSoFar: cost, generalDown: true, progress: 1,
|
|
207
|
+
phase: 'done', phaseLeftMs: 0, at: { x: last.x, y: last.y, z: last.z },
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** Can the player see the push? Only then is a body worth spawning. */
|
|
212
|
+
export function avEnemyVisible(
|
|
213
|
+
state: AvEnemyState,
|
|
214
|
+
at: { x: number; y: number },
|
|
215
|
+
yd = AV_ENEMY_SIGHT_YD,
|
|
216
|
+
): boolean {
|
|
217
|
+
if (!state.current) return false;
|
|
218
|
+
return detHypot(state.at.x - at.x, state.at.y - at.y) <= yd;
|
|
219
|
+
}
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
// The AV field: the creature bodies a battleground event slot spawns and despawns. Cite:
|
|
2
|
+
// BattleGroundAV.cpp:596 SpawnEvent(node, teamIdx * BG_AV_MAX_STATES + state) — every guard,
|
|
3
|
+
// lieutenant and general on map 30 is a `creature` row tagged by `creature_battleground`.
|
|
4
|
+
|
|
5
|
+
import type { BgPos, BgTeam, BgUnit, BgUnitId } from './types.ts';
|
|
6
|
+
import type { BgWorld } from './bgWorld.ts';
|
|
7
|
+
import type { AvFieldHooks } from './av.ts';
|
|
8
|
+
import { AV_DATA } from '../../data/alteracValley.ts';
|
|
9
|
+
import type { AvSpawnRow } from '../../data/alteracValley.ts';
|
|
10
|
+
import type { FactionTemplateDef } from '../../data/schema.ts';
|
|
11
|
+
import { factionHasNoEnemies } from '../creature/faction.ts';
|
|
12
|
+
import { isScriptAnchorCreature } from '../creature/unitFlags.ts';
|
|
13
|
+
|
|
14
|
+
/** How far a guard chases before it turns back to its post. Cite: creature_template.leash default. */
|
|
15
|
+
export const AV_GUARD_LEASH_YD = 40;
|
|
16
|
+
/** A general or a captain holds its room and never leaves it. */
|
|
17
|
+
export const AV_COMMANDER_LEASH_YD = 25;
|
|
18
|
+
|
|
19
|
+
export interface AvBody {
|
|
20
|
+
name: string;
|
|
21
|
+
level: number;
|
|
22
|
+
maxHp: number;
|
|
23
|
+
/** Player class id when the creature maps to one, else 0 — only drives the chip glyph. */
|
|
24
|
+
cls: number;
|
|
25
|
+
/** Yards/second. Cite: creature_template.SpeedRun × BASE_RUN_SPEED. */
|
|
26
|
+
speedYd: number;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface AvFieldOpts {
|
|
30
|
+
world: BgWorld;
|
|
31
|
+
/** Which side a creature entry fights for, from `creature_template.FactionAlliance`. */
|
|
32
|
+
teamOf(entry: number): BgTeam | null;
|
|
33
|
+
/** Level / health / speed for one creature entry; null drops the body. */
|
|
34
|
+
bodyOf(entry: number): AvBody | null;
|
|
35
|
+
onSpawn?(unit: BgUnit): void;
|
|
36
|
+
onDespawn?(unit: BgUnit): void;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface AvField extends AvFieldHooks {
|
|
40
|
+
/** The always-on half of the map: wildlife, quest givers, base guards, the generals' rooms. */
|
|
41
|
+
spawnStatic(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Put one body on the field with no event slot behind it — what a quest milestone buys
|
|
44
|
+
* (avQuests.ts AV_WAVES). It marches on the enemy keep rather than holding a post.
|
|
45
|
+
*/
|
|
46
|
+
spawnWaveBody(entry: number, team: BgTeam, at: BgPos, marchTo: BgPos): BgUnit | null;
|
|
47
|
+
/** Living bodies of one creature entry. */
|
|
48
|
+
unitsOfEntry(entry: number): BgUnit[];
|
|
49
|
+
/** Every NPC body currently on the field. */
|
|
50
|
+
npcs(): BgUnit[];
|
|
51
|
+
/** Bodies within `yd` of a point — what a session would have to seat to make a fight real. */
|
|
52
|
+
near(x: number, y: number, yd: number): BgUnit[];
|
|
53
|
+
/** Total spawned so far, for the capability rows. */
|
|
54
|
+
spawnedCount(): number;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const COMMANDER_ENTRIES = new Set<number>(
|
|
58
|
+
[
|
|
59
|
+
AV_DATA.commanders.boss.alliance?.entry,
|
|
60
|
+
AV_DATA.commanders.boss.horde?.entry,
|
|
61
|
+
AV_DATA.commanders.captain.alliance?.entry,
|
|
62
|
+
AV_DATA.commanders.captain.horde?.entry,
|
|
63
|
+
...AV_DATA.commanders.lieutenants.map((l) => l.entry),
|
|
64
|
+
].filter((e): e is number => typeof e === 'number'),
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
/** Spawn rows grouped by their event slot, so a flip is one map lookup rather than a scan. */
|
|
68
|
+
function indexByEvent(rows: readonly AvSpawnRow[]): Map<number, Map<number, AvSpawnRow[]>> {
|
|
69
|
+
const out = new Map<number, Map<number, AvSpawnRow[]>>();
|
|
70
|
+
for (const r of rows) {
|
|
71
|
+
if (r.event1 == null) continue;
|
|
72
|
+
let byVariant = out.get(r.event1);
|
|
73
|
+
if (!byVariant) { byVariant = new Map(); out.set(r.event1, byVariant); }
|
|
74
|
+
const list = byVariant.get(r.event2 ?? 0);
|
|
75
|
+
if (list) list.push(r);
|
|
76
|
+
else byVariant.set(r.event2 ?? 0, [r]);
|
|
77
|
+
}
|
|
78
|
+
return out;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Templates that must never get a floor body: a script anchor, or a template at war with nobody.
|
|
83
|
+
* Without this the 3 PvP credit markers, the 6 wing-commander triggers, the 2 Invisible Stalkers
|
|
84
|
+
* and the 4 Heralds - 17 of the 1,198 AV spawn rows - fall through `teamOf` as neutral, take a
|
|
85
|
+
* side from `neutralSideFor` below, and stand in the valley as 1 hp enemies.
|
|
86
|
+
* Cite: Relations.cpp:365 CanAttack; faction template 35 (enemyMask 0, no enemy factions).
|
|
87
|
+
*/
|
|
88
|
+
export function avNonCombatTemplate(
|
|
89
|
+
creature: { unitFlags?: number } | null | undefined,
|
|
90
|
+
ft: FactionTemplateDef | null | undefined,
|
|
91
|
+
): boolean {
|
|
92
|
+
if (!creature) return true;
|
|
93
|
+
if (isScriptAnchorCreature(creature)) return true;
|
|
94
|
+
return !!ft && factionHasNoEnemies(ft);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* PRODUCT RULE. The valley's wildlife and the neutral mine crews (troggs, gnolls, harpies, rams)
|
|
99
|
+
* are hostile to BOTH sides in 1.12, and a two-team world has no way to say that. Each such body
|
|
100
|
+
* takes the side whose keep is FARTHER from it, so the team living next to a pack has to fight it —
|
|
101
|
+
* which is how the mine and the armor-scrap farm actually play. Deterministic, so a replay matches.
|
|
102
|
+
*/
|
|
103
|
+
function neutralSideFor(row: AvSpawnRow): BgTeam {
|
|
104
|
+
const a = AV_DATA.commanders.boss.alliance;
|
|
105
|
+
const h = AV_DATA.commanders.boss.horde;
|
|
106
|
+
if (!a || !h) return 'horde';
|
|
107
|
+
const da = (row.x - a.x) ** 2 + (row.y - a.y) ** 2;
|
|
108
|
+
const dh = (row.x - h.x) ** 2 + (row.y - h.y) ** 2;
|
|
109
|
+
return da > dh ? 'alliance' : 'horde';
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function createAvField(o: AvFieldOpts): AvField {
|
|
113
|
+
const { world } = o;
|
|
114
|
+
const byEvent = indexByEvent(AV_DATA.spawns);
|
|
115
|
+
/** Live unit ids per event slot, so a re-spawn despawns exactly what it replaces. */
|
|
116
|
+
const liveByEvent = new Map<number, BgUnitId[]>();
|
|
117
|
+
const liveByEntry = new Map<number, Set<BgUnitId>>();
|
|
118
|
+
const npcIds = new Set<BgUnitId>();
|
|
119
|
+
let spawned = 0;
|
|
120
|
+
let seq = 0;
|
|
121
|
+
|
|
122
|
+
const remember = (u: BgUnit): void => {
|
|
123
|
+
npcIds.add(u.id);
|
|
124
|
+
let set = liveByEntry.get(u.npc!.entry);
|
|
125
|
+
if (!set) { set = new Set(); liveByEntry.set(u.npc!.entry, set); }
|
|
126
|
+
set.add(u.id);
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const forget = (u: BgUnit): void => {
|
|
130
|
+
npcIds.delete(u.id);
|
|
131
|
+
liveByEntry.get(u.npc!.entry)?.delete(u.id);
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
function spawnRow(row: AvSpawnRow): BgUnit | null {
|
|
135
|
+
const team = o.teamOf(row.entry);
|
|
136
|
+
const body = o.bodyOf(row.entry);
|
|
137
|
+
if (!body) return null;
|
|
138
|
+
// A neutral creature still needs a side to fight on. `neutralSideFor` is a PRODUCT RULE — see
|
|
139
|
+
// its own note; two teams cannot express "hostile to everyone".
|
|
140
|
+
const side: BgTeam = team ?? neutralSideFor(row);
|
|
141
|
+
const unit: BgUnit = {
|
|
142
|
+
id: `n${seq++}`,
|
|
143
|
+
team: side,
|
|
144
|
+
name: body.name || row.name,
|
|
145
|
+
cls: body.cls,
|
|
146
|
+
level: body.level,
|
|
147
|
+
pos: { x: row.x, y: row.y },
|
|
148
|
+
z: row.z,
|
|
149
|
+
hp: body.maxHp,
|
|
150
|
+
maxHp: body.maxHp,
|
|
151
|
+
// A general, captain or tower lieutenant reads as `npc-commander`, which is what the AV
|
|
152
|
+
// strategy bundle aims a push at (strategies.ts avKillCommander).
|
|
153
|
+
role: COMMANDER_ENTRIES.has(row.entry) ? 'npc-commander' : 'npc-guard',
|
|
154
|
+
order: { kind: 'hold' },
|
|
155
|
+
speedYd: body.speedYd,
|
|
156
|
+
human: false,
|
|
157
|
+
npc: {
|
|
158
|
+
entry: row.entry,
|
|
159
|
+
// `teamOf` returned nothing, so no faction template claims it: wildlife and mine trash.
|
|
160
|
+
...(team == null ? { neutral: true } : {}),
|
|
161
|
+
...(row.event1 == null ? {} : { event1: row.event1, event2: row.event2 }),
|
|
162
|
+
post: { x: row.x, y: row.y },
|
|
163
|
+
leashYd: COMMANDER_ENTRIES.has(row.entry) ? AV_COMMANDER_LEASH_YD : AV_GUARD_LEASH_YD,
|
|
164
|
+
// MovementType 1 is MOVEMENT_RANDOM — 312 of the valley's spawn rows carry it, and every
|
|
165
|
+
// one of them stood frozen. Cite: creature.MovementType/spawndist; ObjectMgr.cpp LoadCreatures.
|
|
166
|
+
...(row.movementType === 1 && (row.spawndist ?? 0) > 0
|
|
167
|
+
? { wanderYd: row.spawndist }
|
|
168
|
+
: {}),
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
world.addUnit(unit);
|
|
172
|
+
remember(unit);
|
|
173
|
+
spawned++;
|
|
174
|
+
o.onSpawn?.(unit);
|
|
175
|
+
return unit;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
function despawnEvent(event1: number): void {
|
|
179
|
+
const ids = liveByEvent.get(event1);
|
|
180
|
+
if (!ids) return;
|
|
181
|
+
for (const id of ids) {
|
|
182
|
+
const u = world.units.get(id);
|
|
183
|
+
if (!u) continue;
|
|
184
|
+
forget(u);
|
|
185
|
+
world.units.delete(id);
|
|
186
|
+
o.onDespawn?.(u);
|
|
187
|
+
}
|
|
188
|
+
liveByEvent.set(event1, []);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
spawnEvent(event1, variant) {
|
|
193
|
+
despawnEvent(event1);
|
|
194
|
+
if (variant == null) return;
|
|
195
|
+
const rows = byEvent.get(event1)?.get(variant);
|
|
196
|
+
if (!rows) return;
|
|
197
|
+
const ids: BgUnitId[] = [];
|
|
198
|
+
for (const row of rows) {
|
|
199
|
+
const u = spawnRow(row);
|
|
200
|
+
if (u) ids.push(u.id);
|
|
201
|
+
}
|
|
202
|
+
liveByEvent.set(event1, ids);
|
|
203
|
+
},
|
|
204
|
+
|
|
205
|
+
entryAlive(entry) {
|
|
206
|
+
const set = liveByEntry.get(entry);
|
|
207
|
+
if (!set) return false;
|
|
208
|
+
for (const id of set) {
|
|
209
|
+
const u = world.units.get(id);
|
|
210
|
+
if (u && world.alive(u)) return true;
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
},
|
|
214
|
+
|
|
215
|
+
spawnStatic() {
|
|
216
|
+
for (const row of AV_DATA.spawns) {
|
|
217
|
+
if (row.event1 != null) continue;
|
|
218
|
+
spawnRow(row);
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
|
|
222
|
+
spawnWaveBody(entry, team, at, marchTo) {
|
|
223
|
+
const body = o.bodyOf(entry);
|
|
224
|
+
if (!body) return null;
|
|
225
|
+
const unit = {
|
|
226
|
+
id: `n${seq++}`,
|
|
227
|
+
team,
|
|
228
|
+
name: body.name,
|
|
229
|
+
cls: body.cls,
|
|
230
|
+
level: body.level,
|
|
231
|
+
pos: { x: at.x, y: at.y },
|
|
232
|
+
z: 0,
|
|
233
|
+
hp: body.maxHp,
|
|
234
|
+
maxHp: body.maxHp,
|
|
235
|
+
// A wave is not a guard: it walks the length of the valley, so it holds no post and its
|
|
236
|
+
// leash is the whole map. Cite: BattleGroundAV.cpp:190 — the C++ never implemented this.
|
|
237
|
+
role: 'npc-commander' as const,
|
|
238
|
+
order: { kind: 'attack-move' as const, to: { x: marchTo.x, y: marchTo.y } },
|
|
239
|
+
speedYd: body.speedYd,
|
|
240
|
+
human: false,
|
|
241
|
+
npc: { entry, post: { x: marchTo.x, y: marchTo.y }, leashYd: 4000 },
|
|
242
|
+
};
|
|
243
|
+
world.addUnit(unit);
|
|
244
|
+
remember(unit);
|
|
245
|
+
spawned++;
|
|
246
|
+
o.onSpawn?.(unit);
|
|
247
|
+
return unit;
|
|
248
|
+
},
|
|
249
|
+
|
|
250
|
+
unitsOfEntry(entry) {
|
|
251
|
+
const out: BgUnit[] = [];
|
|
252
|
+
for (const id of liveByEntry.get(entry) ?? []) {
|
|
253
|
+
const u = world.units.get(id);
|
|
254
|
+
if (u) out.push(u);
|
|
255
|
+
}
|
|
256
|
+
return out;
|
|
257
|
+
},
|
|
258
|
+
|
|
259
|
+
npcs() {
|
|
260
|
+
const out: BgUnit[] = [];
|
|
261
|
+
for (const id of npcIds) {
|
|
262
|
+
const u = world.units.get(id);
|
|
263
|
+
if (u) out.push(u);
|
|
264
|
+
}
|
|
265
|
+
return out;
|
|
266
|
+
},
|
|
267
|
+
|
|
268
|
+
near(x, y, yd) {
|
|
269
|
+
const out: BgUnit[] = [];
|
|
270
|
+
const r2 = yd * yd;
|
|
271
|
+
for (const id of npcIds) {
|
|
272
|
+
const u = world.units.get(id);
|
|
273
|
+
if (!u || !world.alive(u)) continue;
|
|
274
|
+
const dx = u.pos.x - x;
|
|
275
|
+
const dy = u.pos.y - y;
|
|
276
|
+
if (dx * dx + dy * dy <= r2) out.push(u);
|
|
277
|
+
}
|
|
278
|
+
return out;
|
|
279
|
+
},
|
|
280
|
+
|
|
281
|
+
spawnedCount: () => spawned,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alterac Valley's nodes and mines, for the instance surface.
|
|
3
|
+
*
|
|
4
|
+
* Operator direction (2026-09-01): "all AV things needs to stay, rest shud be exact same as raid".
|
|
5
|
+
* The reinforcement race already rides the run as a pure read (avInstanceScore). Capture does not:
|
|
6
|
+
* a node has an OWNER and an assault CLOCK, which is state, so it lives on `InstanceRun` beside the
|
|
7
|
+
* rest of the floor's progress and is restored on a re-mount like everything else there.
|
|
8
|
+
*
|
|
9
|
+
* The rules, all from the same source `av.ts` reads for the battleground screen:
|
|
10
|
+
*
|
|
11
|
+
* - a click starts an assault, 10 s (AV_CAPTURE_CAST_MS, BattleGroundAV.h)
|
|
12
|
+
* - an assault matures to owned after 4 minutes (AV_CAPTIME_MS, BattleGroundAV.h:296-300)
|
|
13
|
+
* - you may assault anything you do not own, and re-take your own assaulted point
|
|
14
|
+
* (avClaimIntent — .cpp:687/:645 refuse an assault by the current owner)
|
|
15
|
+
* - each mine you hold pays one reinforcement every 45 s (AV_MINE_TICK_MS, .h:28-29)
|
|
16
|
+
*
|
|
17
|
+
* TOWERS ARE NOT HERE. On this surface a tower falls when its garrison dies, and that is already an
|
|
18
|
+
* encounter — `avInstanceScore` reads it off `defeated` and charges the 75. Modelling tower capture
|
|
19
|
+
* again would be two owners for one fact, which is the exact mistake that made the old AV screen
|
|
20
|
+
* jiggle. This module owns the SEVEN graveyards and the TWO mines, and nothing else.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import type { InstanceRun } from '../../world/instances.ts';
|
|
24
|
+
import { AV_DATA, AV_MINES, AV_NODES, type AvTeam } from '../../data/alteracValley.ts';
|
|
25
|
+
import { AV_CAPTIME_MS, AV_CAPTURE_CAST_MS, AV_MINE_TICK_MS } from './av.ts';
|
|
26
|
+
import { detHypot } from '../../engine/core/detMath.ts';
|
|
27
|
+
|
|
28
|
+
/** How close you must stand to claim a point. Cite: ObjectDefines.h:25 INTERACTION_DISTANCE is 5 yd
|
|
29
|
+
* for a click, but a flag is claimed from its base — av.ts uses the node radius the world does. */
|
|
30
|
+
export const AV_NODE_CLAIM_YD = 12;
|
|
31
|
+
|
|
32
|
+
export type AvNodeState = 'owned' | 'assaulted';
|
|
33
|
+
|
|
34
|
+
export interface AvNodeStatus {
|
|
35
|
+
id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
kind: 'graveyard' | 'tower';
|
|
38
|
+
owner: AvTeam | null;
|
|
39
|
+
state: AvNodeState;
|
|
40
|
+
/** Run-clock ms the assault matures on; absent while owned. */
|
|
41
|
+
maturesAtMs?: number;
|
|
42
|
+
x: number;
|
|
43
|
+
y: number;
|
|
44
|
+
z: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Persisted shape — kept narrow so a save carries the least that rebuilds the board. */
|
|
48
|
+
export type AvNodeSave = { o: AvTeam | null; s: AvNodeState; m?: number };
|
|
49
|
+
|
|
50
|
+
/** Graveyards only: towers are encounters (see the header). */
|
|
51
|
+
export function avCaptureNodes(): typeof AV_NODES {
|
|
52
|
+
return AV_NODES.filter((n) => n.kind === 'graveyard');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** The board, defaults from the DB where the run has said nothing yet. */
|
|
56
|
+
export function avNodeBoard(run: InstanceRun): AvNodeStatus[] {
|
|
57
|
+
const saved = run.avNodes ?? {};
|
|
58
|
+
return avCaptureNodes().map((n) => {
|
|
59
|
+
const s = saved[n.id];
|
|
60
|
+
const out: AvNodeStatus = {
|
|
61
|
+
id: n.id,
|
|
62
|
+
name: n.name,
|
|
63
|
+
kind: n.kind,
|
|
64
|
+
owner: s ? s.o : n.owner,
|
|
65
|
+
state: s ? s.s : 'owned',
|
|
66
|
+
x: n.x,
|
|
67
|
+
y: n.y,
|
|
68
|
+
z: n.z,
|
|
69
|
+
};
|
|
70
|
+
if (s?.m != null) out.maturesAtMs = s.m;
|
|
71
|
+
return out;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* May `team` claim this node right now? Mirrors av.ts avClaimIntent: never your own controlled
|
|
77
|
+
* point, and an assaulted point is claimable by anyone but the side that started the assault.
|
|
78
|
+
*/
|
|
79
|
+
export function avClaimable(node: AvNodeStatus, team: AvTeam): boolean {
|
|
80
|
+
if (node.state === 'owned') return node.owner !== team;
|
|
81
|
+
return node.owner !== team;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Nodes within claim range of a point, closest first. */
|
|
85
|
+
export function avNodesInReach(
|
|
86
|
+
run: InstanceRun,
|
|
87
|
+
at: { x: number; y: number },
|
|
88
|
+
yd = AV_NODE_CLAIM_YD,
|
|
89
|
+
): AvNodeStatus[] {
|
|
90
|
+
return avNodeBoard(run)
|
|
91
|
+
.map((n) => ({ n, d: detHypot(n.x - at.x, n.y - at.y) }))
|
|
92
|
+
.filter((r) => r.d <= yd)
|
|
93
|
+
.sort((a, b) => a.d - b.d)
|
|
94
|
+
.map((r) => r.n);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function writeNode(run: InstanceRun, id: string, row: AvNodeSave): void {
|
|
98
|
+
const next: Record<string, AvNodeSave> = { ...(run.avNodes ?? {}) };
|
|
99
|
+
next[id] = row;
|
|
100
|
+
run.avNodes = next;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Start an assault on `id` for `team`. Returns the ms the assault matures on, or null when the
|
|
105
|
+
* node is not claimable. The 10 s cast is the CALLER's (a cast bar); this records the outcome.
|
|
106
|
+
*/
|
|
107
|
+
export function avBeginAssault(
|
|
108
|
+
run: InstanceRun,
|
|
109
|
+
id: string,
|
|
110
|
+
team: AvTeam,
|
|
111
|
+
nowMs: number,
|
|
112
|
+
): number | null {
|
|
113
|
+
const node = avNodeBoard(run).find((n) => n.id === id);
|
|
114
|
+
if (!node || !avClaimable(node, team)) return null;
|
|
115
|
+
const matures = nowMs + AV_CAPTIME_MS;
|
|
116
|
+
writeNode(run, id, { o: team, s: 'assaulted', m: matures });
|
|
117
|
+
return matures;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Mature every assault whose clock has run out. Returns the ids that flipped to owned. */
|
|
121
|
+
export function avSettleAssaults(run: InstanceRun, nowMs: number): string[] {
|
|
122
|
+
const flipped: string[] = [];
|
|
123
|
+
for (const n of avNodeBoard(run)) {
|
|
124
|
+
if (n.state !== 'assaulted' || n.maturesAtMs == null) continue;
|
|
125
|
+
if (nowMs < n.maturesAtMs) continue;
|
|
126
|
+
writeNode(run, n.id, { o: n.owner, s: 'owned' });
|
|
127
|
+
flipped.push(n.id);
|
|
128
|
+
}
|
|
129
|
+
return flipped;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// ---- mines ----------------------------------------------------------------
|
|
133
|
+
|
|
134
|
+
export interface AvMineStatus {
|
|
135
|
+
id: string;
|
|
136
|
+
name: string;
|
|
137
|
+
owner: AvTeam | null;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/** Both mines, neutral until a side takes one. Cite: BattleGroundAV.cpp:104-113. */
|
|
141
|
+
export function avMineBoard(run: InstanceRun): AvMineStatus[] {
|
|
142
|
+
const saved = run.avMines ?? {};
|
|
143
|
+
return AV_MINES.map((m) => ({ id: m.id, name: m.name, owner: saved[m.id] ?? null }));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export function avSetMineOwner(run: InstanceRun, id: string, team: AvTeam): void {
|
|
147
|
+
run.avMines = { ...(run.avMines ?? {}), [id]: team };
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Pay every held mine's 45 s tick since the last call, and bank the result on the run.
|
|
152
|
+
* Returns the reinforcements `team` gained this call. Cite: BattleGroundAV.cpp:319-341.
|
|
153
|
+
*/
|
|
154
|
+
export function avMineTick(run: InstanceRun, team: AvTeam, nowMs: number): number {
|
|
155
|
+
const held = avMineBoard(run).filter((m) => m.owner === team).length;
|
|
156
|
+
const last = run.avMineTickAtMs ?? nowMs;
|
|
157
|
+
if (!held) { run.avMineTickAtMs = nowMs; return 0; }
|
|
158
|
+
const ticks = Math.floor((nowMs - last) / AV_MINE_TICK_MS);
|
|
159
|
+
if (ticks <= 0) return 0;
|
|
160
|
+
run.avMineTickAtMs = last + ticks * AV_MINE_TICK_MS;
|
|
161
|
+
const gained = ticks * held;
|
|
162
|
+
run.avMineIncome = (run.avMineIncome ?? 0) + gained;
|
|
163
|
+
return gained;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** The capture cast a click owes, so a caller never re-derives it. */
|
|
167
|
+
export const AV_ASSAULT_CAST_MS = AV_CAPTURE_CAST_MS;
|
|
168
|
+
/** Match-clock ms an assault needs to mature. */
|
|
169
|
+
export const AV_ASSAULT_MATURE_MS = AV_CAPTIME_MS;
|
|
170
|
+
/** Graveyard a dead raider of `team` should rez at — the held one nearest the corpse. */
|
|
171
|
+
export function avNearestOwnedGraveyard(
|
|
172
|
+
run: InstanceRun,
|
|
173
|
+
team: AvTeam,
|
|
174
|
+
at: { x: number; y: number },
|
|
175
|
+
): AvNodeStatus | null {
|
|
176
|
+
const held = avNodeBoard(run).filter((n) => n.owner === team && n.state === 'owned');
|
|
177
|
+
if (!held.length) return null;
|
|
178
|
+
let best = held[0]!;
|
|
179
|
+
let bestD = Infinity;
|
|
180
|
+
for (const n of held) {
|
|
181
|
+
const d = detHypot(n.x - at.x, n.y - at.y);
|
|
182
|
+
if (d < bestD) { bestD = d; best = n; }
|
|
183
|
+
}
|
|
184
|
+
return best;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/** Start-of-match defaults, so a fresh run shows the DB's own board. */
|
|
188
|
+
export function avSeedBoard(run: InstanceRun): void {
|
|
189
|
+
if (run.avNodes) return;
|
|
190
|
+
const seed: Record<string, AvNodeSave> = {};
|
|
191
|
+
for (const n of avCaptureNodes()) seed[n.id] = { o: n.owner, s: 'owned' };
|
|
192
|
+
run.avNodes = seed;
|
|
193
|
+
run.avMines = {};
|
|
194
|
+
run.avMineTickAtMs = 0;
|
|
195
|
+
run.avMineIncome = 0;
|
|
196
|
+
void AV_DATA;
|
|
197
|
+
}
|