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,1570 @@
1
+ // Dimension-C special-case spell ids from the CMaNGOS Spells sources: pure rule helpers and
2
+ // dispositions, with the combat wiring in the owning layer. Cite: census-spell-opcodes.mjs.
3
+
4
+ // ── Stage spell ids (every id is intentional — closes Dimension C) ──────────
5
+
6
+ /** Curse of Idiocy — PERIODIC_TRIGGER self-stack stop at −90 int/spirit. */
7
+ export const CURSE_OF_IDIOCY_SPELL_ID = 1010;
8
+ /** Banish Exile spells. Cite: item_scripts.cpp:114-141. */
9
+ export const BANISH_EXILE_BURNING_SPELL_ID = 4130;
10
+ export const BANISH_EXILE_CRESTING_SPELL_ID = 4131;
11
+ export const BANISH_EXILE_THUNDERING_SPELL_ID = 4132;
12
+ export const BANISH_EXILE_BURNING_ENTRY = 2760;
13
+ export const BANISH_EXILE_CRESTING_ENTRY = 2761;
14
+ export const BANISH_EXILE_THUNDERING_ENTRY = 2762;
15
+ // The script id on Improved Mend Pet's override-class-scripts aura. Baked spell 4086 is a creature
16
+ // Evasion; the C++ case is the SCRIPT id. Cite: UnitAuraProcHandler.cpp:1615-1623.
17
+ export const IMPROVED_MEND_PET_SCRIPT_RANK1 = 4086;
18
+ export const IMPROVED_MEND_PET_SCRIPT_RANK2 = 4087;
19
+ /** Improved Mend Pet talent ranks (aura 112). */
20
+ export const IMPROVED_MEND_PET_RANK1_SPELL_ID = 19572;
21
+ export const IMPROVED_MEND_PET_RANK2_SPELL_ID = 19573;
22
+ /** Triggered dispel on crit mend. Cite: UnitAuraProcHandler.cpp:1621. */
23
+ export const IMPROVED_MEND_PET_TRIGGER_SPELL_ID = 24406;
24
+
25
+ /** Opening Booty Chest — CMSG_OPEN_ITEM path define only. */
26
+ export const OPEN_BOOTY_CHEST_SPELL_ID = 5107;
27
+ /** Echeyakee's Grace — MOD_STAT stacks with everything. */
28
+ export const ECHEYAKEE_GRACE_SPELL_ID = 5320;
29
+ /** Songflower Serenade — same stack exemption. Cite: SpellStacking.cpp:253. */
30
+ export const SONGFLOWER_SERENADE_SPELL_ID = 15366;
31
+ /** Curse of Mending — proc retargets to pVictim. */
32
+ export const CURSE_OF_MENDING_SPELL_ID = 7099;
33
+ /** Capture Spirit — CheckCast creature-entry allowlist. */
34
+ export const CAPTURE_SPIRIT_SPELL_ID = 7914;
35
+ /** Deviate Fish — EffectDummy random outcome. */
36
+ export const DEVIATE_FISH_SPELL_ID = 8063;
37
+ /** Cooked Deviate Fish (Savory Deviate Delight) — gender morph. */
38
+ export const COOKED_DEVIATE_FISH_SPELL_ID = 8213;
39
+ /** Gnomish Universal Remote. */
40
+ export const UNIVERSAL_REMOTE_SPELL_ID = 8344;
41
+ // Lightning Blast — no real Spells/*.cpp case (float false-positive −240.8598). Cite: SpellEffects.cpp:577
42
+ // coordinate comment.
43
+ export const LIGHTNING_BLAST_SPELL_ID = 8598;
44
+ /** Bending Shinbone — SCRIPT_EFFECT 1/5 → 8854 else 8855. */
45
+ export const BENDING_SHINBONE_SPELL_ID = 8856;
46
+ // Moonfire rank — no real Spells/*.cpp case (Ashbringer sound-id false positive). Cite:
47
+ // SpellEffects.cpp:1253 AshbringerSounds array.
48
+ export const MOONFIRE_8924_SPELL_ID = 8924;
49
+ /** Create Filled Containment Coffer — cast by Attract Rift Spawn 9012. */
50
+ export const CREATE_FILLED_CONTAINMENT_COFFER_SPELL_ID = 9010;
51
+ /** Create Containment Coffer — OnCheckTarget requires aura 9032. */
52
+ export const CREATE_CONTAINMENT_COFFER_SPELL_ID = 9082;
53
+ /** Rift spawn stun gate for coffer. Cite: Spell.cpp:7985–7988; SpellEffects.cpp:416. */
54
+ export const RIFT_SPAWN_STUN_AURA_SPELL_ID = 9032;
55
+ /** Attract Rift Spawn dummy → CastSpell(9010). Cite: SpellEffects.cpp:409–416. */
56
+ export const ATTRACT_RIFT_SPAWN_SPELL_ID = 9012;
57
+ // Mortal Strike (creature aura-23) — SelectAttackingTarget TOPAGGRO for trigger. Cite:
58
+ // SpellAuras.cpp:1161–1171.
59
+ export const MORTAL_STRIKE_CREATURE_AURA_SPELL_ID = 9347;
60
+ /** Thaumaturgy Channel — quest CREATE_ITEM (already dispositioned). */
61
+ export const THAUMATURGY_CHANNEL_SPELL_ID = 9712;
62
+ /** Eye for an Eye ranks. */
63
+ export const EYE_FOR_AN_EYE_RANK1_SPELL_ID = 9799;
64
+ export const EYE_FOR_AN_EYE_RANK2_SPELL_ID = 25988;
65
+ /** Eye for an Eye damage payload. Cite: UnitAuraProcHandler.cpp:807. */
66
+ export const EYE_FOR_AN_EYE_DAMAGE_SPELL_ID = 25997;
67
+ /** Polly Eats the E.C.A.C. */
68
+ export const POLLY_EATS_ECAC_SPELL_ID = 9976;
69
+ /** Polly Jr. summon. Cite: SpellEffects.cpp:423. */
70
+ export const POLLY_JR_SPELL_ID = 9998;
71
+ /** Curse of the Eye male transform (from dummy 3360). */
72
+ export const CURSE_OF_THE_EYE_MALE_SPELL_ID = 10651;
73
+ /** Curse of the Eye female. Cite: SpellEffects.cpp:358. */
74
+ export const CURSE_OF_THE_EYE_FEMALE_SPELL_ID = 10653;
75
+ /** Curse of the Eye parent dummy. Cite: SpellEffects.cpp:355–360. */
76
+ export const CURSE_OF_THE_EYE_DUMMY_SPELL_ID = 3360;
77
+ // Summon Brown Snake — no combat Spells/*.cpp case (ItemID comment false-positive on Gnomish Shrink Ray
78
+ // 13006 ItemID:10716). Cite: SpellEffects.cpp:447.
79
+ export const SUMMON_BROWN_SNAKE_SPELL_ID = 10716;
80
+ /** Ignite ranks (dummy aura → custom DoT 12654). */
81
+ export const IGNITE_RANK1_SPELL_ID = 11119;
82
+ export const IGNITE_RANK2_SPELL_ID = 11120;
83
+ export const IGNITE_RANK3_SPELL_ID = 12846;
84
+ export const IGNITE_RANK4_SPELL_ID = 12847;
85
+ export const IGNITE_RANK5_SPELL_ID = 12848;
86
+ /** Ignite DoT payload. Cite: UnitAuraProcHandler.cpp:985. */
87
+ export const IGNITE_DOT_SPELL_ID = 12654;
88
+
89
+ // ── Stage s14 — Dimension C batch (12699…14265) ─────────────────────────────
90
+
91
+ /** Summon Screecher Spirit — CheckCast one-shot per creature. Cite: Spell.cpp:7922–7932. */
92
+ export const SUMMON_SCREECHER_SPIRIT_SPELL_ID = 12699;
93
+ /** Deep Wounds talent ranks (aura 42 → custom DoT 12721). Cite: UnitAuraProcHandler.cpp:1316–1342. */
94
+ export const DEEP_WOUNDS_RANK1_SPELL_ID = 12834;
95
+ export const DEEP_WOUNDS_RANK2_SPELL_ID = 12849;
96
+ export const DEEP_WOUNDS_RANK3_SPELL_ID = 12867;
97
+ /** Deep Wound DoT payload. Cite: UnitAuraProcHandler.cpp:1341 trigger_spell_id = 12721. */
98
+ export const DEEP_WOUND_DOT_SPELL_ID = 12721;
99
+ // Deep Wound DoT timing from spell_template 12721: DurationIndex 29 → 12s, EffectAmplitude1 3000. Cite:
100
+ // spell_template 12721; duration.ts FALLBACK_DURATION_MS[29]=12000.
101
+ export const DEEP_WOUND_DOT_DURATION_MS = 12_000;
102
+ export const DEEP_WOUND_DOT_TICK_MS = 3000;
103
+
104
+ // The warrior Flurry haste ranks the talent parents trigger. The haste proc fires only on the main
105
+ // target and never during extra attacks, with three charges. Cite: UnitAuraProcHandler.cpp:749-762.
106
+ export const FLURRY_WARRIOR_RANK1_SPELL_ID = 12966;
107
+ export const FLURRY_WARRIOR_RANK2_SPELL_ID = 12967;
108
+ export const FLURRY_WARRIOR_RANK3_SPELL_ID = 12968;
109
+ export const FLURRY_WARRIOR_RANK4_SPELL_ID = 12969;
110
+ export const FLURRY_WARRIOR_RANK5_SPELL_ID = 12970;
111
+ /** spell_template.ProcCharges for Flurry haste buffs. */
112
+ export const FLURRY_PROC_CHARGES = 3;
113
+
114
+ /** Gnomish Shrink Ray dummy. Cite: SpellEffects.cpp:447–467. */
115
+ export const SHRINK_RAY_SPELL_ID = 13006;
116
+ export const SHRINK_RAY_TARGET_SHRINK_SPELL_ID = 13003;
117
+ export const SHRINK_RAY_GROW_SPELL_ID = 13004;
118
+ export const SHRINK_RAY_PARTY_SHRINK_SPELL_ID = 13010;
119
+
120
+ // Blast Wave r3 (13019) — digit false-positive: Capture Spirit allowlist uses creature entry 13019. Cite:
121
+ // Spell.cpp:7918 GetEntry() != 13019 (not a Blast Wave case).
122
+ export const BLAST_WAVE_RANK3_SPELL_ID = 13019;
123
+
124
+ /** Net-o-Matic dummy. Cite: SpellEffects.cpp:469–482. */
125
+ export const NET_O_MATIC_SPELL_ID = 13120;
126
+ export const NET_O_MATIC_SELF_ROOT_SPELL_ID = 16566;
127
+ export const NET_O_MATIC_CHARGE_ROOT_SPELL_ID = 13119;
128
+ export const NET_O_MATIC_NORMAL_ROOT_SPELL_ID = 13099;
129
+
130
+ /** Gnomish Mind Control Cap dummy. Cite: SpellEffects.cpp:484–495. */
131
+ export const GNOMISH_MIND_CONTROL_CAP_SPELL_ID = 13180;
132
+ export const GNOMISH_MIND_CONTROL_TRIGGER_SPELL_ID = 13181;
133
+
134
+ // Defensive State (DND) — CMaNGOS case is commented empty (creature-internal). Cite:
135
+ // UnitAuraProcHandler.cpp:1272 // case 13358: break;
136
+ export const DEFENSIVE_STATE_DND_13358_SPELL_ID = 13358;
137
+
138
+ // The Dummy Trigger intermediate for Persistent Shield: the proc handler rewrites it to the absorb
139
+ // spell, and the dummy effect runs only when triggered by it. Cite: UnitAuraProcHandler.cpp:1307-1313.
140
+ export const DUMMY_TRIGGER_SPELL_ID = 13567;
141
+ export const PERSISTENT_SHIELD_HOLDER_SPELL_ID = 26467;
142
+ export const PERSISTENT_SHIELD_ABSORB_SPELL_ID = 26470;
143
+
144
+ // Ruthlessness / Seal Fate *triggered* ADD_COMBO_POINTS spells — deferred until after finisher clears CP
145
+ // (AddTriggeredSpell). Cite: UnitAuraProcHandler.cpp:1510–1519.
146
+ export const RUTHLESSNESS_TRIGGER_SPELL_ID = 14157;
147
+ export const SEAL_FATE_TRIGGER_SPELL_ID = 14189;
148
+
149
+ // Raptor Strike ranks 3–7 — digit false-positives: Dispel Drakonids 23484 switches on NPC_BLUE_DRAKONID…
150
+ // entries 14261–14265, not Raptor Strike spell cases. Cite: SpellEffects.cpp:1062–1077 case 23484.
151
+ export const RAPTOR_STRIKE_RANK3_SPELL_ID = 14261;
152
+ export const RAPTOR_STRIKE_RANK4_SPELL_ID = 14262;
153
+ export const RAPTOR_STRIKE_RANK5_SPELL_ID = 14263;
154
+ export const RAPTOR_STRIKE_RANK6_SPELL_ID = 14264;
155
+ export const RAPTOR_STRIKE_RANK7_SPELL_ID = 14265;
156
+ /** Opening Chest / Safe — CMSG_OPEN_ITEM defines. */
157
+ export const OPEN_CHEST_SPELL_ID = 11437;
158
+ export const OPEN_SAFE_SPELL_ID = 11535;
159
+ /** Frostbolt (Six Demon Bag outcome). Cite: SpellEffects.cpp:530 case 14537. */
160
+ export const SIX_DEMON_BAG_FROSTBOLT_SPELL_ID = 11538;
161
+ export const SIX_DEMON_BAG_SPELL_ID = 14537;
162
+ export const SIX_DEMON_BAG_FIREBALL_SPELL_ID = 15662;
163
+ export const SIX_DEMON_BAG_CHAIN_LIGHTNING_SPELL_ID = 21179;
164
+ export const SIX_DEMON_BAG_ENVELOPING_WINDS_SPELL_ID = 25189;
165
+ export const SIX_DEMON_BAG_FELHOUND_SPELL_ID = 14642;
166
+ export const SIX_DEMON_BAG_POLYMORPH_SPELL_ID = 14621;
167
+
168
+ // ── Stage s15 — Dimension C batch (14302…18765) ─────────────────────────────
169
+
170
+ // Immolation Trap r5 — digit false-positive: NPC_CHROMATIC_DRAKONID in Dispel Drakonids. Cite:
171
+ // SpellEffects.cpp:1062–1077 case 23484 case 14302 ForcedDespawn.
172
+ export const IMMOLATION_TRAP_RANK_14302_SPELL_ID = 14302;
173
+ // Summon Enraged Wyvern — digit false-positive: NPC_BLACK_SPAWNER in Spawn Drakonid. Cite:
174
+ // SpellEffects.cpp:843–856 case 22659 case 14307 → 22654.
175
+ export const SUMMON_ENRAGED_WYVERN_SPELL_ID = 14307;
176
+ /** Skull Crack — digit false-positive: NPC_YAUJ_BROOD in Despawn Brood. Cite: SpellEffects.cpp:1126–1131. */
177
+ export const SKULL_CRACK_SPELL_ID = 15621;
178
+ // Ancestral Fortitude r2 — digit false-positive: creature entry 16236 in Submerge Visual. Cite:
179
+ // SpellAuras.cpp:1520–1525 case 28819 GetEntry()==16236.
180
+ export const ANCESTRAL_FORTITUDE_RANK2_SPELL_ID = 16236;
181
+
182
+ /** Holy Nova damage ranks → AddTriggeredSpell heal companions. Cite: Spell.cpp:3130–3136. */
183
+ export const HOLY_NOVA_RANK1_SPELL_ID = 15237;
184
+ export const HOLY_NOVA_RANK2_SPELL_ID = 15430;
185
+ export const HOLY_NOVA_RANK3_SPELL_ID = 15431;
186
+ export const HOLY_NOVA_RANK4_SPELL_ID = 27799;
187
+ export const HOLY_NOVA_RANK5_SPELL_ID = 27800;
188
+ export const HOLY_NOVA_RANK6_SPELL_ID = 27801;
189
+ /** Holy Nova heal payloads. Cite: Spell.cpp:3130–3136 AddTriggeredSpell. */
190
+ export const HOLY_NOVA_HEAL_RANK1_SPELL_ID = 23455;
191
+ export const HOLY_NOVA_HEAL_RANK2_SPELL_ID = 23458;
192
+ export const HOLY_NOVA_HEAL_RANK3_SPELL_ID = 23459;
193
+ export const HOLY_NOVA_HEAL_RANK4_SPELL_ID = 27803;
194
+ export const HOLY_NOVA_HEAL_RANK5_SPELL_ID = 27804;
195
+ export const HOLY_NOVA_HEAL_RANK6_SPELL_ID = 27805;
196
+
197
+ // Capture Worg Pup — EffectDummy ForcedDespawn on creature (quest capture). Cite: SpellEffects.cpp:545–550.
198
+ export const CAPTURE_WORG_PUP_SPELL_ID = 15998;
199
+ // Defensive State (DND) 16092 — CMaNGOS case is commented empty. Cite: UnitAuraProcHandler.cpp:1273 // case
200
+ // 16092: break;
201
+ export const DEFENSIVE_STATE_DND_16092_SPELL_ID = 16092;
202
+ /** Mana Tide totem aura — CastCustomSpell with amount on periodic. Cite: SpellAuras.cpp:1207–1210. */
203
+ export const MANA_TIDE_SPELL_ID = 16191;
204
+
205
+ // The shaman Flurry haste ranks the talent parents trigger: main target only, never during extra
206
+ // attacks, three charges. Cite: UnitAuraProcHandler.cpp:749-762.
207
+ export const FLURRY_SHAMAN_RANK1_SPELL_ID = 16257;
208
+ export const FLURRY_SHAMAN_RANK2_SPELL_ID = 16277;
209
+ export const FLURRY_SHAMAN_RANK3_SPELL_ID = 16278;
210
+ export const FLURRY_SHAMAN_RANK4_SPELL_ID = 16279;
211
+ export const FLURRY_SHAMAN_RANK5_SPELL_ID = 16280;
212
+
213
+ // Temperature Reading — quest 974 thermometer texts by GO guid (world/RP). Cite: SpellEffects.cpp:558–604.
214
+ export const TEMPERATURE_READING_SPELL_ID = 16378;
215
+ /** Noggenfogger Elixir dummy → random 16595/16593/16591. Cite: SpellEffects.cpp:606–614. */
216
+ export const VOODOO_SPELL_ID = 17009;
217
+ export const VOODOO_OUTCOMES = [16707, 16708, 16709, 16711, 16712, 16713, 16716] as const;
218
+
219
+ export const NOGGENFOGGER_ELIXIR_SPELL_ID = 16589;
220
+ export const NOGGENFOGGER_OUTCOMES = [16595, 16593, 16591] as const;
221
+ // Leader of the Pack talent (dummy). On form apply, CastSpell(24932) if known. Cite:
222
+ // SpellAuras.cpp:4306–4311 HandleShapeshiftBoosts.
223
+ export const LEADER_OF_THE_PACK_SPELL_ID = 17007;
224
+ // Leader of the Pack party crit aura. bp2+1=3% crit; Stances 145 = cat|bear|dire. Cite: spell_template
225
+ // 24932; SpellAuras.cpp:4307–4311.
226
+ export const LEADER_OF_THE_PACK_AURA_SPELL_ID = 24932;
227
+ /** Sourced crit % from 24932 EffectBasePoints+1. Cite: spell_template 24932 bp2. */
228
+ export const LEADER_OF_THE_PACK_CRIT_PCT = 3;
229
+ /** Shapeshift form ids for Stances=145 (bit0 cat, bit4 bear, bit7 dire). */
230
+ export const LEADER_OF_THE_PACK_FORMS = Object.freeze([1, 5, 8] as const);
231
+
232
+ /** Test Fetid Skull — quest random create item 17269/17270. Cite: SpellEffects.cpp:642–648. */
233
+ export const TEST_FETID_SKULL_SPELL_ID = 17271;
234
+ export const CREATE_RESONATING_SKULL_SPELL_ID = 17269;
235
+ export const CREATE_BONE_DUST_SPELL_ID = 17270;
236
+ // Piccolo of the Flaming Fire — SCRIPT_EFFECT dance emote on player (RP). Cite: SpellEffects.cpp:3729–3736.
237
+ export const PICCOLO_OF_THE_FLAMING_FIRE_SPELL_ID = 17512;
238
+ // Wolfshead Helm Energy — dummy CastSpell(29940) energize 20 energy. Cite: SpellEffects.cpp:661–665;
239
+ // spell_template 29940 Effect 30 bp19 → 20 energy.
240
+ export const WOLFSHEAD_HELM_ENERGY_SPELL_ID = 17770;
241
+ export const WOLFSHEAD_HELM_ENERGY_TRIGGER_SPELL_ID = 29940;
242
+ /** Energize amount from 29940 (bp+1). Cite: spell_template 29940 EffectBasePoints1=19. */
243
+ export const WOLFSHEAD_HELM_ENERGY_AMOUNT = 20;
244
+
245
+ // Pyroclasm talent ranks — Hellfire/RoF tick → chance stun 18093. chance = base / tick (Hellfire 15 ticks,
246
+ // Rain of Fire 4). Cite: UnitAuraProcHandler.cpp:1347–1375.
247
+ export const PYROCLASM_RANK1_SPELL_ID = 18096;
248
+ export const PYROCLASM_RANK2_SPELL_ID = 18073;
249
+ /** Pyroclasm stun payload. DurationIndex 27 → 3000 ms. Cite: spell_template 18093. */
250
+ export const PYROCLASM_STUN_SPELL_ID = 18093;
251
+ export const PYROCLASM_STUN_DURATION_MS = 3000;
252
+ /** Base chance numerators. Cite: UnitAuraProcHandler.cpp:1368–1369. */
253
+ export const PYROCLASM_RANK1_BASE_CHANCE = 13;
254
+ export const PYROCLASM_RANK2_BASE_CHANCE = 26;
255
+ /** Hellfire SpellFamilyFlags bit. Cite: UnitAuraProcHandler.cpp:1356 0x40. */
256
+ export const PYROCLASM_HELLFIRE_FAMILY_FLAG = 0x40;
257
+ /** Rain of Fire SpellFamilyFlags bit. Cite: UnitAuraProcHandler.cpp:1359 0x20. */
258
+ export const PYROCLASM_RAIN_OF_FIRE_FAMILY_FLAG = 0x20;
259
+ export const PYROCLASM_HELLFIRE_TICKS = 15;
260
+ export const PYROCLASM_RAIN_OF_FIRE_TICKS = 4;
261
+
262
+ // Sweeping Strikes player talent + NPC rank (Zul'Gurub Zealot Zath). Cite: UnitAuraProcHandler.cpp:810–841
263
+ // cases 12292/18765; spell_template ProcCharges=5 DurIndex 18.
264
+ export const SWEEPING_STRIKES_PLAYER_SPELL_ID = 12292;
265
+ export const SWEEPING_STRIKES_NPC_SPELL_ID = 18765;
266
+ /** Trigger: school damage with basepoints = damage dealt. Cite: UnitAuraProcHandler.cpp:839–840. */
267
+ export const SWEEPING_STRIKES_COPY_DAMAGE_SPELL_ID = 12723;
268
+ /** Trigger: normalized weapon damage (WW / Execute above 20%). Cite: UnitAuraProcHandler.cpp:824–831. */
269
+ export const SWEEPING_STRIKES_NORMALIZED_SPELL_ID = 26654;
270
+ /** Whirlwind — SS always uses 26654. Cite: UnitAuraProcHandler.cpp:824–825. */
271
+ export const WHIRLWIND_SPELL_ID = 1680;
272
+ /** GetAPMultiplier normalized speeds. Cite: Unit.cpp:10513–10536. */
273
+ export const NORMALIZED_WEAPON_SPEED_DAGGER_SEC = 1.7;
274
+ export const NORMALIZED_WEAPON_SPEED_1H_SEC = 2.4;
275
+ export const NORMALIZED_WEAPON_SPEED_2H_SEC = 3.3;
276
+ /** ITEM_SUBCLASS_WEAPON_DAGGER. Cite: SharedDefines / ItemPrototype. */
277
+ export const ITEM_SUBCLASS_WEAPON_DAGGER = 15;
278
+ /** Execute ranks that carry TargetAuraState HEALTHLESS_20. Cite: spell_template 5308 chain. */
279
+ export const EXECUTE_SPELL_IDS: ReadonlySet<number> = new Set([
280
+ 5308, 20647, 20658, 20660, 20661, 20662,
281
+ ]);
282
+
283
+ export function isSweepingStrikesAuraSpell(spellId: number): boolean {
284
+ return spellId === SWEEPING_STRIKES_PLAYER_SPELL_ID || spellId === SWEEPING_STRIKES_NPC_SPELL_ID;
285
+ }
286
+
287
+ /** Normalized att_speed seconds for SS 26654 / GetAPMultiplier. Cite: Unit.cpp:10513–10536. */
288
+ export function normalizedMeleeSpeedSec(opts: {
289
+ twoHand?: boolean;
290
+ weaponSubclass?: number;
291
+ }): number {
292
+ if (opts.twoHand) return NORMALIZED_WEAPON_SPEED_2H_SEC;
293
+ if (opts.weaponSubclass === ITEM_SUBCLASS_WEAPON_DAGGER) return NORMALIZED_WEAPON_SPEED_DAGGER_SEC;
294
+ return NORMALIZED_WEAPON_SPEED_1H_SEC;
295
+ }
296
+
297
+ // True → SS trigger 26654 (normalized weapon); false → 12723 (copy damage). WW always normalized. Execute:
298
+ // copy if *cleave target* is ≤20% HP, else normalized. Cite: UnitAuraProcHandler.cpp:822–837.
299
+ export function sweepingStrikesUsesNormalized(
300
+ proccingSpellId: number | undefined,
301
+ cleaveTargetHpFrac: number,
302
+ ): boolean {
303
+ if (proccingSpellId === WHIRLWIND_SPELL_ID) return true;
304
+ if (proccingSpellId != null && EXECUTE_SPELL_IDS.has(proccingSpellId)) {
305
+ return cleaveTargetHpFrac > 0.2;
306
+ }
307
+ return false;
308
+ }
309
+
310
+ // ── Stage s16 — Dimension C batch (18813…22564) ─────────────────────────────
311
+
312
+ /** Knock Away (scripted threat reduction family). Cite: SpellEffects.cpp:3695–3727. */
313
+ export const KNOCK_AWAY_18813_SPELL_ID = 18813;
314
+ export const KNOCK_AWAY_18945_SPELL_ID = 18945;
315
+ export const KNOCK_AWAY_10101_SPELL_ID = 10101;
316
+ export const KNOCK_AWAY_18103_SPELL_ID = 18103;
317
+ export const KNOCK_AWAY_18670_SPELL_ID = 18670;
318
+ export const KNOCK_AWAY_19633_SPELL_ID = 19633;
319
+ export const KNOCK_AWAY_20686_SPELL_ID = 20686;
320
+ export const KNOCK_AWAY_22920_SPELL_ID = 22920;
321
+ export const KNOCK_AWAY_23382_SPELL_ID = 23382;
322
+ export const KNOCK_AWAY_25778_SPELL_ID = 25778;
323
+ export const KNOCK_AWAY_30013_SPELL_ID = 30013;
324
+ export const KNOCK_AWAY_30121_SPELL_ID = 30121;
325
+ /** Default scripted threat reduction. Cite: SpellEffects.cpp:3711–3712 pct = -50. */
326
+ export const KNOCK_AWAY_DEFAULT_THREAT_PCT = -50;
327
+ /** Cite: SpellEffects.cpp:3716–3718 cases 19633/25778. */
328
+ export const KNOCK_AWAY_MILD_THREAT_PCT = -25;
329
+ /** Cite: SpellEffects.cpp:3720–3723 cases 18103/22920/10101. */
330
+ export const KNOCK_AWAY_FULL_THREAT_PCT = -100;
331
+
332
+ /** Double Attack creature passives. Cite: SpellMgr.h:580–592 IsSpellRemovedOnEvade. */
333
+ export const DOUBLE_ATTACK_18943_SPELL_ID = 18943;
334
+ export const DOUBLE_ATTACK_19194_SPELL_ID = 19194;
335
+ export const DOUBLE_ATTACK_19817_SPELL_ID = 19817;
336
+ export const DOUBLE_ATTACK_19818_SPELL_ID = 19818;
337
+ /** Extra-attack payload. Cite: spell_template 18941 Effect 19. */
338
+ export const DOUBLE_ATTACK_EXTRA_ATTACKS_SPELL_ID = 18941;
339
+
340
+ // Entrapment talent ranks (Frost Trap pulse → root 19185). Cite: SpellEffects.cpp:685–698 case 18350 /
341
+ // 13810; ClassicDB ProcChance 5/10/15.
342
+ export const ENTRAPMENT_RANK1_SPELL_ID = 19184;
343
+ export const ENTRAPMENT_RANK2_SPELL_ID = 19387;
344
+ export const ENTRAPMENT_RANK3_SPELL_ID = 19388;
345
+ /** Root payload. Cite: SpellEffects.cpp:698 CastSpell(…, 19185); DurIndex 28 → 5s. */
346
+ export const ENTRAPMENT_ROOT_SPELL_ID = 19185;
347
+ /** Frost Trap Aura that pulses Dummy Trigger 18350. Cite: SpellEffects.cpp:683 case 13810. */
348
+ export const FROST_TRAP_AURA_FOR_ENTRAPMENT_SPELL_ID = 13810;
349
+ /** Rank scan order (max rank first). Cite: SpellEffects.cpp:689. */
350
+ export const ENTRAPMENT_RANK_SCAN_ORDER = Object.freeze([
351
+ ENTRAPMENT_RANK3_SPELL_ID,
352
+ ENTRAPMENT_RANK2_SPELL_ID,
353
+ ENTRAPMENT_RANK1_SPELL_ID,
354
+ ] as const);
355
+ /** Sourced ProcChance. Cite: ClassicDB spell_template 19184/19387/19388 ProcChance. */
356
+ export const ENTRAPMENT_PROC_CHANCE: Readonly<Record<number, number>> = Object.freeze({
357
+ [ENTRAPMENT_RANK1_SPELL_ID]: 5,
358
+ [ENTRAPMENT_RANK2_SPELL_ID]: 10,
359
+ [ENTRAPMENT_RANK3_SPELL_ID]: 15,
360
+ });
361
+ /** Root duration. Cite: spell_template 19185 DurationIndex 28 → FALLBACK_DURATION_MS[28]=5000. */
362
+ export const ENTRAPMENT_ROOT_DURATION_MS = 5000;
363
+
364
+ /** Lava Bomb (Geddon). Cite: SpellEffects.cpp:737–742. */
365
+ export const LAVA_BOMB_SPELL_ID = 19411;
366
+ /** Summon Lava Bomb 1. Cite: SpellEffects.cpp:740 CastSpell(…, 20494). */
367
+ export const LAVA_BOMB_SUMMON_SPELL_ID = 20494;
368
+ export const LAVA_BOMB_20474_SPELL_ID = 20474;
369
+ export const LAVA_BOMB_SUMMON_2_SPELL_ID = 20495;
370
+
371
+ // Improved Lay on Hands — proc retargets to pVictim. Cite: UnitAuraProcHandler.cpp:1504–1507 case 20233.
372
+ export const IMPROVED_LAY_ON_HANDS_SPELL_ID = 20233;
373
+
374
+ /** Seal of Righteousness ranks → melee proc damage carriers. Cite: UnitAuraProcHandler.cpp:1103–1111. */
375
+ export const SEAL_OF_RIGHTEOUSNESS_RANK1_SPELL_ID = 20154;
376
+ export const SEAL_OF_RIGHTEOUSNESS_RANK1_5_SPELL_ID = 21084;
377
+ export const SEAL_OF_RIGHTEOUSNESS_RANK2_SPELL_ID = 20287;
378
+ export const SEAL_OF_RIGHTEOUSNESS_RANK3_SPELL_ID = 20288;
379
+ export const SEAL_OF_RIGHTEOUSNESS_RANK4_SPELL_ID = 20289;
380
+ export const SEAL_OF_RIGHTEOUSNESS_RANK5_SPELL_ID = 20290;
381
+ export const SEAL_OF_RIGHTEOUSNESS_RANK6_SPELL_ID = 20291;
382
+ export const SEAL_OF_RIGHTEOUSNESS_RANK7_SPELL_ID = 20292;
383
+ export const SEAL_OF_RIGHTEOUSNESS_RANK8_SPELL_ID = 20293;
384
+ export const SEAL_OF_RIGHTEOUSNESS_PROC_DAMAGE: Readonly<Record<number, number>> = Object.freeze({
385
+ [SEAL_OF_RIGHTEOUSNESS_RANK1_SPELL_ID]: 25742,
386
+ [SEAL_OF_RIGHTEOUSNESS_RANK1_5_SPELL_ID]: 25741,
387
+ [SEAL_OF_RIGHTEOUSNESS_RANK2_SPELL_ID]: 25740,
388
+ [SEAL_OF_RIGHTEOUSNESS_RANK3_SPELL_ID]: 25739,
389
+ [SEAL_OF_RIGHTEOUSNESS_RANK4_SPELL_ID]: 25738,
390
+ [SEAL_OF_RIGHTEOUSNESS_RANK5_SPELL_ID]: 25737,
391
+ [SEAL_OF_RIGHTEOUSNESS_RANK6_SPELL_ID]: 25736,
392
+ [SEAL_OF_RIGHTEOUSNESS_RANK7_SPELL_ID]: 25735,
393
+ [SEAL_OF_RIGHTEOUSNESS_RANK8_SPELL_ID]: 25713,
394
+ });
395
+
396
+ // Tamed Pet Passive (DND) — comment-only example for unused SPELL_AURA_PET_DAMAGE_MULTI. Cite:
397
+ // SpellAuras.cpp:218.
398
+ export const TAMED_PET_PASSIVE_SPELL_ID = 20782;
399
+
400
+ /** Warrior's Wrath (Nefarian warrior class call). Cite: SpellEffects.cpp:1319–1324. */
401
+ export const WARRIORS_WRATH_SPELL_ID = 21977;
402
+ export const WARRIORS_WRATH_MOD_SPELL_ID = 21887;
403
+ /** Aura 107 bp-51 → −50. Cite: ClassicDB 21887 EffectBasePoints1. */
404
+ export const WARRIORS_WRATH_MOD_AMOUNT = -50;
405
+ /** DurationIndex 1 → 10s. Cite: FALLBACK_DURATION_MS[1]. */
406
+ export const WARRIORS_WRATH_MOD_DURATION_MS = 10_000;
407
+
408
+ /** Shadow Flame (Onyxia). Cite: SpellEffects.cpp:3738–3761. */
409
+ export const SHADOW_FLAME_SPELL_ID = 22539;
410
+ export const SHADOW_FLAME_DOT_SPELL_ID = 22682;
411
+ export const ONYXIA_SCALE_CLOAK_SPELL_ID = 22683;
412
+ /** DoT: bp1749 → 1750/tick, amp 1000, DurIndex 1 → 10s. Cite: ClassicDB 22682. */
413
+ export const SHADOW_FLAME_DOT_AMOUNT = 1750;
414
+ export const SHADOW_FLAME_DOT_TICK_MS = 1000;
415
+ export const SHADOW_FLAME_DOT_DURATION_MS = 10_000;
416
+
417
+ /** AV Recall trinkets. Cite: SpellMgr.cpp:2313–2319. */
418
+ export const RECALL_22563_SPELL_ID = 22563;
419
+ export const RECALL_22564_SPELL_ID = 22564;
420
+ export const RECALL_ALTERAC_VALLEY_MAP_ID = 30;
421
+ export const BATTLEGROUND_STATUS_WAIT_JOIN = 0;
422
+
423
+ // ── Stage s17 — Dimension C batch (22588…23887) ─────────────────────────────
424
+
425
+ // 10% speed bonus — Deadly Swiftness (31255) payload when victim < 20% health. Cite:
426
+ // UnitAuraProcHandler.cpp:1293–1301 case 31255 → trigger_spell_id = 22588.
427
+ export const DEADLY_SWIFTNESS_SPELL_ID = 31255;
428
+ export const SPEED_BONUS_10_PCT_SPELL_ID = 22588;
429
+ /** bp9+1 → 10%. Cite: ClassicDB 22588 EffectBasePoints1=9. */
430
+ export const SPEED_BONUS_10_PCT = 10;
431
+ /** Victim health fraction gate: > max/5 fails. Cite: UnitAuraProcHandler.cpp:1296. */
432
+ export const DEADLY_SWIFTNESS_HEALTH_FRAC = 0.2;
433
+
434
+ // Spawn Drakonid — BWL spawner creature entry → summon spell. Creature-only. Cite: SpellEffects.cpp:842–856
435
+ // case 22659.
436
+ export const SPAWN_DRAKONID_SPELL_ID = 22659;
437
+ export const SPAWN_DRAKONID_BY_ENTRY: Readonly<Record<number, number>> = Object.freeze({
438
+ 14312: 22658, // Blue
439
+ 14310: 22656, // Green
440
+ 14311: 22657, // Bronze
441
+ 14309: 22655, // Red
442
+ 14307: 22654, // Black
443
+ });
444
+
445
+ /** Crystal Prison Dummy DND — quest capture ForcedDespawn + 23022. Cite: SpellEffects.cpp:868–880. */
446
+ export const CRYSTAL_PRISON_DUMMY_SPELL_ID = 23019;
447
+ export const CRYSTAL_PRISON_CONJURE_SPELL_ID = 23022;
448
+
449
+ // Engineering dragonling / battle chicken item dummies → summon payloads. Cite: SpellEffects.cpp:882–908.
450
+ export const ARCANITE_DRAGONLING_SPELL_ID = 23074;
451
+ export const MITHRIL_MECHANICAL_DRAGONLING_SPELL_ID = 23075;
452
+ export const MECHANICAL_DRAGONLING_SPELL_ID = 23076;
453
+ export const GNOMISH_BATTLE_CHICKEN_SPELL_ID = 23133;
454
+ export const ARCANITE_DRAGONLING_SUMMON_SPELL_ID = 19804;
455
+ export const MITHRIL_MECHANICAL_DRAGONLING_SUMMON_SPELL_ID = 12749;
456
+ export const MECHANICAL_DRAGONLING_SUMMON_SPELL_ID = 4073;
457
+ export const BATTLE_CHICKEN_SUMMON_SPELL_ID = 13166;
458
+
459
+ /** Goblin Bomb item spell. Cite: item_scripts.cpp:209-224 case 23134. */
460
+ export const GOBLIN_BOMB_SPELL_ID = 23134;
461
+ export const MALFUNCTION_EXPLOSION_SPELL_ID = 13261;
462
+ export const SUMMON_GOBLIN_BOMB_SPELL_ID = 13258;
463
+
464
+ // Taming Lesson — CheckTargetCreatureType clears beast mask (same as Dismiss Pet 2641). Cite:
465
+ // Spell.cpp:6913–6915.
466
+ export const TAMING_LESSON_SPELL_ID = 23356;
467
+ export const DISMISS_PET_SPELL_ID = 2641;
468
+
469
+ // Gnomish Transporter (Ultrasafe Gadgetzan): urand(0,5) ? 23441 success : 23446 fail. 5/6 success, 1/6
470
+ // malfunction. Cite: SpellEffects.cpp:1041–1046.
471
+ export const GNOMISH_TRANSPORTER_SPELL_ID = 23453;
472
+ export const GADGETZAN_TRANSPORTER_SUCCESS_SPELL_ID = 23441;
473
+ export const GADGETZAN_TRANSPORTER_FAILURE_SPELL_ID = 23446;
474
+
475
+ // Everlook Transporter (Dimensional Ripper): urand(0,5) ? 23450 arrival : 23449 malfunction.
476
+ // Cite: de8f72993b9e1faa1bf92dd5505f3daec5cea3ce item_scripts.cpp:316-323 OnSuccessfulFinish 23442
477
+ export const EVERLOOK_TRANSPORTER_SPELL_ID = 23442;
478
+ export const EVERLOOK_TRANSPORTER_MALFUNCTION_SPELL_ID = 23449;
479
+
480
+ // Transporter Arrival (Gadgetzan + Everlook): urand(0,5). 0 -> 23444, 1-2 -> 23445. Cite: SpellEffects.cpp:1031-1040 case 23450.
481
+ export const TRANSPORTER_ARRIVAL_SPELL_ID = 23450;
482
+ export const TRANSPORTER_ARRIVAL_POLYMORPH_SPELL_ID = 23444;
483
+ export const TRANSPORTER_ARRIVAL_EVIL_TWIN_SPELL_ID = 23445;
484
+
485
+ // Mana Surge (Earthfury set) — HandleDummyAuraProc: manaCost * 35/100 → 23571. Cite:
486
+ // UnitAuraProcHandler.cpp:1482–1489 case 23572.
487
+ export const MANA_SURGE_SPELL_ID = 23572;
488
+ export const MANA_SURGE_ENERGIZE_SPELL_ID = 23571;
489
+ /** Percent of triggering spell mana cost restored. Cite: UnitAuraProcHandler.cpp:1487. */
490
+ export const MANA_SURGE_MANA_COST_PCT = 35;
491
+
492
+ /** Hourglass Sand — removes Brood Affliction: Bronze 23170. Cite: SpellEffects.cpp:1048–1052 case 23645. */
493
+ export const HOURGLASS_SAND_SPELL_ID = 23645;
494
+ export const BROOD_AFFLICTION_BRONZE_SPELL_ID = 23170;
495
+
496
+ // Temperature Reading false positives: the digits match Pattern rows, but the C++ cases are thermometer
497
+ // gameobject guids, not pattern learn rules. Cite: SpellEffects.cpp:563-595.
498
+ export const PATTERN_DAWN_TREADERS_SPELL_ID = 23712;
499
+ export const PATTERN_TIMBERMAW_BRAWLERS_SPELL_ID = 23713;
500
+ export const PATTERN_GOLDEN_MANTLE_DAWN_SPELL_ID = 23714;
501
+ export const PATTERN_LAVA_BELT_SPELL_ID = 23715;
502
+ export const PATTERN_CHROMATIC_GAUNTLETS_SPELL_ID = 23716;
503
+
504
+ // Gift of Life (BWL warrior trinket): basepoints = maxHealth * 0.15 → 23782 + 23783. Cite:
505
+ // SpellEffects.cpp:1054–1060 case 23725.
506
+ export const GIFT_OF_LIFE_SPELL_ID = 23725;
507
+ export const GIFT_OF_LIFE_MAX_HEALTH_SPELL_ID = 23782;
508
+ export const GIFT_OF_LIFE_HEAL_SPELL_ID = 23783;
509
+ /** Fraction of max health for both heal and max-health buff. Cite: SpellEffects.cpp:1056. */
510
+ export const GIFT_OF_LIFE_MAX_HEALTH_FRAC = 0.15;
511
+ /** 23782 DurationIndex 18 → 20s. Cite: ClassicDB 23782; FALLBACK_DURATION_MS[18]=20000. */
512
+ export const GIFT_OF_LIFE_MAX_HEALTH_DURATION_MS = 20_000;
513
+
514
+ /** Jubling Cooldown SCRIPT_EFFECT → CastSpell(23852). Cite: SpellEffects.cpp:3763–3766. */
515
+ export const JUBLING_COOLDOWN_SPELL_ID = 23853;
516
+ export const JUBLING_COOLDOWN_TRIGGER_SPELL_ID = 23852;
517
+
518
+ // Bloodthirst self-heal auras applied after EffectSchoolDMG. Cite: Spell.cpp:1299–1314 cases 23881→23885,
519
+ // 23892→23886, 23893→23887.
520
+ export const BLOODTHIRST_RANK1_SPELL_ID = 23881;
521
+ export const BLOODTHIRST_RANK2_SPELL_ID = 23892;
522
+ export const BLOODTHIRST_RANK3_SPELL_ID = 23893;
523
+ export const BLOODTHIRST_RANK4_SPELL_ID = 23894;
524
+ export const BLOODTHIRST_AURA_RANK1_SPELL_ID = 23885;
525
+ export const BLOODTHIRST_AURA_RANK2_SPELL_ID = 23886;
526
+ export const BLOODTHIRST_AURA_RANK3_SPELL_ID = 23887;
527
+ export const BLOODTHIRST_AURA_RANK4_SPELL_ID = 23888;
528
+ /** Heal payloads from aura 42 triggers. Cite: ClassicDB 23880/23889/23890 bp+1. */
529
+ export const BLOODTHIRST_HEAL_RANK1_SPELL_ID = 23880;
530
+ export const BLOODTHIRST_HEAL_RANK2_SPELL_ID = 23889;
531
+ export const BLOODTHIRST_HEAL_RANK3_SPELL_ID = 23890;
532
+ export const BLOODTHIRST_HEAL_RANK4_SPELL_ID = 23891;
533
+ /** Aura duration/charges. Cite: ClassicDB 23885 DurationIndex 31→8s, ProcCharges 5. */
534
+ export const BLOODTHIRST_AURA_DURATION_MS = 8000;
535
+ export const BLOODTHIRST_AURA_CHARGES = 5;
536
+ /** Heal amounts (bp+1). Cite: ClassicDB 23880/23889/23890 EffectBasePoints1. */
537
+ export const BLOODTHIRST_HEAL_AMOUNTS: Readonly<Record<number, number>> = Object.freeze({
538
+ [BLOODTHIRST_HEAL_RANK1_SPELL_ID]: 10,
539
+ [BLOODTHIRST_HEAL_RANK2_SPELL_ID]: 13,
540
+ [BLOODTHIRST_HEAL_RANK3_SPELL_ID]: 17,
541
+ [BLOODTHIRST_HEAL_RANK4_SPELL_ID]: 20,
542
+ });
543
+
544
+ // Shadow Portal (Scholomance) outcomes. Cite: SpellEffects.cpp:667-676 spell_list[urand(0, 5)].
545
+ export const SHADOW_PORTAL_SPELL_ID = 17950;
546
+ export const SHADOW_PORTAL_OUTCOMES = [17863, 17939, 17943, 17944, 17946, 17948] as const;
547
+
548
+ export function pickShadowPortalOutcome(roll01: number): number {
549
+ const i = Math.min(5, Math.floor(roll01 * 6));
550
+ return SHADOW_PORTAL_OUTCOMES[i]!;
551
+ }
552
+
553
+ // Deviate Fish outcomes. Cite: SpellEffects.cpp:369–377.
554
+ export const DEVIATE_FISH_OUTCOMES = [8064, 8065, 8066, 8067, 8068] as const;
555
+ // Cooked Deviate: Flip Out ninja / Yaaarrrr pirate by gender.
556
+ // Cite: SpellEffects.cpp:380–386.
557
+ export const COOKED_DEVIATE_NINJA_MALE = 8219;
558
+ export const COOKED_DEVIATE_NINJA_FEMALE = 8220;
559
+ export const COOKED_DEVIATE_PIRATE_MALE = 8221;
560
+ export const COOKED_DEVIATE_PIRATE_FEMALE = 8222;
561
+ // Universal Remote outcomes. Cite: SpellEffects.cpp:389–397.
562
+ export const UNIVERSAL_REMOTE_OUTCOMES = [8345, 8346, 8347] as const;
563
+ // Bending Shinbone. Cite: SpellEffects.cpp:3680–3694.
564
+ export const BENDING_SHINBONE_RARE_SPELL_ID = 8854;
565
+ export const BENDING_SHINBONE_COMMON_SPELL_ID = 8855;
566
+
567
+ /** Capture Spirit allowed creature entries. Cite: Spell.cpp:7914–7920. */
568
+ export const CAPTURE_SPIRIT_ALLOWED_ENTRIES = Object.freeze([
569
+ 4663, 4664, 4665, 4666, 4667, 4668, 4705, 13019,
570
+ ]);
571
+
572
+ // Cited dispositions for Dimension-C ids that are pure world or quest utility, or false-positive digit
573
+ // hits in the Spells sources. Every entry requires a file:line citation — silence is a failure.
574
+ export const STAGE_CPP_DISPOSITIONS = Object.freeze({
575
+ [BANISH_EXILE_BURNING_SPELL_ID]: {
576
+ id: BANISH_EXILE_BURNING_SPELL_ID,
577
+ name: 'Banish Exile',
578
+ reason: 'CheckCast creature entry allowlist, script target cast 3617.',
579
+ cite: 'item_scripts.cpp:114-141 case 4130 BanishExile',
580
+ },
581
+ [BANISH_EXILE_CRESTING_SPELL_ID]: {
582
+ id: BANISH_EXILE_CRESTING_SPELL_ID,
583
+ name: 'Banish Exile',
584
+ reason: 'CheckCast creature entry allowlist, script target cast 3617.',
585
+ cite: 'item_scripts.cpp:114-141 case 4131 BanishExile',
586
+ },
587
+ [BANISH_EXILE_THUNDERING_SPELL_ID]: {
588
+ id: BANISH_EXILE_THUNDERING_SPELL_ID,
589
+ name: 'Banish Exile',
590
+ reason: 'CheckCast creature entry allowlist, script target cast 3617.',
591
+ cite: 'item_scripts.cpp:114-141 case 4132 BanishExile',
592
+ },
593
+ [OPEN_BOOTY_CHEST_SPELL_ID]: {
594
+ id: OPEN_BOOTY_CHEST_SPELL_ID,
595
+ name: 'Opening Booty Chest',
596
+ reason:
597
+ 'CMSG_OPEN_ITEM path define only - locked-item open bookkeeping, not a combat cast rule',
598
+ cite: 'SpellHandler.cpp:156–160 #define OPEN_BOOTY_CHEST 5107 (with OPEN_CHEST/OPEN_SAFE)',
599
+ },
600
+ [OPEN_CHEST_SPELL_ID]: {
601
+ id: OPEN_CHEST_SPELL_ID,
602
+ name: 'Opening Chest',
603
+ reason: 'CMSG_OPEN_ITEM path define only - inventory open spell id, not combat',
604
+ cite: 'SpellHandler.cpp:156 #define OPEN_CHEST 11437',
605
+ },
606
+ [OPEN_SAFE_SPELL_ID]: {
607
+ id: OPEN_SAFE_SPELL_ID,
608
+ name: 'Opening Safe',
609
+ reason: 'CMSG_OPEN_ITEM path define only - inventory open spell id, not combat',
610
+ cite: 'SpellHandler.cpp:157 #define OPEN_SAFE 11535',
611
+ },
612
+ [LIGHTNING_BLAST_SPELL_ID]: {
613
+ id: LIGHTNING_BLAST_SPELL_ID,
614
+ name: 'Lightning Blast',
615
+ reason:
616
+ 'No Spells/*.cpp special-case for spell 8598 - digit false-positive inside coordinate ' +
617
+ 'literal −240.8598; generic SCHOOL_DAMAGE materializes',
618
+ cite: 'SpellEffects.cpp:577 (Z: -240.8598 comment/coordinate; not a spell-id case)',
619
+ },
620
+ [MOONFIRE_8924_SPELL_ID]: {
621
+ id: MOONFIRE_8924_SPELL_ID,
622
+ name: 'Moonfire',
623
+ reason:
624
+ 'No Spells/*.cpp special-case for spell 8924 - digit false-positive in AshbringerSounds[] ' +
625
+ 'sound-id array; generic Moonfire DoT+direct materializes',
626
+ cite: 'SpellEffects.cpp:1253 AshbringerSounds[12] includes 8924 (sound, not spell case)',
627
+ },
628
+ [SUMMON_BROWN_SNAKE_SPELL_ID]: {
629
+ id: SUMMON_BROWN_SNAKE_SPELL_ID,
630
+ name: 'Summon Brown Snake',
631
+ reason:
632
+ 'No Spells/*.cpp special-case for spell 10716 - digit false-positive as ItemID:10716 on ' +
633
+ 'Gnomish Shrink Ray 13006; SUMMON_OBJECT_WILD/companion is generic',
634
+ cite: 'SpellEffects.cpp:447 case 13006 // Gnomish Shrink Ray (ItemID: 10716)',
635
+ },
636
+ [THAUMATURGY_CHANNEL_SPELL_ID]: {
637
+ id: THAUMATURGY_CHANNEL_SPELL_ID,
638
+ name: 'Thaumaturgy Channel',
639
+ reason:
640
+ 'Quest channel: zero-trigger CastSpell(21029 CREATE_ITEM 7867) - not combat effects[]',
641
+ cite: 'SpellAuras.cpp:971–974; census SPELL_AURA_SLOT_DISPOSITIONS 9712:23',
642
+ },
643
+ [CREATE_FILLED_CONTAINMENT_COFFER_SPELL_ID]: {
644
+ id: CREATE_FILLED_CONTAINMENT_COFFER_SPELL_ID,
645
+ name: 'Create Filled Containment Coffer',
646
+ reason:
647
+ 'Quest utility: Attract Rift Spawn 9012 casts 9010 when target has aura 9032 - world/quest, ' +
648
+ 'not a player combat payload',
649
+ cite: 'SpellEffects.cpp:409–416 case 9012 CastSpell(…, 9010); Spell.cpp:7985–7988 case 9082',
650
+ },
651
+ [CREATE_CONTAINMENT_COFFER_SPELL_ID]: {
652
+ id: CREATE_CONTAINMENT_COFFER_SPELL_ID,
653
+ name: 'Create Containment Coffer',
654
+ reason:
655
+ 'Quest utility: OnCheckTarget requires aura 9032 (rift spawn stun) - world/quest gate',
656
+ cite: 'Spell.cpp:7985–7988 case 9082 HasAura(9032)',
657
+ },
658
+ [MORTAL_STRIKE_CREATURE_AURA_SPELL_ID]: {
659
+ id: MORTAL_STRIKE_CREATURE_AURA_SPELL_ID,
660
+ name: 'Mortal Strike',
661
+ reason:
662
+ 'Creature-only aura-23 retarget: SelectAttackingTarget(TOPAGGRO) when unit is Creature; ' +
663
+ 'player cast has no body. Combat surface is trigger 24573 via generic aura-23.',
664
+ cite: 'SpellAuras.cpp:1161–1171 case 9347 TYPEID_UNIT SelectAttackingTarget TOPAGGRO',
665
+ },
666
+ // ── Stage s14 dispositions (false-positive digits / empty C++ stubs) ──────
667
+ [BLAST_WAVE_RANK3_SPELL_ID]: {
668
+ id: BLAST_WAVE_RANK3_SPELL_ID,
669
+ name: 'Blast Wave',
670
+ reason:
671
+ 'No Spells/*.cpp special-case for spell 13019 - digit is Capture Spirit creature-entry ' +
672
+ 'allowlist (GetEntry() != 13019); Blast Wave is generic SCHOOL_DAMAGE + snare',
673
+ cite: 'Spell.cpp:7914–7920 case 7914 Capture Spirit entry list includes 13019',
674
+ },
675
+ [DEFENSIVE_STATE_DND_13358_SPELL_ID]: {
676
+ id: DEFENSIVE_STATE_DND_13358_SPELL_ID,
677
+ name: 'Defensive State (DND)',
678
+ reason:
679
+ 'Creature-internal PROC_TRIGGER_SPELL holder; CMaNGOS HandleProcTriggerSpell case is ' +
680
+ 'commented empty (no combat body). Same disposition family as 5301/16092/24949',
681
+ cite: 'UnitAuraProcHandler.cpp:1272 // case 13358: break; // Defensive State (DND)',
682
+ },
683
+ [DUMMY_TRIGGER_SPELL_ID]: {
684
+ id: DUMMY_TRIGGER_SPELL_ID,
685
+ name: 'Dummy Trigger',
686
+ reason:
687
+ 'Intermediate DUMMY for Persistent Shield: HandleDummyAuraProc rewrites 26467 → CastCustomSpell ' +
688
+ '26470 at 15% of heal; EffectDummy 13567 only when triggeredByAuraSpell==26467. No standalone combat cast',
689
+ cite:
690
+ 'UnitAuraProcHandler.cpp:1307–1313 case 26467 → 26470; SpellEffects.cpp:504–520 case 13567',
691
+ },
692
+ [RAPTOR_STRIKE_RANK3_SPELL_ID]: {
693
+ id: RAPTOR_STRIKE_RANK3_SPELL_ID,
694
+ name: 'Raptor Strike',
695
+ reason:
696
+ 'No Spells/*.cpp special-case for Raptor Strike 14261 - digit is NPC_BLUE_DRAKONID in ' +
697
+ 'Dispel Drakonids 23484 ForcedDespawn switch; Raptor Strike is generic on-next-swing weapon damage',
698
+ cite: 'SpellEffects.cpp:1062–1077 case 23484 case 14261–14265 ForcedDespawn',
699
+ },
700
+ [RAPTOR_STRIKE_RANK4_SPELL_ID]: {
701
+ id: RAPTOR_STRIKE_RANK4_SPELL_ID,
702
+ name: 'Raptor Strike',
703
+ reason:
704
+ 'No Spells/*.cpp special-case for Raptor Strike 14262 - NPC_GREEN_DRAKONID in Dispel Drakonids',
705
+ cite: 'SpellEffects.cpp:1062–1077 case 23484 case 14262',
706
+ },
707
+ [RAPTOR_STRIKE_RANK5_SPELL_ID]: {
708
+ id: RAPTOR_STRIKE_RANK5_SPELL_ID,
709
+ name: 'Raptor Strike',
710
+ reason:
711
+ 'No Spells/*.cpp special-case for Raptor Strike 14263 - NPC_BRONZE_DRAKONID in Dispel Drakonids',
712
+ cite: 'SpellEffects.cpp:1062–1077 case 23484 case 14263',
713
+ },
714
+ [RAPTOR_STRIKE_RANK6_SPELL_ID]: {
715
+ id: RAPTOR_STRIKE_RANK6_SPELL_ID,
716
+ name: 'Raptor Strike',
717
+ reason:
718
+ 'No Spells/*.cpp special-case for Raptor Strike 14264 - NPC_RED_DRAKONID in Dispel Drakonids',
719
+ cite: 'SpellEffects.cpp:1062–1077 case 23484 case 14264',
720
+ },
721
+ [RAPTOR_STRIKE_RANK7_SPELL_ID]: {
722
+ id: RAPTOR_STRIKE_RANK7_SPELL_ID,
723
+ name: 'Raptor Strike',
724
+ reason:
725
+ 'No Spells/*.cpp special-case for Raptor Strike 14265 - NPC_BLACK_DRAKONID in Dispel Drakonids',
726
+ cite: 'SpellEffects.cpp:1062–1077 case 23484 case 14265',
727
+ },
728
+ // ── Stage s15 dispositions (false-positive digits / world-quest / empty stubs) ──
729
+ [IMMOLATION_TRAP_RANK_14302_SPELL_ID]: {
730
+ id: IMMOLATION_TRAP_RANK_14302_SPELL_ID,
731
+ name: 'Immolation Trap',
732
+ reason:
733
+ 'No Spells/*.cpp special-case for Immolation Trap 14302 - digit is NPC_CHROMATIC_DRAKONID ' +
734
+ 'in Dispel Drakonids 23484 ForcedDespawn; trap DoT is generic GO arm path',
735
+ cite: 'SpellEffects.cpp:1062–1077 case 23484 case 14302 ForcedDespawn',
736
+ },
737
+ [SUMMON_ENRAGED_WYVERN_SPELL_ID]: {
738
+ id: SUMMON_ENRAGED_WYVERN_SPELL_ID,
739
+ name: 'Summon Enraged Wyvern',
740
+ reason:
741
+ 'No Spells/*.cpp special-case for spell 14307 - digit is NPC_BLACK_SPAWNER in Spawn Drakonid ' +
742
+ '22659 (caster entry → summon spell); not a player combat rule',
743
+ cite: 'SpellEffects.cpp:843–856 case 22659 case 14307 spellSummonDrakonid=22654',
744
+ },
745
+ [SKULL_CRACK_SPELL_ID]: {
746
+ id: SKULL_CRACK_SPELL_ID,
747
+ name: 'Skull Crack',
748
+ reason:
749
+ 'No Spells/*.cpp special-case for Skull Crack 15621 - digit is NPC_YAUJ_BROOD in Despawn Brood ' +
750
+ '25792 ForcedDespawn; stun is generic Effect 58',
751
+ cite: 'SpellEffects.cpp:1126–1131 case 25792 GetEntry()==15621 ForcedDespawn',
752
+ },
753
+ [ANCESTRAL_FORTITUDE_RANK2_SPELL_ID]: {
754
+ id: ANCESTRAL_FORTITUDE_RANK2_SPELL_ID,
755
+ name: 'Ancestral Fortitude',
756
+ reason:
757
+ 'No Spells/*.cpp special-case for Ancestral Fortitude 16236 - digit is creature entry in ' +
758
+ 'Submerge Visual 28819 ForcedDespawn; armor_pct materializes generically from aura 101',
759
+ cite: 'SpellAuras.cpp:1520–1525 case 28819 GetEntry()==16236 ForcedDespawn(700)',
760
+ },
761
+ [DEFENSIVE_STATE_DND_16092_SPELL_ID]: {
762
+ id: DEFENSIVE_STATE_DND_16092_SPELL_ID,
763
+ name: 'Defensive State (DND)',
764
+ reason:
765
+ 'Creature-internal PROC_TRIGGER_SPELL holder; CMaNGOS HandleProcTriggerSpell case is ' +
766
+ 'commented empty (no combat body). Same family as 5301/13358/24949',
767
+ cite: 'UnitAuraProcHandler.cpp:1273 // case 16092: break; // Defensive State (DND)',
768
+ },
769
+ [CAPTURE_WORG_PUP_SPELL_ID]: {
770
+ id: CAPTURE_WORG_PUP_SPELL_ID,
771
+ name: 'Capture Worg Pup',
772
+ reason:
773
+ 'Quest capture: EffectDummy ForcedDespawn on creature target + CREATE_ITEM companion - ' +
774
+ 'world/quest utility, not a combat payload',
775
+ cite: 'SpellEffects.cpp:545–550 case 15998 ForcedDespawn; Effect 24 CREATE_ITEM co-slot',
776
+ },
777
+ [TEMPERATURE_READING_SPELL_ID]: {
778
+ id: TEMPERATURE_READING_SPELL_ID,
779
+ name: 'Temperature Reading',
780
+ reason:
781
+ 'Quest 974 thermometer: DoScriptText by GO guid + optional RewardPlayerAndGroupAtEventCredit ' +
782
+ '- pure world/quest RP, no combat',
783
+ cite: 'SpellEffects.cpp:558–604 case 16378 textIds + RewardPlayerAndGroupAtEventCredit',
784
+ },
785
+ [TEST_FETID_SKULL_SPELL_ID]: {
786
+ id: TEST_FETID_SKULL_SPELL_ID,
787
+ name: 'Test Fetid Skull',
788
+ reason:
789
+ 'Quest utility: urand → Create Resonating Skull 17269 or Create Bone Dust 17270 (CREATE_ITEM) ' +
790
+ '- not a combat cast',
791
+ cite: 'SpellEffects.cpp:642–648 case 17271 CastSpell(17269|17270)',
792
+ },
793
+ [PICCOLO_OF_THE_FLAMING_FIRE_SPELL_ID]: {
794
+ id: PICCOLO_OF_THE_FLAMING_FIRE_SPELL_ID,
795
+ name: 'Piccolo of the Flaming Fire',
796
+ reason:
797
+ 'RP toy: SCRIPT_EFFECT HandleEmoteCommand(EMOTE_STATE_DANCE) on player target - no combat',
798
+ cite: 'SpellEffects.cpp:3729–3736 case 17512 HandleEmoteCommand(EMOTE_STATE_DANCE)',
799
+ },
800
+ // ── Stage s16 dispositions (evade-persist stubs / unused aura / BG area gate) ──
801
+ [DOUBLE_ATTACK_18943_SPELL_ID]: {
802
+ id: DOUBLE_ATTACK_18943_SPELL_ID,
803
+ name: 'Double Attack',
804
+ reason:
805
+ 'Creature PROC_TRIGGER_SPELL passive (→ 18941 extra attacks). CMaNGOS lists it only in ' +
806
+ 'IsSpellRemovedOnEvade (return false - survives evade) and a commented-empty HandleProcTriggerSpell ' +
807
+ 'case; no custom combat rewrite. Generic aura-42 materializes.',
808
+ cite:
809
+ 'SpellMgr.h:580 case 18943 IsSpellRemovedOnEvade return false; UnitAuraProcHandler.cpp:1274 // case 18943: break;',
810
+ },
811
+ [DOUBLE_ATTACK_19194_SPELL_ID]: {
812
+ id: DOUBLE_ATTACK_19194_SPELL_ID,
813
+ name: 'Double Attack',
814
+ reason:
815
+ 'Same as 18943: evade-persist creature passive; empty commented proc case; generic pts → 18941',
816
+ cite:
817
+ 'SpellMgr.h:584 case 19194; UnitAuraProcHandler.cpp:1275 // case 19194: break;',
818
+ },
819
+ [DOUBLE_ATTACK_19817_SPELL_ID]: {
820
+ id: DOUBLE_ATTACK_19817_SPELL_ID,
821
+ name: 'Double Attack',
822
+ reason:
823
+ 'Same as 18943: evade-persist creature passive; empty commented proc case; generic pts → 18941',
824
+ cite:
825
+ 'SpellMgr.h:591 case 19817; UnitAuraProcHandler.cpp:1276 // case 19817: break;',
826
+ },
827
+ [DOUBLE_ATTACK_19818_SPELL_ID]: {
828
+ id: DOUBLE_ATTACK_19818_SPELL_ID,
829
+ name: 'Double Attack',
830
+ reason:
831
+ 'Same as 18943: evade-persist creature passive; empty commented proc case; generic pts → 18941',
832
+ cite:
833
+ 'SpellMgr.h:592 case 19818; UnitAuraProcHandler.cpp:1277 // case 19818: break;',
834
+ },
835
+ [TAMED_PET_PASSIVE_SPELL_ID]: {
836
+ id: TAMED_PET_PASSIVE_SPELL_ID,
837
+ name: 'Tamed Pet Passive (DND)',
838
+ reason:
839
+ 'No Spells/*.cpp special-case body - id appears only as a comment example for unused ' +
840
+ 'SPELL_AURA_PET_DAMAGE_MULTI (157) HandleUnused; not a player combat rule',
841
+ cite: 'SpellAuras.cpp:218 // 157 SPELL_AURA_PET_DAMAGE_MULTI (single test like spell 20782…)',
842
+ },
843
+ [RECALL_22563_SPELL_ID]: {
844
+ id: RECALL_22563_SPELL_ID,
845
+ name: 'Recall',
846
+ reason:
847
+ 'AV trinket CheckCast only: map_id==30 and BG status != STATUS_WAIT_JOIN; TELEPORT_UNITS ' +
848
+ 'payload is generic. Pure battleground area gate - not a combat damage/CC rule',
849
+ cite: 'SpellMgr.cpp:2313–2319 case 22563/22564 map_id==30 bg->GetStatus()!=STATUS_WAIT_JOIN',
850
+ },
851
+ [RECALL_22564_SPELL_ID]: {
852
+ id: RECALL_22564_SPELL_ID,
853
+ name: 'Recall',
854
+ reason:
855
+ 'AV trinket CheckCast only (same switch as 22563); world/BG utility, not combat payload',
856
+ cite: 'SpellMgr.cpp:2313–2319 case 22564/22563',
857
+ },
858
+ // ── Stage s17 dispositions (creature/quest/false-positive / companion CD) ──
859
+ [SPAWN_DRAKONID_SPELL_ID]: {
860
+ id: SPAWN_DRAKONID_SPELL_ID,
861
+ name: 'Spawn Drakonid',
862
+ reason:
863
+ 'BWL Nefarian phase-1 spawner only: caster creature entry → color summon spell; ' +
864
+ 'not a player combat cast rule',
865
+ cite: 'SpellEffects.cpp:842–856 case 22659 switch GetEntry() → spellSummonDrakonid',
866
+ },
867
+ [CRYSTAL_PRISON_DUMMY_SPELL_ID]: {
868
+ id: CRYSTAL_PRISON_DUMMY_SPELL_ID,
869
+ name: 'Crystal Prison Dummy DND',
870
+ reason:
871
+ 'Quest/world capture: living non-pet creature CastSpell(23022) + ForcedDespawn - ' +
872
+ 'not a player combat payload',
873
+ cite: 'SpellEffects.cpp:868–880 case 23019 CastSpell(23022) ForcedDespawn',
874
+ },
875
+ [PATTERN_DAWN_TREADERS_SPELL_ID]: {
876
+ id: PATTERN_DAWN_TREADERS_SPELL_ID,
877
+ name: 'Pattern: Dawn Treaders',
878
+ reason:
879
+ 'No Spells/*.cpp special-case for Pattern 23712 - digit is Temperature Reading GO guid ' +
880
+ 'GetGUIDLow()==23712; pattern learn is generic LEARN_SPELL bookkeeping',
881
+ cite: 'SpellEffects.cpp:563–569 case 16378 case 23712 // Z: -241.0724 DoScriptText',
882
+ },
883
+ [PATTERN_TIMBERMAW_BRAWLERS_SPELL_ID]: {
884
+ id: PATTERN_TIMBERMAW_BRAWLERS_SPELL_ID,
885
+ name: 'Pattern: Timbermaw Brawlers',
886
+ reason:
887
+ 'No Spells/*.cpp special-case for Pattern 23713 - Temperature Reading GO guid false-positive',
888
+ cite: 'SpellEffects.cpp:571–575 case 16378 case 23713 // Z: -265.2025',
889
+ },
890
+ [PATTERN_GOLDEN_MANTLE_DAWN_SPELL_ID]: {
891
+ id: PATTERN_GOLDEN_MANTLE_DAWN_SPELL_ID,
892
+ name: 'Pattern: Golden Mantle of the Dawn',
893
+ reason:
894
+ 'No Spells/*.cpp special-case for Pattern 23714 - Temperature Reading GO guid false-positive',
895
+ cite: 'SpellEffects.cpp:577–581 case 16378 case 23714 // Z: -240.8598',
896
+ },
897
+ [PATTERN_LAVA_BELT_SPELL_ID]: {
898
+ id: PATTERN_LAVA_BELT_SPELL_ID,
899
+ name: 'Pattern: Lava Belt',
900
+ reason:
901
+ 'No Spells/*.cpp special-case for Pattern 23715 - Temperature Reading GO guid false-positive',
902
+ cite: 'SpellEffects.cpp:583–587 case 16378 case 23715 // Z: -246.8467',
903
+ },
904
+ [PATTERN_CHROMATIC_GAUNTLETS_SPELL_ID]: {
905
+ id: PATTERN_CHROMATIC_GAUNTLETS_SPELL_ID,
906
+ name: 'Pattern: Chromatic Gauntlets',
907
+ reason:
908
+ 'No Spells/*.cpp special-case for Pattern 23716 - Temperature Reading GO guid + quest credit',
909
+ cite: 'SpellEffects.cpp:589–595 case 16378 case 23716 // Z: -186.0754 quest completion',
910
+ },
911
+ [JUBLING_COOLDOWN_SPELL_ID]: {
912
+ id: JUBLING_COOLDOWN_SPELL_ID,
913
+ name: 'Jubling Cooldown',
914
+ reason:
915
+ 'Companion pet CD bookkeeping: SCRIPT_EFFECT CastSpell(23852) on unitTarget - no combat damage/CC',
916
+ cite: 'SpellEffects.cpp:3763–3766 case 23853 CastSpell(…, 23852)',
917
+ },
918
+ } as const);
919
+
920
+ // ── Pure rule helpers (sourced numbers only) ────────────────────────────────
921
+
922
+ // Curse of Idiocy re-trigger gate. Stop when both intellect and spirit accumulated loss from spell 1010 are
923
+ // ≤ −90. Amounts are signed (debuffs negative). Cite: SpellAuras.cpp:1185–1203.
924
+ export function curseOfIdiocyShouldRetrigger(intellectLoss: number, spiritLoss: number): boolean {
925
+ return !(intellectLoss <= -90 && spiritLoss <= -90);
926
+ }
927
+
928
+ // Sum int/spirit loss from live 1010 buff rows and decide whether aura-23 may re-fire. Cite:
929
+ // SpellAuras.cpp:1185–1203.
930
+ export function curseOfIdiocyMayRetriggerFromBuffs(
931
+ buffs: ReadonlyArray<{ kind?: string; spellId?: number; target?: string; mod?: string; amount?: number }>,
932
+ targetSide: string,
933
+ ): boolean {
934
+ let intLoss = 0;
935
+ let spiLoss = 0;
936
+ for (const ae of buffs) {
937
+ if (ae.kind !== 'buff' || ae.spellId !== CURSE_OF_IDIOCY_SPELL_ID || ae.target !== targetSide) continue;
938
+ if (ae.mod === 'intellect') intLoss += ae.amount ?? 0;
939
+ if (ae.mod === 'spirit') spiLoss += ae.amount ?? 0;
940
+ }
941
+ return curseOfIdiocyShouldRetrigger(intLoss, spiLoss);
942
+ }
943
+
944
+ /** Banish Exile target entry check. Cite: item_scripts.cpp:121-125. */
945
+ export function banishExileAllowsTarget(spellId: number, targetEntry: number): boolean {
946
+ switch (spellId | 0) {
947
+ case BANISH_EXILE_BURNING_SPELL_ID:
948
+ return (targetEntry | 0) === BANISH_EXILE_BURNING_ENTRY;
949
+ case BANISH_EXILE_CRESTING_SPELL_ID:
950
+ return (targetEntry | 0) === BANISH_EXILE_CRESTING_ENTRY;
951
+ case BANISH_EXILE_THUNDERING_SPELL_ID:
952
+ return (targetEntry | 0) === BANISH_EXILE_THUNDERING_ENTRY;
953
+ default:
954
+ return true;
955
+ }
956
+ }
957
+
958
+ /** Capture Spirit CheckCast allowlist. Cite: Spell.cpp:7914–7920. */
959
+ export function captureSpiritAllowsEntry(entry: number): boolean {
960
+ return CAPTURE_SPIRIT_ALLOWED_ENTRIES.includes(entry | 0);
961
+ }
962
+
963
+ /** MOD_STAT stack exemption (Echeyakee's Grace / Songflower). Cite: SpellStacking.cpp:251–254. */
964
+ export function modStatStacksWithEverything(spellId: number): boolean {
965
+ const id = spellId | 0;
966
+ return id === ECHEYAKEE_GRACE_SPELL_ID || id === SONGFLOWER_SERENADE_SPELL_ID;
967
+ }
968
+
969
+ // Improved Mend Pet: the script id rolls its own chance and casts 24406.
970
+ // Cite: UnitAuraProcHandler.cpp:1615-1623 roll_chance_i(triggerAmount).
971
+ function improvedMendPetProc(
972
+ scriptId: number,
973
+ amount: number,
974
+ roll01: number,
975
+ ): { fired: boolean; triggerSpellId: number } {
976
+ if (scriptId !== IMPROVED_MEND_PET_SCRIPT_RANK1 && scriptId !== IMPROVED_MEND_PET_SCRIPT_RANK2) {
977
+ return { fired: false, triggerSpellId: 0 };
978
+ }
979
+ // roll_chance_i(amount): integer percent. Cite: Util.h roll_chance_i.
980
+ const fired = roll01 * 100 < (amount | 0);
981
+ return { fired, triggerSpellId: fired ? IMPROVED_MEND_PET_TRIGGER_SPELL_ID : 0 };
982
+ }
983
+
984
+ // Eye for an Eye reflect amount. basepoints = triggerAmount * (damage+absorb) / 100, capped at maxHealth/2.
985
+ // Magic damage class only (caller gates). Cite: UnitAuraProcHandler.cpp:795–808.
986
+ export function eyeForAnEyeReflectAmount(
987
+ triggerPct: number,
988
+ damagePlusAbsorb: number,
989
+ maxHealth: number,
990
+ ): number {
991
+ let bp = Math.trunc(((triggerPct | 0) * Math.trunc(damagePlusAbsorb)) / 100);
992
+ const cap = Math.trunc(maxHealth / 2);
993
+ if (bp > cap) bp = cap;
994
+ return Math.max(0, bp);
995
+ }
996
+
997
+ // Sourced Eye for an Eye rank → reflect % (EffectBasePoints+1). Cite: spell_template 9799 bp14 → 15; 25988
998
+ // bp29 → 30; amount.ts effectAmountRange.
999
+ export const EYE_FOR_AN_EYE_PCT: Readonly<Record<number, number>> = Object.freeze({
1000
+ [EYE_FOR_AN_EYE_RANK1_SPELL_ID]: 15,
1001
+ [EYE_FOR_AN_EYE_RANK2_SPELL_ID]: 30,
1002
+ });
1003
+
1004
+ // Ignite basepoints for DoT 12654 from rank id × damage. Cite: UnitAuraProcHandler.cpp:978–982
1005
+ // (0.04/0.08/0.12/0.16/0.20 * damage).
1006
+ export function igniteBasepoints(rankSpellId: number, damage: number): number {
1007
+ const dmg = Math.trunc(damage);
1008
+ switch (rankSpellId | 0) {
1009
+ case IGNITE_RANK1_SPELL_ID:
1010
+ return Math.trunc(0.04 * dmg);
1011
+ case IGNITE_RANK2_SPELL_ID:
1012
+ return Math.trunc(0.08 * dmg);
1013
+ case IGNITE_RANK3_SPELL_ID:
1014
+ return Math.trunc(0.12 * dmg);
1015
+ case IGNITE_RANK4_SPELL_ID:
1016
+ return Math.trunc(0.16 * dmg);
1017
+ case IGNITE_RANK5_SPELL_ID:
1018
+ return Math.trunc(0.2 * dmg);
1019
+ default:
1020
+ return 0;
1021
+ }
1022
+ }
1023
+
1024
+ /** True when spell id is an Ignite talent rank. */
1025
+ function isIgniteRank(spellId: number): boolean {
1026
+ const id = spellId | 0;
1027
+ return (
1028
+ id === IGNITE_RANK1_SPELL_ID
1029
+ || id === IGNITE_RANK2_SPELL_ID
1030
+ || id === IGNITE_RANK3_SPELL_ID
1031
+ || id === IGNITE_RANK4_SPELL_ID
1032
+ || id === IGNITE_RANK5_SPELL_ID
1033
+ );
1034
+ }
1035
+
1036
+ // Deep Wounds: per-tick basepoints for DoT 12721. total = weaponDamage × rank% (0.2/0.4/0.6); tick = total
1037
+ // / 6. Cite: UnitAuraProcHandler.cpp:1329–1341.
1038
+ export function deepWoundsTickBasepoints(rankSpellId: number, weaponDamage: number): number {
1039
+ const wd = Math.trunc(weaponDamage);
1040
+ let total = 0;
1041
+ switch (rankSpellId | 0) {
1042
+ case DEEP_WOUNDS_RANK1_SPELL_ID:
1043
+ total = Math.trunc(wd * 0.2);
1044
+ break;
1045
+ case DEEP_WOUNDS_RANK2_SPELL_ID:
1046
+ total = Math.trunc(wd * 0.4);
1047
+ break;
1048
+ case DEEP_WOUNDS_RANK3_SPELL_ID:
1049
+ total = Math.trunc(wd * 0.6);
1050
+ break;
1051
+ default:
1052
+ return 0;
1053
+ }
1054
+ return Math.trunc(total / 6);
1055
+ }
1056
+
1057
+ /** True when spell id is a Deep Wounds talent rank. */
1058
+ function isDeepWoundsRank(spellId: number): boolean {
1059
+ const id = spellId | 0;
1060
+ return (
1061
+ id === DEEP_WOUNDS_RANK1_SPELL_ID
1062
+ || id === DEEP_WOUNDS_RANK2_SPELL_ID
1063
+ || id === DEEP_WOUNDS_RANK3_SPELL_ID
1064
+ );
1065
+ }
1066
+
1067
+ // Average weapon damage used by Deep Wounds (C++ unit field min/max mean). Cite:
1068
+ // UnitAuraProcHandler.cpp:1322–1325 (MINDAMAGE+MAXDAMAGE)/2.
1069
+ export function deepWoundsAverageWeaponDamage(dmgMin: number, dmgMax: number): number {
1070
+ return (Number(dmgMin) + Number(dmgMax)) / 2;
1071
+ }
1072
+
1073
+ // The Flurry haste charge gate: false when the swing is not on the unit's main target, or while extra
1074
+ // attacks are executing. Cite: UnitAuraProcHandler.cpp:760-761.
1075
+ export function flurryMayConsumeCharge(opts: {
1076
+ victimIsMainTarget: boolean;
1077
+ extraAttacksExecuting: boolean;
1078
+ }): boolean {
1079
+ if (!opts.victimIsMainTarget) return false;
1080
+ if (opts.extraAttacksExecuting) return false;
1081
+ return true;
1082
+ }
1083
+
1084
+ /** True when spell id is a Warrior Flurry *triggered* haste rank (12966–12970). */
1085
+ export function isWarriorFlurryHasteRank(spellId: number): boolean {
1086
+ const id = spellId | 0;
1087
+ return (
1088
+ id === FLURRY_WARRIOR_RANK1_SPELL_ID
1089
+ || id === FLURRY_WARRIOR_RANK2_SPELL_ID
1090
+ || id === FLURRY_WARRIOR_RANK3_SPELL_ID
1091
+ || id === FLURRY_WARRIOR_RANK4_SPELL_ID
1092
+ || id === FLURRY_WARRIOR_RANK5_SPELL_ID
1093
+ );
1094
+ }
1095
+
1096
+ // Warrior + Shaman Flurry *triggered* haste ranks. Same HandleHasteAuraProc gate (main target, no extra
1097
+ // attacks). Cite: UnitAuraProcHandler.cpp:749–762 cases 12966–12970 and 16257/16277–16280.
1098
+ export function isFlurryHasteRank(spellId: number): boolean {
1099
+ return isWarriorFlurryHasteRank(spellId) || isShamanFlurryHasteRank(spellId);
1100
+ }
1101
+
1102
+ /** True when spell id is a Shaman Flurry *triggered* haste rank (16257/16277–16280). */
1103
+ export function isShamanFlurryHasteRank(spellId: number): boolean {
1104
+ const id = spellId | 0;
1105
+ return (
1106
+ id === FLURRY_SHAMAN_RANK1_SPELL_ID
1107
+ || id === FLURRY_SHAMAN_RANK2_SPELL_ID
1108
+ || id === FLURRY_SHAMAN_RANK3_SPELL_ID
1109
+ || id === FLURRY_SHAMAN_RANK4_SPELL_ID
1110
+ || id === FLURRY_SHAMAN_RANK5_SPELL_ID
1111
+ );
1112
+ }
1113
+
1114
+ // The Shrink Ray roll table over 0 to 99, naming the spell and whether it lands on self or the unit.
1115
+ // Cite: SpellEffects.cpp:451-464.
1116
+ export function pickShrinkRayOutcome(roll0to99: number): { spellId: number; target: 'self' | 'unit' } {
1117
+ const r = roll0to99 | 0;
1118
+ if (r < 3) return { spellId: SHRINK_RAY_GROW_SPELL_ID, target: 'self' }; // party grow
1119
+ if (r < 6) return { spellId: SHRINK_RAY_PARTY_SHRINK_SPELL_ID, target: 'self' };
1120
+ if (r < 9) return { spellId: SHRINK_RAY_GROW_SPELL_ID, target: 'unit' };
1121
+ if (r < 12) return { spellId: SHRINK_RAY_PARTY_SHRINK_SPELL_ID, target: 'unit' };
1122
+ if (r < 24) return { spellId: SHRINK_RAY_TARGET_SHRINK_SPELL_ID, target: 'self' };
1123
+ return { spellId: SHRINK_RAY_TARGET_SHRINK_SPELL_ID, target: 'unit' };
1124
+ }
1125
+
1126
+ /** Net-o-Matic roll table (urand 0..99). Cite: SpellEffects.cpp:473–479. */
1127
+ export function pickNetOMaticOutcome(roll0to99: number): number {
1128
+ const r = roll0to99 | 0;
1129
+ if (r < 2) return NET_O_MATIC_SELF_ROOT_SPELL_ID;
1130
+ if (r < 4) return NET_O_MATIC_CHARGE_ROOT_SPELL_ID;
1131
+ return NET_O_MATIC_NORMAL_ROOT_SPELL_ID;
1132
+ }
1133
+
1134
+ // Gnomish Mind Control Cap (urand 0..9). roll==1 && targetIsPlayer → reverse (target casts 13181 on
1135
+ // caster); roll!=0 → caster casts 13181 on target; roll==0 → no cast. Cite: SpellEffects.cpp:488–492.
1136
+ export function pickMindControlCapOutcome(
1137
+ roll0to9: number,
1138
+ targetIsPlayer: boolean,
1139
+ ): { spellId: number; reverse: boolean } | null {
1140
+ const r = roll0to9 | 0;
1141
+ if (r === 1 && targetIsPlayer) {
1142
+ return { spellId: GNOMISH_MIND_CONTROL_TRIGGER_SPELL_ID, reverse: true };
1143
+ }
1144
+ if (r) return { spellId: GNOMISH_MIND_CONTROL_TRIGGER_SPELL_ID, reverse: false };
1145
+ return null;
1146
+ }
1147
+
1148
+ // Goblin Bomb outcome (urand 0..99). roll < 10 → target casts malfunction (13261) on caster;
1149
+ // else caster casts summon (13258) on self. Cite: item_scripts.cpp:211-216 urand(0, 99).
1150
+ export function pickGoblinBombOutcome(
1151
+ roll0to99: number
1152
+ ): { spellId: number; reverse: boolean } {
1153
+ const r = roll0to99 | 0;
1154
+ if (r < 10) return { spellId: MALFUNCTION_EXPLOSION_SPELL_ID, reverse: true };
1155
+ return { spellId: SUMMON_GOBLIN_BOMB_SPELL_ID, reverse: false };
1156
+ }
1157
+
1158
+ // Seal Fate / Ruthlessness trigger spells grant CP *after* the finisher clears points. Cite:
1159
+ // UnitAuraProcHandler.cpp:1510–1519 AddTriggeredSpell.
1160
+ export function isDeferredFinisherComboTrigger(spellId: number): boolean {
1161
+ const id = spellId | 0;
1162
+ return id === RUTHLESSNESS_TRIGGER_SPELL_ID || id === SEAL_FATE_TRIGGER_SPELL_ID;
1163
+ }
1164
+
1165
+ // Summon Screecher Spirit CheckCast: creature target that has not already been hit by 12699. Cite:
1166
+ // Spell.cpp:7924–7926.
1167
+ export function summonScreecherSpiritAllowsTarget(opts: {
1168
+ isCreature: boolean;
1169
+ alreadyHitBySpell: boolean;
1170
+ }): boolean {
1171
+ if (!opts.isCreature) return false;
1172
+ if (opts.alreadyHitBySpell) return false;
1173
+ return true;
1174
+ }
1175
+
1176
+ // Deviate Fish: one of five outcomes at equal weight, from a uniform roll.
1177
+ // Cite: SpellEffects.cpp:373-376 urand(0,4).
1178
+ export function pickDeviateFishOutcome(roll01: number): number {
1179
+ const i = Math.min(4, Math.floor(roll01 * 5));
1180
+ return DEVIATE_FISH_OUTCOMES[i]!;
1181
+ }
1182
+
1183
+ // Cooked Deviate Delight: half ninja, half pirate, morphed by gender.
1184
+ // Cite: SpellEffects.cpp:383-386.
1185
+ export function pickCookedDeviateOutcome(roll01: number, genderMale: boolean): number {
1186
+ const ninja = roll01 < 0.5;
1187
+ if (ninja) return genderMale ? COOKED_DEVIATE_NINJA_MALE : COOKED_DEVIATE_NINJA_FEMALE;
1188
+ return genderMale ? COOKED_DEVIATE_PIRATE_MALE : COOKED_DEVIATE_PIRATE_FEMALE;
1189
+ }
1190
+
1191
+ /** Universal Remote: equal pick of 8345/8346/8347. Cite: SpellEffects.cpp:394–396 urand(0,2). */
1192
+ export function pickUniversalRemoteOutcome(roll01: number): number {
1193
+ const i = Math.min(2, Math.floor(roll01 * 3));
1194
+ return UNIVERSAL_REMOTE_OUTCOMES[i]!;
1195
+ }
1196
+
1197
+ // Bending Shinbone: a roll of 1 gives 8854 and the other four give 8855.
1198
+ // Cite: SpellEffects.cpp:3685-3691.
1199
+ export function pickBendingShinboneOutcome(roll15: number): number {
1200
+ return (roll15 | 0) === 1 ? BENDING_SHINBONE_RARE_SPELL_ID : BENDING_SHINBONE_COMMON_SPELL_ID;
1201
+ }
1202
+
1203
+ // The Six Demon Bag roll table over 0 to 99, naming the spell and whether it lands on the unit or self.
1204
+ // Cite: SpellEffects.cpp:522-541.
1205
+ export function pickSixDemonBagOutcome(roll0to99: number): { spellId: number; target: 'unit' | 'self' } {
1206
+ const r = roll0to99 | 0;
1207
+ if (r < 25) return { spellId: SIX_DEMON_BAG_FIREBALL_SPELL_ID, target: 'unit' };
1208
+ if (r < 50) return { spellId: SIX_DEMON_BAG_FROSTBOLT_SPELL_ID, target: 'unit' };
1209
+ if (r < 70) return { spellId: SIX_DEMON_BAG_CHAIN_LIGHTNING_SPELL_ID, target: 'unit' };
1210
+ if (r < 85) return { spellId: SIX_DEMON_BAG_ENVELOPING_WINDS_SPELL_ID, target: 'unit' };
1211
+ if (r < 90) return { spellId: SIX_DEMON_BAG_FELHOUND_SPELL_ID, target: 'self' };
1212
+ if (r < 97) return { spellId: SIX_DEMON_BAG_POLYMORPH_SPELL_ID, target: 'unit' };
1213
+ return { spellId: SIX_DEMON_BAG_POLYMORPH_SPELL_ID, target: 'self' };
1214
+ }
1215
+
1216
+ /** Curse of the Eye dummy 3360 → gender transform. Cite: SpellEffects.cpp:358. */
1217
+ export function curseOfTheEyeTransformSpellId(genderMale: boolean): number {
1218
+ return genderMale ? CURSE_OF_THE_EYE_MALE_SPELL_ID : CURSE_OF_THE_EYE_FEMALE_SPELL_ID;
1219
+ }
1220
+
1221
+ // Proc retarget: positive spell on enemy victim (Curse of Mending family). Cite:
1222
+ // UnitAuraProcHandler.cpp:1502–1507 case 7099 target = pVictim.
1223
+ function procRetargetsVictim(triggerSpellId: number): boolean {
1224
+ const id = triggerSpellId | 0;
1225
+ // Cite: UnitAuraProcHandler.cpp:1502–1507 cases 7099 / 29494 / 20233.
1226
+ return (
1227
+ id === CURSE_OF_MENDING_SPELL_ID
1228
+ || id === 29494
1229
+ || id === IMPROVED_LAY_ON_HANDS_SPELL_ID
1230
+ );
1231
+ }
1232
+
1233
+ /** Forbearance: baked for precast access on MECHANIC_INVULNERABILITY. */
1234
+ export const FORBEARANCE_SPELL_ID = 25771;
1235
+
1236
+ // Stage s17 Dimension-C spell ids (census floor + test gate). Prior-stage ids remain as named constants
1237
+ // above (still referenced → Dimension C closed).
1238
+ export const STAGE_SPELL_IDS: readonly number[] = Object.freeze([
1239
+ FORBEARANCE_SPELL_ID,
1240
+ SPEED_BONUS_10_PCT_SPELL_ID,
1241
+ SPAWN_DRAKONID_SPELL_ID,
1242
+ ONYXIA_SCALE_CLOAK_SPELL_ID,
1243
+ CRYSTAL_PRISON_DUMMY_SPELL_ID,
1244
+ ARCANITE_DRAGONLING_SPELL_ID,
1245
+ MITHRIL_MECHANICAL_DRAGONLING_SPELL_ID,
1246
+ MECHANICAL_DRAGONLING_SPELL_ID,
1247
+ GNOMISH_BATTLE_CHICKEN_SPELL_ID,
1248
+ GOBLIN_BOMB_SPELL_ID,
1249
+ TAMING_LESSON_SPELL_ID,
1250
+ GNOMISH_TRANSPORTER_SPELL_ID,
1251
+ TRANSPORTER_ARRIVAL_SPELL_ID,
1252
+ HOLY_NOVA_HEAL_RANK1_SPELL_ID,
1253
+ HOLY_NOVA_HEAL_RANK2_SPELL_ID,
1254
+ HOLY_NOVA_HEAL_RANK3_SPELL_ID,
1255
+ MANA_SURGE_SPELL_ID,
1256
+ HOURGLASS_SAND_SPELL_ID,
1257
+ PATTERN_DAWN_TREADERS_SPELL_ID,
1258
+ PATTERN_TIMBERMAW_BRAWLERS_SPELL_ID,
1259
+ PATTERN_GOLDEN_MANTLE_DAWN_SPELL_ID,
1260
+ PATTERN_LAVA_BELT_SPELL_ID,
1261
+ PATTERN_CHROMATIC_GAUNTLETS_SPELL_ID,
1262
+ GIFT_OF_LIFE_SPELL_ID,
1263
+ JUBLING_COOLDOWN_SPELL_ID,
1264
+ BLOODTHIRST_AURA_RANK1_SPELL_ID,
1265
+ BLOODTHIRST_AURA_RANK2_SPELL_ID,
1266
+ BLOODTHIRST_AURA_RANK3_SPELL_ID,
1267
+ ]);
1268
+
1269
+ // ── Stage s15 pure helpers ──────────────────────────────────────────────────
1270
+
1271
+ /** Holy Nova damage rank → triggered heal spell id. Cite: Spell.cpp:3130–3136 AddTriggeredSpell. */
1272
+ export function holyNovaTriggeredHealSpellId(damageRankId: number): number {
1273
+ switch (damageRankId | 0) {
1274
+ case HOLY_NOVA_RANK1_SPELL_ID:
1275
+ return HOLY_NOVA_HEAL_RANK1_SPELL_ID;
1276
+ case HOLY_NOVA_RANK2_SPELL_ID:
1277
+ return HOLY_NOVA_HEAL_RANK2_SPELL_ID;
1278
+ case HOLY_NOVA_RANK3_SPELL_ID:
1279
+ return HOLY_NOVA_HEAL_RANK3_SPELL_ID;
1280
+ case HOLY_NOVA_RANK4_SPELL_ID:
1281
+ return HOLY_NOVA_HEAL_RANK4_SPELL_ID;
1282
+ case HOLY_NOVA_RANK5_SPELL_ID:
1283
+ return HOLY_NOVA_HEAL_RANK5_SPELL_ID;
1284
+ case HOLY_NOVA_RANK6_SPELL_ID:
1285
+ return HOLY_NOVA_HEAL_RANK6_SPELL_ID;
1286
+ default:
1287
+ return 0;
1288
+ }
1289
+ }
1290
+
1291
+ // Sourced Holy Nova heal min/max from companion bake rows (bp+die). Cite: spell_template 23455 bp51 die9 →
1292
+ // 52–60; 23458 bp85 die13 → 86–98.
1293
+ export const HOLY_NOVA_HEAL_AMOUNTS: Readonly<Record<number, { min: number; max: number }>> =
1294
+ Object.freeze({
1295
+ [HOLY_NOVA_RANK1_SPELL_ID]: { min: 52, max: 60 },
1296
+ [HOLY_NOVA_RANK2_SPELL_ID]: { min: 86, max: 98 },
1297
+ [HOLY_NOVA_RANK3_SPELL_ID]: { min: 121, max: 139 },
1298
+ [HOLY_NOVA_RANK4_SPELL_ID]: { min: 161, max: 187 },
1299
+ [HOLY_NOVA_RANK5_SPELL_ID]: { min: 235, max: 271 },
1300
+ [HOLY_NOVA_RANK6_SPELL_ID]: { min: 302, max: 350 },
1301
+ });
1302
+
1303
+ /** Voodoo 17009: equal pick of 7 spells. Cite: SpellEffects.cpp EffectDummy case 17009. */
1304
+ export function pickVoodooOutcome(roll01: number): number {
1305
+ const i = Math.min(6, Math.floor(roll01 * 7));
1306
+ return VOODOO_OUTCOMES[i]!;
1307
+ }
1308
+
1309
+ /** Noggenfogger: equal pick of 16595/16593/16591. Cite: SpellEffects.cpp:610–611 spell_list[urand(0,2)]. */
1310
+ export function pickNoggenfoggerOutcome(roll01: number): number {
1311
+ const i = Math.min(2, Math.floor(roll01 * 3));
1312
+ return NOGGENFOGGER_OUTCOMES[i]!;
1313
+ }
1314
+
1315
+ /** Test Fetid Skull: 50/50 17269 vs 17270. Cite: SpellEffects.cpp:646 urand(0,1) ? 17269 : 17270. */
1316
+ export function pickTestFetidSkullOutcome(roll01: number): number {
1317
+ return roll01 < 0.5 ? CREATE_RESONATING_SKULL_SPELL_ID : CREATE_BONE_DUST_SPELL_ID;
1318
+ }
1319
+
1320
+ // Pyroclasm per-tick chance percent for a channel tick. chance = baseChance / tickCount (Hellfire 15, RoF
1321
+ // 4). Cite: UnitAuraProcHandler.cpp:1364–1372.
1322
+ export function pyroclasmChancePct(rankSpellId: number, tickCount: number): number {
1323
+ const ticks = tickCount | 0;
1324
+ if (ticks <= 0) return 0;
1325
+ let base = 0;
1326
+ switch (rankSpellId | 0) {
1327
+ case PYROCLASM_RANK1_SPELL_ID:
1328
+ base = PYROCLASM_RANK1_BASE_CHANCE;
1329
+ break;
1330
+ case PYROCLASM_RANK2_SPELL_ID:
1331
+ base = PYROCLASM_RANK2_BASE_CHANCE;
1332
+ break;
1333
+ default:
1334
+ return 0;
1335
+ }
1336
+ return base / ticks;
1337
+ }
1338
+
1339
+ // Hellfire (0x40) or Rain of Fire (0x20) family flag → tick count for Pyroclasm. Returns 0 when the spell
1340
+ // is not a Pyroclasm channel. Cite: UnitAuraProcHandler.cpp:1355–1362.
1341
+ export function pyroclasmTickCountForFamilyFlags(spellFamilyFlags: number): number {
1342
+ const f = spellFamilyFlags | 0;
1343
+ if (f & PYROCLASM_HELLFIRE_FAMILY_FLAG) return PYROCLASM_HELLFIRE_TICKS;
1344
+ if (f & PYROCLASM_RAIN_OF_FIRE_FAMILY_FLAG) return PYROCLASM_RAIN_OF_FIRE_TICKS;
1345
+ return 0;
1346
+ }
1347
+
1348
+ /** True when spell id is a Pyroclasm talent rank. */
1349
+ function isPyroclasmRank(spellId: number): boolean {
1350
+ const id = spellId | 0;
1351
+ return id === PYROCLASM_RANK1_SPELL_ID || id === PYROCLASM_RANK2_SPELL_ID;
1352
+ }
1353
+
1354
+ // Leader of the Pack form gate (Stances=145 → cat/bear/dire). Cite: spell_template 24932 Stances=145;
1355
+ // SpellAuras.cpp:4307–4311 CanBeUsedInForm.
1356
+ export function leaderOfThePackAppliesInForm(formId: number): boolean {
1357
+ const f = formId | 0;
1358
+ return (LEADER_OF_THE_PACK_FORMS as readonly number[]).includes(f);
1359
+ }
1360
+
1361
+ /** Roll Pyroclasm stun: chance% vs roll01*100. Cite: UnitAuraProcHandler.cpp:1372 roll_chance_f(chance). */
1362
+ export function pyroclasmStunFires(chancePct: number, roll01: number): boolean {
1363
+ if (chancePct <= 0) return false;
1364
+ return roll01 * 100 < chancePct;
1365
+ }
1366
+
1367
+ // ── Stage s16 pure helpers ──────────────────────────────────────────────────
1368
+
1369
+ // Knock Away SCRIPT_EFFECT threat percent for a spell id. Default −50; subset −25 or −100. Cite:
1370
+ // SpellEffects.cpp:3711–3724.
1371
+ export function knockAwayScriptThreatPct(spellId: number): number | null {
1372
+ const id = spellId | 0;
1373
+ switch (id) {
1374
+ case KNOCK_AWAY_18813_SPELL_ID:
1375
+ case KNOCK_AWAY_18945_SPELL_ID:
1376
+ case KNOCK_AWAY_18670_SPELL_ID:
1377
+ case KNOCK_AWAY_20686_SPELL_ID:
1378
+ case KNOCK_AWAY_23382_SPELL_ID:
1379
+ case KNOCK_AWAY_30013_SPELL_ID:
1380
+ case KNOCK_AWAY_30121_SPELL_ID:
1381
+ return KNOCK_AWAY_DEFAULT_THREAT_PCT;
1382
+ case KNOCK_AWAY_19633_SPELL_ID:
1383
+ case KNOCK_AWAY_25778_SPELL_ID:
1384
+ return KNOCK_AWAY_MILD_THREAT_PCT;
1385
+ case KNOCK_AWAY_18103_SPELL_ID:
1386
+ case KNOCK_AWAY_22920_SPELL_ID:
1387
+ case KNOCK_AWAY_10101_SPELL_ID:
1388
+ return KNOCK_AWAY_FULL_THREAT_PCT;
1389
+ default:
1390
+ return null;
1391
+ }
1392
+ }
1393
+
1394
+ /** True when spell is a Double Attack creature passive in the evade-persist list. */
1395
+ function isDoubleAttackPassive(spellId: number): boolean {
1396
+ const id = spellId | 0;
1397
+ return (
1398
+ id === DOUBLE_ATTACK_18943_SPELL_ID
1399
+ || id === DOUBLE_ATTACK_19194_SPELL_ID
1400
+ || id === DOUBLE_ATTACK_19817_SPELL_ID
1401
+ || id === DOUBLE_ATTACK_19818_SPELL_ID
1402
+ );
1403
+ }
1404
+
1405
+ // Entrapment ProcChance for a talent rank id (0 if not a rank). Cite: ClassicDB spell_template ProcChance;
1406
+ // SpellEffects.cpp:693.
1407
+ function entrapmentProcChance(talentSpellId: number): number {
1408
+ return ENTRAPMENT_PROC_CHANCE[talentSpellId | 0] ?? 0;
1409
+ }
1410
+
1411
+ // Highest-rank Entrapment chance from a set of aura/spell ids on the caster. Scan order matches C++ (max
1412
+ // rank first). Cite: SpellEffects.cpp:689–695.
1413
+ export function entrapmentChanceFromAuraIds(auraSpellIds: ReadonlyArray<number>): number {
1414
+ const set = new Set(auraSpellIds.map((x) => x | 0));
1415
+ for (const id of ENTRAPMENT_RANK_SCAN_ORDER) {
1416
+ if (set.has(id)) return ENTRAPMENT_PROC_CHANCE[id]!;
1417
+ }
1418
+ return 0;
1419
+ }
1420
+
1421
+ // Frost Trap's pulse rolls Entrapment's root: it fires when the uniform roll is below the chance.
1422
+ // Cite: SpellEffects.cpp:697-698 roll_chance_f.
1423
+ export function entrapmentRootFires(chancePct: number, roll01: number): boolean {
1424
+ if (chancePct <= 0) return false;
1425
+ return roll01 * 100 < chancePct;
1426
+ }
1427
+
1428
+ // Seal of Righteousness rank → melee proc SCHOOL_DAMAGE spell id. Cite: UnitAuraProcHandler.cpp:1103–1111.
1429
+ export function sealOfRighteousnessProcDamageSpellId(sealSpellId: number): number {
1430
+ return SEAL_OF_RIGHTEOUSNESS_PROC_DAMAGE[sealSpellId | 0] ?? 0;
1431
+ }
1432
+
1433
+ // Shadow Flame SCRIPT_EFFECT: cast 22682 unless target has Onyxia Scale Cloak dummy. Cite:
1434
+ // SpellEffects.cpp:3756–3760.
1435
+ export function shadowFlameAppliesDot(hasOnyxiaScaleCloak: boolean): boolean {
1436
+ return !hasOnyxiaScaleCloak;
1437
+ }
1438
+
1439
+ // AV Recall CheckCast. STATUS_WAIT_JOIN = 0 fails; any other live BG status on map 30 OK. Cite:
1440
+ // SpellMgr.cpp:2313–2319.
1441
+ function recallCastOk(opts: {
1442
+ mapId: number;
1443
+ inBattleground: boolean;
1444
+ /** BattleGround::GetStatus(); WAIT_JOIN blocks. */
1445
+ bgStatus: number;
1446
+ }): boolean {
1447
+ if (!opts.inBattleground) return false;
1448
+ if ((opts.mapId | 0) !== RECALL_ALTERAC_VALLEY_MAP_ID) return false;
1449
+ if ((opts.bgStatus | 0) === BATTLEGROUND_STATUS_WAIT_JOIN) return false;
1450
+ return true;
1451
+ }
1452
+
1453
+ // ── Stage s17 pure helpers ──────────────────────────────────────────────────
1454
+
1455
+ // Deadly Swiftness gate: victim must be at or below 20% health. Cite: UnitAuraProcHandler.cpp:1295–1297
1456
+ // GetHealth() > GetMaxHealth()/5 → fail.
1457
+ export function deadlySwiftnessVictimEligible(currentHp: number, maxHp: number): boolean {
1458
+ const max = maxHp | 0;
1459
+ if (max <= 0) return false;
1460
+ return (currentHp | 0) <= max * DEADLY_SWIFTNESS_HEALTH_FRAC;
1461
+ }
1462
+
1463
+ // Spawn Drakonid summon spell from spawner creature entry (0 if unknown). Cite: SpellEffects.cpp:846–854.
1464
+ function spawnDrakonidSummonSpellId(casterEntry: number): number {
1465
+ return SPAWN_DRAKONID_BY_ENTRY[casterEntry | 0] ?? 0;
1466
+ }
1467
+
1468
+ // Engineering item dummy → companion summon spell id (0 if not a dragonling dummy). Cite:
1469
+ // SpellEffects.cpp:882–908.
1470
+ export function engineeringCompanionSummonSpellId(dummySpellId: number): number {
1471
+ switch (dummySpellId | 0) {
1472
+ case ARCANITE_DRAGONLING_SPELL_ID:
1473
+ return ARCANITE_DRAGONLING_SUMMON_SPELL_ID;
1474
+ case MITHRIL_MECHANICAL_DRAGONLING_SPELL_ID:
1475
+ return MITHRIL_MECHANICAL_DRAGONLING_SUMMON_SPELL_ID;
1476
+ case MECHANICAL_DRAGONLING_SPELL_ID:
1477
+ return MECHANICAL_DRAGONLING_SUMMON_SPELL_ID;
1478
+ case GNOMISH_BATTLE_CHICKEN_SPELL_ID:
1479
+ return BATTLE_CHICKEN_SUMMON_SPELL_ID;
1480
+ default:
1481
+ return 0;
1482
+ }
1483
+ }
1484
+
1485
+ /** Dismiss Pet / Taming Lesson skip TargetCreatureType mask. Cite: Spell.cpp:6913–6915. */
1486
+ function skipsCreatureTypeTargetCheck(spellId: number): boolean {
1487
+ const id = spellId | 0;
1488
+ return id === DISMISS_PET_SPELL_ID || id === TAMING_LESSON_SPELL_ID;
1489
+ }
1490
+
1491
+ // Gnomish Transporter outcome: roll integer 0..5; 0 → failure 23446, else success 23441. Cite:
1492
+ // SpellEffects.cpp:1043–1044 urand(0,5) ? 23441 : 23446.
1493
+ export function gnomishTransporterOutcomeSpellId(roll0to5: number): number {
1494
+ return (roll0to5 | 0) === 0
1495
+ ? GADGETZAN_TRANSPORTER_FAILURE_SPELL_ID
1496
+ : GADGETZAN_TRANSPORTER_SUCCESS_SPELL_ID;
1497
+ }
1498
+
1499
+ // Everlook Transporter outcome: roll integer 0..5; 0 -> 23449, else 23450. Cite:
1500
+ // de8f72993b9e1faa1bf92dd5505f3daec5cea3ce item_scripts.cpp:316-323 OnSuccessfulFinish urand(0,5) ? 23450 : 23449.
1501
+ export function everlookTransporterOutcomeSpellId(roll0to5: number): number {
1502
+ return (roll0to5 | 0) === 0
1503
+ ? EVERLOOK_TRANSPORTER_MALFUNCTION_SPELL_ID
1504
+ : TRANSPORTER_ARRIVAL_SPELL_ID;
1505
+ }
1506
+
1507
+ // Transporter Arrival outcome: roll integer 0..5; 0 -> 23444, 1-2 -> 23445, 3-5 -> undefined. Cite:
1508
+ // SpellEffects.cpp:1031-1040 case 23450.
1509
+ export function transporterArrivalOutcomeSpellId(roll0to5: number): number | undefined {
1510
+ const r = roll0to5 | 0;
1511
+ if (r === 0) return TRANSPORTER_ARRIVAL_POLYMORPH_SPELL_ID;
1512
+ if (r <= 2) return TRANSPORTER_ARRIVAL_EVIL_TWIN_SPELL_ID;
1513
+ return undefined;
1514
+ }
1515
+
1516
+ // Mana Surge restore amount: floor(manaCost * 35 / 100). Cite: UnitAuraProcHandler.cpp:1487 basepoints[0] =
1517
+ // spellInfo->manaCost * 35 / 100.
1518
+ function manaSurgeRestoreAmount(manaCost: number): number {
1519
+ return Math.trunc(((manaCost | 0) * MANA_SURGE_MANA_COST_PCT) / 100);
1520
+ }
1521
+
1522
+ // Gift of Life basepoints from caster max health (15%). Cite: SpellEffects.cpp:1056 int32 basepoints =
1523
+ // m_caster->GetMaxHealth() * 0.15.
1524
+ export function giftOfLifeBasepoints(maxHealth: number): number {
1525
+ return Math.trunc((maxHealth | 0) * GIFT_OF_LIFE_MAX_HEALTH_FRAC);
1526
+ }
1527
+
1528
+ /** Bloodthirst damage rank → self aura id applied after school damage. Cite: Spell.cpp:1303–1308. */
1529
+ export function bloodthirstSelfAuraSpellId(damageRankId: number): number {
1530
+ switch (damageRankId | 0) {
1531
+ case BLOODTHIRST_RANK1_SPELL_ID:
1532
+ return BLOODTHIRST_AURA_RANK1_SPELL_ID;
1533
+ case BLOODTHIRST_RANK2_SPELL_ID:
1534
+ return BLOODTHIRST_AURA_RANK2_SPELL_ID;
1535
+ case BLOODTHIRST_RANK3_SPELL_ID:
1536
+ return BLOODTHIRST_AURA_RANK3_SPELL_ID;
1537
+ case BLOODTHIRST_RANK4_SPELL_ID:
1538
+ return BLOODTHIRST_AURA_RANK4_SPELL_ID;
1539
+ default:
1540
+ return 0;
1541
+ }
1542
+ }
1543
+
1544
+ // Bloodthirst self-aura → heal payload spell id. Cite: ClassicDB 23885→23880, 23886→23889, 23887→23890,
1545
+ // 23888→23891.
1546
+ function bloodthirstHealSpellId(auraSpellId: number): number {
1547
+ switch (auraSpellId | 0) {
1548
+ case BLOODTHIRST_AURA_RANK1_SPELL_ID:
1549
+ return BLOODTHIRST_HEAL_RANK1_SPELL_ID;
1550
+ case BLOODTHIRST_AURA_RANK2_SPELL_ID:
1551
+ return BLOODTHIRST_HEAL_RANK2_SPELL_ID;
1552
+ case BLOODTHIRST_AURA_RANK3_SPELL_ID:
1553
+ return BLOODTHIRST_HEAL_RANK3_SPELL_ID;
1554
+ case BLOODTHIRST_AURA_RANK4_SPELL_ID:
1555
+ return BLOODTHIRST_HEAL_RANK4_SPELL_ID;
1556
+ default:
1557
+ return 0;
1558
+ }
1559
+ }
1560
+ export {
1561
+ FORGIVENESS_SPELL_ID,
1562
+ FORGIVENESS_PERMANENT_FEIGN_DEATH_SPELL_ID,
1563
+ } from './cmangos-special-cases-s20.ts';
1564
+
1565
+ /** Spirit of Redemption talent passive. */
1566
+ export const SPIRIT_OF_REDEMPTION_TALENT_SPELL_ID = 20711;
1567
+ /** Spirit of Redemption form aura applied on lethal death. */
1568
+ export const SPIRIT_OF_REDEMPTION_AURA_SPELL_ID = 27827;
1569
+ /** Suicide spell cast when Spirit of Redemption expires. */
1570
+ export const SUICIDE_SPELL_ID = 27965;