azeroth-shell 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/README.md +138 -2
  2. package/bin/azsh.mjs +19 -0
  3. package/docs/aifid/eventai-texts.json +4414 -0
  4. package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
  5. package/docs/dungeons/survey/pack-id-migration.json +2418 -0
  6. package/package.json +35 -4
  7. package/src/autopilot/bossSkip.ts +26 -0
  8. package/src/autopilot/combatRotation.ts +824 -0
  9. package/src/autopilot/config.ts +533 -0
  10. package/src/autopilot/consumables.ts +58 -0
  11. package/src/autopilot/encounterStand.ts +121 -0
  12. package/src/autopilot/objectGatePlan.ts +53 -0
  13. package/src/autopilot/pathEngage.ts +229 -0
  14. package/src/autopilot/plan.ts +1643 -0
  15. package/src/autopilot/questPolicy.ts +274 -0
  16. package/src/autopilot/routeStep.ts +69 -0
  17. package/src/autopilot/sessionReport.ts +88 -0
  18. package/src/autopilot/topOffPower.ts +26 -0
  19. package/src/autopilot/view.ts +476 -0
  20. package/src/cli/bootCheck.mjs +34 -0
  21. package/src/cli/bootData.mjs +57 -0
  22. package/src/cli/combatLogFilter.ts +153 -0
  23. package/src/cli/combatLogFormat.ts +613 -0
  24. package/src/cli/fileRepository.mjs +105 -0
  25. package/src/cli/gzLoader.mjs +31 -0
  26. package/src/cli/liveGauntletEscort.ts +978 -0
  27. package/src/cli/liveStratUndead.ts +305 -0
  28. package/src/cli/macroHostCombat.ts +545 -0
  29. package/src/cli/macroHostWorld.ts +330 -0
  30. package/src/cli/prefs.mjs +31 -0
  31. package/src/cli/register.mjs +4 -0
  32. package/src/cli/repl.mjs +693 -0
  33. package/src/cli/rotationText.mjs +226 -0
  34. package/src/cli/squad.mjs +105 -0
  35. package/src/cli/term.mjs +144 -0
  36. package/src/cli/text.mjs +122 -0
  37. package/src/cli/tui.mjs +626 -0
  38. package/src/cli/tuiArena.mjs +109 -0
  39. package/src/cli/tuiAutopilotSettings.mjs +93 -0
  40. package/src/cli/tuiBags.mjs +180 -0
  41. package/src/cli/tuiBars.mjs +133 -0
  42. package/src/cli/tuiBg.mjs +243 -0
  43. package/src/cli/tuiBulk.mjs +162 -0
  44. package/src/cli/tuiCheck.mjs +1882 -0
  45. package/src/cli/tuiCity.mjs +396 -0
  46. package/src/cli/tuiCompanionKit.mjs +300 -0
  47. package/src/cli/tuiCompanions.mjs +471 -0
  48. package/src/cli/tuiDev.mjs +62 -0
  49. package/src/cli/tuiDungeon.mjs +606 -0
  50. package/src/cli/tuiEnchantTarget.mjs +120 -0
  51. package/src/cli/tuiFight.mjs +577 -0
  52. package/src/cli/tuiFightPanes.mjs +228 -0
  53. package/src/cli/tuiFloor.mjs +506 -0
  54. package/src/cli/tuiGear.mjs +158 -0
  55. package/src/cli/tuiHonor.mjs +74 -0
  56. package/src/cli/tuiLoot.mjs +97 -0
  57. package/src/cli/tuiMacros.mjs +144 -0
  58. package/src/cli/tuiOutfitter.mjs +115 -0
  59. package/src/cli/tuiPet.mjs +116 -0
  60. package/src/cli/tuiProfessions.mjs +800 -0
  61. package/src/cli/tuiRaid.mjs +127 -0
  62. package/src/cli/tuiRep.mjs +65 -0
  63. package/src/cli/tuiSaves.mjs +69 -0
  64. package/src/cli/tuiSearch.mjs +363 -0
  65. package/src/cli/tuiSettings.mjs +151 -0
  66. package/src/cli/tuiSimLab.mjs +80 -0
  67. package/src/cli/tuiTalents.mjs +60 -0
  68. package/src/cli/tuiViews.mjs +1178 -0
  69. package/src/cli/tuiWiki.mjs +181 -0
  70. package/src/cli/tuiWorld.mjs +361 -0
  71. package/src/cli/wikiIndex.ts +259 -0
  72. package/src/cli/wikiSources.ts +355 -0
  73. package/src/data/alteracValley.ts +176 -0
  74. package/src/data/appearanceOptions.ts +534 -0
  75. package/src/data/applyLootChanceSanity.ts +21 -0
  76. package/src/data/createFlavor.ts +96 -0
  77. package/src/data/customItems.ts +33 -0
  78. package/src/data/dataStore.ts +1904 -0
  79. package/src/data/dungeonGameObjects.ts +84 -0
  80. package/src/data/dungeonPlateCover.ts +66 -0
  81. package/src/data/dungeonSpawns.ts +294 -0
  82. package/src/data/dungeons/alterac-valley.ts +135 -0
  83. package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
  84. package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
  85. package/src/data/dungeons/apply-instance-geometry.ts +65 -0
  86. package/src/data/dungeons/apply-spawn-placement.ts +171 -0
  87. package/src/data/dungeons/blackfathom-deeps.ts +539 -0
  88. package/src/data/dungeons/blackrock-depths.ts +1410 -0
  89. package/src/data/dungeons/blackwing-lair.ts +129 -0
  90. package/src/data/dungeons/boss-eventai.ts +8 -0
  91. package/src/data/dungeons/deadmines.ts +410 -0
  92. package/src/data/dungeons/dire-maul-east.ts +980 -0
  93. package/src/data/dungeons/dire-maul-north.ts +661 -0
  94. package/src/data/dungeons/dire-maul-west.ts +785 -0
  95. package/src/data/dungeons/dungeon-rooms.json +5479 -0
  96. package/src/data/dungeons/encounter-outdoors.json +359 -0
  97. package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
  98. package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
  99. package/src/data/dungeons/eventai/deadmines.ts +264 -0
  100. package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
  101. package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
  102. package/src/data/dungeons/eventai/helpers.ts +79 -0
  103. package/src/data/dungeons/eventai/index.ts +133 -0
  104. package/src/data/dungeons/eventai/lbrs.ts +372 -0
  105. package/src/data/dungeons/eventai/maraudon.ts +323 -0
  106. package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
  107. package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
  108. package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
  109. package/src/data/dungeons/eventai/scholomance.ts +680 -0
  110. package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
  111. package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
  112. package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
  113. package/src/data/dungeons/eventai/sm-library.ts +55 -0
  114. package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
  115. package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
  116. package/src/data/dungeons/eventai/the-stockade.ts +228 -0
  117. package/src/data/dungeons/eventai/ubrs.ts +225 -0
  118. package/src/data/dungeons/eventai/uldaman.ts +355 -0
  119. package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
  120. package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
  121. package/src/data/dungeons/gnomeregan.ts +909 -0
  122. package/src/data/dungeons/index.ts +126 -0
  123. package/src/data/dungeons/instance-geometry.json +5233 -0
  124. package/src/data/dungeons/key-sources.json +169 -0
  125. package/src/data/dungeons/lbrs.ts +996 -0
  126. package/src/data/dungeons/maraudon.ts +786 -0
  127. package/src/data/dungeons/molten-core.ts +194 -0
  128. package/src/data/dungeons/naxxramas.ts +173 -0
  129. package/src/data/dungeons/onyxias-lair.ts +71 -0
  130. package/src/data/dungeons/pack-from-clusters.ts +1256 -0
  131. package/src/data/dungeons/ragefire-chasm.ts +238 -0
  132. package/src/data/dungeons/razorfen-downs.ts +698 -0
  133. package/src/data/dungeons/razorfen-kraul.ts +766 -0
  134. package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
  135. package/src/data/dungeons/scholomance.ts +1076 -0
  136. package/src/data/dungeons/shadowfang-keep.ts +740 -0
  137. package/src/data/dungeons/sm-armory.ts +266 -0
  138. package/src/data/dungeons/sm-cathedral.ts +430 -0
  139. package/src/data/dungeons/sm-graveyard.ts +482 -0
  140. package/src/data/dungeons/sm-library.ts +337 -0
  141. package/src/data/dungeons/stratholme-live.ts +808 -0
  142. package/src/data/dungeons/stratholme-undead.ts +1164 -0
  143. package/src/data/dungeons/sunken-temple.ts +931 -0
  144. package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
  145. package/src/data/dungeons/the-stockade.ts +282 -0
  146. package/src/data/dungeons/ubrs.ts +1286 -0
  147. package/src/data/dungeons/uldaman.ts +685 -0
  148. package/src/data/dungeons/wailing-caverns.ts +356 -0
  149. package/src/data/dungeons/zul-farrak.ts +686 -0
  150. package/src/data/dungeons/zul-gurub.ts +142 -0
  151. package/src/data/dungeons.ts +42 -0
  152. package/src/data/fixtures.ts +446 -0
  153. package/src/data/gameobject-data.json.gz +0 -0
  154. package/src/data/item-data.json.gz +0 -0
  155. package/src/data/loot-data.json.gz +0 -0
  156. package/src/data/maps/atlas-approach-maps.json +1425 -0
  157. package/src/data/maps/atlas-landmarks.json +1711 -0
  158. package/src/data/maps/dungeon-viewports.json +392 -0
  159. package/src/data/materializeModDamagePercentTaken.ts +70 -0
  160. package/src/data/materializeModHealthRegen.ts +89 -0
  161. package/src/data/materializeSpellReputation.ts +26 -0
  162. package/src/data/pageTexts.ts +19 -0
  163. package/src/data/profession-data.json.gz +0 -0
  164. package/src/data/raid-plans/blackfathom-deeps.json +86 -0
  165. package/src/data/raid-plans/blackrock-depths.json +419 -0
  166. package/src/data/raid-plans/blackwing-lair.json +328 -0
  167. package/src/data/raid-plans/deadmines.json +55 -0
  168. package/src/data/raid-plans/dire-maul-east.json +94 -0
  169. package/src/data/raid-plans/dire-maul-north.json +70 -0
  170. package/src/data/raid-plans/dire-maul-west.json +75 -0
  171. package/src/data/raid-plans/gnomeregan.json +131 -0
  172. package/src/data/raid-plans/lbrs.json +176 -0
  173. package/src/data/raid-plans/maraudon.json +102 -0
  174. package/src/data/raid-plans/molten-core.json +169 -0
  175. package/src/data/raid-plans/naxxramas.json +354 -0
  176. package/src/data/raid-plans/onyxias-lair.json +18 -0
  177. package/src/data/raid-plans/ragefire-chasm.json +30 -0
  178. package/src/data/raid-plans/razorfen-downs.json +75 -0
  179. package/src/data/raid-plans/razorfen-kraul.json +53 -0
  180. package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
  181. package/src/data/raid-plans/scholomance.json +170 -0
  182. package/src/data/raid-plans/shadowfang-keep.json +87 -0
  183. package/src/data/raid-plans/sm-armory.json +53 -0
  184. package/src/data/raid-plans/sm-cathedral.json +72 -0
  185. package/src/data/raid-plans/sm-graveyard.json +63 -0
  186. package/src/data/raid-plans/sm-library.json +23 -0
  187. package/src/data/raid-plans/stratholme-live.json +129 -0
  188. package/src/data/raid-plans/stratholme-undead.json +73 -0
  189. package/src/data/raid-plans/sunken-temple.json +159 -0
  190. package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
  191. package/src/data/raid-plans/the-stockade.json +42 -0
  192. package/src/data/raid-plans/ubrs.json +53 -0
  193. package/src/data/raid-plans/uldaman.json +131 -0
  194. package/src/data/raid-plans/wailing-caverns.json +90 -0
  195. package/src/data/raid-plans/zul-farrak.json +156 -0
  196. package/src/data/raid-plans/zul-gurub.json +307 -0
  197. package/src/data/raidInstanceCreatures.mjs +473 -0
  198. package/src/data/rotations/index.ts +152 -0
  199. package/src/data/rotations/layout.mjs +72 -0
  200. package/src/data/rotations/pve/druid/balance.json +754 -0
  201. package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
  202. package/src/data/rotations/pve/druid/feral.json +2660 -0
  203. package/src/data/rotations/pve/druid/restoration.json +424 -0
  204. package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
  205. package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
  206. package/src/data/rotations/pve/hunter/survival.json +1373 -0
  207. package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
  208. package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
  209. package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
  210. package/src/data/rotations/pve/paladin/holy.json +755 -0
  211. package/src/data/rotations/pve/paladin/protection.json +962 -0
  212. package/src/data/rotations/pve/paladin/retribution.json +924 -0
  213. package/src/data/rotations/pve/priest/discipline.json +772 -0
  214. package/src/data/rotations/pve/priest/holy.json +707 -0
  215. package/src/data/rotations/pve/priest/shadow.json +787 -0
  216. package/src/data/rotations/pve/rogue/assassination.json +2477 -0
  217. package/src/data/rotations/pve/rogue/combat.json +2483 -0
  218. package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
  219. package/src/data/rotations/pve/shaman/elemental.json +1157 -0
  220. package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
  221. package/src/data/rotations/pve/shaman/restoration.json +592 -0
  222. package/src/data/rotations/pve/warlock/affliction.json +1185 -0
  223. package/src/data/rotations/pve/warlock/demonology.json +1165 -0
  224. package/src/data/rotations/pve/warlock/destruction.json +1177 -0
  225. package/src/data/rotations/pve/warrior/arms.json +3020 -0
  226. package/src/data/rotations/pve/warrior/fury.json +2996 -0
  227. package/src/data/rotations/pve/warrior/protection.json +2509 -0
  228. package/src/data/rotations/pvp/druid/balance.json +593 -0
  229. package/src/data/rotations/pvp/druid/feral.json +3276 -0
  230. package/src/data/rotations/pvp/druid/restoration.json +662 -0
  231. package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
  232. package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
  233. package/src/data/rotations/pvp/hunter/survival.json +635 -0
  234. package/src/data/rotations/pvp/mage/arcane.json +574 -0
  235. package/src/data/rotations/pvp/mage/fire.json +570 -0
  236. package/src/data/rotations/pvp/mage/frost.json +4048 -0
  237. package/src/data/rotations/pvp/paladin/holy.json +1498 -0
  238. package/src/data/rotations/pvp/paladin/protection.json +567 -0
  239. package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
  240. package/src/data/rotations/pvp/priest/discipline.json +1848 -0
  241. package/src/data/rotations/pvp/priest/holy.json +6340 -0
  242. package/src/data/rotations/pvp/priest/shadow.json +2329 -0
  243. package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
  244. package/src/data/rotations/pvp/rogue/combat.json +5258 -0
  245. package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
  246. package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
  247. package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
  248. package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
  249. package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
  250. package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
  251. package/src/data/rotations/pvp/warlock/destruction.json +638 -0
  252. package/src/data/rotations/pvp/warrior/arms.json +5665 -0
  253. package/src/data/rotations/pvp/warrior/fury.json +850 -0
  254. package/src/data/rotations/pvp/warrior/protection.json +777 -0
  255. package/src/data/schema/bundle.ts +511 -0
  256. package/src/data/schema/constants.ts +49 -0
  257. package/src/data/schema/creature.ts +454 -0
  258. package/src/data/schema/encounter.ts +155 -0
  259. package/src/data/schema/faction.ts +48 -0
  260. package/src/data/schema/item.ts +297 -0
  261. package/src/data/schema/itemEnchant.ts +105 -0
  262. package/src/data/schema/npc.ts +44 -0
  263. package/src/data/schema/primitives.ts +295 -0
  264. package/src/data/schema/profession.ts +226 -0
  265. package/src/data/schema/quest.ts +154 -0
  266. package/src/data/schema/spell.ts +1149 -0
  267. package/src/data/schema/talent.ts +74 -0
  268. package/src/data/schema/world.ts +124 -0
  269. package/src/data/schema.ts +19 -0
  270. package/src/data/skinNodeGapFill.ts +68 -0
  271. package/src/data/spell-data.json.gz +0 -0
  272. package/src/data/spell-script-targets.json +1 -0
  273. package/src/data/tables/ahItemValues.json.gz +0 -0
  274. package/src/data/tables/alteracValley.json.gz +0 -0
  275. package/src/data/tables/areatriggerTeleports.json.gz +0 -0
  276. package/src/data/tables/botNames.json.gz +0 -0
  277. package/src/data/tables/botPopulation.json.gz +0 -0
  278. package/src/data/tables/botSpecs.json.gz +0 -0
  279. package/src/data/tables/classLevelStats.json.gz +0 -0
  280. package/src/data/tables/combatConditions.json.gz +0 -0
  281. package/src/data/tables/combatSkillMeta.json.gz +0 -0
  282. package/src/data/tables/conditions.json.gz +0 -0
  283. package/src/data/tables/createInfo.json.gz +0 -0
  284. package/src/data/tables/creatureAggroGroups.json.gz +0 -0
  285. package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
  286. package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
  287. package/src/data/tables/creatureWeapons.json.gz +0 -0
  288. package/src/data/tables/creatures.json.gz +0 -0
  289. package/src/data/tables/dbScripts.json.gz +0 -0
  290. package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
  291. package/src/data/tables/dungeonCensus.json.gz +0 -0
  292. package/src/data/tables/dungeonGameObjects.json.gz +0 -0
  293. package/src/data/tables/dungeonPacks.json.gz +0 -0
  294. package/src/data/tables/dungeonPlateCover.json.gz +0 -0
  295. package/src/data/tables/dungeonSpawns.json.gz +0 -0
  296. package/src/data/tables/dungeonSurvey.json.gz +0 -0
  297. package/src/data/tables/durabilityCosts.json.gz +0 -0
  298. package/src/data/tables/durabilityQuality.json.gz +0 -0
  299. package/src/data/tables/enchantApplicators.json.gz +0 -0
  300. package/src/data/tables/entranceYards.json.gz +0 -0
  301. package/src/data/tables/explorationBasexp.json.gz +0 -0
  302. package/src/data/tables/factionTemplates.json.gz +0 -0
  303. package/src/data/tables/factions.json.gz +0 -0
  304. package/src/data/tables/gameEvents.json.gz +0 -0
  305. package/src/data/tables/gameObjects.json.gz +0 -0
  306. package/src/data/tables/gossipMenus.json.gz +0 -0
  307. package/src/data/tables/graveyards.json.gz +0 -0
  308. package/src/data/tables/instanceMaps.json.gz +0 -0
  309. package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
  310. package/src/data/tables/itemEnchants.json.gz +0 -0
  311. package/src/data/tables/itemRandomProperties.json.gz +0 -0
  312. package/src/data/tables/itemSets.json.gz +0 -0
  313. package/src/data/tables/items.json.gz +0 -0
  314. package/src/data/tables/levelStats.json.gz +0 -0
  315. package/src/data/tables/locks.json.gz +0 -0
  316. package/src/data/tables/map-pin-overrides.json.gz +0 -0
  317. package/src/data/tables/nonCombatTrash.json.gz +0 -0
  318. package/src/data/tables/npcTexts.json.gz +0 -0
  319. package/src/data/tables/pageTexts.json.gz +0 -0
  320. package/src/data/tables/petAbilityTP.json.gz +0 -0
  321. package/src/data/tables/petGenericSpells.json.gz +0 -0
  322. package/src/data/tables/petLevelStats.json.gz +0 -0
  323. package/src/data/tables/playerbot-weightscales.json.gz +0 -0
  324. package/src/data/tables/pools.json.gz +0 -0
  325. package/src/data/tables/quests.json.gz +0 -0
  326. package/src/data/tables/races.json.gz +0 -0
  327. package/src/data/tables/reputationRanks.json.gz +0 -0
  328. package/src/data/tables/reputationRates.json.gz +0 -0
  329. package/src/data/tables/reputationSpillover.json.gz +0 -0
  330. package/src/data/tables/ridingSpells.json.gz +0 -0
  331. package/src/data/tables/scriptTexts.json.gz +0 -0
  332. package/src/data/tables/soundClipVolume.json.gz +0 -0
  333. package/src/data/tables/spellChain.json.gz +0 -0
  334. package/src/data/tables/spellTeleports.json.gz +0 -0
  335. package/src/data/tables/spells.json.gz +0 -0
  336. package/src/data/tables/talents.json.gz +0 -0
  337. package/src/data/tables/tavernTriggers.json.gz +0 -0
  338. package/src/data/tables/taxiNodes.json.gz +0 -0
  339. package/src/data/tables/taxiRoutes.json.gz +0 -0
  340. package/src/data/tables/trainers.json.gz +0 -0
  341. package/src/data/tables/transports.json.gz +0 -0
  342. package/src/data/tables/travelAnchors.json.gz +0 -0
  343. package/src/data/tables/travelEdges.json.gz +0 -0
  344. package/src/data/tables/unitConditions.json.gz +0 -0
  345. package/src/data/tables/vendors.json.gz +0 -0
  346. package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
  347. package/src/data/tables/xp.json.gz +0 -0
  348. package/src/data/tables/zoneWeather.json.gz +0 -0
  349. package/src/data/tables/zones.json.gz +0 -0
  350. package/src/data/world-data.ts +56 -0
  351. package/src/data/zone-music-sets.json +2751 -0
  352. package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
  353. package/src/domain/audioQuality.mjs +145 -0
  354. package/src/domain/bg/ab.ts +433 -0
  355. package/src/domain/bg/arenaComps.ts +644 -0
  356. package/src/domain/bg/arenaLab.ts +695 -0
  357. package/src/domain/bg/arenaPace.ts +31 -0
  358. package/src/domain/bg/arenaRating.ts +110 -0
  359. package/src/domain/bg/av.ts +758 -0
  360. package/src/domain/bg/avEnemyPush.ts +219 -0
  361. package/src/domain/bg/avField.ts +283 -0
  362. package/src/domain/bg/avInstanceNodes.ts +197 -0
  363. package/src/domain/bg/avInstanceScore.ts +123 -0
  364. package/src/domain/bg/avQuestItems.ts +55 -0
  365. package/src/domain/bg/avQuests.ts +210 -0
  366. package/src/domain/bg/avSession.ts +196 -0
  367. package/src/domain/bg/bgConsumes.ts +269 -0
  368. package/src/domain/bg/bgPrebuff.ts +153 -0
  369. package/src/domain/bg/bgRest.ts +91 -0
  370. package/src/domain/bg/bgRoster.ts +305 -0
  371. package/src/domain/bg/bgTier.ts +61 -0
  372. package/src/domain/bg/bgWorld.ts +862 -0
  373. package/src/domain/bg/match.ts +215 -0
  374. package/src/domain/bg/strategies.ts +552 -0
  375. package/src/domain/bg/types.ts +291 -0
  376. package/src/domain/bg/wsg.ts +264 -0
  377. package/src/domain/bots/actionProviderSpec.ts +38 -0
  378. package/src/domain/bots/autoConsumables.ts +285 -0
  379. package/src/domain/bots/betweenPullRest.ts +239 -0
  380. package/src/domain/bots/botGear.ts +248 -0
  381. package/src/domain/bots/botInventory.ts +486 -0
  382. package/src/domain/bots/botPet.ts +535 -0
  383. package/src/domain/bots/botPool.ts +291 -0
  384. package/src/domain/bots/botProfessions.ts +334 -0
  385. package/src/domain/bots/companionActionBar.ts +209 -0
  386. package/src/domain/bots/companionHireCost.ts +236 -0
  387. package/src/domain/bots/companionMissions.ts +582 -0
  388. package/src/domain/bots/companionPrep.ts +254 -0
  389. package/src/domain/bots/companionQuests.ts +270 -0
  390. package/src/domain/bots/companionRep.ts +75 -0
  391. package/src/domain/bots/companionRotation.ts +708 -0
  392. package/src/domain/bots/companionXp.ts +66 -0
  393. package/src/domain/bots/consumableShare.ts +811 -0
  394. package/src/domain/bots/dpsMate.ts +1072 -0
  395. package/src/domain/bots/groupCompReport.ts +132 -0
  396. package/src/domain/bots/healthstoneSupply.ts +198 -0
  397. package/src/domain/bots/outfitter.ts +1056 -0
  398. package/src/domain/bots/paladinPrePull.ts +231 -0
  399. package/src/domain/bots/partyRole.ts +40 -0
  400. package/src/domain/bots/playerbotEquipCache.ts +412 -0
  401. package/src/domain/bots/playerbotItemEligibility.ts +60 -0
  402. package/src/domain/bots/playerbotStatWeight.ts +853 -0
  403. package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
  404. package/src/domain/bots/prePullBuffs.ts +219 -0
  405. package/src/domain/bots/prePullStealth.ts +82 -0
  406. package/src/domain/bots/runSupply.ts +251 -0
  407. package/src/domain/bots/runSupplyPrefs.ts +28 -0
  408. package/src/domain/bots/sendTradeGoods.ts +394 -0
  409. package/src/domain/bots/soulShardCap.ts +35 -0
  410. package/src/domain/bots/squad.ts +842 -0
  411. package/src/domain/bots/squadRun.ts +81 -0
  412. package/src/domain/character/actionbar.ts +346 -0
  413. package/src/domain/character/appearance.ts +165 -0
  414. package/src/domain/character/buildCombatant.ts +1726 -0
  415. package/src/domain/character/character.ts +356 -0
  416. package/src/domain/character/characterName.ts +43 -0
  417. package/src/domain/character/characterRatings.ts +424 -0
  418. package/src/domain/character/characterSpells.ts +282 -0
  419. package/src/domain/character/characterStats.ts +1559 -0
  420. package/src/domain/character/characterTalents.ts +398 -0
  421. package/src/domain/character/combatSkills.ts +994 -0
  422. package/src/domain/character/displayForm.ts +72 -0
  423. package/src/domain/character/formTalentAuras.ts +171 -0
  424. package/src/domain/character/forms.ts +499 -0
  425. package/src/domain/character/races.ts +40 -0
  426. package/src/domain/character/resurrectionSickness.ts +49 -0
  427. package/src/domain/character/spellbook.ts +169 -0
  428. package/src/domain/character/stanceBar.ts +354 -0
  429. package/src/domain/character/stancePrereq.ts +70 -0
  430. package/src/domain/character/talentBuilds.ts +63 -0
  431. package/src/domain/character/talentImport.ts +130 -0
  432. package/src/domain/character/talentLink.ts +123 -0
  433. package/src/domain/character/talents.ts +201 -0
  434. package/src/domain/core/conditionSnapshot.ts +92 -0
  435. package/src/domain/core/hover.ts +14 -0
  436. package/src/domain/core/ids.ts +58 -0
  437. package/src/domain/core/internalNameTags.ts +5 -0
  438. package/src/domain/core/runtimeDataPatches.ts +357 -0
  439. package/src/domain/creature/aiTargeting.ts +588 -0
  440. package/src/domain/creature/combatCondition.ts +157 -0
  441. package/src/domain/creature/creatureAggro.ts +804 -0
  442. package/src/domain/creature/creatureAi.ts +206 -0
  443. package/src/domain/creature/creatureAiConstants.ts +661 -0
  444. package/src/domain/creature/creatureCastList.ts +1007 -0
  445. package/src/domain/creature/creatureEventAi.ts +1409 -0
  446. package/src/domain/creature/creatureGroups.ts +144 -0
  447. package/src/domain/creature/creatureLinking.ts +333 -0
  448. package/src/domain/creature/creatureScaling.ts +320 -0
  449. package/src/domain/creature/creatureTrigger.ts +53 -0
  450. package/src/domain/creature/creatureWander.ts +74 -0
  451. package/src/domain/creature/eventAiTexts.ts +145 -0
  452. package/src/domain/creature/faction.ts +287 -0
  453. package/src/domain/creature/forcedReaction.ts +48 -0
  454. package/src/domain/creature/outdoorHuntable.ts +74 -0
  455. package/src/domain/creature/patrolPacks.ts +210 -0
  456. package/src/domain/creature/reputation.ts +967 -0
  457. package/src/domain/creature/unitFlags.ts +74 -0
  458. package/src/domain/creature/worldBosses.ts +393 -0
  459. package/src/domain/dungeonMusic.mjs +48 -0
  460. package/src/domain/economy/auction.ts +282 -0
  461. package/src/domain/economy/auctionBot.ts +1060 -0
  462. package/src/domain/economy/honorPrice.ts +100 -0
  463. package/src/domain/economy/mail.ts +958 -0
  464. package/src/domain/economy/money.ts +42 -0
  465. package/src/domain/economy/syntheticClassTrainers.ts +62 -0
  466. package/src/domain/economy/trading.ts +296 -0
  467. package/src/domain/economy/vendorSellAll.ts +252 -0
  468. package/src/domain/economy/vendorStock.ts +146 -0
  469. package/src/domain/items/ammo.ts +817 -0
  470. package/src/domain/items/bank.ts +162 -0
  471. package/src/domain/items/consumableFamily.ts +205 -0
  472. package/src/domain/items/craftUpgrades.ts +83 -0
  473. package/src/domain/items/createItem.ts +93 -0
  474. package/src/domain/items/durability.ts +581 -0
  475. package/src/domain/items/equipment.ts +441 -0
  476. package/src/domain/items/equipmentHelper.ts +767 -0
  477. package/src/domain/items/inventory.ts +561 -0
  478. package/src/domain/items/itemBonding.ts +93 -0
  479. package/src/domain/items/itemContainer.ts +245 -0
  480. package/src/domain/items/itemDisplayName.ts +33 -0
  481. package/src/domain/items/itemInstance.ts +181 -0
  482. package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
  483. package/src/domain/items/itemRandomProps.ts +77 -0
  484. package/src/domain/items/itemRestrictions.ts +329 -0
  485. package/src/domain/items/itemTeaches.ts +82 -0
  486. package/src/domain/items/itemUseCooldown.ts +52 -0
  487. package/src/domain/items/itemUseTarget.ts +90 -0
  488. package/src/domain/items/junkCategories.ts +174 -0
  489. package/src/domain/items/junkFilter.ts +368 -0
  490. package/src/domain/items/keyring.ts +131 -0
  491. package/src/domain/items/loot.ts +221 -0
  492. package/src/domain/items/mounts.ts +190 -0
  493. package/src/domain/items/onUsePayload.ts +102 -0
  494. package/src/domain/items/pendingLoot.ts +107 -0
  495. package/src/domain/items/relic.ts +105 -0
  496. package/src/domain/items/rocketBoots.ts +36 -0
  497. package/src/domain/items/sortContainer.ts +139 -0
  498. package/src/domain/items/spareContainers.ts +71 -0
  499. package/src/domain/items/spellReagentIndex.ts +131 -0
  500. package/src/domain/items/staleConsumables.ts +66 -0
  501. package/src/domain/items/weaponSpender.ts +110 -0
  502. package/src/domain/listDungeonIds.mjs +28 -0
  503. package/src/domain/macro/compose.ts +239 -0
  504. package/src/domain/macro/conditions.ts +260 -0
  505. package/src/domain/macro/creatureTypes.ts +40 -0
  506. package/src/domain/macro/describe.ts +169 -0
  507. package/src/domain/macro/icon.ts +60 -0
  508. package/src/domain/macro/index.ts +20 -0
  509. package/src/domain/macro/normalize.ts +112 -0
  510. package/src/domain/macro/parse.ts +316 -0
  511. package/src/domain/macro/plan.ts +288 -0
  512. package/src/domain/macro/rotation.ts +590 -0
  513. package/src/domain/macro/rotationEnv.ts +173 -0
  514. package/src/domain/macro/slots.ts +101 -0
  515. package/src/domain/macro/snapshot.ts +114 -0
  516. package/src/domain/macro/templates.ts +446 -0
  517. package/src/domain/macro/types.ts +70 -0
  518. package/src/domain/macro/units.ts +93 -0
  519. package/src/domain/macro/weaponTypes.ts +83 -0
  520. package/src/domain/nav/cityTeleports.ts +10 -0
  521. package/src/domain/nav/mounting.ts +113 -0
  522. package/src/domain/nav/nav.ts +43 -0
  523. package/src/domain/nav/navCollision.ts +606 -0
  524. package/src/domain/nav/navOutdoors.ts +91 -0
  525. package/src/domain/nav/navRegistry.ts +179 -0
  526. package/src/domain/nav/navRoomGraph.ts +302 -0
  527. package/src/domain/nav/navTypes.ts +43 -0
  528. package/src/domain/nav/navmesh.ts +1715 -0
  529. package/src/domain/nav/speed.ts +200 -0
  530. package/src/domain/nav/storey.ts +10 -0
  531. package/src/domain/nav/travel.ts +725 -0
  532. package/src/domain/nav/travelTypes.ts +75 -0
  533. package/src/domain/pet/pet.ts +1150 -0
  534. package/src/domain/pet/petActionBar.ts +180 -0
  535. package/src/domain/pet/petSpellbook.ts +39 -0
  536. package/src/domain/pet/petStable.ts +81 -0
  537. package/src/domain/professions/autoDisenchant.ts +236 -0
  538. package/src/domain/professions/characterEnchants.ts +176 -0
  539. package/src/domain/professions/craftCooldown.ts +52 -0
  540. package/src/domain/professions/enchantApply.ts +62 -0
  541. package/src/domain/professions/enchantTargets.ts +114 -0
  542. package/src/domain/professions/enchanting.ts +236 -0
  543. package/src/domain/professions/gatherFilter.ts +149 -0
  544. package/src/domain/professions/gearEnchant.ts +137 -0
  545. package/src/domain/professions/heldTools.ts +29 -0
  546. package/src/domain/professions/learnAllRecipes.ts +146 -0
  547. package/src/domain/professions/miningHarvest.ts +69 -0
  548. package/src/domain/professions/partyDisenchant.ts +294 -0
  549. package/src/domain/professions/partyWork.ts +83 -0
  550. package/src/domain/professions/pickpocket.ts +172 -0
  551. package/src/domain/professions/poisons.ts +240 -0
  552. package/src/domain/professions/professions.ts +677 -0
  553. package/src/domain/professions/rareNodes.ts +45 -0
  554. package/src/domain/professions/skinLoot.ts +27 -0
  555. package/src/domain/professions/vendorReagents.ts +152 -0
  556. package/src/domain/professions/weaponImbueHand.ts +171 -0
  557. package/src/domain/questFarmFilter.mjs +42 -0
  558. package/src/domain/quests/doQuest.ts +1204 -0
  559. package/src/domain/quests/gossip.ts +308 -0
  560. package/src/domain/quests/gossipTalk.ts +298 -0
  561. package/src/domain/quests/interpreter/canComplete.ts +150 -0
  562. package/src/domain/quests/interpreter/claim.ts +137 -0
  563. package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
  564. package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
  565. package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
  566. package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
  567. package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
  568. package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
  569. package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
  570. package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
  571. package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
  572. package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
  573. package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
  574. package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
  575. package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
  576. package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
  577. package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
  578. package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
  579. package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
  580. package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
  581. package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
  582. package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
  583. package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
  584. package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
  585. package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
  586. package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
  587. package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
  588. package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
  589. package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
  590. package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
  591. package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
  592. package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
  593. package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
  594. package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
  595. package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
  596. package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
  597. package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
  598. package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
  599. package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
  600. package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
  601. package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
  602. package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
  603. package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
  604. package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
  605. package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
  606. package/src/domain/quests/interpreter/diff.ts +349 -0
  607. package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
  608. package/src/domain/quests/interpreter/flags.ts +101 -0
  609. package/src/domain/quests/interpreter/index.ts +113 -0
  610. package/src/domain/quests/interpreter/live.ts +178 -0
  611. package/src/domain/quests/interpreter/types.ts +81 -0
  612. package/src/domain/quests/interpreter/updaters.ts +412 -0
  613. package/src/domain/quests/questCorpseUse.ts +155 -0
  614. package/src/domain/quests/questDialog.ts +43 -0
  615. package/src/domain/quests/questFight.ts +34 -0
  616. package/src/domain/quests/questObjectiveLabel.ts +39 -0
  617. package/src/domain/quests/questRewardChoice.ts +85 -0
  618. package/src/domain/quests/questScriptCredit.ts +26 -0
  619. package/src/domain/quests/questScriptItemUse.ts +74 -0
  620. package/src/domain/quests/questTameRods.ts +79 -0
  621. package/src/domain/quests/questlog.ts +1545 -0
  622. package/src/domain/quests/talkDeliver.ts +170 -0
  623. package/src/domain/raid/globalActionBar.ts +195 -0
  624. package/src/domain/raid/instanceRoster.ts +194 -0
  625. package/src/domain/raid/partySummon.ts +198 -0
  626. package/src/domain/raid/partyVault.ts +320 -0
  627. package/src/domain/raid/raidBossAbilities.ts +268 -0
  628. package/src/domain/raid/raidComp.ts +335 -0
  629. package/src/domain/raid/raidCustomRows.ts +453 -0
  630. package/src/domain/raid/raidEncounterGear.ts +298 -0
  631. package/src/domain/raid/raidEncounterTactics.ts +412 -0
  632. package/src/domain/raid/raidPlan.ts +509 -0
  633. package/src/domain/raid/raidPlanEdits.ts +98 -0
  634. package/src/domain/raid/raidPlanPacks.ts +480 -0
  635. package/src/domain/raid/raidRecovery.ts +183 -0
  636. package/src/domain/raid/raidRosterTemplate.ts +138 -0
  637. package/src/domain/rotation/auraSide.ts +68 -0
  638. package/src/domain/rotation/build.ts +3031 -0
  639. package/src/domain/rotation/classes/druid.ts +58 -0
  640. package/src/domain/rotation/classes/hooks.ts +59 -0
  641. package/src/domain/rotation/classes/hunter.ts +156 -0
  642. package/src/domain/rotation/classes/index.ts +104 -0
  643. package/src/domain/rotation/classes/mage.ts +99 -0
  644. package/src/domain/rotation/classes/paladin.ts +296 -0
  645. package/src/domain/rotation/classes/priest.ts +94 -0
  646. package/src/domain/rotation/classes/pullOpener.ts +92 -0
  647. package/src/domain/rotation/classes/rogue.ts +69 -0
  648. package/src/domain/rotation/classes/shaman.ts +29 -0
  649. package/src/domain/rotation/classes/supportSpec.ts +94 -0
  650. package/src/domain/rotation/classes/warlock.ts +81 -0
  651. package/src/domain/rotation/classes/warrior.ts +402 -0
  652. package/src/domain/rotation/classify.ts +1381 -0
  653. package/src/domain/rotation/condMetricPicker.ts +379 -0
  654. package/src/domain/rotation/consumables.ts +242 -0
  655. package/src/domain/rotation/evaluate.ts +1115 -0
  656. package/src/domain/rotation/finisherLadder.ts +145 -0
  657. package/src/domain/rotation/invent.ts +938 -0
  658. package/src/domain/rotation/killOrder.ts +30 -0
  659. package/src/domain/rotation/openerForm.ts +22 -0
  660. package/src/domain/rotation/paladinBuffs.ts +568 -0
  661. package/src/domain/rotation/prebuff.ts +283 -0
  662. package/src/domain/rotation/raidRowTuning.ts +34 -0
  663. package/src/domain/rotation/rotation.ts +11 -0
  664. package/src/domain/rotation/rotationProfiles.ts +180 -0
  665. package/src/domain/rotation/rotationSuggestions.ts +851 -0
  666. package/src/domain/rotation/ruleAfterChain.ts +49 -0
  667. package/src/domain/rotation/spec.ts +70 -0
  668. package/src/domain/rotation/spellPicker.ts +140 -0
  669. package/src/domain/rotation/stand.ts +143 -0
  670. package/src/domain/rotation/types.ts +718 -0
  671. package/src/domain/run/battlegroundRun.ts +111 -0
  672. package/src/domain/run/canEnterContext.ts +32 -0
  673. package/src/domain/run/death.ts +561 -0
  674. package/src/domain/run/deathRecovery.ts +289 -0
  675. package/src/domain/run/duel.ts +141 -0
  676. package/src/domain/run/dungeonRun.ts +344 -0
  677. package/src/domain/run/floorRest.ts +159 -0
  678. package/src/domain/run/honor.ts +557 -0
  679. package/src/domain/run/honorWeek.ts +180 -0
  680. package/src/domain/run/whenMap.ts +977 -0
  681. package/src/domain/scriptdev/arathiHighlands.ts +445 -0
  682. package/src/domain/scriptdev/ashenvale.ts +635 -0
  683. package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
  684. package/src/domain/scriptdev/azshara.ts +892 -0
  685. package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
  686. package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
  687. package/src/domain/scriptdev/blackrockSpire.ts +730 -0
  688. package/src/domain/scriptdev/blackwingLair.ts +521 -0
  689. package/src/domain/scriptdev/burningSteppes.ts +62 -0
  690. package/src/domain/scriptdev/classFilter.ts +43 -0
  691. package/src/domain/scriptdev/darkshore.ts +817 -0
  692. package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
  693. package/src/domain/scriptdev/deadmines.ts +331 -0
  694. package/src/domain/scriptdev/desolace.ts +1239 -0
  695. package/src/domain/scriptdev/direMaul.ts +859 -0
  696. package/src/domain/scriptdev/durotar.ts +532 -0
  697. package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
  698. package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
  699. package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
  700. package/src/domain/scriptdev/felwood.ts +1055 -0
  701. package/src/domain/scriptdev/feralas.ts +571 -0
  702. package/src/domain/scriptdev/feralasHelpers.ts +838 -0
  703. package/src/domain/scriptdev/gnomeregan.ts +466 -0
  704. package/src/domain/scriptdev/guards.ts +616 -0
  705. package/src/domain/scriptdev/hinterlands.ts +693 -0
  706. package/src/domain/scriptdev/host.ts +1134 -0
  707. package/src/domain/scriptdev/index.ts +123 -0
  708. package/src/domain/scriptdev/instanceRaids.ts +136 -0
  709. package/src/domain/scriptdev/itemScripts.ts +37 -0
  710. package/src/domain/scriptdev/lochModan.ts +283 -0
  711. package/src/domain/scriptdev/maraudon.ts +232 -0
  712. package/src/domain/scriptdev/moltenCore.ts +831 -0
  713. package/src/domain/scriptdev/moonglade.ts +659 -0
  714. package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
  715. package/src/domain/scriptdev/naxxramas.ts +577 -0
  716. package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
  717. package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
  718. package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
  719. package/src/domain/scriptdev/npcProfessions.ts +1025 -0
  720. package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
  721. package/src/domain/scriptdev/onyxiasLair.ts +313 -0
  722. package/src/domain/scriptdev/orgrimmar.ts +147 -0
  723. package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
  724. package/src/domain/scriptdev/razorfenDowns.ts +468 -0
  725. package/src/domain/scriptdev/razorfenKraul.ts +410 -0
  726. package/src/domain/scriptdev/redridgeMountains.ts +163 -0
  727. package/src/domain/scriptdev/registry.ts +945 -0
  728. package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
  729. package/src/domain/scriptdev/scarletMonastery.ts +713 -0
  730. package/src/domain/scriptdev/scholomance.ts +682 -0
  731. package/src/domain/scriptdev/searingGorge.ts +295 -0
  732. package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
  733. package/src/domain/scriptdev/silithus.ts +71 -0
  734. package/src/domain/scriptdev/silverpineForest.ts +662 -0
  735. package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
  736. package/src/domain/scriptdev/stormwindCity.ts +1192 -0
  737. package/src/domain/scriptdev/stranglethornVale.ts +402 -0
  738. package/src/domain/scriptdev/stratholme.ts +650 -0
  739. package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
  740. package/src/domain/scriptdev/sunkenTemple.ts +736 -0
  741. package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
  742. package/src/domain/scriptdev/tanaris.ts +391 -0
  743. package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
  744. package/src/domain/scriptdev/teldrassil.ts +143 -0
  745. package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
  746. package/src/domain/scriptdev/theBarrens.ts +709 -0
  747. package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
  748. package/src/domain/scriptdev/thousandNeedles.ts +426 -0
  749. package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
  750. package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
  751. package/src/domain/scriptdev/types.ts +1026 -0
  752. package/src/domain/scriptdev/uldaman.ts +437 -0
  753. package/src/domain/scriptdev/ungoroCrater.ts +549 -0
  754. package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
  755. package/src/domain/scriptdev/wailingCaverns.ts +700 -0
  756. package/src/domain/scriptdev/warEffort.ts +371 -0
  757. package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
  758. package/src/domain/scriptdev/westfall.ts +767 -0
  759. package/src/domain/scriptdev/wetlands.ts +660 -0
  760. package/src/domain/scriptdev/winterspring.ts +482 -0
  761. package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
  762. package/src/domain/scriptdev/worldBosses.ts +605 -0
  763. package/src/domain/scriptdev/zulfarrak.ts +478 -0
  764. package/src/domain/scriptdev/zulgurub.ts +1152 -0
  765. package/src/domain/sim/dummySim.ts +408 -0
  766. package/src/domain/sim/targetDummy.ts +29 -0
  767. package/src/domain/social/guild.ts +148 -0
  768. package/src/domain/spells/areaAuraMembership.ts +93 -0
  769. package/src/domain/spells/breakableStunCc.ts +166 -0
  770. package/src/domain/spells/cancelAura.ts +80 -0
  771. package/src/domain/spells/diminishing.ts +167 -0
  772. package/src/domain/spells/dispel.ts +149 -0
  773. package/src/domain/spells/dispelMechanic.ts +105 -0
  774. package/src/domain/spells/equipSpells.ts +247 -0
  775. package/src/domain/spells/learnOnTargets.ts +260 -0
  776. package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
  777. package/src/domain/spells/resurrectSpell.ts +124 -0
  778. package/src/domain/spells/spellPushback.ts +39 -0
  779. package/src/domain/spells/spellReflect.ts +43 -0
  780. package/src/domain/spells/stealth.ts +183 -0
  781. package/src/domain/spells/totem.ts +394 -0
  782. package/src/domain/spells/worldCast.ts +187 -0
  783. package/src/domain/world/areaTriggerLocks.ts +177 -0
  784. package/src/domain/world/dungeonMusic.ts +108 -0
  785. package/src/domain/world/gameEvents.ts +119 -0
  786. package/src/domain/world/gameObjects.ts +1030 -0
  787. package/src/domain/world/goEventFire.ts +234 -0
  788. package/src/domain/world/goMoTransport.ts +74 -0
  789. package/src/domain/world/goTransport.ts +81 -0
  790. package/src/domain/world/hazards.ts +459 -0
  791. package/src/domain/world/openLock.ts +398 -0
  792. package/src/domain/world/pools.ts +470 -0
  793. package/src/domain/world/restArea.ts +37 -0
  794. package/src/domain/world/weather.ts +201 -0
  795. package/src/domain/zoneAmbience.mjs +87 -0
  796. package/src/domain/zoneMusic.mjs +62 -0
  797. package/src/domain/zoneMusicQueue.mjs +7 -0
  798. package/src/engine/combat/activeSeal.ts +39 -0
  799. package/src/engine/combat/aiTargetResolve.ts +64 -0
  800. package/src/engine/combat/aoeCast.ts +289 -0
  801. package/src/engine/combat/applyConsumeAura.ts +74 -0
  802. package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
  803. package/src/engine/combat/applyDispelMechanic.ts +30 -0
  804. package/src/engine/combat/applyHealEffect.ts +301 -0
  805. package/src/engine/combat/applySchoolAbsorb.ts +114 -0
  806. package/src/engine/combat/applySpell.ts +3169 -0
  807. package/src/engine/combat/applySpellLate.ts +2026 -0
  808. package/src/engine/combat/applySpellLateBag.ts +144 -0
  809. package/src/engine/combat/areaAura.ts +283 -0
  810. package/src/engine/combat/attackTable.ts +508 -0
  811. package/src/engine/combat/battleRez.ts +87 -0
  812. package/src/engine/combat/castAction.ts +36 -0
  813. package/src/engine/combat/castTargetGates.ts +75 -0
  814. package/src/engine/combat/castableKit.ts +68 -0
  815. package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
  816. package/src/engine/combat/chainFan.ts +210 -0
  817. package/src/engine/combat/channel.ts +423 -0
  818. package/src/engine/combat/chaseCloseness.ts +95 -0
  819. package/src/engine/combat/cmangosCastGates.ts +129 -0
  820. package/src/engine/combat/combatFlag.ts +77 -0
  821. package/src/engine/combat/combatGeometry.ts +1329 -0
  822. package/src/engine/combat/combustion.ts +68 -0
  823. package/src/engine/combat/context.ts +730 -0
  824. package/src/engine/combat/createSession.ts +1165 -0
  825. package/src/engine/combat/creatureLeash.ts +38 -0
  826. package/src/engine/combat/crowdControl.ts +1259 -0
  827. package/src/engine/combat/dispelDuty.ts +54 -0
  828. package/src/engine/combat/dispelReflect.ts +609 -0
  829. package/src/engine/combat/displaceFloor.ts +113 -0
  830. package/src/engine/combat/duelBounds.ts +47 -0
  831. package/src/engine/combat/equippedItemGate.ts +297 -0
  832. package/src/engine/combat/evadeLifecycle.ts +63 -0
  833. package/src/engine/combat/eventAi.ts +2220 -0
  834. package/src/engine/combat/facing.ts +74 -0
  835. package/src/engine/combat/fearFlee.ts +137 -0
  836. package/src/engine/combat/fighterFactory.ts +1144 -0
  837. package/src/engine/combat/forceDespawnAction.ts +51 -0
  838. package/src/engine/combat/formulas.ts +807 -0
  839. package/src/engine/combat/friendlyFan.ts +55 -0
  840. package/src/engine/combat/groundPoolTick.ts +210 -0
  841. package/src/engine/combat/hazards.ts +114 -0
  842. package/src/engine/combat/healTargets.ts +226 -0
  843. package/src/engine/combat/heartbeatResist.ts +49 -0
  844. package/src/engine/combat/hostileItemUse.ts +75 -0
  845. package/src/engine/combat/interruptAuras.ts +66 -0
  846. package/src/engine/combat/itemRescue.ts +49 -0
  847. package/src/engine/combat/itemUse.ts +260 -0
  848. package/src/engine/combat/kitById.ts +23 -0
  849. package/src/engine/combat/knockBack.ts +201 -0
  850. package/src/engine/combat/leap.ts +89 -0
  851. package/src/engine/combat/mitigation.ts +587 -0
  852. package/src/engine/combat/modTaunt.ts +43 -0
  853. package/src/engine/combat/motionClaim.ts +268 -0
  854. package/src/engine/combat/motionGate.ts +150 -0
  855. package/src/engine/combat/motionGenerator.ts +27 -0
  856. package/src/engine/combat/navSight.ts +138 -0
  857. package/src/engine/combat/perfSink.ts +28 -0
  858. package/src/engine/combat/periodicDue.ts +55 -0
  859. package/src/engine/combat/petAuras.ts +86 -0
  860. package/src/engine/combat/pickAction.ts +3449 -0
  861. package/src/engine/combat/powerForm.ts +735 -0
  862. package/src/engine/combat/powerPools.ts +49 -0
  863. package/src/engine/combat/predicates.ts +538 -0
  864. package/src/engine/combat/procsDamage.ts +1823 -0
  865. package/src/engine/combat/reactiveGates.ts +135 -0
  866. package/src/engine/combat/roles.ts +389 -0
  867. package/src/engine/combat/rotationSubject.ts +78 -0
  868. package/src/engine/combat/ruleAfter.ts +106 -0
  869. package/src/engine/combat/seedDisplayAuras.ts +203 -0
  870. package/src/engine/combat/seedOocEffects.ts +317 -0
  871. package/src/engine/combat/seedSchoolImmunities.ts +45 -0
  872. package/src/engine/combat/session-types.ts +458 -0
  873. package/src/engine/combat/sessionApi.ts +1785 -0
  874. package/src/engine/combat/sessionCharge.ts +124 -0
  875. package/src/engine/combat/sessionChase.ts +869 -0
  876. package/src/engine/combat/sessionDeaths.ts +469 -0
  877. package/src/engine/combat/sessionFocus.ts +506 -0
  878. package/src/engine/combat/sessionFollow.ts +167 -0
  879. package/src/engine/combat/sessionGeometry.ts +188 -0
  880. package/src/engine/combat/sessionHome.ts +75 -0
  881. package/src/engine/combat/sessionInject.ts +719 -0
  882. package/src/engine/combat/sessionMechanicMove.ts +555 -0
  883. package/src/engine/combat/sessionMotion.ts +1553 -0
  884. package/src/engine/combat/sessionMotionKit.ts +247 -0
  885. package/src/engine/combat/sessionMoveIntent.ts +49 -0
  886. package/src/engine/combat/sessionMoveOrder.ts +200 -0
  887. package/src/engine/combat/sessionPathTo.ts +657 -0
  888. package/src/engine/combat/sessionPools.ts +688 -0
  889. package/src/engine/combat/sessionSteer.ts +144 -0
  890. package/src/engine/combat/sessionStepBack.ts +151 -0
  891. package/src/engine/combat/sessionStepWrap.ts +116 -0
  892. package/src/engine/combat/sessionView.ts +442 -0
  893. package/src/engine/combat/simEffects.ts +32 -0
  894. package/src/engine/combat/simFacade.ts +620 -0
  895. package/src/engine/combat/simPump.ts +264 -0
  896. package/src/engine/combat/simSnapshot.ts +165 -0
  897. package/src/engine/combat/simThreadPool.ts +35 -0
  898. package/src/engine/combat/skeramImages.ts +57 -0
  899. package/src/engine/combat/slowUpdate.ts +178 -0
  900. package/src/engine/combat/snapToFloor.ts +42 -0
  901. package/src/engine/combat/speedAura.ts +29 -0
  902. package/src/engine/combat/spellReagents.ts +71 -0
  903. package/src/engine/combat/stealthDetect.ts +93 -0
  904. package/src/engine/combat/stepBackMotion.ts +171 -0
  905. package/src/engine/combat/stepSession.ts +3102 -0
  906. package/src/engine/combat/summonCast.ts +243 -0
  907. package/src/engine/combat/thaddiusPolarity.ts +97 -0
  908. package/src/engine/combat/threat.ts +388 -0
  909. package/src/engine/combat/threatOps.ts +272 -0
  910. package/src/engine/combat/tickWorkerBody.ts +211 -0
  911. package/src/engine/combat/totemAuras.ts +122 -0
  912. package/src/engine/combat/triggerPayload.ts +42 -0
  913. package/src/engine/combat/triggeredCompanion.ts +63 -0
  914. package/src/engine/combat/types.ts +1897 -0
  915. package/src/engine/combat/useObjectTrap.ts +140 -0
  916. package/src/engine/combat/walkSurface.ts +54 -0
  917. package/src/engine/combat/weapon.ts +1248 -0
  918. package/src/engine/combat/worldFrame.ts +43 -0
  919. package/src/engine/combat.solo-golden.json +2242 -0
  920. package/src/engine/combat.ts +84 -0
  921. package/src/engine/core/detMath.ts +289 -0
  922. package/src/engine/core/events.ts +357 -0
  923. package/src/engine/core/rng.ts +36 -0
  924. package/src/engine/game/actionBars.ts +124 -0
  925. package/src/engine/game/activateObjectFromSpell.ts +320 -0
  926. package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
  927. package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
  928. package/src/engine/game/applyDoorFromDbScript.ts +388 -0
  929. package/src/engine/game/applyEscortFromDbScript.ts +290 -0
  930. package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
  931. package/src/engine/game/applyHoverFromDbScript.ts +110 -0
  932. package/src/engine/game/applyOocResurrect.ts +71 -0
  933. package/src/engine/game/applySpellDurability.ts +115 -0
  934. package/src/engine/game/applyTailFromDbScript.ts +478 -0
  935. package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
  936. package/src/engine/game/auctionMail.ts +269 -0
  937. package/src/engine/game/bagOverflow.ts +130 -0
  938. package/src/engine/game/bank.ts +110 -0
  939. package/src/engine/game/barAutofill.ts +26 -0
  940. package/src/engine/game/battleground.ts +369 -0
  941. package/src/engine/game/combatEnemySpec.ts +216 -0
  942. package/src/engine/game/combatObjectTraps.ts +167 -0
  943. package/src/engine/game/combatSeed.ts +320 -0
  944. package/src/engine/game/combatSession.ts +3241 -0
  945. package/src/engine/game/combatSessionClock.ts +62 -0
  946. package/src/engine/game/companionQuestActions.ts +242 -0
  947. package/src/engine/game/companionTraining.ts +40 -0
  948. package/src/engine/game/consumables.ts +624 -0
  949. package/src/engine/game/context.ts +53 -0
  950. package/src/engine/game/createHealthstone.ts +45 -0
  951. package/src/engine/game/deathFlow.ts +127 -0
  952. package/src/engine/game/devGrant.ts +117 -0
  953. package/src/engine/game/dynamicObject.ts +365 -0
  954. package/src/engine/game/enchantItem.ts +177 -0
  955. package/src/engine/game/equipmentHelper.ts +806 -0
  956. package/src/engine/game/factionState.ts +108 -0
  957. package/src/engine/game/garmentsOoc.ts +69 -0
  958. package/src/engine/game/globalActionBar.ts +179 -0
  959. package/src/engine/game/goInteractQuestCredit.ts +51 -0
  960. package/src/engine/game/goMoTransportUse.ts +61 -0
  961. package/src/engine/game/goTransportUse.ts +60 -0
  962. package/src/engine/game/healthstoneUpkeep.ts +59 -0
  963. package/src/engine/game/killSkin.ts +124 -0
  964. package/src/engine/game/learnFromItem.ts +118 -0
  965. package/src/engine/game/loadReconcile.ts +551 -0
  966. package/src/engine/game/loot.ts +294 -0
  967. package/src/engine/game/macros.ts +125 -0
  968. package/src/engine/game/mail.ts +293 -0
  969. package/src/engine/game/meetingStoneQueue.ts +75 -0
  970. package/src/engine/game/meetingStoneUse.ts +54 -0
  971. package/src/engine/game/newGameState.ts +363 -0
  972. package/src/engine/game/oocAuraInterrupt.ts +92 -0
  973. package/src/engine/game/oocCast.ts +241 -0
  974. package/src/engine/game/oocCastEffects.ts +803 -0
  975. package/src/engine/game/oocCastMethods.ts +1077 -0
  976. package/src/engine/game/openLockFromSpell.ts +174 -0
  977. package/src/engine/game/outdoorPvp.ts +187 -0
  978. package/src/engine/game/outfitter.ts +644 -0
  979. package/src/engine/game/paladinBoard.ts +393 -0
  980. package/src/engine/game/partyAuras.ts +121 -0
  981. package/src/engine/game/persistCombatAuras.ts +91 -0
  982. package/src/engine/game/pets.ts +459 -0
  983. package/src/engine/game/prePullHealthstones.ts +154 -0
  984. package/src/engine/game/professions.ts +2227 -0
  985. package/src/engine/game/pruneStaleRuntime.ts +39 -0
  986. package/src/engine/game/questFightCredit.ts +36 -0
  987. package/src/engine/game/questItemOnCorpse.ts +166 -0
  988. package/src/engine/game/questItemOnCreature.ts +103 -0
  989. package/src/engine/game/questLog.ts +879 -0
  990. package/src/engine/game/questSpellComplete.ts +21 -0
  991. package/src/engine/game/questTurnIn.ts +598 -0
  992. package/src/engine/game/raidParty.ts +32 -0
  993. package/src/engine/game/reagentBuyIn.ts +39 -0
  994. package/src/engine/game/regenRest.ts +186 -0
  995. package/src/engine/game/rotation.ts +425 -0
  996. package/src/engine/game/runFullDungeon.ts +611 -0
  997. package/src/engine/game/runSupply.ts +80 -0
  998. package/src/engine/game/sanitizeDriftedItems.ts +135 -0
  999. package/src/engine/game/scriptDevGoUse.ts +397 -0
  1000. package/src/engine/game/scriptDevInnkeeper.ts +150 -0
  1001. package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
  1002. package/src/engine/game/sendEventFromSpell.ts +87 -0
  1003. package/src/engine/game/sortContainers.ts +85 -0
  1004. package/src/engine/game/spellReputation.ts +69 -0
  1005. package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
  1006. package/src/engine/game/squadDungeon.ts +4222 -0
  1007. package/src/engine/game/squadQuestShare.ts +260 -0
  1008. package/src/engine/game/summonObjectSlot.ts +69 -0
  1009. package/src/engine/game/summonObjectWild.ts +73 -0
  1010. package/src/engine/game/summoningRitualUse.ts +141 -0
  1011. package/src/engine/game/talents.ts +356 -0
  1012. package/src/engine/game/tamingRodUse.ts +66 -0
  1013. package/src/engine/game/tempSpawnCreature.ts +136 -0
  1014. package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
  1015. package/src/engine/game/tickTimedQuests.ts +28 -0
  1016. package/src/engine/game/trade.ts +586 -0
  1017. package/src/engine/game/travel.ts +1155 -0
  1018. package/src/engine/game/types.ts +1855 -0
  1019. package/src/engine/game/vendorOffers.ts +244 -0
  1020. package/src/engine/game/weaponImbueItem.ts +281 -0
  1021. package/src/engine/game/worldSession.ts +183 -0
  1022. package/src/engine/game/worldState.ts +166 -0
  1023. package/src/engine/game.ts +968 -0
  1024. package/src/engine/spells/GAP.md +67 -0
  1025. package/src/engine/spells/absorbs.ts +376 -0
  1026. package/src/engine/spells/addTargetTrigger.ts +53 -0
  1027. package/src/engine/spells/auraPerSecondCost.ts +50 -0
  1028. package/src/engine/spells/auraStacking.ts +497 -0
  1029. package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
  1030. package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
  1031. package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
  1032. package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
  1033. package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
  1034. package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
  1035. package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
  1036. package/src/engine/spells/cmangos-special-cases.ts +1570 -0
  1037. package/src/engine/spells/conditions.ts +718 -0
  1038. package/src/engine/spells/effects.ts +203 -0
  1039. package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
  1040. package/src/engine/spells/immunity.ts +942 -0
  1041. package/src/engine/spells/intentEffects.ts +351 -0
  1042. package/src/engine/spells/interpreter/GAPS.md +21 -0
  1043. package/src/engine/spells/interpreter/amount.ts +109 -0
  1044. package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
  1045. package/src/engine/spells/interpreter/diff.ts +246 -0
  1046. package/src/engine/spells/interpreter/duration.ts +90 -0
  1047. package/src/engine/spells/interpreter/form-attrs.json +1 -0
  1048. package/src/engine/spells/interpreter/form-attrs.ts +95 -0
  1049. package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
  1050. package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
  1051. package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
  1052. package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
  1053. package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
  1054. package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
  1055. package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
  1056. package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
  1057. package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
  1058. package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
  1059. package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
  1060. package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
  1061. package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
  1062. package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
  1063. package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
  1064. package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
  1065. package/src/engine/spells/interpreter/handlers.ts +9 -0
  1066. package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
  1067. package/src/engine/spells/interpreter/index.ts +525 -0
  1068. package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
  1069. package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
  1070. package/src/engine/spells/interpreter/mage-portals.ts +37 -0
  1071. package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
  1072. package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
  1073. package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
  1074. package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
  1075. package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
  1076. package/src/engine/spells/interpreter/opcodes.ts +789 -0
  1077. package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
  1078. package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
  1079. package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
  1080. package/src/engine/spells/interpreter/proc.ts +443 -0
  1081. package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
  1082. package/src/engine/spells/interpreter/registry/index.ts +216 -0
  1083. package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
  1084. package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
  1085. package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
  1086. package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
  1087. package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
  1088. package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
  1089. package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
  1090. package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
  1091. package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
  1092. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
  1093. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
  1094. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
  1095. package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
  1096. package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
  1097. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
  1098. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
  1099. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
  1100. package/src/engine/spells/interpreter/registry/types.ts +48 -0
  1101. package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
  1102. package/src/engine/spells/interpreter/targeting.ts +90 -0
  1103. package/src/engine/spells/interpreter/types-intent.ts +1501 -0
  1104. package/src/engine/spells/interpreter/types.ts +419 -0
  1105. package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
  1106. package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
  1107. package/src/engine/spells/interrupt.ts +217 -0
  1108. package/src/engine/spells/meleeAttackReset.ts +60 -0
  1109. package/src/engine/spells/oocTriggerSpell.ts +49 -0
  1110. package/src/engine/spells/overrideClassScripts.ts +319 -0
  1111. package/src/engine/spells/parryHaste.ts +20 -0
  1112. package/src/engine/spells/procs.ts +300 -0
  1113. package/src/engine/spells/recovery.ts +203 -0
  1114. package/src/engine/spells/scriptTargetDest.ts +76 -0
  1115. package/src/engine/spells/scriptTargets.ts +85 -0
  1116. package/src/engine/spells/singleTargetAura.ts +82 -0
  1117. package/src/engine/spells/specialCasePayloads.ts +57 -0
  1118. package/src/engine/spells/spellAttributes.ts +249 -0
  1119. package/src/engine/spells/spellBonus.ts +143 -0
  1120. package/src/engine/spells/spellModIntents.ts +419 -0
  1121. package/src/engine/spells/spellMods.ts +283 -0
  1122. package/src/engine/spells/spellRadius.ts +15 -0
  1123. package/src/engine/spells/trapObjects.ts +26 -0
  1124. package/src/json.d.ts +7 -0
  1125. package/src/persistence/memoryRepository.ts +23 -0
  1126. package/src/persistence/saveBackups.ts +162 -0
  1127. package/src/persistence/saveFile.ts +68 -0
  1128. package/src/persistence/saveRepository.ts +11 -0
  1129. package/src/persistence/saveShape.ts +668 -0
  1130. package/src/progression/leveling.ts +89 -0
  1131. package/src/progression/rest.ts +1434 -0
  1132. package/src/progression/training.ts +226 -0
  1133. package/src/progression/xpGain.ts +369 -0
  1134. package/src/quests/quests.ts +1580 -0
  1135. package/src/world/aoePull.ts +198 -0
  1136. package/src/world/areaTableDbc.ts +39 -0
  1137. package/src/world/areaTableMapIdPairs.ts +141 -0
  1138. package/src/world/bakeSlug.ts +43 -0
  1139. package/src/world/continuousDungeon.ts +1250 -0
  1140. package/src/world/dungeonBakeProjection.ts +190 -0
  1141. package/src/world/dungeonMapDensity.ts +342 -0
  1142. package/src/world/dungeonMapProjection.ts +135 -0
  1143. package/src/world/dungeonNav.ts +904 -0
  1144. package/src/world/dungeonNpcSim.ts +147 -0
  1145. package/src/world/dungeonObjectives.ts +234 -0
  1146. package/src/world/dungeonPreset.ts +35 -0
  1147. package/src/world/dungeonRoute.ts +311 -0
  1148. package/src/world/dungeonRouteGeometry.ts +732 -0
  1149. package/src/world/dungeonRouteOrder.ts +1037 -0
  1150. package/src/world/dungeonWingRooms.ts +426 -0
  1151. package/src/world/escort.ts +296 -0
  1152. package/src/world/goPoolRoll.ts +75 -0
  1153. package/src/world/instanceObjects.ts +785 -0
  1154. package/src/world/instances.ts +1572 -0
  1155. package/src/world/meetingStones.ts +56 -0
  1156. package/src/world/navmeshFloors.ts +145 -0
  1157. package/src/world/nearGrid.ts +167 -0
  1158. package/src/world/packBudget.ts +613 -0
  1159. package/src/world/rareRoll.ts +335 -0
  1160. package/src/world/routeAuthoring.ts +132 -0
  1161. package/src/world/routeEdit.ts +209 -0
  1162. package/src/world/world.ts +812 -0
  1163. package/src/world/zoneHazards.ts +47 -0
