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,1076 @@
|
|
|
1
|
+
// Scholomance (map 289) — InstanceDef graph. Authority: docs/dungeons/survey/18-scholomance.md.
|
|
2
|
+
// Six engine/bake residuals are named there; none is a deferred C++ port.
|
|
3
|
+
|
|
4
|
+
import type { EncounterDef, EncounterEvent, InstanceDef } from '../schema.ts';
|
|
5
|
+
import {
|
|
6
|
+
entranceForInstance,
|
|
7
|
+
buildClusterEncounters,
|
|
8
|
+
clusterMemberByGuid,
|
|
9
|
+
loadPoolGuidCandidates,
|
|
10
|
+
repackFromGuids,
|
|
11
|
+
} from './pack-from-clusters.ts';
|
|
12
|
+
|
|
13
|
+
// ---- Census static counts (map 289; survey creature census static column) ----
|
|
14
|
+
// Bosses, Dawn's Gambit students, seasonal rows and every summon-only entry are excluded.
|
|
15
|
+
|
|
16
|
+
const STATIC = {
|
|
17
|
+
risenGuard: 12, // 10489 Risen Guard
|
|
18
|
+
acolyte: 14, // 10471 Scholomance Acolyte
|
|
19
|
+
necrolyte: 10, // 10476 Scholomance Necrolyte
|
|
20
|
+
neophyte: 17, // 10470 Scholomance Neophyte
|
|
21
|
+
diseasedGhoul: 29, // 10495 Diseased Ghoul (pool)
|
|
22
|
+
necrofiend: 3, // 11551 Necrofiend
|
|
23
|
+
bonewarder: 4, // 10491 Risen Bonewarder
|
|
24
|
+
construct: 12, // 10488 Risen Construct
|
|
25
|
+
protector: 4, // 10487 Risen Protector
|
|
26
|
+
adept: 17, // 10469 Scholomance Adept
|
|
27
|
+
darkSummoner: 6, // 11582 Scholomance Dark Summoner
|
|
28
|
+
necromancer: 15, // 10477 Scholomance Necromancer
|
|
29
|
+
occultist: 5, // 10472 Scholomance Occultist
|
|
30
|
+
researcher: 7, // 10499 Spectral Researcher
|
|
31
|
+
teacher: 3, // 10500 Spectral Teacher
|
|
32
|
+
tutor: 7, // 10498 Spectral Tutor
|
|
33
|
+
warrior: 2, // 10486 Risen Warrior
|
|
34
|
+
handler: 5, // 11257 Scholomance Handler
|
|
35
|
+
splinteredSkeleton: 5, // 10478 Splintered Skeleton
|
|
36
|
+
bloodSteward: 1, // 14861 Blood Steward of Kirtonos
|
|
37
|
+
hatchling: 22, // 10678 Plagued Hatchling
|
|
38
|
+
aberration: 46, // 10485 Risen Aberration
|
|
39
|
+
reanimatedCorpse: 24, // 10481 Reanimated Corpse (pool)
|
|
40
|
+
unstableCorpse: 21, // 10480 Unstable Corpse
|
|
41
|
+
} as const;
|
|
42
|
+
|
|
43
|
+
const ENTRY = {
|
|
44
|
+
risenGuard: 10489,
|
|
45
|
+
acolyte: 10471,
|
|
46
|
+
necrolyte: 10476,
|
|
47
|
+
neophyte: 10470,
|
|
48
|
+
diseasedGhoul: 10495,
|
|
49
|
+
necrofiend: 11551,
|
|
50
|
+
bonewarder: 10491,
|
|
51
|
+
construct: 10488,
|
|
52
|
+
protector: 10487,
|
|
53
|
+
adept: 10469,
|
|
54
|
+
darkSummoner: 11582,
|
|
55
|
+
necromancer: 10477,
|
|
56
|
+
occultist: 10472,
|
|
57
|
+
researcher: 10499,
|
|
58
|
+
teacher: 10500,
|
|
59
|
+
tutor: 10498,
|
|
60
|
+
warrior: 10486,
|
|
61
|
+
handler: 11257,
|
|
62
|
+
splinteredSkeleton: 10478,
|
|
63
|
+
bloodSteward: 14861,
|
|
64
|
+
hatchling: 10678,
|
|
65
|
+
aberration: 10485,
|
|
66
|
+
reanimatedCorpse: 10481,
|
|
67
|
+
unstableCorpse: 10480,
|
|
68
|
+
// Bosses (canonical survey order)
|
|
69
|
+
kirtonos: 10506, // summon-only - Blood of Innocents on Brazier
|
|
70
|
+
jandice: 10503,
|
|
71
|
+
rattlegore: 11622,
|
|
72
|
+
marduk: 10433, // viewing room (with Vectus)
|
|
73
|
+
vectus: 10432,
|
|
74
|
+
ras: 10508,
|
|
75
|
+
malicia: 10505, // six mini-bosses (stable author order)
|
|
76
|
+
krastinov: 11261,
|
|
77
|
+
polkelt: 10901,
|
|
78
|
+
ravenian: 10507,
|
|
79
|
+
lordAlexei: 10504,
|
|
80
|
+
ladyIllucia: 10502,
|
|
81
|
+
gandling: 1853, // summon-only - after all 6 mini-bosses
|
|
82
|
+
// Event summon-only
|
|
83
|
+
risenGuardian: 11598, // Gandling Shadow Portal room adds
|
|
84
|
+
/** Dawn's Gambit — friendly statics until item arm; combat pack after gate. */
|
|
85
|
+
student: 10475, // Scholomance Student (survey static ×32)
|
|
86
|
+
} as const;
|
|
87
|
+
|
|
88
|
+
/** Flags from survey event choreography / instance_scholomance.cpp. */
|
|
89
|
+
export const SCHOLOMANCE_FLAGS = {
|
|
90
|
+
/** Brazier of the Herald used with Blood of Innocents - unlocks Kirtonos. */
|
|
91
|
+
kirtonosBrazier: 'scholo-kirtonos-brazier',
|
|
92
|
+
/** Rattlegore death drops Viewing Room Key 13873 - opens Viewing Room Door 175167. */
|
|
93
|
+
viewingRoomKey: 'scholo-viewing-room-key',
|
|
94
|
+
// Dawn's Gambit used at Viewing Room Spell Focus. Cite: instance_scholomance.cpp:440-469
|
|
95
|
+
// HandleDawnGambitEvent; scholomance.h:66 EVENT_ID=5140.
|
|
96
|
+
dawnGambit: 'scholo-dawn-gambit',
|
|
97
|
+
/** Jandice death → journal GO reveal path. Cite: 289_scholomance.sql dbscripts_on_creature_death 10503. */
|
|
98
|
+
jandiceDone: 'scholo-jandice-done',
|
|
99
|
+
/** Six mini-boss DONE flags - all required before Gandling. */
|
|
100
|
+
maliciaDone: 'scholo-malicia-done',
|
|
101
|
+
krastinovDone: 'scholo-krastinov-done',
|
|
102
|
+
polkeltDone: 'scholo-polkelt-done',
|
|
103
|
+
ravenianDone: 'scholo-ravenian-done',
|
|
104
|
+
lordAlexeiDone: 'scholo-lord-alexei-done',
|
|
105
|
+
ladyIlluciaDone: 'scholo-lady-illucia-done',
|
|
106
|
+
} as const;
|
|
107
|
+
|
|
108
|
+
// Kirtonos the Herald — Brazier plus porch gate lock-in: Gate 175570 auto-reopens after 600s and
|
|
109
|
+
// 10506 spawns at 309.65,93.47. Cite: 289_scholomance.sql dbscripts_on_go_use @OGUID+9.
|
|
110
|
+
export const SCHOLO_KIRTONOS = {
|
|
111
|
+
encId: 'kirtonos-the-herald',
|
|
112
|
+
goEntry: 175564, // Brazier of the Herald
|
|
113
|
+
requiredItem: 13523, // Blood of Innocents (quest 5384)
|
|
114
|
+
porchGateGo: 175570, // Gate of Kirtonos
|
|
115
|
+
/** dbscripts_on_go_use cmd 12 datalong2 = 600 (seconds). */
|
|
116
|
+
porchGateLockMs: 600_000,
|
|
117
|
+
/** dbscripts_on_go_use delay 5000 → SUMMON_CREATURE 10506. */
|
|
118
|
+
firstWaveAtMs: 5_000,
|
|
119
|
+
/** dbscripts datalong2 on summon = 900000 (15 min). */
|
|
120
|
+
despawnMs: 900_000,
|
|
121
|
+
/** dbscripts_on_go_use cmd 10 x,y,z. */
|
|
122
|
+
spawn: { x: 309.65, y: 93.47, z: 101.66 },
|
|
123
|
+
} as const;
|
|
124
|
+
|
|
125
|
+
/** Viewing Room Door: GO 175167, lock 1199 → LOCK_KEY_ITEM 13873 off Rattlegore (lootId 11622). */
|
|
126
|
+
export const SCHOLO_VIEWING_ROOM = {
|
|
127
|
+
goEntry: 175167,
|
|
128
|
+
requiredItem: 13873,
|
|
129
|
+
} as const;
|
|
130
|
+
|
|
131
|
+
/** Alias kept for older probe/import sites. */
|
|
132
|
+
export const SCHOLOMANCE_KIRTONOS_BRAZIER = {
|
|
133
|
+
goEntry: SCHOLO_KIRTONOS.goEntry,
|
|
134
|
+
requiredItem: SCHOLO_KIRTONOS.requiredItem,
|
|
135
|
+
} as const;
|
|
136
|
+
|
|
137
|
+
// Gandling Shadow Portal room table (baked dbScripts.event 5618–5623): eventId, classroom gate GO,
|
|
138
|
+
// guardian count, room tag. Polkelt takes ×4 guardians, the others ×3. Cite: scholomance.h:59-64.
|
|
139
|
+
export const SCHOLOMANCE_GANDLING_PORTALS = [
|
|
140
|
+
{ room: 'polkelt', eventId: 5618, gateGo: 177376, count: 4 },
|
|
141
|
+
{ room: 'theolen', eventId: 5619, gateGo: 177377, count: 3 },
|
|
142
|
+
{ room: 'malicia', eventId: 5620, gateGo: 177375, count: 3 },
|
|
143
|
+
{ room: 'illucia', eventId: 5621, gateGo: 177371, count: 3 },
|
|
144
|
+
{ room: 'barov', eventId: 5622, gateGo: 177373, count: 3 },
|
|
145
|
+
{ room: 'ravenian', eventId: 5623, gateGo: 177372, count: 3 },
|
|
146
|
+
] as const;
|
|
147
|
+
|
|
148
|
+
// Darkmaster Gandling encounter plus the Shadow Portal schedule. Cite: boss_darkmaster_gandling.cpp
|
|
149
|
+
// :57 Teleport=16000, :94 HP>3%, :106 urand(20000,35000); dbScripts.event 5618 delay 2000.
|
|
150
|
+
export const SCHOLO_GANDLING = {
|
|
151
|
+
encId: 'darkmaster-gandling',
|
|
152
|
+
spellShadowPortal: 17950,
|
|
153
|
+
/** Reset m_uiTeleportTimer. Cite: boss_darkmaster_gandling.cpp:57 */
|
|
154
|
+
firstPortalCastMs: 16_000,
|
|
155
|
+
/** dbscripts_on_event 5618–5623 delay before SUMMON_CREATURE. */
|
|
156
|
+
portalSummonDelayMs: 2_000,
|
|
157
|
+
/** First guardian wave absolute from combat start (cast + DB delay). */
|
|
158
|
+
firstPortalGuardiansAtMs: 18_000,
|
|
159
|
+
/** CAST_OK re-arm min. Cite: boss_darkmaster_gandling.cpp:106 */
|
|
160
|
+
portalRepeatMinMs: 20_000,
|
|
161
|
+
/** CAST_OK re-arm max. Cite: boss_darkmaster_gandling.cpp:106 */
|
|
162
|
+
portalRepeatMaxMs: 35_000,
|
|
163
|
+
/** Portal only while GetHealthPercent() > 3. Cite: cpp:94 */
|
|
164
|
+
portalHpMinPct: 3,
|
|
165
|
+
/** dbscripts datalong2 despawn. */
|
|
166
|
+
guardianDespawnMs: 300_000,
|
|
167
|
+
/** aGandlingSpawnLocs[0]. Cite: scholomance.h:82-85 */
|
|
168
|
+
spawn: { x: 180.771, y: -5.4286, z: 75.5702 },
|
|
169
|
+
gateGo: 177374, // GO_GATE_GANDLING
|
|
170
|
+
} as const;
|
|
171
|
+
|
|
172
|
+
// Portal rooms then the Gandling finale, with `lastHas` carrying the floor credit guid. Residual:
|
|
173
|
+
// player teleport and per-room gate close/reopen have no floor-isolation kind.
|
|
174
|
+
export const SCHOLO_GANDLING_WAVES = [
|
|
175
|
+
...SCHOLOMANCE_GANDLING_PORTALS.map((p) => ({
|
|
176
|
+
pack: [{ creatureEntry: ENTRY.risenGuardian, count: p.count }],
|
|
177
|
+
})),
|
|
178
|
+
{ pack: [{ creatureEntry: ENTRY.gandling, count: 1 }] },
|
|
179
|
+
] as const;
|
|
180
|
+
|
|
181
|
+
// Jandice Barov — illusions from ScriptDev (17773 → 15× 11439), journal from
|
|
182
|
+
// dbscripts_on_creature_death 10503 spell 26096 → GO 180794, which the bake still lacks.
|
|
183
|
+
export const SCHOLO_JANDICE = {
|
|
184
|
+
encId: 'jandice-barov',
|
|
185
|
+
spellSummonIllusions: 17773,
|
|
186
|
+
illusionEntry: 11439,
|
|
187
|
+
illusionCount: 15, // 17773 EffectBasePoints1=14 + dieSides1=1
|
|
188
|
+
hideDurationMs: 8_000, // Spread Jandice 17774 DurationIndex 31
|
|
189
|
+
journalGo: 180794, // Cite: 289_scholomance.sql dbscripts_on_creature_death 10503 → 26096
|
|
190
|
+
journalSpell: 26096,
|
|
191
|
+
} as const;
|
|
192
|
+
|
|
193
|
+
// Dawn's Gambit — Viewing Room student ambush, gated at Spell Focus 176111 with item 12368 and a
|
|
194
|
+
// 32× 10475 pack standing in for the transform. Cite: instance_scholomance.cpp:440-509.
|
|
195
|
+
export const SCHOLO_DAWN_GAMBIT = {
|
|
196
|
+
encId: 'dawn-gambit',
|
|
197
|
+
/** dungeonGameObjects map 289 — Scholomance Viewing Room Spell Focus (DND). */
|
|
198
|
+
goEntry: 176111,
|
|
199
|
+
requiredItem: 12368, // Dawn's Gambit (quest 4771); item-data useSpell 17045
|
|
200
|
+
spellDawnGambit: 17045,
|
|
201
|
+
trapGo: 176110, // summoned by 17045 (not static on map)
|
|
202
|
+
eventId: 5140, // scholomance.h:66 EVENT_ID_DAWN_GAMBIT
|
|
203
|
+
/** Cite: instance_scholomance.cpp:444 m_uiGambitTransformTimer = 12 * IN_MILLISECONDS */
|
|
204
|
+
transformMs: 12_000,
|
|
205
|
+
studentEntry: 10475,
|
|
206
|
+
/** Survey static census ×32 Viewing Room students. */
|
|
207
|
+
studentCount: 32,
|
|
208
|
+
/** FACTION_SCOURGE after flip. Cite: scholomance.h:68 FACTION_SCOURGE=233 */
|
|
209
|
+
scourgeFaction: 233,
|
|
210
|
+
/** SPELL_STUDENT_TRANSFORM — missing from spell bake; product combat pack stand-in. */
|
|
211
|
+
spellStudentTransform: 18115,
|
|
212
|
+
} as const;
|
|
213
|
+
|
|
214
|
+
// Soulbound Keepsake — Ras Frostwhisper mortality (quest 5461/5466), item 13752 useSpell 17179.
|
|
215
|
+
// Residual: the mid-fight item-target state machine and spell 17186 are absent from the bake.
|
|
216
|
+
export const SCHOLO_RAS_KEEPSAKE = {
|
|
217
|
+
encId: 'ras-frostwhisper',
|
|
218
|
+
requiredItem: 13752, // Soulbound Keepsake
|
|
219
|
+
spellBoonOfLife: 17179,
|
|
220
|
+
spellVisualDummy: 17190, // EventAI 1050803 trigger
|
|
221
|
+
spellBecomesBoy: 17186, // missing from spell bake
|
|
222
|
+
/** Relay 1050801: +2s cast boy form. Cite: survey 18-scholomance.md Ras mortality row. */
|
|
223
|
+
becomesBoyDelayMs: 2_000,
|
|
224
|
+
/** Relay: +8s faction 233 + attackable again. */
|
|
225
|
+
reHostileDelayMs: 8_000,
|
|
226
|
+
humanHeadItem: 13626, // quest 5466 drop (no DB condition on human form)
|
|
227
|
+
boyDisplayId: 5736,
|
|
228
|
+
} as const;
|
|
229
|
+
|
|
230
|
+
/** Summon-only creature entries that must never appear in pure static trash packs. */
|
|
231
|
+
export const SCHOLOMANCE_SUMMON_ONLY_ENTRIES = new Set<number>([
|
|
232
|
+
ENTRY.kirtonos, // 10506
|
|
233
|
+
ENTRY.gandling, // 1853
|
|
234
|
+
ENTRY.risenGuardian, // 11598
|
|
235
|
+
11439, // Illusion of Jandice Barov (ScriptDev mid-fight inject)
|
|
236
|
+
16118, // Kormok (survey; not modeled)
|
|
237
|
+
]);
|
|
238
|
+
|
|
239
|
+
/** Scourge Invasion / technical - excluded from static combat graph. */
|
|
240
|
+
export const SCHOLOMANCE_EXCLUDED_ENTRIES = new Set<number>([
|
|
241
|
+
14695, // Lord Blackwood - Scourge Invasion (D-10)
|
|
242
|
+
// 10475 students: event-only via SCHOLO_DAWN_GAMBIT (not pure static trash)
|
|
243
|
+
16047, // Kormok Trigger - technical
|
|
244
|
+
]);
|
|
245
|
+
|
|
246
|
+
/** Split a static spawn count into pack sizes in [2, 5] (prefer 4). Remainder 1 folded into prior pack. */
|
|
247
|
+
export function splitPackSizes(total: number, prefer = 4): number[] {
|
|
248
|
+
if (total <= 0) return [];
|
|
249
|
+
if (total === 1) return [1];
|
|
250
|
+
const packs: number[] = [];
|
|
251
|
+
let left = total;
|
|
252
|
+
while (left > 0) {
|
|
253
|
+
if (left <= 5) {
|
|
254
|
+
packs.push(left);
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
let n = prefer;
|
|
258
|
+
const rem = left - n;
|
|
259
|
+
if (rem === 1) n = prefer - 1; // leave 2+
|
|
260
|
+
packs.push(n);
|
|
261
|
+
left -= n;
|
|
262
|
+
}
|
|
263
|
+
return packs;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function trashPull(
|
|
267
|
+
id: string,
|
|
268
|
+
name: string,
|
|
269
|
+
creatureEntry: number,
|
|
270
|
+
count: number,
|
|
271
|
+
events?: EncounterEvent[],
|
|
272
|
+
): EncounterDef {
|
|
273
|
+
const enc: EncounterDef = {
|
|
274
|
+
id,
|
|
275
|
+
name,
|
|
276
|
+
kind: 'trash',
|
|
277
|
+
creatureEntry,
|
|
278
|
+
};
|
|
279
|
+
if (count > 1) enc.pack = [{ creatureEntry, count: count - 1 }];
|
|
280
|
+
if (events && events.length) enc.events = events;
|
|
281
|
+
return enc;
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/** Expand one census entry into ordered trash pulls (ids `${prefix}-0` …). */
|
|
285
|
+
function trashFromCensus(
|
|
286
|
+
_prefix: string,
|
|
287
|
+
_displayName: string,
|
|
288
|
+
_creatureEntry: number,
|
|
289
|
+
_total: number,
|
|
290
|
+
): EncounterDef[] {
|
|
291
|
+
// DP1: cluster packs supply trash; hand spine keeps bosses/events only.
|
|
292
|
+
return [];
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// Boss spells: creature.spells from bake (game-data) - no invented ids.
|
|
296
|
+
const BOSS_SPELLS = {
|
|
297
|
+
kirtonos: [18116, 20741, 18144, 6016, 12882, 8379, 16467, 17228, 12889, 14515],
|
|
298
|
+
// SESSION 10 ScriptDev schedule owns Jandice / Gandling kits (cpp spell enums).
|
|
299
|
+
jandice: [16098, 8994, 17773, 17774, 17772],
|
|
300
|
+
rattlegore: [10101, 16727, 18116, 18368],
|
|
301
|
+
marduk: [17228, 12040, 15284, 17695],
|
|
302
|
+
vectus: [18399, 16046],
|
|
303
|
+
ras: [18099, 8398, 12096, 18763, 18100, 11130],
|
|
304
|
+
malicia: [11672, 12020, 18116, 17831, 18376, 8362, 13747, 17843, 15586],
|
|
305
|
+
krastinov: [16509, 18103, 8269],
|
|
306
|
+
polkelt: [16359, 3584, 18116, 18151, 18149, 8245],
|
|
307
|
+
ravenian: [17963, 15550, 18670, 15584],
|
|
308
|
+
lordAlexei: [11668, 11700, 18116, 17467, 17820],
|
|
309
|
+
ladyIllucia: [18116, 19460, 6215, 15487, 12528, 17289, 18671, 12542, 14515],
|
|
310
|
+
gandling: [15790, 12040, 18702, 17950],
|
|
311
|
+
} as const;
|
|
312
|
+
|
|
313
|
+
function boss(
|
|
314
|
+
id: string,
|
|
315
|
+
name: string,
|
|
316
|
+
creatureEntry: number,
|
|
317
|
+
bossSpells: readonly number[],
|
|
318
|
+
events?: EncounterEvent[],
|
|
319
|
+
intro?: string,
|
|
320
|
+
): EncounterDef {
|
|
321
|
+
const enc: EncounterDef = {
|
|
322
|
+
id,
|
|
323
|
+
name,
|
|
324
|
+
kind: 'boss',
|
|
325
|
+
creatureEntry,
|
|
326
|
+
};
|
|
327
|
+
if (bossSpells.length) enc.bossSpells = [...bossSpells];
|
|
328
|
+
if (intro) enc.intro = intro;
|
|
329
|
+
if (events && events.length) enc.events = events;
|
|
330
|
+
return enc;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Linear encounter graph: entrance porch → Kirtonos → Jandice → Rattlegore → Viewing Room →
|
|
334
|
+
// Ras → six mini-boss rooms in a stable author order → Darkmaster Gandling.
|
|
335
|
+
function buildHandSpine(): EncounterDef[] {
|
|
336
|
+
// Entrance / porch band
|
|
337
|
+
const acolytes = trashFromCensus('acolyte', 'Scholomance Acolyte', ENTRY.acolyte, STATIC.acolyte);
|
|
338
|
+
const necrolytes = trashFromCensus(
|
|
339
|
+
'necrolyte',
|
|
340
|
+
'Scholomance Necrolyte',
|
|
341
|
+
ENTRY.necrolyte,
|
|
342
|
+
STATIC.necrolyte,
|
|
343
|
+
);
|
|
344
|
+
const neophytes = trashFromCensus(
|
|
345
|
+
'neophyte',
|
|
346
|
+
'Scholomance Neophyte',
|
|
347
|
+
ENTRY.neophyte,
|
|
348
|
+
STATIC.neophyte,
|
|
349
|
+
);
|
|
350
|
+
const risenGuards = trashFromCensus(
|
|
351
|
+
'risen-guard',
|
|
352
|
+
'Risen Guard',
|
|
353
|
+
ENTRY.risenGuard,
|
|
354
|
+
STATIC.risenGuard,
|
|
355
|
+
);
|
|
356
|
+
const bloodStewards = trashFromCensus(
|
|
357
|
+
'blood-steward',
|
|
358
|
+
'Blood Steward of Kirtonos',
|
|
359
|
+
ENTRY.bloodSteward,
|
|
360
|
+
STATIC.bloodSteward,
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
// Reliquary / Jandice wing
|
|
364
|
+
const adepts = trashFromCensus('adept', 'Scholomance Adept', ENTRY.adept, STATIC.adept);
|
|
365
|
+
const necromancers = trashFromCensus(
|
|
366
|
+
'necromancer',
|
|
367
|
+
'Scholomance Necromancer',
|
|
368
|
+
ENTRY.necromancer,
|
|
369
|
+
STATIC.necromancer,
|
|
370
|
+
);
|
|
371
|
+
const occultists = trashFromCensus(
|
|
372
|
+
'occultist',
|
|
373
|
+
'Scholomance Occultist',
|
|
374
|
+
ENTRY.occultist,
|
|
375
|
+
STATIC.occultist,
|
|
376
|
+
);
|
|
377
|
+
const darkSummoners = trashFromCensus(
|
|
378
|
+
'dark-summoner',
|
|
379
|
+
'Scholomance Dark Summoner',
|
|
380
|
+
ENTRY.darkSummoner,
|
|
381
|
+
STATIC.darkSummoner,
|
|
382
|
+
);
|
|
383
|
+
|
|
384
|
+
// Bone / Rattlegore / undead dens
|
|
385
|
+
const aberrations = trashFromCensus(
|
|
386
|
+
'aberration',
|
|
387
|
+
'Risen Aberration',
|
|
388
|
+
ENTRY.aberration,
|
|
389
|
+
STATIC.aberration,
|
|
390
|
+
);
|
|
391
|
+
const reanimated = trashFromCensus(
|
|
392
|
+
'reanimated-corpse',
|
|
393
|
+
'Reanimated Corpse',
|
|
394
|
+
ENTRY.reanimatedCorpse,
|
|
395
|
+
STATIC.reanimatedCorpse,
|
|
396
|
+
);
|
|
397
|
+
const unstable = trashFromCensus(
|
|
398
|
+
'unstable-corpse',
|
|
399
|
+
'Unstable Corpse',
|
|
400
|
+
ENTRY.unstableCorpse,
|
|
401
|
+
STATIC.unstableCorpse,
|
|
402
|
+
);
|
|
403
|
+
const diseasedGhouls = trashFromCensus(
|
|
404
|
+
'diseased-ghoul',
|
|
405
|
+
'Diseased Ghoul',
|
|
406
|
+
ENTRY.diseasedGhoul,
|
|
407
|
+
STATIC.diseasedGhoul,
|
|
408
|
+
);
|
|
409
|
+
const constructs = trashFromCensus(
|
|
410
|
+
'construct',
|
|
411
|
+
'Risen Construct',
|
|
412
|
+
ENTRY.construct,
|
|
413
|
+
STATIC.construct,
|
|
414
|
+
);
|
|
415
|
+
const bonewarders = trashFromCensus(
|
|
416
|
+
'bonewarder',
|
|
417
|
+
'Risen Bonewarder',
|
|
418
|
+
ENTRY.bonewarder,
|
|
419
|
+
STATIC.bonewarder,
|
|
420
|
+
);
|
|
421
|
+
const protectors = trashFromCensus(
|
|
422
|
+
'protector',
|
|
423
|
+
'Risen Protector',
|
|
424
|
+
ENTRY.protector,
|
|
425
|
+
STATIC.protector,
|
|
426
|
+
);
|
|
427
|
+
const warriors = trashFromCensus('risen-warrior', 'Risen Warrior', ENTRY.warrior, STATIC.warrior);
|
|
428
|
+
const splintered = trashFromCensus(
|
|
429
|
+
'splintered-skeleton',
|
|
430
|
+
'Splintered Skeleton',
|
|
431
|
+
ENTRY.splinteredSkeleton,
|
|
432
|
+
STATIC.splinteredSkeleton,
|
|
433
|
+
);
|
|
434
|
+
const necrofiends = trashFromCensus(
|
|
435
|
+
'necrofiend',
|
|
436
|
+
'Necrofiend',
|
|
437
|
+
ENTRY.necrofiend,
|
|
438
|
+
STATIC.necrofiend,
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
// Spectral / viewing / hatchling band
|
|
442
|
+
const researchers = trashFromCensus(
|
|
443
|
+
'spectral-researcher',
|
|
444
|
+
'Spectral Researcher',
|
|
445
|
+
ENTRY.researcher,
|
|
446
|
+
STATIC.researcher,
|
|
447
|
+
);
|
|
448
|
+
const teachers = trashFromCensus(
|
|
449
|
+
'spectral-teacher',
|
|
450
|
+
'Spectral Teacher',
|
|
451
|
+
ENTRY.teacher,
|
|
452
|
+
STATIC.teacher,
|
|
453
|
+
);
|
|
454
|
+
const tutors = trashFromCensus('spectral-tutor', 'Spectral Tutor', ENTRY.tutor, STATIC.tutor);
|
|
455
|
+
const hatchlings = trashFromCensus(
|
|
456
|
+
'plagued-hatchling',
|
|
457
|
+
'Plagued Hatchling',
|
|
458
|
+
ENTRY.hatchling,
|
|
459
|
+
STATIC.hatchling,
|
|
460
|
+
);
|
|
461
|
+
const handlers = trashFromCensus(
|
|
462
|
+
'handler',
|
|
463
|
+
'Scholomance Handler',
|
|
464
|
+
ENTRY.handler,
|
|
465
|
+
STATIC.handler,
|
|
466
|
+
);
|
|
467
|
+
|
|
468
|
+
const out: EncounterDef[] = [];
|
|
469
|
+
|
|
470
|
+
// --- Entrance porch → Kirtonos (summon via Brazier + Blood of Innocents) ---
|
|
471
|
+
out.push(
|
|
472
|
+
...acolytes.slice(0, Math.ceil(acolytes.length / 2)),
|
|
473
|
+
...neophytes.slice(0, Math.ceil(neophytes.length / 3)),
|
|
474
|
+
...risenGuards.slice(0, Math.ceil(risenGuards.length / 2)),
|
|
475
|
+
...bloodStewards,
|
|
476
|
+
);
|
|
477
|
+
|
|
478
|
+
// Brazier + Blood → porch gate locks 600s → +5s Kirtonos. Cite: dbscripts_on_go_use @OGUID+9.
|
|
479
|
+
out.push({
|
|
480
|
+
...boss(
|
|
481
|
+
SCHOLO_KIRTONOS.encId,
|
|
482
|
+
'Kirtonos the Herald',
|
|
483
|
+
ENTRY.kirtonos,
|
|
484
|
+
BOSS_SPELLS.kirtonos,
|
|
485
|
+
[
|
|
486
|
+
{
|
|
487
|
+
kind: 'objectGate',
|
|
488
|
+
goEntry: SCHOLO_KIRTONOS.goEntry,
|
|
489
|
+
requiredItem: SCHOLO_KIRTONOS.requiredItem,
|
|
490
|
+
setsFlag: SCHOLOMANCE_FLAGS.kirtonosBrazier,
|
|
491
|
+
once: true,
|
|
492
|
+
},
|
|
493
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.kirtonosBrazier },
|
|
494
|
+
{
|
|
495
|
+
kind: 'waves',
|
|
496
|
+
waves: [{ pack: [{ creatureEntry: ENTRY.kirtonos, count: 1 }] }],
|
|
497
|
+
},
|
|
498
|
+
],
|
|
499
|
+
'The Brazier of the Herald accepts the Blood of Innocents - the porch Gate seals for 10 minutes and Kirtonos descends after 5 seconds.',
|
|
500
|
+
),
|
|
501
|
+
origin: {
|
|
502
|
+
x: SCHOLO_KIRTONOS.spawn.x,
|
|
503
|
+
y: SCHOLO_KIRTONOS.spawn.y,
|
|
504
|
+
z: SCHOLO_KIRTONOS.spawn.z,
|
|
505
|
+
},
|
|
506
|
+
});
|
|
507
|
+
|
|
508
|
+
// --- → Jandice Barov ---
|
|
509
|
+
out.push(
|
|
510
|
+
...necrolytes.slice(0, Math.ceil(necrolytes.length / 2)),
|
|
511
|
+
...adepts.slice(0, Math.ceil(adepts.length / 3)),
|
|
512
|
+
...occultists.slice(0, Math.ceil(occultists.length / 2)),
|
|
513
|
+
...neophytes.slice(Math.ceil(neophytes.length / 3), Math.ceil((2 * neophytes.length) / 3)),
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
out.push(
|
|
517
|
+
boss(
|
|
518
|
+
SCHOLO_JANDICE.encId,
|
|
519
|
+
'Jandice Barov',
|
|
520
|
+
ENTRY.jandice,
|
|
521
|
+
BOSS_SPELLS.jandice,
|
|
522
|
+
[
|
|
523
|
+
// Cite: boss_jandice_barov.cpp:85-95 Summon Illusions 17773 (ScriptDev mid-fight).
|
|
524
|
+
// Journal: 289_scholomance.sql dbscripts_on_creature_death 10503 → spell 26096 → GO 180794.
|
|
525
|
+
{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.jandiceDone },
|
|
526
|
+
],
|
|
527
|
+
'Jandice Barov scatters into illusions mid-fight (Summon Illusions 17773). Her journal falls on death.',
|
|
528
|
+
),
|
|
529
|
+
);
|
|
530
|
+
|
|
531
|
+
// --- → Rattlegore (bone dens) ---
|
|
532
|
+
out.push(
|
|
533
|
+
...aberrations.slice(0, Math.ceil(aberrations.length / 3)),
|
|
534
|
+
...reanimated.slice(0, Math.ceil(reanimated.length / 3)),
|
|
535
|
+
...diseasedGhouls.slice(0, Math.ceil(diseasedGhouls.length / 3)),
|
|
536
|
+
...constructs.slice(0, Math.ceil(constructs.length / 2)),
|
|
537
|
+
...splintered.slice(0, Math.ceil(splintered.length / 2)),
|
|
538
|
+
...bonewarders,
|
|
539
|
+
);
|
|
540
|
+
|
|
541
|
+
out.push(
|
|
542
|
+
boss(
|
|
543
|
+
'rattlegore',
|
|
544
|
+
'Rattlegore',
|
|
545
|
+
ENTRY.rattlegore,
|
|
546
|
+
BOSS_SPELLS.rattlegore,
|
|
547
|
+
// No setsFlag: the key is a real drop (13873, 100% on lootId 11622) and the door it opens is
|
|
548
|
+
// the objectGate on marduk-blackpool. A flag would open the Viewing Room without the key.
|
|
549
|
+
[],
|
|
550
|
+
'Rattlegore, bone construct of the school, drops the Viewing Room Key.',
|
|
551
|
+
),
|
|
552
|
+
);
|
|
553
|
+
|
|
554
|
+
// --- Viewing Room → Dawn's Gambit students → Marduk + Vectus ---
|
|
555
|
+
out.push(
|
|
556
|
+
...unstable.slice(0, Math.ceil(unstable.length / 2)),
|
|
557
|
+
...researchers.slice(0, Math.ceil(researchers.length / 2)),
|
|
558
|
+
...tutors.slice(0, Math.ceil(tutors.length / 2)),
|
|
559
|
+
...necrofiends,
|
|
560
|
+
...protectors,
|
|
561
|
+
);
|
|
562
|
+
|
|
563
|
+
// Dawn's Gambit: item 12368 at Spell Focus 176111 → 32× student combat pack.
|
|
564
|
+
// Cite: instance_scholomance.cpp:440-469; survey 18-scholomance.md Dawn's Gambit row.
|
|
565
|
+
{
|
|
566
|
+
const n = SCHOLO_DAWN_GAMBIT.studentCount;
|
|
567
|
+
const dawn: EncounterDef = {
|
|
568
|
+
id: SCHOLO_DAWN_GAMBIT.encId,
|
|
569
|
+
name: "Dawn's Gambit",
|
|
570
|
+
kind: 'trash',
|
|
571
|
+
creatureEntry: ENTRY.student,
|
|
572
|
+
origin: { x: 133.69, y: 91.67, z: 101.73 }, // Cite: 289_scholomance.sql @OGUID+70 GO 176111
|
|
573
|
+
intro:
|
|
574
|
+
"Dawn's Gambit at the Viewing Room Spell Focus transforms the students - 32 Scholomance Students turn hostile.",
|
|
575
|
+
// Summon (quest 4771 item gate); isComplete ignores optional.
|
|
576
|
+
optional: true,
|
|
577
|
+
events: [
|
|
578
|
+
{
|
|
579
|
+
kind: 'objectGate',
|
|
580
|
+
goEntry: SCHOLO_DAWN_GAMBIT.goEntry,
|
|
581
|
+
requiredItem: SCHOLO_DAWN_GAMBIT.requiredItem,
|
|
582
|
+
setsFlag: SCHOLOMANCE_FLAGS.dawnGambit,
|
|
583
|
+
once: true,
|
|
584
|
+
},
|
|
585
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.viewingRoomKey },
|
|
586
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.dawnGambit },
|
|
587
|
+
],
|
|
588
|
+
};
|
|
589
|
+
if (n > 1) dawn.pack = [{ creatureEntry: ENTRY.student, count: n - 1 }];
|
|
590
|
+
out.push(dawn);
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
out.push(
|
|
594
|
+
boss(
|
|
595
|
+
'marduk-blackpool',
|
|
596
|
+
'Marduk Blackpool',
|
|
597
|
+
ENTRY.marduk,
|
|
598
|
+
BOSS_SPELLS.marduk,
|
|
599
|
+
[
|
|
600
|
+
// The Viewing Room Door is a real lock: GO 175167, lock 1199, LOCK_KEY_ITEM 13873 off
|
|
601
|
+
// Rattlegore. Hosting the gate here puts the key in a bag and spends it on the door.
|
|
602
|
+
{
|
|
603
|
+
kind: 'objectGate',
|
|
604
|
+
goEntry: SCHOLO_VIEWING_ROOM.goEntry,
|
|
605
|
+
requiredItem: SCHOLO_VIEWING_ROOM.requiredItem,
|
|
606
|
+
setsFlag: SCHOLOMANCE_FLAGS.viewingRoomKey,
|
|
607
|
+
once: true,
|
|
608
|
+
},
|
|
609
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.viewingRoomKey },
|
|
610
|
+
],
|
|
611
|
+
'Marduk Blackpool waits in the Viewing Room beside Vectus.',
|
|
612
|
+
),
|
|
613
|
+
);
|
|
614
|
+
|
|
615
|
+
out.push(
|
|
616
|
+
boss(
|
|
617
|
+
'vectus',
|
|
618
|
+
'Vectus',
|
|
619
|
+
ENTRY.vectus,
|
|
620
|
+
BOSS_SPELLS.vectus,
|
|
621
|
+
[{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.viewingRoomKey }],
|
|
622
|
+
// Cite: instance_scholomance.cpp:462-468 Vectus/Marduk flip + YELL_VECTUS_GAMBIT on gambit.
|
|
623
|
+
'Vectus, plague dragon instructor - Dawn\'s Gambit (quest 4771) arms the student ambush first.',
|
|
624
|
+
),
|
|
625
|
+
);
|
|
626
|
+
|
|
627
|
+
// --- → Ras Frostwhisper ---
|
|
628
|
+
out.push(
|
|
629
|
+
...hatchlings.slice(0, Math.ceil(hatchlings.length / 2)),
|
|
630
|
+
...handlers.slice(0, Math.ceil(handlers.length / 2)),
|
|
631
|
+
...teachers,
|
|
632
|
+
...constructs.slice(Math.ceil(constructs.length / 2)),
|
|
633
|
+
...warriors,
|
|
634
|
+
);
|
|
635
|
+
|
|
636
|
+
out.push(
|
|
637
|
+
boss(
|
|
638
|
+
SCHOLO_RAS_KEEPSAKE.encId,
|
|
639
|
+
'Ras Frostwhisper',
|
|
640
|
+
ENTRY.ras,
|
|
641
|
+
BOSS_SPELLS.ras,
|
|
642
|
+
undefined,
|
|
643
|
+
// Cite: survey 18-scholomance.md; ACID 1050803; SCHOLO_RAS_KEEPSAKE residual mortality flip.
|
|
644
|
+
'Ras Frostwhisper, the lich of Scholomance. Soulbound Keepsake (13752) forces his mortal form for the head quest.',
|
|
645
|
+
),
|
|
646
|
+
);
|
|
647
|
+
|
|
648
|
+
// --- Six mini-boss rooms (classic any-order; stable author order) --- Survey: Malicia, Theolen
|
|
649
|
+
// Krastinov, Polkelt, Ravenian, Lord Alexei, Lady Illucia. Each setsFlag; Gandling requires all six.
|
|
650
|
+
|
|
651
|
+
out.push(
|
|
652
|
+
...adepts.slice(Math.ceil(adepts.length / 3), Math.ceil((2 * adepts.length) / 3)),
|
|
653
|
+
...necromancers.slice(0, Math.ceil(necromancers.length / 3)),
|
|
654
|
+
...acolytes.slice(Math.ceil(acolytes.length / 2)),
|
|
655
|
+
);
|
|
656
|
+
|
|
657
|
+
out.push(
|
|
658
|
+
boss(
|
|
659
|
+
'instructor-malicia',
|
|
660
|
+
'Instructor Malicia',
|
|
661
|
+
ENTRY.malicia,
|
|
662
|
+
BOSS_SPELLS.malicia,
|
|
663
|
+
[{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.maliciaDone }],
|
|
664
|
+
'Instructor Malicia teaches dark arts in her classroom.',
|
|
665
|
+
),
|
|
666
|
+
);
|
|
667
|
+
|
|
668
|
+
out.push(
|
|
669
|
+
...diseasedGhouls.slice(
|
|
670
|
+
Math.ceil(diseasedGhouls.length / 3),
|
|
671
|
+
Math.ceil((2 * diseasedGhouls.length) / 3),
|
|
672
|
+
),
|
|
673
|
+
...aberrations.slice(
|
|
674
|
+
Math.ceil(aberrations.length / 3),
|
|
675
|
+
Math.ceil((2 * aberrations.length) / 3),
|
|
676
|
+
),
|
|
677
|
+
...risenGuards.slice(Math.ceil(risenGuards.length / 2)),
|
|
678
|
+
);
|
|
679
|
+
|
|
680
|
+
out.push(
|
|
681
|
+
boss(
|
|
682
|
+
'doctor-theolen-krastinov',
|
|
683
|
+
'Doctor Theolen Krastinov',
|
|
684
|
+
ENTRY.krastinov,
|
|
685
|
+
BOSS_SPELLS.krastinov,
|
|
686
|
+
[{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.krastinovDone }],
|
|
687
|
+
'Doctor Theolen Krastinov, the Butcher, haunts the surgery.',
|
|
688
|
+
),
|
|
689
|
+
);
|
|
690
|
+
|
|
691
|
+
out.push(
|
|
692
|
+
...neophytes.slice(Math.ceil((2 * neophytes.length) / 3)),
|
|
693
|
+
...darkSummoners.slice(0, Math.ceil(darkSummoners.length / 2)),
|
|
694
|
+
...occultists.slice(Math.ceil(occultists.length / 2)),
|
|
695
|
+
);
|
|
696
|
+
|
|
697
|
+
out.push(
|
|
698
|
+
boss(
|
|
699
|
+
'lorekeeper-polkelt',
|
|
700
|
+
'Lorekeeper Polkelt',
|
|
701
|
+
ENTRY.polkelt,
|
|
702
|
+
BOSS_SPELLS.polkelt,
|
|
703
|
+
[{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.polkeltDone }],
|
|
704
|
+
'Lorekeeper Polkelt guards forbidden tomes in the library wing.',
|
|
705
|
+
),
|
|
706
|
+
);
|
|
707
|
+
|
|
708
|
+
out.push(
|
|
709
|
+
...reanimated.slice(
|
|
710
|
+
Math.ceil(reanimated.length / 3),
|
|
711
|
+
Math.ceil((2 * reanimated.length) / 3),
|
|
712
|
+
),
|
|
713
|
+
...unstable.slice(Math.ceil(unstable.length / 2)),
|
|
714
|
+
...splintered.slice(Math.ceil(splintered.length / 2)),
|
|
715
|
+
);
|
|
716
|
+
|
|
717
|
+
out.push(
|
|
718
|
+
boss(
|
|
719
|
+
'the-ravenian',
|
|
720
|
+
'The Ravenian',
|
|
721
|
+
ENTRY.ravenian,
|
|
722
|
+
BOSS_SPELLS.ravenian,
|
|
723
|
+
[{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.ravenianDone }],
|
|
724
|
+
// Wave V: EventAI overlay boss-eventai.ts (1050701 AGGRO SET_PHASE→1, phase-masked casts).
|
|
725
|
+
'The Ravenian, a massive undead brute, holds one of the six classrooms.',
|
|
726
|
+
),
|
|
727
|
+
);
|
|
728
|
+
|
|
729
|
+
out.push(
|
|
730
|
+
...necromancers.slice(
|
|
731
|
+
Math.ceil(necromancers.length / 3),
|
|
732
|
+
Math.ceil((2 * necromancers.length) / 3),
|
|
733
|
+
),
|
|
734
|
+
...handlers.slice(Math.ceil(handlers.length / 2)),
|
|
735
|
+
...necrolytes.slice(Math.ceil(necrolytes.length / 2)),
|
|
736
|
+
);
|
|
737
|
+
|
|
738
|
+
out.push(
|
|
739
|
+
boss(
|
|
740
|
+
'lord-alexei-barov',
|
|
741
|
+
'Lord Alexei Barov',
|
|
742
|
+
ENTRY.lordAlexei,
|
|
743
|
+
BOSS_SPELLS.lordAlexei,
|
|
744
|
+
[{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.lordAlexeiDone }],
|
|
745
|
+
'Lord Alexei Barov, spectral patriarch, bars the family vault.',
|
|
746
|
+
),
|
|
747
|
+
);
|
|
748
|
+
|
|
749
|
+
out.push(
|
|
750
|
+
...researchers.slice(Math.ceil(researchers.length / 2)),
|
|
751
|
+
...tutors.slice(Math.ceil(tutors.length / 2)),
|
|
752
|
+
...hatchlings.slice(Math.ceil(hatchlings.length / 2)),
|
|
753
|
+
...darkSummoners.slice(Math.ceil(darkSummoners.length / 2)),
|
|
754
|
+
);
|
|
755
|
+
|
|
756
|
+
out.push(
|
|
757
|
+
boss(
|
|
758
|
+
'lady-illucia-barov',
|
|
759
|
+
'Lady Illucia Barov',
|
|
760
|
+
ENTRY.ladyIllucia,
|
|
761
|
+
BOSS_SPELLS.ladyIllucia,
|
|
762
|
+
[{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.ladyIlluciaDone }],
|
|
763
|
+
'Lady Illucia Barov completes the six classroom guardians.',
|
|
764
|
+
),
|
|
765
|
+
);
|
|
766
|
+
|
|
767
|
+
// Residual trash before Gandling
|
|
768
|
+
out.push(
|
|
769
|
+
...adepts.slice(Math.ceil((2 * adepts.length) / 3)),
|
|
770
|
+
...necromancers.slice(Math.ceil((2 * necromancers.length) / 3)),
|
|
771
|
+
...aberrations.slice(Math.ceil((2 * aberrations.length) / 3)),
|
|
772
|
+
...reanimated.slice(Math.ceil((2 * reanimated.length) / 3)),
|
|
773
|
+
...diseasedGhouls.slice(Math.ceil((2 * diseasedGhouls.length) / 3)),
|
|
774
|
+
);
|
|
775
|
+
|
|
776
|
+
// --- Darkmaster Gandling (summon-only after all 6 mini-bosses) ---
|
|
777
|
+
// Timed portal rooms (first @18s, then 20s min) then the finale. Residual: teleport + gates.
|
|
778
|
+
out.push({
|
|
779
|
+
id: SCHOLO_GANDLING.encId,
|
|
780
|
+
name: 'Darkmaster Gandling',
|
|
781
|
+
kind: 'boss',
|
|
782
|
+
creatureEntry: ENTRY.gandling,
|
|
783
|
+
bossSpells: [...BOSS_SPELLS.gandling],
|
|
784
|
+
intro:
|
|
785
|
+
'With the six classroom masters slain, Shadow Portal rooms open on Gandling\'s 16s/20–35s schedule - then Darkmaster Gandling himself.',
|
|
786
|
+
events: [
|
|
787
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.maliciaDone },
|
|
788
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.krastinovDone },
|
|
789
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.polkeltDone },
|
|
790
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.ravenianDone },
|
|
791
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.lordAlexeiDone },
|
|
792
|
+
{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.ladyIlluciaDone },
|
|
793
|
+
{
|
|
794
|
+
kind: 'waves',
|
|
795
|
+
waves: SCHOLO_GANDLING_WAVES.map((w) => ({
|
|
796
|
+
pack: w.pack.map((p) => ({ creatureEntry: p.creatureEntry, count: p.count })),
|
|
797
|
+
})),
|
|
798
|
+
},
|
|
799
|
+
],
|
|
800
|
+
});
|
|
801
|
+
|
|
802
|
+
return out;
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
// The entrance room as the SOURCE defines it, box copied literally from scholomance.h:127
|
|
806
|
+
// `aEntranceRoom = { 174.13, 63.84, 104.0, 54, 44 }` — no lower x/y bound there, none here.
|
|
807
|
+
const SCHOLO_ENTRANCE_ROOM = {
|
|
808
|
+
cornerX: 174.13,
|
|
809
|
+
cornerY: 63.84,
|
|
810
|
+
centerZ: 104.0,
|
|
811
|
+
length: 54,
|
|
812
|
+
width: 44,
|
|
813
|
+
entries: [ENTRY.reanimatedCorpse, ENTRY.diseasedGhoul, ENTRY.aberration] as readonly number[],
|
|
814
|
+
// The room's patrolling necrofiend: cpp:117 keeps it out of m_sEntranceRoomGuids and cpp:151-154
|
|
815
|
+
// respawns one regardless, so it is in the room but not the stored set. Taken by guid.
|
|
816
|
+
necrofiend: 2890390,
|
|
817
|
+
} as const;
|
|
818
|
+
|
|
819
|
+
/** probe-pack-zspread.mjs:22 grades a pull as straddling above this many yards of z. */
|
|
820
|
+
const PACK_STRADDLE_YD = 10;
|
|
821
|
+
|
|
822
|
+
// Split entrance-room members off the pulls that straddle a floor to reach them: the clusterer is
|
|
823
|
+
// planar and 31 of 49 packs straddle, worst 43.1 yd. Only real straddlers move; no body is lost.
|
|
824
|
+
function stampEntranceRoomExtract(encs: EncounterDef[]): EncounterDef[] {
|
|
825
|
+
const members = clusterMemberByGuid(289);
|
|
826
|
+
const pools = loadPoolGuidCandidates(289);
|
|
827
|
+
const R = SCHOLO_ENTRANCE_ROOM;
|
|
828
|
+
const roomEntries = new Set(R.entries);
|
|
829
|
+
// A CSE slot carries entry 0 until it rolls. It belongs to the room only when EVERY entry it
|
|
830
|
+
// can roll does — guids 2890215/216/221/222 roll 10481 or 10495, both room entries.
|
|
831
|
+
const isRoomEntry = (guid: number, entry: number): boolean => {
|
|
832
|
+
if (guid === R.necrofiend) return true;
|
|
833
|
+
if (entry !== 0) return roomEntries.has(entry);
|
|
834
|
+
const cands = pools.get(guid) ?? [];
|
|
835
|
+
return cands.length > 0 && cands.every((e) => roomEntries.has(e));
|
|
836
|
+
};
|
|
837
|
+
const inRoom = (guid: number): boolean => {
|
|
838
|
+
const m = members.get(guid);
|
|
839
|
+
return !!m
|
|
840
|
+
&& isRoomEntry(guid, m.entry)
|
|
841
|
+
&& (m.z ?? -Infinity) > R.centerZ
|
|
842
|
+
&& m.x - R.cornerX < R.length
|
|
843
|
+
&& m.y - R.cornerY < R.width;
|
|
844
|
+
};
|
|
845
|
+
const zSpread = (guids: readonly number[]): number => {
|
|
846
|
+
const zs = guids
|
|
847
|
+
.map((g) => members.get(g)?.z)
|
|
848
|
+
.filter((z): z is number => z != null && Number.isFinite(z));
|
|
849
|
+
return zs.length ? Math.max(...zs) - Math.min(...zs) : 0;
|
|
850
|
+
};
|
|
851
|
+
|
|
852
|
+
const out: EncounterDef[] = [];
|
|
853
|
+
let n = 0;
|
|
854
|
+
for (const e of encs) {
|
|
855
|
+
const guids = e.spawnGuids ?? [];
|
|
856
|
+
if (e.kind !== 'trash' || guids.length < 2 || zSpread(guids) <= PACK_STRADDLE_YD) {
|
|
857
|
+
out.push(e);
|
|
858
|
+
continue;
|
|
859
|
+
}
|
|
860
|
+
const room = guids.filter(inRoom);
|
|
861
|
+
const rest = guids.filter((g) => !inRoom(g));
|
|
862
|
+
if (!room.length || !rest.length) {
|
|
863
|
+
out.push(e);
|
|
864
|
+
continue;
|
|
865
|
+
}
|
|
866
|
+
out.push(repackFromGuids(e, room, members, {
|
|
867
|
+
id: `scholo-entrance-room-${n}`,
|
|
868
|
+
name: 'Entrance room',
|
|
869
|
+
pools,
|
|
870
|
+
}));
|
|
871
|
+
n += 1;
|
|
872
|
+
// The remainder keeps the clusterer's pack identity, and its events with it.
|
|
873
|
+
out.push(repackFromGuids(e, rest, members, {
|
|
874
|
+
events: e.events ? [...e.events] : undefined,
|
|
875
|
+
pools,
|
|
876
|
+
}));
|
|
877
|
+
}
|
|
878
|
+
return out;
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
// The two Risen Guards `creature_linking` binds to Lord Alexei Barov with flag 7 — they aggro when
|
|
882
|
+
// he does and he when they do, so they are his encounter, not trash. Cite: 289_scholomance.sql:252.
|
|
883
|
+
const SCHOLO_BAROV_GUARDS = {
|
|
884
|
+
bossId: 'lord-alexei-barov',
|
|
885
|
+
guids: [2890289, 2890290] as readonly number[],
|
|
886
|
+
} as const;
|
|
887
|
+
|
|
888
|
+
// Move Barov's linked guards out of trash and onto his encounter: the clusterer put each in a pull
|
|
889
|
+
// whose origin sits a floor above them. Both pulls drop to a 9.8 yd spread; no body is lost.
|
|
890
|
+
function stampBarovGuards(encs: EncounterDef[]): EncounterDef[] {
|
|
891
|
+
const members = clusterMemberByGuid(289);
|
|
892
|
+
const pools = loadPoolGuidCandidates(289);
|
|
893
|
+
const want = new Set(SCHOLO_BAROV_GUARDS.guids);
|
|
894
|
+
const moved: number[] = [];
|
|
895
|
+
const out: EncounterDef[] = [];
|
|
896
|
+
for (const e of encs) {
|
|
897
|
+
const guids = e.spawnGuids ?? [];
|
|
898
|
+
if (e.kind !== 'trash' || !guids.some((g) => want.has(g))) {
|
|
899
|
+
out.push(e);
|
|
900
|
+
continue;
|
|
901
|
+
}
|
|
902
|
+
moved.push(...guids.filter((g) => want.has(g)));
|
|
903
|
+
const keep = guids.filter((g) => !want.has(g));
|
|
904
|
+
if (keep.length) {
|
|
905
|
+
out.push(repackFromGuids(e, keep, members, {
|
|
906
|
+
events: e.events ? [...e.events] : undefined,
|
|
907
|
+
pools,
|
|
908
|
+
}));
|
|
909
|
+
}
|
|
910
|
+
}
|
|
911
|
+
if (!moved.length) return encs;
|
|
912
|
+
return out.map((e) => {
|
|
913
|
+
if (e.id !== SCHOLO_BAROV_GUARDS.bossId) return e;
|
|
914
|
+
const pack = (e.pack ?? []).map((p) => ({ ...p }));
|
|
915
|
+
for (const g of moved) {
|
|
916
|
+
const entry = members.get(g)?.entry;
|
|
917
|
+
if (!entry) continue;
|
|
918
|
+
const row = pack.find((p) => p.creatureEntry === entry && !p.poolCandidates);
|
|
919
|
+
if (row) row.count += 1;
|
|
920
|
+
else pack.push({ creatureEntry: entry, count: 1 });
|
|
921
|
+
}
|
|
922
|
+
return { ...e, spawnGuids: [...(e.spawnGuids ?? []), ...moved], pack };
|
|
923
|
+
});
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
function buildEncounters(): EncounterDef[] {
|
|
927
|
+
// Hand spine = bosses + event-gated packs (mono trashFromCensus is empty).
|
|
928
|
+
const spine = buildHandSpine();
|
|
929
|
+
const encs = buildClusterEncounters({
|
|
930
|
+
mapId: 289,
|
|
931
|
+
spine,
|
|
932
|
+
entrance: entranceForInstance('scholomance'),
|
|
933
|
+
extraStrip: [
|
|
934
|
+
...SCHOLOMANCE_EXCLUDED_ENTRIES,
|
|
935
|
+
...SCHOLOMANCE_SUMMON_ONLY_ENTRIES,
|
|
936
|
+
ENTRY.student, // event-only via dawn-gambit pack
|
|
937
|
+
],
|
|
938
|
+
});
|
|
939
|
+
return stampBarovGuards(stampEntranceRoomExtract(encs));
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
|
|
943
|
+
// Survey quests completable inside map 289. No Lord Blackwood / Scourge Invasion quests in the survey list.
|
|
944
|
+
export const SCHOLOMANCE_QUESTS = [
|
|
945
|
+
5067, // Leggings of Arcana
|
|
946
|
+
8414, // Dispelling Evil
|
|
947
|
+
5402, // Minion's Scourgestones
|
|
948
|
+
5403, // Invader's Scourgestones
|
|
949
|
+
5404, // Corruptor's Scourgestones
|
|
950
|
+
5406, // Corruptor's Scourgestones
|
|
951
|
+
5407, // Invader's Scourgestones
|
|
952
|
+
5408, // Minion's Scourgestones
|
|
953
|
+
5508, // Corruptor's Scourgestones
|
|
954
|
+
5509, // Invader's Scourgestones
|
|
955
|
+
5510, // Minion's Scourgestones
|
|
956
|
+
5529, // Plagued Hatchlings
|
|
957
|
+
5582, // Healthy Dragon Scale
|
|
958
|
+
4771, // Dawn's Gambit
|
|
959
|
+
5068, // Breastplate of Bloodthirst
|
|
960
|
+
5167, // Legplates of the Chromatic Defier
|
|
961
|
+
5341, // Barov Family Fortune (H)
|
|
962
|
+
5343, // Barov Family Fortune (A)
|
|
963
|
+
5382, // Doctor Theolen Krastinov, the Butcher
|
|
964
|
+
5466, // The Lich, Ras Frostwhisper
|
|
965
|
+
5515, // Krastinov's Bag of Horrors
|
|
966
|
+
7484, // Libram of Focus
|
|
967
|
+
7644, // Blessed Arcanite Barding
|
|
968
|
+
7647, // Judgment and Redemption
|
|
969
|
+
8829, // The Ultimate Deception
|
|
970
|
+
8932, // Just Compensation (A Magister's)
|
|
971
|
+
8936, // Just Compensation (A Dreadmist)
|
|
972
|
+
8939, // Just Compensation (H Magister's)
|
|
973
|
+
8943, // Just Compensation (H Dreadmist)
|
|
974
|
+
8950, // The Instigator's Enchantment
|
|
975
|
+
8956, // Anthion's Parting Words (A Shadowcraft)
|
|
976
|
+
8958, // Anthion's Parting Words (A Dreadmist)
|
|
977
|
+
9020, // Anthion's Parting Words (H Shadowcraft)
|
|
978
|
+
9021, // Anthion's Parting Words (H Dreadmist)
|
|
979
|
+
9319, // A Light in Dark Places (A)
|
|
980
|
+
9386, // A Light in Dark Places (H)
|
|
981
|
+
] as const;
|
|
982
|
+
|
|
983
|
+
/** Export static census constants for tests (entry → count). */
|
|
984
|
+
export const SCHOLOMANCE_STATIC: Readonly<Record<number, number>> = {
|
|
985
|
+
[ENTRY.risenGuard]: STATIC.risenGuard,
|
|
986
|
+
[ENTRY.acolyte]: STATIC.acolyte,
|
|
987
|
+
[ENTRY.necrolyte]: STATIC.necrolyte,
|
|
988
|
+
[ENTRY.neophyte]: STATIC.neophyte,
|
|
989
|
+
[ENTRY.diseasedGhoul]: STATIC.diseasedGhoul,
|
|
990
|
+
[ENTRY.necrofiend]: STATIC.necrofiend,
|
|
991
|
+
[ENTRY.bonewarder]: STATIC.bonewarder,
|
|
992
|
+
[ENTRY.construct]: STATIC.construct,
|
|
993
|
+
[ENTRY.protector]: STATIC.protector,
|
|
994
|
+
[ENTRY.adept]: STATIC.adept,
|
|
995
|
+
[ENTRY.darkSummoner]: STATIC.darkSummoner,
|
|
996
|
+
[ENTRY.necromancer]: STATIC.necromancer,
|
|
997
|
+
[ENTRY.occultist]: STATIC.occultist,
|
|
998
|
+
[ENTRY.researcher]: STATIC.researcher,
|
|
999
|
+
[ENTRY.teacher]: STATIC.teacher,
|
|
1000
|
+
[ENTRY.tutor]: STATIC.tutor,
|
|
1001
|
+
[ENTRY.warrior]: STATIC.warrior,
|
|
1002
|
+
[ENTRY.handler]: STATIC.handler,
|
|
1003
|
+
[ENTRY.splinteredSkeleton]: STATIC.splinteredSkeleton,
|
|
1004
|
+
[ENTRY.bloodSteward]: STATIC.bloodSteward,
|
|
1005
|
+
[ENTRY.hatchling]: STATIC.hatchling,
|
|
1006
|
+
[ENTRY.aberration]: STATIC.aberration,
|
|
1007
|
+
[ENTRY.reanimatedCorpse]: STATIC.reanimatedCorpse,
|
|
1008
|
+
[ENTRY.unstableCorpse]: STATIC.unstableCorpse,
|
|
1009
|
+
};
|
|
1010
|
+
|
|
1011
|
+
export const SCHOLOMANCE: InstanceDef = {
|
|
1012
|
+
id: 'scholomance',
|
|
1013
|
+
mapId: 289,
|
|
1014
|
+
name: 'Scholomance',
|
|
1015
|
+
portalZone: 'westernplaguelands',
|
|
1016
|
+
minLevel: 45, // entrance trigger 2567 requiredLevel
|
|
1017
|
+
levelRange: [57, 61], // survey trash band
|
|
1018
|
+
lockoutMs: 0,
|
|
1019
|
+
description: '',
|
|
1020
|
+
quests: [...SCHOLOMANCE_QUESTS],
|
|
1021
|
+
encounters: buildEncounters(),
|
|
1022
|
+
lootObjects: [
|
|
1023
|
+
// Journal of Jandice Barov — death-spawn via 26096. Residual: no map-289 dungeon GO row.
|
|
1024
|
+
// Cite: 289_scholomance.sql dbscripts_on_creature_death 10503; gameobject-data 180794.
|
|
1025
|
+
{ goEntry: SCHOLO_JANDICE.journalGo, revealedByFlag: SCHOLOMANCE_FLAGS.jandiceDone },
|
|
1026
|
+
],
|
|
1027
|
+
};
|
|
1028
|
+
|
|
1029
|
+
// Counts only pure static trash packs (no bosses, no flag-gated viewing-room packs). Used to assert census
|
|
1030
|
+
// match and summon-only / excluded entry absence.
|
|
1031
|
+
export function scholomancePureStaticTrashCounts(): Map<number, number> {
|
|
1032
|
+
const map = new Map<number, number>();
|
|
1033
|
+
const add = (entry: number, n: number) => map.set(entry, (map.get(entry) ?? 0) + n);
|
|
1034
|
+
for (const enc of SCHOLOMANCE.encounters) {
|
|
1035
|
+
if (enc.kind !== 'trash') continue;
|
|
1036
|
+
const req = (enc.events ?? []).some(
|
|
1037
|
+
(e) => e.kind === 'requiresFlag' || e.kind === 'objectGate' || e.kind === 'waves',
|
|
1038
|
+
);
|
|
1039
|
+
if (req) continue;
|
|
1040
|
+
add(enc.creatureEntry, 1);
|
|
1041
|
+
for (const p of enc.pack ?? []) add(p.creatureEntry, p.count);
|
|
1042
|
+
}
|
|
1043
|
+
return map;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
/** Sum of authored kill counts per creature entry (trash + bosses + wave/threshold packs). */
|
|
1047
|
+
export function scholomanceKillSupply(): Map<number, number> {
|
|
1048
|
+
const map = new Map<number, number>();
|
|
1049
|
+
const add = (entry: number, n: number) => map.set(entry, (map.get(entry) ?? 0) + n);
|
|
1050
|
+
for (const enc of SCHOLOMANCE.encounters) {
|
|
1051
|
+
add(enc.creatureEntry, 1);
|
|
1052
|
+
for (const p of enc.pack ?? []) add(p.creatureEntry, p.count);
|
|
1053
|
+
for (const ev of enc.events ?? []) {
|
|
1054
|
+
if (ev.kind === 'onDeathSummon') add(ev.creatureEntry, 1);
|
|
1055
|
+
if (ev.kind === 'waves') {
|
|
1056
|
+
for (const w of ev.waves) {
|
|
1057
|
+
for (const row of w.pack) add(row.creatureEntry, row.count);
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
if (ev.kind === 'hpThreshold' && ev.spawn) {
|
|
1061
|
+
for (const row of ev.spawn) add(row.creatureEntry, row.count);
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
// Subtract wave rows that re-count the primary (Gandling final wave).
|
|
1066
|
+
for (const enc of SCHOLOMANCE.encounters) {
|
|
1067
|
+
const waves = (enc.events ?? []).find((e) => e.kind === 'waves');
|
|
1068
|
+
if (!waves || waves.kind !== 'waves') continue;
|
|
1069
|
+
for (const w of waves.waves) {
|
|
1070
|
+
for (const row of w.pack) {
|
|
1071
|
+
if (row.creatureEntry === enc.creatureEntry) add(row.creatureEntry, -row.count);
|
|
1072
|
+
}
|
|
1073
|
+
}
|
|
1074
|
+
}
|
|
1075
|
+
return map;
|
|
1076
|
+
}
|