azeroth-shell 0.0.0-stage → 0.1.1
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 +35 -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 +144 -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,43 @@
|
|
|
1
|
+
// MOD_TAUNT (11) — the session-side apply and clear of threat-list taunt state. It does NOT equalize
|
|
2
|
+
// threat, which is the separate attack-me effect; while it holds, victim selection prefers the taunter.
|
|
3
|
+
import type { ActiveEffect, Fighter } from './types.ts';
|
|
4
|
+
import type { ThreatManager } from './threat.ts';
|
|
5
|
+
import { TAUNT_STATE } from './threat.ts';
|
|
6
|
+
import { isEnemySide } from '../core/events.ts';
|
|
7
|
+
|
|
8
|
+
// Apply MOD_TAUNT on an enemy threat list: ensure taunter is listed, set STATE_TAUNTED, force current
|
|
9
|
+
// victim. Returns the ActiveEffect row to track duration (or null if skipped).
|
|
10
|
+
export function applyModTauntAura(
|
|
11
|
+
tm: ThreatManager,
|
|
12
|
+
src: Fighter,
|
|
13
|
+
tgt: Fighter,
|
|
14
|
+
spellId: number,
|
|
15
|
+
name: string,
|
|
16
|
+
expiresAt: number,
|
|
17
|
+
): ActiveEffect | null {
|
|
18
|
+
if (!isEnemySide(tgt.side)) return null;
|
|
19
|
+
// Ensure the taunter is on the list so SetTauntState has a reference.
|
|
20
|
+
// Cite: ThreatManager.cpp:557–575 — taunt states keyed by caster guid on threat refs.
|
|
21
|
+
tm.addThreatDirectly(src.side, 0, false);
|
|
22
|
+
tm.setTauntState(src.side, TAUNT_STATE.TAUNTED);
|
|
23
|
+
tm.setCurrentVictimByTarget(src.side);
|
|
24
|
+
return {
|
|
25
|
+
kind: 'mod_taunt',
|
|
26
|
+
source: src.side,
|
|
27
|
+
target: tgt.side,
|
|
28
|
+
spellId,
|
|
29
|
+
name,
|
|
30
|
+
expiresAt,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Clear MOD_TAUNT when the aura expires or is stripped. The C++ re-scans the remaining taunt auras, so
|
|
35
|
+
// the state clears only when no other same-source row still holds on this target.
|
|
36
|
+
function clearModTauntAura(
|
|
37
|
+
tm: ThreatManager,
|
|
38
|
+
taunterId: string,
|
|
39
|
+
remainingSameSource: boolean,
|
|
40
|
+
): void {
|
|
41
|
+
if (remainingSameSource) return;
|
|
42
|
+
tm.setTauntState(taunterId, TAUNT_STATE.NONE);
|
|
43
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
// ONE motion decision per unit at a time. The chain already runs one arm a tick; what this book fixes
|
|
2
|
+
// is re-deciding from scratch, per-arm latches nobody else could see, and 19 producers with no priority.
|
|
3
|
+
|
|
4
|
+
import type { CombatPosYd } from './combatGeometry.ts';
|
|
5
|
+
import { detHypot } from '../core/detMath.ts';
|
|
6
|
+
|
|
7
|
+
// Who is moving the unit. The priority table below mirrors the `advanceGapClose` chain, so arbitration
|
|
8
|
+
// cannot silently re-order what the chain already decides inside one tick.
|
|
9
|
+
export type MotionOwner =
|
|
10
|
+
/** Knockback / leap / charge arrival / teleport — a displacement, not a decision. */
|
|
11
|
+
| 'forced'
|
|
12
|
+
/** Fear, DoFlee, NO_MELEE_FLEE. Cite: FleeingMovementGenerator. */
|
|
13
|
+
| 'flee'
|
|
14
|
+
/** Scripted mechanic move (a rotation `move` row). */
|
|
15
|
+
| 'mechanic'
|
|
16
|
+
/** Held direction — WASD / virtual stick. */
|
|
17
|
+
| 'key'
|
|
18
|
+
/** Explicit player dest that must survive a pre-cast: the `holdCourse` click. */
|
|
19
|
+
| 'course'
|
|
20
|
+
/** Authored after-cast retreat (`after.stepBackYd`). */
|
|
21
|
+
| 'stepback'
|
|
22
|
+
/** Explicit player dest — floor click, RTS order, summon reposition. */
|
|
23
|
+
| 'click'
|
|
24
|
+
/** Policy dest — autopilot route step, loot approach, formation, camera recentre. */
|
|
25
|
+
| 'route'
|
|
26
|
+
/** Pet bar Stay / Follow. */
|
|
27
|
+
| 'pet'
|
|
28
|
+
/** Guardian / spirit MoveFollow. */
|
|
29
|
+
| 'follow'
|
|
30
|
+
/** Hold-ground return to anchor (`cfg.friendlyHoldYd`). */
|
|
31
|
+
| 'home'
|
|
32
|
+
/** Melee flank slot / cone rotation slide. */
|
|
33
|
+
| 'flank'
|
|
34
|
+
/** AI gap-close and the ranged stand band. */
|
|
35
|
+
| 'chase';
|
|
36
|
+
|
|
37
|
+
/** Higher wins. Same order as the chain in `advanceGapClose`. */
|
|
38
|
+
export const MOTION_PRIO: Record<MotionOwner, number> = {
|
|
39
|
+
forced: 110,
|
|
40
|
+
flee: 100,
|
|
41
|
+
mechanic: 90,
|
|
42
|
+
key: 80,
|
|
43
|
+
course: 75,
|
|
44
|
+
stepback: 70,
|
|
45
|
+
click: 60,
|
|
46
|
+
route: 55,
|
|
47
|
+
pet: 50,
|
|
48
|
+
follow: 45,
|
|
49
|
+
home: 40,
|
|
50
|
+
flank: 30,
|
|
51
|
+
chase: 20,
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// How long a live claim may not be taken by an owner at or BELOW its priority. Zero for anything a
|
|
55
|
+
// person does or a script forces; non-zero only where the flip was actually measured.
|
|
56
|
+
export const MOTION_HOLD_MS: Record<MotionOwner, number> = {
|
|
57
|
+
forced: 0,
|
|
58
|
+
flee: 0,
|
|
59
|
+
mechanic: 0,
|
|
60
|
+
key: 0,
|
|
61
|
+
course: 0,
|
|
62
|
+
stepback: 0,
|
|
63
|
+
click: 0,
|
|
64
|
+
// A policy walk owns the unit until it arrives, capped so a wedged one cannot hold it for the fight.
|
|
65
|
+
// Two seconds measured best: 246 yd walked and 99 reversals became 87 and 12.
|
|
66
|
+
route: 2_000,
|
|
67
|
+
pet: 0,
|
|
68
|
+
follow: 0,
|
|
69
|
+
home: 0,
|
|
70
|
+
flank: 800,
|
|
71
|
+
// Chase is the floor of the order, so a hold here could only ever block chase itself.
|
|
72
|
+
chase: 0,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
// After an owner releases, how long before that SAME owner may claim again — the settle latch
|
|
76
|
+
// generalised. Without it a slide that just finished re-solves against the boundary and walks back in.
|
|
77
|
+
export const MOTION_SETTLE_MS: Record<MotionOwner, number> = {
|
|
78
|
+
forced: 0,
|
|
79
|
+
flee: 0,
|
|
80
|
+
mechanic: 0,
|
|
81
|
+
key: 0,
|
|
82
|
+
course: 0,
|
|
83
|
+
stepback: 0,
|
|
84
|
+
click: 0,
|
|
85
|
+
route: 0,
|
|
86
|
+
pet: 0,
|
|
87
|
+
follow: 0,
|
|
88
|
+
home: 0,
|
|
89
|
+
flank: 1_500,
|
|
90
|
+
chase: 0,
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// Yards the goal must move before the SAME owner may re-aim. A mob that walked half a yard is not a new
|
|
94
|
+
// destination. Zero for a person: every click is a new goal, however small.
|
|
95
|
+
export const MOTION_REAIM_YD: Record<MotionOwner, number> = {
|
|
96
|
+
forced: 0,
|
|
97
|
+
flee: 0,
|
|
98
|
+
mechanic: 0,
|
|
99
|
+
key: 0,
|
|
100
|
+
course: 0,
|
|
101
|
+
stepback: 0,
|
|
102
|
+
click: 0,
|
|
103
|
+
route: 2.5,
|
|
104
|
+
pet: 0,
|
|
105
|
+
follow: 0,
|
|
106
|
+
home: 0,
|
|
107
|
+
flank: 1,
|
|
108
|
+
// Zero on purpose. A chase goal is a moving body, and the corridor churn a band would stop is already
|
|
109
|
+
// stopped by the path regrid. With a 2 yd band the aim lagged and catch-up cost 200 yd for 37 net.
|
|
110
|
+
chase: 0,
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
export type MotionClaim = {
|
|
114
|
+
owner: MotionOwner;
|
|
115
|
+
/** Goal in combat yards. `key` passes its per-tick aim — a null goal reads as a refusal
|
|
116
|
+
* through `takeMotion`, which is exactly how WASD shipped dead (sessionMoveIntent.ts:54). */
|
|
117
|
+
goal: CombatPosYd | null;
|
|
118
|
+
since: number;
|
|
119
|
+
/** No owner at or below this priority may take the claim before this. */
|
|
120
|
+
holdUntil: number;
|
|
121
|
+
/** Last tick this owner moved the unit — a claim nobody refreshes is stale, not eternal. */
|
|
122
|
+
touched: number;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
// A claim nobody refreshed for this many ticks is dead. Motion runs every tick for every living unit,
|
|
126
|
+
// so staleness IS the release for every arm whose settle window is zero.
|
|
127
|
+
const CLAIM_STALE_TICKS = 3;
|
|
128
|
+
|
|
129
|
+
export type MotionClaimOpts = {
|
|
130
|
+
/** Skip the dead band and the settle window (a person acted). */
|
|
131
|
+
force?: boolean;
|
|
132
|
+
/** Override the owner's hold window — the authored step-back walks its own deadline. */
|
|
133
|
+
holdMs?: number;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export type MotionClaims = {
|
|
137
|
+
// Take motion for `owner` toward `goal`, or return false and move nothing this tick. A refusal is final
|
|
138
|
+
// for the tick: the caller returns, it never falls through to a lower arm.
|
|
139
|
+
take: (
|
|
140
|
+
side: string,
|
|
141
|
+
owner: MotionOwner,
|
|
142
|
+
goal: CombatPosYd | null,
|
|
143
|
+
now: number,
|
|
144
|
+
opts?: MotionClaimOpts,
|
|
145
|
+
) => boolean;
|
|
146
|
+
/** Owner of this unit's live motion, or null. */
|
|
147
|
+
ownerOf: (side: string, now: number) => MotionOwner | null;
|
|
148
|
+
/** Goal the live claim is walking, or null. */
|
|
149
|
+
goalOf: (side: string, now: number) => CombatPosYd | null;
|
|
150
|
+
/** Arrived / cancelled: drop the claim and start this owner's settle window. */
|
|
151
|
+
release: (side: string, owner: MotionOwner, now: number) => void;
|
|
152
|
+
/** A displacement landed (knockback, leap, teleport): nothing anyone was walking survives. */
|
|
153
|
+
breakAll: (side: string) => void;
|
|
154
|
+
/** Priority / settle denials since session start — proves the gate is not inert. */
|
|
155
|
+
refused: () => number;
|
|
156
|
+
/** Same-owner re-aims kept inside the dead band: the goal churn that no longer happens. */
|
|
157
|
+
reaimsKept: () => number;
|
|
158
|
+
/** Grants where the owner changed. High means the arms are still trading the unit. */
|
|
159
|
+
handovers: () => number;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
export function createMotionClaims(tickMs: number): MotionClaims {
|
|
163
|
+
const staleMs = Math.max(1, tickMs) * CLAIM_STALE_TICKS;
|
|
164
|
+
const live = new Map<string, MotionClaim>();
|
|
165
|
+
/** side -> owner -> earliest tick that owner may claim again. */
|
|
166
|
+
const settle = new Map<string, Map<MotionOwner, number>>();
|
|
167
|
+
// Per side and owner, the last goal that owner walked, kept AFTER the claim ends. The dead band has to
|
|
168
|
+
// outlive arrival or a wobbling dest re-claims as brand new — 220 yd walked for 40 net.
|
|
169
|
+
const lastGoal = new Map<string, Map<MotionOwner, CombatPosYd>>();
|
|
170
|
+
let refused = 0;
|
|
171
|
+
let reaimsKept = 0;
|
|
172
|
+
let handovers = 0;
|
|
173
|
+
|
|
174
|
+
const fresh = (cur: MotionClaim | undefined, now: number, side: string): MotionClaim | null => {
|
|
175
|
+
if (!cur) return null;
|
|
176
|
+
// The owner stopped moving without releasing (a cast started, its arm went ineligible).
|
|
177
|
+
// Without this a one-tick claim would hold the unit for the rest of the fight.
|
|
178
|
+
if (now - cur.touched > staleMs) {
|
|
179
|
+
live.delete(side);
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return cur;
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
return {
|
|
186
|
+
take: (side, owner, goal, now, opts) => {
|
|
187
|
+
const held = fresh(live.get(side), now, side);
|
|
188
|
+
const prio = MOTION_PRIO[owner];
|
|
189
|
+
if (held && held.owner !== owner) {
|
|
190
|
+
// Below the holder always waits. At or above it waits only out the hold window.
|
|
191
|
+
if (prio < MOTION_PRIO[held.owner] || now < held.holdUntil) {
|
|
192
|
+
refused += 1;
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
} else if (held) {
|
|
196
|
+
// Same owner re-aiming. A goal inside the dead band IS the live goal: keep the claim and
|
|
197
|
+
// its corridor instead of issuing a new one every tick.
|
|
198
|
+
const band = opts?.force === true ? 0 : MOTION_REAIM_YD[owner];
|
|
199
|
+
if (band > 0 && held.goal && goal
|
|
200
|
+
&& detHypot(goal.x - held.goal.x, goal.y - held.goal.y) <= band) {
|
|
201
|
+
// Not a denial: the owner keeps the unit and keeps walking the goal it already has.
|
|
202
|
+
held.touched = now;
|
|
203
|
+
reaimsKept += 1;
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
// A NEW goal from the same owner inside its own hold window is a re-plan, and a re-plan is not
|
|
207
|
+
// an intention. This is the arm that stops a policy producer redrawing the walk every few ticks.
|
|
208
|
+
if (opts?.force !== true && now < held.holdUntil) {
|
|
209
|
+
held.touched = now;
|
|
210
|
+
refused += 1;
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
} else if (opts?.force !== true) {
|
|
214
|
+
if ((settle.get(side)?.get(owner) ?? 0) > now) {
|
|
215
|
+
refused += 1;
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
const band = MOTION_REAIM_YD[owner];
|
|
219
|
+
const prevGoal = band > 0 ? lastGoal.get(side)?.get(owner) : undefined;
|
|
220
|
+
if (prevGoal && goal
|
|
221
|
+
&& detHypot(goal.x - prevGoal.x, goal.y - prevGoal.y) <= band) {
|
|
222
|
+
reaimsKept += 1;
|
|
223
|
+
return false;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (!held || held.owner !== owner) handovers += 1;
|
|
227
|
+
if (goal) {
|
|
228
|
+
let byOwner = lastGoal.get(side);
|
|
229
|
+
if (!byOwner) {
|
|
230
|
+
byOwner = new Map();
|
|
231
|
+
lastGoal.set(side, byOwner);
|
|
232
|
+
}
|
|
233
|
+
byOwner.set(owner, { x: goal.x, y: goal.y });
|
|
234
|
+
}
|
|
235
|
+
live.set(side, {
|
|
236
|
+
owner,
|
|
237
|
+
goal: goal ? { ...goal } : null,
|
|
238
|
+
since: held && held.owner === owner ? held.since : now,
|
|
239
|
+
holdUntil: now + (opts?.holdMs ?? MOTION_HOLD_MS[owner]),
|
|
240
|
+
touched: now,
|
|
241
|
+
});
|
|
242
|
+
return true;
|
|
243
|
+
},
|
|
244
|
+
ownerOf: (side, now) => fresh(live.get(side), now, side)?.owner ?? null,
|
|
245
|
+
goalOf: (side, now) => fresh(live.get(side), now, side)?.goal ?? null,
|
|
246
|
+
release: (side, owner, now) => {
|
|
247
|
+
const cur = live.get(side);
|
|
248
|
+
if (cur && cur.owner !== owner) return;
|
|
249
|
+
live.delete(side);
|
|
250
|
+
const ms = MOTION_SETTLE_MS[owner];
|
|
251
|
+
if (ms <= 0) return;
|
|
252
|
+
let byOwner = settle.get(side);
|
|
253
|
+
if (!byOwner) {
|
|
254
|
+
byOwner = new Map();
|
|
255
|
+
settle.set(side, byOwner);
|
|
256
|
+
}
|
|
257
|
+
byOwner.set(owner, now + ms);
|
|
258
|
+
},
|
|
259
|
+
breakAll: (side) => {
|
|
260
|
+
live.delete(side);
|
|
261
|
+
settle.delete(side);
|
|
262
|
+
lastGoal.delete(side);
|
|
263
|
+
},
|
|
264
|
+
refused: () => refused,
|
|
265
|
+
reaimsKept: () => reaimsKept,
|
|
266
|
+
handovers: () => handovers,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// WHY a unit did not move, named at the gate that stopped it. More than twenty early returns stop a
|
|
2
|
+
// unit dead and from outside they are indistinguishable. Diagnosis only — nothing reads it back.
|
|
3
|
+
|
|
4
|
+
// The gate that resolved a unit's motion this tick, in `advanceGapClose` order. `stepped` is the only one
|
|
5
|
+
// that means the unit actually walked.
|
|
6
|
+
export type MotionGateName =
|
|
7
|
+
/** No geometry on this session — motion never runs. */
|
|
8
|
+
| 'noPositions'
|
|
9
|
+
| 'dead'
|
|
10
|
+
| 'casting'
|
|
11
|
+
| 'charging'
|
|
12
|
+
| 'channeling'
|
|
13
|
+
/** Root / stun / incapacitate / SESSILE. */
|
|
14
|
+
| 'immobile'
|
|
15
|
+
/** Fear, DoFlee, NO_MELEE_FLEE — forced flight, not a stop. */
|
|
16
|
+
| 'fleeing'
|
|
17
|
+
| 'totem'
|
|
18
|
+
/** A rotation `move` row owns the unit. */
|
|
19
|
+
| 'mechanicMove'
|
|
20
|
+
/** Held key / stick. */
|
|
21
|
+
| 'moveIntent'
|
|
22
|
+
/** After-cast authored retreat. */
|
|
23
|
+
| 'stepBack'
|
|
24
|
+
/** Click-to-move / RTS order is walking it. */
|
|
25
|
+
| 'moveOrder'
|
|
26
|
+
/** The player holds motion (kiting latch) — gap-close may not take over. */
|
|
27
|
+
| 'manualMotion'
|
|
28
|
+
| 'petCommand'
|
|
29
|
+
| 'guardianFollow'
|
|
30
|
+
| 'spiritFollow'
|
|
31
|
+
/** RTS stance hold / passive. */
|
|
32
|
+
| 'stance'
|
|
33
|
+
/** Enemy with an empty threat list: no pull yet. */
|
|
34
|
+
| 'notEngaged'
|
|
35
|
+
/** cfg.friendlyHoldYd bubble — walking home, not toward a foe. */
|
|
36
|
+
| 'holdGround'
|
|
37
|
+
/** cfg.partyFollowYd bubble — no target in acquire range, walking back to the leader. */
|
|
38
|
+
| 'partyFollow'
|
|
39
|
+
/** EventAI / ScriptDev combat movement off: stands and fights, never gap-closes. */
|
|
40
|
+
| 'noCombatMovement'
|
|
41
|
+
| 'noTarget'
|
|
42
|
+
/** `foeOf`'s "no living hostiles" sentinel handed back the unit itself. */
|
|
43
|
+
| 'targetIsSelf'
|
|
44
|
+
/** One of the two units has no position this tick. */
|
|
45
|
+
| 'noPose'
|
|
46
|
+
/** Different floor: dz past STOREY_DZ_YD, which folds combat distance out of range. */
|
|
47
|
+
| 'storeyMismatch'
|
|
48
|
+
| 'pastAcquire'
|
|
49
|
+
/** Past COMBAT_DROP_YD: the leash dropped the fight. Cite: CombatManager.cpp:41. */
|
|
50
|
+
| 'combatDrop'
|
|
51
|
+
/** 100% snare / immobilised by aura stack. */
|
|
52
|
+
| 'speedZero'
|
|
53
|
+
/** The unreachable watchdog fired and the unit evaded. */
|
|
54
|
+
| 'unreachable'
|
|
55
|
+
/** A higher-priority arm owns motion this tick (motionClaim.ts). */
|
|
56
|
+
| 'claimHeldBy'
|
|
57
|
+
/** Already inside its stand band with range, storey and LOS. */
|
|
58
|
+
| 'inRange'
|
|
59
|
+
/** `movement: 'hold'` never closes voluntarily. */
|
|
60
|
+
| 'policyHold'
|
|
61
|
+
/** The step would walk inside an unpulled passive's GetAttackDistance — chain pull. */
|
|
62
|
+
| 'wouldPull'
|
|
63
|
+
/** No melee weapon and no fireable range: nothing to close for. */
|
|
64
|
+
| 'noWeapon'
|
|
65
|
+
/** The claim was taken but no corridor reached the slot — stand and fight. */
|
|
66
|
+
| 'noRoute'
|
|
67
|
+
| 'stepped';
|
|
68
|
+
|
|
69
|
+
/** Inputs the gate read, when it read any. Absent means the gate did not measure it. */
|
|
70
|
+
export interface MotionGateInfo {
|
|
71
|
+
dist?: number;
|
|
72
|
+
acquire?: number;
|
|
73
|
+
dz?: number;
|
|
74
|
+
threat?: number;
|
|
75
|
+
ms?: number;
|
|
76
|
+
owner?: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** What `session.motionExplain(side)` hands back: the gate plus whatever it measured. */
|
|
80
|
+
export interface MotionGateReport extends MotionGateInfo {
|
|
81
|
+
gate: MotionGateName;
|
|
82
|
+
/** `ctx.t` of the tick that wrote this row. */
|
|
83
|
+
at: number;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export type MotionGates = {
|
|
87
|
+
/** Record the gate that resolved this side's motion. Last write in a tick wins. */
|
|
88
|
+
mark: (side: string, gate: MotionGateName, at: number, info?: MotionGateInfo) => void;
|
|
89
|
+
/** This side's last gate, or null when motion has never resolved it. */
|
|
90
|
+
read: (side: string) => MotionGateReport | null;
|
|
91
|
+
/** Every side that has a row — the shape `navDiag()` returns. */
|
|
92
|
+
all: () => Record<string, MotionGateReport>;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/** Live row: fixed shape, mutated in place, so a 40-man raid allocates once per side. */
|
|
96
|
+
interface LiveGate {
|
|
97
|
+
gate: MotionGateName;
|
|
98
|
+
at: number;
|
|
99
|
+
dist: number;
|
|
100
|
+
acquire: number;
|
|
101
|
+
dz: number;
|
|
102
|
+
threat: number;
|
|
103
|
+
ms: number;
|
|
104
|
+
owner: string;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** NaN / '' is "the gate did not measure this", which `report` drops rather than pass on. */
|
|
108
|
+
function report(r: LiveGate): MotionGateReport {
|
|
109
|
+
const out: MotionGateReport = { gate: r.gate, at: r.at };
|
|
110
|
+
if (Number.isFinite(r.dist)) out.dist = r.dist;
|
|
111
|
+
if (Number.isFinite(r.acquire)) out.acquire = r.acquire;
|
|
112
|
+
if (Number.isFinite(r.dz)) out.dz = r.dz;
|
|
113
|
+
if (Number.isFinite(r.threat)) out.threat = r.threat;
|
|
114
|
+
if (Number.isFinite(r.ms)) out.ms = r.ms;
|
|
115
|
+
if (r.owner !== '') out.owner = r.owner;
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function createMotionGates(): MotionGates {
|
|
120
|
+
const live = new Map<string, LiveGate>();
|
|
121
|
+
return {
|
|
122
|
+
mark: (side, gate, at, info) => {
|
|
123
|
+
let r = live.get(side);
|
|
124
|
+
if (!r) {
|
|
125
|
+
r = {
|
|
126
|
+
gate, at, dist: Number.NaN, acquire: Number.NaN, dz: Number.NaN,
|
|
127
|
+
threat: Number.NaN, ms: Number.NaN, owner: '',
|
|
128
|
+
};
|
|
129
|
+
live.set(side, r);
|
|
130
|
+
}
|
|
131
|
+
r.gate = gate;
|
|
132
|
+
r.at = at;
|
|
133
|
+
r.dist = info?.dist ?? Number.NaN;
|
|
134
|
+
r.acquire = info?.acquire ?? Number.NaN;
|
|
135
|
+
r.dz = info?.dz ?? Number.NaN;
|
|
136
|
+
r.threat = info?.threat ?? Number.NaN;
|
|
137
|
+
r.ms = info?.ms ?? Number.NaN;
|
|
138
|
+
r.owner = info?.owner ?? '';
|
|
139
|
+
},
|
|
140
|
+
read: (side) => {
|
|
141
|
+
const r = live.get(side);
|
|
142
|
+
return r ? report(r) : null;
|
|
143
|
+
},
|
|
144
|
+
all: () => {
|
|
145
|
+
const out: Record<string, MotionGateReport> = {};
|
|
146
|
+
for (const [side, r] of live) out[side] = report(r);
|
|
147
|
+
return out;
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// One motion behaviour as an object that owns its own state, mirroring the C++ generator: "am I stuck",
|
|
2
|
+
// "where do I reset to" and "what kind am I" are questions the behaviour answers about itself.
|
|
3
|
+
|
|
4
|
+
import type { MotionOwner } from './motionClaim.ts';
|
|
5
|
+
import type { CombatPosYd } from './combatGeometry.ts';
|
|
6
|
+
import type { Fighter } from './types.ts';
|
|
7
|
+
|
|
8
|
+
export interface MotionGenerator {
|
|
9
|
+
/** GetMovementGeneratorType (MovementGenerator.h:48). MOTION_PRIO orders these. */
|
|
10
|
+
readonly owner: MotionOwner;
|
|
11
|
+
// Update: true when this generator HANDLED the unit this tick, so nothing below it may run — a
|
|
12
|
+
// deliberate stand is handled. False means it declined and the chain falls through.
|
|
13
|
+
update: (f: Fighter, tickMs: number) => boolean;
|
|
14
|
+
/** Initialize (`:37`) — before this generator goes on the unit's stack. */
|
|
15
|
+
initialize?: (f: Fighter) => void;
|
|
16
|
+
/** Finalize (`:39`) — off the stack for good; drop the unit's per-leg state here. */
|
|
17
|
+
finalize?: (f: Fighter) => void;
|
|
18
|
+
/** Interrupt (`:42`) — something took the top; keep state, stop steering. */
|
|
19
|
+
interrupt?: (f: Fighter) => void;
|
|
20
|
+
/** Reset (`:44`) — back on top after the generator above it left. */
|
|
21
|
+
reset?: (f: Fighter) => void;
|
|
22
|
+
// IsReachable: false when this generator's own dest cannot be walked to from here. Today an outside
|
|
23
|
+
// arm decides that off a plan-level test; the phase that makes this the input is still ahead.
|
|
24
|
+
isReachable?: (f: Fighter) => boolean;
|
|
25
|
+
/** GetResetPosition (`:55`) — where an evade sends the unit back to. */
|
|
26
|
+
resetPosition?: (f: Fighter) => CombatPosYd | null;
|
|
27
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
// Line of sight for a live combat tick — one implementation for casts and AoE fan-out. Three callers
|
|
2
|
+
// each carried their own copy of translate-then-test, and none knew about the storey stack.
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
sightClearForMap,
|
|
6
|
+
} from '../../domain/nav/nav.ts';
|
|
7
|
+
import { findNearestPoly, navMeshForMap } from '../../domain/nav/navmesh.ts';
|
|
8
|
+
import { type CombatPosYd, type PullGeometryAnchor } from './combatGeometry.ts';
|
|
9
|
+
|
|
10
|
+
export interface NavSightCfg {
|
|
11
|
+
geometryAnchor?: PullGeometryAnchor;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
// A combat-yard offset to client world, when the session is anchored to real coordinates. The z is
|
|
15
|
+
// carried, and that is the whole reason this works: without it every test matched any stacked layer.
|
|
16
|
+
function toWorld(p: CombatPosYd, anchor: PullGeometryAnchor | undefined): CombatPosYd {
|
|
17
|
+
const o = anchor?.frame === 'world-translated' ? anchor.origin : undefined;
|
|
18
|
+
const x = o ? o.x + p.x : p.x;
|
|
19
|
+
const y = o ? o.y + p.y : p.y;
|
|
20
|
+
// One literal per shape, not `{ ...xy, z }`: the spread was 235 ms of CopyDataProperties
|
|
21
|
+
// on top of 234 ms of toWorld itself (Firefox capture 2026-08-20).
|
|
22
|
+
return p.z != null && Number.isFinite(p.z) ? { x, y, z: p.z } : { x, y };
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Is this body on the floor? The SAME question motion asks, to the same tolerance — a stricter one
|
|
26
|
+
// here made a step that ended on a door lip read "sight clear". Cite: sessionMotion.ts:653 offMesh.
|
|
27
|
+
function onMesh(mapId: number | undefined, p: CombatPosYd): boolean {
|
|
28
|
+
const mesh = mapId != null ? navMeshForMap(mapId) : null;
|
|
29
|
+
if (!mesh) return false;
|
|
30
|
+
const hit = findNearestPoly(mesh, p.x, p.y, p.z, 2);
|
|
31
|
+
return !!hit && hit.dist <= 1.6;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// A per-step pair memo, still keyed on exact world coords so a mid-tick move misses, but with no
|
|
35
|
+
// strings: the string keys cost more than the geometry they cached. Per map, so two masks cannot share.
|
|
36
|
+
interface MapMemo {
|
|
37
|
+
/** x -> y -> z -> position id. z is NaN when the caller had none (a valid, distinct Map key). */
|
|
38
|
+
xs: Map<number, Map<number, Map<number, number>>>;
|
|
39
|
+
next: number;
|
|
40
|
+
pairs: Map<number, boolean>;
|
|
41
|
+
// The on-mesh answer per position id. It is a property of the POINT but sat inside the pair test, so
|
|
42
|
+
// a 40-unit floor asked it up to 40 times per position per step.
|
|
43
|
+
mesh: (boolean | undefined)[];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const byMap = new Map<number, MapMemo>();
|
|
47
|
+
let memoLive = false;
|
|
48
|
+
|
|
49
|
+
/** Pair key radix. Ids are per-step and per-map; ~10^2 units, so 2^20 is unreachable. */
|
|
50
|
+
const ID_RADIX = 1 << 20;
|
|
51
|
+
|
|
52
|
+
export function resetNavSightMemo(): void {
|
|
53
|
+
if (memoLive) {
|
|
54
|
+
byMap.clear();
|
|
55
|
+
memoLive = false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function internPos(m: MapMemo, x: number, y: number, z: number): number {
|
|
60
|
+
let ys = m.xs.get(x);
|
|
61
|
+
if (ys === undefined) {
|
|
62
|
+
ys = new Map<number, Map<number, number>>();
|
|
63
|
+
m.xs.set(x, ys);
|
|
64
|
+
}
|
|
65
|
+
let zs = ys.get(y);
|
|
66
|
+
if (zs === undefined) {
|
|
67
|
+
zs = new Map<number, number>();
|
|
68
|
+
ys.set(y, zs);
|
|
69
|
+
}
|
|
70
|
+
let id = zs.get(z);
|
|
71
|
+
if (id === undefined) {
|
|
72
|
+
id = m.next++;
|
|
73
|
+
zs.set(z, id);
|
|
74
|
+
}
|
|
75
|
+
return id;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Same two shapes toWorld produces: z carried only when the caller had a finite one. */
|
|
79
|
+
function worldPos(x: number, y: number, z: number): CombatPosYd {
|
|
80
|
+
return Number.isNaN(z) ? { x, y } : { x, y, z };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function onMeshCached(m: MapMemo, id: number, mapId: number, p: CombatPosYd): boolean {
|
|
84
|
+
const hit = m.mesh[id];
|
|
85
|
+
if (hit !== undefined) return hit;
|
|
86
|
+
const ans = onMesh(mapId, p);
|
|
87
|
+
m.mesh[id] = ans;
|
|
88
|
+
return ans;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function sightUncached(mapId: number | undefined, aw: CombatPosYd, bw: CombatPosYd): boolean {
|
|
92
|
+
if (!onMesh(mapId, aw) || !onMesh(mapId, bw)) return true;
|
|
93
|
+
return (mapId != null ? sightClearForMap(mapId, aw, bw) : null) ?? true;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// True when nothing opaque stands between two combat positions. FAILS OPEN with no registered geometry,
|
|
97
|
+
// with a missing position, and when either end is off-mesh: the mask is authoritative only where it says
|
|
98
|
+
export function navSightClear(
|
|
99
|
+
cfg: NavSightCfg,
|
|
100
|
+
a: CombatPosYd | undefined,
|
|
101
|
+
b: CombatPosYd | undefined,
|
|
102
|
+
): boolean {
|
|
103
|
+
if (!a || !b) return true;
|
|
104
|
+
const anchor = cfg.geometryAnchor;
|
|
105
|
+
const mapId = anchor?.mapId;
|
|
106
|
+
// Memo only when the registry keys the geometry (live maps). A session with no map id has
|
|
107
|
+
// nothing registered to ask, and inventing geometry is what this fails open to avoid.
|
|
108
|
+
if (mapId == null) return true;
|
|
109
|
+
const o = anchor?.frame === 'world-translated' ? anchor.origin : undefined;
|
|
110
|
+
const ax = o ? o.x + a.x : a.x;
|
|
111
|
+
const ay = o ? o.y + a.y : a.y;
|
|
112
|
+
const az = a.z != null && Number.isFinite(a.z) ? a.z : NaN;
|
|
113
|
+
const bx = o ? o.x + b.x : b.x;
|
|
114
|
+
const by = o ? o.y + b.y : b.y;
|
|
115
|
+
const bz = b.z != null && Number.isFinite(b.z) ? b.z : NaN;
|
|
116
|
+
let m = byMap.get(mapId);
|
|
117
|
+
if (m === undefined) {
|
|
118
|
+
m = { xs: new Map(), next: 0, pairs: new Map(), mesh: [] };
|
|
119
|
+
byMap.set(mapId, m);
|
|
120
|
+
memoLive = true;
|
|
121
|
+
}
|
|
122
|
+
const ia = internPos(m, ax, ay, az);
|
|
123
|
+
const ib = internPos(m, bx, by, bz);
|
|
124
|
+
// The world positions are the only allocation left, and only a miss pays for them.
|
|
125
|
+
if (ia >= ID_RADIX || ib >= ID_RADIX) {
|
|
126
|
+
return sightUncached(mapId, worldPos(ax, ay, az), worldPos(bx, by, bz));
|
|
127
|
+
}
|
|
128
|
+
const k = ia < ib ? ia * ID_RADIX + ib : ib * ID_RADIX + ia;
|
|
129
|
+
const hit = m.pairs.get(k);
|
|
130
|
+
if (hit !== undefined) return hit;
|
|
131
|
+
const aw = worldPos(ax, ay, az);
|
|
132
|
+
const bw = worldPos(bx, by, bz);
|
|
133
|
+
const ans = !onMeshCached(m, ia, mapId, aw) || !onMeshCached(m, ib, mapId, bw)
|
|
134
|
+
? true
|
|
135
|
+
: (sightClearForMap(mapId, aw, bw) ?? true);
|
|
136
|
+
m.pairs.set(k, ans);
|
|
137
|
+
return ans;
|
|
138
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// The phase timer for the engine tick, installed by the UI and absent everywhere else. The engine must
|
|
2
|
+
// not import the UI, and there is one profiler per page, so one sink is the right shape.
|
|
3
|
+
type PerfFn = <T>(name: string, fn: () => T) => T;
|
|
4
|
+
/** enter/leave for a phase whose body is too large to wrap in a closure. Same self-time contract. */
|
|
5
|
+
interface SpanSink { enter: (name: string) => void; leave: (name: string) => void }
|
|
6
|
+
|
|
7
|
+
let sink: PerfFn | null = null;
|
|
8
|
+
let spans: SpanSink | null = null;
|
|
9
|
+
|
|
10
|
+
/** Null uninstalls. runProfiler.time is already a no-op while the profiler is stopped. */
|
|
11
|
+
export function setCombatPerfSink(fn: PerfFn | null, span?: SpanSink | null): void {
|
|
12
|
+
sink = fn;
|
|
13
|
+
spans = span ?? null;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** One extra frame when no sink is installed; the JIT inlines it. */
|
|
17
|
+
export function combatPerf<T>(name: string, fn: () => T): T {
|
|
18
|
+
return sink ? sink(name, fn) : fn();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** Balanced pair around one tick phase, for a block a closure would have to re-indent. */
|
|
22
|
+
export function combatPerfEnter(name: string): void {
|
|
23
|
+
spans?.enter(name);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function combatPerfLeave(name: string): void {
|
|
27
|
+
spans?.leave(name);
|
|
28
|
+
}
|