@@ -0,0 +1,1410 @@
1
+ // Blackrock Depths (map 230) — InstanceDef graph. Authority: docs/dungeons/survey/15-blackrock-depths.md,
2
+ // which also carries the residual GAPS list. Ring of Law rolls per run; Theldren is dispositioned.
3
+
4
+ import type { EncounterDef, EncounterEvent, InstanceDef } from '../schema.ts';
5
+ import {
6
+ entranceForInstance,
7
+ buildClusterEncounters,
8
+ } from './pack-from-clusters.ts';
9
+
10
+ // ---- Census static counts (map 230; survey creature census static column) ----
11
+ // Friendly/service, bosses and summon-only entries leave the kill population; see the survey.
12
+
13
+ /** Pure static trash totals (non-boss, non-friendly, non-summon-only). Survey static column. */
14
+ export const STATIC = {
15
+ anvilrageOverseer: 4, // 8889
16
+ anvilrageWarden: 35, // 8890
17
+ anvilrageGuardsman: 57, // 8891
18
+ anvilrageFootman: 55, // 8892
19
+ anvilrageSoldier: 38, // 8893
20
+ anvilrageMedic: 31, // 8894
21
+ anvilrageOfficer: 20, // 8895
22
+ shadowforgePeasant: 42, // 8896
23
+ doomforgeCraftsman: 24, // 8897
24
+ anvilrageMarshal: 12, // 8898
25
+ doomforgeDragoon: 16, // 8899
26
+ doomforgeArcanasmith: 29, // 8900
27
+ anvilrageReservist: 244, // 8901
28
+ shadowforgeCitizen: 16, // 8902
29
+ anvilrageCaptain: 2, // 8903
30
+ shadowforgeSenator: 40, // 8904
31
+ warbringerConstruct: 12, // 8905
32
+ ragereaverGolem: 8, // 8906
33
+ wrathHammerConstruct: 8, // 8907
34
+ moltenWarGolem: 6, // 8908
35
+ fireguard: 11, // 8909
36
+ blazingFireguard: 19, // 8910
37
+ fireguardDestroyer: 45, // 8911
38
+ twilightTorturer: 24, // 8912
39
+ twilightEmissary: 18, // 8913
40
+ twilightBodyguard: 5, // 8914
41
+ twilightAmbassador: 12, // 8915
42
+ arenaSpectator: 24, // 8916
43
+ weaponTechnician: 26, // 8920
44
+ bloodhound: 96, // 8921
45
+ bloodhoundMastiff: 6, // 8922
46
+ ironhandGuardian: 6, // 8982
47
+ shadowforgeFlameKeeper: 12, // 9956
48
+ // Ograbisi 9677 / Crest Killer 9680 / Jaz 9681 / Slave 10116 / Tortured Slave 10117:
49
+ // faction 35 friendly-to-all — not pure static kill trash (see nonCombatTrashEntries).
50
+ } as const;
51
+
52
+ /** Entry → count map for tests (pure static only). */
53
+ export const BLACKROCK_DEPTHS_STATIC: Readonly<Record<number, number>> = {
54
+ 8889: STATIC.anvilrageOverseer,
55
+ 8890: STATIC.anvilrageWarden,
56
+ 8891: STATIC.anvilrageGuardsman,
57
+ 8892: STATIC.anvilrageFootman,
58
+ 8893: STATIC.anvilrageSoldier,
59
+ 8894: STATIC.anvilrageMedic,
60
+ 8895: STATIC.anvilrageOfficer,
61
+ 8896: STATIC.shadowforgePeasant,
62
+ 8897: STATIC.doomforgeCraftsman,
63
+ 8898: STATIC.anvilrageMarshal,
64
+ 8899: STATIC.doomforgeDragoon,
65
+ 8900: STATIC.doomforgeArcanasmith,
66
+ 8901: STATIC.anvilrageReservist,
67
+ 8902: STATIC.shadowforgeCitizen,
68
+ 8903: STATIC.anvilrageCaptain,
69
+ 8904: STATIC.shadowforgeSenator,
70
+ 8905: STATIC.warbringerConstruct,
71
+ 8906: STATIC.ragereaverGolem,
72
+ 8907: STATIC.wrathHammerConstruct,
73
+ 8908: STATIC.moltenWarGolem,
74
+ 8909: STATIC.fireguard,
75
+ 8910: STATIC.blazingFireguard,
76
+ 8911: STATIC.fireguardDestroyer,
77
+ 8912: STATIC.twilightTorturer,
78
+ 8913: STATIC.twilightEmissary,
79
+ 8914: STATIC.twilightBodyguard,
80
+ 8915: STATIC.twilightAmbassador,
81
+ 8916: STATIC.arenaSpectator,
82
+ 8920: STATIC.weaponTechnician,
83
+ 8921: STATIC.bloodhound,
84
+ 8922: STATIC.bloodhoundMastiff,
85
+ 8982: STATIC.ironhandGuardian,
86
+ 9956: STATIC.shadowforgeFlameKeeper,
87
+ };
88
+
89
+ export const ENTRY = {
90
+ anvilrageOverseer: 8889,
91
+ anvilrageWarden: 8890,
92
+ anvilrageGuardsman: 8891,
93
+ anvilrageFootman: 8892,
94
+ anvilrageSoldier: 8893,
95
+ anvilrageMedic: 8894,
96
+ anvilrageOfficer: 8895,
97
+ shadowforgePeasant: 8896,
98
+ doomforgeCraftsman: 8897,
99
+ anvilrageMarshal: 8898,
100
+ doomforgeDragoon: 8899,
101
+ doomforgeArcanasmith: 8900,
102
+ anvilrageReservist: 8901,
103
+ shadowforgeCitizen: 8902,
104
+ anvilrageCaptain: 8903,
105
+ shadowforgeSenator: 8904,
106
+ warbringerConstruct: 8905,
107
+ ragereaverGolem: 8906,
108
+ wrathHammerConstruct: 8907,
109
+ moltenWarGolem: 8908,
110
+ fireguard: 8909,
111
+ blazingFireguard: 8910,
112
+ fireguardDestroyer: 8911,
113
+ twilightTorturer: 8912,
114
+ twilightEmissary: 8913,
115
+ twilightBodyguard: 8914,
116
+ twilightAmbassador: 8915,
117
+ arenaSpectator: 8916,
118
+ weaponTechnician: 8920,
119
+ bloodhound: 8921,
120
+ bloodhoundMastiff: 8922,
121
+ ironhandGuardian: 8982,
122
+ shadowforgeFlameKeeper: 9956,
123
+ /** Jail crooks / slaves — friendly faction 35; kept as id constants only (not kill trash). */
124
+ ograbisi: 9677,
125
+ crestKiller: 9680,
126
+ jaz: 9681,
127
+ slave: 10116,
128
+ torturedSlave: 10117,
129
+ verek: 9042,
130
+ // Canonical bosses (survey order)
131
+ lordRoccor: 9025,
132
+ highInterrogatorGerstahn: 9018,
133
+ houndmasterGrebmar: 9319,
134
+ // Ring of Law pool (summon-only 1 of 6)
135
+ anubshiah: 9031,
136
+ eviscerator: 9029,
137
+ gorosh: 9027,
138
+ grizzle: 9028,
139
+ hedrum: 9032,
140
+ okthor: 9030,
141
+ pyromancerLoregrain: 9024,
142
+ lordIncendius: 9017,
143
+ warderStilgiss: 9041,
144
+ fineousDarkvire: 9056,
145
+ baelgar: 9016,
146
+ generalAngerforge: 9033,
147
+ golemLordArgelmach: 8983,
148
+ hurleyBlackbreath: 9537, // summon-only
149
+ phalanx: 9502,
150
+ ribbly: 9543,
151
+ plugger: 9499,
152
+ ambassadorFlamelash: 9156,
153
+ panzor: 8923,
154
+ doomrel: 9039,
155
+ magmus: 9938,
156
+ princessMoira: 8929,
157
+ emperorDagran: 9019,
158
+ // Tomb of the Seven (event-awakened; waves on Doom'rel)
159
+ angerrel: 9035,
160
+ seethrel: 9038,
161
+ doperel: 9040,
162
+ gloomrel: 9037,
163
+ vilerel: 9036,
164
+ haterel: 9034,
165
+ // Event summon-only — Ring of Law trash pool (blackrock_depths.h :177–182)
166
+ ringWorm: 8925, // NPC_WORM
167
+ ringStinger: 8926, // NPC_STINGER
168
+ ringScreecher: 8927, // NPC_SCREECHER
169
+ ringThundersnout: 8928, // NPC_THUNDERSNOUT
170
+ ringCreeper: 8933, // NPC_CREEPER
171
+ ringBeetle: 8932, // NPC_BEETLE
172
+ blackbreathCrony: 9541,
173
+ /** Grim Guzzler patrons. Cite: blackrock_depths.h:68-70. */
174
+ grimPatron: 9545,
175
+ guzzlingPatron: 9547,
176
+ hammeredPatron: 9554,
177
+ burningSpirit: 9178,
178
+ watchmanDoomgrip: 9476,
179
+ /** Survey E3 jail wave finale — Twilight's Hammer Executioner (summon-only). */
180
+ twilightExecutioner: 9398,
181
+ } as const;
182
+
183
+ /** Flags from survey event choreography / instance_blackrock_depths.cpp. */
184
+ export const BLACKROCK_DEPTHS_FLAGS = {
185
+ ringOfLaw: 'brd-ring-of-law',
186
+ hurleyKegs: 'brd-hurley-kegs',
187
+ vaultCoffers: 'brd-vault-coffers',
188
+ tombOfSeven: 'brd-tomb-of-seven',
189
+ lyceumBraziers: 'brd-lyceum-braziers',
190
+ /** Survey E3 Gor'shak jail defense complete (quest 3982 combat half). */
191
+ gorshakJail: 'brd-gorshak-jail',
192
+ /** Detention Block Cell Doors 170562–170569. Prison Cell Key 11140 from Gerstahn. */
193
+ cellDoors: 'brd-cell-doors',
194
+ /** E5e bar patrol after Ribbly (TYPE_BAR). Cite: instance_blackrock_depths.cpp:546-555. */
195
+ barPatrol: 'brd-bar-patrol',
196
+ } as const;
197
+
198
+ /** Alias matching brief export name. */
199
+ export const FLAGS = BLACKROCK_DEPTHS_FLAGS;
200
+
201
+ // Survey E1 Ring of Law — Arena Gate east, standing in for areatrigger 1526. One mob type
202
+ // (urand 0–5) for both trash waves, then one boss. Cite: blackrock_depths.cpp :197–202.
203
+ export const BRD_RING_OF_LAW = {
204
+ /** ArenaGate01 - flash+opens when arena starts (survey E1). GO_ARENA_1. */
205
+ goEntry: 161525,
206
+ // aRingMob[0] entries + aRingMob[1] counts per wave (two waves). Order: WORM, STINGER, SCREECHER,
207
+ // THUNDERSNOUT, CREEPER, BEETLE.
208
+ mobPool: [
209
+ { entry: ENTRY.ringWorm, count: 4 }, // 8925
210
+ { entry: ENTRY.ringStinger, count: 2 }, // 8926
211
+ { entry: ENTRY.ringScreecher, count: 5 }, // 8927
212
+ { entry: ENTRY.ringThundersnout, count: 3 }, // 8928
213
+ { entry: ENTRY.ringCreeper, count: 3 }, // 8933
214
+ { entry: ENTRY.ringBeetle, count: 7 }, // 8932
215
+ ] as const,
216
+ /** aRingBoss[] — one rolled per run. */
217
+ bossPool: [
218
+ ENTRY.gorosh, // 9027
219
+ ENTRY.grizzle, // 9028
220
+ ENTRY.eviscerator, // 9029
221
+ ENTRY.okthor, // 9030
222
+ ENTRY.anubshiah, // 9031
223
+ ENTRY.hedrum, // 9032
224
+ ] as const,
225
+ /** Placeholder primary for graph inspection (overwritten at fight materialize). */
226
+ bossEntry: ENTRY.gorosh,
227
+ /** Placeholder trash (overwritten at fight materialize). */
228
+ trashEntry: ENTRY.ringWorm,
229
+ trashPerWave: 4,
230
+ waveCount: 2,
231
+ /** POS_EAST — blackrock_depths.cpp:191 aSpawnPositions[0]. */
232
+ mobSpawn: { x: 608.96, y: -235.322, z: -53.907 },
233
+ /** POS_NORTH — blackrock_depths.cpp:192 aSpawnPositions[1] (enc.origin). */
234
+ bossSpawn: { x: 644.3, y: -175.989, z: -53.739 },
235
+ /** aArenaCrowdVolume / at_ring_of_law centre — blackrock_depths.h:162. */
236
+ arenaCenter: { x: 595.78, y: -188.65, z: -38.63 },
237
+ /** Wave1→wave2 m_uiEventTimer — blackrock_depths.cpp:459-460. */
238
+ mobWaveGapMs: 16_000,
239
+ /** Last-mob-wave→boss after SummonedCreatureJustDied — blackrock_depths.cpp:318-319. */
240
+ bossAfterClearMs: 5_000,
241
+ } as const;
242
+
243
+ // Sticky per-attempt seed shared by floor gauntlet + beginEncounter. bodyGuid FNV matches
244
+ // summonedBodyGuid(encId); salt = clearedGuids.length.
245
+ export function ringOfLawAttemptSeed(encId: string, clearedCount: number): number {
246
+ let h = 2166136261;
247
+ for (let i = 0; i < encId.length; i++) {
248
+ h ^= encId.charCodeAt(i);
249
+ h = Math.imul(h, 16777619);
250
+ }
251
+ const bodyGuid = -(1 + ((h >>> 0) % 0x7fffffff));
252
+ return (bodyGuid ^ Math.imul(clearedCount, 2654435761)) >>> 0;
253
+ }
254
+
255
+ // Roll Ring of Law waves + boss for one fight (seeded rng [0,1)). Sticky: both trash waves share one mob
256
+ // type; boss is independent 1-of-6. Cite: m_uiMobSpawnId :241; SummonRingMob waves :459/:464; boss :502.
257
+ export function materializeRingOfLawEncounter(
258
+ enc: EncounterDef,
259
+ rng: () => number,
260
+ ): EncounterDef {
261
+ if (enc.id !== 'ring-of-law') return enc;
262
+ const mobN = BRD_RING_OF_LAW.mobPool.length;
263
+ const bossN = BRD_RING_OF_LAW.bossPool.length;
264
+ const mobIdx = Math.min(mobN - 1, Math.floor(rng() * mobN));
265
+ const bossIdx = Math.min(bossN - 1, Math.floor(rng() * bossN));
266
+ const mob = BRD_RING_OF_LAW.mobPool[mobIdx]!;
267
+ const boss = BRD_RING_OF_LAW.bossPool[bossIdx]!;
268
+ const waves = [
269
+ { pack: [{ creatureEntry: mob.entry, count: mob.count }] },
270
+ { pack: [{ creatureEntry: mob.entry, count: mob.count }] },
271
+ { pack: [{ creatureEntry: boss, count: 1 }] },
272
+ ];
273
+ return {
274
+ ...enc,
275
+ creatureEntry: boss,
276
+ events: (enc.events ?? []).map((ev) =>
277
+ ev.kind === 'waves' ? { kind: 'waves' as const, waves } : ev,
278
+ ),
279
+ };
280
+ }
281
+
282
+ // Survey E5d Hurley — 3× Thunderbrew Lager Keg GO 164911. Cite: instance_blackrock_depths.cpp:319-351
283
+ // TYPE_HURLEY SPECIAL; m_uiBrokenKegs==3 :324.
284
+ export const BRD_HURLEY_KEGS = {
285
+ goEntry: 164911,
286
+ /** Cite: instance_blackrock_depths.cpp:324 m_uiBrokenKegs == 3. */
287
+ needUses: 3,
288
+ cronyEntry: ENTRY.blackbreathCrony,
289
+ /** Cite: blackrock_depths.h:14 MAX_CRONIES = 3. */
290
+ cronyCount: 3,
291
+ /** Cite: blackrock_depths.h:206 aHurleyPositions. */
292
+ spawn: { x: 856.0867, y: -149.7469, z: -49.6719, o: 0.05949629 },
293
+ } as const;
294
+
295
+ // Ribbly's fight starts from gossip 1970: dbscripts_on_gossip 197001 sets faction 21 then 736 on him
296
+ // and his three cronies (10043, by guid) and ATTACK_STARTs at +5 s; template 735 is friendly.
297
+ export const BRD_RIBBLY = {
298
+ encId: 'ribbly-screwspigot',
299
+ entry: ENTRY.ribbly,
300
+ cronyEntry: 10043,
301
+ cronyGuids: [2301109, 2301110, 2301111] as const,
302
+ gossipMenu: 1970,
303
+ } as const;
304
+
305
+ // Survey E5e bar patrol — Ribbly death → 1×8911 + 2×8895 unless Plugger is already hostile.
306
+ // Cite: instance_blackrock_depths.cpp:546-555; HandleBarPatrol :707-720.
307
+ export const BRD_BAR_PATROL = {
308
+ destroyerEntry: ENTRY.fireguardDestroyer,
309
+ destroyerCount: 1,
310
+ officerEntry: ENTRY.anvilrageOfficer,
311
+ officerCount: 2,
312
+ /** Behind bar door. Cite: blackrock_depths.h:209-212 aBarPatrolPositions[0]. */
313
+ spawn: { x: 872.7059, y: -232.5491, z: -43.7525, o: 2.069044 },
314
+ } as const;
315
+
316
+ // Survey E5a Rocknot ale path (Phalanx residual — quest turn-in, not InstanceDef objectGate). Cite:
317
+ // blackrock_depths.cpp:1081-1107 QuestRewarded 4295; instance GetData TYPE_ROCKNOT :411 m_uiBarAleCount==3.
318
+ export const BRD_ROCKNOT = {
319
+ questId: 4295,
320
+ alesNeeded: 3,
321
+ } as const;
322
+
323
+ // Plugger's death turns the bar: every patron takes FACTION_DARK_IRON and Phalanx FACTION_IRONFORGE
324
+ // (hostile to Horde only, "do not ask why"). Cite: instance_blackrock_depths.cpp:665-671; blackrock_depths.cpp:628-633.
325
+ export const BRD_BAR_HOSTILE = {
326
+ patronEntries: [ENTRY.grimPatron, ENTRY.guzzlingPatron, ENTRY.hammeredPatron] as const,
327
+ /** Cite: blackrock_depths.h:122 FACTION_DARK_IRON = 54. */
328
+ patronFaction: 54,
329
+ phalanxEntry: ENTRY.phalanx,
330
+ /** Cite: blackrock_depths.h:123 FACTION_IRONFORGE = 122. */
331
+ phalanxFaction: 122,
332
+ /** Rocknot and Nagmara leave when the bar turns. Cite: instance_blackrock_depths.cpp:674-683. */
333
+ despawnEntries: [9503, 9500] as const,
334
+ } as const;
335
+
336
+ // Survey E5c Plugger theft residual (mug/boar GO use → 3 steals). Cite: blackrock_depths.cpp:1814-1836
337
+ // go_bar_ale_mug; instance:366-376 m_uiStolenAles==3.
338
+ export const BRD_PLUGGER_THEFT = {
339
+ goEntries: [165738, 165739] as const,
340
+ stealsNeeded: 3,
341
+ } as const;
342
+
343
+ // Survey E9 Angerforge <30% alarm. ScriptDev owns first pulse; 3-min re-arm schedule below. Cite:
344
+ // boss_general_angerforge.cpp:93-108; NPC_NORMAL_AMOUNT=8 :40; NPC_ELITE_AMOUNT=2 :39.
345
+ export const BRD_ANGERFORGE = {
346
+ /** Cite: boss_general_angerforge.cpp:93 GetHealthPercent() < 30.0f. */
347
+ pct: 30,
348
+ reservistEntry: ENTRY.anvilrageReservist,
349
+ /** Cite: boss_general_angerforge.cpp:40 NPC_NORMAL_AMOUNT = 8. */
350
+ reservistCount: 8,
351
+ medicEntry: ENTRY.anvilrageMedic,
352
+ /** Cite: boss_general_angerforge.cpp:39 NPC_ELITE_AMOUNT = 2. */
353
+ medicCount: 2,
354
+ /** Cite: boss_general_angerforge.cpp:104 m_uiAlarmTimer = 3 * MINUTE * IN_MILLISECONDS. */
355
+ alarmRepeatMs: 180_000,
356
+ /** Cite: boss_general_angerforge.cpp:43 aAlarmPoint. */
357
+ alarmPoint: { x: 717.343, y: 22.116, z: -45.4321, o: 3.1415 },
358
+ } as const;
359
+
360
+ // Alarm pulses after first <30% arm (ms spent in alarm phase). First at 0, then every 3 min. Cite:
361
+ // boss_general_angerforge.cpp:95-108.
362
+ export function angerforgeAlarmsByMs(msInAlarmPhase: number): number {
363
+ if (msInAlarmPhase < 0) return 0;
364
+ return 1 + Math.floor(msInAlarmPhase / BRD_ANGERFORGE.alarmRepeatMs);
365
+ }
366
+
367
+ // Survey E8 Flamelash — pull inject ScriptDev; continuous spirit schedule helpers below. Cite:
368
+ // boss_ambassador_flamelash.cpp:81-91 Aggro; :127-137 spirit timers; h:13 MAX_DWARF_RUNES.
369
+ export const BRD_FLAMELASH = {
370
+ /** Cite: boss_ambassador_flamelash.cpp:88-91 SummonCreature NPC_FIREGUARD_DESTROYER ×4. */
371
+ destroyerEntry: ENTRY.fireguardDestroyer,
372
+ destroyerCount: 4,
373
+ spiritEntry: ENTRY.burningSpirit,
374
+ /** Cite: blackrock_depths.h:13 MAX_DWARF_RUNES = 7. */
375
+ runeCount: 7,
376
+ /** Cite: boss_ambassador_flamelash.cpp:53-54 Reset m_uiSpiritTimer[i] = urand(0, 1000). */
377
+ spiritFirstMaxMs: 1_000,
378
+ /** Cite: boss_ambassador_flamelash.cpp:133 re-arm urand(15000, 30000). */
379
+ spiritRepeatMinMs: 15_000,
380
+ spiritRepeatMaxMs: 30_000,
381
+ } as const;
382
+
383
+ // Min-bound spirits per rune by combat ms (first@0, then every spiritRepeatMinMs). Cite:
384
+ // boss_ambassador_flamelash.cpp:53-54,133.
385
+ export function flamelashSpiritsPerRuneByMs(fightMs: number): number {
386
+ if (fightMs < 0) return 0;
387
+ return 1 + Math.floor(fightMs / BRD_FLAMELASH.spiritRepeatMinMs);
388
+ }
389
+
390
+ /** All 7 runes × per-rune min-bound stream. Cite: MAX_DWARF_RUNES. */
391
+ export function flamelashSpiritsExpectedByMs(fightMs: number): number {
392
+ return flamelashSpiritsPerRuneByMs(fightMs) * BRD_FLAMELASH.runeCount;
393
+ }
394
+
395
+ // Survey E6 Tomb of the Seven — fixed dwarf order; 30s auto-call while previous still up. Cite:
396
+ // blackrock_depths.h:218 aTombDwarfes; instance DoCallNextDwarf :581-593.
397
+ export const BRD_TOMB_OF_SEVEN = {
398
+ encId: 'doomrel',
399
+ order: [
400
+ ENTRY.angerrel, // 9035
401
+ ENTRY.seethrel, // 9038
402
+ ENTRY.doperel, // 9040
403
+ ENTRY.gloomrel, // 9037
404
+ ENTRY.vilerel, // 9036
405
+ ENTRY.haterel, // 9034
406
+ ENTRY.doomrel, // 9039
407
+ ] as const,
408
+ /** Cite: instance_blackrock_depths.cpp:591,768 m_uiDwarfFightTimer = 30000. */
409
+ dwarfFightTimerMs: 30_000,
410
+ } as const;
411
+
412
+ /** Absolute call time for dwarf index 0..6 (first at event start). Cite: DoCallNextDwarf. */
413
+ export function tombDwarfCallAtMs(dwarfIndex: number): number {
414
+ if (dwarfIndex <= 0) return 0;
415
+ return dwarfIndex * BRD_TOMB_OF_SEVEN.dwarfFightTimerMs;
416
+ }
417
+
418
+ // Survey E7 Vault — 12 Relic Coffer Doors + 4 un-stoned Warbringers + Doomgrip.
419
+ // Cite: blackrock_depths.cpp go_relic_coffer_door; instance SetData TYPE_VAULT :204-227.
420
+ export const BRD_VAULT = {
421
+ goEntry: 174554,
422
+ goEntries: [
423
+ 174554, 174555, 174556, 174557, 174558, 174559,
424
+ 174560, 174561, 174562, 174563, 174564, 174566,
425
+ ] as const,
426
+ /** Cite: blackrock_depths.h:11 MAX_RELIC_DOORS = 12. */
427
+ needUses: 12,
428
+ doomgripEntry: ENTRY.watchmanDoomgrip,
429
+ /** Cite: blackrock_depths.h:42 NPC_WARBRINGER_CONST; survey E7 four vault constructs. */
430
+ constructEntry: ENTRY.warbringerConstruct,
431
+ constructCount: 4,
432
+ /** Cite: blackrock_depths.h:203 aVaultPositions. */
433
+ doomgripSpawn: { x: 821.905, y: -338.382, z: -50.134, o: 3.78736 },
434
+ /** Cite: blackrock_depths.h:118 SPELL_STONED = 10255 (removed on vault activate). */
435
+ stonedSpellId: 10255,
436
+ } as const;
437
+
438
+ // Survey E10 Lyceum - both Shadowforge Braziers 174744 + 174745. Cite: survey 15-blackrock-depths.md E10;
439
+ // blackrock_depths.cpp go_shadowforge_brazier.
440
+ export const BRD_LYCEUM_BRAZIERS = {
441
+ goEntry: 174744,
442
+ goEntries: [174744, 174745] as const,
443
+ needUses: 2,
444
+ } as const;
445
+
446
+ // Survey E3 Commander Gor'shak jail defense (quest 3982). Wave1 @ 3–4s: 3×8891; wave2 @ 45–46s:
447
+ // 1×9398 + 2×8891; credit @ 98s. Cite: classic-db dbscripts_on_quest_start id 3982.
448
+ export const BRD_GORSHAK_JAIL = {
449
+ questId: 3982,
450
+ npcEntry: 9020, // Commander Gor'shak
451
+ /** First summon pos (wave1 entry 0) — dbscripts_on_quest_start 3982 delay 3000 cmd 10. */
452
+ origin: { x: 379.509, y: -191.971, z: -69.718 },
453
+ /** Wave1 first summon delay — dbscripts delay 3000. */
454
+ wave1AtMs: 3_000,
455
+ /** Wave2 first summon delay — dbscripts delay 45000. */
456
+ wave2AtMs: 45_000,
457
+ /** Wave1→wave2 gap after wave1 call (= 45000 − 3000). */
458
+ waveGapMs: 42_000,
459
+ /** SCRIPT_COMMAND_QUEST_EXPLORED credit — dbscripts delay 98000 cmd 7. */
460
+ creditAtMs: 98_000,
461
+ // Wave 1 = 3× Anvilrage Guardsman 8891; wave 2 = 1× Executioner 9398 + 2× 8891. Primary = 9398 (final
462
+ // wave) so floorGauntletWaves accepts lastHas.
463
+ waves: [
464
+ { pack: [{ creatureEntry: ENTRY.anvilrageGuardsman, count: 3 }] },
465
+ {
466
+ pack: [
467
+ { creatureEntry: ENTRY.twilightExecutioner, count: 1 },
468
+ { creatureEntry: ENTRY.anvilrageGuardsman, count: 2 },
469
+ ],
470
+ },
471
+ ] as const,
472
+ } as const;
473
+
474
+ // Detention Block Cell Doors. Lock 699 / item 11140 from Gerstahn 9018. Cite: dungeonGameObjects map 230;
475
+ // locks.json 699; survey E3 (gorshak-jail behind 170564).
476
+ export const BRD_CELL_DOORS = {
477
+ goEntry: 170564,
478
+ goEntries: [170562, 170563, 170564, 170565, 170566, 170567, 170568, 170569] as const,
479
+ requiredItem: 11140,
480
+ } as const;
481
+
482
+ // Throne-room concurrent pair — Emperor CallForHelp pulls Moira, and JustDied flips her neutral.
483
+ // Cite: boss_emperor_dagran_thaurissan.cpp:68; ScriptDevAIMgr.h:33 VISIBLE_RANGE 166.0f.
484
+ export const BRD_THRONE = {
485
+ emperorEncId: 'emperor-dagran-thaurissan',
486
+ moiraEncId: 'princess-moira',
487
+ emperorEntry: ENTRY.emperorDagran,
488
+ moiraEntry: ENTRY.princessMoira,
489
+ /** CallForHelp radius — ScriptDevAIMgr.h VISIBLE_RANGE. */
490
+ callForHelpYd: 166,
491
+ /** FACTION_NEUTRAL on release — boss_emperor_dagran_thaurissan.cpp:31,84. */
492
+ moiraNeutralFaction: 734,
493
+ } as const;
494
+
495
+ // Summon-only creature entries that must never appear in pure static trash packs. Includes ring pool,
496
+ // Hurley, event adds, tomb ghosts (event-awakened), Doomgrip.
497
+ export const BLACKROCK_DEPTHS_SUMMON_ONLY_ENTRIES = new Set<number>([
498
+ ENTRY.anubshiah, // 9031
499
+ ENTRY.eviscerator, // 9029
500
+ ENTRY.gorosh, // 9027
501
+ ENTRY.grizzle, // 9028
502
+ ENTRY.hedrum, // 9032
503
+ ENTRY.okthor, // 9030
504
+ ENTRY.hurleyBlackbreath, // 9537
505
+ ENTRY.ringWorm, // 8925
506
+ ENTRY.ringStinger, // 8926
507
+ ENTRY.ringScreecher, // 8927
508
+ ENTRY.ringThundersnout, // 8928
509
+ ENTRY.ringCreeper, // 8933
510
+ ENTRY.ringBeetle, // 8932
511
+ ENTRY.blackbreathCrony, // 9541
512
+ ENTRY.burningSpirit, // 9178
513
+ ENTRY.watchmanDoomgrip, // 9476
514
+ ENTRY.twilightExecutioner, // 9398 - Gor'shak jail finale
515
+ ]);
516
+
517
+ // Tomb of the Seven ghosts are STATIC spawns the event awakens, not summons — :587 flips a standing
518
+ // friendly hostile. `extraStrip` keeps them out of ordinary trash. Cite: instance_brd.cpp:583.
519
+ export const BLACKROCK_DEPTHS_TOMB_AWAKENED_ENTRIES = new Set<number>([
520
+ ENTRY.angerrel, // 9035
521
+ ENTRY.seethrel, // 9038
522
+ ENTRY.doperel, // 9040
523
+ ENTRY.gloomrel, // 9037
524
+ ENTRY.vilerel, // 9036
525
+ ENTRY.haterel, // 9034
526
+ ]);
527
+
528
+ /** Alias matching brief export name. */
529
+ export const SUMMON_ONLY = BLACKROCK_DEPTHS_SUMMON_ONLY_ENTRIES;
530
+
531
+ /** Split a static spawn count into pack sizes in [2, 5] (prefer 4). Remainder 1 folded into prior pack. */
532
+ export function splitPackSizes(total: number, prefer = 4): number[] {
533
+ if (total <= 0) return [];
534
+ if (total === 1) return [1];
535
+ const packs: number[] = [];
536
+ let left = total;
537
+ while (left > 0) {
538
+ if (left <= 5) {
539
+ packs.push(left);
540
+ break;
541
+ }
542
+ let n = prefer;
543
+ const rem = left - n;
544
+ if (rem === 1) n = prefer - 1; // leave 2+
545
+ packs.push(n);
546
+ left -= n;
547
+ }
548
+ return packs;
549
+ }
550
+
551
+ function trashPull(
552
+ id: string,
553
+ name: string,
554
+ creatureEntry: number,
555
+ count: number,
556
+ events?: EncounterEvent[],
557
+ ): EncounterDef {
558
+ const enc: EncounterDef = {
559
+ id,
560
+ name,
561
+ kind: 'trash',
562
+ creatureEntry,
563
+ };
564
+ if (count > 1) enc.pack = [{ creatureEntry, count: count - 1 }];
565
+ if (events && events.length) enc.events = events;
566
+ return enc;
567
+ }
568
+
569
+ /** Expand one census entry into ordered trash pulls (ids `${prefix}-0` …). */
570
+ function trashFromCensus(
571
+ _prefix: string,
572
+ _displayName: string,
573
+ _creatureEntry: number,
574
+ _total: number,
575
+ ): EncounterDef[] {
576
+ // DP1: cluster packs supply trash; hand spine keeps bosses/events only.
577
+ return [];
578
+ }
579
+
580
+ // Boss spells: creature.spells from bake (game-data) - no invented ids.
581
+ // Empty arrays = bake has no spells (Angerforge, Hurley, Flamelash, Panzor, Magmus).
582
+ const BOSS_SPELLS = {
583
+ lordRoccor: [13729, 13728, 6524],
584
+ highInterrogatorGerstahn: [14033, 13704, 14032, 12040],
585
+ houndmasterGrebmar: [21049, 13730, 15615],
586
+ gorosh: [15708, 13736, 21049],
587
+ pyromancerLoregrain: [15038, 15616, 15095, 15041],
588
+ lordIncendius: [26977, 13900, 14099, 13899],
589
+ warderStilgiss: [12674, 12675, 12556, 15044, 12544],
590
+ fineousDarkvire: [13953, 8258, 15493, 11978, 15346],
591
+ baelgar: [13895, 23378],
592
+ generalAngerforge: [] as number[],
593
+ golemLordArgelmach: [15507, 15305, 15605],
594
+ hurleyBlackbreath: [] as number[],
595
+ phalanx: [14099, 15588, 15285],
596
+ // Bar patrons: no scripted spell kit — creature EventAI drives them at fight time.
597
+ ribbly: [] as number[],
598
+ plugger: [] as number[],
599
+ ambassadorFlamelash: [] as number[],
600
+ panzor: [] as number[],
601
+ doomrel: [15245, 12742, 12493, 15092, 13787],
602
+ magmus: [] as number[],
603
+ princessMoira: [15586, 8362, 15587],
604
+ emperorDagran: [15636, 17492],
605
+ } as const;
606
+
607
+ function boss(
608
+ id: string,
609
+ name: string,
610
+ creatureEntry: number,
611
+ bossSpells: readonly number[],
612
+ events?: EncounterEvent[],
613
+ intro?: string,
614
+ pack?: { creatureEntry: number; count: number }[],
615
+ ): EncounterDef {
616
+ const enc: EncounterDef = {
617
+ id,
618
+ name,
619
+ kind: 'boss',
620
+ creatureEntry,
621
+ };
622
+ if (bossSpells.length) enc.bossSpells = [...bossSpells];
623
+ if (intro) enc.intro = intro;
624
+ if (events && events.length) enc.events = events;
625
+ if (pack && pack.length) enc.pack = pack;
626
+ return enc;
627
+ }
628
+
629
+ // Linear encounter graph: entrance trash → bosses in survey canonical order with inter-boss trash
630
+ // in spatial bands (detention, ring, manufactory, bar, vault, depths).
631
+ function buildHandSpine(): EncounterDef[] {
632
+ // Build all pure-static trash packs once, then slice into bands.
633
+ const packs: EncounterDef[] = [
634
+ ...trashFromCensus('bloodhound', 'Bloodhound', ENTRY.bloodhound, STATIC.bloodhound),
635
+ ...trashFromCensus(
636
+ 'anvilrage-warden',
637
+ 'Anvilrage Warden',
638
+ ENTRY.anvilrageWarden,
639
+ STATIC.anvilrageWarden,
640
+ ),
641
+ ...trashFromCensus(
642
+ 'anvilrage-guardsman',
643
+ 'Anvilrage Guardsman',
644
+ ENTRY.anvilrageGuardsman,
645
+ STATIC.anvilrageGuardsman,
646
+ ),
647
+ ...trashFromCensus(
648
+ 'anvilrage-footman',
649
+ 'Anvilrage Footman',
650
+ ENTRY.anvilrageFootman,
651
+ STATIC.anvilrageFootman,
652
+ ),
653
+ ...trashFromCensus(
654
+ 'twilight-torturer',
655
+ "Twilight's Hammer Torturer",
656
+ ENTRY.twilightTorturer,
657
+ STATIC.twilightTorturer,
658
+ ),
659
+ // Slave 10116 / Tortured Slave 10117: faction 35 non-combat — not kill trash.
660
+ ...trashFromCensus(
661
+ 'anvilrage-overseer',
662
+ 'Anvilrage Overseer',
663
+ ENTRY.anvilrageOverseer,
664
+ STATIC.anvilrageOverseer,
665
+ ),
666
+ ...trashFromCensus(
667
+ 'arena-spectator',
668
+ 'Arena Spectator',
669
+ ENTRY.arenaSpectator,
670
+ STATIC.arenaSpectator,
671
+ ),
672
+ ...trashFromCensus(
673
+ 'anvilrage-soldier',
674
+ 'Anvilrage Soldier',
675
+ ENTRY.anvilrageSoldier,
676
+ STATIC.anvilrageSoldier,
677
+ ),
678
+ ...trashFromCensus(
679
+ 'anvilrage-medic',
680
+ 'Anvilrage Medic',
681
+ ENTRY.anvilrageMedic,
682
+ STATIC.anvilrageMedic,
683
+ ),
684
+ ...trashFromCensus(
685
+ 'anvilrage-officer',
686
+ 'Anvilrage Officer',
687
+ ENTRY.anvilrageOfficer,
688
+ STATIC.anvilrageOfficer,
689
+ ),
690
+ ...trashFromCensus(
691
+ 'shadowforge-peasant',
692
+ 'Shadowforge Peasant',
693
+ ENTRY.shadowforgePeasant,
694
+ STATIC.shadowforgePeasant,
695
+ ),
696
+ ...trashFromCensus(
697
+ 'shadowforge-citizen',
698
+ 'Shadowforge Citizen',
699
+ ENTRY.shadowforgeCitizen,
700
+ STATIC.shadowforgeCitizen,
701
+ ),
702
+ ...trashFromCensus('fireguard', 'Fireguard', ENTRY.fireguard, STATIC.fireguard),
703
+ ...trashFromCensus(
704
+ 'blazing-fireguard',
705
+ 'Blazing Fireguard',
706
+ ENTRY.blazingFireguard,
707
+ STATIC.blazingFireguard,
708
+ ),
709
+ ...trashFromCensus(
710
+ 'fireguard-destroyer',
711
+ 'Fireguard Destroyer',
712
+ ENTRY.fireguardDestroyer,
713
+ STATIC.fireguardDestroyer,
714
+ ),
715
+ ...trashFromCensus(
716
+ 'doomforge-craftsman',
717
+ 'Doomforge Craftsman',
718
+ ENTRY.doomforgeCraftsman,
719
+ STATIC.doomforgeCraftsman,
720
+ ),
721
+ ...trashFromCensus(
722
+ 'doomforge-arcanasmith',
723
+ 'Doomforge Arcanasmith',
724
+ ENTRY.doomforgeArcanasmith,
725
+ STATIC.doomforgeArcanasmith,
726
+ ),
727
+ ...trashFromCensus(
728
+ 'doomforge-dragoon',
729
+ 'Doomforge Dragoon',
730
+ ENTRY.doomforgeDragoon,
731
+ STATIC.doomforgeDragoon,
732
+ ),
733
+ ...trashFromCensus(
734
+ 'warbringer-construct',
735
+ 'Warbringer Construct',
736
+ ENTRY.warbringerConstruct,
737
+ STATIC.warbringerConstruct,
738
+ ),
739
+ ...trashFromCensus(
740
+ 'ragereaver-golem',
741
+ 'Ragereaver Golem',
742
+ ENTRY.ragereaverGolem,
743
+ STATIC.ragereaverGolem,
744
+ ),
745
+ ...trashFromCensus(
746
+ 'wrath-hammer-construct',
747
+ 'Wrath Hammer Construct',
748
+ ENTRY.wrathHammerConstruct,
749
+ STATIC.wrathHammerConstruct,
750
+ ),
751
+ ...trashFromCensus(
752
+ 'molten-war-golem',
753
+ 'Molten War Golem',
754
+ ENTRY.moltenWarGolem,
755
+ STATIC.moltenWarGolem,
756
+ ),
757
+ ...trashFromCensus(
758
+ 'anvilrage-reservist',
759
+ 'Anvilrage Reservist',
760
+ ENTRY.anvilrageReservist,
761
+ STATIC.anvilrageReservist,
762
+ ),
763
+ ...trashFromCensus(
764
+ 'anvilrage-marshal',
765
+ 'Anvilrage Marshal',
766
+ ENTRY.anvilrageMarshal,
767
+ STATIC.anvilrageMarshal,
768
+ ),
769
+ ...trashFromCensus(
770
+ 'anvilrage-captain',
771
+ 'Anvilrage Captain',
772
+ ENTRY.anvilrageCaptain,
773
+ STATIC.anvilrageCaptain,
774
+ ),
775
+ ...trashFromCensus(
776
+ 'twilight-emissary',
777
+ 'Twilight Emissary',
778
+ ENTRY.twilightEmissary,
779
+ STATIC.twilightEmissary,
780
+ ),
781
+ ...trashFromCensus(
782
+ 'twilight-bodyguard',
783
+ 'Twilight Bodyguard',
784
+ ENTRY.twilightBodyguard,
785
+ STATIC.twilightBodyguard,
786
+ ),
787
+ ...trashFromCensus(
788
+ 'twilight-ambassador',
789
+ "Twilight's Hammer Ambassador",
790
+ ENTRY.twilightAmbassador,
791
+ STATIC.twilightAmbassador,
792
+ ),
793
+ ...trashFromCensus(
794
+ 'weapon-technician',
795
+ 'Weapon Technician',
796
+ ENTRY.weaponTechnician,
797
+ STATIC.weaponTechnician,
798
+ ),
799
+ ...trashFromCensus(
800
+ 'shadowforge-senator',
801
+ 'Shadowforge Senator',
802
+ ENTRY.shadowforgeSenator,
803
+ STATIC.shadowforgeSenator,
804
+ ),
805
+ ...trashFromCensus(
806
+ 'shadowforge-flame-keeper',
807
+ 'Shadowforge Flame Keeper',
808
+ ENTRY.shadowforgeFlameKeeper,
809
+ STATIC.shadowforgeFlameKeeper,
810
+ ),
811
+ ...trashFromCensus(
812
+ 'ironhand-guardian',
813
+ 'Ironhand Guardian',
814
+ ENTRY.ironhandGuardian,
815
+ STATIC.ironhandGuardian,
816
+ ),
817
+ ...trashFromCensus(
818
+ 'bloodhound-mastiff',
819
+ 'Bloodhound Mastiff',
820
+ ENTRY.bloodhoundMastiff,
821
+ STATIC.bloodhoundMastiff,
822
+ ),
823
+ // Ograbisi / Jaz / Crest Killer: faction 35 cell crooks — not kill trash.
824
+ ];
825
+
826
+ // 18 bands interleaved with 18 boss/event beats.
827
+ const bandCount = 18;
828
+ const bandSize = Math.ceil(packs.length / bandCount);
829
+ const band = (i: number) => packs.slice(i * bandSize, (i + 1) * bandSize);
830
+
831
+ const out: EncounterDef[] = [];
832
+
833
+ // --- Detention / entrance → Lord Roccor (rare-elite) ---
834
+ out.push(...band(0));
835
+ // Survey rare; isComplete ignores optional.
836
+ out.push({
837
+ ...boss(
838
+ 'lord-roccor',
839
+ 'Lord Roccor',
840
+ ENTRY.lordRoccor,
841
+ BOSS_SPELLS.lordRoccor,
842
+ undefined,
843
+ 'Lord Roccor (rare) prowls the outer depths.',
844
+ ),
845
+ optional: true,
846
+ });
847
+
848
+ // --- → High Interrogator Gerstahn (jail; crooks Ograbisi/Jaz/Crest in trash packs) ---
849
+ out.push(...band(1));
850
+ out.push(
851
+ boss(
852
+ 'high-interrogator-gerstahn',
853
+ 'High Interrogator Gerstahn',
854
+ ENTRY.highInterrogatorGerstahn,
855
+ BOSS_SPELLS.highInterrogatorGerstahn,
856
+ undefined,
857
+ "High Interrogator Gerstahn oversees the Detention Block cells.",
858
+ ),
859
+ );
860
+
861
+ // --- E3 Gor'shak jail defense (quest 3982 accept → timed 2-wave gauntlet) ---
862
+ // Primary 9398 summon-only; origin dbscripts 3982 delay 3000 pos. Arm only with quest.
863
+ out.push({
864
+ id: 'gorshak-jail',
865
+ name: "Commander Gor'shak - Jail Defense",
866
+ kind: 'boss',
867
+ startQuestId: BRD_GORSHAK_JAIL.questId,
868
+ creatureEntry: ENTRY.twilightExecutioner,
869
+ origin: {
870
+ x: BRD_GORSHAK_JAIL.origin.x,
871
+ y: BRD_GORSHAK_JAIL.origin.y,
872
+ z: BRD_GORSHAK_JAIL.origin.z,
873
+ },
874
+ intro:
875
+ "Accept quest 3982 at Gor'shak - Anvilrage waves storm the cell (3s / 45s). Defend him.",
876
+ events: [
877
+ {
878
+ kind: 'objectGate',
879
+ goEntry: BRD_CELL_DOORS.goEntry,
880
+ goEntries: [...BRD_CELL_DOORS.goEntries],
881
+ requiredItem: BRD_CELL_DOORS.requiredItem,
882
+ setsFlag: BLACKROCK_DEPTHS_FLAGS.cellDoors,
883
+ once: true,
884
+ },
885
+ { kind: 'requiresFlag', flag: BLACKROCK_DEPTHS_FLAGS.cellDoors },
886
+ {
887
+ kind: 'waves',
888
+ waves: BRD_GORSHAK_JAIL.waves.map((w) => ({
889
+ pack: w.pack.map((p) => ({ creatureEntry: p.creatureEntry, count: p.count })),
890
+ })),
891
+ },
892
+ { kind: 'setsFlag', flag: BLACKROCK_DEPTHS_FLAGS.gorshakJail },
893
+ ],
894
+ });
895
+
896
+ // --- → Houndmaster Grebmar ---
897
+ out.push(...band(2));
898
+ out.push(
899
+ boss(
900
+ 'houndmaster-grebmar',
901
+ 'Houndmaster Grebmar',
902
+ ENTRY.houndmasterGrebmar,
903
+ BOSS_SPELLS.houndmasterGrebmar,
904
+ undefined,
905
+ 'Houndmaster Grebmar and his bloodhounds guard the kennels.',
906
+ ),
907
+ );
908
+
909
+ // --- E1 Ring of Law (summon-only; per-run mob type + 1-of-6 boss) ---
910
+ // The graph holds placeholders; combatSession materializes the real rolls at fight start.
911
+ out.push(...band(3));
912
+ out.push(
913
+ boss(
914
+ 'ring-of-law',
915
+ 'Ring of Law',
916
+ BRD_RING_OF_LAW.bossEntry,
917
+ BOSS_SPELLS.gorosh,
918
+ [
919
+ {
920
+ kind: 'objectGate',
921
+ goEntry: BRD_RING_OF_LAW.goEntry,
922
+ setsFlag: BLACKROCK_DEPTHS_FLAGS.ringOfLaw,
923
+ once: true,
924
+ },
925
+ { kind: 'requiresFlag', flag: BLACKROCK_DEPTHS_FLAGS.ringOfLaw },
926
+ {
927
+ kind: 'waves',
928
+ waves: [
929
+ {
930
+ pack: [
931
+ {
932
+ creatureEntry: BRD_RING_OF_LAW.trashEntry,
933
+ count: BRD_RING_OF_LAW.trashPerWave,
934
+ },
935
+ ],
936
+ },
937
+ {
938
+ pack: [
939
+ {
940
+ creatureEntry: BRD_RING_OF_LAW.trashEntry,
941
+ count: BRD_RING_OF_LAW.trashPerWave,
942
+ },
943
+ ],
944
+ },
945
+ // Final wave placeholder; materializeRingOfLawEncounter rolls aRingBoss[].
946
+ { pack: [{ creatureEntry: ENTRY.gorosh, count: 1 }] },
947
+ ],
948
+ },
949
+ ],
950
+ "The Ring of Law - High Justice Grimstone's arena. One of six champions after two waves of one rolled arena beast. (Theldren/quest 9015 not modeled.)",
951
+ ),
952
+ );
953
+
954
+ // --- → Pyromancer Loregrain (rare) ---
955
+ out.push(...band(4));
956
+ // Survey rare; isComplete ignores optional.
957
+ out.push({
958
+ ...boss(
959
+ 'pyromancer-loregrain',
960
+ 'Pyromancer Loregrain',
961
+ ENTRY.pyromancerLoregrain,
962
+ BOSS_SPELLS.pyromancerLoregrain,
963
+ undefined,
964
+ 'Pyromancer Loregrain (rare) chants near the Shadowforge bridge.',
965
+ ),
966
+ optional: true,
967
+ });
968
+
969
+ // --- → Lord Incendius ---
970
+ out.push(...band(5));
971
+ out.push(
972
+ boss(
973
+ 'lord-incendius',
974
+ 'Lord Incendius',
975
+ ENTRY.lordIncendius,
976
+ BOSS_SPELLS.lordIncendius,
977
+ undefined,
978
+ 'Lord Incendius, fire elemental of the Black Anvil, bars the molten halls.',
979
+ ),
980
+ );
981
+
982
+ // --- → Warder Stilgiss + Verek pack ---
983
+ out.push(...band(6));
984
+ out.push(
985
+ boss(
986
+ 'warder-stilgiss',
987
+ 'Warder Stilgiss',
988
+ ENTRY.warderStilgiss,
989
+ BOSS_SPELLS.warderStilgiss,
990
+ undefined,
991
+ 'Warder Stilgiss guards the Dark Coffer with his demon hound Verek.',
992
+ [{ creatureEntry: ENTRY.verek, count: 1 }],
993
+ ),
994
+ );
995
+
996
+ // --- E7 Vault → Watchman Doomgrip + 4× Warbringer Construct (un-stone) ---
997
+ // Cite: instance_blackrock_depths.cpp:210-227 RemoveAurasDueToSpell(SPELL_STONED) + Summon Doomgrip.
998
+ out.push(
999
+ {
1000
+ id: 'vault-watchman-doomgrip',
1001
+ name: 'Watchman Doomgrip',
1002
+ kind: 'trash',
1003
+ creatureEntry: BRD_VAULT.doomgripEntry,
1004
+ pack: [
1005
+ {
1006
+ creatureEntry: BRD_VAULT.constructEntry,
1007
+ count: BRD_VAULT.constructCount,
1008
+ },
1009
+ ],
1010
+ intro:
1011
+ 'Opening all 12 Relic Coffer Doors un-stones 4 Warbringer Constructs and summons Watchman Doomgrip.',
1012
+ events: [
1013
+ {
1014
+ kind: 'objectGate',
1015
+ goEntry: BRD_VAULT.goEntry,
1016
+ goEntries: [...BRD_VAULT.goEntries],
1017
+ needUses: BRD_VAULT.needUses,
1018
+ setsFlag: BLACKROCK_DEPTHS_FLAGS.vaultCoffers,
1019
+ once: true,
1020
+ },
1021
+ { kind: 'requiresFlag', flag: BLACKROCK_DEPTHS_FLAGS.vaultCoffers },
1022
+ ],
1023
+ },
1024
+ );
1025
+
1026
+ // --- → Fineous Darkvire ---
1027
+ out.push(...band(7));
1028
+ out.push(
1029
+ boss(
1030
+ 'fineous-darkvire',
1031
+ 'Fineous Darkvire',
1032
+ ENTRY.fineousDarkvire,
1033
+ BOSS_SPELLS.fineousDarkvire,
1034
+ undefined,
1035
+ "Fineous Darkvire, Chief Architect - holds Ironfel for Dark Iron Legacy.",
1036
+ ),
1037
+ );
1038
+
1039
+ // --- → Bael'Gar ---
1040
+ out.push(...band(8));
1041
+ out.push(
1042
+ boss(
1043
+ "bael-gar",
1044
+ "Bael'Gar",
1045
+ ENTRY.baelgar,
1046
+ BOSS_SPELLS.baelgar,
1047
+ undefined,
1048
+ "Bael'Gar, a massive molten giant, stirs in the eastern depths.",
1049
+ ),
1050
+ );
1051
+
1052
+ // --- → General Angerforge (E9 <30% Alarm — ScriptDev first pulse; BRD_ANGERFORGE schedule) ---
1053
+ // Cite: boss_general_angerforge.cpp:93-108; InstanceDef hpThreshold retired (no double-fire).
1054
+ out.push(...band(9));
1055
+ out.push(
1056
+ boss(
1057
+ 'general-angerforge',
1058
+ 'General Angerforge',
1059
+ ENTRY.generalAngerforge,
1060
+ BOSS_SPELLS.generalAngerforge,
1061
+ undefined,
1062
+ 'General Angerforge: Flurry/Enrage/Sunder; <30% Alarm 8×8901+2×8894 (ScriptDev once; angerforgeAlarmsByMs for 3-min re-arm).',
1063
+ ),
1064
+ );
1065
+
1066
+ // --- → Golem Lord Argelmach ---
1067
+ out.push(...band(10));
1068
+ out.push(
1069
+ boss(
1070
+ 'golem-lord-argelmach',
1071
+ 'Golem Lord Argelmach',
1072
+ ENTRY.golemLordArgelmach,
1073
+ BOSS_SPELLS.golemLordArgelmach,
1074
+ undefined,
1075
+ "Golem Lord Argelmach directs the Manufactory's constructs.",
1076
+ ),
1077
+ );
1078
+
1079
+ // --- E5d Hurley Blackbreath (3 kegs → summon + 3 cronies) ---
1080
+ // Cite: instance_blackrock_depths.cpp:319-351; needUses=3 :324.
1081
+ out.push(...band(11));
1082
+ out.push(
1083
+ boss(
1084
+ 'hurley-blackbreath',
1085
+ 'Hurley Blackbreath',
1086
+ ENTRY.hurleyBlackbreath,
1087
+ BOSS_SPELLS.hurleyBlackbreath,
1088
+ [
1089
+ {
1090
+ kind: 'objectGate',
1091
+ goEntry: BRD_HURLEY_KEGS.goEntry,
1092
+ needUses: BRD_HURLEY_KEGS.needUses,
1093
+ setsFlag: BLACKROCK_DEPTHS_FLAGS.hurleyKegs,
1094
+ once: true,
1095
+ },
1096
+ { kind: 'requiresFlag', flag: BLACKROCK_DEPTHS_FLAGS.hurleyKegs },
1097
+ ],
1098
+ 'Breaking three Thunderbrew Lager Kegs summons Hurley Blackbreath and his cronies.',
1099
+ [
1100
+ {
1101
+ creatureEntry: BRD_HURLEY_KEGS.cronyEntry,
1102
+ count: BRD_HURLEY_KEGS.cronyCount,
1103
+ },
1104
+ ],
1105
+ ),
1106
+ );
1107
+ // Summon-only: spawnUnlockedBodies places the floor body at `origin` once the keg flag is set, and
1108
+ // without one the third keg summoned nothing. Cite: blackrock_depths.h:206 aHurleyPositions.
1109
+ out[out.length - 1] = { ...out[out.length - 1]!, origin: { ...BRD_HURLEY_KEGS.spawn } };
1110
+
1111
+ // --- → Phalanx (static boss; Rocknot/Plugger escort-activate residual) ---
1112
+ // Cite: blackrock_depths.cpp:1039-1042 Rocknot; :1688-1693 Plugger death → escort Start.
1113
+ out.push(...band(12));
1114
+ out.push(
1115
+ boss(
1116
+ 'phalanx',
1117
+ 'Phalanx',
1118
+ ENTRY.phalanx,
1119
+ BOSS_SPELLS.phalanx,
1120
+ undefined,
1121
+ 'Phalanx, the Grim Guzzler golem - Rocknot 3 ales or Plugger death activate him (attack-to-start stand-in).',
1122
+ ),
1123
+ );
1124
+
1125
+ // --- → Grim Guzzler named patrons. Quest 4136 wants Ribbly's head.
1126
+ // E5e: Ribbly death → bar patrol (1×8911+2×8895) unless Plugger is already hostile.
1127
+ out.push(
1128
+ boss(
1129
+ 'ribbly-screwspigot',
1130
+ 'Ribbly Screwspigot',
1131
+ ENTRY.ribbly,
1132
+ BOSS_SPELLS.ribbly,
1133
+ [
1134
+ {
1135
+ kind: 'hpThreshold',
1136
+ pct: 0,
1137
+ once: true,
1138
+ spawn: [
1139
+ {
1140
+ creatureEntry: BRD_BAR_PATROL.destroyerEntry,
1141
+ count: BRD_BAR_PATROL.destroyerCount,
1142
+ },
1143
+ {
1144
+ creatureEntry: BRD_BAR_PATROL.officerEntry,
1145
+ count: BRD_BAR_PATROL.officerCount,
1146
+ },
1147
+ ],
1148
+ },
1149
+ { kind: 'setsFlag', flag: BLACKROCK_DEPTHS_FLAGS.barPatrol },
1150
+ ],
1151
+ "Ribbly Screwspigot - death calls the bar patrol (1× Fireguard Destroyer + 2× Anvilrage Officers).",
1152
+ ),
1153
+ );
1154
+ // Plugger death → Phalanx calls the same patrol 10 s later unless Ribbly already did; the DSL has
1155
+ // no "unless flag", so two deaths spawn two. Cite: blackrock_depths.cpp:628-633; instance:361-364.
1156
+ out.push(
1157
+ boss(
1158
+ 'plugger-spazzring',
1159
+ 'Plugger Spazzring',
1160
+ ENTRY.plugger,
1161
+ BOSS_SPELLS.plugger,
1162
+ [
1163
+ {
1164
+ kind: 'hpThreshold',
1165
+ pct: 0,
1166
+ once: true,
1167
+ spawn: [
1168
+ { creatureEntry: BRD_BAR_PATROL.destroyerEntry, count: BRD_BAR_PATROL.destroyerCount },
1169
+ { creatureEntry: BRD_BAR_PATROL.officerEntry, count: BRD_BAR_PATROL.officerCount },
1170
+ ],
1171
+ },
1172
+ { kind: 'setsFlag', flag: BLACKROCK_DEPTHS_FLAGS.barPatrol },
1173
+ ],
1174
+ 'Plugger Spazzring - the bartender. His death turns every patron hostile, wakes Phalanx and calls the bar patrol.',
1175
+ ),
1176
+ );
1177
+
1178
+ // --- → Ambassador Flamelash (E8 — ScriptDev pull inject; BRD_FLAMELASH continuous schedule) ---
1179
+ // Cite: boss_ambassador_flamelash.cpp:81-91,127-137; InstanceDef hpThreshold retired.
1180
+ out.push(...band(13));
1181
+ out.push(
1182
+ boss(
1183
+ 'ambassador-flamelash',
1184
+ 'Ambassador Flamelash',
1185
+ ENTRY.ambassadorFlamelash,
1186
+ BOSS_SPELLS.ambassadorFlamelash,
1187
+ undefined,
1188
+ 'Ambassador Flamelash: Fireblast + 4×8911 + 7×9178 pull (ScriptDev); flamelashSpiritsExpectedByMs for 15–30s stream.',
1189
+ ),
1190
+ );
1191
+
1192
+ // --- → Panzor the Invincible (rare) ---
1193
+ out.push(...band(14));
1194
+ // Survey rare; isComplete ignores optional.
1195
+ out.push({
1196
+ ...boss(
1197
+ 'panzor-the-invincible',
1198
+ 'Panzor the Invincible',
1199
+ ENTRY.panzor,
1200
+ BOSS_SPELLS.panzor,
1201
+ undefined,
1202
+ 'Panzor the Invincible (rare) stands among the golem works.',
1203
+ ),
1204
+ optional: true,
1205
+ });
1206
+
1207
+ // --- E6 Tomb of the Seven → Doom'rel (7 dwarves; 30s fromCall overlap on floor) ---
1208
+ // Cite: instance_blackrock_depths.cpp:591,768 m_uiDwarfFightTimer=30000; live gauntletTransition doomrel.
1209
+ out.push(...band(15));
1210
+ out.push(
1211
+ boss(
1212
+ 'doomrel',
1213
+ "Doom'rel",
1214
+ ENTRY.doomrel,
1215
+ BOSS_SPELLS.doomrel,
1216
+ [
1217
+ {
1218
+ kind: 'setsFlag',
1219
+ flag: BLACKROCK_DEPTHS_FLAGS.tombOfSeven,
1220
+ },
1221
+ {
1222
+ kind: 'waves',
1223
+ waves: BRD_TOMB_OF_SEVEN.order.map((creatureEntry) => ({
1224
+ pack: [{ creatureEntry, count: 1 }],
1225
+ })),
1226
+ },
1227
+ ],
1228
+ "The Tomb of the Seven - seven ghost dwarves in sequence (30s auto-call overlap; BRD_TOMB_OF_SEVEN.dwarfFightTimerMs).",
1229
+ ),
1230
+ );
1231
+
1232
+ // --- → Magmus (Lyceum braziers pair 174744/174745) ---
1233
+ out.push(...band(16));
1234
+ out.push(
1235
+ boss(
1236
+ 'magmus',
1237
+ 'Magmus',
1238
+ ENTRY.magmus,
1239
+ BOSS_SPELLS.magmus,
1240
+ [
1241
+ {
1242
+ kind: 'objectGate',
1243
+ goEntry: BRD_LYCEUM_BRAZIERS.goEntry,
1244
+ goEntries: [...BRD_LYCEUM_BRAZIERS.goEntries],
1245
+ needUses: BRD_LYCEUM_BRAZIERS.needUses,
1246
+ setsFlag: BLACKROCK_DEPTHS_FLAGS.lyceumBraziers,
1247
+ once: true,
1248
+ },
1249
+ { kind: 'requiresFlag', flag: BLACKROCK_DEPTHS_FLAGS.lyceumBraziers },
1250
+ ],
1251
+ 'Magmus guards the Iron Hall beyond both Lyceum Shadowforge Braziers. Ironhand Guardians flare nearby.',
1252
+ ),
1253
+ );
1254
+
1255
+ // --- → Princess Moira + Emperor (concurrent: Emperor CallForHelp pulls Moira) ---
1256
+ // Cite: boss_emperor_dagran_thaurissan.cpp:68 CallForHelp; JustDied → Moira neutral.
1257
+ out.push(...band(17));
1258
+ // Remainder of any leftover packs
1259
+ const used = bandCount * bandSize;
1260
+ if (used < packs.length) out.push(...packs.slice(used));
1261
+
1262
+ out.push(
1263
+ boss(
1264
+ 'princess-moira',
1265
+ 'Princess Moira Bronzebeard',
1266
+ ENTRY.princessMoira,
1267
+ BOSS_SPELLS.princessMoira,
1268
+ undefined,
1269
+ 'Princess Moira Bronzebeard stands with the Emperor - CallForHelp joins her when he aggroes. Kill him first to free her.',
1270
+ ),
1271
+ );
1272
+
1273
+ out.push(
1274
+ boss(
1275
+ 'emperor-dagran-thaurissan',
1276
+ 'Emperor Dagran Thaurissan',
1277
+ ENTRY.emperorDagran,
1278
+ BOSS_SPELLS.emperorDagran,
1279
+ undefined,
1280
+ 'Emperor Dagran Thaurissan calls the throne room to arms (CallForHelp pulls Moira).',
1281
+ ),
1282
+ );
1283
+
1284
+ return out;
1285
+ }
1286
+
1287
+ function buildEncounters(): EncounterDef[] {
1288
+ // Hand spine = bosses + event-gated packs (mono trashFromCensus is empty). Non-combat friendlies,
1289
+ // the summon-only ring pool and event adds are all stripped so none appear as static trash.
1290
+ const spine = buildHandSpine();
1291
+ return buildClusterEncounters({
1292
+ mapId: 230,
1293
+ spine,
1294
+ entrance: entranceForInstance('blackrock-depths'),
1295
+ extraStrip: [
1296
+ ...BLACKROCK_DEPTHS_SUMMON_ONLY_ENTRIES,
1297
+ ...BLACKROCK_DEPTHS_TOMB_AWAKENED_ENTRIES,
1298
+ ],
1299
+ });
1300
+ }
1301
+
1302
+
1303
+ // Survey quests completable inside map 230. Excludes 8619 Morndeep the Elder (D-10 Lunar Festival). No
1304
+ // Scourge Invasion D-10 rows.
1305
+ export const BLACKROCK_DEPTHS_QUESTS = [
1306
+ 4295, // Rocknot's Ale
1307
+ 3802, // Dark Iron Legacy
1308
+ 3981, // Commander Gor'shak
1309
+ 4081, // KILL ON SIGHT: Dark Iron Dwarves
1310
+ 4136, // Ribbly Screwspigot
1311
+ 3982, // What Is Going On?
1312
+ 4001, // What Is Going On?
1313
+ 4082, // KILL ON SIGHT: High Ranking Dark Iron Officials
1314
+ 4201, // The Love Potion
1315
+ 4241, // Marshal Windsor
1316
+ 4242, // Abandoned Hope
1317
+ 7201, // The Last Element
1318
+ 4083, // The Spectral Chalice
1319
+ 4123, // The Heart of the Mountain
1320
+ 3907, // Disharmony of Fire
1321
+ 4263, // Incendius!
1322
+ 4286, // The Good Stuff
1323
+ 4063, // The Rise of the Machines
1324
+ 4132, // Operation: Death to Angerforge
1325
+ 4264, // A Crumpled Up Note
1326
+ 4282, // A Shred of Hope
1327
+ 4322, // Jail Break!
1328
+ 4003, // The Royal Rescue
1329
+ 4341, // Kharan Mighthammer
1330
+ 4342, // Kharan's Tale
1331
+ 4361, // The Bearer of Bad News
1332
+ 4362, // The Fate of the Kingdom
1333
+ 4363, // The Princess's Surprise
1334
+ 4004, // The Princess Saved?
1335
+ 6642, // Favor Amongst the Brotherhood, Dark Iron Ore
1336
+ 6643, // Favor Amongst the Brotherhood, Fiery Core
1337
+ 6644, // Favor Amongst the Brotherhood, Lava Core
1338
+ 6645, // Favor Amongst the Brotherhood, Core Leather
1339
+ 6646, // Favor Amongst the Brotherhood, Blood of the Mountain
1340
+ 7604, // A Binding Contract
1341
+ 7848, // Attunement to the Core
1342
+ 8961, // Three Kings of Flame
1343
+ ] as const;
1344
+
1345
+ export const BLACKROCK_DEPTHS: InstanceDef = {
1346
+ id: 'blackrock-depths',
1347
+ mapId: 230,
1348
+ name: 'Blackrock Depths',
1349
+ portalZone: 'burningsteppes',
1350
+ // areatrigger_teleport 1466, Blackrock Depths - Entering (level 40). The AT's own fromZone is
1351
+ // 'searinggorge', so the portalZone match never found it and canEnter fell back to def.minLevel.
1352
+ entranceTriggerId: 1466,
1353
+ minLevel: 40, // entrance trigger 1466 requiredLevel
1354
+ // Typical BRD combat band ~48–56 (lvl-1 friendly slaves are non-combat presence, not trash).
1355
+ levelRange: [48, 56],
1356
+ lockoutMs: 0,
1357
+ description: '',
1358
+ quests: [...BLACKROCK_DEPTHS_QUESTS],
1359
+ encounters: buildEncounters(),
1360
+ lootObjects: [
1361
+ // Chest of The Seven — respawned for an HOUR when the tomb event completes.
1362
+ // Cite: instance_blackrock_depths.cpp:278 DoRespawnGameObject(GO_CHEST_SEVEN, HOUR).
1363
+ { goEntry: 169243, revealedByFlag: BLACKROCK_DEPTHS_FLAGS.tombOfSeven },
1364
+ // Core Fragment — quest 7848 Attunement to the Core (18412 guaranteed while on quest).
1365
+ { goEntry: 179553 },
1366
+ // Dark Coffer — opened with the Dark Keeper Key 11197 (portrait event drops it).
1367
+ { goEntry: 160845, requiredItem: 11197 },
1368
+ // Secret Safe — Fineous Darkvire's chain (Ironfel 10999 / Shadowforge Key 11000).
1369
+ { goEntry: 161495 },
1370
+ // Relic Coffers — the vault room, behind the coffer-door gate.
1371
+ { goEntry: 160836, revealedByFlag: BLACKROCK_DEPTHS_FLAGS.vaultCoffers },
1372
+ ],
1373
+ };
1374
+
1375
+ // Counts only pure static trash packs (no bosses, no vault Doomgrip summon, no event summons). Used to
1376
+ // assert census match and summon-only exclusion.
1377
+ export function blackrockDepthsPureStaticTrashCounts(): Map<number, number> {
1378
+ const map = new Map<number, number>();
1379
+ const add = (entry: number, n: number) => map.set(entry, (map.get(entry) ?? 0) + n);
1380
+ for (const enc of BLACKROCK_DEPTHS.encounters) {
1381
+ if (enc.kind !== 'trash') continue;
1382
+ // Vault Doomgrip is summon-only event, not census static.
1383
+ if (enc.id.startsWith('vault-')) continue;
1384
+ add(enc.creatureEntry, 1);
1385
+ for (const p of enc.pack ?? []) add(p.creatureEntry, p.count);
1386
+ }
1387
+ return map;
1388
+ }
1389
+
1390
+ /** Sum of authored kill counts per creature entry (trash + bosses + event spawns). */
1391
+ export function blackrockDepthsKillSupply(): Map<number, number> {
1392
+ const map = new Map<number, number>();
1393
+ const add = (entry: number, n: number) => map.set(entry, (map.get(entry) ?? 0) + n);
1394
+ for (const enc of BLACKROCK_DEPTHS.encounters) {
1395
+ add(enc.creatureEntry, 1);
1396
+ for (const p of enc.pack ?? []) add(p.creatureEntry, p.count);
1397
+ for (const ev of enc.events ?? []) {
1398
+ if (ev.kind === 'onDeathSummon') add(ev.creatureEntry, 1);
1399
+ if (ev.kind === 'waves') {
1400
+ for (const w of ev.waves) {
1401
+ for (const row of w.pack) add(row.creatureEntry, row.count);
1402
+ }
1403
+ }
1404
+ if (ev.kind === 'hpThreshold' && ev.spawn) {
1405
+ for (const row of ev.spawn) add(row.creatureEntry, row.count);
1406
+ }
1407
+ }
1408
+ }
1409
+ return map;
1410
+ }