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,378 @@
1
+ // Naxxramas Frostwyrm Lair — the ScriptDevAI IR port of Sapphiron and Kel'Thuzad plus their two
2
+ // helper scripts. Sapphiron owns his schedule through list swaps; Kel'Thuzad keeps his baked list.
3
+
4
+ import type {
5
+ ScriptDevAction, ScriptDevIR, ScriptDevSummonWave, ScriptDevTimedPhase, ScriptDevTimer,
6
+ } from './types.ts';
7
+ import { INSTANCE_DATA } from './types.ts';
8
+ import { CAST_FLAG } from '../creature/creatureAi.ts';
9
+
10
+ // naxxramas.h:70-71
11
+ const TYPE = { SAPPHIRON: 13, KELTHUZAD: 14 } as const;
12
+
13
+ // naxxramas.h:98-100,116-119
14
+ const NPC = {
15
+ SAPPHIRON: 15989, KELTHUZAD: 15990, THE_LICHKING: 16980,
16
+ SOLDIER_FROZEN: 16427, UNSTOPPABLE_ABOM: 16428, SOUL_WEAVER: 16429, GUARDIAN: 16441,
17
+ BLIZZARD: 16474,
18
+ } as const;
19
+
20
+ // naxxramas.h:157-160
21
+ const GO_KELTHUZAD_WINDOW = [181402, 181403, 181404, 181405] as const;
22
+
23
+ /** BossAI::SetDataType — Aggro IN_PROGRESS, JustDied DONE, evade/home FAIL. Cite: BossAI.cpp:41-98. */
24
+ function lifecycleFor(field: number, file: string) {
25
+ return {
26
+ onAggro: [{ kind: 'set_instance_data' as const, field, value: INSTANCE_DATA.IN_PROGRESS, cite: `${file} SetDataType; BossAI.cpp:75 Aggro SetData(IN_PROGRESS)` }],
27
+ onDeath: [{ kind: 'set_instance_data' as const, field, value: INSTANCE_DATA.DONE, cite: `${file} SetDataType; BossAI.cpp:49 JustDied SetData(DONE)` }],
28
+ onEvade: [{ kind: 'set_instance_data' as const, field, value: INSTANCE_DATA.FAIL, cite: `${file} SetDataType; BossAI.cpp:59,94 SetData(FAIL)` }],
29
+ };
30
+ }
31
+
32
+ // `creature_spell_list.TargetId` → IR target mode: 0 NONE (self-cast), 1 CURRENT (victim).
33
+ // Cite: CreatureSpellList.h:34-43; creature_spell_targeting rows 0,1.
34
+ const t = (
35
+ id: string, spellId: number, iMin: number, iMax: number, rMin: number, rMax: number,
36
+ target: ScriptDevTimer['target'], cite: string, extra: Partial<ScriptDevTimer> = {},
37
+ ): ScriptDevTimer => ({
38
+ id, spellId, initialMinMs: iMin, initialMaxMs: iMax, repeatMinMs: rMin, repeatMaxMs: rMax,
39
+ target, cite, ...extra,
40
+ });
41
+
42
+ // boss_sapphiron
43
+ export const BOSS_SAPPHIRON: ScriptDevIR = {
44
+ name: 'boss_sapphiron',
45
+ boundCreatures: [NPC.SAPPHIRON],
46
+ sourceFile: 'eastern_kingdoms/naxxramas/boss_sapphiron.cpp',
47
+ // Trigger payloads ride the KIT: stepSession resolves a periodic trigger off
48
+ // spec.spells, so a payload missing here delivers nothing (moltenCore.ts:88 same rule).
49
+ spellIds: [
50
+ 19818, 28529, 26662, 19983, 15847, 28542, 28560, 28561,
51
+ 18430, 28526, 28522, 31800, 28535, 30101, 28524, 29329, 29330,
52
+ 18941, 28531, 29318, 30132, 29336,
53
+ ],
54
+ timers: [
55
+ t('double_attack', 19818, 0, 0, 0, 0, 'self', 'boss_sapphiron.cpp:111 Reset DoCastSpellIfCan(SPELL_DOUBLE_ATTACK, CAST_TRIGGERED|CAST_AURA_NOT_PRESENT)', { onReset: true }),
56
+ t('frost_aura', 28529, 0, 0, 0, 0, 'self', 'boss_sapphiron.cpp:127 Aggro DoCastSpellIfCan(SPELL_FROST_AURA, CAST_TRIGGERED|CAST_AURA_NOT_PRESENT); :35 periodically triggers 28531', { onReset: true }),
57
+ // Phase-free: the 15-minute enrage is in neither list and must survive both swaps.
58
+ // AURA_NOT_PRESENT makes the 300 s re-arm fire exactly once, matching DisableCombatAction.
59
+ t('berserk', 26662, 900_000, 900_000, 300_000, 300_000, 'self', 'boss_sapphiron.cpp:88,118,190-197 AddCombatAction(SAPPHIRON_BERSERK, 15*MINUTE), subsequent 300s, DisableCombatAction on CAST_OK', { castFlags: CAST_FLAG.AURA_NOT_PRESENT }),
60
+ // ---- PHASE 0, list 1598901 (SPELLSET_GROUND) ----
61
+ t('cleave', 19983, 5000, 5000, 5000, 10_000, 'victim', 'creature_spell_list 1598901:1 Sapphiron - Cleave (TargetId 1 = Current)', { phase: 0 }),
62
+ t('tail_sweep', 15847, 12_000, 12_000, 7000, 10_000, 'self', 'creature_spell_list 1598901:2 Sapphiron - Tail Sweep (TargetId 0 = None)', { phase: 0 }),
63
+ t('life_drain', 28542, 11_000, 11_000, 24_000, 24_000, 'self', 'creature_spell_list 1598901:3 Sapphiron - Life Drain', { phase: 0 }),
64
+ t('blizzard', 28560, 15_000, 15_000, 10_000, 30_000, 'self', 'creature_spell_list 1598901:4 Sapphiron - Blizzard', { phase: 0 }),
65
+ // PHASE 1, list 1598902 SPELLSET_AIR. 28526 is a bare SCRIPT effect: the pick (a player without
66
+ // 28522) and the 31800 immunity ARE the port, and that immunity carries them through the breath.
67
+ t('icebolt', 28522, 2000, 2000, 3000, 3000, 'hostile_random_player_not_aura', 'creature_spell_list 1598902:1 Sapphiron - Icebolt (live3310 dump); boss_sapphiron.cpp:238-250 IceBolt SpellScript SelectAttackingTarget(RANDOM, 0, SPELL_ICEBOLT, PLAYER | NOT_AURA)', {
68
+ phase: 1,
69
+ actions: [
70
+ {
71
+ kind: 'cast_on_cast_target',
72
+ spellId: 31800,
73
+ castFlags: CAST_FLAG.TRIGGERED,
74
+ auraNotPresent: true,
75
+ cite: 'boss_sapphiron.cpp:268-274 PeriodicIceBolt: !HasAura(SPELL_ICEBOLT_IMMUNITY) -> CastSpell(target, 31800)',
76
+ },
77
+ {
78
+ kind: 'cast_on_cast_target',
79
+ spellId: 28535,
80
+ castFlags: CAST_FLAG.TRIGGERED,
81
+ cite: 'boss_sapphiron.cpp:272 data.spellInfo = SPELL_ICEBLOCK_SUMMON 28535 (GO 181247, 22 s)',
82
+ },
83
+ ],
84
+ }),
85
+ // ---- PHASE 2, list 1598903 (SPELLSET_NULL): zero rows, so zero timers ----
86
+ ],
87
+ timedPhases: [
88
+ {
89
+ id: 'air',
90
+ phase: 1,
91
+ afterMs: 46_000,
92
+ next: 'frost_breath',
93
+ hpMinPct: 10,
94
+ actions: [
95
+ { kind: 'set_melee_enabled', enabled: false, cite: 'boss_sapphiron.cpp:207 SetMeleeEnabled(false)' },
96
+ { kind: 'cast_self', spellId: 29329, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_sapphiron.cpp:144 SPELL_SUMMON_WING_BUFFET' },
97
+ { kind: 'cast_self', spellId: 18430, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_sapphiron.cpp:150 CastSpell(SPELL_DRAGON_HOVER, TRIGGERED_OLD_TRIGGERED)' },
98
+ { kind: 'flavor', text: 'takes to the air!', cite: 'boss_sapphiron.cpp:148 HandleEmote(EMOTE_ONESHOT_LIFTOFF)' },
99
+ ],
100
+ cite: 'boss_sapphiron.cpp:89,199-211 AddCombatAction(SAPPHIRON_AIR_PHASE, 46s) -> :151 SetSpellList(SPELLSET_AIR 1598902)',
101
+ },
102
+ {
103
+ // 2000 initial + 5 x 3000 repeat = the SIXTH icebolt, which is the cast at which
104
+ // m_iceboltCount has reached 5. Cite: creature_spell_list 1598902:1 + :251.
105
+ id: 'frost_breath',
106
+ phase: 2,
107
+ afterMs: 17_000,
108
+ next: 'ground',
109
+ actions: [
110
+ { kind: 'cast_self', spellId: 28524, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_sapphiron.cpp:254 CastSpell(SPELL_FROST_BREATH); :52 triggers 29318 + 30132' },
111
+ { kind: 'cast_self', spellId: 30101, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_sapphiron.cpp:253,181 SPELL_FROST_BREATH_DUMMY' },
112
+ { kind: 'flavor', text: 'takes a deep breath...', cite: 'boss_sapphiron.cpp:255 DoBroadcastText(EMOTE_BREATH 7213)' },
113
+ ],
114
+ cite: 'boss_sapphiron.cpp:251-258 m_iceboltCount >= 5 -> Frost Breath then SetSpellList(SPELLSET_NULL 1598903)',
115
+ },
116
+ {
117
+ // 10 s from the breath to the landing emote (:257), then 2 s to the ground list (:158).
118
+ id: 'ground',
119
+ phase: 0,
120
+ afterMs: 12_000,
121
+ next: 'air',
122
+ actions: [
123
+ { kind: 'set_melee_enabled', enabled: true, cite: 'boss_sapphiron.cpp:167 SetMeleeEnabled(true)' },
124
+ { kind: 'cast_self', spellId: 29330, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_sapphiron.cpp:145 SPELL_DESPAWN_WING_BUFFET' },
125
+ { kind: 'remove_auras', spellId: 18430, cite: 'boss_sapphiron.cpp:169 RemoveAurasDueToSpell(SPELL_DRAGON_HOVER)' },
126
+ { kind: 'flavor', text: 'lands.', cite: 'boss_sapphiron.cpp:157 HandleEmote(EMOTE_ONESHOT_LAND)' },
127
+ ],
128
+ cite: 'boss_sapphiron.cpp:155-175 HandleLandingPhase -> HandleGroundPhase SetSpellList(SPELLSET_GROUND 1598901) + ResetCombatAction(AIR_PHASE, 46s)',
129
+ },
130
+ ],
131
+ lifecycle: lifecycleFor(TYPE.SAPPHIRON, 'boss_sapphiron.cpp:87'),
132
+ cites: [
133
+ 'boss_sapphiron.cpp:28-347 whole file',
134
+ 'creature_spell_list_entry 1598901 "Naxxramas - Sapphiron", 1598902 "… - Air Phase", 1598903 "… - NULL list" (live3310_classicmangos.sql)',
135
+ 'boss_sapphiron.cpp:201 air phase only while GetHealthPercent() > 10.f (timedPhases.air.hpMinPct)',
136
+ 'boss_sapphiron.cpp:238-279 Icebolt pick + 31800 immunity + 28535 Ice Block via the icebolt row',
137
+ 'boss_sapphiron.cpp:280-306 DespawnIceBlock 30132 strips 31800/28522 early - residual: 30132 has no mapped effects, so the 27 s immunity outlives the breath instead of being cut by it',
138
+ ],
139
+ };
140
+
141
+ // go_sapphiron_birth — GO 181356 'Sapphiron Birth' (gameobject_template.ScriptName)
142
+ export const GO_SAPPHIRON_BIRTH: ScriptDevIR = {
143
+ name: 'go_sapphiron_birth',
144
+ boundCreatures: [],
145
+ boundGos: [181356],
146
+ sourceFile: 'eastern_kingdoms/naxxramas/boss_sapphiron.cpp',
147
+ spellIds: [],
148
+ timers: [],
149
+ goUse: {
150
+ goEntries: [181356],
151
+ gates: [{ field: TYPE.SAPPHIRON, equals: INSTANCE_DATA.NOT_STARTED, cite: 'boss_sapphiron.cpp:225 GetData(TYPE_SAPPHIRON) != NOT_STARTED -> return' }],
152
+ actions: [{ kind: 'set_instance_data', field: TYPE.SAPPHIRON, value: INSTANCE_DATA.SPECIAL, cite: 'boss_sapphiron.cpp:233 SetData(TYPE_SAPPHIRON, SPECIAL)' }],
153
+ cite: 'boss_sapphiron.cpp:218-235 GOUse_go_sapphiron_birth; :337 newScript->Name = "go_sapphiron_birth"',
154
+ },
155
+ cites: [
156
+ 'gameobject_template 181356 "Sapphiron Birth" ScriptName go_sapphiron_birth (live3310_classicmangos.sql)',
157
+ 'boss_sapphiron.cpp:229 GetSingleCreatureFromStorage safety check has no IR equivalent - harmless, it only guards a double summon',
158
+ ],
159
+ };
160
+
161
+ // boss_kelthuzad — phase 1 ramp
162
+
163
+ // boss_kelthuzad.cpp:107-131 — [first tick, summon-rate aura, aura period ms, adds this segment].
164
+ // Periods and per-segment counts are the source's own annotations, summing to 14 / 14 / 120.
165
+ type KtSeg = readonly [tick: number, auraSpellId: number, periodMs: number, count: number];
166
+
167
+ const KT_TIMELINES: ReadonlyArray<{
168
+ key: string; entry: number; segs: readonly KtSeg[]; cite: string;
169
+ }> = [
170
+ {
171
+ key: 'soul_weaver',
172
+ entry: NPC.SOUL_WEAVER,
173
+ segs: [
174
+ [1, 29399, 40_000, 1], [42, 29401, 20_000, 1], [63, 28427, 30_000, 3],
175
+ [154, 29412, 15_000, 9], [290, 0, 0, 0],
176
+ ],
177
+ cite: 'boss_kelthuzad.cpp:107-113 soulWeaverSpellsTimers (total 14)',
178
+ },
179
+ {
180
+ key: 'abomination',
181
+ entry: NPC.UNSTOPPABLE_ABOM,
182
+ segs: [
183
+ [15, 28426, 30_000, 2], [76, 29393, 25_000, 2], [127, 29394, 20_000, 5],
184
+ [228, 29398, 15_000, 3], [259, 29411, 10_000, 2], [291, 0, 0, 0],
185
+ ],
186
+ cite: 'boss_kelthuzad.cpp:115-122 unstoppableAbominationSpellsTimers (total 14)',
187
+ },
188
+ {
189
+ key: 'soldier',
190
+ entry: NPC.SOLDIER_FROZEN,
191
+ segs: [
192
+ [7, 29410, 5000, 13], [73, 29391, 4000, 15], [134, 28425, 3000, 18],
193
+ [189, 29392, 2000, 27], [244, 29409, 1000, 47], [292, 0, 0, 0],
194
+ ],
195
+ cite: 'boss_kelthuzad.cpp:124-131 soldierFrozenWasteSpellsTimers (total 120)',
196
+ },
197
+ ];
198
+
199
+ /** GetCreatures("KEL_THUZAD_WORLD_TRIGGERS_ADDS") — string_id 5330001, 8 creature_spawn_data rows. */
200
+ const KT_ALCOVE_TRIGGERS = 8;
201
+
202
+ /** boss_kelthuzad.cpp:213-221 — SummonIntroCreatures(entry, count) spawns count PER trigger. */
203
+ const KT_INTRO_BURSTS: Record<number, { entry: number; per: number; cite: string }> = {
204
+ 4: { entry: NPC.SOLDIER_FROZEN, per: 9, cite: 'boss_kelthuzad.cpp:213-215 tick 4 SummonIntroCreatures(NPC_SOLDIER_FROZEN, 9)' },
205
+ 9: { entry: NPC.UNSTOPPABLE_ABOM, per: 3, cite: 'boss_kelthuzad.cpp:216-218 tick 9 SummonIntroCreatures(NPC_UNSTOPPABLE_ABOM, 3)' },
206
+ 12: { entry: NPC.SOUL_WEAVER, per: 1, cite: 'boss_kelthuzad.cpp:219-221 tick 12 SummonIntroCreatures(NPC_SOUL_WEAVER, 1)' },
207
+ };
208
+
209
+ const KT_TICK_DESPAWN = 310;
210
+ const KT_TICK_PHASE_TWO = 325;
211
+
212
+ const KT_BOUNDARY_TICKS: readonly number[] = [
213
+ ...new Set([
214
+ ...KT_TIMELINES.flatMap((tl) => tl.segs.map((s) => s[0])),
215
+ ...Object.keys(KT_INTRO_BURSTS).map(Number),
216
+ KT_TICK_DESPAWN, KT_TICK_PHASE_TWO,
217
+ ]),
218
+ ].sort((a, b) => a - b);
219
+
220
+ /** Runtime phase for the segment starting at boundary index i; phase 0 is the pre-ramp second. */
221
+ const ktPhaseFor = (i: number) => i + 1;
222
+
223
+ const KT_PHASE_ONE: ScriptDevTimedPhase[] = KT_BOUNDARY_TICKS.map((tick, i) => {
224
+ const actions: ScriptDevAction[] = [];
225
+ const burst = KT_INTRO_BURSTS[tick];
226
+ if (burst) {
227
+ actions.push({
228
+ kind: 'summon_count',
229
+ creatureEntry: burst.entry,
230
+ count: burst.per * KT_ALCOVE_TRIGGERS,
231
+ cite: `${burst.cite} x ${KT_ALCOVE_TRIGGERS} triggers (:330 GetCreatures("KEL_THUZAD_WORLD_TRIGGERS_ADDS"))`,
232
+ });
233
+ }
234
+ if (tick === KT_TICK_DESPAWN) {
235
+ actions.push({ kind: 'yell', textId: 12995, cite: 'boss_kelthuzad.cpp:222-230 MAX_SUMMON_TICKS -> urand SAY_AGGRO1/2/3' });
236
+ }
237
+ if (tick === KT_TICK_PHASE_TWO) {
238
+ actions.push({ kind: 'clear_unattackable', cite: 'boss_kelthuzad.cpp:368-372 RemoveFlag(IMMUNE_TO_PLAYER|UNINTERACTIBLE) + SetInCombatWithZone + MoveChase' });
239
+ actions.push({ kind: 'flavor', text: 'stops channelling and turns on the raid!', cite: 'boss_kelthuzad.cpp:231-232,364-375 StartPhase2 RemoveFlag + SetInCombatWithZone + MoveChase' });
240
+ }
241
+ const next = KT_BOUNDARY_TICKS[i + 1];
242
+ return {
243
+ id: `tick${tick}`,
244
+ phase: ktPhaseFor(i),
245
+ afterMs: (tick - (i === 0 ? 0 : KT_BOUNDARY_TICKS[i - 1])) * 1000,
246
+ ...(next != null ? { next: `tick${next}` } : {}),
247
+ actions,
248
+ cite: `boss_kelthuzad.cpp:207-241 m_summonTicks == ${tick} (1 s per 29422 tick)`,
249
+ };
250
+ });
251
+
252
+ // One wave per (add type, segment) — a plain periodic summoner at the aura's period, whose `waveCount` is
253
+ // the segment's own documented add count so it never wraps inside the phase.
254
+ const KT_SUMMON_WAVES: ScriptDevSummonWave[] = KT_TIMELINES.flatMap((tl) =>
255
+ KT_BOUNDARY_TICKS.flatMap((tick, i) => {
256
+ const seg = [...tl.segs].reverse().find((s) => s[0] <= tick);
257
+ if (!seg || seg[1] === 0) return [];
258
+ const period = seg[2];
259
+ return [{
260
+ id: `${tl.key}_t${tick}`,
261
+ creatureEntry: tl.entry,
262
+ perTick: 1,
263
+ armDelayMs: period,
264
+ firstTickMinMs: period,
265
+ firstTickMaxMs: period,
266
+ tickMinMs: period,
267
+ tickMaxMs: period,
268
+ firstWaveCount: seg[3],
269
+ waveMinCount: seg[3],
270
+ waveMaxCount: seg[3],
271
+ gapBaseMs: 0,
272
+ gapPerSummonFirstMs: 0,
273
+ gapPerSummonMs: 0,
274
+ phase: ktPhaseFor(i),
275
+ cite: `${tl.cite}; aura ${seg[1]} every ${period / 1000}s from tick ${seg[0]} (boss_kelthuzad.cpp:61-77)`,
276
+ }];
277
+ }),
278
+ );
279
+
280
+ /** 55 s of spawns at one every 10 s. Cite: boss_kelthuzad.cpp:98 + :431 ResetTimer(STOP_GUARDIAN_SPAWNS, 55s). */
281
+ const KT_GUARDIAN_COUNT = 5;
282
+
283
+ export const BOSS_KELTHUZAD: ScriptDevIR = {
284
+ name: 'boss_kelthuzad',
285
+ boundCreatures: [NPC.KELTHUZAD],
286
+ sourceFile: 'eastern_kingdoms/naxxramas/boss_kelthuzad.cpp',
287
+ spellIds: [
288
+ 29423, 29422, 28421, 28422, 28423, 28415, 28416, 28417,
289
+ 28478, 28479, 27819, 27820, 27810, 27808, 29879, 28408, 28409, 28410,
290
+ 28453, 28454, 28455, 29898, 29910,
291
+ ],
292
+ // Deliberately empty: all six rows of 1599001 are his phase-2 kit, the bake already has
293
+ // them, and `phases` alone still returns a plan — so the list arms and the phases run.
294
+ timers: [],
295
+ timedPhases: KT_PHASE_ONE,
296
+ oocClock: true,
297
+ summonWaves: KT_SUMMON_WAVES,
298
+ phases: [
299
+ {
300
+ // Above every ramp phase so a boundary crossing cannot re-enter it; nothing is gated
301
+ // on it staying set, because its entire payload fires here once.
302
+ phase: 30,
303
+ hpBelowPct: 40,
304
+ actions: [
305
+ { kind: 'yell', textId: 12998, cite: 'boss_kelthuzad.cpp:443 DoScriptText(SAY_REQUEST_AID)' },
306
+ { kind: 'yell', textId: 12994, cite: 'boss_kelthuzad.cpp:424-425 SAY_ANSWER_REQUEST on NPC_THE_LICHKING 16980' },
307
+ { kind: 'cast_self', spellId: 28453, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_kelthuzad.cpp:420 CastSpell(SPELL_SUMMON_PERIODIC_D, TRIGGERED_OLD_TRIGGERED)' },
308
+ { kind: 'cast_self', spellId: 29898, castFlags: CAST_FLAG.TRIGGERED, cite: 'boss_kelthuzad.cpp:422 CastSpell(SPELL_GUARDIAN_INIT, TRIGGERED_OLD_TRIGGERED)' },
309
+ { kind: 'summon_count', creatureEntry: NPC.GUARDIAN, count: KT_GUARDIAN_COUNT, cite: 'boss_kelthuzad.cpp:98,420,431 28453 summons one Guardian every 10s, stopped after 55s' },
310
+ ...GO_KELTHUZAD_WINDOW.map((goEntry, n): ScriptDevAction => ({
311
+ kind: 'open_door', goEntry, cite: `boss_kelthuzad.cpp:${427 + n} DoUseDoorOrButton(GO_KELTHUZAD_WINDOW_${n + 1}); naxxramas.h:${157 + n}`,
312
+ })),
313
+ ],
314
+ cite: 'boss_kelthuzad.cpp:163,438-446 AddTimerlessCombatAction(KELTHUZAD_PHASE_GUARDIANS) GetHealthPercent() < 40.0f',
315
+ },
316
+ ],
317
+ lifecycle: {
318
+ onReset: [
319
+ { kind: 'set_unattackable', cite: 'boss_kelthuzad.cpp:181-182 UNIT_FLAG_IMMUNE_TO_PLAYER|UNINTERACTIBLE + SetMeleeEnabled(false)' },
320
+ { kind: 'set_melee_enabled', enabled: false, cite: 'boss_kelthuzad.cpp:182 SetMeleeEnabled(false)' },
321
+ ],
322
+ onAggro: [
323
+ { kind: 'set_instance_data', field: TYPE.KELTHUZAD, value: INSTANCE_DATA.IN_PROGRESS, cite: 'boss_kelthuzad.cpp:158 SetDataType(TYPE_KELTHUZAD); BossAI.cpp:75' },
324
+ { kind: 'yell', textId: 12999, cite: 'boss_kelthuzad.cpp:203-206 SpellHit(SPELL_CHANNEL_VISUAL) -> SAY_SUMMON_MINIONS' },
325
+ ],
326
+ onDeath: [
327
+ { kind: 'set_instance_data', field: TYPE.KELTHUZAD, value: INSTANCE_DATA.DONE, cite: 'boss_kelthuzad.cpp:158 SetDataType(TYPE_KELTHUZAD); BossAI.cpp:49' },
328
+ { kind: 'yell', textId: 13019, cite: 'boss_kelthuzad.cpp:160 AddOnDeathText(SAY_DEATH)' },
329
+ ],
330
+ onEvade: [
331
+ { kind: 'set_instance_data', field: TYPE.KELTHUZAD, value: INSTANCE_DATA.FAIL, cite: 'boss_kelthuzad.cpp:158 SetDataType(TYPE_KELTHUZAD); BossAI.cpp:59,94' },
332
+ ],
333
+ },
334
+ cites: [
335
+ 'boss_kelthuzad.cpp:30-654 whole file',
336
+ 'creature_spell_list_entry 1599001 "Naxxramas - KelThuzad" - 6 rows kept on the bake',
337
+ 'boss_kelthuzad.cpp:79-80 MAX_SUMMON_TICKS 310 / MAX_CHANNEL_TICKS 325 (1 tick = 1 s)',
338
+ 'boss_kelthuzad.cpp:159,411-414 AddOnKillText + OnSpellCast chain/frost-blast/mana lines - no per-cast yell hook',
339
+ ],
340
+ };
341
+
342
+ // npc_icecrown_guardian — registered by boss_kelthuzad.cpp:644-647
343
+ export const NPC_ICECROWN_GUARDIAN: ScriptDevIR = {
344
+ name: 'npc_icecrown_guardian',
345
+ boundCreatures: [NPC.GUARDIAN],
346
+ sourceFile: 'eastern_kingdoms/naxxramas/boss_kelthuzad.cpp',
347
+ spellIds: [29897, 29899, 28470],
348
+ timers: [
349
+ t('guardian_passive', 29897, 0, 0, 0, 0, 'self', 'boss_kelthuzad.cpp:480 Reset DoCastSpellIfCan(SPELL_GUARDIAN_PASSIVE, CAST_AURA_NOT_PRESENT)', { onReset: true }),
350
+ // Blood Tap is a stack per NEW tank, not a timer: the 2 s poll compares the current victim with
351
+ // the one stored at the last poll and only casts when it moved.
352
+ t('guardian_blood_tap_poll', 28470, 2000, 2000, 2000, 2000, 'self', 'boss_kelthuzad.cpp:501-521 m_checkCurrentVictimTimer 2 s, m_victimGuid != GetVictim() -> SPELL_BLOOD_TAP', {
353
+ pollOnly: true,
354
+ actions: [{
355
+ kind: 'cast_on_victim_change',
356
+ spellId: 28470,
357
+ cite: 'boss_kelthuzad.cpp:512-517 DoCastSpellIfCan(m_creature->GetVictim(), SPELL_BLOOD_TAP)',
358
+ }],
359
+ }),
360
+ ],
361
+ lifecycle: {
362
+ onKill: [{
363
+ kind: 'cast_on_victim_change',
364
+ spellId: 28470,
365
+ cite: 'boss_kelthuzad.cpp:495-498 KilledUnit -> DoCastSpellIfCan(GetVictim(), SPELL_BLOOD_TAP)',
366
+ }],
367
+ },
368
+ cites: [
369
+ 'boss_kelthuzad.cpp:463-524 npc_icecrown_guardianAI; :645 newScript->Name = "npc_icecrown_guardian"',
370
+ 'boss_kelthuzad.cpp:495-523 Blood Tap 28470 on kill and on every victim change, via cast_on_victim_change',
371
+ 'creature_template 16441 Guardian of Icecrown IS in src/data/tables/creatures.json - the unusedBindings row that said otherwise was wrong and is deleted',
372
+ 'boss_kelthuzad.cpp:483-493 JustReachedHome ForcedDespawn / EnterEvadeMode aura strip - no home-reached hook',
373
+ ],
374
+ };
375
+
376
+ export const NAXXRAMAS_FROSTWYRM_IRS: readonly ScriptDevIR[] = [
377
+ BOSS_SAPPHIRON, GO_SAPPHIRON_BIRTH, BOSS_KELTHUZAD, NPC_ICECROWN_GUARDIAN,
378
+ ];
@@ -0,0 +1,276 @@
1
+ // Naxxramas Military Quarter — the ScriptDevAI IR port of Razuvious, Gothik and the Four Horsemen
2
+ // as ONE IR across four creatures. Cadence is creature_spell_list rows; the C++ is cited per timer.
3
+
4
+ import type { ScriptDevIR, ScriptDevTimer } from './types.ts';
5
+ import { INSTANCE_DATA } from './types.ts';
6
+ import { CAST_FLAG } from '../creature/creatureAi.ts';
7
+
8
+ // naxxramas.h:61-63
9
+ const TYPE = { RAZUVIOUS: 6, GOTHIK: 7, FOUR_HORSEMEN: 8 } as const;
10
+
11
+ // naxxramas.h:88-91,105; Razuvious is not in the header — creature_template.entry 16061 with
12
+ // ScriptName 'boss_razuvious' (and his SPELLSET id 1606101 carries the entry as its prefix).
13
+ const NPC = {
14
+ RAZUVIOUS: 16061, GOTHIK: 16060,
15
+ MOGRAINE: 16062, ZELIEK: 16063, KORTHAZZ: 16064, BLAUMEUX: 16065,
16
+ UNREL_TRAINEE: 16124, UNREL_DEATH_KNIGHT: 16125, UNREL_RIDER: 16126,
17
+ SPECT_TRAINEE: 16127, SPECT_DEATH_KNIGHT: 16148, SPECT_HORSE: 16149, SPECT_RIDER: 16150,
18
+ } as const;
19
+ const GOTHIK_ADDS = [
20
+ NPC.UNREL_TRAINEE, NPC.UNREL_DEATH_KNIGHT, NPC.UNREL_RIDER,
21
+ NPC.SPECT_TRAINEE, NPC.SPECT_DEATH_KNIGHT, NPC.SPECT_HORSE, NPC.SPECT_RIDER,
22
+ ] as const;
23
+
24
+ /** BossAI::SetDataType — Aggro IN_PROGRESS, JustDied DONE, evade/home FAIL. Cite: BossAI.cpp:41-98. */
25
+ function lifecycleFor(field: number, file: string) {
26
+ return {
27
+ onAggro: [{ kind: 'set_instance_data' as const, field, value: INSTANCE_DATA.IN_PROGRESS, cite: `${file} SetDataType; BossAI.cpp:75 Aggro SetData(IN_PROGRESS)` }],
28
+ onDeath: [{ kind: 'set_instance_data' as const, field, value: INSTANCE_DATA.DONE, cite: `${file} SetDataType; BossAI.cpp:49 JustDied SetData(DONE)` }],
29
+ onEvade: [{ kind: 'set_instance_data' as const, field, value: INSTANCE_DATA.FAIL, cite: `${file} SetDataType; BossAI.cpp:59,94 SetData(FAIL)` }],
30
+ };
31
+ }
32
+
33
+ // `creature_spell_list.TargetId` → IR target mode: 0 NONE (self-cast), 1 CURRENT (victim), 100
34
+ // attack-random-player. Cite: CreatureSpellList.h:34-43; creature_spell_targeting rows 0,1,100.
35
+ const t = (
36
+ id: string, spellId: number, iMin: number, iMax: number, rMin: number, rMax: number,
37
+ target: ScriptDevTimer['target'], cite: string, extra: Partial<ScriptDevTimer> = {},
38
+ ): ScriptDevTimer => ({
39
+ id, spellId, initialMinMs: iMin, initialMaxMs: iMax, repeatMinMs: rMin, repeatMaxMs: rMax,
40
+ target, cite, ...extra,
41
+ });
42
+
43
+ // boss_razuvious
44
+ export const BOSS_RAZUVIOUS: ScriptDevIR = {
45
+ name: 'boss_razuvious',
46
+ boundCreatures: [NPC.RAZUVIOUS],
47
+ sourceFile: 'eastern_kingdoms/naxxramas/boss_razuvious.cpp',
48
+ spellIds: [26613, 29107, 29125],
49
+ // boss_razuviousAI declares RAZUVIOUS_ACTION_MAX with no actions: the spell list IS his kit.
50
+ timers: [
51
+ t('unbalancing_strike', 26613, 30_000, 30_000, 30_000, 30_000, 'victim', 'creature_spell_list 1606101:1 Razuvious - Unbalancing Strike (TargetId 1 = Current)'),
52
+ t('disrupting_shout', 29107, 25_000, 25_000, 25_000, 25_000, 'self', 'creature_spell_list 1606101:2 Razuvious - Disrupting Shout (TargetId 0 = None)'),
53
+ ],
54
+ spellHits: [{
55
+ spellId: 29060,
56
+ actions: [{
57
+ kind: 'yell',
58
+ textIds: [13077, 13072, 13073, 13074],
59
+ cite: 'boss_razuvious.cpp:35-38,70-83 SpellHit SPELL_TAUNT 29060 urand(0,3) over SAY_UNDERSTUDY_TAUNT_1-4 13077/13072/13073/13074',
60
+ }],
61
+ cite: 'boss_razuvious.cpp:70-83 SpellHit SPELL_TAUNT',
62
+ }],
63
+ leashZGt: 285,
64
+ lifecycle: (() => {
65
+ const life = lifecycleFor(TYPE.RAZUVIOUS, 'boss_razuvious.cpp:61');
66
+ return {
67
+ ...life,
68
+ onDeath: [
69
+ ...life.onDeath,
70
+ {
71
+ kind: 'cast_self' as const,
72
+ spellId: 29125,
73
+ castFlags: CAST_FLAG.TRIGGERED,
74
+ cite: 'boss_razuvious.cpp:104-108 JustDied SPELL_HOPELESS 29125 CAST_TRIGGERED',
75
+ },
76
+ ],
77
+ };
78
+ })(),
79
+ cites: [
80
+ 'boss_razuvious.cpp:28-117 whole file',
81
+ 'creature_spell_list_entry 1606101 "Naxxramas - Razuvious" (list starts at Position 1 - there is no row 0)',
82
+ 'boss_razuvious.cpp:49,60 SetLeashingCheck z > 285',
83
+ 'boss_razuvious.cpp:35-38,70-83 SpellHit 29060 urand(0,3) over SAY_UNDERSTUDY_TAUNT_1-4 13077/13072/13073/13074',
84
+ 'boss_razuvious.cpp:85-102 SpellHitTarget 29107 first mana player EMOTE_TRIUMPHANT_SHOOT 13082',
85
+ 'boss_razuvious.cpp:104-108 JustDied SPELL_HOPELESS 29125 CAST_TRIGGERED',
86
+ ],
87
+ };
88
+
89
+ // boss_gothik
90
+ export const BOSS_GOTHIK: ScriptDevIR = {
91
+ name: 'boss_gothik',
92
+ boundCreatures: [NPC.GOTHIK],
93
+ sourceFile: 'eastern_kingdoms/naxxramas/boss_gothik.cpp',
94
+ spellIds: [28679, 29317, 28025, 28026, 29230, 28035, 28007, 28009, 28011, 27884, 28008, 28010],
95
+ timers: [
96
+ t('harvest_soul', 28679, 2500, 2500, 15_000, 15_000, 'self', 'creature_spell_list 1606001:0 Gothik - Harvest Soul (TargetId 0 = None)', { startDisabled: true }),
97
+ t('shadowbolt', 29317, 2500, 2500, 1000, 1000, 'victim', 'creature_spell_list 1606001:1 Gothik - Shadowbolt (TargetId 1 = Current)', { startDisabled: true }),
98
+ t('teleport', 28026, 20_000, 20_000, 20_000, 20_000, 'self', 'boss_gothik.cpp:157,294 ResetCombatAction(GOTHIK_TELEPORT, 20s); :313-322 LEFT/RIGHT by side; :305 m_teleportCount >= 4 || HP<=30', { hpPctMin: 30, maxFires: 4, startDisabled: true }),
99
+ t('summon_trainee', 28007, 4000, 4000, 0, 0, 'self', 'boss_gothik.cpp:176,243-246 GOTHIK_SUMMON_TRAINEE 4s SPELL_SUMMON_TRAINEE_PERIODIC 28007', { oneShot: true }),
100
+ t('summon_death_knight', 28009, 49_000, 49_000, 0, 0, 'self', 'boss_gothik.cpp:177,248-251 GOTHIK_SUMMON_DEATH_KNIGHT 49s SPELL_SUMMON_KNIGHT_PERIODIC 28009', { oneShot: true }),
101
+ t('summon_rider', 28011, 104_000, 104_000, 0, 0, 'self', 'boss_gothik.cpp:178,253-256 GOTHIK_SUMMON_RIDER 104s SPELL_SUMMON_MOUNTED_KNIGHT_PERIODIC 28011', { oneShot: true }),
102
+ t('speech_1', 29230, 1000, 1000, 0, 0, 'self', 'boss_gothik.cpp:174,97 SAY_SPEECH_1 13030 at 1s', {
103
+ pollOnly: true, oneShot: true,
104
+ actions: [{ kind: 'yell', textId: 13030, cite: 'boss_gothik.cpp:97 DoBroadcastText(SAY_SPEECH_1 13030)' }],
105
+ }),
106
+ t('speech_2', 29230, 5000, 5000, 0, 0, 'self', 'boss_gothik.cpp:98 SAY_SPEECH_2 13031 +4s', {
107
+ pollOnly: true, oneShot: true,
108
+ actions: [{ kind: 'yell', textId: 13031, cite: 'boss_gothik.cpp:98 DoBroadcastText(SAY_SPEECH_2 13031)' }],
109
+ }),
110
+ t('speech_3', 29230, 11_000, 11_000, 0, 0, 'self', 'boss_gothik.cpp:99 SAY_SPEECH_3 13032 +6s', {
111
+ pollOnly: true, oneShot: true,
112
+ actions: [{ kind: 'yell', textId: 13032, cite: 'boss_gothik.cpp:99 DoBroadcastText(SAY_SPEECH_3 13032)' }],
113
+ }),
114
+ t('speech_4', 29230, 16_000, 16_000, 0, 0, 'self', 'boss_gothik.cpp:100-104 SAY_SPEECH_4 13033 +5s PHASE_BALCONY', {
115
+ pollOnly: true, oneShot: true,
116
+ actions: [{ kind: 'yell', textId: 13033, cite: 'boss_gothik.cpp:102 DoBroadcastText(SAY_SPEECH_4 13033)' }],
117
+ }),
118
+ t('ground_phase', 28025, 274_000, 274_000, 0, 0, 'self', 'boss_gothik.cpp:179,139-158 GOTHIK_GROUND_PHASE 4min+34s SPELL_TELEPORT_RIGHT 28025', {
119
+ oneShot: true,
120
+ actions: [
121
+ { kind: 'remove_auras', spellId: 29230, cite: 'boss_gothik.cpp:147 RemoveAurasDueToSpell(SPELL_IMMUNE_ALL 29230)' },
122
+ { kind: 'yell', textId: 13028, cite: 'boss_gothik.cpp:144 DoBroadcastText(SAY_TELEPORT 13028)' },
123
+ { kind: 'arm_timer', timerId: 'teleport', delayMs: 20_000, cite: 'boss_gothik.cpp:157 ResetCombatAction(GOTHIK_TELEPORT, 20s)' },
124
+ { kind: 'arm_timer', timerId: 'harvest_soul', delayMs: 2500, cite: 'boss_gothik.cpp:158 AddInitialCooldowns list 1606001:0' },
125
+ { kind: 'arm_timer', timerId: 'shadowbolt', delayMs: 2500, cite: 'boss_gothik.cpp:158 AddInitialCooldowns list 1606001:1' },
126
+ { kind: 'set_instance_data', field: TYPE.GOTHIK, value: INSTANCE_DATA.SPECIAL, cite: 'boss_gothik.cpp:191 ProcessCentralDoor SetData(TYPE_GOTHIK, SPECIAL)' },
127
+ { kind: 'open_door', goEntry: 181170, cite: 'naxxramas.h:142 GO_MILI_GOTH_COMBAT_GATE 181170; naxxramas.cpp:499 SPECIAL DoUseDoorOrButton' },
128
+ {
129
+ kind: 'adds_threat_players',
130
+ creatureEntries: [...GOTHIK_ADDS],
131
+ cite: 'boss_gothik.cpp:261-287 HandleOpenGates AddThreat / AttackClosestEnemy',
132
+ },
133
+ ],
134
+ }),
135
+ ],
136
+ lifecycle: (() => {
137
+ const life = lifecycleFor(TYPE.GOTHIK, 'boss_gothik.cpp:84');
138
+ return {
139
+ ...life,
140
+ onAggro: [
141
+ ...life.onAggro,
142
+ {
143
+ kind: 'cast_self' as const,
144
+ spellId: 29230,
145
+ castFlags: CAST_FLAG.TRIGGERED,
146
+ cite: 'boss_gothik.cpp:169-171 DoCastSpellIfCan SPELL_IMMUNE_ALL 29230 CAST_TRIGGERED',
147
+ },
148
+ ],
149
+ justSummoned: [{
150
+ kind: 'attack_summoner' as const,
151
+ cite: 'boss_gothik.cpp:223-228 JustSummoned SetInCombatWithZone',
152
+ }],
153
+ onEvade: [
154
+ ...life.onEvade,
155
+ {
156
+ kind: 'cast_self' as const,
157
+ spellId: 28035,
158
+ castFlags: CAST_FLAG.TRIGGERED,
159
+ cite: 'boss_gothik.cpp:217 DoCastSpellIfCan SPELL_RESET_GOTHIK_EVENT 28035 CAST_TRIGGERED',
160
+ },
161
+ { kind: 'remove_auras' as const, spellId: 28007, cite: 'boss_gothik.cpp:509 RemoveAurasDueToSpell SPELL_SUMMON_TRAINEE_PERIODIC 28007' },
162
+ { kind: 'remove_auras' as const, spellId: 28009, cite: 'boss_gothik.cpp:510 RemoveAurasDueToSpell SPELL_SUMMON_KNIGHT_PERIODIC 28009' },
163
+ { kind: 'remove_auras' as const, spellId: 28011, cite: 'boss_gothik.cpp:511 RemoveAurasDueToSpell SPELL_SUMMON_MOUNTED_KNIGHT_PERIODIC 28011' },
164
+ ],
165
+ };
166
+ })(),
167
+ cites: [
168
+ 'boss_gothik.cpp:30-552 whole file',
169
+ 'creature_spell_list_entry 1606001 "Naxxramas - Gothik"',
170
+ 'boss_gothik.cpp:305,316-318 maxFires 4 + hpPctMin 30 (m_teleportCount >= 4 || HP<=30)',
171
+ 'boss_gothik.cpp:161-180,243-256 Aggro 29230 + speech 13030-33 + 28007/28009/28011 + 4min34s 28025',
172
+ 'boss_gothik.cpp:139-159 HandleGroundPhase 28025 + AddInitialCooldowns (kit startDisabled until 4m34s)',
173
+ 'boss_gothik.cpp:182-193,258-288 ProcessCentralDoor SPECIAL + GO 181170 + adds_threat_players',
174
+ 'boss_gothik.cpp:214-221,501-512 EnterEvadeMode 28035 strips 28007/28009/28011',
175
+ 'boss_gothik.cpp:516-535 Shadowbolt 50% second bolt at a random player (scriptValue 1)',
176
+ ],
177
+ };
178
+
179
+ // boss_four_horsemen — ONE IR over four creatures and four upstream script names. Every timer
180
+ // carries creatureEntry so scriptDevCastPlanForEntry hands each Horseman only his own two lists.
181
+
182
+ /** creature_spell_list row for one Horseman — entry-tagged so it arms for him alone. */
183
+ const h = (
184
+ entry: number, id: string, spellId: number, iMin: number, iMax: number, rMin: number, rMax: number,
185
+ target: ScriptDevTimer['target'], cite: string, phase: number,
186
+ ): ScriptDevTimer => t(id, spellId, iMin, iMax, rMin, rMax, target, cite, { creatureEntry: entry, phase });
187
+
188
+ export const BOSS_FOUR_HORSEMEN: ScriptDevIR = {
189
+ name: 'boss_four_horsemen',
190
+ boundCreatures: [NPC.MOGRAINE, NPC.ZELIEK, NPC.KORTHAZZ, NPC.BLAUMEUX],
191
+ sourceFile: 'eastern_kingdoms/naxxramas/boss_four_horsemen.cpp',
192
+ // Only the spells ALL FOUR cast: spellIds is not filtered by creatureEntry, so a union here
193
+ // would hand Mograine a Void Zone he can never arm.
194
+ spellIds: [29061, 26662, 28836],
195
+ timers: [
196
+ // Shared: timerless Shield Wall at 50% then 20% (action names SHIELD_WALL_50/_20).
197
+ t('shield_wall_50', 29061, 0, 0, 0, 0, 'self', 'boss_four_horsemen.cpp:133-134,161-168 AddTimerlessCombatAction(SHIELD_WALL_50) SPELL_SHIELDWALL then DisableCombatAction; vanilla 50%/20% HP gates (action names)', { hpPctMax: 50, oneShot: true }),
198
+ t('shield_wall_20', 29061, 0, 0, 0, 0, 'self', 'boss_four_horsemen.cpp:133-134,161-168 AddTimerlessCombatAction(SHIELD_WALL_20) SPELL_SHIELDWALL then DisableCombatAction', { hpPctMax: 20, oneShot: true }),
199
+ t('blaumeux_special', 29061, 5000, 120_000, 5000, 120_000, 'self', 'boss_four_horsemen.cpp:131 AddCombatAction(BLAUMEUX_SPECIAL, 5s, 120s); :169-174 DoBroadcastText(SAY_BLAU_SPECIAL 13013)', { creatureEntry: NPC.BLAUMEUX, pollOnly: true, actions: [{ kind: 'yell', textId: 13013, cite: 'boss_four_horsemen.cpp:171 DoBroadcastText(SAY_BLAU_SPECIAL)' }] }),
200
+ t('mograine_special', 29061, 5000, 120_000, 5000, 120_000, 'self', 'boss_four_horsemen.cpp:200 AddCombatAction(MOGRAINE_SPECIAL, 5s, 120s); DoBroadcastText(SAY_MORG_SPECIAL 13057)', { creatureEntry: NPC.MOGRAINE, pollOnly: true, actions: [{ kind: 'yell', textId: 13057, cite: 'boss_four_horsemen.cpp SAY_MORG_SPECIAL 13057' }] }),
201
+ t('korthazz_special', 29061, 5000, 120_000, 5000, 120_000, 'self', 'boss_four_horsemen.cpp:267 AddCombatAction(KORT_SPECIAL, 5s, 120s); DoBroadcastText(SAY_KORT_SPECIAL 13037)', { creatureEntry: NPC.KORTHAZZ, pollOnly: true, actions: [{ kind: 'yell', textId: 13037, cite: 'boss_four_horsemen.cpp SAY_KORT_SPECIAL 13037' }] }),
202
+ t('zeliek_special', 29061, 5000, 120_000, 5000, 120_000, 'self', 'boss_four_horsemen.cpp:334 AddCombatAction(ZELIEK_SPECIAL, 5s, 120s); :372 DoBroadcastText(SAY_ZELI_SPECIAL 13100)', { creatureEntry: NPC.ZELIEK, pollOnly: true, actions: [{ kind: 'yell', textId: 13100, cite: 'boss_four_horsemen.cpp:372 DoBroadcastText(SAY_ZELI_SPECIAL)' }] }),
203
+
204
+ // ---- PHASE 0: the baked lists ----
205
+ h(NPC.MOGRAINE, 'mograine_mark', 28834, 20_000, 20_000, 12_000, 12_000, 'self', 'creature_spell_list 1606201:0 Highlord Mograine - Mark of Mograine (TargetId 0 = None)', 0),
206
+ h(NPC.MOGRAINE, 'mograine_righteous_fire', 28882, 15_000, 15_000, 15_000, 15_000, 'victim', 'creature_spell_list 1606201:1 Highlord Mograine - Righteous Fire (TargetId 1 = Current)', 0),
207
+ h(NPC.MOGRAINE, 'mograine_berserk', 26662, 2_000_000, 2_000_000, 300_000, 300_000, 'self', 'creature_spell_list 1606201:2 Highlord Mograine - Berserk', 0),
208
+
209
+ h(NPC.ZELIEK, 'zeliek_mark', 28835, 20_000, 20_000, 12_000, 12_000, 'self', 'creature_spell_list 1606301:0 Sir Zeliek - Mark of Zeliek (TargetId 0 = None)', 0),
210
+ h(NPC.ZELIEK, 'zeliek_holy_wrath', 28883, 12_000, 12_000, 15_000, 15_000, 'hostile_random_player', 'creature_spell_list 1606301:1 Sir Zeliek - Holy Wrath (TargetId 100 = Attack - random player)', 0),
211
+ h(NPC.ZELIEK, 'zeliek_berserk', 26662, 2_000_000, 2_000_000, 300_000, 300_000, 'self', 'creature_spell_list 1606301:2 Sir Zeliek - Berserk', 0),
212
+
213
+ h(NPC.KORTHAZZ, 'korthazz_mark', 28832, 20_000, 20_000, 12_000, 12_000, 'self', 'creature_spell_list 1606401:0 Thane Korthazz - Mark of Korthazz (TargetId 0 = None)', 0),
214
+ h(NPC.KORTHAZZ, 'korthazz_meteor', 28884, 20_000, 20_000, 20_000, 20_000, 'victim', 'creature_spell_list 1606401:1 Thane Korthazz - Meteor (TargetId 1 = Current)', 0),
215
+ h(NPC.KORTHAZZ, 'korthazz_berserk', 26662, 2_000_000, 2_000_000, 300_000, 300_000, 'self', 'creature_spell_list 1606401:2 Thane Korthazz - Berserk', 0),
216
+
217
+ h(NPC.BLAUMEUX, 'blaumeux_mark', 28833, 20_000, 20_000, 12_000, 12_000, 'self', 'creature_spell_list 1606501:0 Lady Blaumeux - Mark of Blaumeux (TargetId 0 = None)', 0),
218
+ h(NPC.BLAUMEUX, 'blaumeux_void_zone', 28863, 12_000, 12_000, 12_000, 12_000, 'hostile_random_player', 'creature_spell_list 1606501:1 Lady Blaumeux - Void Zone (TargetId 100 = Attack - random player)', 0),
219
+ h(NPC.BLAUMEUX, 'blaumeux_berserk', 26662, 2_000_000, 2_000_000, 300_000, 300_000, 'self', 'creature_spell_list 1606501:2 Lady Blaumeux - Berserk', 0),
220
+
221
+ // ---- PHASE 1: the `…02` enrage lists, absent from the bake. Marks go to 1 s and Berserk
222
+ // drops from a 2000 s initial to 0, which is the whole point of the swap.
223
+ h(NPC.MOGRAINE, 'mograine_mark_enrage', 28834, 0, 0, 1000, 1000, 'self', 'creature_spell_list 1606202:0 Highlord Mograine Enrage - Mark of Mograine', 1),
224
+ h(NPC.MOGRAINE, 'mograine_righteous_fire_enrage', 28882, 0, 0, 15_000, 15_000, 'victim', 'creature_spell_list 1606202:1 Highlord Mograine Enrage - Righteous Fire', 1),
225
+ h(NPC.MOGRAINE, 'mograine_berserk_enrage', 26662, 0, 0, 300_000, 300_000, 'self', 'creature_spell_list 1606202:2 Highlord Mograine Enrage - Berserk', 1),
226
+
227
+ h(NPC.ZELIEK, 'zeliek_mark_enrage', 28835, 0, 0, 1000, 1000, 'self', 'creature_spell_list 1606302:0 Sir Zeliek Enrage - Mark of Zeliek', 1),
228
+ h(NPC.ZELIEK, 'zeliek_holy_bolt_enrage', 57376, 0, 0, 2000, 3000, 'victim', 'creature_spell_list 1606302:1 Sir Zeliek Enrage - Holy Bolt (TargetId 1 = Current); 57376 is a 57xxx id absent from src/data/spell-data.json and from the 1.12.1 DBC range, so the row arms and resolves nothing', 1),
229
+ h(NPC.ZELIEK, 'zeliek_holy_wrath_enrage', 28883, 0, 0, 15_000, 15_000, 'hostile_random_player', 'creature_spell_list 1606302:2 Sir Zeliek Enrage - Holy Wrath', 1),
230
+ h(NPC.ZELIEK, 'zeliek_berserk_enrage', 26662, 0, 0, 300_000, 300_000, 'self', 'creature_spell_list 1606302:3 Sir Zeliek Enrage - Berserk', 1),
231
+ h(NPC.ZELIEK, 'zeliek_condemnation_enrage', 57377, 0, 0, 5000, 5000, 'self', 'creature_spell_list 1606302:4 Sir Zeliek Enrage - Condemnation; SOURCE-ABSENT, not unported: spell 57377 is not in src/data/spell-data.json (22374 rows) and combat_condition 925 is not in src/data/tables/combatConditions.json (0-410), and both come from the live3310 dump rather than 1.12.1', 1),
232
+
233
+ h(NPC.KORTHAZZ, 'korthazz_mark_enrage', 28832, 0, 0, 1000, 1000, 'self', 'creature_spell_list 1606402:0 Thane Korthazz Enrage - Mark of Korthazz', 1),
234
+ h(NPC.KORTHAZZ, 'korthazz_meteor_enrage', 28884, 0, 0, 20_000, 20_000, 'victim', 'creature_spell_list 1606402:1 Thane Korthazz Enrage - Meteor', 1),
235
+ h(NPC.KORTHAZZ, 'korthazz_berserk_enrage', 26662, 0, 0, 300_000, 300_000, 'self', 'creature_spell_list 1606402:2 Thane Korthazz Enrage - Berserk', 1),
236
+
237
+ h(NPC.BLAUMEUX, 'blaumeux_mark_enrage', 28833, 0, 0, 1000, 1000, 'self', 'creature_spell_list 1606502:0 Lady Blaumeux Enrage - Mark of Blaumeux', 1),
238
+ h(NPC.BLAUMEUX, 'blaumeux_void_zone_enrage', 28863, 0, 0, 15_000, 15_000, 'hostile_random_player', 'creature_spell_list 1606502:1 Lady Blaumeux Enrage - Void Zone', 1),
239
+ h(NPC.BLAUMEUX, 'blaumeux_berserk_enrage', 26662, 0, 0, 300_000, 300_000, 'self', 'creature_spell_list 1606502:2 Lady Blaumeux Enrage - Berserk', 1),
240
+ ],
241
+ timedPhases: [
242
+ {
243
+ id: 'enrage',
244
+ phase: 1,
245
+ afterMs: 1_200_000,
246
+ actions: [
247
+ { kind: 'flavor', text: 'grows enraged - the marks come faster!', cite: 'boss_four_horsemen.cpp:176 SetSpellList(SpellList + 1)' },
248
+ ],
249
+ cite: 'boss_four_horsemen.cpp:132,175-178 AddCombatAction(ENRAGE, 20min) -> SetSpellList(GetCreatureInfo()->SpellList + 1); same at :201,242-245 / :268,309-312 / :334,376-379',
250
+ },
251
+ ],
252
+ // No onDeath here: BossAI JustDied SetData(DONE) is instance_naxxramas encounters
253
+ // (all four entries) + applyHorsemenSetData. Wiring it here would double-count.
254
+ leashOrXy: [
255
+ { xGt: 2577.3, yLt: -3024.0 },
256
+ { xGt: 2585.9, yLt: -3015.1 },
257
+ { xGt: 2594.6, yLt: -3006.7 },
258
+ ],
259
+ lifecycle: {
260
+ onAggro: [{ kind: 'set_instance_data', field: TYPE.FOUR_HORSEMEN, value: INSTANCE_DATA.IN_PROGRESS, cite: 'boss_four_horsemen.cpp:127,196,263,330 SetDataType(TYPE_FOUR_HORSEMEN); BossAI.cpp:75' }],
261
+ onEvade: [{ kind: 'set_instance_data', field: TYPE.FOUR_HORSEMEN, value: INSTANCE_DATA.FAIL, cite: 'boss_four_horsemen.cpp:127,196,263,330 SetDataType(TYPE_FOUR_HORSEMEN); BossAI.cpp:59,94' }],
262
+ },
263
+ cites: [
264
+ 'boss_four_horsemen.cpp:30-436 whole file',
265
+ 'creature_spell_list_entry 1606201/1606301/1606401/1606501 + the enrage twins 1606202/1606302/1606402/1606502 (live3310_classicmangos.sql)',
266
+ 'creature_template 16062/16063/16064/16065 SpellList = 1606201/1606301/1606401/1606501, ScriptName = boss_alexandros_mograine/boss_sir_zeliek/boss_thane_korthazz/boss_lady_blaumeux',
267
+ 'boss_four_horsemen.cpp:89,99,388-411 MAX_MARK_STACKS 100 + HorsemenMark ladder via 28836',
268
+ 'boss_four_horsemen.cpp:107-112,135-140 three-corner leash (x>Xi && y<Yi)',
269
+ 'boss_four_horsemen.cpp:131,169-174 SPECIAL yell every 5-120s pollOnly',
270
+ 'naxxramas.cpp:527-553 m_horsemenKilled counter gates DONE at 4 (instance_naxxramas)',
271
+ ],
272
+ };
273
+
274
+ export const NAXXRAMAS_MILITARY_IRS: readonly ScriptDevIR[] = [
275
+ BOSS_RAZUVIOUS, BOSS_GOTHIK, BOSS_FOUR_HORSEMEN,
276
+ ];