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,719 @@
|
|
|
1
|
+
// Peeled from createSession (Wave 4 createSession.md P1) — pattern (D).
|
|
2
|
+
// armEnemyCastState + inject/summon/despawn + ScriptDev onAggro-once.
|
|
3
|
+
|
|
4
|
+
import type { CombatContext, EnemyCastState } from './context.ts';
|
|
5
|
+
import type { CombatantSpec, Fighter } from './types.ts';
|
|
6
|
+
import type { ScriptDevAction } from '../../domain/scriptdev/types.ts';
|
|
7
|
+
import type { Rng } from '../core/rng.ts';
|
|
8
|
+
import type { Side, EnemySide } from '../core/events.ts';
|
|
9
|
+
import {
|
|
10
|
+
allySideAt, enemyIndexOfSide, enemySideAt, isAllySide, isEnemySide, MAX_ALLIES,
|
|
11
|
+
} from '../core/events.ts';
|
|
12
|
+
import { castableKitIds } from './castableKit.ts';
|
|
13
|
+
import { CREATURE_STATIC_FLAGS } from '../../domain/creature/creatureAiConstants.ts';
|
|
14
|
+
import { UNIT_FLAG } from '../../domain/creature/unitFlags.ts';
|
|
15
|
+
import { allowStoneskinGargoyleStoneForm } from '../../domain/scriptdev/naxxramas.ts';
|
|
16
|
+
import type { SpellDef, CreatureCastEntry } from '../../data/schema.ts';
|
|
17
|
+
import {
|
|
18
|
+
armCreatureCastSlots,
|
|
19
|
+
armEventAiState,
|
|
20
|
+
spawnOocSelfAuras,
|
|
21
|
+
castEntriesFromAiScripts,
|
|
22
|
+
enrichCastEntriesFromScripts,
|
|
23
|
+
hasCreatureCastSchedule,
|
|
24
|
+
mergeCastEntriesWithSpellList,
|
|
25
|
+
warnScheduleLessCreatureSpecial,
|
|
26
|
+
} from '../../domain/creature/creatureAi.ts';
|
|
27
|
+
import {
|
|
28
|
+
armScriptDevRuntime,
|
|
29
|
+
lifecycleActions,
|
|
30
|
+
scriptDevByCreature,
|
|
31
|
+
scriptDevScheduleForEntry,
|
|
32
|
+
} from '../../domain/scriptdev/index.ts';
|
|
33
|
+
import { ThreatManager, type CombatantId } from './threat.ts';
|
|
34
|
+
import {
|
|
35
|
+
injectEnemySlotPosition,
|
|
36
|
+
isEnemyCasterKit,
|
|
37
|
+
summonSpawnPosition,
|
|
38
|
+
type CombatPosYd,
|
|
39
|
+
type SummonWorldPoint,
|
|
40
|
+
} from './combatGeometry.ts';
|
|
41
|
+
import { applyForceDespawn, combatMovementFlavor } from './forceDespawnAction.ts';
|
|
42
|
+
import { makeFighter } from './fighterFactory.ts';
|
|
43
|
+
import { clampDisplacementToFloor, displaceFloorFromCfg } from './displaceFloor.ts';
|
|
44
|
+
|
|
45
|
+
export type SessionInjectDeps = {
|
|
46
|
+
dead: (f: Fighter) => boolean;
|
|
47
|
+
/** Resolve nearest living party side inside acquire for AttackStart seed. */
|
|
48
|
+
nearestPartyInAcquire: (enemySide: string) => CombatantId | null;
|
|
49
|
+
hostileTargetOf: (enemyF: Fighter) => Fighter;
|
|
50
|
+
/** Materialize kit for combat (createSession local or barrel). */
|
|
51
|
+
materializeSpecForCombat: (raw: CombatantSpec) => CombatantSpec;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** Arm per-enemy cast / EventAI / ScriptDev state. Pure of session bag (rng + t). */
|
|
55
|
+
export function armEnemyCastState(
|
|
56
|
+
ef: Fighter,
|
|
57
|
+
rng: Rng,
|
|
58
|
+
outResetActions?: ScriptDevAction[],
|
|
59
|
+
t = 0,
|
|
60
|
+
): EnemyCastState {
|
|
61
|
+
const spellById = new Map<number, SpellDef>(ef.spec.spells.map((s) => [s.id, s]));
|
|
62
|
+
const scripts = ef.spec.ai?.scripts;
|
|
63
|
+
// A PLAYER-CLASS BODY on an enemy seat - a duelist, an arena seat, a BG playerbot - is driven by
|
|
64
|
+
// its Rotation and carries no creature schedule, so its class kit is not a D4 defect. Same reason
|
|
65
|
+
// castableKit refuses to filter one. Cite: castableKit.ts:46-48; pickAction.ts:2915.
|
|
66
|
+
const playerBody = ef.spec.classId != null;
|
|
67
|
+
// S7: prefer top-level spellList; fall back to FE1 nest when only extract path ran.
|
|
68
|
+
const spellList =
|
|
69
|
+
ef.spec.spellList ??
|
|
70
|
+
ef.spec.ai?.spellLists ??
|
|
71
|
+
null;
|
|
72
|
+
// S9: ScriptDev IR schedule when creature is bound (and cast list not already ScriptDev-shaped).
|
|
73
|
+
const sdPlan =
|
|
74
|
+
ef.spec.creatureEntry != null
|
|
75
|
+
? scriptDevScheduleForEntry(ef.spec.creatureEntry)
|
|
76
|
+
: null;
|
|
77
|
+
const sdIr =
|
|
78
|
+
ef.spec.creatureEntry != null
|
|
79
|
+
? scriptDevByCreature(ef.spec.creatureEntry) ?? null
|
|
80
|
+
: null;
|
|
81
|
+
let entries: CreatureCastEntry[];
|
|
82
|
+
if (ef.spec.creatureCasts && ef.spec.creatureCasts.length > 0) {
|
|
83
|
+
// Rehydrate FRIENDLY_* / FACING / etc. params from full ai.scripts rows.
|
|
84
|
+
// Drop schedule-less bare `{spellId}` rows (D4) — keep EventAI / MAIN_SPELL / ScriptDev.
|
|
85
|
+
const enriched = enrichCastEntriesFromScripts(ef.spec.creatureCasts, scripts);
|
|
86
|
+
const scheduled = enriched.filter(hasCreatureCastSchedule);
|
|
87
|
+
if (scheduled.length < enriched.length) {
|
|
88
|
+
const dropped = enriched.filter((e) => !hasCreatureCastSchedule(e)).map((e) => e.spellId);
|
|
89
|
+
if (!playerBody) warnScheduleLessCreatureSpecial(ef.spec.name, dropped);
|
|
90
|
+
}
|
|
91
|
+
entries = scheduled;
|
|
92
|
+
} else if (sdPlan && sdPlan.castEntries.length > 0) {
|
|
93
|
+
// Bare kit + ScriptDev binding — arm IR timers (GAPS C.4).
|
|
94
|
+
entries = [...sdPlan.castEntries];
|
|
95
|
+
for (const sid of sdPlan.spellIds) {
|
|
96
|
+
if (spellById.has(sid)) continue;
|
|
97
|
+
const sp = ef.spec.spells.find((s) => s.id === sid);
|
|
98
|
+
if (sp) spellById.set(sid, sp);
|
|
99
|
+
}
|
|
100
|
+
} else if (scripts && scripts.length > 0) {
|
|
101
|
+
// CAST rows only — do not fall back to bare tpl spells (D4).
|
|
102
|
+
entries = castEntriesFromAiScripts(scripts);
|
|
103
|
+
} else if (spellList && spellList.length > 0) {
|
|
104
|
+
// Spell-list-only kit — arm via mergeCastEntriesWithSpellList below.
|
|
105
|
+
// Cite: UnitAI.cpp UpdateSpellLists; arm via castEntriesFromSpellList.
|
|
106
|
+
entries = [];
|
|
107
|
+
} else {
|
|
108
|
+
// Bare tpl kit, no schedule from any source → melee auto only (D4).
|
|
109
|
+
if (ef.spec.spells.length > 0 && !playerBody) {
|
|
110
|
+
warnScheduleLessCreatureSpecial(
|
|
111
|
+
ef.spec.name,
|
|
112
|
+
ef.spec.spells.map((s) => s.id),
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
entries = [];
|
|
116
|
+
}
|
|
117
|
+
// Append the spell-list timer slots, the same path the cast entries take. NOT when a ScriptDev IR owns
|
|
118
|
+
// the schedule: the IR IS the port of those rows, so merging the bake arms each ability twice.
|
|
119
|
+
if (!sdPlan?.castEntries.length) {
|
|
120
|
+
// ChanceRangedAttack is the base chance in ranged mode and chance - 50 in melee, so the
|
|
121
|
+
// creature's own auto-attack mode decides it. Cite: UnitAI.cpp:1227-1230.
|
|
122
|
+
entries = mergeCastEntriesWithSpellList(entries, spellList, rng, ef.mode === 'ranged');
|
|
123
|
+
}
|
|
124
|
+
const eventAi = armEventAiState(scripts, rng);
|
|
125
|
+
// Melee is disabled in the constructor for a no-melee critter, so 71 templates never have it to begin
|
|
126
|
+
// with. The 30 s flee itself is armed on combat entry, not here.
|
|
127
|
+
if (((ef.spec.staticFlags ?? 0) & CREATURE_STATIC_FLAGS.NO_MELEE_FLEE) !== 0) {
|
|
128
|
+
eventAi.meleeEnabled = false;
|
|
129
|
+
}
|
|
130
|
+
// Reset and constructor verbs that must land before the first swing. The action applier is not
|
|
131
|
+
// installed at arm time, so death prevention, health percentage and set_unattackable mirror here.
|
|
132
|
+
if (sdIr) {
|
|
133
|
+
for (const act of lifecycleActions(sdIr, 'onReset')) {
|
|
134
|
+
if (act.kind === 'set_death_prevention') {
|
|
135
|
+
eventAi.deathPrevention = act.enabled;
|
|
136
|
+
if (act.enabled) eventAi.deathPreventionFired = false;
|
|
137
|
+
} else if (act.kind === 'set_health_pct') {
|
|
138
|
+
const pct = Math.max(0, Math.min(100, act.pct));
|
|
139
|
+
ef.hp = Math.floor(ef.spec.maxHealth * (pct / 100));
|
|
140
|
+
} else if (act.kind === 'set_unattackable') {
|
|
141
|
+
// Same as applyScriptDevCombatActions. Cite: naxxramas.cpp:998-1000; boss_thaddius.cpp:112.
|
|
142
|
+
const entry = (ef.spec.creatureEntry ?? 0) | 0;
|
|
143
|
+
if (!allowStoneskinGargoyleStoneForm(entry, ef.spec.movementType)) continue;
|
|
144
|
+
ef.unattackableUntil = Math.max(ef.unattackableUntil, t + 3_600_000);
|
|
145
|
+
eventAi.unitFlags |= UNIT_FLAG.UNINTERACTIBLE;
|
|
146
|
+
} else if (
|
|
147
|
+
act.kind === 'cast_self'
|
|
148
|
+
&& (act.spellId | 0) === 29154
|
|
149
|
+
&& !allowStoneskinGargoyleStoneForm((ef.spec.creatureEntry ?? 0) | 0, ef.spec.movementType)
|
|
150
|
+
) {
|
|
151
|
+
continue;
|
|
152
|
+
} else if (outResetActions) {
|
|
153
|
+
outResetActions.push(act);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
fighter: ef,
|
|
159
|
+
slots: armCreatureCastSlots(entries, spellById, rng),
|
|
160
|
+
// Drawn here so the OOC rows keep their arm-order place in the rng stream, applied by the
|
|
161
|
+
// caller once ctx.applySpell exists (createSession / injectEnemySpec).
|
|
162
|
+
spawnAuras: spawnOocSelfAuras(entries, spellById, rng),
|
|
163
|
+
pendingSlot: null,
|
|
164
|
+
// Open on the first in-combat evaluation: m_spellListCooldown is cleared by SetSpellList.
|
|
165
|
+
// Cite: UnitAI.cpp:1180-1181.
|
|
166
|
+
spellListPollAt: 0,
|
|
167
|
+
eventAi,
|
|
168
|
+
scriptDev: sdIr ? armScriptDevRuntime(sdIr) : null,
|
|
169
|
+
healer: entriesCarryHeal(entries, spellById),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Does this creature's SCHEDULED kit heal? Read off the armed entries and their baked spells — a heal
|
|
174
|
+
// effect or a periodic heal aura — so the answer is the creature's own data and never its name.
|
|
175
|
+
function entriesCarryHeal(
|
|
176
|
+
entries: readonly CreatureCastEntry[],
|
|
177
|
+
spellById: Map<number, SpellDef>,
|
|
178
|
+
): boolean {
|
|
179
|
+
for (const e of entries) {
|
|
180
|
+
const s = spellById.get(e.spellId);
|
|
181
|
+
if (!s) continue;
|
|
182
|
+
if (s.effects?.some((fx) => fx.kind === 'heal')) return true;
|
|
183
|
+
if (s.rawEffects?.some((r) => {
|
|
184
|
+
const eff = r.effect | 0;
|
|
185
|
+
// 67 HEAL_MAX_HEALTH, but not one aimed only at the caster: Thekal Transform 24169 tops HIM up
|
|
186
|
+
// at the phase change and that is a survival beat, not a healer's kit. 62 sat here in its place
|
|
187
|
+
// by a miscount and read all 46 Mana Burn casters as healers (Feugen 28135 Static Field).
|
|
188
|
+
// Cite: SpellEffectDefines.h:36,88,93; SpellTargetDefines.h:25 TARGET_UNIT_CASTER.
|
|
189
|
+
if (eff === 67) return (r.targetA | 0) !== 1 || (r.targetB | 0) !== 0;
|
|
190
|
+
if (eff === 10) return true;
|
|
191
|
+
return eff === 6 && (r.auraName | 0) === 8;
|
|
192
|
+
})) return true;
|
|
193
|
+
}
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
export function installSessionInject(ctx: CombatContext, deps: SessionInjectDeps): void {
|
|
198
|
+
const { dead, nearestPartyInAcquire, hostileTargetOf, materializeSpecForCombat } = deps;
|
|
199
|
+
|
|
200
|
+
// Two branches: the summon-table row when the action carries one, else the summoner's own feet at
|
|
201
|
+
// contact distance. Nothing without geometry, and the inject then keeps its slot-ring fallback.
|
|
202
|
+
const summonPositionFor = (
|
|
203
|
+
summoner: Fighter,
|
|
204
|
+
worldPos?: SummonWorldPoint,
|
|
205
|
+
): { position: CombatPosYd } | null => {
|
|
206
|
+
if (!ctx.unitPositionsMutable) return null;
|
|
207
|
+
const at = ctx.posOf(summoner.side);
|
|
208
|
+
const feet = (): { position: CombatPosYd } | null => {
|
|
209
|
+
if (!at) return null;
|
|
210
|
+
// Fan repeats: guardians already out is a stable, RNG-free slot index.
|
|
211
|
+
const slot = ctx.guardianSidesBySummoner.get(summoner.side)?.size ?? 0;
|
|
212
|
+
return { position: summonSpawnPosition(at, slot) };
|
|
213
|
+
};
|
|
214
|
+
if (worldPos) {
|
|
215
|
+
const o = ctx.cfg.geometryAnchor?.frame === 'world-translated'
|
|
216
|
+
? ctx.cfg.geometryAnchor.origin
|
|
217
|
+
: undefined;
|
|
218
|
+
// pull-local offsets carry no world bearing, so a world point cannot be translated
|
|
219
|
+
// into them — fall through to the summoner rather than draw a convincing lie.
|
|
220
|
+
if (o) {
|
|
221
|
+
const pos = { x: worldPos.x - o.x, y: worldPos.y - o.y };
|
|
222
|
+
// Summon rows are map-absolute, so a wrong map yields multi-kilometre offsets. The cap is the
|
|
223
|
+
// largest baked call-for-help radius. A script-target dest skips it — it was read off this map.
|
|
224
|
+
if (at && !worldPos.mapVerified) {
|
|
225
|
+
const dx = pos.x - at.x;
|
|
226
|
+
const dy = pos.y - at.y;
|
|
227
|
+
if (dx * dx + dy * dy > 100 * 100) return feet();
|
|
228
|
+
}
|
|
229
|
+
// Scatter points are a raw GetRandomPoint ring, so clamp them out from the walkable
|
|
230
|
+
// centre they were drawn around — §5 displacement rule, not a raster fallback.
|
|
231
|
+
if (worldPos.from) {
|
|
232
|
+
const from = { x: worldPos.from.x - o.x, y: worldPos.from.y - o.y };
|
|
233
|
+
return {
|
|
234
|
+
position: clampDisplacementToFloor(from, pos, displaceFloorFromCfg(ctx.cfg)),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return { position: pos };
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return feet();
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
// A seat the other side of the tick seam already named. Free or dead here is the allocation the helper
|
|
244
|
+
// would have made; a living unit in it is a diverged roster, and an error rather than a second body.
|
|
245
|
+
const forcedSeat = (side: string, isBlock: (s: Side) => boolean): Side => {
|
|
246
|
+
if (!isBlock(side as Side)) throw new Error(`forced seat ${side} is outside its block`);
|
|
247
|
+
const cur = ctx.sideFighter?.(side as Side);
|
|
248
|
+
if (cur && cur.hp > 0) throw new Error(`forced seat ${side} holds a living ${cur.spec.name}`);
|
|
249
|
+
return side as Side;
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
// The mid-fight inject core, arming the cast scheduler and the threat manager and seeding threat on
|
|
253
|
+
// the player. Positioned by the geometry slot helper when the map is live, or by an explicit point.
|
|
254
|
+
const injectEnemySpec = (
|
|
255
|
+
raw: CombatantSpec,
|
|
256
|
+
opts?: {
|
|
257
|
+
summonerSide?: Side;
|
|
258
|
+
creatureId?: number;
|
|
259
|
+
position?: CombatPosYd;
|
|
260
|
+
/** When true, skip AttackStart threat seed (CALL_FOR_HELP may re-engage). */
|
|
261
|
+
passive?: boolean;
|
|
262
|
+
side?: string;
|
|
263
|
+
},
|
|
264
|
+
): Fighter | null => {
|
|
265
|
+
if (ctx.ended) return null;
|
|
266
|
+
const effects = ctx.effects;
|
|
267
|
+
// Endless floor: recycle a dead enemy seat so a multi-pull does not grow the array forever. Off the
|
|
268
|
+
// STORE — the seat is named, not indexed, and the helper answers "first dead seat, else the next".
|
|
269
|
+
const seat = opts?.side != null
|
|
270
|
+
? forcedSeat(opts.side, isEnemySide)
|
|
271
|
+
: ctx.freeSeatIn!(isEnemySide, enemySideAt, () => true, Number.POSITIVE_INFINITY);
|
|
272
|
+
if (seat == null) return null;
|
|
273
|
+
const side = seat as EnemySide;
|
|
274
|
+
const recycling = ctx.sideFighter?.(side) != null;
|
|
275
|
+
const add: Fighter = makeFighter(side, materializeSpecForCombat(raw));
|
|
276
|
+
ctx.rosterSeatEnemy!(side, add);
|
|
277
|
+
if (recycling) {
|
|
278
|
+
// Recycled slot: prior despawn/death must not suppress this unit's death event.
|
|
279
|
+
ctx.deathEmitted.delete(side);
|
|
280
|
+
// A recycled slot is a NEW creature on an old side string: the corpse's onAggro
|
|
281
|
+
// stamp would otherwise suppress this one's Aggro() for the rest of the run.
|
|
282
|
+
aggroLifecycleEmitted.delete(side);
|
|
283
|
+
aggroLifecyclePending.delete(side);
|
|
284
|
+
// Strip side-keyed auras/DoTs so a recycled passive does not inherit the corpse's
|
|
285
|
+
// Rend / SW:P and re-open combat (probe-controller-farpull E).
|
|
286
|
+
for (let i = effects.length - 1; i >= 0; i--) {
|
|
287
|
+
const ae = effects[i]!;
|
|
288
|
+
if (ae.target === side || ae.source === side) effects.splice(i, 1);
|
|
289
|
+
}
|
|
290
|
+
// Drop player/ally commitments that named the corpse slot.
|
|
291
|
+
if (ctx.explicitEnemyFocus === side) ctx.explicitEnemyFocus = null;
|
|
292
|
+
for (const [as, tgt] of [...ctx.allyManualTarget.entries()]) {
|
|
293
|
+
if (tgt === side) ctx.allyManualTarget.delete(as);
|
|
294
|
+
}
|
|
295
|
+
// playerFocus stays typed Fighter — leave it; ensurePlayerFocus reselects if dead.
|
|
296
|
+
}
|
|
297
|
+
const tm = new ThreatManager(side);
|
|
298
|
+
ctx.threatByOwner.set(side, tm);
|
|
299
|
+
const pendingResetActs: ScriptDevAction[] = [];
|
|
300
|
+
const armed = armEnemyCastState(add, ctx.rng, pendingResetActs, ctx.t);
|
|
301
|
+
ctx.enemyCastBySide.set(side, armed);
|
|
302
|
+
// A floor spawn walks in wearing what its OOC rows put on it at spawn, same as the pull did.
|
|
303
|
+
// Cite: CreatureEventAI.cpp:1404-1410 JustRespawned; :216-218 TIMER_OOC CheckEvent.
|
|
304
|
+
for (const sp of armed.spawnAuras) ctx.applySpell?.(add, add, sp);
|
|
305
|
+
if (pendingResetActs.length) ctx.applyScriptDevCombatActions?.(add, pendingResetActs);
|
|
306
|
+
// Watch for this unit's Aggro(). A floor spawn never exists at the session's first tick,
|
|
307
|
+
// so without this its onAggro row can never run. Only bosses carry one.
|
|
308
|
+
{
|
|
309
|
+
const e = (add.spec.creatureEntry ?? 0) | 0;
|
|
310
|
+
const ir = e ? scriptDevByCreature(e) : null;
|
|
311
|
+
if (ir && (lifecycleActions(ir, 'onAggro').length > 0 || ir.damageHealMirror)) {
|
|
312
|
+
aggroLifecyclePending.add(side);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
// Geometry: place first so AttackStart can refuse out-of-range seeds.
|
|
316
|
+
if (opts?.position) {
|
|
317
|
+
if (!ctx.unitPositionsMutable) {
|
|
318
|
+
ctx.unitPositionsMutable = {};
|
|
319
|
+
}
|
|
320
|
+
ctx.unitPositionsMutable[side] = ctx.placeEnemyAt!(opts.position);
|
|
321
|
+
} else if (ctx.unitPositionsMutable) {
|
|
322
|
+
// Per-INJECT, not per-tick: the same split the initial seed makes, so a mid-fight spawn
|
|
323
|
+
// and an opening pack cannot disagree about the same body.
|
|
324
|
+
const caster = isEnemyCasterKit(add.spec.spells, {
|
|
325
|
+
maxPower: add.spec.maxPower,
|
|
326
|
+
castable: castableKitIds(add, ctx.spellOf),
|
|
327
|
+
});
|
|
328
|
+
// A spawn-ring SLOT, so the ordinal is the answer and not a lookup in disguise - the same
|
|
329
|
+
// category as combatGeometry.meleeOrbitSlot. Cite: ENGINE-REBUILD E1.1.
|
|
330
|
+
ctx.unitPositionsMutable[side] = injectEnemySlotPosition({
|
|
331
|
+
enemyIndex: enemyIndexOfSide(side), isCaster: caster,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
// Spawn coord = the evade home until combat opens. A recycled slot must overwrite the
|
|
335
|
+
// corpse's home, never inherit it. Cite: HomeMovementGenerator.cpp:51 GetRespawnCoord.
|
|
336
|
+
const placed = ctx.unitPositionsMutable?.[side];
|
|
337
|
+
if (placed) ctx.enemyHomeYd?.set(side, { ...placed });
|
|
338
|
+
else ctx.enemyHomeYd?.delete(side);
|
|
339
|
+
// AttackStart only when a living party body is inside local acquisition, gated on the NEAREST member
|
|
340
|
+
// rather than the player: multi-sensor detection can pull a mob the player is 46 yd from.
|
|
341
|
+
if (!opts?.passive) {
|
|
342
|
+
const seedOn = nearestPartyInAcquire(side);
|
|
343
|
+
if (seedOn) tm.addThreatDirectly(seedOn, 1, false);
|
|
344
|
+
}
|
|
345
|
+
if (opts?.summonerSide) {
|
|
346
|
+
let set = ctx.guardianSidesBySummoner.get(opts.summonerSide);
|
|
347
|
+
if (!set) {
|
|
348
|
+
set = new Set();
|
|
349
|
+
ctx.guardianSidesBySummoner.set(opts.summonerSide, set);
|
|
350
|
+
}
|
|
351
|
+
set.add(side);
|
|
352
|
+
// The summoned-unit event on the SUMMONER, carrying the summoned entry so a row that names one can
|
|
353
|
+
// filter. Cite: CreatureEventAI.cpp SummonedCreature, the sibling of the just-died hook.
|
|
354
|
+
const summoner = ctx.sideFighter?.(opts.summonerSide);
|
|
355
|
+
if (summoner) {
|
|
356
|
+
ctx.notifyEventAiSummoned?.(summoner, (opts.creatureId ?? add.spec.creatureEntry ?? 0) | 0, false);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
ctx.push({
|
|
360
|
+
t: ctx.t,
|
|
361
|
+
kind: 'summon',
|
|
362
|
+
actor: opts?.summonerSide ?? 'enemy',
|
|
363
|
+
side,
|
|
364
|
+
creatureId: opts?.creatureId ?? add.spec.creatureEntry ?? 0,
|
|
365
|
+
name: add.spec.name,
|
|
366
|
+
});
|
|
367
|
+
return add;
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
// VE mid-fight inject: resolve creatureId → spec, then injectEnemySpec. Cite: CreatureEventAI.cpp
|
|
371
|
+
// ACTION_T_SPAWN ~810–826 AttackStart(target).
|
|
372
|
+
const injectEnemySummon = (
|
|
373
|
+
summoner: Fighter,
|
|
374
|
+
creatureId: number,
|
|
375
|
+
durationMs: number,
|
|
376
|
+
/** Explicit spawn point in WORLD yards (ACTION_T_SUMMON_ID param3, or a script-target dest). */
|
|
377
|
+
worldPos?: SummonWorldPoint,
|
|
378
|
+
/** False for a TARGET_T_SELF row: the body spawns and does not open. Cite: CreatureEventAI.cpp:1023. */
|
|
379
|
+
opts?: { attackStart?: boolean },
|
|
380
|
+
): Fighter | null => {
|
|
381
|
+
const resolve = ctx.cfg.resolveSummon;
|
|
382
|
+
if (!resolve) return null;
|
|
383
|
+
const raw = resolve(creatureId);
|
|
384
|
+
if (!raw) return null;
|
|
385
|
+
const attackStart = opts?.attackStart !== false;
|
|
386
|
+
const add = injectEnemySpec(raw, {
|
|
387
|
+
summonerSide: summoner.side,
|
|
388
|
+
creatureId,
|
|
389
|
+
...(attackStart ? {} : { passive: true }),
|
|
390
|
+
...(summonPositionFor(summoner, worldPos) ?? {}),
|
|
391
|
+
});
|
|
392
|
+
if (!add) return null;
|
|
393
|
+
// A timed despawn, where zero means it lives until killed. Voiding this piled Antu'sul's totems up
|
|
394
|
+
// one per cast forever — measured ten-plus live sides in 47 s.
|
|
395
|
+
if (durationMs > 0) add.summonDespawnAt = ctx.t + durationMs;
|
|
396
|
+
// A summon opens on its summoner's victim even when placed outside acquire range: the table points
|
|
397
|
+
// sit 75 yd out, and the gated seed left Antu'sul's broodlings idle for the whole fight.
|
|
398
|
+
const tm = attackStart ? ctx.threatByOwner.get(add.side) : undefined;
|
|
399
|
+
if (tm && tm.isEmpty()) {
|
|
400
|
+
const victim = hostileTargetOf(summoner);
|
|
401
|
+
if (victim && !dead(victim)) tm.addThreatDirectly(victim.side, 1, false);
|
|
402
|
+
}
|
|
403
|
+
// JustSummoned — summoned casts on self (Spread 17772). Cite: boss_jandice_barov.cpp:52-55.
|
|
404
|
+
const summonerEntry = (summoner.spec.creatureEntry ?? 0) | 0;
|
|
405
|
+
const summonerIr = summonerEntry > 0 ? scriptDevByCreature(summonerEntry) : undefined;
|
|
406
|
+
const summonedEntry = creatureId | 0;
|
|
407
|
+
for (const act of summonerIr?.lifecycle?.justSummoned ?? []) {
|
|
408
|
+
if ('creatureEntry' in act && act.creatureEntry != null && act.creatureEntry !== summonedEntry) continue;
|
|
409
|
+
if (act.kind === 'attack_summoner') {
|
|
410
|
+
const tm = ctx.threatByOwner.get(add.side);
|
|
411
|
+
if (tm) tm.addThreatDirectly(summoner.side, 1_000_000, false);
|
|
412
|
+
continue;
|
|
413
|
+
}
|
|
414
|
+
if (act.kind === 'attack_random') {
|
|
415
|
+
// Cite: boss_jeklik.cpp:155-156 SelectAttackingTarget(RANDOM) + AttackStart.
|
|
416
|
+
const tm = ctx.threatByOwner.get(add.side);
|
|
417
|
+
if (!tm) continue;
|
|
418
|
+
const pool: Fighter[] = [];
|
|
419
|
+
// Pet LAST, and the order is load-bearing: `rng.int` picks an INDEX into this pool, so
|
|
420
|
+
// `partyUnits()` (pet second) would draw a different unit. Cite: ENGINE-REBUILD E1.1.
|
|
421
|
+
if (!dead(ctx.player)) pool.push(ctx.player);
|
|
422
|
+
for (const a of ctx.livingAllies()) pool.push(a);
|
|
423
|
+
if (ctx.pet && !dead(ctx.pet)) pool.push(ctx.pet);
|
|
424
|
+
if (pool.length === 0) continue;
|
|
425
|
+
const tgt = pool[ctx.rng.int(0, pool.length - 1)]!;
|
|
426
|
+
tm.modifyAllThreatPercent(-100);
|
|
427
|
+
tm.addThreatDirectly(tgt.side, 1, false);
|
|
428
|
+
tm.setCurrentVictimByTarget(tgt.side);
|
|
429
|
+
ctx.push({ t: ctx.t, kind: 'attack_start', actor: add.side, target: tgt.side });
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
if (act.kind === 'mirror_summoner_health') {
|
|
433
|
+
// The image's max is a fraction of the SUMMONER's max, chosen by the summoner's own percent,
|
|
434
|
+
// and its current health is that same percent. Cite: boss_skeram.cpp:342-364.
|
|
435
|
+
const max = Math.max(1, summoner.spec.maxHealth);
|
|
436
|
+
const pct = Math.max(0, Math.min(100, (summoner.hp / max) * 100));
|
|
437
|
+
let frac = 0;
|
|
438
|
+
for (const band of act.bands) {
|
|
439
|
+
if (pct < band.belowPct) {
|
|
440
|
+
frac = band.fracOfMax;
|
|
441
|
+
break;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
if (frac > 0) {
|
|
445
|
+
add.spec.maxHealth = Math.max(1, Math.floor(max * frac));
|
|
446
|
+
add.hp = Math.max(1, Math.floor(add.spec.maxHealth * (pct / 100)));
|
|
447
|
+
ctx.push({
|
|
448
|
+
t: ctx.t,
|
|
449
|
+
kind: 'flavor',
|
|
450
|
+
text: `${add.spec.name} splits off at ${Math.round(pct)}% of ${summoner.spec.name}.`,
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
continue;
|
|
454
|
+
}
|
|
455
|
+
if (act.kind !== 'cast_self') continue;
|
|
456
|
+
const sp =
|
|
457
|
+
add.spec.spells.find((s) => s.id === act.spellId)
|
|
458
|
+
?? summoner.spec.spells.find((s) => s.id === act.spellId);
|
|
459
|
+
if (!sp) continue;
|
|
460
|
+
const applySpell = ctx.applySpell as
|
|
461
|
+
| ((src: Fighter, tgt: Fighter, spell: SpellDef) => void)
|
|
462
|
+
| undefined;
|
|
463
|
+
if (applySpell) applySpell(add, add, sp);
|
|
464
|
+
else {
|
|
465
|
+
ctx.push({
|
|
466
|
+
t: ctx.t,
|
|
467
|
+
kind: 'aura',
|
|
468
|
+
actor: add.side, // the 'aura' event's actor IS the holder; it has no target field
|
|
469
|
+
name: sp.name,
|
|
470
|
+
spellId: sp.id,
|
|
471
|
+
applied: true,
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return add;
|
|
476
|
+
};
|
|
477
|
+
|
|
478
|
+
const forceDespawnEnemy = (ef: Fighter): void => {
|
|
479
|
+
if (dead(ef)) return;
|
|
480
|
+
ef.hp = 0;
|
|
481
|
+
// Despawn ≠ kill: suppress checkDeaths so stream GC / ForcedDespawn do not fire
|
|
482
|
+
// death events (and death SFX) for units that simply left the pool.
|
|
483
|
+
ctx.deathEmitted.add(ef.side);
|
|
484
|
+
ctx.push({ t: ctx.t, kind: 'despawn', actor: ef.side });
|
|
485
|
+
};
|
|
486
|
+
|
|
487
|
+
/** Once-per-side ScriptDev lifecycle.onAggro (createSession is always engaged). */
|
|
488
|
+
const aggroLifecycleEmitted = new Set<string>();
|
|
489
|
+
// Sides that carry an on-aggro script and have not opened combat yet. The continuous floor opens on a
|
|
490
|
+
// DEAD shell and streams spawns in after, so a first-tick sweep matched nothing and 114 were dead code.
|
|
491
|
+
const aggroLifecyclePending = new Set<EnemySide>();
|
|
492
|
+
const runScriptDevAggroLifecycle = (ef: Fighter): void => {
|
|
493
|
+
if (aggroLifecycleEmitted.has(ef.side)) return;
|
|
494
|
+
aggroLifecycleEmitted.add(ef.side);
|
|
495
|
+
const entry = (ef.spec.creatureEntry ?? 0) | 0;
|
|
496
|
+
if (!entry) return;
|
|
497
|
+
const bossIr = scriptDevByCreature(entry);
|
|
498
|
+
// Twin damage/heal mirror — wrap onDamaged/onHealed at pull (after crowdControl install).
|
|
499
|
+
if (bossIr?.damageHealMirror) ctx.ensureDamageHealMirrorHooks?.();
|
|
500
|
+
const t = ctx.t;
|
|
501
|
+
for (const act of bossIr ? lifecycleActions(bossIr, 'onAggro') : []) {
|
|
502
|
+
if (act.kind === 'set_combat_movement') {
|
|
503
|
+
// Cite: UnitAI.cpp:301-318 SetCombatMovement; westfall.cpp:229-232 Daphne Aggro.
|
|
504
|
+
// combatMovement= must stay near this kind check (census WIRING_SIDE_EFFECT_RE).
|
|
505
|
+
const ocs = ctx.enemyCastBySide.get(ef.side as EnemySide);
|
|
506
|
+
if (ocs) ocs.eventAi.combatMovement = act.enabled;
|
|
507
|
+
ctx.push({ t, kind: 'flavor', text: combatMovementFlavor(ef.spec.name, act.enabled) });
|
|
508
|
+
} else if (act.kind === 'flavor') {
|
|
509
|
+
void act; // internal port note, not player copy
|
|
510
|
+
} else if (act.kind === 'force_despawn') {
|
|
511
|
+
// Cite: Creature::ForcedDespawn; npcs_special.cpp:987-991 EnterEvade ForcedDespawn.
|
|
512
|
+
// forceDespawnEnemy passed by name keeps the census WIRING_SIDE_EFFECT_RE token here.
|
|
513
|
+
applyForceDespawn(act, ef, t, {
|
|
514
|
+
forceDespawnEnemy,
|
|
515
|
+
enemyCastBySide: ctx.enemyCastBySide,
|
|
516
|
+
push: ctx.push,
|
|
517
|
+
});
|
|
518
|
+
} else {
|
|
519
|
+
// cast_self / cast_on_group / set_instance_data / set_death_prevention / yell / …
|
|
520
|
+
// Cite: boss_vaelastrasz.cpp:152-153 Aggro Essence of the Red via shared apply.
|
|
521
|
+
ctx.applyScriptDevCombatActions?.(ef, [act]);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
// Release a side from its summoner's guardian set. Without this the set only grows: the spawn slot is
|
|
527
|
+
// its size, so every re-summon landed a ring further out and a recycled seat kept its OLD owner.
|
|
528
|
+
const releaseGuardianSide = (side: Side): void => {
|
|
529
|
+
for (const [owner, owned] of ctx.guardianSidesBySummoner) {
|
|
530
|
+
if (!owned.delete(side)) continue;
|
|
531
|
+
if (owned.size === 0) ctx.guardianSidesBySummoner.delete(owner);
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
};
|
|
535
|
+
|
|
536
|
+
// The seat half of a friendly inject, taking a spec rather than a summon id. Both the summon path
|
|
537
|
+
// below and `injectAllySpec` (a battleground guard walking into the player's fight) land here, so
|
|
538
|
+
// seat recycling, the guardian set and the side-keyed aura strip have exactly one implementation.
|
|
539
|
+
const seatFriendly = (
|
|
540
|
+
ownerSide: Side,
|
|
541
|
+
raw: import('./types.ts').CombatantSpec,
|
|
542
|
+
creatureId?: number,
|
|
543
|
+
forced?: string,
|
|
544
|
+
): Fighter | null => {
|
|
545
|
+
if (ctx.ended) return null;
|
|
546
|
+
// Recycle a dead seat we created ourselves, never a party member's: theirs holds a corpse the party
|
|
547
|
+
// can still resurrect, and the UI indexes party frames by seat.
|
|
548
|
+
const seat = forced != null
|
|
549
|
+
? forcedSeat(forced, isAllySide)
|
|
550
|
+
: ctx.freeSeatIn!(
|
|
551
|
+
isAllySide,
|
|
552
|
+
allySideAt,
|
|
553
|
+
(a) => a.spec.summonOwnerSide != null,
|
|
554
|
+
MAX_ALLIES,
|
|
555
|
+
);
|
|
556
|
+
if (seat == null) return null;
|
|
557
|
+
const side = seat;
|
|
558
|
+
const recycling = ctx.sideFighter?.(side) != null;
|
|
559
|
+
const add = makeFighter(side, materializeSpecForCombat(raw));
|
|
560
|
+
add.spec.summonOwnerSide = ownerSide;
|
|
561
|
+
if (creatureId != null) add.spec.creatureEntry ??= creatureId;
|
|
562
|
+
ctx.rosterSeatAlly!(side, add);
|
|
563
|
+
if (recycling) {
|
|
564
|
+
releaseGuardianSide(side);
|
|
565
|
+
ctx.deathEmitted.delete(side);
|
|
566
|
+
for (let i = ctx.effects.length - 1; i >= 0; i--) {
|
|
567
|
+
const ae = ctx.effects[i]!;
|
|
568
|
+
if (ae.target === side || ae.source === side) ctx.effects.splice(i, 1);
|
|
569
|
+
}
|
|
570
|
+
ctx.allyManualTarget.delete(side);
|
|
571
|
+
}
|
|
572
|
+
ctx.unitItems.set(side, []);
|
|
573
|
+
ctx.unitItemCd.set(side, new Map());
|
|
574
|
+
ctx.unitItemsSpent.set(side, new Map());
|
|
575
|
+
let owned = ctx.guardianSidesBySummoner.get(ownerSide);
|
|
576
|
+
if (!owned) {
|
|
577
|
+
owned = new Set();
|
|
578
|
+
ctx.guardianSidesBySummoner.set(ownerSide, owned);
|
|
579
|
+
}
|
|
580
|
+
owned.add(side);
|
|
581
|
+
return add;
|
|
582
|
+
};
|
|
583
|
+
|
|
584
|
+
// Add an ally body from a spec, at a world point. The battleground counterpart of injectEnemySpec:
|
|
585
|
+
// AV's own guards, marshals and general fight on the player's side and have to be real seats to do it.
|
|
586
|
+
const injectAllySpec = (
|
|
587
|
+
raw: import('./types.ts').CombatantSpec,
|
|
588
|
+
opts?: { ownerSide?: Side; position?: CombatPosYd; side?: string },
|
|
589
|
+
): Fighter | null => {
|
|
590
|
+
const add = seatFriendly(opts?.ownerSide ?? 'player', raw, raw.creatureEntry, opts?.side);
|
|
591
|
+
if (!add) return null;
|
|
592
|
+
if (opts?.position && ctx.unitPositionsMutable) {
|
|
593
|
+
ctx.unitPositionsMutable[add.side] = opts.position;
|
|
594
|
+
}
|
|
595
|
+
ctx.push({
|
|
596
|
+
t: ctx.t,
|
|
597
|
+
kind: 'summon',
|
|
598
|
+
actor: opts?.ownerSide ?? 'player',
|
|
599
|
+
side: add.side,
|
|
600
|
+
creatureId: raw.creatureEntry ?? 0,
|
|
601
|
+
name: add.spec.name,
|
|
602
|
+
});
|
|
603
|
+
return add;
|
|
604
|
+
};
|
|
605
|
+
|
|
606
|
+
const injectFriendlySummon = (
|
|
607
|
+
summoner: Fighter,
|
|
608
|
+
creatureId: number,
|
|
609
|
+
durationMs: number,
|
|
610
|
+
worldPos?: SummonWorldPoint,
|
|
611
|
+
): Fighter | null => {
|
|
612
|
+
if (ctx.ended) return null;
|
|
613
|
+
const raw = ctx.cfg.resolveSummon?.(creatureId);
|
|
614
|
+
if (!raw) return null;
|
|
615
|
+
const add = seatFriendly(summoner.side, raw, creatureId);
|
|
616
|
+
if (!add) return null;
|
|
617
|
+
const side = add.side;
|
|
618
|
+
const placed = summonPositionFor(summoner, worldPos);
|
|
619
|
+
if (placed && ctx.unitPositionsMutable) {
|
|
620
|
+
ctx.unitPositionsMutable[side] = placed.position;
|
|
621
|
+
}
|
|
622
|
+
if (durationMs > 0) add.summonDespawnAt = ctx.t + durationMs;
|
|
623
|
+
ctx.push({
|
|
624
|
+
t: ctx.t,
|
|
625
|
+
kind: 'summon',
|
|
626
|
+
actor: summoner.side,
|
|
627
|
+
side,
|
|
628
|
+
creatureId,
|
|
629
|
+
name: add.spec.name,
|
|
630
|
+
});
|
|
631
|
+
return add;
|
|
632
|
+
};
|
|
633
|
+
|
|
634
|
+
// Route a cast's summon to the summoner's OWN side. Faction, not side string, so a charmed body summons
|
|
635
|
+
// for whoever holds it. Cite: Unit.cpp TakeCharmOf SetFactionTemporary.
|
|
636
|
+
const injectSummonForCaster = (
|
|
637
|
+
summoner: Fighter,
|
|
638
|
+
creatureId: number,
|
|
639
|
+
durationMs: number,
|
|
640
|
+
worldPos?: SummonWorldPoint,
|
|
641
|
+
): Fighter | null => (
|
|
642
|
+
ctx.factionOfFighter(summoner) === 'enemy'
|
|
643
|
+
? injectEnemySummon(summoner, creatureId, durationMs, worldPos)
|
|
644
|
+
: injectFriendlySummon(summoner, creatureId, durationMs, worldPos)
|
|
645
|
+
);
|
|
646
|
+
|
|
647
|
+
// TEMPSPAWN timed despawn for friendly summons — runEnemyEventAi owns the enemy copy and never runs for
|
|
648
|
+
// an ally seat. Cite: SpellEffects.cpp:2765.
|
|
649
|
+
const expireFriendlySummons = (): void => {
|
|
650
|
+
const t = ctx.t;
|
|
651
|
+
for (const a of ctx.livingAllies()) {
|
|
652
|
+
if (a.spec.summonOwnerSide == null) continue;
|
|
653
|
+
if (a.summonDespawnAt == null || a.summonDespawnAt <= 0 || t < a.summonDespawnAt) continue;
|
|
654
|
+
a.summonDespawnAt = 0;
|
|
655
|
+
a.hp = 0;
|
|
656
|
+
releaseGuardianSide(a.side);
|
|
657
|
+
ctx.deathEmitted.add(a.side);
|
|
658
|
+
ctx.push({ t, kind: 'despawn', actor: a.side });
|
|
659
|
+
ctx.bumpRoster!();
|
|
660
|
+
}
|
|
661
|
+
// A summon that was KILLED never runs the branch above, so free its slot here or the
|
|
662
|
+
// spawn ring keeps widening for the rest of an endless floor.
|
|
663
|
+
for (const a of ctx.allyBlock()) {
|
|
664
|
+
if (a.spec.summonOwnerSide != null && !(a.hp > 0)) releaseGuardianSide(a.side);
|
|
665
|
+
}
|
|
666
|
+
};
|
|
667
|
+
|
|
668
|
+
// A second direct cast unsummons this caster's guardians of the same entry, which is also what keeps a
|
|
669
|
+
// re-cast from eating a fresh ally seat. The C++ also skips triggered casts; that half is not modelled.
|
|
670
|
+
const unsummonFriendlyGuardians = (
|
|
671
|
+
owner: Fighter,
|
|
672
|
+
creatureId: number,
|
|
673
|
+
createdBySpell: number,
|
|
674
|
+
): number => {
|
|
675
|
+
let n = 0;
|
|
676
|
+
for (const a of ctx.livingAllies()) {
|
|
677
|
+
if (a.spec.summonOwnerSide !== owner.side) continue;
|
|
678
|
+
if (((a.spec.creatureEntry ?? 0) | 0) !== (creatureId | 0)) continue;
|
|
679
|
+
if (((a.spec.createdBySpell ?? 0) | 0) !== (createdBySpell | 0)) continue;
|
|
680
|
+
a.hp = 0;
|
|
681
|
+
a.summonDespawnAt = 0;
|
|
682
|
+
releaseGuardianSide(a.side);
|
|
683
|
+
ctx.deathEmitted.add(a.side);
|
|
684
|
+
ctx.push({ t: ctx.t, kind: 'despawn', actor: a.side });
|
|
685
|
+
n++;
|
|
686
|
+
}
|
|
687
|
+
if (n > 0) ctx.bumpRoster!();
|
|
688
|
+
return n;
|
|
689
|
+
};
|
|
690
|
+
|
|
691
|
+
ctx.injectEnemySpec = injectEnemySpec;
|
|
692
|
+
ctx.injectEnemySummon = injectEnemySummon;
|
|
693
|
+
ctx.injectFriendlySummon = injectFriendlySummon;
|
|
694
|
+
ctx.injectAllySpec = injectAllySpec;
|
|
695
|
+
ctx.unsummonFriendlyGuardians = unsummonFriendlyGuardians;
|
|
696
|
+
ctx.injectSummonForCaster = injectSummonForCaster;
|
|
697
|
+
ctx.expireFriendlySummons = expireFriendlySummons;
|
|
698
|
+
ctx.forceDespawnEnemy = forceDespawnEnemy;
|
|
699
|
+
// Fire onAggro for any watched side that has since entered combat. Cheap: the set only ever holds units
|
|
700
|
+
// whose creature entry has an onAggro IR, which is bosses.
|
|
701
|
+
const pumpScriptDevAggroLifecycle = (): void => {
|
|
702
|
+
if (aggroLifecyclePending.size === 0) return;
|
|
703
|
+
for (const side of [...aggroLifecyclePending]) {
|
|
704
|
+
const ef = ctx.sideFighter?.(side) ?? null;
|
|
705
|
+
if (!ef) {
|
|
706
|
+
aggroLifecyclePending.delete(side);
|
|
707
|
+
continue;
|
|
708
|
+
}
|
|
709
|
+
if (dead(ef)) continue; // a corpse can still be recycled into a live slot
|
|
710
|
+
const tm = ctx.threatByOwner.get(side);
|
|
711
|
+
if (!tm || tm.isEmpty()) continue;
|
|
712
|
+
aggroLifecyclePending.delete(side);
|
|
713
|
+
runScriptDevAggroLifecycle(ef);
|
|
714
|
+
}
|
|
715
|
+
};
|
|
716
|
+
|
|
717
|
+
ctx.runScriptDevAggroLifecycle = runScriptDevAggroLifecycle;
|
|
718
|
+
ctx.pumpScriptDevAggroLifecycle = pumpScriptDevAggroLifecycle;
|
|
719
|
+
}
|