azeroth-shell 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -2
- package/bin/azsh.mjs +19 -0
- package/docs/aifid/eventai-texts.json +4414 -0
- package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
- package/docs/dungeons/survey/pack-id-migration.json +2418 -0
- package/package.json +26 -4
- package/src/autopilot/bossSkip.ts +26 -0
- package/src/autopilot/combatRotation.ts +824 -0
- package/src/autopilot/config.ts +533 -0
- package/src/autopilot/consumables.ts +58 -0
- package/src/autopilot/encounterStand.ts +121 -0
- package/src/autopilot/objectGatePlan.ts +53 -0
- package/src/autopilot/pathEngage.ts +229 -0
- package/src/autopilot/plan.ts +1643 -0
- package/src/autopilot/questPolicy.ts +274 -0
- package/src/autopilot/routeStep.ts +69 -0
- package/src/autopilot/sessionReport.ts +88 -0
- package/src/autopilot/topOffPower.ts +26 -0
- package/src/autopilot/view.ts +476 -0
- package/src/cli/bootCheck.mjs +34 -0
- package/src/cli/bootData.mjs +57 -0
- package/src/cli/combatLogFilter.ts +153 -0
- package/src/cli/combatLogFormat.ts +613 -0
- package/src/cli/fileRepository.mjs +105 -0
- package/src/cli/gzLoader.mjs +31 -0
- package/src/cli/liveGauntletEscort.ts +978 -0
- package/src/cli/liveStratUndead.ts +305 -0
- package/src/cli/macroHostCombat.ts +545 -0
- package/src/cli/macroHostWorld.ts +330 -0
- package/src/cli/prefs.mjs +31 -0
- package/src/cli/register.mjs +4 -0
- package/src/cli/repl.mjs +693 -0
- package/src/cli/rotationText.mjs +226 -0
- package/src/cli/squad.mjs +105 -0
- package/src/cli/term.mjs +126 -0
- package/src/cli/text.mjs +122 -0
- package/src/cli/tui.mjs +626 -0
- package/src/cli/tuiArena.mjs +109 -0
- package/src/cli/tuiAutopilotSettings.mjs +93 -0
- package/src/cli/tuiBags.mjs +180 -0
- package/src/cli/tuiBars.mjs +133 -0
- package/src/cli/tuiBg.mjs +243 -0
- package/src/cli/tuiBulk.mjs +162 -0
- package/src/cli/tuiCheck.mjs +1882 -0
- package/src/cli/tuiCity.mjs +396 -0
- package/src/cli/tuiCompanionKit.mjs +300 -0
- package/src/cli/tuiCompanions.mjs +471 -0
- package/src/cli/tuiDev.mjs +62 -0
- package/src/cli/tuiDungeon.mjs +606 -0
- package/src/cli/tuiEnchantTarget.mjs +120 -0
- package/src/cli/tuiFight.mjs +577 -0
- package/src/cli/tuiFightPanes.mjs +228 -0
- package/src/cli/tuiFloor.mjs +506 -0
- package/src/cli/tuiGear.mjs +158 -0
- package/src/cli/tuiHonor.mjs +74 -0
- package/src/cli/tuiLoot.mjs +97 -0
- package/src/cli/tuiMacros.mjs +144 -0
- package/src/cli/tuiOutfitter.mjs +115 -0
- package/src/cli/tuiPet.mjs +116 -0
- package/src/cli/tuiProfessions.mjs +800 -0
- package/src/cli/tuiRaid.mjs +127 -0
- package/src/cli/tuiRep.mjs +65 -0
- package/src/cli/tuiSaves.mjs +69 -0
- package/src/cli/tuiSearch.mjs +363 -0
- package/src/cli/tuiSettings.mjs +151 -0
- package/src/cli/tuiSimLab.mjs +80 -0
- package/src/cli/tuiTalents.mjs +60 -0
- package/src/cli/tuiViews.mjs +1178 -0
- package/src/cli/tuiWiki.mjs +181 -0
- package/src/cli/tuiWorld.mjs +361 -0
- package/src/cli/wikiIndex.ts +259 -0
- package/src/cli/wikiSources.ts +355 -0
- package/src/data/alteracValley.ts +176 -0
- package/src/data/appearanceOptions.ts +534 -0
- package/src/data/applyLootChanceSanity.ts +21 -0
- package/src/data/createFlavor.ts +96 -0
- package/src/data/customItems.ts +33 -0
- package/src/data/dataStore.ts +1904 -0
- package/src/data/dungeonGameObjects.ts +84 -0
- package/src/data/dungeonPlateCover.ts +66 -0
- package/src/data/dungeonSpawns.ts +294 -0
- package/src/data/dungeons/alterac-valley.ts +135 -0
- package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
- package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
- package/src/data/dungeons/apply-instance-geometry.ts +65 -0
- package/src/data/dungeons/apply-spawn-placement.ts +171 -0
- package/src/data/dungeons/blackfathom-deeps.ts +539 -0
- package/src/data/dungeons/blackrock-depths.ts +1410 -0
- package/src/data/dungeons/blackwing-lair.ts +129 -0
- package/src/data/dungeons/boss-eventai.ts +8 -0
- package/src/data/dungeons/deadmines.ts +410 -0
- package/src/data/dungeons/dire-maul-east.ts +980 -0
- package/src/data/dungeons/dire-maul-north.ts +661 -0
- package/src/data/dungeons/dire-maul-west.ts +785 -0
- package/src/data/dungeons/dungeon-rooms.json +5479 -0
- package/src/data/dungeons/encounter-outdoors.json +359 -0
- package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
- package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
- package/src/data/dungeons/eventai/deadmines.ts +264 -0
- package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
- package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
- package/src/data/dungeons/eventai/helpers.ts +79 -0
- package/src/data/dungeons/eventai/index.ts +133 -0
- package/src/data/dungeons/eventai/lbrs.ts +372 -0
- package/src/data/dungeons/eventai/maraudon.ts +323 -0
- package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
- package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
- package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
- package/src/data/dungeons/eventai/scholomance.ts +680 -0
- package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
- package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
- package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
- package/src/data/dungeons/eventai/sm-library.ts +55 -0
- package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
- package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
- package/src/data/dungeons/eventai/the-stockade.ts +228 -0
- package/src/data/dungeons/eventai/ubrs.ts +225 -0
- package/src/data/dungeons/eventai/uldaman.ts +355 -0
- package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
- package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
- package/src/data/dungeons/gnomeregan.ts +909 -0
- package/src/data/dungeons/index.ts +126 -0
- package/src/data/dungeons/instance-geometry.json +5233 -0
- package/src/data/dungeons/key-sources.json +169 -0
- package/src/data/dungeons/lbrs.ts +996 -0
- package/src/data/dungeons/maraudon.ts +786 -0
- package/src/data/dungeons/molten-core.ts +194 -0
- package/src/data/dungeons/naxxramas.ts +173 -0
- package/src/data/dungeons/onyxias-lair.ts +71 -0
- package/src/data/dungeons/pack-from-clusters.ts +1256 -0
- package/src/data/dungeons/ragefire-chasm.ts +238 -0
- package/src/data/dungeons/razorfen-downs.ts +698 -0
- package/src/data/dungeons/razorfen-kraul.ts +766 -0
- package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
- package/src/data/dungeons/scholomance.ts +1076 -0
- package/src/data/dungeons/shadowfang-keep.ts +740 -0
- package/src/data/dungeons/sm-armory.ts +266 -0
- package/src/data/dungeons/sm-cathedral.ts +430 -0
- package/src/data/dungeons/sm-graveyard.ts +482 -0
- package/src/data/dungeons/sm-library.ts +337 -0
- package/src/data/dungeons/stratholme-live.ts +808 -0
- package/src/data/dungeons/stratholme-undead.ts +1164 -0
- package/src/data/dungeons/sunken-temple.ts +931 -0
- package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
- package/src/data/dungeons/the-stockade.ts +282 -0
- package/src/data/dungeons/ubrs.ts +1286 -0
- package/src/data/dungeons/uldaman.ts +685 -0
- package/src/data/dungeons/wailing-caverns.ts +356 -0
- package/src/data/dungeons/zul-farrak.ts +686 -0
- package/src/data/dungeons/zul-gurub.ts +142 -0
- package/src/data/dungeons.ts +42 -0
- package/src/data/fixtures.ts +446 -0
- package/src/data/gameobject-data.json.gz +0 -0
- package/src/data/item-data.json.gz +0 -0
- package/src/data/loot-data.json.gz +0 -0
- package/src/data/maps/atlas-approach-maps.json +1425 -0
- package/src/data/maps/atlas-landmarks.json +1711 -0
- package/src/data/maps/dungeon-viewports.json +392 -0
- package/src/data/materializeModDamagePercentTaken.ts +70 -0
- package/src/data/materializeModHealthRegen.ts +89 -0
- package/src/data/materializeSpellReputation.ts +26 -0
- package/src/data/pageTexts.ts +19 -0
- package/src/data/profession-data.json.gz +0 -0
- package/src/data/raid-plans/blackfathom-deeps.json +86 -0
- package/src/data/raid-plans/blackrock-depths.json +419 -0
- package/src/data/raid-plans/blackwing-lair.json +328 -0
- package/src/data/raid-plans/deadmines.json +55 -0
- package/src/data/raid-plans/dire-maul-east.json +94 -0
- package/src/data/raid-plans/dire-maul-north.json +70 -0
- package/src/data/raid-plans/dire-maul-west.json +75 -0
- package/src/data/raid-plans/gnomeregan.json +131 -0
- package/src/data/raid-plans/lbrs.json +176 -0
- package/src/data/raid-plans/maraudon.json +102 -0
- package/src/data/raid-plans/molten-core.json +169 -0
- package/src/data/raid-plans/naxxramas.json +354 -0
- package/src/data/raid-plans/onyxias-lair.json +18 -0
- package/src/data/raid-plans/ragefire-chasm.json +30 -0
- package/src/data/raid-plans/razorfen-downs.json +75 -0
- package/src/data/raid-plans/razorfen-kraul.json +53 -0
- package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
- package/src/data/raid-plans/scholomance.json +170 -0
- package/src/data/raid-plans/shadowfang-keep.json +87 -0
- package/src/data/raid-plans/sm-armory.json +53 -0
- package/src/data/raid-plans/sm-cathedral.json +72 -0
- package/src/data/raid-plans/sm-graveyard.json +63 -0
- package/src/data/raid-plans/sm-library.json +23 -0
- package/src/data/raid-plans/stratholme-live.json +129 -0
- package/src/data/raid-plans/stratholme-undead.json +73 -0
- package/src/data/raid-plans/sunken-temple.json +159 -0
- package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
- package/src/data/raid-plans/the-stockade.json +42 -0
- package/src/data/raid-plans/ubrs.json +53 -0
- package/src/data/raid-plans/uldaman.json +131 -0
- package/src/data/raid-plans/wailing-caverns.json +90 -0
- package/src/data/raid-plans/zul-farrak.json +156 -0
- package/src/data/raid-plans/zul-gurub.json +307 -0
- package/src/data/raidInstanceCreatures.mjs +473 -0
- package/src/data/rotations/index.ts +152 -0
- package/src/data/rotations/layout.mjs +72 -0
- package/src/data/rotations/pve/druid/balance.json +754 -0
- package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
- package/src/data/rotations/pve/druid/feral.json +2660 -0
- package/src/data/rotations/pve/druid/restoration.json +424 -0
- package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
- package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
- package/src/data/rotations/pve/hunter/survival.json +1373 -0
- package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
- package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
- package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
- package/src/data/rotations/pve/paladin/holy.json +755 -0
- package/src/data/rotations/pve/paladin/protection.json +962 -0
- package/src/data/rotations/pve/paladin/retribution.json +924 -0
- package/src/data/rotations/pve/priest/discipline.json +772 -0
- package/src/data/rotations/pve/priest/holy.json +707 -0
- package/src/data/rotations/pve/priest/shadow.json +787 -0
- package/src/data/rotations/pve/rogue/assassination.json +2477 -0
- package/src/data/rotations/pve/rogue/combat.json +2483 -0
- package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
- package/src/data/rotations/pve/shaman/elemental.json +1157 -0
- package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
- package/src/data/rotations/pve/shaman/restoration.json +592 -0
- package/src/data/rotations/pve/warlock/affliction.json +1185 -0
- package/src/data/rotations/pve/warlock/demonology.json +1165 -0
- package/src/data/rotations/pve/warlock/destruction.json +1177 -0
- package/src/data/rotations/pve/warrior/arms.json +3020 -0
- package/src/data/rotations/pve/warrior/fury.json +2996 -0
- package/src/data/rotations/pve/warrior/protection.json +2509 -0
- package/src/data/rotations/pvp/druid/balance.json +593 -0
- package/src/data/rotations/pvp/druid/feral.json +3276 -0
- package/src/data/rotations/pvp/druid/restoration.json +662 -0
- package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
- package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
- package/src/data/rotations/pvp/hunter/survival.json +635 -0
- package/src/data/rotations/pvp/mage/arcane.json +574 -0
- package/src/data/rotations/pvp/mage/fire.json +570 -0
- package/src/data/rotations/pvp/mage/frost.json +4048 -0
- package/src/data/rotations/pvp/paladin/holy.json +1498 -0
- package/src/data/rotations/pvp/paladin/protection.json +567 -0
- package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
- package/src/data/rotations/pvp/priest/discipline.json +1848 -0
- package/src/data/rotations/pvp/priest/holy.json +6340 -0
- package/src/data/rotations/pvp/priest/shadow.json +2329 -0
- package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
- package/src/data/rotations/pvp/rogue/combat.json +5258 -0
- package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
- package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
- package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
- package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
- package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
- package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
- package/src/data/rotations/pvp/warlock/destruction.json +638 -0
- package/src/data/rotations/pvp/warrior/arms.json +5665 -0
- package/src/data/rotations/pvp/warrior/fury.json +850 -0
- package/src/data/rotations/pvp/warrior/protection.json +777 -0
- package/src/data/schema/bundle.ts +511 -0
- package/src/data/schema/constants.ts +49 -0
- package/src/data/schema/creature.ts +454 -0
- package/src/data/schema/encounter.ts +155 -0
- package/src/data/schema/faction.ts +48 -0
- package/src/data/schema/item.ts +297 -0
- package/src/data/schema/itemEnchant.ts +105 -0
- package/src/data/schema/npc.ts +44 -0
- package/src/data/schema/primitives.ts +295 -0
- package/src/data/schema/profession.ts +226 -0
- package/src/data/schema/quest.ts +154 -0
- package/src/data/schema/spell.ts +1149 -0
- package/src/data/schema/talent.ts +74 -0
- package/src/data/schema/world.ts +124 -0
- package/src/data/schema.ts +19 -0
- package/src/data/skinNodeGapFill.ts +68 -0
- package/src/data/spell-data.json.gz +0 -0
- package/src/data/spell-script-targets.json +1 -0
- package/src/data/tables/ahItemValues.json.gz +0 -0
- package/src/data/tables/alteracValley.json.gz +0 -0
- package/src/data/tables/areatriggerTeleports.json.gz +0 -0
- package/src/data/tables/botNames.json.gz +0 -0
- package/src/data/tables/botPopulation.json.gz +0 -0
- package/src/data/tables/botSpecs.json.gz +0 -0
- package/src/data/tables/classLevelStats.json.gz +0 -0
- package/src/data/tables/combatConditions.json.gz +0 -0
- package/src/data/tables/combatSkillMeta.json.gz +0 -0
- package/src/data/tables/conditions.json.gz +0 -0
- package/src/data/tables/createInfo.json.gz +0 -0
- package/src/data/tables/creatureAggroGroups.json.gz +0 -0
- package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
- package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
- package/src/data/tables/creatureWeapons.json.gz +0 -0
- package/src/data/tables/creatures.json.gz +0 -0
- package/src/data/tables/dbScripts.json.gz +0 -0
- package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
- package/src/data/tables/dungeonCensus.json.gz +0 -0
- package/src/data/tables/dungeonGameObjects.json.gz +0 -0
- package/src/data/tables/dungeonPacks.json.gz +0 -0
- package/src/data/tables/dungeonPlateCover.json.gz +0 -0
- package/src/data/tables/dungeonSpawns.json.gz +0 -0
- package/src/data/tables/dungeonSurvey.json.gz +0 -0
- package/src/data/tables/durabilityCosts.json.gz +0 -0
- package/src/data/tables/durabilityQuality.json.gz +0 -0
- package/src/data/tables/enchantApplicators.json.gz +0 -0
- package/src/data/tables/entranceYards.json.gz +0 -0
- package/src/data/tables/explorationBasexp.json.gz +0 -0
- package/src/data/tables/factionTemplates.json.gz +0 -0
- package/src/data/tables/factions.json.gz +0 -0
- package/src/data/tables/gameEvents.json.gz +0 -0
- package/src/data/tables/gameObjects.json.gz +0 -0
- package/src/data/tables/gossipMenus.json.gz +0 -0
- package/src/data/tables/graveyards.json.gz +0 -0
- package/src/data/tables/instanceMaps.json.gz +0 -0
- package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
- package/src/data/tables/itemEnchants.json.gz +0 -0
- package/src/data/tables/itemRandomProperties.json.gz +0 -0
- package/src/data/tables/itemSets.json.gz +0 -0
- package/src/data/tables/items.json.gz +0 -0
- package/src/data/tables/levelStats.json.gz +0 -0
- package/src/data/tables/locks.json.gz +0 -0
- package/src/data/tables/map-pin-overrides.json.gz +0 -0
- package/src/data/tables/nonCombatTrash.json.gz +0 -0
- package/src/data/tables/npcTexts.json.gz +0 -0
- package/src/data/tables/pageTexts.json.gz +0 -0
- package/src/data/tables/petAbilityTP.json.gz +0 -0
- package/src/data/tables/petGenericSpells.json.gz +0 -0
- package/src/data/tables/petLevelStats.json.gz +0 -0
- package/src/data/tables/playerbot-weightscales.json.gz +0 -0
- package/src/data/tables/pools.json.gz +0 -0
- package/src/data/tables/quests.json.gz +0 -0
- package/src/data/tables/races.json.gz +0 -0
- package/src/data/tables/reputationRanks.json.gz +0 -0
- package/src/data/tables/reputationRates.json.gz +0 -0
- package/src/data/tables/reputationSpillover.json.gz +0 -0
- package/src/data/tables/ridingSpells.json.gz +0 -0
- package/src/data/tables/scriptTexts.json.gz +0 -0
- package/src/data/tables/soundClipVolume.json.gz +0 -0
- package/src/data/tables/spellChain.json.gz +0 -0
- package/src/data/tables/spellTeleports.json.gz +0 -0
- package/src/data/tables/spells.json.gz +0 -0
- package/src/data/tables/talents.json.gz +0 -0
- package/src/data/tables/tavernTriggers.json.gz +0 -0
- package/src/data/tables/taxiNodes.json.gz +0 -0
- package/src/data/tables/taxiRoutes.json.gz +0 -0
- package/src/data/tables/trainers.json.gz +0 -0
- package/src/data/tables/transports.json.gz +0 -0
- package/src/data/tables/travelAnchors.json.gz +0 -0
- package/src/data/tables/travelEdges.json.gz +0 -0
- package/src/data/tables/unitConditions.json.gz +0 -0
- package/src/data/tables/vendors.json.gz +0 -0
- package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
- package/src/data/tables/xp.json.gz +0 -0
- package/src/data/tables/zoneWeather.json.gz +0 -0
- package/src/data/tables/zones.json.gz +0 -0
- package/src/data/world-data.ts +56 -0
- package/src/data/zone-music-sets.json +2751 -0
- package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
- package/src/domain/audioQuality.mjs +145 -0
- package/src/domain/bg/ab.ts +433 -0
- package/src/domain/bg/arenaComps.ts +644 -0
- package/src/domain/bg/arenaLab.ts +695 -0
- package/src/domain/bg/arenaPace.ts +31 -0
- package/src/domain/bg/arenaRating.ts +110 -0
- package/src/domain/bg/av.ts +758 -0
- package/src/domain/bg/avEnemyPush.ts +219 -0
- package/src/domain/bg/avField.ts +283 -0
- package/src/domain/bg/avInstanceNodes.ts +197 -0
- package/src/domain/bg/avInstanceScore.ts +123 -0
- package/src/domain/bg/avQuestItems.ts +55 -0
- package/src/domain/bg/avQuests.ts +210 -0
- package/src/domain/bg/avSession.ts +196 -0
- package/src/domain/bg/bgConsumes.ts +269 -0
- package/src/domain/bg/bgPrebuff.ts +153 -0
- package/src/domain/bg/bgRest.ts +91 -0
- package/src/domain/bg/bgRoster.ts +305 -0
- package/src/domain/bg/bgTier.ts +61 -0
- package/src/domain/bg/bgWorld.ts +862 -0
- package/src/domain/bg/match.ts +215 -0
- package/src/domain/bg/strategies.ts +552 -0
- package/src/domain/bg/types.ts +291 -0
- package/src/domain/bg/wsg.ts +264 -0
- package/src/domain/bots/actionProviderSpec.ts +38 -0
- package/src/domain/bots/autoConsumables.ts +285 -0
- package/src/domain/bots/betweenPullRest.ts +239 -0
- package/src/domain/bots/botGear.ts +248 -0
- package/src/domain/bots/botInventory.ts +486 -0
- package/src/domain/bots/botPet.ts +535 -0
- package/src/domain/bots/botPool.ts +291 -0
- package/src/domain/bots/botProfessions.ts +334 -0
- package/src/domain/bots/companionActionBar.ts +209 -0
- package/src/domain/bots/companionHireCost.ts +236 -0
- package/src/domain/bots/companionMissions.ts +582 -0
- package/src/domain/bots/companionPrep.ts +254 -0
- package/src/domain/bots/companionQuests.ts +270 -0
- package/src/domain/bots/companionRep.ts +75 -0
- package/src/domain/bots/companionRotation.ts +708 -0
- package/src/domain/bots/companionXp.ts +66 -0
- package/src/domain/bots/consumableShare.ts +811 -0
- package/src/domain/bots/dpsMate.ts +1072 -0
- package/src/domain/bots/groupCompReport.ts +132 -0
- package/src/domain/bots/healthstoneSupply.ts +198 -0
- package/src/domain/bots/outfitter.ts +1056 -0
- package/src/domain/bots/paladinPrePull.ts +231 -0
- package/src/domain/bots/partyRole.ts +40 -0
- package/src/domain/bots/playerbotEquipCache.ts +412 -0
- package/src/domain/bots/playerbotItemEligibility.ts +60 -0
- package/src/domain/bots/playerbotStatWeight.ts +853 -0
- package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
- package/src/domain/bots/prePullBuffs.ts +219 -0
- package/src/domain/bots/prePullStealth.ts +82 -0
- package/src/domain/bots/runSupply.ts +251 -0
- package/src/domain/bots/runSupplyPrefs.ts +28 -0
- package/src/domain/bots/sendTradeGoods.ts +394 -0
- package/src/domain/bots/soulShardCap.ts +35 -0
- package/src/domain/bots/squad.ts +842 -0
- package/src/domain/bots/squadRun.ts +81 -0
- package/src/domain/character/actionbar.ts +346 -0
- package/src/domain/character/appearance.ts +165 -0
- package/src/domain/character/buildCombatant.ts +1726 -0
- package/src/domain/character/character.ts +356 -0
- package/src/domain/character/characterName.ts +43 -0
- package/src/domain/character/characterRatings.ts +424 -0
- package/src/domain/character/characterSpells.ts +282 -0
- package/src/domain/character/characterStats.ts +1559 -0
- package/src/domain/character/characterTalents.ts +398 -0
- package/src/domain/character/combatSkills.ts +994 -0
- package/src/domain/character/displayForm.ts +72 -0
- package/src/domain/character/formTalentAuras.ts +171 -0
- package/src/domain/character/forms.ts +499 -0
- package/src/domain/character/races.ts +40 -0
- package/src/domain/character/resurrectionSickness.ts +49 -0
- package/src/domain/character/spellbook.ts +169 -0
- package/src/domain/character/stanceBar.ts +354 -0
- package/src/domain/character/stancePrereq.ts +70 -0
- package/src/domain/character/talentBuilds.ts +63 -0
- package/src/domain/character/talentImport.ts +130 -0
- package/src/domain/character/talentLink.ts +123 -0
- package/src/domain/character/talents.ts +201 -0
- package/src/domain/core/conditionSnapshot.ts +92 -0
- package/src/domain/core/hover.ts +14 -0
- package/src/domain/core/ids.ts +58 -0
- package/src/domain/core/internalNameTags.ts +5 -0
- package/src/domain/core/runtimeDataPatches.ts +357 -0
- package/src/domain/creature/aiTargeting.ts +588 -0
- package/src/domain/creature/combatCondition.ts +157 -0
- package/src/domain/creature/creatureAggro.ts +804 -0
- package/src/domain/creature/creatureAi.ts +206 -0
- package/src/domain/creature/creatureAiConstants.ts +661 -0
- package/src/domain/creature/creatureCastList.ts +1007 -0
- package/src/domain/creature/creatureEventAi.ts +1409 -0
- package/src/domain/creature/creatureGroups.ts +144 -0
- package/src/domain/creature/creatureLinking.ts +333 -0
- package/src/domain/creature/creatureScaling.ts +320 -0
- package/src/domain/creature/creatureTrigger.ts +53 -0
- package/src/domain/creature/creatureWander.ts +74 -0
- package/src/domain/creature/eventAiTexts.ts +145 -0
- package/src/domain/creature/faction.ts +287 -0
- package/src/domain/creature/forcedReaction.ts +48 -0
- package/src/domain/creature/outdoorHuntable.ts +74 -0
- package/src/domain/creature/patrolPacks.ts +210 -0
- package/src/domain/creature/reputation.ts +967 -0
- package/src/domain/creature/unitFlags.ts +74 -0
- package/src/domain/creature/worldBosses.ts +393 -0
- package/src/domain/dungeonMusic.mjs +48 -0
- package/src/domain/economy/auction.ts +282 -0
- package/src/domain/economy/auctionBot.ts +1060 -0
- package/src/domain/economy/honorPrice.ts +100 -0
- package/src/domain/economy/mail.ts +958 -0
- package/src/domain/economy/money.ts +42 -0
- package/src/domain/economy/syntheticClassTrainers.ts +62 -0
- package/src/domain/economy/trading.ts +296 -0
- package/src/domain/economy/vendorSellAll.ts +252 -0
- package/src/domain/economy/vendorStock.ts +146 -0
- package/src/domain/items/ammo.ts +817 -0
- package/src/domain/items/bank.ts +162 -0
- package/src/domain/items/consumableFamily.ts +205 -0
- package/src/domain/items/craftUpgrades.ts +83 -0
- package/src/domain/items/createItem.ts +93 -0
- package/src/domain/items/durability.ts +581 -0
- package/src/domain/items/equipment.ts +441 -0
- package/src/domain/items/equipmentHelper.ts +767 -0
- package/src/domain/items/inventory.ts +561 -0
- package/src/domain/items/itemBonding.ts +93 -0
- package/src/domain/items/itemContainer.ts +245 -0
- package/src/domain/items/itemDisplayName.ts +33 -0
- package/src/domain/items/itemInstance.ts +181 -0
- package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
- package/src/domain/items/itemRandomProps.ts +77 -0
- package/src/domain/items/itemRestrictions.ts +329 -0
- package/src/domain/items/itemTeaches.ts +82 -0
- package/src/domain/items/itemUseCooldown.ts +52 -0
- package/src/domain/items/itemUseTarget.ts +90 -0
- package/src/domain/items/junkCategories.ts +174 -0
- package/src/domain/items/junkFilter.ts +368 -0
- package/src/domain/items/keyring.ts +131 -0
- package/src/domain/items/loot.ts +221 -0
- package/src/domain/items/mounts.ts +190 -0
- package/src/domain/items/onUsePayload.ts +102 -0
- package/src/domain/items/pendingLoot.ts +107 -0
- package/src/domain/items/relic.ts +105 -0
- package/src/domain/items/rocketBoots.ts +36 -0
- package/src/domain/items/sortContainer.ts +139 -0
- package/src/domain/items/spareContainers.ts +71 -0
- package/src/domain/items/spellReagentIndex.ts +131 -0
- package/src/domain/items/staleConsumables.ts +66 -0
- package/src/domain/items/weaponSpender.ts +110 -0
- package/src/domain/listDungeonIds.mjs +28 -0
- package/src/domain/macro/compose.ts +239 -0
- package/src/domain/macro/conditions.ts +260 -0
- package/src/domain/macro/creatureTypes.ts +40 -0
- package/src/domain/macro/describe.ts +169 -0
- package/src/domain/macro/icon.ts +60 -0
- package/src/domain/macro/index.ts +20 -0
- package/src/domain/macro/normalize.ts +112 -0
- package/src/domain/macro/parse.ts +316 -0
- package/src/domain/macro/plan.ts +288 -0
- package/src/domain/macro/rotation.ts +590 -0
- package/src/domain/macro/rotationEnv.ts +173 -0
- package/src/domain/macro/slots.ts +101 -0
- package/src/domain/macro/snapshot.ts +114 -0
- package/src/domain/macro/templates.ts +446 -0
- package/src/domain/macro/types.ts +70 -0
- package/src/domain/macro/units.ts +93 -0
- package/src/domain/macro/weaponTypes.ts +83 -0
- package/src/domain/nav/cityTeleports.ts +10 -0
- package/src/domain/nav/mounting.ts +113 -0
- package/src/domain/nav/nav.ts +43 -0
- package/src/domain/nav/navCollision.ts +606 -0
- package/src/domain/nav/navOutdoors.ts +91 -0
- package/src/domain/nav/navRegistry.ts +179 -0
- package/src/domain/nav/navRoomGraph.ts +302 -0
- package/src/domain/nav/navTypes.ts +43 -0
- package/src/domain/nav/navmesh.ts +1715 -0
- package/src/domain/nav/speed.ts +200 -0
- package/src/domain/nav/storey.ts +10 -0
- package/src/domain/nav/travel.ts +725 -0
- package/src/domain/nav/travelTypes.ts +75 -0
- package/src/domain/pet/pet.ts +1150 -0
- package/src/domain/pet/petActionBar.ts +180 -0
- package/src/domain/pet/petSpellbook.ts +39 -0
- package/src/domain/pet/petStable.ts +81 -0
- package/src/domain/professions/autoDisenchant.ts +236 -0
- package/src/domain/professions/characterEnchants.ts +176 -0
- package/src/domain/professions/craftCooldown.ts +52 -0
- package/src/domain/professions/enchantApply.ts +62 -0
- package/src/domain/professions/enchantTargets.ts +114 -0
- package/src/domain/professions/enchanting.ts +236 -0
- package/src/domain/professions/gatherFilter.ts +149 -0
- package/src/domain/professions/gearEnchant.ts +137 -0
- package/src/domain/professions/heldTools.ts +29 -0
- package/src/domain/professions/learnAllRecipes.ts +146 -0
- package/src/domain/professions/miningHarvest.ts +69 -0
- package/src/domain/professions/partyDisenchant.ts +294 -0
- package/src/domain/professions/partyWork.ts +83 -0
- package/src/domain/professions/pickpocket.ts +172 -0
- package/src/domain/professions/poisons.ts +240 -0
- package/src/domain/professions/professions.ts +677 -0
- package/src/domain/professions/rareNodes.ts +45 -0
- package/src/domain/professions/skinLoot.ts +27 -0
- package/src/domain/professions/vendorReagents.ts +152 -0
- package/src/domain/professions/weaponImbueHand.ts +171 -0
- package/src/domain/questFarmFilter.mjs +42 -0
- package/src/domain/quests/doQuest.ts +1204 -0
- package/src/domain/quests/gossip.ts +308 -0
- package/src/domain/quests/gossipTalk.ts +298 -0
- package/src/domain/quests/interpreter/canComplete.ts +150 -0
- package/src/domain/quests/interpreter/claim.ts +137 -0
- package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
- package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
- package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
- package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
- package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
- package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
- package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
- package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
- package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
- package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
- package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
- package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
- package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
- package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
- package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
- package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
- package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
- package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
- package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
- package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
- package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
- package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
- package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
- package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
- package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
- package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
- package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
- package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
- package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
- package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
- package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
- package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
- package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
- package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
- package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
- package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
- package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
- package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
- package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
- package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
- package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
- package/src/domain/quests/interpreter/diff.ts +349 -0
- package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
- package/src/domain/quests/interpreter/flags.ts +101 -0
- package/src/domain/quests/interpreter/index.ts +113 -0
- package/src/domain/quests/interpreter/live.ts +178 -0
- package/src/domain/quests/interpreter/types.ts +81 -0
- package/src/domain/quests/interpreter/updaters.ts +412 -0
- package/src/domain/quests/questCorpseUse.ts +155 -0
- package/src/domain/quests/questDialog.ts +43 -0
- package/src/domain/quests/questFight.ts +34 -0
- package/src/domain/quests/questObjectiveLabel.ts +39 -0
- package/src/domain/quests/questRewardChoice.ts +85 -0
- package/src/domain/quests/questScriptCredit.ts +26 -0
- package/src/domain/quests/questScriptItemUse.ts +74 -0
- package/src/domain/quests/questTameRods.ts +79 -0
- package/src/domain/quests/questlog.ts +1545 -0
- package/src/domain/quests/talkDeliver.ts +170 -0
- package/src/domain/raid/globalActionBar.ts +195 -0
- package/src/domain/raid/instanceRoster.ts +194 -0
- package/src/domain/raid/partySummon.ts +198 -0
- package/src/domain/raid/partyVault.ts +320 -0
- package/src/domain/raid/raidBossAbilities.ts +268 -0
- package/src/domain/raid/raidComp.ts +335 -0
- package/src/domain/raid/raidCustomRows.ts +453 -0
- package/src/domain/raid/raidEncounterGear.ts +298 -0
- package/src/domain/raid/raidEncounterTactics.ts +412 -0
- package/src/domain/raid/raidPlan.ts +509 -0
- package/src/domain/raid/raidPlanEdits.ts +98 -0
- package/src/domain/raid/raidPlanPacks.ts +480 -0
- package/src/domain/raid/raidRecovery.ts +183 -0
- package/src/domain/raid/raidRosterTemplate.ts +138 -0
- package/src/domain/rotation/auraSide.ts +68 -0
- package/src/domain/rotation/build.ts +3031 -0
- package/src/domain/rotation/classes/druid.ts +58 -0
- package/src/domain/rotation/classes/hooks.ts +59 -0
- package/src/domain/rotation/classes/hunter.ts +156 -0
- package/src/domain/rotation/classes/index.ts +104 -0
- package/src/domain/rotation/classes/mage.ts +99 -0
- package/src/domain/rotation/classes/paladin.ts +296 -0
- package/src/domain/rotation/classes/priest.ts +94 -0
- package/src/domain/rotation/classes/pullOpener.ts +92 -0
- package/src/domain/rotation/classes/rogue.ts +69 -0
- package/src/domain/rotation/classes/shaman.ts +29 -0
- package/src/domain/rotation/classes/supportSpec.ts +94 -0
- package/src/domain/rotation/classes/warlock.ts +81 -0
- package/src/domain/rotation/classes/warrior.ts +402 -0
- package/src/domain/rotation/classify.ts +1381 -0
- package/src/domain/rotation/condMetricPicker.ts +379 -0
- package/src/domain/rotation/consumables.ts +242 -0
- package/src/domain/rotation/evaluate.ts +1115 -0
- package/src/domain/rotation/finisherLadder.ts +145 -0
- package/src/domain/rotation/invent.ts +938 -0
- package/src/domain/rotation/killOrder.ts +30 -0
- package/src/domain/rotation/openerForm.ts +22 -0
- package/src/domain/rotation/paladinBuffs.ts +568 -0
- package/src/domain/rotation/prebuff.ts +283 -0
- package/src/domain/rotation/raidRowTuning.ts +34 -0
- package/src/domain/rotation/rotation.ts +11 -0
- package/src/domain/rotation/rotationProfiles.ts +180 -0
- package/src/domain/rotation/rotationSuggestions.ts +851 -0
- package/src/domain/rotation/ruleAfterChain.ts +49 -0
- package/src/domain/rotation/spec.ts +70 -0
- package/src/domain/rotation/spellPicker.ts +140 -0
- package/src/domain/rotation/stand.ts +143 -0
- package/src/domain/rotation/types.ts +718 -0
- package/src/domain/run/battlegroundRun.ts +111 -0
- package/src/domain/run/canEnterContext.ts +32 -0
- package/src/domain/run/death.ts +561 -0
- package/src/domain/run/deathRecovery.ts +289 -0
- package/src/domain/run/duel.ts +141 -0
- package/src/domain/run/dungeonRun.ts +344 -0
- package/src/domain/run/floorRest.ts +159 -0
- package/src/domain/run/honor.ts +557 -0
- package/src/domain/run/honorWeek.ts +180 -0
- package/src/domain/run/whenMap.ts +977 -0
- package/src/domain/scriptdev/arathiHighlands.ts +445 -0
- package/src/domain/scriptdev/ashenvale.ts +635 -0
- package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
- package/src/domain/scriptdev/azshara.ts +892 -0
- package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
- package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
- package/src/domain/scriptdev/blackrockSpire.ts +730 -0
- package/src/domain/scriptdev/blackwingLair.ts +521 -0
- package/src/domain/scriptdev/burningSteppes.ts +62 -0
- package/src/domain/scriptdev/classFilter.ts +43 -0
- package/src/domain/scriptdev/darkshore.ts +817 -0
- package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
- package/src/domain/scriptdev/deadmines.ts +331 -0
- package/src/domain/scriptdev/desolace.ts +1239 -0
- package/src/domain/scriptdev/direMaul.ts +859 -0
- package/src/domain/scriptdev/durotar.ts +532 -0
- package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
- package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
- package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
- package/src/domain/scriptdev/felwood.ts +1055 -0
- package/src/domain/scriptdev/feralas.ts +571 -0
- package/src/domain/scriptdev/feralasHelpers.ts +838 -0
- package/src/domain/scriptdev/gnomeregan.ts +466 -0
- package/src/domain/scriptdev/guards.ts +616 -0
- package/src/domain/scriptdev/hinterlands.ts +693 -0
- package/src/domain/scriptdev/host.ts +1134 -0
- package/src/domain/scriptdev/index.ts +123 -0
- package/src/domain/scriptdev/instanceRaids.ts +136 -0
- package/src/domain/scriptdev/itemScripts.ts +37 -0
- package/src/domain/scriptdev/lochModan.ts +283 -0
- package/src/domain/scriptdev/maraudon.ts +232 -0
- package/src/domain/scriptdev/moltenCore.ts +831 -0
- package/src/domain/scriptdev/moonglade.ts +659 -0
- package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
- package/src/domain/scriptdev/naxxramas.ts +577 -0
- package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
- package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
- package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
- package/src/domain/scriptdev/npcProfessions.ts +1025 -0
- package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
- package/src/domain/scriptdev/onyxiasLair.ts +313 -0
- package/src/domain/scriptdev/orgrimmar.ts +147 -0
- package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
- package/src/domain/scriptdev/razorfenDowns.ts +468 -0
- package/src/domain/scriptdev/razorfenKraul.ts +410 -0
- package/src/domain/scriptdev/redridgeMountains.ts +163 -0
- package/src/domain/scriptdev/registry.ts +945 -0
- package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
- package/src/domain/scriptdev/scarletMonastery.ts +713 -0
- package/src/domain/scriptdev/scholomance.ts +682 -0
- package/src/domain/scriptdev/searingGorge.ts +295 -0
- package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
- package/src/domain/scriptdev/silithus.ts +71 -0
- package/src/domain/scriptdev/silverpineForest.ts +662 -0
- package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
- package/src/domain/scriptdev/stormwindCity.ts +1192 -0
- package/src/domain/scriptdev/stranglethornVale.ts +402 -0
- package/src/domain/scriptdev/stratholme.ts +650 -0
- package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
- package/src/domain/scriptdev/sunkenTemple.ts +736 -0
- package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
- package/src/domain/scriptdev/tanaris.ts +391 -0
- package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
- package/src/domain/scriptdev/teldrassil.ts +143 -0
- package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
- package/src/domain/scriptdev/theBarrens.ts +709 -0
- package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
- package/src/domain/scriptdev/thousandNeedles.ts +426 -0
- package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
- package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
- package/src/domain/scriptdev/types.ts +1026 -0
- package/src/domain/scriptdev/uldaman.ts +437 -0
- package/src/domain/scriptdev/ungoroCrater.ts +549 -0
- package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
- package/src/domain/scriptdev/wailingCaverns.ts +700 -0
- package/src/domain/scriptdev/warEffort.ts +371 -0
- package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
- package/src/domain/scriptdev/westfall.ts +767 -0
- package/src/domain/scriptdev/wetlands.ts +660 -0
- package/src/domain/scriptdev/winterspring.ts +482 -0
- package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
- package/src/domain/scriptdev/worldBosses.ts +605 -0
- package/src/domain/scriptdev/zulfarrak.ts +478 -0
- package/src/domain/scriptdev/zulgurub.ts +1152 -0
- package/src/domain/sim/dummySim.ts +408 -0
- package/src/domain/sim/targetDummy.ts +29 -0
- package/src/domain/social/guild.ts +148 -0
- package/src/domain/spells/areaAuraMembership.ts +93 -0
- package/src/domain/spells/breakableStunCc.ts +166 -0
- package/src/domain/spells/cancelAura.ts +80 -0
- package/src/domain/spells/diminishing.ts +167 -0
- package/src/domain/spells/dispel.ts +149 -0
- package/src/domain/spells/dispelMechanic.ts +105 -0
- package/src/domain/spells/equipSpells.ts +247 -0
- package/src/domain/spells/learnOnTargets.ts +260 -0
- package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
- package/src/domain/spells/resurrectSpell.ts +124 -0
- package/src/domain/spells/spellPushback.ts +39 -0
- package/src/domain/spells/spellReflect.ts +43 -0
- package/src/domain/spells/stealth.ts +183 -0
- package/src/domain/spells/totem.ts +394 -0
- package/src/domain/spells/worldCast.ts +187 -0
- package/src/domain/world/areaTriggerLocks.ts +177 -0
- package/src/domain/world/dungeonMusic.ts +108 -0
- package/src/domain/world/gameEvents.ts +119 -0
- package/src/domain/world/gameObjects.ts +1030 -0
- package/src/domain/world/goEventFire.ts +234 -0
- package/src/domain/world/goMoTransport.ts +74 -0
- package/src/domain/world/goTransport.ts +81 -0
- package/src/domain/world/hazards.ts +459 -0
- package/src/domain/world/openLock.ts +398 -0
- package/src/domain/world/pools.ts +470 -0
- package/src/domain/world/restArea.ts +37 -0
- package/src/domain/world/weather.ts +201 -0
- package/src/domain/zoneAmbience.mjs +87 -0
- package/src/domain/zoneMusic.mjs +62 -0
- package/src/domain/zoneMusicQueue.mjs +7 -0
- package/src/engine/combat/activeSeal.ts +39 -0
- package/src/engine/combat/aiTargetResolve.ts +64 -0
- package/src/engine/combat/aoeCast.ts +289 -0
- package/src/engine/combat/applyConsumeAura.ts +74 -0
- package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
- package/src/engine/combat/applyDispelMechanic.ts +30 -0
- package/src/engine/combat/applyHealEffect.ts +301 -0
- package/src/engine/combat/applySchoolAbsorb.ts +114 -0
- package/src/engine/combat/applySpell.ts +3169 -0
- package/src/engine/combat/applySpellLate.ts +2026 -0
- package/src/engine/combat/applySpellLateBag.ts +144 -0
- package/src/engine/combat/areaAura.ts +283 -0
- package/src/engine/combat/attackTable.ts +508 -0
- package/src/engine/combat/battleRez.ts +87 -0
- package/src/engine/combat/castAction.ts +36 -0
- package/src/engine/combat/castTargetGates.ts +75 -0
- package/src/engine/combat/castableKit.ts +68 -0
- package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
- package/src/engine/combat/chainFan.ts +210 -0
- package/src/engine/combat/channel.ts +423 -0
- package/src/engine/combat/chaseCloseness.ts +95 -0
- package/src/engine/combat/cmangosCastGates.ts +129 -0
- package/src/engine/combat/combatFlag.ts +77 -0
- package/src/engine/combat/combatGeometry.ts +1329 -0
- package/src/engine/combat/combustion.ts +68 -0
- package/src/engine/combat/context.ts +730 -0
- package/src/engine/combat/createSession.ts +1165 -0
- package/src/engine/combat/creatureLeash.ts +38 -0
- package/src/engine/combat/crowdControl.ts +1259 -0
- package/src/engine/combat/dispelDuty.ts +54 -0
- package/src/engine/combat/dispelReflect.ts +609 -0
- package/src/engine/combat/displaceFloor.ts +113 -0
- package/src/engine/combat/duelBounds.ts +47 -0
- package/src/engine/combat/equippedItemGate.ts +297 -0
- package/src/engine/combat/evadeLifecycle.ts +63 -0
- package/src/engine/combat/eventAi.ts +2220 -0
- package/src/engine/combat/facing.ts +74 -0
- package/src/engine/combat/fearFlee.ts +137 -0
- package/src/engine/combat/fighterFactory.ts +1144 -0
- package/src/engine/combat/forceDespawnAction.ts +51 -0
- package/src/engine/combat/formulas.ts +807 -0
- package/src/engine/combat/friendlyFan.ts +55 -0
- package/src/engine/combat/groundPoolTick.ts +210 -0
- package/src/engine/combat/hazards.ts +114 -0
- package/src/engine/combat/healTargets.ts +226 -0
- package/src/engine/combat/heartbeatResist.ts +49 -0
- package/src/engine/combat/hostileItemUse.ts +75 -0
- package/src/engine/combat/interruptAuras.ts +66 -0
- package/src/engine/combat/itemRescue.ts +49 -0
- package/src/engine/combat/itemUse.ts +260 -0
- package/src/engine/combat/kitById.ts +23 -0
- package/src/engine/combat/knockBack.ts +201 -0
- package/src/engine/combat/leap.ts +89 -0
- package/src/engine/combat/mitigation.ts +587 -0
- package/src/engine/combat/modTaunt.ts +43 -0
- package/src/engine/combat/motionClaim.ts +268 -0
- package/src/engine/combat/motionGate.ts +150 -0
- package/src/engine/combat/motionGenerator.ts +27 -0
- package/src/engine/combat/navSight.ts +138 -0
- package/src/engine/combat/perfSink.ts +28 -0
- package/src/engine/combat/periodicDue.ts +55 -0
- package/src/engine/combat/petAuras.ts +86 -0
- package/src/engine/combat/pickAction.ts +3449 -0
- package/src/engine/combat/powerForm.ts +735 -0
- package/src/engine/combat/powerPools.ts +49 -0
- package/src/engine/combat/predicates.ts +538 -0
- package/src/engine/combat/procsDamage.ts +1823 -0
- package/src/engine/combat/reactiveGates.ts +135 -0
- package/src/engine/combat/roles.ts +389 -0
- package/src/engine/combat/rotationSubject.ts +78 -0
- package/src/engine/combat/ruleAfter.ts +106 -0
- package/src/engine/combat/seedDisplayAuras.ts +203 -0
- package/src/engine/combat/seedOocEffects.ts +317 -0
- package/src/engine/combat/seedSchoolImmunities.ts +45 -0
- package/src/engine/combat/session-types.ts +458 -0
- package/src/engine/combat/sessionApi.ts +1785 -0
- package/src/engine/combat/sessionCharge.ts +124 -0
- package/src/engine/combat/sessionChase.ts +869 -0
- package/src/engine/combat/sessionDeaths.ts +469 -0
- package/src/engine/combat/sessionFocus.ts +506 -0
- package/src/engine/combat/sessionFollow.ts +167 -0
- package/src/engine/combat/sessionGeometry.ts +188 -0
- package/src/engine/combat/sessionHome.ts +75 -0
- package/src/engine/combat/sessionInject.ts +719 -0
- package/src/engine/combat/sessionMechanicMove.ts +555 -0
- package/src/engine/combat/sessionMotion.ts +1553 -0
- package/src/engine/combat/sessionMotionKit.ts +247 -0
- package/src/engine/combat/sessionMoveIntent.ts +49 -0
- package/src/engine/combat/sessionMoveOrder.ts +200 -0
- package/src/engine/combat/sessionPathTo.ts +657 -0
- package/src/engine/combat/sessionPools.ts +688 -0
- package/src/engine/combat/sessionSteer.ts +144 -0
- package/src/engine/combat/sessionStepBack.ts +151 -0
- package/src/engine/combat/sessionStepWrap.ts +116 -0
- package/src/engine/combat/sessionView.ts +442 -0
- package/src/engine/combat/simEffects.ts +32 -0
- package/src/engine/combat/simFacade.ts +620 -0
- package/src/engine/combat/simPump.ts +264 -0
- package/src/engine/combat/simSnapshot.ts +165 -0
- package/src/engine/combat/simThreadPool.ts +35 -0
- package/src/engine/combat/skeramImages.ts +57 -0
- package/src/engine/combat/slowUpdate.ts +178 -0
- package/src/engine/combat/snapToFloor.ts +42 -0
- package/src/engine/combat/speedAura.ts +29 -0
- package/src/engine/combat/spellReagents.ts +71 -0
- package/src/engine/combat/stealthDetect.ts +93 -0
- package/src/engine/combat/stepBackMotion.ts +171 -0
- package/src/engine/combat/stepSession.ts +3102 -0
- package/src/engine/combat/summonCast.ts +243 -0
- package/src/engine/combat/thaddiusPolarity.ts +97 -0
- package/src/engine/combat/threat.ts +388 -0
- package/src/engine/combat/threatOps.ts +272 -0
- package/src/engine/combat/tickWorkerBody.ts +211 -0
- package/src/engine/combat/totemAuras.ts +122 -0
- package/src/engine/combat/triggerPayload.ts +42 -0
- package/src/engine/combat/triggeredCompanion.ts +63 -0
- package/src/engine/combat/types.ts +1897 -0
- package/src/engine/combat/useObjectTrap.ts +140 -0
- package/src/engine/combat/walkSurface.ts +54 -0
- package/src/engine/combat/weapon.ts +1248 -0
- package/src/engine/combat/worldFrame.ts +43 -0
- package/src/engine/combat.solo-golden.json +2242 -0
- package/src/engine/combat.ts +84 -0
- package/src/engine/core/detMath.ts +289 -0
- package/src/engine/core/events.ts +357 -0
- package/src/engine/core/rng.ts +36 -0
- package/src/engine/game/actionBars.ts +124 -0
- package/src/engine/game/activateObjectFromSpell.ts +320 -0
- package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
- package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
- package/src/engine/game/applyDoorFromDbScript.ts +388 -0
- package/src/engine/game/applyEscortFromDbScript.ts +290 -0
- package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
- package/src/engine/game/applyHoverFromDbScript.ts +110 -0
- package/src/engine/game/applyOocResurrect.ts +71 -0
- package/src/engine/game/applySpellDurability.ts +115 -0
- package/src/engine/game/applyTailFromDbScript.ts +478 -0
- package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
- package/src/engine/game/auctionMail.ts +269 -0
- package/src/engine/game/bagOverflow.ts +130 -0
- package/src/engine/game/bank.ts +110 -0
- package/src/engine/game/barAutofill.ts +26 -0
- package/src/engine/game/battleground.ts +369 -0
- package/src/engine/game/combatEnemySpec.ts +216 -0
- package/src/engine/game/combatObjectTraps.ts +167 -0
- package/src/engine/game/combatSeed.ts +320 -0
- package/src/engine/game/combatSession.ts +3241 -0
- package/src/engine/game/combatSessionClock.ts +62 -0
- package/src/engine/game/companionQuestActions.ts +242 -0
- package/src/engine/game/companionTraining.ts +40 -0
- package/src/engine/game/consumables.ts +624 -0
- package/src/engine/game/context.ts +53 -0
- package/src/engine/game/createHealthstone.ts +45 -0
- package/src/engine/game/deathFlow.ts +127 -0
- package/src/engine/game/devGrant.ts +117 -0
- package/src/engine/game/dynamicObject.ts +365 -0
- package/src/engine/game/enchantItem.ts +177 -0
- package/src/engine/game/equipmentHelper.ts +806 -0
- package/src/engine/game/factionState.ts +108 -0
- package/src/engine/game/garmentsOoc.ts +69 -0
- package/src/engine/game/globalActionBar.ts +179 -0
- package/src/engine/game/goInteractQuestCredit.ts +51 -0
- package/src/engine/game/goMoTransportUse.ts +61 -0
- package/src/engine/game/goTransportUse.ts +60 -0
- package/src/engine/game/healthstoneUpkeep.ts +59 -0
- package/src/engine/game/killSkin.ts +124 -0
- package/src/engine/game/learnFromItem.ts +118 -0
- package/src/engine/game/loadReconcile.ts +551 -0
- package/src/engine/game/loot.ts +294 -0
- package/src/engine/game/macros.ts +125 -0
- package/src/engine/game/mail.ts +293 -0
- package/src/engine/game/meetingStoneQueue.ts +75 -0
- package/src/engine/game/meetingStoneUse.ts +54 -0
- package/src/engine/game/newGameState.ts +363 -0
- package/src/engine/game/oocAuraInterrupt.ts +92 -0
- package/src/engine/game/oocCast.ts +241 -0
- package/src/engine/game/oocCastEffects.ts +803 -0
- package/src/engine/game/oocCastMethods.ts +1077 -0
- package/src/engine/game/openLockFromSpell.ts +174 -0
- package/src/engine/game/outdoorPvp.ts +187 -0
- package/src/engine/game/outfitter.ts +644 -0
- package/src/engine/game/paladinBoard.ts +393 -0
- package/src/engine/game/partyAuras.ts +121 -0
- package/src/engine/game/persistCombatAuras.ts +91 -0
- package/src/engine/game/pets.ts +459 -0
- package/src/engine/game/prePullHealthstones.ts +154 -0
- package/src/engine/game/professions.ts +2227 -0
- package/src/engine/game/pruneStaleRuntime.ts +39 -0
- package/src/engine/game/questFightCredit.ts +36 -0
- package/src/engine/game/questItemOnCorpse.ts +166 -0
- package/src/engine/game/questItemOnCreature.ts +103 -0
- package/src/engine/game/questLog.ts +879 -0
- package/src/engine/game/questSpellComplete.ts +21 -0
- package/src/engine/game/questTurnIn.ts +598 -0
- package/src/engine/game/raidParty.ts +32 -0
- package/src/engine/game/reagentBuyIn.ts +39 -0
- package/src/engine/game/regenRest.ts +186 -0
- package/src/engine/game/rotation.ts +425 -0
- package/src/engine/game/runFullDungeon.ts +611 -0
- package/src/engine/game/runSupply.ts +80 -0
- package/src/engine/game/sanitizeDriftedItems.ts +135 -0
- package/src/engine/game/scriptDevGoUse.ts +397 -0
- package/src/engine/game/scriptDevInnkeeper.ts +150 -0
- package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
- package/src/engine/game/sendEventFromSpell.ts +87 -0
- package/src/engine/game/sortContainers.ts +85 -0
- package/src/engine/game/spellReputation.ts +69 -0
- package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
- package/src/engine/game/squadDungeon.ts +4222 -0
- package/src/engine/game/squadQuestShare.ts +260 -0
- package/src/engine/game/summonObjectSlot.ts +69 -0
- package/src/engine/game/summonObjectWild.ts +73 -0
- package/src/engine/game/summoningRitualUse.ts +141 -0
- package/src/engine/game/talents.ts +356 -0
- package/src/engine/game/tamingRodUse.ts +66 -0
- package/src/engine/game/tempSpawnCreature.ts +136 -0
- package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
- package/src/engine/game/tickTimedQuests.ts +28 -0
- package/src/engine/game/trade.ts +586 -0
- package/src/engine/game/travel.ts +1155 -0
- package/src/engine/game/types.ts +1855 -0
- package/src/engine/game/vendorOffers.ts +244 -0
- package/src/engine/game/weaponImbueItem.ts +281 -0
- package/src/engine/game/worldSession.ts +183 -0
- package/src/engine/game/worldState.ts +166 -0
- package/src/engine/game.ts +968 -0
- package/src/engine/spells/GAP.md +67 -0
- package/src/engine/spells/absorbs.ts +376 -0
- package/src/engine/spells/addTargetTrigger.ts +53 -0
- package/src/engine/spells/auraPerSecondCost.ts +50 -0
- package/src/engine/spells/auraStacking.ts +497 -0
- package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
- package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
- package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
- package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
- package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
- package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
- package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
- package/src/engine/spells/cmangos-special-cases.ts +1570 -0
- package/src/engine/spells/conditions.ts +718 -0
- package/src/engine/spells/effects.ts +203 -0
- package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
- package/src/engine/spells/immunity.ts +942 -0
- package/src/engine/spells/intentEffects.ts +351 -0
- package/src/engine/spells/interpreter/GAPS.md +21 -0
- package/src/engine/spells/interpreter/amount.ts +109 -0
- package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
- package/src/engine/spells/interpreter/diff.ts +246 -0
- package/src/engine/spells/interpreter/duration.ts +90 -0
- package/src/engine/spells/interpreter/form-attrs.json +1 -0
- package/src/engine/spells/interpreter/form-attrs.ts +95 -0
- package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
- package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
- package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
- package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
- package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
- package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
- package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
- package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
- package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
- package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
- package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
- package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
- package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
- package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
- package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
- package/src/engine/spells/interpreter/handlers.ts +9 -0
- package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
- package/src/engine/spells/interpreter/index.ts +525 -0
- package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
- package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
- package/src/engine/spells/interpreter/mage-portals.ts +37 -0
- package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
- package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
- package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
- package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
- package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
- package/src/engine/spells/interpreter/opcodes.ts +789 -0
- package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
- package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
- package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
- package/src/engine/spells/interpreter/proc.ts +443 -0
- package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
- package/src/engine/spells/interpreter/registry/index.ts +216 -0
- package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
- package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
- package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
- package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
- package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
- package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
- package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
- package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
- package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
- package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
- package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
- package/src/engine/spells/interpreter/registry/types.ts +48 -0
- package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
- package/src/engine/spells/interpreter/targeting.ts +90 -0
- package/src/engine/spells/interpreter/types-intent.ts +1501 -0
- package/src/engine/spells/interpreter/types.ts +419 -0
- package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
- package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
- package/src/engine/spells/interrupt.ts +217 -0
- package/src/engine/spells/meleeAttackReset.ts +60 -0
- package/src/engine/spells/oocTriggerSpell.ts +49 -0
- package/src/engine/spells/overrideClassScripts.ts +319 -0
- package/src/engine/spells/parryHaste.ts +20 -0
- package/src/engine/spells/procs.ts +300 -0
- package/src/engine/spells/recovery.ts +203 -0
- package/src/engine/spells/scriptTargetDest.ts +76 -0
- package/src/engine/spells/scriptTargets.ts +85 -0
- package/src/engine/spells/singleTargetAura.ts +82 -0
- package/src/engine/spells/specialCasePayloads.ts +57 -0
- package/src/engine/spells/spellAttributes.ts +249 -0
- package/src/engine/spells/spellBonus.ts +143 -0
- package/src/engine/spells/spellModIntents.ts +419 -0
- package/src/engine/spells/spellMods.ts +283 -0
- package/src/engine/spells/spellRadius.ts +15 -0
- package/src/engine/spells/trapObjects.ts +26 -0
- package/src/json.d.ts +7 -0
- package/src/persistence/memoryRepository.ts +23 -0
- package/src/persistence/saveBackups.ts +162 -0
- package/src/persistence/saveFile.ts +68 -0
- package/src/persistence/saveRepository.ts +11 -0
- package/src/persistence/saveShape.ts +668 -0
- package/src/progression/leveling.ts +89 -0
- package/src/progression/rest.ts +1434 -0
- package/src/progression/training.ts +226 -0
- package/src/progression/xpGain.ts +369 -0
- package/src/quests/quests.ts +1580 -0
- package/src/world/aoePull.ts +198 -0
- package/src/world/areaTableDbc.ts +39 -0
- package/src/world/areaTableMapIdPairs.ts +141 -0
- package/src/world/bakeSlug.ts +43 -0
- package/src/world/continuousDungeon.ts +1250 -0
- package/src/world/dungeonBakeProjection.ts +190 -0
- package/src/world/dungeonMapDensity.ts +342 -0
- package/src/world/dungeonMapProjection.ts +135 -0
- package/src/world/dungeonNav.ts +904 -0
- package/src/world/dungeonNpcSim.ts +147 -0
- package/src/world/dungeonObjectives.ts +234 -0
- package/src/world/dungeonPreset.ts +35 -0
- package/src/world/dungeonRoute.ts +311 -0
- package/src/world/dungeonRouteGeometry.ts +732 -0
- package/src/world/dungeonRouteOrder.ts +1037 -0
- package/src/world/dungeonWingRooms.ts +426 -0
- package/src/world/escort.ts +296 -0
- package/src/world/goPoolRoll.ts +75 -0
- package/src/world/instanceObjects.ts +785 -0
- package/src/world/instances.ts +1572 -0
- package/src/world/meetingStones.ts +56 -0
- package/src/world/navmeshFloors.ts +145 -0
- package/src/world/nearGrid.ts +167 -0
- package/src/world/packBudget.ts +613 -0
- package/src/world/rareRoll.ts +335 -0
- package/src/world/routeAuthoring.ts +132 -0
- package/src/world/routeEdit.ts +209 -0
- package/src/world/world.ts +812 -0
- package/src/world/zoneHazards.ts +47 -0
|
@@ -0,0 +1,1152 @@
|
|
|
1
|
+
// Zul'Gurub — the ScriptDevAI IR port. CMaNGOS drives this raid from creature_spell_list, so every
|
|
2
|
+
// timer cites a DB row and a ported boss carries ALL its phases. Jin'do and Gahz'ranka stay baked.
|
|
3
|
+
|
|
4
|
+
import type { ScriptDevDataGate, ScriptDevIR, ScriptDevTimer } from './types.ts';
|
|
5
|
+
import { INSTANCE_DATA } from './types.ts';
|
|
6
|
+
import { CAST_FLAG } from '../creature/creatureAi.ts';
|
|
7
|
+
|
|
8
|
+
// zulgurub.h:10-20 — TYPE_OHGAN comment "Do not change, used by Acid"; do not renumber.
|
|
9
|
+
const TYPE = {
|
|
10
|
+
JEKLIK: 0,
|
|
11
|
+
VENOXIS: 1,
|
|
12
|
+
MARLI: 2,
|
|
13
|
+
THEKAL: 3,
|
|
14
|
+
ARLOKK: 4,
|
|
15
|
+
OHGAN: 5,
|
|
16
|
+
LORKHAN: 6,
|
|
17
|
+
ZATH: 7,
|
|
18
|
+
} as const;
|
|
19
|
+
const NPC = {
|
|
20
|
+
JEKLIK: 14517,
|
|
21
|
+
VENOXIS: 14507,
|
|
22
|
+
MARLI: 14510,
|
|
23
|
+
THEKAL: 14509,
|
|
24
|
+
ARLOKK: 14515,
|
|
25
|
+
MANDOKIR: 11382,
|
|
26
|
+
OHGAN_RAPTOR: 14988,
|
|
27
|
+
HAKKAR: 14834,
|
|
28
|
+
RENATAKI: 15084,
|
|
29
|
+
CHAINED_SPIRIT: 15117,
|
|
30
|
+
BAT_RIDER: 14750,
|
|
31
|
+
FRENZIED_BAT: 14965,
|
|
32
|
+
ZULIAN_PROWLER: 15101,
|
|
33
|
+
LORKHAN: 11347,
|
|
34
|
+
ZATH: 11348,
|
|
35
|
+
} as const;
|
|
36
|
+
|
|
37
|
+
/** boss_mandokir.cpp:60 SPELL_REVIVE — the Chained Spirit's in-combat resurrect. */
|
|
38
|
+
const SPELL_MANDOKIR_REVIVE = 24341;
|
|
39
|
+
|
|
40
|
+
/** Cite: boss_thekal.cpp:248 TYPE_ZATH && TYPE_LORKHAN == SPECIAL. */
|
|
41
|
+
const bothZealotsSpecial: ScriptDevDataGate = {
|
|
42
|
+
field: TYPE.ZATH,
|
|
43
|
+
equals: INSTANCE_DATA.SPECIAL,
|
|
44
|
+
and: {
|
|
45
|
+
field: TYPE.LORKHAN,
|
|
46
|
+
equals: INSTANCE_DATA.SPECIAL,
|
|
47
|
+
cite: 'boss_thekal.cpp:248 TYPE_LORKHAN SPECIAL',
|
|
48
|
+
},
|
|
49
|
+
cite: 'boss_thekal.cpp:248 CanPreventAddsResurrect',
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/** Cite: boss_thekal.cpp:248 negation — either add not SPECIAL. */
|
|
53
|
+
const eitherZealotLive: ScriptDevDataGate = {
|
|
54
|
+
field: TYPE.ZATH,
|
|
55
|
+
notEquals: INSTANCE_DATA.SPECIAL,
|
|
56
|
+
or: {
|
|
57
|
+
field: TYPE.LORKHAN,
|
|
58
|
+
notEquals: INSTANCE_DATA.SPECIAL,
|
|
59
|
+
cite: 'boss_thekal.cpp:248 TYPE_LORKHAN != SPECIAL',
|
|
60
|
+
},
|
|
61
|
+
cite: 'boss_thekal.cpp:248 !CanPreventAddsResurrect',
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
/** Cite: boss_thekal.cpp:330 Lorkhan ress unless Thekal and Zath are both SPECIAL. */
|
|
65
|
+
const lorkhanMayRevive: ScriptDevDataGate = {
|
|
66
|
+
field: TYPE.THEKAL,
|
|
67
|
+
notEquals: INSTANCE_DATA.SPECIAL,
|
|
68
|
+
or: {
|
|
69
|
+
field: TYPE.ZATH,
|
|
70
|
+
notEquals: INSTANCE_DATA.SPECIAL,
|
|
71
|
+
cite: 'boss_thekal.cpp:330 TYPE_ZATH != SPECIAL',
|
|
72
|
+
},
|
|
73
|
+
cite: 'boss_thekal.cpp:330 TYPE_THEKAL != SPECIAL || TYPE_ZATH != SPECIAL',
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/** Cite: boss_thekal.cpp:381 Zath ress unless Thekal and Lorkhan are both SPECIAL. */
|
|
77
|
+
const zathMayRevive: ScriptDevDataGate = {
|
|
78
|
+
field: TYPE.THEKAL,
|
|
79
|
+
notEquals: INSTANCE_DATA.SPECIAL,
|
|
80
|
+
or: {
|
|
81
|
+
field: TYPE.LORKHAN,
|
|
82
|
+
notEquals: INSTANCE_DATA.SPECIAL,
|
|
83
|
+
cite: 'boss_thekal.cpp:381 TYPE_LORKHAN != SPECIAL',
|
|
84
|
+
},
|
|
85
|
+
cite: 'boss_thekal.cpp:381 TYPE_THEKAL != SPECIAL || TYPE_LORKHAN != SPECIAL',
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// `creature_spell_list.TargetId` → IR target mode: 0 NONE, 1 CURRENT, 2 SELF, 4 dispellable
|
|
89
|
+
// friendly, and 100+ a creature_spell_targeting row. Cite: CreatureSpellList.h:34-43.
|
|
90
|
+
const row = (
|
|
91
|
+
id: string, spellId: number, target: ScriptDevTimer['target'],
|
|
92
|
+
iMin: number, iMax: number, rMin: number, rMax: number, cite: string,
|
|
93
|
+
phase?: number, extra: Partial<ScriptDevTimer> = {},
|
|
94
|
+
): ScriptDevTimer => ({
|
|
95
|
+
id, spellId, initialMinMs: iMin, initialMaxMs: iMax, repeatMinMs: rMin, repeatMaxMs: rMax,
|
|
96
|
+
target, cite, ...(phase != null ? { phase } : {}), ...extra,
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
export const BOSS_VENOXIS: ScriptDevIR = {
|
|
100
|
+
name: 'boss_venoxis',
|
|
101
|
+
boundCreatures: [NPC.VENOXIS],
|
|
102
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_venoxis.cpp',
|
|
103
|
+
// Parasitic Serpent and Virulent Poison pay through 23865 / 22412, resolved off the kit.
|
|
104
|
+
spellIds: [23859, 23895, 23979, 23858, 23860, 3391, 23861, 23862, 23867, 23849, 22413, 23537, 23865, 22412, 9204],
|
|
105
|
+
timers: [
|
|
106
|
+
// ---- PHASE 1, the troll priest: list 1450701 ----
|
|
107
|
+
row('renew', 23895, 'self', 30_000, 30_000, 20_000, 30_000, 'creature_spell_list 1450701:1 Renew on Self', 0),
|
|
108
|
+
row('holy_wrath', 23979, 'victim', 40_000, 40_000, 15_000, 25_000, 'creature_spell_list 1450701:2 Holy Wrath on Current', 0),
|
|
109
|
+
row('holy_nova', 23858, 'self', 15_000, 20_000, 10_000, 15_000, 'creature_spell_list 1450701:3 Holy Nova on None', 0),
|
|
110
|
+
row('holy_fire', 23860, 'hostile_random', 10_000, 15_000, 20_000, 30_000, 'creature_spell_list 1450701:4 Holy Fire on Random', 0),
|
|
111
|
+
row('thrash_p1', 3391, 'self', 4000, 6000, 10_000, 20_000, 'creature_spell_list 1450701:5 Thrash on Current', 0),
|
|
112
|
+
// ---- PHASE 2, the serpent: list 1450702 (Poison Cloud + Venomspit, no healing) ----
|
|
113
|
+
row('poison_cloud_p2', 23861, 'self', 2000, 2000, 15_000, 15_000, 'creature_spell_list 1450702:0 Poison Cloud on None', 1),
|
|
114
|
+
row('venomspit_p2', 23862, 'hostile_random', 5500, 5500, 15_000, 20_000, 'creature_spell_list 1450702:1 Venomspit on Random', 1),
|
|
115
|
+
row('thrash_p2', 3391, 'self', 4000, 6000, 10_000, 20_000, 'creature_spell_list 1450702:5 Thrash on Current', 1),
|
|
116
|
+
// ---- PHASE 3 below 25 %: list 1450703 adds Parasitic Serpent, everything ready at 0 ----
|
|
117
|
+
row('poison_cloud_p3', 23861, 'self', 0, 0, 15_000, 15_000, 'creature_spell_list 1450703:0 Poison Cloud on None', 2),
|
|
118
|
+
row('venomspit_p3', 23862, 'hostile_random', 0, 0, 15_000, 20_000, 'creature_spell_list 1450703:1 Venomspit on Random', 2),
|
|
119
|
+
row('parasitic_serpent', 23867, 'hostile_random', 0, 0, 15_000, 20_000, 'creature_spell_list 1450703:2 Parasitic Serpent on Random', 2),
|
|
120
|
+
row('thrash_p3', 3391, 'self', 0, 0, 10_000, 20_000, 'creature_spell_list 1450703:5 Thrash on Current', 2),
|
|
121
|
+
// Phase-free: timerless HP gate does not SetSpellList / bump m_uiPhase (cpp:118-121).
|
|
122
|
+
// AURA_NOT_PRESENT + 0 ms poll fires once, matching DisableCombatAction.
|
|
123
|
+
{
|
|
124
|
+
id: 'frenzy',
|
|
125
|
+
spellId: 23537,
|
|
126
|
+
initialMinMs: 0,
|
|
127
|
+
initialMaxMs: 0,
|
|
128
|
+
repeatMinMs: 0,
|
|
129
|
+
repeatMaxMs: 0,
|
|
130
|
+
target: 'self',
|
|
131
|
+
hpPctMax: 20,
|
|
132
|
+
castFlags: CAST_FLAG.AURA_NOT_PRESENT,
|
|
133
|
+
cite: 'boss_venoxis.cpp:72,118-121 AddTimerlessCombatAction(VENOXIS_FRENZY); GetHealthPercent() < 20.f → SPELL_FRENZY 23537 then DisableCombatAction',
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
phases: [
|
|
137
|
+
{
|
|
138
|
+
phase: 1,
|
|
139
|
+
hpBelowPct: 50,
|
|
140
|
+
actions: [
|
|
141
|
+
// CAST_OK extras on VENOXIS_PHASE_2 — order matches boss_venoxis.cpp:101-108.
|
|
142
|
+
{ kind: 'cast_self', spellId: 23849, cite: 'boss_venoxis.cpp:101 SPELL_SNAKE_FORM on VENOXIS_PHASE_2' },
|
|
143
|
+
{ kind: 'flavor', text: 'sheds his priesthood and takes serpent form.', cite: 'boss_venoxis.cpp:103 DoScriptText(SAY_TRANSFORM)' },
|
|
144
|
+
{ kind: 'cast_self', spellId: 23861, cite: 'boss_venoxis.cpp:104 SPELL_POISON_CLOUD instant cloud on change' },
|
|
145
|
+
{
|
|
146
|
+
kind: 'cast_self',
|
|
147
|
+
spellId: 22413,
|
|
148
|
+
castFlags: CAST_FLAG.TRIGGERED | CAST_FLAG.AURA_NOT_PRESENT,
|
|
149
|
+
cite: 'boss_venoxis.cpp:105 SPELL_VIRULENT_POISON_PROC CAST_TRIGGERED|CAST_AURA_NOT_PRESENT',
|
|
150
|
+
},
|
|
151
|
+
{ kind: 'reset_threat', cite: 'boss_venoxis.cpp:106 DoResetThreat' },
|
|
152
|
+
],
|
|
153
|
+
cite: 'boss_venoxis.cpp:97-108 GetHealthPercent() > 50.f gate → snake + cloud + virulent + reset → SetSpellList(PHASE_2)',
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
phase: 2,
|
|
157
|
+
hpBelowPct: 25,
|
|
158
|
+
actions: [
|
|
159
|
+
{ kind: 'flavor', text: 'thrashes - the venom comes faster.', cite: 'boss_venoxis.cpp:111-116 VENOXIS_PHASE_3' },
|
|
160
|
+
],
|
|
161
|
+
cite: 'boss_venoxis.cpp:111-116 GetHealthPercent() < 25.f → SetSpellList(PHASE_3)',
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
lifecycle: {
|
|
165
|
+
onDeath: [{ kind: 'set_instance_data', field: TYPE.VENOXIS, value: INSTANCE_DATA.DONE, cite: 'boss_venoxis.cpp:85-90 JustDied SetData(TYPE_VENOXIS, DONE)' }],
|
|
166
|
+
onEvade: [{ kind: 'set_instance_data', field: TYPE.VENOXIS, value: INSTANCE_DATA.FAIL, cite: 'boss_venoxis.cpp:77-82 JustReachedHome SetData(FAIL)' }],
|
|
167
|
+
},
|
|
168
|
+
cites: [
|
|
169
|
+
'boss_venoxis.cpp:25-133 whole file',
|
|
170
|
+
'creature_spell_list 1450701 / 1450702 / 1450703 (13 rows, 3307/mangos)',
|
|
171
|
+
'boss_venoxis.cpp:49,72,118-121 SPELL_FRENZY 23537 timerless at GetHealthPercent() < 20.f (no SetSpellList)',
|
|
172
|
+
],
|
|
173
|
+
};
|
|
174
|
+
|
|
175
|
+
export const BOSS_JEKLIK: ScriptDevIR = {
|
|
176
|
+
name: 'boss_jeklik',
|
|
177
|
+
boundCreatures: [NPC.JEKLIK],
|
|
178
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_jeklik.cpp',
|
|
179
|
+
spellIds: [22911, 23919, 23918, 23974, 22644, 12097, 23952, 23953, 23954, 24085, 23966, 23968, 23973],
|
|
180
|
+
timers: [
|
|
181
|
+
// ---- PHASE 1, airborne: list 1451701 ----
|
|
182
|
+
row('charge', 22911, 'hostile_random_player', 20_000, 20_000, 15_000, 30_000, 'creature_spell_list 1451701:0 Charge TargetId 100 Attack - random player', 0),
|
|
183
|
+
// C++ SPELL_SWOOP 23919; list 1451701:1 writes 24210 which is Mark of Arlokk.
|
|
184
|
+
row('swoop', 23919, 'victim', 5000, 5000, 4000, 9000, 'creature_spell_list 1451701:1 cadence, spell from boss_jeklik.cpp:42 SPELL_SWOOP 23919 (row Id 24210 is Mark of Arlokk)', 0),
|
|
185
|
+
row('sonic_burst', 23918, 'victim', 8000, 8000, 8000, 13_000, 'creature_spell_list 1451701:2 Sonic Burst on Current', 0),
|
|
186
|
+
row('summon_frenzied_bats', 23974, 'self', 50_000, 50_000, 60_000, 60_000, 'creature_spell_list 1451701:3 Summon Frenzied Bats on None', 0),
|
|
187
|
+
row('blood_leech', 22644, 'self', 20_000, 30_000, 15_000, 30_000, 'creature_spell_list 1451701:4 Blood Leech on None', 0),
|
|
188
|
+
row('pierce_armor', 12097, 'victim', 10_000, 20_000, 10_000, 20_000, 'creature_spell_list 1451701:5 Pierce Armor on Current', 0),
|
|
189
|
+
// ---- PHASE 2, landed: list 1451702 — a completely different kit, including a heal ----
|
|
190
|
+
row('ravage', 23952, 'victim', 6000, 6000, 12_000, 18_000, 'creature_spell_list 1451702:0 Ravage on Current', 1),
|
|
191
|
+
row('mind_flay', 23953, 'victim', 11_000, 11_000, 16_000, 16_000, 'creature_spell_list 1451702:1 Mind Flay on Current', 1),
|
|
192
|
+
row('greater_heal', 23954, 'self', 20_000, 20_000, 25_000, 35_000, 'creature_spell_list 1451702:2 Greater Heal on None', 1),
|
|
193
|
+
],
|
|
194
|
+
phases: [
|
|
195
|
+
{
|
|
196
|
+
phase: 1,
|
|
197
|
+
hpBelowPct: 50,
|
|
198
|
+
actions: [
|
|
199
|
+
// cpp order: CAST_OK TRANSFORM_VISUAL → strip BAT_FORM → DoResetThreat → SetSpellList(PHASE_2)
|
|
200
|
+
{ kind: 'cast_self', spellId: 24085, cite: 'boss_jeklik.cpp:59 SPELL_TRANSFORM_VISUAL; :205 DoCastSpellIfCan(nullptr, SPELL_TRANSFORM_VISUAL)' },
|
|
201
|
+
{ kind: 'remove_auras', spellId: 23966, cite: 'boss_jeklik.cpp:58 SPELL_BAT_FORM; :207 RemoveAurasDueToSpell(SPELL_BAT_FORM)' },
|
|
202
|
+
{ kind: 'reset_threat', cite: 'boss_jeklik.cpp:209 DoResetThreat()' },
|
|
203
|
+
{ kind: 'flavor', text: 'drops out of the air and fights on the ground.', cite: 'boss_jeklik.cpp:201-213 JEKLIK_PHASE_2 GetHealthPercent() < 50.0f → SetSpellList(PHASE_2)' },
|
|
204
|
+
],
|
|
205
|
+
cite: 'boss_jeklik.cpp:201-213 JEKLIK_PHASE_2 at <50 % HP',
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
// Timerless HP summon — does not SetSpellList. phase 2 is only the once-key.
|
|
209
|
+
phase: 2,
|
|
210
|
+
hpBelowPct: 35,
|
|
211
|
+
retainPhase: true,
|
|
212
|
+
actions: [
|
|
213
|
+
{
|
|
214
|
+
kind: 'summon_count',
|
|
215
|
+
creatureEntry: NPC.BAT_RIDER,
|
|
216
|
+
count: 1,
|
|
217
|
+
x: -12298.03,
|
|
218
|
+
y: -1368.506,
|
|
219
|
+
cite: 'boss_jeklik.cpp:220-230 positions[0] SummonCreature NPC_BAT_RIDER TEMPSPAWN_DEAD_DESPAWN',
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
kind: 'summon_count',
|
|
223
|
+
creatureEntry: NPC.BAT_RIDER,
|
|
224
|
+
count: 1,
|
|
225
|
+
x: -12301.69,
|
|
226
|
+
y: -1371.292,
|
|
227
|
+
cite: 'boss_jeklik.cpp:232-236 positions[1] SummonCreature NPC_BAT_RIDER + immediate LIQUID_FIRE',
|
|
228
|
+
},
|
|
229
|
+
{ kind: 'yell', textId: -1309003, cite: 'boss_jeklik.cpp:45,238 SAY_RAIN_FIRE' },
|
|
230
|
+
],
|
|
231
|
+
cite: 'boss_jeklik.cpp:216-240 JEKLIK_PHASE_BATS GetHealthPercent() < 35.0f DisableCombatAction',
|
|
232
|
+
},
|
|
233
|
+
],
|
|
234
|
+
lifecycle: {
|
|
235
|
+
// Aggro: BAT_FORM. Reset only GREEN_CHANNELING 13540 (boss_jeklik.cpp:113) — not here.
|
|
236
|
+
onAggro: [
|
|
237
|
+
{ kind: 'cast_self', spellId: 23966, cite: 'boss_jeklik.cpp:58 SPELL_BAT_FORM; :122 DoCastSpellIfCan(m_creature, SPELL_BAT_FORM)' },
|
|
238
|
+
],
|
|
239
|
+
onDeath: [
|
|
240
|
+
{ kind: 'set_instance_data', field: TYPE.JEKLIK, value: INSTANCE_DATA.DONE, cite: 'boss_jeklik.cpp:136-137 JustDied SetData(TYPE_JEKLIK, DONE)' },
|
|
241
|
+
{ kind: 'despawn_guardians', entryId: NPC.BAT_RIDER, cite: 'boss_jeklik.cpp:134,185-195 JustDied DoDespawnBombRiders' },
|
|
242
|
+
{ kind: 'despawn_guardians', entryId: NPC.FRENZIED_BAT, cite: 'boss_jeklik.cpp:148-156 JustSummoned 14965; pull ends on TYPE_JEKLIK DONE' },
|
|
243
|
+
],
|
|
244
|
+
onEvade: [
|
|
245
|
+
{ kind: 'set_instance_data', field: TYPE.JEKLIK, value: INSTANCE_DATA.FAIL, cite: 'boss_jeklik.cpp:144-145 JustReachedHome SetData(FAIL)' },
|
|
246
|
+
{ kind: 'despawn_guardians', entryId: NPC.BAT_RIDER, cite: 'boss_jeklik.cpp:142,185-195 JustReachedHome DoDespawnBombRiders' },
|
|
247
|
+
{ kind: 'despawn_guardians', entryId: NPC.FRENZIED_BAT, cite: 'boss_jeklik.cpp:142 JustReachedHome; owned 14965 leave with the pull' },
|
|
248
|
+
],
|
|
249
|
+
justSummoned: [
|
|
250
|
+
{
|
|
251
|
+
kind: 'cast_self',
|
|
252
|
+
spellId: 23973,
|
|
253
|
+
creatureEntry: NPC.FRENZIED_BAT,
|
|
254
|
+
cite: 'boss_jeklik.cpp:148-152 NPC_FRENZIED_BAT CastSpell SPELL_ROOT_SELF 23973',
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
kind: 'attack_random',
|
|
258
|
+
creatureEntry: NPC.FRENZIED_BAT,
|
|
259
|
+
cite: 'boss_jeklik.cpp:155-156 SelectAttackingTarget(ATTACKING_TARGET_RANDOM, 0) AttackStart',
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
kind: 'cast_self',
|
|
263
|
+
spellId: 23968,
|
|
264
|
+
creatureEntry: NPC.BAT_RIDER,
|
|
265
|
+
cite: 'boss_jeklik.cpp:154-157,234 NPC_BAT_RIDER SPELL_LIQUID_FIRE 23968 (first rider 15s delay is MovePath residual)',
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
},
|
|
269
|
+
cites: [
|
|
270
|
+
'boss_jeklik.cpp:25-330 whole file',
|
|
271
|
+
'creature_spell_list 1451701 / 1451702 (9 rows, 3307/mangos)',
|
|
272
|
+
'boss_jeklik.cpp:216-240 JEKLIK_PHASE_BATS <35% SummonCreature 14750 x2 + SAY_RAIN_FIRE',
|
|
273
|
+
],
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
// Soulflayer — 9 floor spawns whose template lists four spells with no spellList, EventAI or IR, so
|
|
277
|
+
// it cast nothing at all. Both random slots are JustRespawned picks, held for the spawn's whole life.
|
|
278
|
+
export const NPC_SOULFLAYER: ScriptDevIR = {
|
|
279
|
+
name: 'npc_soulflayer',
|
|
280
|
+
boundCreatures: [11359],
|
|
281
|
+
sourceFile: 'eastern_kingdoms/zulgurub/zulgurubScripts.cpp',
|
|
282
|
+
spellIds: [24619, 20543, 22678, 20276, 8269, 28371, 8876],
|
|
283
|
+
timers: [
|
|
284
|
+
// Reset(): m_uiSoulTapTimer = urand(m_uiRandomCcAbilityTimer, 7000), and the CC timer
|
|
285
|
+
// is itself urand(2000, 5000) — so the earliest possible arm is 2 s.
|
|
286
|
+
row('soul_tap', 24619, 'hostile_random', 2000, 7000, 10_000, 15_000, 'zulgurubScripts.cpp:74,90-95 SOUL_TAP urand(ccTimer,7000) then urand(10000,15000), ATTACKING_TARGET_RANDOM ANY_ENEMY'),
|
|
287
|
+
row('lightning_breath', 20543, 'victim', 2000, 9000, 10_000, 15_000, 'zulgurubScripts.cpp:75,99-103 LIGHTNING_BREATH urand(soulTapTimer,9000) then urand(10000,15000), GetVictim'),
|
|
288
|
+
row('random_cc', 22678, 'victim', 2000, 5000, 8000, 10_000, 'zulgurubScripts.cpp:61,112-115 spell_list_cc[urand(0,1)] FEAR 22678 / KNOCKDOWN 20276, urand(2000,5000) then urand(8000,10000)', undefined, {
|
|
289
|
+
pickPerSpawnSpellIds: [22678, 20276],
|
|
290
|
+
}),
|
|
291
|
+
// Two of the three buff picks are a <=30 % HP one-shot; the third (Thrash 8876) is a passive the
|
|
292
|
+
// C++ casts on spawn instead, which is a DIFFERENT slot shape, so it gets its own row below.
|
|
293
|
+
row('random_buff', 8269, 'victim', 1000, 1000, 0, 0, 'zulgurubScripts.cpp:64,122-125 spell_list_buff ENRAGE 8269 / FRENZY 28371 at <=30 % HP, HasAura guard', undefined, {
|
|
294
|
+
hpPctMax: 30,
|
|
295
|
+
oneShot: true,
|
|
296
|
+
castFlags: CAST_FLAG.AURA_NOT_PRESENT,
|
|
297
|
+
pickPerSpawnSpellIds: [8269, 28371],
|
|
298
|
+
}),
|
|
299
|
+
row('thrash_on_spawn', 8876, 'self', 0, 0, 0, 0, 'zulgurubScripts.cpp:66-68,77-78 the THRASH 8876 third of spell_list_buff is cast on spawn, CAST_TRIGGERED | CAST_AURA_NOT_PRESENT', undefined, {
|
|
300
|
+
onReset: true,
|
|
301
|
+
}),
|
|
302
|
+
],
|
|
303
|
+
cites: [
|
|
304
|
+
'zulgurubScripts.cpp:31-131 whole npc_soulflayer',
|
|
305
|
+
'zulgurubScripts.cpp:55-68 JustRespawned makes both random picks ONCE per spawn',
|
|
306
|
+
'zulgurubScripts.cpp:64 spell_list_buff is a THREE-member pool; the port splits it because Thrash is a spawn passive and the other two are an HP one-shot, so each spawn here can wear both where the C++ wears one',
|
|
307
|
+
],
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
// Arlokk — the one ZG boss whose phases are a CLOCK: 30 s troll, then 120 s panther, forever. She
|
|
311
|
+
// is summoned by the Gong of Bethekk, not spawned, so her encounter sits at the summon point.
|
|
312
|
+
export const BOSS_ARLOKK: ScriptDevIR = {
|
|
313
|
+
name: 'boss_arlokk',
|
|
314
|
+
boundCreatures: [NPC.ARLOKK],
|
|
315
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_arlokk.cpp',
|
|
316
|
+
// Mark of Arlokk and Whirlwind pay through 24211 / 15589, resolved off the kit.
|
|
317
|
+
spellIds: [24212, 24210, 12540, 24213, 3391, 24236, 24223, 24190, 24085, 24228, 24235, 20538, 24211, 15589],
|
|
318
|
+
timers: [
|
|
319
|
+
// ---- PHASE 0, the troll priestess: list 1451501 ----
|
|
320
|
+
row('shadow_word_pain', 24212, 'hostile_random', 8000, 8000, 15_000, 15_000, 'creature_spell_list 1451501:0 Shadow Word Pain on Random', 0),
|
|
321
|
+
{
|
|
322
|
+
...row('mark_of_arlokk', 24210, 'hostile_random', 5000, 5000, 30_000, 30_000, 'creature_spell_list 1451501:1 Mark of Arlokk on Random', 0),
|
|
323
|
+
actions: [{
|
|
324
|
+
kind: 'yell',
|
|
325
|
+
textId: -1309012,
|
|
326
|
+
cite: 'boss_arlokk.cpp:204-209 OnSpellCast SPELL_MARK_ARLOKK 24210 DoScriptText(SAY_FEAST_PANTHER, target)',
|
|
327
|
+
}],
|
|
328
|
+
},
|
|
329
|
+
row('gouge', 12540, 'victim', 14_000, 14_000, 17_000, 27_000, 'creature_spell_list 1451501:2 Gouge on Current', 0),
|
|
330
|
+
// ---- PHASE 1, the panther: list 1451502 ----
|
|
331
|
+
// Thrash 3391 is a self-cast extra-attack buff, so it takes 'self' despite the row's Comments.
|
|
332
|
+
row('ravage', 24213, 'victim', 12_000, 12_000, 10_000, 15_000, 'creature_spell_list 1451502:0 Ravage on Current', 1),
|
|
333
|
+
row('thrash_panther', 3391, 'self', 20_000, 20_000, 13_000, 15_000, 'creature_spell_list 1451502:1 Thrash on Current', 1),
|
|
334
|
+
row('whirlwind', 24236, 'self', 15_000, 15_000, 17_000, 27_000, 'creature_spell_list 1451502:2 Whirlwind on None', 1),
|
|
335
|
+
{
|
|
336
|
+
...row('vanish', 24223, 'self', 5000, 10_000, 85_000, 85_000, 'creature_spell_list 1451502:3 Vanish on None', 1),
|
|
337
|
+
actions: [
|
|
338
|
+
{ kind: 'cast_self', spellId: 24228, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_arlokk.cpp:277 ArlokkVanish SPELL_VANISH_TELEPORT 24228 TRIGGERED' },
|
|
339
|
+
{ kind: 'cast_self', spellId: 24235, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_arlokk.cpp:278 ArlokkVanish SPELL_SUPER_INVIS 24235 TRIGGERED' },
|
|
340
|
+
{ kind: 'reset_threat', cite: 'boss_arlokk.cpp:166 ReceiveAIEvent CUSTOM_A DoResetThreat' },
|
|
341
|
+
{ kind: 'set_combat_movement', enabled: false, cite: 'boss_arlokk.cpp:167-168 SetCombatScriptStatus(true) SetMeleeEnabled(false); :86 SetCombatMovement(false)' },
|
|
342
|
+
{ kind: 'arm_timer', timerId: 'invis_select', delayMs: 10_000, cite: 'boss_arlokk.cpp:169 ResetTimer(ARLOKK_INVIS_SELECT, 10000)' },
|
|
343
|
+
{ kind: 'arm_timer', timerId: 'invis_reappear', delayMs: 50_000, cite: 'boss_arlokk.cpp:170 ResetTimer(ARLOKK_INVIS_TIMER, 50000)' },
|
|
344
|
+
],
|
|
345
|
+
},
|
|
346
|
+
{
|
|
347
|
+
id: 'invis_select',
|
|
348
|
+
spellId: 20538,
|
|
349
|
+
initialMinMs: 0,
|
|
350
|
+
initialMaxMs: 0,
|
|
351
|
+
repeatMinMs: 0,
|
|
352
|
+
repeatMaxMs: 0,
|
|
353
|
+
target: 'self',
|
|
354
|
+
phase: 1,
|
|
355
|
+
startDisabled: true,
|
|
356
|
+
oneShot: true,
|
|
357
|
+
cite: 'boss_arlokk.cpp:77-83 ARLOKK_INVIS_SELECT AttackStart random player; 20538 is HATE_TO_ZERO dummy (already the panther reset_threat stand-in)',
|
|
358
|
+
actions: [{
|
|
359
|
+
kind: 'chase_focus',
|
|
360
|
+
threat: 1_000_000,
|
|
361
|
+
cite: 'boss_arlokk.cpp:80-83 SelectAttackingTarget RANDOM PLAYER AttackStart; SetCombatMovement(false)',
|
|
362
|
+
}],
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
id: 'invis_reappear',
|
|
366
|
+
spellId: 24235,
|
|
367
|
+
initialMinMs: 0,
|
|
368
|
+
initialMaxMs: 0,
|
|
369
|
+
repeatMinMs: 0,
|
|
370
|
+
repeatMaxMs: 0,
|
|
371
|
+
target: 'self',
|
|
372
|
+
phase: 1,
|
|
373
|
+
startDisabled: true,
|
|
374
|
+
oneShot: true,
|
|
375
|
+
cite: 'boss_arlokk.cpp:84-90 ARLOKK_INVIS_TIMER RemoveAurasDueToSpell(SPELL_SUPER_INVIS) resume combat',
|
|
376
|
+
actions: [
|
|
377
|
+
{ kind: 'remove_auras', spellId: 24235, cite: 'boss_arlokk.cpp:86 RemoveAurasDueToSpell(SPELL_SUPER_INVIS 24235)' },
|
|
378
|
+
{ kind: 'set_combat_movement', enabled: true, cite: 'boss_arlokk.cpp:87-89 SetCombatScriptStatus(false) SetCombatMovement(true) SetMeleeEnabled(true)' },
|
|
379
|
+
],
|
|
380
|
+
},
|
|
381
|
+
],
|
|
382
|
+
timedPhases: [
|
|
383
|
+
{
|
|
384
|
+
id: 'panther',
|
|
385
|
+
phase: 1,
|
|
386
|
+
afterMs: 30_000,
|
|
387
|
+
next: 'troll',
|
|
388
|
+
actions: [
|
|
389
|
+
{ kind: 'cast_self', spellId: 24190, cite: 'boss_arlokk.cpp:193 DoCastSpellIfCan(nullptr, SPELL_PANTHER_TRANSFORM)' },
|
|
390
|
+
{ kind: 'reset_threat', cite: 'boss_arlokk.cpp:195 CastSpell(SPELL_HATE_TO_ZERO 20538) - dummy, effects=[] in bake; DoResetThreat class' },
|
|
391
|
+
{ kind: 'flavor', text: 'drops to all fours as a panther.', cite: 'boss_arlokk.cpp:191-200 troll->panther branch' },
|
|
392
|
+
],
|
|
393
|
+
cite: 'boss_arlokk.cpp:76 AddCombatAction(ARLOKK_PHASE_TRANSITION, 30000); :196 ResetCombatAction(action, 120000)',
|
|
394
|
+
},
|
|
395
|
+
{
|
|
396
|
+
id: 'troll',
|
|
397
|
+
phase: 0,
|
|
398
|
+
afterMs: 120_000,
|
|
399
|
+
next: 'panther',
|
|
400
|
+
actions: [
|
|
401
|
+
{ kind: 'cast_self', spellId: 24085, cite: 'boss_arlokk.cpp:183 DoCastSpellIfCan(nullptr, SPELL_TRANSFORM_VISUAL)' },
|
|
402
|
+
{ kind: 'remove_auras', spellId: 24190, cite: 'boss_arlokk.cpp:185 RemoveAurasDueToSpell(SPELL_PANTHER_TRANSFORM)' },
|
|
403
|
+
{ kind: 'flavor', text: 'stands up, a troll again.', cite: 'boss_arlokk.cpp:180-190 panther->troll branch' },
|
|
404
|
+
],
|
|
405
|
+
cite: 'boss_arlokk.cpp:186 ResetCombatAction(action, 30000) - the troll half of the ring',
|
|
406
|
+
},
|
|
407
|
+
],
|
|
408
|
+
lifecycle: {
|
|
409
|
+
onAggro: [
|
|
410
|
+
{ kind: 'yell', textId: -1309011, cite: 'boss_arlokk.cpp:114 DoScriptText(SAY_AGGRO)' },
|
|
411
|
+
],
|
|
412
|
+
onDeath: [
|
|
413
|
+
{ kind: 'yell', textId: -1309013, cite: 'boss_arlokk.cpp:140 DoScriptText(SAY_DEATH)' },
|
|
414
|
+
{ kind: 'set_instance_data', field: TYPE.ARLOKK, value: INSTANCE_DATA.DONE, cite: 'boss_arlokk.cpp:148 SetData(TYPE_ARLOKK, DONE)' },
|
|
415
|
+
],
|
|
416
|
+
onEvade: [
|
|
417
|
+
{ kind: 'set_instance_data', field: TYPE.ARLOKK, value: INSTANCE_DATA.FAIL, cite: 'boss_arlokk.cpp:127 JustReachedHome SetData(TYPE_ARLOKK, FAIL)' },
|
|
418
|
+
],
|
|
419
|
+
},
|
|
420
|
+
// 24247 durationIndex 21 = until cancelled (RemoveAuras on death/evade :152-162).
|
|
421
|
+
// Two waves because host.ts:663-668 disarms a wave when the clock leaves its phase.
|
|
422
|
+
summonWaves: [
|
|
423
|
+
{
|
|
424
|
+
id: 'prowlers_troll',
|
|
425
|
+
creatureEntry: NPC.ZULIAN_PROWLER,
|
|
426
|
+
perTick: 2,
|
|
427
|
+
armDelayMs: 0,
|
|
428
|
+
firstTickMinMs: 5000,
|
|
429
|
+
firstTickMaxMs: 5000,
|
|
430
|
+
tickMinMs: 5000,
|
|
431
|
+
tickMaxMs: 5000,
|
|
432
|
+
firstWaveCount: 200,
|
|
433
|
+
waveMinCount: 0,
|
|
434
|
+
waveMaxCount: 0,
|
|
435
|
+
gapBaseMs: 3_600_000,
|
|
436
|
+
gapPerSummonFirstMs: 0,
|
|
437
|
+
gapPerSummonMs: 0,
|
|
438
|
+
phase: 0,
|
|
439
|
+
cite: 'boss_arlokk.cpp:116-122 two triggers 24247; spell-data 24247 tickMs 5000 trigger 24246 miscValue 15101',
|
|
440
|
+
},
|
|
441
|
+
{
|
|
442
|
+
id: 'prowlers_panther',
|
|
443
|
+
creatureEntry: NPC.ZULIAN_PROWLER,
|
|
444
|
+
perTick: 2,
|
|
445
|
+
armDelayMs: 0,
|
|
446
|
+
firstTickMinMs: 5000,
|
|
447
|
+
firstTickMaxMs: 5000,
|
|
448
|
+
tickMinMs: 5000,
|
|
449
|
+
tickMaxMs: 5000,
|
|
450
|
+
firstWaveCount: 200,
|
|
451
|
+
waveMinCount: 0,
|
|
452
|
+
waveMaxCount: 0,
|
|
453
|
+
gapBaseMs: 3_600_000,
|
|
454
|
+
gapPerSummonFirstMs: 0,
|
|
455
|
+
gapPerSummonMs: 0,
|
|
456
|
+
phase: 1,
|
|
457
|
+
cite: 'boss_arlokk.cpp:116-122 aura is not phase-gated; host disarms waves on phase leave',
|
|
458
|
+
},
|
|
459
|
+
],
|
|
460
|
+
cites: [
|
|
461
|
+
'boss_arlokk.cpp:36-210 whole boss_arlokkAI',
|
|
462
|
+
'creature_spell_list 1451501 (3 rows) / 1451502 (4 rows), classic-db z2815',
|
|
463
|
+
'boss_arlokk.cpp:195 SPELL_HATE_TO_ZERO 20538 rides the panther transform - reset_threat (20538 dummy, bake effects=[])',
|
|
464
|
+
'boss_arlokk.cpp:273-287 ArlokkVanish spell script (self-send CUSTOM_A) + :164-174 ReceiveAIEvent 10s re-select / 50s reappear',
|
|
465
|
+
'boss_arlokk.cpp:112-123,152-162 two panther triggers 24247 → NPC 15101 every 5s',
|
|
466
|
+
'boss_arlokk.cpp:204-209 OnSpellCast SPELL_MARK_ARLOKK 24210 SAY_FEAST_PANTHER -1309012',
|
|
467
|
+
],
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
// Thekal — a fake death via SetDeathPrevention, then the tiger PHASE_2 list swap. The ress is 10 s,
|
|
471
|
+
// or 1 s when both zealots are SPECIAL. Cite: boss_thekal.cpp:266-296; lists 1450901/1450902.
|
|
472
|
+
export const BOSS_THEKAL: ScriptDevIR = {
|
|
473
|
+
name: 'boss_thekal',
|
|
474
|
+
boundCreatures: [NPC.THEKAL],
|
|
475
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_thekal.cpp',
|
|
476
|
+
spellIds: [22859, 24185, 22666, 24408, 23128, 24189, 24192, 24183, 24169, 8269, 24173, 24171, 19951],
|
|
477
|
+
timers: [
|
|
478
|
+
// ---- PHASE 0 troll priest: list 1450901 ----
|
|
479
|
+
row('mortal_cleave', 22859, 'victim', 4000, 4000, 15_000, 20_000, 'creature_spell_list 1450901:0 Mortal Cleave on Current', 0),
|
|
480
|
+
// TargetId 6 = FRIENDLY_MISSING_BUFF_NO_SELF — self when solo (azshara Siren pattern).
|
|
481
|
+
row('bloodlust', 24185, 'self', 10_000, 15_000, 20_000, 30_000, 'creature_spell_list 1450901:1 Bloodlust on Friendly Missing Buff no self', 0),
|
|
482
|
+
row('silence', 22666, 'hostile_random', 9000, 9000, 20_000, 25_000, 'creature_spell_list 1450901:2 Silence on Random Casting (TargetId 102)', 0),
|
|
483
|
+
// ---- PHASE 1 tiger: list 1450902 ----
|
|
484
|
+
row('charge_tiger', 24408, 'hostile_random', 12_000, 12_000, 15_000, 22_000, 'creature_spell_list 1450902:0 Charge on Random', 1),
|
|
485
|
+
row('frenzy', 23128, 'self', 30_000, 30_000, 30_000, 30_000, 'creature_spell_list 1450902:1 Frenzy on None', 1),
|
|
486
|
+
row('force_punch', 24189, 'self', 4000, 4000, 16_000, 21_000, 'creature_spell_list 1450902:2 Force Punch on None', 1),
|
|
487
|
+
row('speed_slash', 24192, 'self', 15_000, 20_000, 20_000, 25_000, 'creature_spell_list 1450902:3 Speed Slash on None', 1),
|
|
488
|
+
row('summon_tigers', 24183, 'self', 25_000, 25_000, 50_000, 50_000, 'creature_spell_list 1450902:4 Summon Zulian Guardians on None', 1),
|
|
489
|
+
// Timerless THEKAL_TIGER_ENRAGE at <11 % once (cpp:309-316).
|
|
490
|
+
{
|
|
491
|
+
id: 'tiger_enrage',
|
|
492
|
+
spellId: 8269,
|
|
493
|
+
initialMinMs: 0,
|
|
494
|
+
initialMaxMs: 0,
|
|
495
|
+
repeatMinMs: 3_600_000,
|
|
496
|
+
repeatMaxMs: 3_600_000,
|
|
497
|
+
target: 'self',
|
|
498
|
+
phase: 1,
|
|
499
|
+
hpPctMax: 11,
|
|
500
|
+
cite: 'boss_thekal.cpp:309-316 THEKAL_TIGER_ENRAGE GetHealthPercent() < 11.f SPELL_ENRAGE 8269 once',
|
|
501
|
+
},
|
|
502
|
+
{
|
|
503
|
+
id: 'thekal_ress',
|
|
504
|
+
spellId: 24173,
|
|
505
|
+
initialMinMs: 0,
|
|
506
|
+
initialMaxMs: 0,
|
|
507
|
+
repeatMinMs: 0,
|
|
508
|
+
repeatMaxMs: 0,
|
|
509
|
+
target: 'self',
|
|
510
|
+
startDisabled: true,
|
|
511
|
+
oneShot: true,
|
|
512
|
+
pollOnly: true,
|
|
513
|
+
cite: 'boss_thekal.cpp:171-182 ACTION_RESSURECTION then CanPreventAddsResurrect',
|
|
514
|
+
actions: [
|
|
515
|
+
{ kind: 'cast_self', spellId: 24173, cite: 'boss_thekal.cpp:174 SPELL_RESURRECT 24173' },
|
|
516
|
+
{ kind: 'set_instance_data', field: TYPE.THEKAL, value: INSTANCE_DATA.IN_PROGRESS, cite: 'boss_thekal.cpp:180 SetData(TYPE_THEKAL, IN_PROGRESS)' },
|
|
517
|
+
{
|
|
518
|
+
kind: 'disable_timer',
|
|
519
|
+
timerId: 'zealot_ress',
|
|
520
|
+
creatureEntry: NPC.LORKHAN,
|
|
521
|
+
gate: bothZealotsSpecial,
|
|
522
|
+
cite: 'boss_thekal.cpp:252-256,365-368 PreventRevive DisableTimer Lorkhan',
|
|
523
|
+
},
|
|
524
|
+
{
|
|
525
|
+
kind: 'disable_timer',
|
|
526
|
+
timerId: 'zealot_ress',
|
|
527
|
+
creatureEntry: NPC.ZATH,
|
|
528
|
+
gate: bothZealotsSpecial,
|
|
529
|
+
cite: 'boss_thekal.cpp:257-261,413-416 PreventRevive DisableTimer Zath',
|
|
530
|
+
},
|
|
531
|
+
{
|
|
532
|
+
kind: 'arm_timer',
|
|
533
|
+
timerId: 'thekal_tiger',
|
|
534
|
+
delayMs: 5000,
|
|
535
|
+
gate: bothZealotsSpecial,
|
|
536
|
+
cite: 'boss_thekal.cpp:286-292 OnRevive CanPreventAddsResurrect → 5s tiger',
|
|
537
|
+
},
|
|
538
|
+
{
|
|
539
|
+
kind: 'arm_timer',
|
|
540
|
+
timerId: 'thekal_troll',
|
|
541
|
+
delayMs: 0,
|
|
542
|
+
gate: eitherZealotLive,
|
|
543
|
+
cite: 'boss_thekal.cpp:280-295 OnRevive false → Revive as troll',
|
|
544
|
+
},
|
|
545
|
+
],
|
|
546
|
+
},
|
|
547
|
+
{
|
|
548
|
+
id: 'thekal_tiger',
|
|
549
|
+
spellId: 24169,
|
|
550
|
+
initialMinMs: 0,
|
|
551
|
+
initialMaxMs: 0,
|
|
552
|
+
repeatMinMs: 0,
|
|
553
|
+
repeatMaxMs: 0,
|
|
554
|
+
target: 'self',
|
|
555
|
+
startDisabled: true,
|
|
556
|
+
oneShot: true,
|
|
557
|
+
pollOnly: true,
|
|
558
|
+
cite: 'boss_thekal.cpp:183-194 THEKAL_RESS_PHASE_2_DELAY tiger form',
|
|
559
|
+
actions: [
|
|
560
|
+
{ kind: 'cast_self', spellId: 24171, cite: 'boss_thekal.cpp:290 SPELL_RESSURECTION_IMPACT_VISUAL' },
|
|
561
|
+
{ kind: 'cast_self', spellId: 24169, cite: 'boss_thekal.cpp:185 SPELL_TIGER_FORM 24169' },
|
|
562
|
+
{ kind: 'set_death_prevention', enabled: false, cite: 'boss_thekal.cpp:187 SetDeathPrevention(false)' },
|
|
563
|
+
{ kind: 'set_combat_movement', enabled: true, cite: 'boss_thekal.cpp:190 SetCombatMovement(true, true)' },
|
|
564
|
+
{ kind: 'set_phase', phase: 1, cite: 'boss_thekal.cpp:186,192 PHASE_TIGER SetSpellList(1450902)' },
|
|
565
|
+
{ kind: 'reset_threat', cite: 'boss_thekal.cpp:138 DoResetThreat in Revive' },
|
|
566
|
+
{ kind: 'flavor', text: 'rises as a tiger.', cite: 'boss_thekal.cpp:183-194 PHASE_TIGER' },
|
|
567
|
+
],
|
|
568
|
+
},
|
|
569
|
+
{
|
|
570
|
+
id: 'thekal_troll',
|
|
571
|
+
spellId: 19951,
|
|
572
|
+
initialMinMs: 0,
|
|
573
|
+
initialMaxMs: 0,
|
|
574
|
+
repeatMinMs: 0,
|
|
575
|
+
repeatMaxMs: 0,
|
|
576
|
+
target: 'self',
|
|
577
|
+
startDisabled: true,
|
|
578
|
+
oneShot: true,
|
|
579
|
+
pollOnly: true,
|
|
580
|
+
cite: 'boss_thekal.cpp:125-149 Revive when CanPreventAddsResurrect is false',
|
|
581
|
+
actions: [
|
|
582
|
+
{ kind: 'set_phase', phase: 0, cite: 'boss_thekal.cpp:136 m_uiPhase = PHASE_NORMAL' },
|
|
583
|
+
{ kind: 'set_death_prevention', enabled: true, cite: 'boss_thekal.cpp:146 SetDeathPrevention(true)' },
|
|
584
|
+
{ kind: 'set_combat_movement', enabled: true, cite: 'boss_thekal.cpp:144 SetCombatMovement(true, true)' },
|
|
585
|
+
{ kind: 'reset_threat', cite: 'boss_thekal.cpp:138 DoResetThreat' },
|
|
586
|
+
{ kind: 'flavor', text: 'stands back up.', cite: 'boss_thekal.cpp:125-149 Revive troll' },
|
|
587
|
+
],
|
|
588
|
+
},
|
|
589
|
+
],
|
|
590
|
+
lifecycle: {
|
|
591
|
+
onReset: [
|
|
592
|
+
{ kind: 'set_death_prevention', enabled: true, cite: 'boss_thekal.cpp:83,91 ctor/Reset SetDeathPrevention(true)' },
|
|
593
|
+
],
|
|
594
|
+
onAggro: [
|
|
595
|
+
{ kind: 'yell', textId: -1309009, cite: 'boss_thekal.cpp:213 DoScriptText(SAY_AGGRO)' },
|
|
596
|
+
],
|
|
597
|
+
onPreventedDeath: [
|
|
598
|
+
{ kind: 'set_combat_movement', enabled: false, cite: 'boss_thekal.cpp:117 SetCombatMovement(false)' },
|
|
599
|
+
{ kind: 'set_phase', phase: 2, cite: 'boss_thekal.cpp:120 PHASE_FAKE_DEATH' },
|
|
600
|
+
{ kind: 'cast_self', spellId: 19951, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_thekal.cpp:115 SPELL_PACIFY_SELF 19951 CAST_TRIGGERED' },
|
|
601
|
+
{ kind: 'set_instance_data', field: TYPE.THEKAL, value: INSTANCE_DATA.SPECIAL, cite: 'boss_thekal.cpp:272 SetData(TYPE_THEKAL, SPECIAL)' },
|
|
602
|
+
{ kind: 'arm_timer', timerId: 'thekal_ress', delayMs: 10_000, cite: 'boss_thekal.cpp:268 ResetTimer(ACTION_RESSURECTION, 10000)' },
|
|
603
|
+
{
|
|
604
|
+
kind: 'arm_timer',
|
|
605
|
+
timerId: 'thekal_ress',
|
|
606
|
+
delayMs: 1000,
|
|
607
|
+
gate: bothZealotsSpecial,
|
|
608
|
+
cite: 'boss_thekal.cpp:275-276 CanPreventAddsResurrect → ResetTimer 1000',
|
|
609
|
+
},
|
|
610
|
+
],
|
|
611
|
+
onDeath: [
|
|
612
|
+
{ kind: 'yell', textId: -1309010, cite: 'boss_thekal.cpp:218 DoScriptText(SAY_DEATH)' },
|
|
613
|
+
{ kind: 'set_instance_data', field: TYPE.THEKAL, value: INSTANCE_DATA.DONE, cite: 'boss_thekal.cpp:223 SetData(TYPE_THEKAL, DONE)' },
|
|
614
|
+
],
|
|
615
|
+
onEvade: [
|
|
616
|
+
{ kind: 'set_instance_data', field: TYPE.THEKAL, value: INSTANCE_DATA.FAIL, cite: 'boss_thekal.cpp:241 JustReachedHome SetData(FAIL)' },
|
|
617
|
+
],
|
|
618
|
+
},
|
|
619
|
+
cites: [
|
|
620
|
+
'boss_thekal.cpp:1-449 whole file (boss + zealots + ThekalResurrect)',
|
|
621
|
+
'creature_spell_list 1450901 (3 rows) / 1450902 (5 rows), classic-db z2815',
|
|
622
|
+
'boss_thekal.cpp:102-123,266-296 JustPreventedDeath 10s ress / 1s if both zealots SPECIAL then 5s tiger',
|
|
623
|
+
'boss_thekal.cpp:245-264,330,381 CanPreventAddsResurrect PreventRevive on both zealots',
|
|
624
|
+
],
|
|
625
|
+
};
|
|
626
|
+
|
|
627
|
+
// Mar'li — a 60 s troll⇄spider ring. The list ids come from the DB dump, not the Venoxis typo at
|
|
628
|
+
// cpp:56-57: creature_template.SpellList is 1451001 and the phase-2 rows are under 1451002.
|
|
629
|
+
export const BOSS_MARLI: ScriptDevIR = {
|
|
630
|
+
name: 'boss_marli',
|
|
631
|
+
boundCreatures: [NPC.MARLI],
|
|
632
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_marli.cpp',
|
|
633
|
+
spellIds: [24099, 24300, 24082, 24109, 3391, 24110, 24111, 24112, 24084, 24085, 24083, 22911],
|
|
634
|
+
timers: [
|
|
635
|
+
// ---- PHASE 0 troll: list 1451001 ----
|
|
636
|
+
row('poison_volley', 24099, 'self', 15_000, 15_000, 10_000, 20_000, 'creature_spell_list 1451001:0 Poison Volley on None', 0),
|
|
637
|
+
row('drain_life', 24300, 'hostile_random', 30_000, 30_000, 20_000, 50_000, 'creature_spell_list 1451001:1 Drain Life on Random', 0),
|
|
638
|
+
row('spider_egg', 24082, 'self', 55_000, 55_000, 60_000, 60_000, 'creature_spell_list 1451001:2 Spider Egg on None', 0),
|
|
639
|
+
row('enlarge', 24109, 'self', 10_000, 20_000, 20_000, 40_000, 'creature_spell_list 1451001:3 Enlarge on Friendly missing buff no Self (TargetId 6)', 0),
|
|
640
|
+
row('thrash_troll', 3391, 'self', 4000, 6000, 10_000, 20_000, 'creature_spell_list 1451001:4 Thrash on Current', 0),
|
|
641
|
+
// ---- PHASE 1 spider: list 1451002 ----
|
|
642
|
+
{
|
|
643
|
+
...row('enveloping_webs', 24110, 'self', 5000, 5000, 15_000, 20_000, 'creature_spell_list 1451002:0 Enveloping Webs on None', 1),
|
|
644
|
+
// CAST_OK stands in for SpellHitTarget (Mandokir charge / Buru shape).
|
|
645
|
+
actions: [
|
|
646
|
+
{
|
|
647
|
+
kind: 'arm_timer',
|
|
648
|
+
timerId: 'charge',
|
|
649
|
+
delayMs: 1000,
|
|
650
|
+
cite: 'boss_marli.cpp:101-105 SpellHitTarget ENVELOPING_WEBS → ResetCombatAction(MARLI_CHARGE, 1000)',
|
|
651
|
+
},
|
|
652
|
+
],
|
|
653
|
+
},
|
|
654
|
+
row('corrosive_poison', 24111, 'hostile_random', 1000, 1000, 25_000, 35_000, 'creature_spell_list 1451002:1 Corrosive Poison on Random', 1),
|
|
655
|
+
row('poison_shock', 24112, 'hostile_random', 5000, 10_000, 10_000, 15_000, 'creature_spell_list 1451002:2 Poison Shock on Random', 1),
|
|
656
|
+
row('thrash_spider', 3391, 'self', 4000, 6000, 10_000, 20_000, 'creature_spell_list 1451002:3 Thrash on Current', 1),
|
|
657
|
+
// MARLI_CHARGE — disabled until webs arm it; one-shot DisableCombatAction after cast.
|
|
658
|
+
{
|
|
659
|
+
id: 'charge',
|
|
660
|
+
spellId: 22911,
|
|
661
|
+
initialMinMs: 0,
|
|
662
|
+
initialMaxMs: 0,
|
|
663
|
+
repeatMinMs: 0,
|
|
664
|
+
repeatMaxMs: 0,
|
|
665
|
+
target: 'hostile_random_player',
|
|
666
|
+
startDisabled: true,
|
|
667
|
+
oneShot: true,
|
|
668
|
+
cite: 'boss_marli.cpp:72 AddCombatAction(MARLI_CHARGE, true); :143-146 SelectAttackingTarget RANDOM PLAYER + DisableCombatAction',
|
|
669
|
+
},
|
|
670
|
+
],
|
|
671
|
+
timedPhases: [
|
|
672
|
+
{
|
|
673
|
+
id: 'spider',
|
|
674
|
+
phase: 1,
|
|
675
|
+
afterMs: 60_000,
|
|
676
|
+
next: 'troll',
|
|
677
|
+
actions: [
|
|
678
|
+
{ kind: 'cast_self', spellId: 24084, cite: 'boss_marli.cpp:122 DoCastSpellIfCan SPELL_SPIDER_FORM' },
|
|
679
|
+
{ kind: 'reset_threat', cite: 'boss_marli.cpp:125 DoResetThreat' },
|
|
680
|
+
{ kind: 'yell', textId: -1309006, cite: 'boss_marli.cpp:124 DoScriptText(SAY_TRANSFORM)' },
|
|
681
|
+
{ kind: 'flavor', text: 'takes spider form.', cite: 'boss_marli.cpp:119-128 m_phaseTwo=true SetSpellList(PHASE_2)' },
|
|
682
|
+
],
|
|
683
|
+
cite: 'boss_marli.cpp:71 AddCombatAction(MARLI_PHASE_CHANGE, 60000); :126 ResetCombatAction 60000',
|
|
684
|
+
},
|
|
685
|
+
{
|
|
686
|
+
id: 'troll',
|
|
687
|
+
phase: 0,
|
|
688
|
+
afterMs: 60_000,
|
|
689
|
+
next: 'spider',
|
|
690
|
+
actions: [
|
|
691
|
+
{ kind: 'cast_self', spellId: 24085, cite: 'boss_marli.cpp:133 DoCastSpellIfCan SPELL_TRANSFORM_BACK' },
|
|
692
|
+
{ kind: 'remove_auras', spellId: 24084, cite: 'boss_marli.cpp:136 RemoveAurasDueToSpell(SPELL_SPIDER_FORM)' },
|
|
693
|
+
{ kind: 'yell', textId: -1309025, cite: 'boss_marli.cpp:135 DoScriptText(SAY_TRANSFORM_BACK)' },
|
|
694
|
+
{ kind: 'flavor', text: 'returns to troll form.', cite: 'boss_marli.cpp:132-140 m_phaseTwo=false SetSpellList(PHASE_1)' },
|
|
695
|
+
],
|
|
696
|
+
cite: 'boss_marli.cpp:137 ResetCombatAction(action, 60000) - troll half of the ring',
|
|
697
|
+
},
|
|
698
|
+
],
|
|
699
|
+
lifecycle: {
|
|
700
|
+
onAggro: [
|
|
701
|
+
{ kind: 'yell', textId: -1309005, cite: 'boss_marli.cpp:88 DoScriptText(SAY_AGGRO)' },
|
|
702
|
+
{ kind: 'cast_self', spellId: 24083, cite: 'boss_marli.cpp:90 DoCastSpellIfCan SPELL_HATCH_EGGS' },
|
|
703
|
+
],
|
|
704
|
+
onDeath: [
|
|
705
|
+
{ kind: 'yell', textId: -1309008, cite: 'boss_marli.cpp:95 DoScriptText(SAY_DEATH)' },
|
|
706
|
+
{ kind: 'set_instance_data', field: TYPE.MARLI, value: INSTANCE_DATA.DONE, cite: 'boss_marli.cpp:98 SetData(TYPE_MARLI, DONE)' },
|
|
707
|
+
],
|
|
708
|
+
onEvade: [
|
|
709
|
+
{ kind: 'set_instance_data', field: TYPE.MARLI, value: INSTANCE_DATA.FAIL, cite: 'boss_marli.cpp:110 JustReachedHome SetData(FAIL)' },
|
|
710
|
+
],
|
|
711
|
+
},
|
|
712
|
+
cites: [
|
|
713
|
+
'boss_marli.cpp:1-158 whole file',
|
|
714
|
+
'creature_spell_list 1451001 (5 rows) / 1451002 (4 rows), Full_DB ClassicDB_1_12_1_z2815 — NOT cpp typo 1450701/1450702',
|
|
715
|
+
'boss_marli.cpp:101-105 SpellHitTarget ENVELOPING_WEBS → ResetCombatAction(MARLI_CHARGE, 1000); :143-146 cast 22911 + DisableCombatAction',
|
|
716
|
+
],
|
|
717
|
+
};
|
|
718
|
+
|
|
719
|
+
// Mandokir — list 1138201 is the combat kit; C++ owns Ohgan enrage, spirits, raptor, gaze AI. TYPE_OHGAN
|
|
720
|
+
// (zulgurub.h:18) — do not renumber. boss_mandokir.cpp:72-93 aSpirits[] — x,y only (no z/o on this engine).
|
|
721
|
+
const MANDOKIR_SPIRIT_POS: ReadonlyArray<{ x: number; y: number }> = [
|
|
722
|
+
{ x: -12150.9, y: -1956.24 },
|
|
723
|
+
{ x: -12157.1, y: -1972.78 },
|
|
724
|
+
{ x: -12172.3, y: -1982.63 },
|
|
725
|
+
{ x: -12194.0, y: -1979.54 },
|
|
726
|
+
{ x: -12211.3, y: -1978.49 },
|
|
727
|
+
{ x: -12228.4, y: -1977.10 },
|
|
728
|
+
{ x: -12250.0, y: -1964.78 },
|
|
729
|
+
{ x: -12264.0, y: -1953.08 },
|
|
730
|
+
{ x: -12289.0, y: -1924.00 },
|
|
731
|
+
{ x: -12267.3, y: -1902.26 },
|
|
732
|
+
{ x: -12255.3, y: -1893.53 },
|
|
733
|
+
{ x: -12229.9, y: -1891.39 },
|
|
734
|
+
{ x: -12215.9, y: -1889.09 },
|
|
735
|
+
{ x: -12200.5, y: -1890.69 },
|
|
736
|
+
{ x: -12186.0, y: -1890.12 },
|
|
737
|
+
{ x: -12246.3, y: -1890.09 },
|
|
738
|
+
{ x: -12170.7, y: -1894.85 },
|
|
739
|
+
{ x: -12279.0, y: -1931.92 },
|
|
740
|
+
{ x: -12266.1, y: -1940.72 },
|
|
741
|
+
];
|
|
742
|
+
|
|
743
|
+
export const BOSS_MANDOKIR: ScriptDevIR = {
|
|
744
|
+
name: 'boss_mandokir',
|
|
745
|
+
boundCreatures: [NPC.MANDOKIR],
|
|
746
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_mandokir.cpp',
|
|
747
|
+
// Whirlwind 13736 pays through 15589; a trigger payload resolves off the kit.
|
|
748
|
+
spellIds: [24314, 24408, 16856, 13736, 19134, 24407, 24349, 23537, 24342, 24312, 24341, 24315, 25104, 15589, 9204],
|
|
749
|
+
timers: [
|
|
750
|
+
{
|
|
751
|
+
...row('threatening_gaze', 24314, 'hostile_random', 30_000, 35_000, 20_000, 25_000, 'creature_spell_list 1138201:0 Threatening Gaze on Random'),
|
|
752
|
+
actions: [
|
|
753
|
+
{ kind: 'yell', textId: -1309018, cite: 'boss_mandokir.cpp:167 DoScriptText(SAY_WATCH, invoker)' },
|
|
754
|
+
{ kind: 'yell', textId: -1309019, cite: 'boss_mandokir.cpp:168 DoScriptText(SAY_WATCH_WHISPER, invoker)' },
|
|
755
|
+
{ kind: 'store_threat', cite: 'boss_mandokir.cpp:169 m_targetThreat = getThreat(invoker)' },
|
|
756
|
+
{ kind: 'arm_timer', timerId: 'gaze_charge', delayMs: 6000, cite: 'SpellDuration index 32 → 6000ms; ThreateningGaze OnApply false' },
|
|
757
|
+
],
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
...row('charge', 24408, 'hostile_random', 25_000, 30_000, 25_000, 35_000, 'creature_spell_list 1138201:1 Charge on Random'),
|
|
761
|
+
actions: [
|
|
762
|
+
{ kind: 'reset_threat', cite: 'boss_mandokir.cpp:157-160 SpellHitTarget SPELL_CHARGE → DoResetThreat' },
|
|
763
|
+
],
|
|
764
|
+
},
|
|
765
|
+
row('mortal_strike', 16856, 'victim', 5000, 10_000, 15_000, 15_000, 'creature_spell_list 1138201:2 Mortal Strike on Current'),
|
|
766
|
+
row('whirlwind', 13736, 'victim', 20_000, 20_000, 20_000, 20_000, 'creature_spell_list 1138201:3 Whirlwind on Current'),
|
|
767
|
+
row('intimidating_shout', 19134, 'self', 10_000, 15_000, 20_000, 25_000, 'creature_spell_list 1138201:4 Intimidating Shout on None (MODIFIED FOR CLASSIC)'),
|
|
768
|
+
row('overpower', 24407, 'victim', 5000, 10_000, 15_000, 15_000, 'creature_spell_list 1138201:5 Overpower on Current'),
|
|
769
|
+
{
|
|
770
|
+
id: 'gaze_charge',
|
|
771
|
+
spellId: 24315,
|
|
772
|
+
initialMinMs: 0,
|
|
773
|
+
initialMaxMs: 0,
|
|
774
|
+
repeatMinMs: 0,
|
|
775
|
+
repeatMaxMs: 0,
|
|
776
|
+
target: 'self',
|
|
777
|
+
startDisabled: true,
|
|
778
|
+
oneShot: true,
|
|
779
|
+
pollOnly: true,
|
|
780
|
+
cite: 'boss_mandokir.cpp:171-182 CUSTOM_B 6s later charge if threat rose',
|
|
781
|
+
actions: [
|
|
782
|
+
{ kind: 'charge_if_threat_up', spellId: 24315, cite: 'boss_mandokir.cpp:176-181 SPELL_CHARGE_GAZE 24315' },
|
|
783
|
+
],
|
|
784
|
+
},
|
|
785
|
+
],
|
|
786
|
+
lifecycle: {
|
|
787
|
+
onAggro: [
|
|
788
|
+
{ kind: 'yell', textId: -1309015, cite: 'boss_mandokir.cpp:124 DoScriptText(SAY_AGGRO)' },
|
|
789
|
+
{ kind: 'set_instance_data', field: TYPE.OHGAN, value: INSTANCE_DATA.IN_PROGRESS, cite: 'boss_mandokir.cpp:136 SetData(TYPE_OHGAN, IN_PROGRESS)' },
|
|
790
|
+
...MANDOKIR_SPIRIT_POS.map((p, i) => ({
|
|
791
|
+
kind: 'summon_count' as const,
|
|
792
|
+
creatureEntry: NPC.CHAINED_SPIRIT,
|
|
793
|
+
count: 1,
|
|
794
|
+
x: p.x,
|
|
795
|
+
y: p.y,
|
|
796
|
+
cite: `boss_mandokir.cpp:${74 + i} aSpirits[${i}] NPC 15117`,
|
|
797
|
+
})),
|
|
798
|
+
{ kind: 'cast_self', spellId: 24349, cite: 'boss_mandokir.cpp:133 SPELL_SUMMON_BLOODLORDS_RAPTOR' },
|
|
799
|
+
],
|
|
800
|
+
onDeath: [
|
|
801
|
+
{ kind: 'set_instance_data', field: TYPE.OHGAN, value: INSTANCE_DATA.DONE, cite: 'boss_mandokir.cpp:152 SetData(TYPE_OHGAN, DONE)' },
|
|
802
|
+
{ kind: 'cast_self', spellId: 24342, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_mandokir.cpp:154 SPELL_DESPAWN_CHAINED_SPIRITS' },
|
|
803
|
+
],
|
|
804
|
+
onEvade: [
|
|
805
|
+
{ kind: 'set_instance_data', field: TYPE.OHGAN, value: INSTANCE_DATA.FAIL, cite: 'boss_mandokir.cpp:142 SetData(TYPE_OHGAN, FAIL)' },
|
|
806
|
+
{ kind: 'cast_self', spellId: 24342, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_mandokir.cpp:144 SPELL_DESPAWN_CHAINED_SPIRITS' },
|
|
807
|
+
],
|
|
808
|
+
// KilledUnit: the nearest Chained Spirit hauls the dead raider back up. This lived as a
|
|
809
|
+
// hardcoded `entry === 11382` branch in eventAi.ts, which is why Ohgan's copy never had it.
|
|
810
|
+
onKill: [{
|
|
811
|
+
kind: 'proxy_cast_on_victim',
|
|
812
|
+
casterEntry: NPC.CHAINED_SPIRIT,
|
|
813
|
+
spellId: SPELL_MANDOKIR_REVIVE,
|
|
814
|
+
radiusYd: 50,
|
|
815
|
+
cite: 'boss_mandokir.cpp:206-212 KilledUnit -> GetClosestCreatureWithEntry(victim, NPC_CHAINED_SPIRIT 15117, 50.0f) -> CastSpell(victim, SPELL_REVIVE 24341)',
|
|
816
|
+
}],
|
|
817
|
+
},
|
|
818
|
+
addDeaths: [
|
|
819
|
+
{
|
|
820
|
+
creatureEntries: [NPC.OHGAN_RAPTOR],
|
|
821
|
+
atKilled: 1,
|
|
822
|
+
total: 1,
|
|
823
|
+
actions: [
|
|
824
|
+
{ kind: 'cast_self', spellId: 23537, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_mandokir.cpp:230 DoCastSpellIfCan SPELL_ENRAGE CAST_TRIGGERED' },
|
|
825
|
+
{ kind: 'yell', textId: -1309024, cite: 'boss_mandokir.cpp:231 DoScriptText(EMOTE_RAGE)' },
|
|
826
|
+
],
|
|
827
|
+
cite: 'boss_mandokir.cpp:226-232 SummonedCreatureJustDied NPC_OHGAN',
|
|
828
|
+
},
|
|
829
|
+
],
|
|
830
|
+
cites: [
|
|
831
|
+
'boss_mandokir.cpp:1-313 whole file (boss + Ohgan + ThreateningGaze + DespawnChainedSpirits)',
|
|
832
|
+
'creature_spell_list 1138201 (6 rows), classic-db z2815',
|
|
833
|
+
'boss_mandokir.cpp:163-183 ThreateningGaze CUSTOM_A store threat + CUSTOM_B charge 24315 if threat rose (durationIndex 32 = 6000ms)',
|
|
834
|
+
'boss_mandokir.cpp:186-204 KilledUnit ding/level-up 24312 every 3 player kills (eventAi.ts special case)',
|
|
835
|
+
'boss_mandokir.cpp:206-212 KilledUnit spirit 24341 revive via proxy_cast_on_victim on onKill',
|
|
836
|
+
'boss_mandokir.cpp:249-276 mob_ohgan Sunder 24317 - separate ScriptName mob_ohgan, bake thrash only',
|
|
837
|
+
],
|
|
838
|
+
};
|
|
839
|
+
|
|
840
|
+
// Hakkar — no TYPE slot (PLAN §5 / zulgurub.h). MAX_PRIESTS=5 gates power stacks and aspect
|
|
841
|
+
// combatConditions. List 1483401 is the full kit.
|
|
842
|
+
export const BOSS_HAKKAR: ScriptDevIR = {
|
|
843
|
+
name: 'boss_hakkar',
|
|
844
|
+
boundCreatures: [NPC.HAKKAR],
|
|
845
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_hakkar.cpp',
|
|
846
|
+
// Double Attack 19818 pays through 18941; a trigger payload resolves off the kit.
|
|
847
|
+
spellIds: [24324, 24322, 24323, 24321, 24328, 24327, 24178, 24318, 24687, 24688, 24686, 24689, 24690, 19818, 24692, 18941],
|
|
848
|
+
timers: [
|
|
849
|
+
{
|
|
850
|
+
id: 'double_attack',
|
|
851
|
+
spellId: 19818,
|
|
852
|
+
initialMinMs: 0,
|
|
853
|
+
initialMaxMs: 0,
|
|
854
|
+
repeatMinMs: 0,
|
|
855
|
+
repeatMaxMs: 0,
|
|
856
|
+
target: 'self',
|
|
857
|
+
onReset: true,
|
|
858
|
+
castFlags: CAST_FLAG.TRIGGERED | CAST_FLAG.AURA_NOT_PRESENT,
|
|
859
|
+
cite: 'boss_hakkar.cpp:69 DoCastSpellIfCan SPELL_DOUBLE_ATTACK CAST_TRIGGERED|AURA_NOT_PRESENT',
|
|
860
|
+
},
|
|
861
|
+
row('blood_siphon', 24324, 'self', 90_000, 90_000, 90_000, 90_000, 'creature_spell_list 1483401:0 Blood Siphon on None'),
|
|
862
|
+
row('corrupted_blood', 24328, 'hostile_random', 25_000, 25_000, 30_000, 45_000, 'creature_spell_list 1483401:1 Corrupted Blood on Random'),
|
|
863
|
+
// TargetId 7 = CURRENT_NOT_ALONE → victim.
|
|
864
|
+
row('cause_insanity', 24327, 'victim', 17_000, 17_000, 10_000, 15_000, 'creature_spell_list 1483401:2 Cause Insanity on Current (TargetId 7)'),
|
|
865
|
+
row('will_of_hakkar', 24178, 'hostile_random_not_top', 17_000, 17_000, 25_000, 35_000, 'creature_spell_list 1483401:3 Will of Hakkar on Random non tank (TargetId 101)'),
|
|
866
|
+
// Soft enrage at 100 min from the list; hard path clears CD at <5 % (cpp:92-99).
|
|
867
|
+
row('enrage_soft', 24318, 'self', 6_000_000, 6_000_000, 6_000_000, 6_000_000, 'creature_spell_list 1483401:4 Enrage on None'),
|
|
868
|
+
// Aspects: combatCondition 1005-1009 worldStateExpression 2982-2986 (priest NOT DONE).
|
|
869
|
+
// Worldstates are unevaluated; TYPE_* != DONE is the same test InitiateHakkarPowerStacks uses.
|
|
870
|
+
row('aspect_jeklik', 24687, 'self', 4000, 4000, 10_000, 14_000, 'creature_spell_list 1483401:5 Aspect of Jeklik CombatCondition 1007', undefined, { gate: { field: TYPE.JEKLIK, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:13 TYPE_JEKLIK; combat_condition 1007 worldStateExpression 2984' } }),
|
|
871
|
+
row('aspect_venoxis', 24688, 'self', 7000, 7000, 8000, 8000, 'creature_spell_list 1483401:6 Aspect of Venoxis CombatCondition 1006', undefined, { gate: { field: TYPE.VENOXIS, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:14 TYPE_VENOXIS; combat_condition 1006 worldStateExpression 2983' } }),
|
|
872
|
+
row('aspect_marli', 24686, 'victim', 12_000, 12_000, 10_000, 10_000, 'creature_spell_list 1483401:7 Aspect of Marli CombatCondition 1008', undefined, { gate: { field: TYPE.MARLI, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:15 TYPE_MARLI; combat_condition 1008 worldStateExpression 2985' } }),
|
|
873
|
+
row('aspect_thekal', 24689, 'self', 8000, 8000, 15_000, 15_000, 'creature_spell_list 1483401:8 Aspect of Thekal CombatCondition 1009', undefined, { gate: { field: TYPE.THEKAL, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:16 TYPE_THEKAL; combat_condition 1009 worldStateExpression 2986' } }),
|
|
874
|
+
row('aspect_arlokk', 24690, 'victim', 18_000, 18_000, 10_000, 15_000, 'creature_spell_list 1483401:9 Aspect of Arlokk CombatCondition 1005', undefined, { gate: { field: TYPE.ARLOKK, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:17 TYPE_ARLOKK; combat_condition 1005 worldStateExpression 2982' } }),
|
|
875
|
+
],
|
|
876
|
+
phases: [
|
|
877
|
+
{
|
|
878
|
+
phase: 1,
|
|
879
|
+
hpBelowPct: 5,
|
|
880
|
+
actions: [
|
|
881
|
+
{ kind: 'cast_self', spellId: 24318, cite: 'boss_hakkar.cpp:94-98 HAKKAR_ENRAGE_LOW <5% RemoveSpellCooldown(SPELL_ENRAGE) — product casts once' },
|
|
882
|
+
],
|
|
883
|
+
cite: 'boss_hakkar.cpp:92-99 timerless HAKKAR_ENRAGE_LOW at GetHealthPercent() < 5.f',
|
|
884
|
+
},
|
|
885
|
+
],
|
|
886
|
+
lifecycle: {
|
|
887
|
+
onReset: [
|
|
888
|
+
{ kind: 'remove_auras', spellId: 24692, cite: 'boss_hakkar.cpp:82 RemoveAurasDueToSpell(SPELL_HAKKAR_POWER)' },
|
|
889
|
+
// One stack per High Priest still standing, so each unrolled row keeps its own iteration's
|
|
890
|
+
// gate. Kill the wing and Hakkar re-opens weaker; without the gates a wipe hands back all five.
|
|
891
|
+
{ kind: 'cast_self', spellId: 24692, gate: { field: TYPE.JEKLIK, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:13 TYPE_JEKLIK' }, cite: 'boss_hakkar.cpp:83-87 InitiateHakkarPowerStacks; zulgurub.h:11 MAX_PRIESTS=5 -> stack 1/5' },
|
|
892
|
+
{ kind: 'cast_self', spellId: 24692, gate: { field: TYPE.VENOXIS, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:14 TYPE_VENOXIS' }, cite: 'boss_hakkar.cpp:83-87 stack 2/5' },
|
|
893
|
+
{ kind: 'cast_self', spellId: 24692, gate: { field: TYPE.MARLI, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:15 TYPE_MARLI' }, cite: 'boss_hakkar.cpp:83-87 stack 3/5' },
|
|
894
|
+
{ kind: 'cast_self', spellId: 24692, gate: { field: TYPE.THEKAL, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:16 TYPE_THEKAL' }, cite: 'boss_hakkar.cpp:83-87 stack 4/5' },
|
|
895
|
+
{ kind: 'cast_self', spellId: 24692, gate: { field: TYPE.ARLOKK, notEquals: INSTANCE_DATA.DONE, cite: 'zulgurub.h:17 TYPE_ARLOKK' }, cite: 'boss_hakkar.cpp:83-87 stack 5/5' },
|
|
896
|
+
],
|
|
897
|
+
onAggro: [
|
|
898
|
+
{ kind: 'yell', textId: -1309020, cite: 'boss_hakkar.cpp:76 DoScriptText(SAY_AGGRO)' },
|
|
899
|
+
],
|
|
900
|
+
},
|
|
901
|
+
cites: [
|
|
902
|
+
'boss_hakkar.cpp:1-139 whole file',
|
|
903
|
+
'zulgurub.h:11 MAX_PRIESTS=5; :41-42 SPELL_HAKKAR_POWER 24692 / POWER_DOWN 24693; no TYPE_HAKKAR',
|
|
904
|
+
'creature_spell_list 1483401 (10 rows), classic-db z2815',
|
|
905
|
+
'combat_condition 1005-1009 worldStateExpression 2982-2986 → TYPE_* != DONE on aspect timers',
|
|
906
|
+
'zulgurub.cpp:173-183 RemoveHakkarPowerStack on priest DONE - instance script, not this IR',
|
|
907
|
+
'boss_hakkar.cpp:118-127 BloodSiphon 24324 -> 24322 funnel or 24323 if 24321',
|
|
908
|
+
],
|
|
909
|
+
};
|
|
910
|
+
|
|
911
|
+
export const NPC_ZULIAN_PROWLER: ScriptDevIR = {
|
|
912
|
+
name: 'npc_zulian_prowler',
|
|
913
|
+
boundCreatures: [15101],
|
|
914
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_arlokk.cpp',
|
|
915
|
+
spellIds: [],
|
|
916
|
+
timers: [],
|
|
917
|
+
cites: [
|
|
918
|
+
'boss_arlokk.cpp:239-251 JustRespawned MovePoint aArlokkWallShieldPos — movement GAP',
|
|
919
|
+
],
|
|
920
|
+
};
|
|
921
|
+
|
|
922
|
+
export const GO_GONG_OF_BETHEKK: ScriptDevIR = {
|
|
923
|
+
name: 'go_gong_of_bethekk',
|
|
924
|
+
boundCreatures: [],
|
|
925
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_arlokk.cpp',
|
|
926
|
+
spellIds: [],
|
|
927
|
+
timers: [],
|
|
928
|
+
cites: [
|
|
929
|
+
'boss_arlokk.cpp Gong of Bethekk summons Arlokk 14515 (dbscripts_on_event 9066); no combat timer',
|
|
930
|
+
],
|
|
931
|
+
};
|
|
932
|
+
|
|
933
|
+
export const NPC_GURUBASHI_BAT_RIDER: ScriptDevIR = {
|
|
934
|
+
name: 'npc_gurubashi_bat_rider',
|
|
935
|
+
boundCreatures: [NPC.BAT_RIDER],
|
|
936
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_jeklik.cpp',
|
|
937
|
+
// 23971 lays the fire; 23972 Blaze is the trap spell the GO casts, and combat reads the pool's
|
|
938
|
+
// damage and radius off it, so it has to be in the kit too.
|
|
939
|
+
spellIds: [8876, 24024, 23971, 23972],
|
|
940
|
+
timers: [
|
|
941
|
+
{
|
|
942
|
+
id: 'thrash',
|
|
943
|
+
spellId: 8876,
|
|
944
|
+
initialMinMs: 0,
|
|
945
|
+
initialMaxMs: 0,
|
|
946
|
+
repeatMinMs: 0,
|
|
947
|
+
repeatMaxMs: 0,
|
|
948
|
+
target: 'self',
|
|
949
|
+
onReset: true,
|
|
950
|
+
cite: 'boss_jeklik.cpp:287 Reset DoCastSpellIfCan(SPELL_THRASH, CAST_TRIGGERED|CAST_AURA_NOT_PRESENT)',
|
|
951
|
+
},
|
|
952
|
+
{
|
|
953
|
+
// The pot of fire. 23968 is a periodic trigger of 23969, whose script effect casts 23971, but
|
|
954
|
+
// 23969 has no body upstream so the fire never lands. This is the ported chain at 8 s.
|
|
955
|
+
id: 'liquid_fire',
|
|
956
|
+
spellId: 23971,
|
|
957
|
+
initialMinMs: 8000,
|
|
958
|
+
initialMaxMs: 8000,
|
|
959
|
+
repeatMinMs: 8000,
|
|
960
|
+
repeatMaxMs: 8000,
|
|
961
|
+
target: 'hostile_random',
|
|
962
|
+
cite: 'boss_jeklik.cpp:62 SPELL_LIQUID_FIRE 23968 "script effect - triggers 23971"; :95,233 rider CastSpell(23968); spell 23968 aura 23 amplitude 8000 -> 23969 (targetB 15 enemies at src loc) -> 23971 SUMMON_OBJECT_WILD GO 180125',
|
|
963
|
+
},
|
|
964
|
+
{
|
|
965
|
+
id: 'unstable_concoction',
|
|
966
|
+
spellId: 24024,
|
|
967
|
+
initialMinMs: 0,
|
|
968
|
+
initialMaxMs: 0,
|
|
969
|
+
repeatMinMs: 0,
|
|
970
|
+
repeatMaxMs: 0,
|
|
971
|
+
target: 'self',
|
|
972
|
+
hpPctMax: 40,
|
|
973
|
+
oneShot: true,
|
|
974
|
+
cite: 'boss_jeklik.cpp:296-306 BAT_RIDER_UNSTABLE_CONCOCTION GetHealthPercent() < 40.f SPELL_UNSTABLE_CONCOCTION 24024',
|
|
975
|
+
actions: [{ kind: 'yell', textId: -1309028, cite: 'boss_jeklik.cpp:50,302 SAY_SELF_DETONATE' }],
|
|
976
|
+
},
|
|
977
|
+
],
|
|
978
|
+
cites: [
|
|
979
|
+
'boss_jeklik.cpp:261-318 npc_gurubashi_bat_riderAI CombatAI',
|
|
980
|
+
'boss_jeklik.cpp:154-157,227-236 rider MovePath / 15s delayed LIQUID_FIRE — movement GAP',
|
|
981
|
+
],
|
|
982
|
+
};
|
|
983
|
+
|
|
984
|
+
export const MOB_OHGAN: ScriptDevIR = {
|
|
985
|
+
name: 'mob_ohgan',
|
|
986
|
+
boundCreatures: [NPC.OHGAN_RAPTOR],
|
|
987
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_mandokir.cpp',
|
|
988
|
+
spellIds: [24317, SPELL_MANDOKIR_REVIVE],
|
|
989
|
+
timers: [
|
|
990
|
+
row('sunder_armor', 24317, 'victim', 5000, 5000, 10_000, 15_000, 'boss_mandokir.cpp:253 AddCombatAction 5000; :272-273 CAST_OK urand(10-15)s Sunder Armor'),
|
|
991
|
+
],
|
|
992
|
+
// Ohgan's KilledUnit is a copy of his rider's: the nearest Chained Spirit hauls the dead raider
|
|
993
|
+
// back up. The rider's half was a hardcoded entry check in eventAi.ts and this one had nothing.
|
|
994
|
+
lifecycle: {
|
|
995
|
+
onKill: [{
|
|
996
|
+
kind: 'proxy_cast_on_victim',
|
|
997
|
+
casterEntry: NPC.CHAINED_SPIRIT,
|
|
998
|
+
spellId: SPELL_MANDOKIR_REVIVE,
|
|
999
|
+
radiusYd: 50,
|
|
1000
|
+
cite: 'boss_mandokir.cpp:257-268 mob_ohganAI::KilledUnit -> GetClosestCreatureWithEntry(victim, NPC_CHAINED_SPIRIT 15117, 50.0f) -> CastSpell(victim, SPELL_REVIVE 24341)',
|
|
1001
|
+
}],
|
|
1002
|
+
},
|
|
1003
|
+
cites: [
|
|
1004
|
+
'boss_mandokir.cpp:248-276 mob_ohganAI',
|
|
1005
|
+
'boss_mandokir.cpp:257-268 KilledUnit player -> nearest chained spirit SPELL_REVIVE via proxy_cast_on_victim',
|
|
1006
|
+
],
|
|
1007
|
+
};
|
|
1008
|
+
|
|
1009
|
+
export const MOB_ZEALOT_LORKHAN: ScriptDevIR = {
|
|
1010
|
+
name: 'mob_zealot_lorkhan',
|
|
1011
|
+
boundCreatures: [NPC.LORKHAN],
|
|
1012
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_thekal.cpp',
|
|
1013
|
+
spellIds: [17201, 20545, 24208, 6713, 24173, 19951],
|
|
1014
|
+
timers: [
|
|
1015
|
+
row('dispel_magic', 17201, 'self', 0, 0, 15_000, 20_000, 'creature_spell_list 1134701:0 Dispel Magic on Dispellable Friendly (product: self)', 0),
|
|
1016
|
+
row('lightning_shield', 20545, 'self', 1000, 1000, 61_000, 61_000, 'creature_spell_list 1134701:1 Lightning Shield on None', 0),
|
|
1017
|
+
row('great_heal', 24208, 'self', 32_000, 32_000, 15_000, 20_000, 'creature_spell_list 1134701:2 Great Heal on targeting 200 (product: self)', 0),
|
|
1018
|
+
row('disarm', 6713, 'victim', 6000, 6000, 15_000, 25_000, 'creature_spell_list 1134701:3 Disarm on Current', 0),
|
|
1019
|
+
{
|
|
1020
|
+
id: 'zealot_ress',
|
|
1021
|
+
spellId: 24173,
|
|
1022
|
+
initialMinMs: 0,
|
|
1023
|
+
initialMaxMs: 0,
|
|
1024
|
+
repeatMinMs: 0,
|
|
1025
|
+
repeatMaxMs: 0,
|
|
1026
|
+
target: 'self',
|
|
1027
|
+
startDisabled: true,
|
|
1028
|
+
oneShot: true,
|
|
1029
|
+
pollOnly: true,
|
|
1030
|
+
cite: 'boss_thekal.cpp:329-334 ACTION_RESSURECTION unless Thekal+Zath SPECIAL',
|
|
1031
|
+
actions: [
|
|
1032
|
+
{ kind: 'cast_self', spellId: 24173, gate: lorkhanMayRevive, cite: 'boss_thekal.cpp:332 SPELL_RESURRECT 24173' },
|
|
1033
|
+
{ kind: 'set_instance_data', field: TYPE.LORKHAN, value: INSTANCE_DATA.IN_PROGRESS, gate: lorkhanMayRevive, cite: 'boss_thekal.cpp:333 SetData(TYPE_LORKHAN, IN_PROGRESS)' },
|
|
1034
|
+
{ kind: 'set_phase', phase: 0, gate: lorkhanMayRevive, cite: 'boss_thekal.cpp:136 Revive PHASE_NORMAL' },
|
|
1035
|
+
{ kind: 'set_death_prevention', enabled: true, gate: lorkhanMayRevive, cite: 'boss_thekal.cpp:146 SetDeathPrevention(true)' },
|
|
1036
|
+
{ kind: 'set_combat_movement', enabled: true, gate: lorkhanMayRevive, cite: 'boss_thekal.cpp:144 SetCombatMovement(true)' },
|
|
1037
|
+
],
|
|
1038
|
+
},
|
|
1039
|
+
],
|
|
1040
|
+
lifecycle: {
|
|
1041
|
+
onReset: [
|
|
1042
|
+
{ kind: 'set_death_prevention', enabled: true, cite: 'boss_thekal.cpp:83,91 ctor/Reset SetDeathPrevention(true)' },
|
|
1043
|
+
{ kind: 'set_instance_data', field: TYPE.LORKHAN, value: INSTANCE_DATA.NOT_STARTED, cite: 'boss_thekal.cpp:345 SetData(TYPE_LORKHAN, NOT_STARTED)' },
|
|
1044
|
+
],
|
|
1045
|
+
onAggro: [
|
|
1046
|
+
{ kind: 'set_instance_data', field: TYPE.LORKHAN, value: INSTANCE_DATA.IN_PROGRESS, cite: 'boss_thekal.cpp:353 SetData(TYPE_LORKHAN, IN_PROGRESS)' },
|
|
1047
|
+
],
|
|
1048
|
+
onPreventedDeath: [
|
|
1049
|
+
{ kind: 'set_combat_movement', enabled: false, cite: 'boss_thekal.cpp:117 SetCombatMovement(false)' },
|
|
1050
|
+
{ kind: 'set_phase', phase: 2, cite: 'boss_thekal.cpp:120 PHASE_FAKE_DEATH' },
|
|
1051
|
+
{ kind: 'cast_self', spellId: 19951, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_thekal.cpp:115 SPELL_PACIFY_SELF 19951' },
|
|
1052
|
+
{ kind: 'set_instance_data', field: TYPE.LORKHAN, value: INSTANCE_DATA.SPECIAL, cite: 'boss_thekal.cpp:361 SetData(TYPE_LORKHAN, SPECIAL)' },
|
|
1053
|
+
{ kind: 'arm_timer', timerId: 'zealot_ress', delayMs: 10_000, cite: 'boss_thekal.cpp:358 ResetTimer(ACTION_RESSURECTION, 10000)' },
|
|
1054
|
+
],
|
|
1055
|
+
},
|
|
1056
|
+
cites: [
|
|
1057
|
+
'boss_thekal.cpp:324-369 mob_zealot_lorkhanAI fake-death + SPECIAL + 10s ress',
|
|
1058
|
+
'creature_spell_list 1134701 (4 rows)',
|
|
1059
|
+
],
|
|
1060
|
+
};
|
|
1061
|
+
|
|
1062
|
+
export const MOB_ZEALOT_ZATH: ScriptDevIR = {
|
|
1063
|
+
name: 'mob_zealot_zath',
|
|
1064
|
+
boundCreatures: [NPC.ZATH],
|
|
1065
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_thekal.cpp',
|
|
1066
|
+
spellIds: [15581, 12540, 15614, 21060, 18765, 24173, 19951],
|
|
1067
|
+
timers: [
|
|
1068
|
+
row('sinister_strike', 15581, 'victim', 8000, 8000, 8000, 16_000, 'creature_spell_list 1134801:0 Sinister Strike on Current', 0),
|
|
1069
|
+
row('gouge', 12540, 'self', 25_000, 25_000, 17_000, 27_000, 'creature_spell_list 1134801:1 Gouge on None', 0),
|
|
1070
|
+
row('kick', 15614, 'hostile_random', 18_000, 18_000, 15_000, 25_000, 'creature_spell_list 1134801:2 Kick on Random Casting (TargetId 102)', 0),
|
|
1071
|
+
row('blind', 21060, 'victim', 5000, 5000, 10_000, 20_000, 'creature_spell_list 1134801:3 Blind on Current', 0),
|
|
1072
|
+
row('sweeping_strikes', 18765, 'self', 0, 0, 20_000, 25_000, 'creature_spell_list 1134801:4 Sweeping Strikes on None', 0),
|
|
1073
|
+
{
|
|
1074
|
+
id: 'zealot_ress',
|
|
1075
|
+
spellId: 24173,
|
|
1076
|
+
initialMinMs: 0,
|
|
1077
|
+
initialMaxMs: 0,
|
|
1078
|
+
repeatMinMs: 0,
|
|
1079
|
+
repeatMaxMs: 0,
|
|
1080
|
+
target: 'self',
|
|
1081
|
+
startDisabled: true,
|
|
1082
|
+
oneShot: true,
|
|
1083
|
+
pollOnly: true,
|
|
1084
|
+
cite: 'boss_thekal.cpp:379-385 ACTION_RESSURECTION unless Thekal+Lorkhan SPECIAL',
|
|
1085
|
+
actions: [
|
|
1086
|
+
{ kind: 'cast_self', spellId: 24173, gate: zathMayRevive, cite: 'boss_thekal.cpp:383 SPELL_RESURRECT 24173' },
|
|
1087
|
+
{ kind: 'set_instance_data', field: TYPE.ZATH, value: INSTANCE_DATA.IN_PROGRESS, gate: zathMayRevive, cite: 'boss_thekal.cpp:384 SetData(TYPE_ZATH, IN_PROGRESS)' },
|
|
1088
|
+
{ kind: 'set_phase', phase: 0, gate: zathMayRevive, cite: 'boss_thekal.cpp:136 Revive PHASE_NORMAL' },
|
|
1089
|
+
{ kind: 'set_death_prevention', enabled: true, gate: zathMayRevive, cite: 'boss_thekal.cpp:146 SetDeathPrevention(true)' },
|
|
1090
|
+
{ kind: 'set_combat_movement', enabled: true, gate: zathMayRevive, cite: 'boss_thekal.cpp:144 SetCombatMovement(true)' },
|
|
1091
|
+
],
|
|
1092
|
+
},
|
|
1093
|
+
],
|
|
1094
|
+
lifecycle: {
|
|
1095
|
+
onReset: [
|
|
1096
|
+
{ kind: 'set_death_prevention', enabled: true, cite: 'boss_thekal.cpp:83,91 ctor/Reset SetDeathPrevention(true)' },
|
|
1097
|
+
{ kind: 'set_instance_data', field: TYPE.ZATH, value: INSTANCE_DATA.NOT_STARTED, cite: 'boss_thekal.cpp:394 SetData(TYPE_ZATH, NOT_STARTED)' },
|
|
1098
|
+
],
|
|
1099
|
+
onAggro: [
|
|
1100
|
+
{ kind: 'set_instance_data', field: TYPE.ZATH, value: INSTANCE_DATA.IN_PROGRESS, cite: 'boss_thekal.cpp:402 SetData(TYPE_ZATH, IN_PROGRESS)' },
|
|
1101
|
+
],
|
|
1102
|
+
onPreventedDeath: [
|
|
1103
|
+
{ kind: 'set_combat_movement', enabled: false, cite: 'boss_thekal.cpp:117 SetCombatMovement(false)' },
|
|
1104
|
+
{ kind: 'set_phase', phase: 2, cite: 'boss_thekal.cpp:120 PHASE_FAKE_DEATH' },
|
|
1105
|
+
{ kind: 'cast_self', spellId: 19951, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_thekal.cpp:115 SPELL_PACIFY_SELF 19951' },
|
|
1106
|
+
{ kind: 'set_instance_data', field: TYPE.ZATH, value: INSTANCE_DATA.SPECIAL, cite: 'boss_thekal.cpp:410 SetData(TYPE_ZATH, SPECIAL)' },
|
|
1107
|
+
{ kind: 'arm_timer', timerId: 'zealot_ress', delayMs: 10_000, cite: 'boss_thekal.cpp:407 ResetTimer(ACTION_RESSURECTION, 10000)' },
|
|
1108
|
+
],
|
|
1109
|
+
},
|
|
1110
|
+
cites: [
|
|
1111
|
+
'boss_thekal.cpp:376-417 mob_zealot_zathAI fake-death + SPECIAL + 10s ress',
|
|
1112
|
+
'creature_spell_list 1134801 (5 rows)',
|
|
1113
|
+
],
|
|
1114
|
+
};
|
|
1115
|
+
|
|
1116
|
+
export const AT_ZULGURUB: ScriptDevIR = {
|
|
1117
|
+
name: 'at_zulgurub',
|
|
1118
|
+
boundCreatures: [],
|
|
1119
|
+
sourceFile: 'eastern_kingdoms/zulgurub/zulgurub.cpp',
|
|
1120
|
+
spellIds: [],
|
|
1121
|
+
timers: [],
|
|
1122
|
+
cites: [
|
|
1123
|
+
'zulgurub.cpp AreaTrigger_at_zulgurub — Hakkar-bridge / edge triggers; no combat body',
|
|
1124
|
+
],
|
|
1125
|
+
};
|
|
1126
|
+
|
|
1127
|
+
// Renataki — Edge of Madness. Combat kit is list 1508401; C++ only owns vanish teleport choreography via
|
|
1128
|
+
// spell scripts (boss_renataki.cpp).
|
|
1129
|
+
export const BOSS_RENATAKI: ScriptDevIR = {
|
|
1130
|
+
name: 'boss_renataki',
|
|
1131
|
+
boundCreatures: [NPC.RENATAKI],
|
|
1132
|
+
sourceFile: 'eastern_kingdoms/zulgurub/boss_renataki.cpp',
|
|
1133
|
+
spellIds: [24649, 24699, 24698, 3391, 24700, 18951, 24240],
|
|
1134
|
+
timers: [
|
|
1135
|
+
row('thousand_blades', 24649, 'victim', 4000, 8000, 7000, 12_000, 'creature_spell_list 1508401:0 Thousand Blades on Current'),
|
|
1136
|
+
row('vanish', 24699, 'self', 25_000, 30_000, 25_000, 40_000, 'creature_spell_list 1508401:1 Vanish on None'),
|
|
1137
|
+
row('gouge', 24698, 'self', 15_000, 25_000, 7000, 20_000, 'creature_spell_list 1508401:2 Gouge on None'),
|
|
1138
|
+
row('thrash', 3391, 'self', 10_000, 15_000, 10_000, 15_000, 'creature_spell_list 1508401:3 Thrash on Current'),
|
|
1139
|
+
],
|
|
1140
|
+
lifecycle: {
|
|
1141
|
+
onReset: [
|
|
1142
|
+
{ kind: 'cast_self', spellId: 18951, cite: 'boss_renataki.cpp:77 JustRespawned SPELL_SPIRIT_PARTICLES' },
|
|
1143
|
+
{ kind: 'cast_self', spellId: 24240, cite: 'boss_renataki.cpp:78 JustRespawned SPELL_SPAWN_RED_LIGHTNING' },
|
|
1144
|
+
],
|
|
1145
|
+
},
|
|
1146
|
+
cites: [
|
|
1147
|
+
'boss_renataki.cpp:1-150 whole file',
|
|
1148
|
+
'creature_spell_list 1508401 (4 rows), classic-db z2815',
|
|
1149
|
+
'boss_renataki.cpp:52-59,81-90,116-138 Vanish → AI_EVENT_CUSTOM_A → VANISH_TELEPORT 24700 delay - GAP (spell-script choreography)',
|
|
1150
|
+
'boss_renataki.cpp:93-114 ThousandBlades 24649 fans to 9 other players (triggered, skip current)',
|
|
1151
|
+
],
|
|
1152
|
+
};
|