azeroth-shell 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +26 -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 +126 -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,1164 @@
1
+ // Stratholme Undead side / Baron chain (map 329) — InstanceDef graph, Live wing excluded.
2
+ // Authority: docs/dungeons/survey/19-stratholme.md Undead side, which carries the GAPS list.
3
+
4
+ import type { EncounterDef, EncounterEvent, InstanceDef } from '../schema.ts';
5
+ import {
6
+ entranceForInstance,
7
+ buildClusterEncounters,
8
+ wingFilterByNearestBoss,
9
+ } from './pack-from-clusters.ts';
10
+
11
+ // ---- Census static counts (map 329 undead-type / Thuzadin; fractional pools rounded) ----
12
+ // Crimson humanoids, Live bosses, friendlies, triggers and summon-only event entries are excluded.
13
+
14
+ export const STATIC = {
15
+ ravagedCadaver: 30, // 10381
16
+ mangledCadaver: 35, // 10382
17
+ spectralCitizen: 12, // 10384 pool 11.5 → Math.round
18
+ ghostlyCitizen: 11, // 10385 pool 10.5 → Math.round
19
+ skeletalGuardian: 53, // 10390
20
+ skeletalBerserker: 48, // 10391
21
+ thuzadinShadowcaster: 14, // 10398
22
+ thuzadinAcolyte: 16, // 10399
23
+ thuzadinNecromancer: 17, // 10400
24
+ plagueGhoul: 34, // 10405
25
+ ghoulRavener: 17, // 10406
26
+ fleshflayerGhoul: 10, // 10407
27
+ rockwingGargoyle: 4, // 10408 pool 3.5 → Math.round
28
+ rockwingScreecher: 4, // 10409 pool 3.5 → Math.round
29
+ eyeOfNaxxramas: 3, // 10411
30
+ cryptCrawler: 7, // 10412
31
+ cryptBeast: 6, // 10413
32
+ patchworkHorror: 3, // 10414
33
+ bileSpewer: 4, // 10416 - slaughter square aboms (static share)
34
+ venomBelcher: 9, // 10417
35
+ shriekingBanshee: 9, // 10463
36
+ wailingBanshee: 6, // 10464
37
+ stratholmeCourier: 1, // 11082
38
+ } as const;
39
+
40
+ /** Sum of pure static trash census (excl. rares-as-bosses, bosses, summon-only, Live, D-10). */
41
+ export const STATIC_TOTAL = Object.values(STATIC).reduce((a, b) => a + b, 0);
42
+
43
+ const ENTRY = {
44
+ ravagedCadaver: 10381,
45
+ mangledCadaver: 10382,
46
+ spectralCitizen: 10384,
47
+ ghostlyCitizen: 10385,
48
+ skeletalGuardian: 10390,
49
+ skeletalBerserker: 10391,
50
+ thuzadinShadowcaster: 10398,
51
+ thuzadinAcolyte: 10399,
52
+ thuzadinNecromancer: 10400,
53
+ plagueGhoul: 10405,
54
+ ghoulRavener: 10406,
55
+ fleshflayerGhoul: 10407,
56
+ rockwingGargoyle: 10408,
57
+ rockwingScreecher: 10409,
58
+ eyeOfNaxxramas: 10411,
59
+ cryptCrawler: 10412,
60
+ cryptBeast: 10413,
61
+ patchworkHorror: 10414,
62
+ bileSpewer: 10416,
63
+ venomBelcher: 10417,
64
+ shriekingBanshee: 10463,
65
+ wailingBanshee: 10464,
66
+ stratholmeCourier: 11082,
67
+ // Rare-elites (undead type; optional rares @ 100%)
68
+ forresten: 10558,
69
+ skul: 10393,
70
+ stonespine: 10809,
71
+ // Canonical undead bosses (survey order)
72
+ anastari: 10436,
73
+ nerubenkan: 10437,
74
+ maleki: 10438,
75
+ barthilas: 10435,
76
+ ramstein: 10439, // summon-only - after slaughter square aboms
77
+ rivendare: 10440,
78
+ // Event summon-only (never pure static trash)
79
+ mindlessUndead: 11030,
80
+ blackGuardSentry: 10394,
81
+ /** Ziggurat channel object — dies to the acolyte clear, never to damage. */
82
+ ashariCrystal: 10415,
83
+ } as const;
84
+
85
+ // Flags from the survey Undead side / Baron chain. The ziggurat triple-key works in any order: each
86
+ // boss sets its own flag, and slaughter opens when all three are set. Cite: stratholme.cpp:85-98.
87
+ export const STRATH_UNDEAD_FLAGS = {
88
+ ziggAnastari: 'strath-undead-zigg-anastari',
89
+ ziggNerubenkan: 'strath-undead-zigg-nerubenkan',
90
+ ziggMaleki: 'strath-undead-zigg-maleki',
91
+ // TYPE_* SPECIAL — that ziggurat's Thuzadin Acolytes are all dead, so its Ash'ari Crystal
92
+ // suicided. The boss flag is only DONE, his own door; Slaughter needs SPECIAL ×3.
93
+ cryptAnastari: 'strath-undead-crypt-anastari',
94
+ cryptNerubenkan: 'strath-undead-crypt-nerubenkan',
95
+ cryptMaleki: 'strath-undead-crypt-maleki',
96
+ /** All three ziggurat SPECIAL stand-ins → Port Gauntlet 175374 + Port Slaughter 175373. */
97
+ slaughterSquareOpen: 'strath-undead-slaughter-square-open',
98
+ /** Ramstein dead → Black Guard wave stream. */
99
+ ramsteinDead: 'strath-undead-ramstein-dead',
100
+ /** Black Guards cleared → Baron door 175796. */
101
+ baronDoor: 'strath-undead-baron-door',
102
+ /** Gauntlet Gate 175357 used — Baron's Ultimatum armed. */
103
+ baronRun: 'strath-undead-baron-run',
104
+ /** Baron killed while ultimatum still armed (TYPE_BARON_RUN DONE). */
105
+ baronRunSuccess: 'strath-undead-baron-run-success',
106
+ /** Ultimatum expired without Baron engage (TYPE_BARON_RUN FAIL). */
107
+ baronRunFail: 'strath-undead-baron-run-fail',
108
+ // TYPE_AURIUS DONE — Medallion of Faith quest 5122 rewarded at Aurius 10917. Cite: stratholme.h:21
109
+ // TYPE_AURIUS=7; stratholmeScripts.cpp:326-327.
110
+ aurius: 'strath-undead-aurius',
111
+ /** Aurius teleported into the Slaughter House after Baron engage (+5s). */
112
+ auriusJoined: 'strath-undead-aurius-joined',
113
+ // TYPE_BARTHILAS_RUN IN_PROGRESS — Service Entrance Gate 175368 used. Cite: stratholme.h:20
114
+ // TYPE_BARTHILAS_RUN=6; stratholmeScripts.cpp:52-54.
115
+ barthilasRun: 'strath-undead-barthilas-run',
116
+ /** Barthilas teleported to slaughter approach after 8s flee. */
117
+ barthilasRelocated: 'strath-undead-barthilas-relocated',
118
+ } as const;
119
+
120
+ // Three ziggurats, any kill order, each TWO objectives: the boss opens the door, and the five
121
+ // acolytes behind it dying sends that ziggurat SPECIAL. Slaughter opens on three SPECIALs.
122
+ export const STRATH_ZIGGURAT_BOSSES = [
123
+ {
124
+ encId: 'baroness-anastari',
125
+ entry: ENTRY.anastari,
126
+ flag: STRATH_UNDEAD_FLAGS.ziggAnastari,
127
+ cryptFlag: STRATH_UNDEAD_FLAGS.cryptAnastari,
128
+ doorGo: 175380, // GO_ZIGGURAT_DOOR_1 — stratholme.h:59
129
+ door: { x: 3853.47, y: -3722.94, z: 148.094 },
130
+ crystalGuid: 3290339,
131
+ },
132
+ {
133
+ encId: 'nerubenkan',
134
+ entry: ENTRY.nerubenkan,
135
+ flag: STRATH_UNDEAD_FLAGS.ziggNerubenkan,
136
+ cryptFlag: STRATH_UNDEAD_FLAGS.cryptNerubenkan,
137
+ doorGo: 175379, // GO_ZIGGURAT_DOOR_2 — stratholme.h:60
138
+ door: { x: 3851.7, y: -3522.96, z: 144.213 },
139
+ crystalGuid: 3290341,
140
+ },
141
+ {
142
+ encId: 'maleki-the-pallid',
143
+ entry: ENTRY.maleki,
144
+ flag: STRATH_UNDEAD_FLAGS.ziggMaleki,
145
+ cryptFlag: STRATH_UNDEAD_FLAGS.cryptMaleki,
146
+ doorGo: 175381, // GO_ZIGGURAT_DOOR_3 — stratholme.h:61
147
+ door: { x: 4038.13, y: -3649.91, z: 135.658 },
148
+ crystalGuid: 3290340,
149
+ },
150
+ ] as const;
151
+
152
+ /** DoSortZiggurats radii, 2-D. Cite: stratholme.cpp:592 acolytes 35f, :625 crystal 50f. */
153
+ export const STRATH_ZIGG_SORT = { acolyteYd: 35, crystalYd: 50 } as const;
154
+
155
+ /** Ash'ari Crystal suicide on the last acolyte. Cite: stratholme.h:82 SPELL_SUICIDE = 7. */
156
+ export const STRATH_ZIGG_CRYSTAL = {
157
+ entry: ENTRY.ashariCrystal,
158
+ acolyteEntry: ENTRY.thuzadinAcolyte,
159
+ suicideSpell: 7,
160
+ } as const;
161
+
162
+ // Which ziggurat a point belongs to (index into STRATH_ZIGGURAT_BOSSES), or -1. First door within
163
+ // `radiusYd` wins — the same first-match loop DoSortZiggurats runs.
164
+ export function strathZigguratIndexAt(
165
+ pt: { x: number; y: number },
166
+ radiusYd: number = STRATH_ZIGG_SORT.acolyteYd,
167
+ ): number {
168
+ for (let i = 0; i < STRATH_ZIGGURAT_BOSSES.length; i++) {
169
+ const d = STRATH_ZIGGURAT_BOSSES[i]!.door;
170
+ if (Math.hypot(pt.x - d.x, pt.y - d.y) <= radiusYd) return i;
171
+ }
172
+ return -1;
173
+ }
174
+
175
+ /** True when all three ziggurat boss flags are present (three doors open). */
176
+ export function strathZigguratsComplete(flags: readonly string[]): boolean {
177
+ return STRATH_ZIGGURAT_BOSSES.every((z) => flags.includes(z.flag));
178
+ }
179
+
180
+ // True when all three crystals are down (three SPECIAL) — the real Slaughter Square key. Cite:
181
+ // stratholme.cpp:87 m_auiEncounter[...] == SPECIAL ×3.
182
+ export function strathZigguratCryptsComplete(flags: readonly string[]): boolean {
183
+ return STRATH_ZIGGURAT_BOSSES.every((z) => flags.includes(z.cryptFlag));
184
+ }
185
+
186
+ // Baron's Ultimatum (TYPE_BARON_RUN), a 45-minute timer armed at the Gauntlet Gate.
187
+ // Cite: stratholme.cpp:230; stratholmeScripts.cpp:61-91; SpellDuration index 145 → 2,700,000 ms.
188
+ export const STRATH_BARON_RUN = {
189
+ goEntry: 175357,
190
+ ysidaEntry: 16031,
191
+ ysidaCageGo: 181071,
192
+ ultimatumSpellId: 27861,
193
+ /** TYPE_BARON_RUN — stratholme.h:14. */
194
+ typeField: 0,
195
+ /** Full run window — stratholme.cpp:230. */
196
+ durationMs: 45 * 60 * 1000,
197
+ /** stratholme.cpp:1140 yell when remaining ≤ 10 min. */
198
+ warn10MinMs: 10 * 60 * 1000,
199
+ /** stratholme.cpp:1145 yell when remaining ≤ 5 min. */
200
+ warn5MinMs: 5 * 60 * 1000,
201
+ /** stratholme.cpp:1172 post-fail speech delay before Soul Drain. */
202
+ failSpeechDelayMs: 8 * 1000,
203
+ runFlag: STRATH_UNDEAD_FLAGS.baronRun,
204
+ successFlag: STRATH_UNDEAD_FLAGS.baronRunSuccess,
205
+ failFlag: STRATH_UNDEAD_FLAGS.baronRunFail,
206
+ } as const;
207
+
208
+ // Ysida Harmon has no `creature` row: the Baron summons her inside the cage when the Gauntlet Gate
209
+ // arms the run, and the run's outcome decides whether she is freed or Soul Drained 8 s later.
210
+ export const STRATH_YSIDA = {
211
+ entry: 16031,
212
+ cageGo: 181071,
213
+ /** stratholme.h:141 stratholmeLocation[7] — summoned inside the cage. */
214
+ cagePoint: { x: 4044.78, y: -3333.68, z: 115.53, o: 4.15 },
215
+ /** stratholme.h:142 stratholmeLocation[8] — freed, or dragged out to die. */
216
+ freedPoint: { x: 4041.9, y: -3337.6, z: 115.06, o: 3.82 },
217
+ /** quests.json 8945 killTargets[0] "Ysida Freed" — credit target is her own entry. */
218
+ questDeadMansPlea: 8945,
219
+ /** stratholme.h:80 SPELL_YSIDA_FREED — Argent Dawn rep on top of the turn-in. */
220
+ spellFreed: 27773,
221
+ /** stratholme.h:79 SPELL_BARON_SOUL_DRAIN — what kills her on FAIL. */
222
+ spellSoulDrain: 27640,
223
+ /** UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER once freed (stratholme.cpp:391). */
224
+ freedNpcFlags: 3,
225
+ } as const;
226
+
227
+ // The two portcullises the undead run walks THROUGH, each with a GOUse script; neither is a detour,
228
+ // since passing them is the trigger. Cite: stratholmeScripts.cpp:36-55, :61-91.
229
+ export const STRATH_WALK_THROUGH_GATES = [
230
+ {
231
+ goEntry: 175368,
232
+ name: 'Service Entrance Gate',
233
+ at: { x: 3624.91, y: -3642.16, z: 138.445 },
234
+ setsFlag: STRATH_UNDEAD_FLAGS.barthilasRun,
235
+ },
236
+ {
237
+ goEntry: 175357,
238
+ name: 'Gauntlet Gate',
239
+ at: { x: 3727.29, y: -3599.08, z: 142.22 },
240
+ setsFlag: STRATH_UNDEAD_FLAGS.baronRun,
241
+ },
242
+ ] as const;
243
+
244
+ // Post-Ramstein Black Guard gauntlet timing. Cite: stratholme.cpp:312 summon timer 500, :1212 gap
245
+ // 400 with mindlessCount < 30, :718 blackGuardsTimer 60s after all mindless die, :319 5× guard.
246
+ export const STRATH_BLACK_GUARD = {
247
+ encId: 'black-guard-waves',
248
+ firstMindlessMs: 500,
249
+ mindlessGapMs: 400,
250
+ mindlessCount: 30,
251
+ packSize: 5,
252
+ /** Inter-pack schedule: 5 summons × 400ms (cpp:1212). */
253
+ packGapMs: 5 * 400,
254
+ /** After last mindless pack fully dead — cpp:718. */
255
+ blackGuardAfterClearMs: 60_000,
256
+ blackGuardCount: 5,
257
+ mindlessEntry: ENTRY.mindlessUndead,
258
+ blackGuardEntry: ENTRY.blackGuardSentry,
259
+ /** Mindless pack waves before the Black Guard finale (6×5 = 30). */
260
+ mindlessWaveCount: 6,
261
+ } as const;
262
+
263
+ // Post-Ramstein Black Guard gauntlet: 30× Mindless Undead 11030 then 5× Black Guard 10394. Packs of 5;
264
+ // floor gauntlet times packs (see STRATH_BLACK_GUARD + liveDungeonController).
265
+ export const STRATH_BLACK_GUARD_WAVES = [
266
+ { pack: [{ creatureEntry: ENTRY.mindlessUndead, count: 5 }] },
267
+ { pack: [{ creatureEntry: ENTRY.mindlessUndead, count: 5 }] },
268
+ { pack: [{ creatureEntry: ENTRY.mindlessUndead, count: 5 }] },
269
+ { pack: [{ creatureEntry: ENTRY.mindlessUndead, count: 5 }] },
270
+ { pack: [{ creatureEntry: ENTRY.mindlessUndead, count: 5 }] },
271
+ { pack: [{ creatureEntry: ENTRY.mindlessUndead, count: 5 }] },
272
+ { pack: [{ creatureEntry: ENTRY.blackGuardSentry, count: 5 }] },
273
+ ] as const;
274
+
275
+ /** Mindless Undead total across black-guard waves (survey: 30). */
276
+ export const STRATH_MINDLESS_UNDEAD_COUNT = 30;
277
+
278
+ /** Black Guard Sentry count (survey: 5). */
279
+ export const STRATH_BLACK_GUARD_COUNT = 5;
280
+
281
+ // Slaughter Square abom march cadence (residual — not a floor gauntlet yet). Cite: stratholme.cpp:261 first
282
+ // SPECIAL 20s; :1247 urand(30,45)*IN_MILLISECONDS.
283
+ export const STRATH_ABOM_MARCH = {
284
+ firstMarchMs: 20_000,
285
+ marchMinMs: 30_000,
286
+ marchMaxMs: 45_000,
287
+ } as const;
288
+
289
+ // Ramstein the Gorger — summon-only once every Slaughter Square abomination is dead, then DONE opens
290
+ // the Port Slaughter Gate and sends 30 Mindless plus 5 Black Guard. Cite: stratholme.cpp:285-328.
291
+ export const STRATH_RAMSTEIN = {
292
+ entry: ENTRY.ramstein,
293
+ encId: 'ramstein-the-gorger',
294
+ /** GO_ZIGGURAT_DOOR_4 — stratholme.h:62; DoOpenSlaughterhouseDoor stratholme.cpp:76-82. */
295
+ slaughterhouseDoor: 175405,
296
+ /** stratholme.h:136 stratholmeLocation[2]. */
297
+ summonPoint: { x: 4032.643, y: -3378.546, z: 119.752, o: 4.74 },
298
+ /** stratholme.h:137 stratholmeLocation[3] — comment says Ramstein move loc. */
299
+ authoredMovePoint: { x: 4032.843, y: -3390.246, z: 119.732 },
300
+ /** Engage / walk-out point. Cite: stratholme.cpp:294 MovePoint(0, stratholmeLocation[5]). */
301
+ movePoint: { x: 4033.044, y: -3431.031, z: 119.055 },
302
+ /** stratholme.cpp:285 m_slaughterDoorTimer = 10 * IN_MILLISECONDS. */
303
+ doorOpenMs: 10_000,
304
+ } as const;
305
+
306
+ /** Bile Spewer 10416 / Venom Belcher 10417 — m_abominationGUIDs. Cite: stratholme.h:35-36. */
307
+ export function strathIsSlaughterAbom(enc: {
308
+ creatureEntry: number;
309
+ pack?: readonly { creatureEntry: number }[];
310
+ }): boolean {
311
+ if (enc.creatureEntry === ENTRY.bileSpewer || enc.creatureEntry === ENTRY.venomBelcher) {
312
+ return true;
313
+ }
314
+ return (enc.pack ?? []).some(
315
+ (p) => p.creatureEntry === ENTRY.bileSpewer || p.creatureEntry === ENTRY.venomBelcher,
316
+ );
317
+ }
318
+
319
+ /** Per-pack clear flag — all must be set before Ramstein unlocks (abomCount==0). */
320
+ export function strathAbomClearFlag(encId: string): string {
321
+ return `strath-undead-abom-clear:${encId}`;
322
+ }
323
+
324
+ // Aurius intervention — the Medallion of Faith turn-in makes him an ally on Baron engage, teleported
325
+ // beside the Baron at faction 42. Cite: stratholme.cpp:356-358, :1109-1135, :395-413.
326
+ export const STRATH_AURIUS = {
327
+ entry: 10917,
328
+ questMedallion: 5122,
329
+ questReckoning: 5125,
330
+ medallionItem: 12845,
331
+ /** stratholme.h:21 TYPE_AURIUS = 7. */
332
+ typeField: 7,
333
+ /** stratholme.cpp:358. */
334
+ summonDelayMs: 5_000,
335
+ /** stratholme.cpp:1121 GetRandomPoint(..., 4.0f, ...). */
336
+ teleportRadiusYd: 4,
337
+ /** stratholme.h:73 FACTION_VICTIM = 42. */
338
+ factionVictim: 42,
339
+ flag: STRATH_UNDEAD_FLAGS.aurius,
340
+ joinedFlag: STRATH_UNDEAD_FLAGS.auriusJoined,
341
+ } as const;
342
+
343
+ /** True when Medallion turn-in armed TYPE_AURIUS. */
344
+ export function strathAuriusArmed(flags: readonly string[]): boolean {
345
+ return flags.includes(STRATH_AURIUS.flag);
346
+ }
347
+
348
+ // Pure: Aurius joins the Baron fight only when medallion was rewarded and he has not already joined.
349
+ // Negative: no medallion → false. Cite: stratholme.cpp:356-358 TYPE_AURIUS == DONE on Baron IN_PROGRESS.
350
+ export function strathAuriusJoinsBaron(args: {
351
+ flags: readonly string[];
352
+ baronEngaged: boolean;
353
+ }): boolean {
354
+ if (!args.baronEngaged) return false;
355
+ if (!strathAuriusArmed(args.flags)) return false;
356
+ if (args.flags.includes(STRATH_AURIUS.joinedFlag)) return false;
357
+ return true;
358
+ }
359
+
360
+ // Magistrate Barthilas flees when the Service Entrance Gate is used: MovePoint to the door, then an
361
+ // 8 s teleport to stratholmeLocation[1]. Cite: stratholmeScripts.cpp:42-54; stratholme.cpp:427-437.
362
+ export const STRATH_BARTHILAS_RUN = {
363
+ goEntry: 175368,
364
+ encId: 'magistrate-barthilas',
365
+ entry: 10435,
366
+ /** stratholme.cpp:437. */
367
+ fleeDelayMs: 8_000,
368
+ /** stratholme.h:134 — door run waypoint (path residual). */
369
+ doorPoint: { x: 3725.577, y: -3599.484, z: 142.367 },
370
+ /** stratholme.h:135 — final tele / fight origin after flee. */
371
+ telePoint: { x: 4068.284, y: -3535.678, z: 122.771, o: 2.5 },
372
+ runFlag: STRATH_UNDEAD_FLAGS.barthilasRun,
373
+ relocatedFlag: STRATH_UNDEAD_FLAGS.barthilasRelocated,
374
+ } as const;
375
+
376
+ /** True when service gate armed Barthilas flee. */
377
+ export function strathBarthilasRunArmed(flags: readonly string[]): boolean {
378
+ return flags.includes(STRATH_BARTHILAS_RUN.runFlag);
379
+ }
380
+
381
+ /** True after 8s tele (or forced relocate). */
382
+ export function strathBarthilasRelocated(flags: readonly string[]): boolean {
383
+ return flags.includes(STRATH_BARTHILAS_RUN.relocatedFlag);
384
+ }
385
+
386
+ // Pure: after flee delay, Barthilas relocates if still not in combat. Cite: stratholme.cpp:1095 IsAlive()
387
+ // && !IsInCombat().
388
+ export function strathBarthilasShouldRelocate(args: {
389
+ flags: readonly string[];
390
+ elapsedMs: number;
391
+ inCombat: boolean;
392
+ }): boolean {
393
+ if (!strathBarthilasRunArmed(args.flags)) return false;
394
+ if (strathBarthilasRelocated(args.flags)) return false;
395
+ if (args.inCombat) return false;
396
+ return args.elapsedMs >= STRATH_BARTHILAS_RUN.fleeDelayMs;
397
+ }
398
+
399
+ // Baron Rivendare Raise Dead — 6 Mindless Skeletons on a 15 s combat timer, via 17473 then
400
+ // 17475–17480 each summoning 11197. Cite: creature_ai_scripts 1044005–1044007.
401
+ export const STRATH_RIVENDARE_RAISE = {
402
+ spellRaiseDead: 17473,
403
+ summonSpells: [17475, 17476, 17477, 17478, 17479, 17480] as const,
404
+ skeletonEntry: 11197,
405
+ skeletonCount: 6,
406
+ /** EventAI 1044005 event_param1/2/3/4 = 15000. */
407
+ firstCastMs: 15_000,
408
+ repeatMs: 15_000,
409
+ /** spell_target_position rows for 17475–17480. */
410
+ positions: [
411
+ { x: 4017.4, y: -3339.7, z: 115.058, o: 5.48 },
412
+ { x: 4013.18, y: -3351.8, z: 115.052, o: 0.13 },
413
+ { x: 4017.73, y: -3363.47, z: 115.057, o: 0.72 },
414
+ { x: 4048.87, y: -3363.22, z: 115.054, o: 3.62 },
415
+ { x: 4051.77, y: -3350.89, z: 115.055, o: 3.06 },
416
+ { x: 4048.37, y: -3339.96, z: 115.055, o: 2.45 },
417
+ ] as const,
418
+ } as const;
419
+
420
+ // Pure: how many Raise Dead cycles fire by fight elapsed ms. Negative: before firstCastMs → 0. Cite:
421
+ // EventAI 1044005 initial 15000, repeat 15000.
422
+ export function rivendareRaiseCastsByMs(fightMs: number): number {
423
+ if (fightMs < STRATH_RIVENDARE_RAISE.firstCastMs) return 0;
424
+ return (
425
+ 1
426
+ + Math.floor(
427
+ (fightMs - STRATH_RIVENDARE_RAISE.firstCastMs) / STRATH_RIVENDARE_RAISE.repeatMs,
428
+ )
429
+ );
430
+ }
431
+
432
+ /** Skeletons summoned by that many casts (6 per cast). */
433
+ export function rivendareSkeletonsByMs(fightMs: number): number {
434
+ return rivendareRaiseCastsByMs(fightMs) * STRATH_RIVENDARE_RAISE.skeletonCount;
435
+ }
436
+
437
+ /** Summon-only creature entries that must never appear in pure static trash packs. */
438
+ export const STRATH_UNDEAD_SUMMON_ONLY_ENTRIES = new Set<number>([
439
+ ENTRY.ramstein, // 10439
440
+ ENTRY.mindlessUndead, // 11030
441
+ ENTRY.blackGuardSentry, // 10394
442
+ ]);
443
+
444
+ /** Live-side bosses / event summons - must not appear in this graph. */
445
+ export const STRATH_LIVE_BOSS_ENTRIES = new Set<number>([
446
+ 10516, // The Unforgiven
447
+ 10808, // Timmy the Cruel
448
+ 10997, // Cannon Master Willey
449
+ 10811, // Archivist Galford
450
+ 10812, // Grand Crusader Dathrohan
451
+ 10813, // Balnazzar (Dathrohan transform)
452
+ 11143, // Postmaster Malown
453
+ 11058, // Fras Siabi
454
+ 11032, // Malor the Zealous
455
+ ]);
456
+
457
+ /** Crimson / Scarlet Bastion trash entries (Live side). */
458
+ export const STRATH_CRIMSON_ENTRIES = new Set<number>([
459
+ 10418, // Crimson Guardsman
460
+ 10419, // Crimson Conjuror
461
+ 10420, // Crimson Initiate
462
+ 10421, // Crimson Defender
463
+ 10422, // Crimson Sorcerer
464
+ 10423, // Crimson Priest
465
+ 10424, // Crimson Gallant
466
+ 10425, // Crimson Battle Mage
467
+ 10426, // Crimson Inquisitor
468
+ 11043, // Crimson Monk
469
+ 11054, // Crimson Rifleman (Willey summon)
470
+ ]);
471
+
472
+ /** Scourge Invasion / friendlies / technical / Live phantoms - excluded from combat graph. */
473
+ export const STRATH_UNDEAD_EXCLUDED_ENTRIES = new Set<number>([
474
+ 14684, // Balzaphon - D-10 / Scourge Invasion
475
+ 10917, // Aurius - friendly/service
476
+ 15607, // Elder Farwhisper - friendly/service
477
+ 14646, // Stratholme Trigger - technical
478
+ 16046, // Jarien and Sothos Trigger - technical
479
+ 16100, // Ysida's Trigger - technical
480
+ 10387, // Vengeful Phantom - Unforgiven live side
481
+ 10415, // Ash'ari Crystal - ziggurat channel object (GAP)
482
+ 10516, // The Unforgiven - Live
483
+ ...STRATH_LIVE_BOSS_ENTRIES,
484
+ ...STRATH_CRIMSON_ENTRIES,
485
+ ]);
486
+
487
+ /** Split a static spawn count into pack sizes in [2, 5] (prefer 4). Remainder 1 folded into prior pack. */
488
+ export function splitPackSizes(total: number, prefer = 4): number[] {
489
+ if (total <= 0) return [];
490
+ if (total === 1) return [1];
491
+ const packs: number[] = [];
492
+ let left = total;
493
+ while (left > 0) {
494
+ if (left <= 5) {
495
+ packs.push(left);
496
+ break;
497
+ }
498
+ let n = prefer;
499
+ const rem = left - n;
500
+ if (rem === 1) n = prefer - 1; // leave 2+
501
+ packs.push(n);
502
+ left -= n;
503
+ }
504
+ return packs;
505
+ }
506
+
507
+ function trashPull(
508
+ id: string,
509
+ name: string,
510
+ creatureEntry: number,
511
+ count: number,
512
+ events?: EncounterEvent[],
513
+ ): EncounterDef {
514
+ const enc: EncounterDef = {
515
+ id,
516
+ name,
517
+ kind: 'trash',
518
+ creatureEntry,
519
+ };
520
+ if (count > 1) enc.pack = [{ creatureEntry, count: count - 1 }];
521
+ if (events && events.length) enc.events = events;
522
+ return enc;
523
+ }
524
+
525
+ /** Expand one census entry into ordered trash pulls (ids `${prefix}-0` …). */
526
+ function trashFromCensus(
527
+ _prefix: string,
528
+ _displayName: string,
529
+ _creatureEntry: number,
530
+ _total: number,
531
+ /** Gate events two call sites pass (Slaughter Square aboms). Ignored while this is a stub. */
532
+ _events?: EncounterEvent[],
533
+ ): EncounterDef[] {
534
+ // DP1: cluster packs supply trash; hand spine keeps bosses/events only.
535
+ return [];
536
+ }
537
+
538
+ // Boss spells: creature.spells from bake + EventAI cast ids (sourced). Rivendare: bake kit + Raise Dead
539
+ // 17473 (EventAI 1044005); 17475–80 are spellhit summons (STRATH_RIVENDARE_RAISE), not rotation entries.
540
+ const BOSS_SPELLS = {
541
+ anastari: [16867, 16565, 18327, 17244],
542
+ nerubenkan: [4962, 6016, 16418, 17235],
543
+ maleki: [17238, 16869, 17503, 17243],
544
+ barthilas: [10887, 14099, 16793, 16791, 16792, 16794],
545
+ ramstein: [5568, 17307, 6788, 15088],
546
+ rivendare: [17467, 15708, 15284, 17393, 17473],
547
+ forresten: [16798, 16244, 16100, 14443, 16331],
548
+ skul: [12544, 15499, 16799, 15230],
549
+ stonespine: [14331],
550
+ } as const;
551
+
552
+ function boss(
553
+ id: string,
554
+ name: string,
555
+ creatureEntry: number,
556
+ bossSpells: readonly number[],
557
+ events?: EncounterEvent[],
558
+ intro?: string,
559
+ ): EncounterDef {
560
+ const enc: EncounterDef = {
561
+ id,
562
+ name,
563
+ kind: 'boss',
564
+ creatureEntry,
565
+ };
566
+ if (bossSpells.length) enc.bossSpells = [...bossSpells];
567
+ if (intro) enc.intro = intro;
568
+ if (events && events.length) enc.events = events;
569
+ return enc;
570
+ }
571
+
572
+ // Linear encounter graph: undead entrance → three ziggurat bosses → Barthilas → Slaughter Square
573
+ // aboms → Ramstein → Black Guard waves → Baron Rivendare. Static entries → packs of 2–5.
574
+ function buildHandSpine(): EncounterDef[] {
575
+ const ravaged = trashFromCensus(
576
+ 'ravaged-cadaver',
577
+ 'Ravaged Cadaver',
578
+ ENTRY.ravagedCadaver,
579
+ STATIC.ravagedCadaver,
580
+ );
581
+ const mangled = trashFromCensus(
582
+ 'mangled-cadaver',
583
+ 'Mangled Cadaver',
584
+ ENTRY.mangledCadaver,
585
+ STATIC.mangledCadaver,
586
+ );
587
+ const spectral = trashFromCensus(
588
+ 'spectral-citizen',
589
+ 'Spectral Citizen',
590
+ ENTRY.spectralCitizen,
591
+ STATIC.spectralCitizen,
592
+ );
593
+ const ghostly = trashFromCensus(
594
+ 'ghostly-citizen',
595
+ 'Ghostly Citizen',
596
+ ENTRY.ghostlyCitizen,
597
+ STATIC.ghostlyCitizen,
598
+ );
599
+ const guardians = trashFromCensus(
600
+ 'skeletal-guardian',
601
+ 'Skeletal Guardian',
602
+ ENTRY.skeletalGuardian,
603
+ STATIC.skeletalGuardian,
604
+ );
605
+ const berserkers = trashFromCensus(
606
+ 'skeletal-berserker',
607
+ 'Skeletal Berserker',
608
+ ENTRY.skeletalBerserker,
609
+ STATIC.skeletalBerserker,
610
+ );
611
+ const shadowcasters = trashFromCensus(
612
+ 'thuzadin-shadowcaster',
613
+ 'Thuzadin Shadowcaster',
614
+ ENTRY.thuzadinShadowcaster,
615
+ STATIC.thuzadinShadowcaster,
616
+ );
617
+ const acolytes = trashFromCensus(
618
+ 'thuzadin-acolyte',
619
+ 'Thuzadin Acolyte',
620
+ ENTRY.thuzadinAcolyte,
621
+ STATIC.thuzadinAcolyte,
622
+ );
623
+ const necromancers = trashFromCensus(
624
+ 'thuzadin-necromancer',
625
+ 'Thuzadin Necromancer',
626
+ ENTRY.thuzadinNecromancer,
627
+ STATIC.thuzadinNecromancer,
628
+ );
629
+ const plagueGhouls = trashFromCensus(
630
+ 'plague-ghoul',
631
+ 'Plague Ghoul',
632
+ ENTRY.plagueGhoul,
633
+ STATIC.plagueGhoul,
634
+ );
635
+ const ghoulsRavener = trashFromCensus(
636
+ 'ghoul-ravener',
637
+ 'Ghoul Ravener',
638
+ ENTRY.ghoulRavener,
639
+ STATIC.ghoulRavener,
640
+ );
641
+ const fleshflayers = trashFromCensus(
642
+ 'fleshflayer-ghoul',
643
+ 'Fleshflayer Ghoul',
644
+ ENTRY.fleshflayerGhoul,
645
+ STATIC.fleshflayerGhoul,
646
+ );
647
+ const gargoyles = trashFromCensus(
648
+ 'rockwing-gargoyle',
649
+ 'Rockwing Gargoyle',
650
+ ENTRY.rockwingGargoyle,
651
+ STATIC.rockwingGargoyle,
652
+ );
653
+ const screechers = trashFromCensus(
654
+ 'rockwing-screecher',
655
+ 'Rockwing Screecher',
656
+ ENTRY.rockwingScreecher,
657
+ STATIC.rockwingScreecher,
658
+ );
659
+ const eyes = trashFromCensus(
660
+ 'eye-of-naxxramas',
661
+ 'Eye of Naxxramas',
662
+ ENTRY.eyeOfNaxxramas,
663
+ STATIC.eyeOfNaxxramas,
664
+ );
665
+ const crawlers = trashFromCensus(
666
+ 'crypt-crawler',
667
+ 'Crypt Crawler',
668
+ ENTRY.cryptCrawler,
669
+ STATIC.cryptCrawler,
670
+ );
671
+ const beasts = trashFromCensus(
672
+ 'crypt-beast',
673
+ 'Crypt Beast',
674
+ ENTRY.cryptBeast,
675
+ STATIC.cryptBeast,
676
+ );
677
+ const patchworks = trashFromCensus(
678
+ 'patchwork-horror',
679
+ 'Patchwork Horror',
680
+ ENTRY.patchworkHorror,
681
+ STATIC.patchworkHorror,
682
+ );
683
+ // Slaughter Square aboms - gated until ziggurat chain opens the square.
684
+ const bileSpewers = trashFromCensus(
685
+ 'bile-spewer',
686
+ 'Bile Spewer',
687
+ ENTRY.bileSpewer,
688
+ STATIC.bileSpewer,
689
+ [{ kind: 'requiresFlag', flag: STRATH_UNDEAD_FLAGS.slaughterSquareOpen }],
690
+ );
691
+ const venomBelchers = trashFromCensus(
692
+ 'venom-belcher',
693
+ 'Venom Belcher',
694
+ ENTRY.venomBelcher,
695
+ STATIC.venomBelcher,
696
+ [{ kind: 'requiresFlag', flag: STRATH_UNDEAD_FLAGS.slaughterSquareOpen }],
697
+ );
698
+ const shrieking = trashFromCensus(
699
+ 'shrieking-banshee',
700
+ 'Shrieking Banshee',
701
+ ENTRY.shriekingBanshee,
702
+ STATIC.shriekingBanshee,
703
+ );
704
+ const wailing = trashFromCensus(
705
+ 'wailing-banshee',
706
+ 'Wailing Banshee',
707
+ ENTRY.wailingBanshee,
708
+ STATIC.wailingBanshee,
709
+ );
710
+ const courier = trashFromCensus(
711
+ 'stratholme-courier',
712
+ 'Stratholme Courier',
713
+ ENTRY.stratholmeCourier,
714
+ STATIC.stratholmeCourier,
715
+ );
716
+
717
+ const out: EncounterDef[] = [];
718
+
719
+ // --- Undead service entrance / Festival Lane → first ziggurat ---
720
+ // Cadavers, skeletons, early ghouls, citizens.
721
+ out.push(
722
+ ...mangled.slice(0, Math.ceil(mangled.length / 2)),
723
+ ...ravaged.slice(0, Math.ceil(ravaged.length / 2)),
724
+ ...guardians.slice(0, Math.ceil(guardians.length / 3)),
725
+ ...berserkers.slice(0, Math.ceil(berserkers.length / 3)),
726
+ ...plagueGhouls.slice(0, Math.ceil(plagueGhouls.length / 3)),
727
+ ...spectral.slice(0, Math.ceil(spectral.length / 2)),
728
+ ...ghostly.slice(0, Math.ceil(ghostly.length / 2)),
729
+ ...courier,
730
+ );
731
+
732
+ // Stonespine (10809) has ONE static point and it is a pool slot, not a fixture: pools.json 46803
733
+ // holds that guid at chance 0 against a substitute at 66, so `optional` keeps him off the spine.
734
+ out.push({
735
+ ...boss(
736
+ 'stonespine',
737
+ 'Stonespine',
738
+ ENTRY.stonespine,
739
+ BOSS_SPELLS.stonespine,
740
+ undefined,
741
+ 'Stonespine the rare undead stalker - a pool spawn, not always up.',
742
+ ),
743
+ optional: true,
744
+ });
745
+
746
+ out.push(
747
+ ...shrieking.slice(0, Math.ceil(shrieking.length / 2)),
748
+ ...wailing.slice(0, Math.ceil(wailing.length / 2)),
749
+ ...ghoulsRavener.slice(0, Math.ceil(ghoulsRavener.length / 2)),
750
+ );
751
+
752
+ // --- Ziggurat bosses (any order): each sets own flag; slaughter needs all three ---
753
+ // Gauntlet Gate 175357 objectGate arms Baron's Ultimatum (pin + run flag).
754
+ out.push(
755
+ boss(
756
+ 'baroness-anastari',
757
+ 'Baroness Anastari',
758
+ ENTRY.anastari,
759
+ BOSS_SPELLS.anastari,
760
+ [
761
+ {
762
+ kind: 'objectGate',
763
+ goEntry: STRATH_BARON_RUN.goEntry,
764
+ setsFlag: STRATH_BARON_RUN.runFlag,
765
+ once: true,
766
+ },
767
+ { kind: 'setsFlag', flag: STRATH_UNDEAD_FLAGS.ziggAnastari },
768
+ ],
769
+ "Baroness Anastari holds a ziggurat. Kill the three ziggurat bosses in any order to open Slaughter Square. Gauntlet Gate arms the 45-minute Baron's Ultimatum.",
770
+ ),
771
+ );
772
+
773
+ out.push(
774
+ ...acolytes.slice(0, Math.ceil(acolytes.length / 3)),
775
+ ...shrieking.slice(Math.ceil(shrieking.length / 2)),
776
+ ...plagueGhouls.slice(
777
+ Math.ceil(plagueGhouls.length / 3),
778
+ Math.ceil((2 * plagueGhouls.length) / 3),
779
+ ),
780
+ );
781
+
782
+ // --- Ziggurat 2: Nerub'enkan ---
783
+ out.push(
784
+ ...crawlers.slice(0, Math.ceil(crawlers.length / 2)),
785
+ ...beasts.slice(0, Math.ceil(beasts.length / 2)),
786
+ );
787
+
788
+ out.push(
789
+ boss(
790
+ 'nerubenkan',
791
+ "Nerub'enkan",
792
+ ENTRY.nerubenkan,
793
+ BOSS_SPELLS.nerubenkan,
794
+ [{ kind: 'setsFlag', flag: STRATH_UNDEAD_FLAGS.ziggNerubenkan }],
795
+ "Nerub'enkan the crypt lord holds a ziggurat. Any order with Anastari and Maleki.",
796
+ ),
797
+ );
798
+
799
+ out.push(
800
+ ...crawlers.slice(Math.ceil(crawlers.length / 2)),
801
+ ...beasts.slice(Math.ceil(beasts.length / 2)),
802
+ ...acolytes.slice(
803
+ Math.ceil(acolytes.length / 3),
804
+ Math.ceil((2 * acolytes.length) / 3),
805
+ ),
806
+ ...gargoyles,
807
+ ...screechers,
808
+ );
809
+
810
+ // Forresten (10558) is a STREET rare authored on `stratholme-live` at all four of his real points
811
+ // and optional there. The undead run enters at the Service Gate, so a required stop walks it back.
812
+
813
+ // --- Ziggurat 3: Maleki the Pallid - completes triple-key → Slaughter Square ---
814
+ out.push(
815
+ ...shadowcasters.slice(0, Math.ceil(shadowcasters.length / 2)),
816
+ ...necromancers.slice(0, Math.ceil(necromancers.length / 2)),
817
+ ...wailing.slice(Math.ceil(wailing.length / 2)),
818
+ );
819
+
820
+ out.push(
821
+ boss(
822
+ 'maleki-the-pallid',
823
+ 'Maleki the Pallid',
824
+ ENTRY.maleki,
825
+ BOSS_SPELLS.maleki,
826
+ // Own flag only — slaughterSquareOpen is derived when all three zigg flags are set.
827
+ [{ kind: 'setsFlag', flag: STRATH_UNDEAD_FLAGS.ziggMaleki }],
828
+ 'Maleki the Pallid holds a ziggurat. When all three ziggurats fall, Slaughter Square opens.',
829
+ ),
830
+ );
831
+
832
+ out.push(
833
+ ...acolytes.slice(Math.ceil((2 * acolytes.length) / 3)),
834
+ ...shadowcasters.slice(Math.ceil(shadowcasters.length / 2)),
835
+ ...necromancers.slice(Math.ceil(necromancers.length / 2)),
836
+ ...fleshflayers.slice(0, Math.ceil(fleshflayers.length / 2)),
837
+ );
838
+
839
+ // Skul (10393) is a STREET rare for the same reason, authored optional on `stratholme-live`.
840
+ // Measured cost of keeping him here: the party held `target=skul` for the last 210 s of a run.
841
+
842
+ // --- Magistrate Barthilas (survey order after three ziggurat bosses) ---
843
+ // Service Entrance Gate 175368 arms the flee → 8s teleport to the slaughter approach.
844
+ out.push(
845
+ ...mangled.slice(Math.ceil(mangled.length / 2)),
846
+ ...ravaged.slice(Math.ceil(ravaged.length / 2)),
847
+ ...guardians.slice(
848
+ Math.ceil(guardians.length / 3),
849
+ Math.ceil((2 * guardians.length) / 3),
850
+ ),
851
+ ...berserkers.slice(
852
+ Math.ceil(berserkers.length / 3),
853
+ Math.ceil((2 * berserkers.length) / 3),
854
+ ),
855
+ );
856
+
857
+ // ROUTE ORIGIN IS THE FLEE POINT, NOT THE SPAWN: his `creature` row sits behind the Service
858
+ // Entrance Gate, and using that gate teleports him 8 s later to the Slaughter Square approach.
859
+ out.push({
860
+ ...boss(
861
+ 'magistrate-barthilas',
862
+ 'Magistrate Barthilas',
863
+ ENTRY.barthilas,
864
+ BOSS_SPELLS.barthilas,
865
+ [
866
+ {
867
+ kind: 'objectGate',
868
+ goEntry: STRATH_BARTHILAS_RUN.goEntry,
869
+ setsFlag: STRATH_BARTHILAS_RUN.runFlag,
870
+ once: true,
871
+ },
872
+ ],
873
+ 'Magistrate Barthilas fled the Service Entrance Gate - he is waiting at the Slaughter Square approach.',
874
+ ),
875
+ origin: {
876
+ x: STRATH_BARTHILAS_RUN.telePoint.x,
877
+ y: STRATH_BARTHILAS_RUN.telePoint.y,
878
+ z: STRATH_BARTHILAS_RUN.telePoint.z,
879
+ },
880
+ spawnGuids: [3290432],
881
+ });
882
+
883
+ // --- Slaughter Square aboms (requires ziggurat unlock) → Ramstein ---
884
+ out.push(
885
+ ...plagueGhouls.slice(Math.ceil((2 * plagueGhouls.length) / 3)),
886
+ ...ghoulsRavener.slice(Math.ceil(ghoulsRavener.length / 2)),
887
+ ...fleshflayers.slice(Math.ceil(fleshflayers.length / 2)),
888
+ ...patchworks,
889
+ ...eyes,
890
+ ...spectral.slice(Math.ceil(spectral.length / 2)),
891
+ ...ghostly.slice(Math.ceil(ghostly.length / 2)),
892
+ ...bileSpewers,
893
+ ...venomBelchers,
894
+ );
895
+
896
+ // Ramstein — summon-only once the Slaughter Square aboms die (TYPE_RAMSTEIN SPECIAL).
897
+ // bindSlaughterSquare wires the per-abom clear flags and the engage origin.
898
+ out.push(
899
+ boss(
900
+ STRATH_RAMSTEIN.encId,
901
+ 'Ramstein the Gorger',
902
+ ENTRY.ramstein,
903
+ BOSS_SPELLS.ramstein,
904
+ [{ kind: 'setsFlag', flag: STRATH_UNDEAD_FLAGS.ramsteinDead }],
905
+ 'Clear the Slaughter Square abominations and Baron Rivendare releases Ramstein the Gorger from the slaughterhouse. (Summon-only.)',
906
+ ),
907
+ );
908
+
909
+ // --- Black Guard: 30× Mindless @ 400ms packs + 60s clear → 5× Black Guard ---
910
+ // Primary = Black Guard Sentry (final wave). Timers: STRATH_BLACK_GUARD + gauntletTransition.
911
+ out.push({
912
+ id: STRATH_BLACK_GUARD.encId,
913
+ name: 'Black Guard Gauntlet',
914
+ kind: 'trash',
915
+ creatureEntry: ENTRY.blackGuardSentry,
916
+ intro:
917
+ 'Ramstein falls - thirty Mindless Undead stream into the square (400ms ticks), then after a 60s breather five Black Guard Sentries walk out. The Baron door opens when they die.',
918
+ events: [
919
+ { kind: 'requiresFlag', flag: STRATH_UNDEAD_FLAGS.ramsteinDead },
920
+ {
921
+ kind: 'waves',
922
+ waves: STRATH_BLACK_GUARD_WAVES.map((w) => ({
923
+ pack: w.pack.map((p) => ({ creatureEntry: p.creatureEntry, count: p.count })),
924
+ })),
925
+ },
926
+ { kind: 'setsFlag', flag: STRATH_UNDEAD_FLAGS.baronDoor },
927
+ ],
928
+ });
929
+
930
+ // --- Final approach trash + Baron Rivendare ---
931
+ out.push(
932
+ ...guardians.slice(Math.ceil((2 * guardians.length) / 3)),
933
+ ...berserkers.slice(Math.ceil((2 * berserkers.length) / 3)),
934
+ );
935
+
936
+ out.push(
937
+ boss(
938
+ 'baron-rivendare',
939
+ 'Baron Rivendare',
940
+ ENTRY.rivendare,
941
+ BOSS_SPELLS.rivendare,
942
+ [
943
+ { kind: 'requiresFlag', flag: STRATH_UNDEAD_FLAGS.baronDoor },
944
+ ],
945
+ // Raise Dead 17473 + 6×11197: STRATH_RIVENDARE_RAISE (EventAI 1044005–07).
946
+ // Aurius ally: STRATH_AURIUS (quest 5122 → +5s on engage).
947
+ "Baron Rivendare raises Mindless Skeletons every 15s. Return the Medallion of Faith to Aurius and he joins this fight after 5s.",
948
+ ),
949
+ );
950
+
951
+ return out;
952
+ }
953
+
954
+ // Bind the Thuzadin Acolyte packs the cluster builder produced to their ziggurat: 5+5+5 sit inside
955
+ // the doors, and the sixteenth 90.7 yd out is the announcer, so one 35 yd radius test sorts both.
956
+ function bindZigguratCrypts(encounters: EncounterDef[]): EncounterDef[] {
957
+ return encounters.map((enc) => {
958
+ if (enc.kind !== 'trash' || !enc.origin) return enc;
959
+ const holdsAcolytes = enc.creatureEntry === STRATH_ZIGG_CRYSTAL.acolyteEntry
960
+ || (enc.pack ?? []).some((p) => p.creatureEntry === STRATH_ZIGG_CRYSTAL.acolyteEntry);
961
+ if (!holdsAcolytes) return enc;
962
+ const zi = strathZigguratIndexAt(enc.origin, STRATH_ZIGG_SORT.acolyteYd);
963
+ if (zi < 0) return enc;
964
+ const z = STRATH_ZIGGURAT_BOSSES[zi]!;
965
+ return {
966
+ ...enc,
967
+ name: `Thuzadin Acolytes (${z.encId === 'nerubenkan' ? "Nerub'enkan" : z.encId === 'maleki-the-pallid' ? 'Maleki' : 'Anastari'} ziggurat)`,
968
+ intro:
969
+ `The ziggurat door is open. The Thuzadin Acolytes inside are channelling an Ash'ari `
970
+ + `Crystal (${STRATH_ZIGG_CRYSTAL.entry}) - kill all of them and the crystal shatters, `
971
+ + `which is one of the three keys to Slaughter Square.`,
972
+ events: [
973
+ ...(enc.events ?? []),
974
+ { kind: 'requiresFlag', flag: z.flag } as EncounterEvent,
975
+ { kind: 'setsFlag', flag: z.cryptFlag } as EncounterEvent,
976
+ ],
977
+ };
978
+ });
979
+ }
980
+
981
+ // Slaughter Square: aboms unlock only after three crystals (SPECIAL ×3), and Ramstein only after
982
+ // every abom pack is dead — then spawnUnlockedBodies places 10439 at the MovePoint.
983
+ function bindSlaughterSquare(encounters: EncounterDef[]): EncounterDef[] {
984
+ const aboms = encounters.filter((e) => strathIsSlaughterAbom(e));
985
+ if (!aboms.length) return encounters;
986
+
987
+ const cryptReqs: EncounterEvent[] = STRATH_ZIGGURAT_BOSSES.map((z) => ({
988
+ kind: 'requiresFlag',
989
+ flag: z.cryptFlag,
990
+ }));
991
+
992
+ const boundAboms = aboms.map((enc) => ({
993
+ ...enc,
994
+ name: enc.creatureEntry === ENTRY.bileSpewer ? 'Bile Spewer' : 'Venom Belcher',
995
+ intro:
996
+ 'Slaughter Square abominations. Kill them all and Baron Rivendare releases Ramstein.',
997
+ events: [
998
+ ...cryptReqs,
999
+ { kind: 'setsFlag', flag: strathAbomClearFlag(enc.id) } as EncounterEvent,
1000
+ ],
1001
+ }));
1002
+
1003
+ const rest = encounters.filter(
1004
+ (e) => !strathIsSlaughterAbom(e) && e.id !== STRATH_RAMSTEIN.encId,
1005
+ );
1006
+ const ram = encounters.find((e) => e.id === STRATH_RAMSTEIN.encId);
1007
+ if (!ram) return encounters;
1008
+
1009
+ const ramstein: EncounterDef = {
1010
+ ...ram,
1011
+ origin: {
1012
+ x: STRATH_RAMSTEIN.movePoint.x,
1013
+ y: STRATH_RAMSTEIN.movePoint.y,
1014
+ z: STRATH_RAMSTEIN.movePoint.z,
1015
+ },
1016
+ events: [
1017
+ ...boundAboms.map((a) => ({
1018
+ kind: 'requiresFlag' as const,
1019
+ flag: strathAbomClearFlag(a.id),
1020
+ })),
1021
+ { kind: 'setsFlag', flag: STRATH_UNDEAD_FLAGS.ramsteinDead },
1022
+ ],
1023
+ intro:
1024
+ 'Clear the Slaughter Square abominations and Baron Rivendare releases Ramstein the Gorger '
1025
+ + 'from the slaughterhouse. (Summon-only.)',
1026
+ };
1027
+
1028
+ const insertAt = rest.findIndex(
1029
+ (e) => e.id === STRATH_BLACK_GUARD.encId || e.id === 'baron-rivendare',
1030
+ );
1031
+ if (insertAt < 0) return [...rest, ...boundAboms, ramstein];
1032
+ return [
1033
+ ...rest.slice(0, insertAt),
1034
+ ...boundAboms,
1035
+ ramstein,
1036
+ ...rest.slice(insertAt),
1037
+ ];
1038
+ }
1039
+
1040
+ function buildEncounters(): EncounterDef[] {
1041
+ // Hand spine = bosses + event-gated packs (mono trashFromCensus is empty).
1042
+ const spine = buildHandSpine();
1043
+ return bindSlaughterSquare(bindZigguratCrypts(buildClusterEncounters({
1044
+ mapId: 329,
1045
+ spine,
1046
+ entrance: entranceForInstance('stratholme-undead'),
1047
+ // The exclusion sets above were declared and never passed, so the cluster builder packed
1048
+ // triggers / Balzaphon / Live humanoids into ordinary undead trash pulls (2026-08-17).
1049
+ extraStrip: [
1050
+ ...STRATH_UNDEAD_EXCLUDED_ENTRIES,
1051
+ ...STRATH_UNDEAD_SUMMON_ONLY_ENTRIES,
1052
+ ],
1053
+ includePack: wingFilterByNearestBoss(329, "undead"),
1054
+ })));
1055
+ }
1056
+
1057
+
1058
+ // Undead / Baron-side survey quests completable inside map 329. Live-only (Archivist, Of Love and Family,
1059
+ // Willey/Galford Dungeon Set steps) excluded.
1060
+ export const STRATHOLME_UNDEAD_QUESTS = [
1061
+ 5067, // Leggings of Arcana
1062
+ 8414, // Dispelling Evil
1063
+ 5402, // Minion's Scourgestones
1064
+ 5403, // Invader's Scourgestones
1065
+ 5404, // Corruptor's Scourgestones
1066
+ 5406, // Corruptor's Scourgestones (Garush)
1067
+ 5407, // Invader's Scourgestones (Garush)
1068
+ 5408, // Minion's Scourgestones (Garush)
1069
+ 5508, // Corruptor's Scourgestones (Zverenhoff)
1070
+ 5509, // Invader's Scourgestones (Zverenhoff)
1071
+ 5510, // Minion's Scourgestones (Zverenhoff)
1072
+ 5212, // The Flesh Does Not Lie
1073
+ 5213, // The Active Agent
1074
+ 5122, // The Medallion of Faith
1075
+ 5125, // Aurius' Reckoning
1076
+ 5263, // Above and Beyond (Baron Rivendare head)
1077
+ 5463, // Menethil's Gift
1078
+ 5464, // Menethil's Gift
1079
+ 5063, // Cap of the Scarlet Savant (stitchings)
1080
+ 5068, // Breastplate of Bloodthirst
1081
+ 5166, // Breastplate of the Chromatic Flight
1082
+ 7485, // Libram of Protection
1083
+ 8829, // The Ultimate Deception
1084
+ 8727, // Farwhisper the Elder
1085
+ // Anthion's Parting Words - undead boss / Rivendare pieces (not Willey spaulders 8956/9020)
1086
+ 8951,
1087
+ 8952,
1088
+ 8953,
1089
+ 8954, // Lightforge Legplates (Rivendare)
1090
+ 8955,
1091
+ 8957,
1092
+ 8958,
1093
+ 8959,
1094
+ 9016,
1095
+ 9017,
1096
+ 9018,
1097
+ 9019,
1098
+ 9021,
1099
+ 9022,
1100
+ ] as const;
1101
+
1102
+ export const STRATHOLME_UNDEAD: InstanceDef = {
1103
+ id: 'stratholme-undead',
1104
+ mapId: 329,
1105
+ wing: 'undead',
1106
+ name: 'Stratholme (Undead)',
1107
+ portalZone: 'easternplaguelands',
1108
+ minLevel: 45, // entrance triggers 2214/2216/2217 requiredLevel
1109
+ levelRange: [55, 61], // survey trash band
1110
+ lockoutMs: 0,
1111
+ description: '',
1112
+ quests: [...STRATHOLME_UNDEAD_QUESTS],
1113
+ encounters: buildEncounters(),
1114
+ };
1115
+
1116
+ /** Sum of authored kill supply per creature entry (trash + bosses + waves). */
1117
+ export function strathUndeadKillSupply(): Map<number, number> {
1118
+ const map = new Map<number, number>();
1119
+ const add = (entry: number, n: number) => map.set(entry, (map.get(entry) ?? 0) + n);
1120
+ for (const enc of STRATHOLME_UNDEAD.encounters) {
1121
+ add(enc.creatureEntry, 1);
1122
+ for (const p of enc.pack ?? []) add(p.creatureEntry, p.count);
1123
+ for (const ev of enc.events ?? []) {
1124
+ if (ev.kind === 'onDeathSummon') add(ev.creatureEntry, 1);
1125
+ if (ev.kind === 'waves') {
1126
+ for (const w of ev.waves) {
1127
+ for (const row of w.pack) add(row.creatureEntry, row.count);
1128
+ }
1129
+ }
1130
+ if (ev.kind === 'hpThreshold' && ev.spawn) {
1131
+ for (const row of ev.spawn) add(row.creatureEntry, row.count);
1132
+ }
1133
+ }
1134
+ }
1135
+ // waves re-count primary when wave packs include creatureEntry - subtract identity
1136
+ // primary once (gnomeregan convention), not full wave totals.
1137
+ for (const enc of STRATHOLME_UNDEAD.encounters) {
1138
+ const waves = (enc.events ?? []).find((e) => e.kind === 'waves');
1139
+ if (!waves || waves.kind !== 'waves') continue;
1140
+ let primaryInWaves = false;
1141
+ for (const w of waves.waves) {
1142
+ for (const row of w.pack) {
1143
+ if (row.creatureEntry === enc.creatureEntry) primaryInWaves = true;
1144
+ }
1145
+ }
1146
+ if (primaryInWaves) add(enc.creatureEntry, -1);
1147
+ }
1148
+ return map;
1149
+ }
1150
+
1151
+ // Counts only pure static trash packs, with no bosses and no flag-gated or wave event pulls. The
1152
+ // Slaughter Square aboms are included: their flag gates unlock order, not spawn source.
1153
+ export function strathUndeadPureStaticTrashCounts(): Map<number, number> {
1154
+ const map = new Map<number, number>();
1155
+ const add = (entry: number, n: number) => map.set(entry, (map.get(entry) ?? 0) + n);
1156
+ for (const enc of STRATHOLME_UNDEAD.encounters) {
1157
+ if (enc.kind !== 'trash') continue;
1158
+ const hasWaves = (enc.events ?? []).some((e) => e.kind === 'waves');
1159
+ if (hasWaves) continue; // black-guard event stream - not static
1160
+ add(enc.creatureEntry, 1);
1161
+ for (const p of enc.pack ?? []) add(p.creatureEntry, p.count);
1162
+ }
1163
+ return map;
1164
+ }