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,1065 @@
1
+ // The remaining dummy and script zoo: healthstones, Soul Link, Tame Beast, the intermediate proc
2
+ // dummies, the mount and city-teleport secondaries, the ward talents, and the explicit no-ops.
3
+
4
+ import type { RegistryHandler, RegistryPack } from '../types.ts';
5
+ import { SPELL_AURA_MOUNTED } from '../../opcodes.ts';
6
+ import { POWER_ENERGY } from '../../handlers/shared.ts';
7
+ import {
8
+ SHADOWGUARD_INTERMEDIATE_SPELL_ID,
9
+ SHADOWGUARD_TRIGGER,
10
+ TOUCH_OF_WEAKNESS_INTERMEDIATE_SPELL_ID,
11
+ TOUCH_OF_WEAKNESS_TRIGGER,
12
+ } from '../../proc.ts';
13
+ import {
14
+ SHADOW_PORTAL_SPELL_ID,
15
+ pickShadowPortalOutcome,
16
+ ARCANITE_DRAGONLING_SPELL_ID,
17
+ BENDING_SHINBONE_SPELL_ID,
18
+ COOKED_DEVIATE_FISH_SPELL_ID,
19
+ CURSE_OF_THE_EYE_DUMMY_SPELL_ID,
20
+ DEVIATE_FISH_SPELL_ID,
21
+ GIFT_OF_LIFE_MAX_HEALTH_DURATION_MS,
22
+ GIFT_OF_LIFE_MAX_HEALTH_SPELL_ID,
23
+ GIFT_OF_LIFE_HEAL_SPELL_ID,
24
+ GIFT_OF_LIFE_SPELL_ID,
25
+ GNOMISH_BATTLE_CHICKEN_SPELL_ID,
26
+ GNOMISH_MIND_CONTROL_CAP_SPELL_ID,
27
+ GOBLIN_BOMB_SPELL_ID,
28
+ GNOMISH_TRANSPORTER_SPELL_ID,
29
+ TRANSPORTER_ARRIVAL_SPELL_ID,
30
+ HOURGLASS_SAND_SPELL_ID,
31
+ BROOD_AFFLICTION_BRONZE_SPELL_ID,
32
+ MECHANICAL_DRAGONLING_SPELL_ID,
33
+ MITHRIL_MECHANICAL_DRAGONLING_SPELL_ID,
34
+ KNOCK_AWAY_10101_SPELL_ID,
35
+ KNOCK_AWAY_18103_SPELL_ID,
36
+ KNOCK_AWAY_18670_SPELL_ID,
37
+ KNOCK_AWAY_18813_SPELL_ID,
38
+ KNOCK_AWAY_18945_SPELL_ID,
39
+ KNOCK_AWAY_19633_SPELL_ID,
40
+ KNOCK_AWAY_20686_SPELL_ID,
41
+ KNOCK_AWAY_22920_SPELL_ID,
42
+ KNOCK_AWAY_23382_SPELL_ID,
43
+ KNOCK_AWAY_25778_SPELL_ID,
44
+ KNOCK_AWAY_30013_SPELL_ID,
45
+ KNOCK_AWAY_30121_SPELL_ID,
46
+ LAVA_BOMB_20474_SPELL_ID,
47
+ LAVA_BOMB_SPELL_ID,
48
+ LAVA_BOMB_SUMMON_2_SPELL_ID,
49
+ LAVA_BOMB_SUMMON_SPELL_ID,
50
+ NET_O_MATIC_SPELL_ID,
51
+ NOGGENFOGGER_ELIXIR_SPELL_ID,
52
+ VOODOO_SPELL_ID,
53
+ pickVoodooOutcome,
54
+ ONYXIA_SCALE_CLOAK_SPELL_ID,
55
+ POLLY_EATS_ECAC_SPELL_ID,
56
+ POLLY_JR_SPELL_ID,
57
+ SHADOW_FLAME_DOT_AMOUNT,
58
+ SHADOW_FLAME_DOT_DURATION_MS,
59
+ SHADOW_FLAME_DOT_SPELL_ID,
60
+ SHADOW_FLAME_DOT_TICK_MS,
61
+ SHADOW_FLAME_SPELL_ID,
62
+ SHRINK_RAY_SPELL_ID,
63
+ SIX_DEMON_BAG_SPELL_ID,
64
+ TEST_FETID_SKULL_SPELL_ID,
65
+ UNIVERSAL_REMOTE_SPELL_ID,
66
+ WARRIORS_WRATH_MOD_AMOUNT,
67
+ WARRIORS_WRATH_MOD_DURATION_MS,
68
+ WARRIORS_WRATH_MOD_SPELL_ID,
69
+ WARRIORS_WRATH_SPELL_ID,
70
+ WOLFSHEAD_HELM_ENERGY_AMOUNT,
71
+ WOLFSHEAD_HELM_ENERGY_SPELL_ID,
72
+ WOLFSHEAD_HELM_ENERGY_TRIGGER_SPELL_ID,
73
+ curseOfTheEyeTransformSpellId,
74
+ knockAwayScriptThreatPct,
75
+ engineeringCompanionSummonSpellId,
76
+ giftOfLifeBasepoints,
77
+ gnomishTransporterOutcomeSpellId,
78
+ transporterArrivalOutcomeSpellId,
79
+ pickBendingShinboneOutcome,
80
+ pickCookedDeviateOutcome,
81
+ pickDeviateFishOutcome,
82
+ pickGoblinBombOutcome,
83
+ pickMindControlCapOutcome,
84
+ pickNetOMaticOutcome,
85
+ pickNoggenfoggerOutcome,
86
+ pickShrinkRayOutcome,
87
+ pickSixDemonBagOutcome,
88
+ pickTestFetidSkullOutcome,
89
+ pickUniversalRemoteOutcome,
90
+ shadowFlameAppliesDot,
91
+ } from '../../../cmangos-special-cases.ts';
92
+ import {
93
+ AXE_FLURRY_DAMAGE_SPELL_ID,
94
+ AXE_FLURRY_SPELL_ID,
95
+ BRITTLE_ARMOR_PEEL_SPELL_ID,
96
+ BRITTLE_ARMOR_STACK_SPELL_ID,
97
+ DRAIN_MANA_MOAM_SPELL_ID,
98
+ DRAIN_MANA_MOAM_TRIGGER_SPELL_ID,
99
+ HALLOWS_END_CANDY_SPELL_ID,
100
+ HALLOWS_END_TRICK_SPELL_ID,
101
+ POISONOUS_BLOOD_CLOUD_SPELL_ID,
102
+ POISONOUS_BLOOD_SPELL_ID,
103
+ STINGER_CHARGE_MARK_AURA_SPELL_ID,
104
+ STINGER_CHARGE_PRIMER_SPELL_ID,
105
+ pickHallowsEndCandyOutcome,
106
+ pickHallowsEndTrickOutcome,
107
+ stingerChargePrimerSpellId,
108
+ RANDOM_COSTUME_SPELL_ID,
109
+ REINDEER_TRANSFORMATION_SPELL_ID,
110
+ reindeerTransformSpellId,
111
+ } from '../../../cmangos-special-cases-s18.ts';
112
+ import {
113
+ blackQirajiMountSpellId,
114
+ DRAIN_MANA_ERADICATOR_SPELL_ID,
115
+ DRAIN_MANA_ERADICATOR_TRIGGER_SPELL_ID,
116
+ DRAIN_MANA_NULLIFIER_SPELL_ID,
117
+ DRAIN_MANA_NULLIFIER_TRIGGER_SPELL_ID,
118
+ MERCURIAL_SHIELD_PEEL_SPELL_ID,
119
+ MERCURIAL_SHIELD_STACK_SPELL_ID,
120
+ ELUNES_CANDLE_SPELL_ID,
121
+ elunesCandleSpellId,
122
+ STINGER_CHARGE_MARK_26078_AURA_SPELL_ID,
123
+ STINGER_CHARGE_PRIMER_26080_SPELL_ID,
124
+ stingerChargePrimer26080SpellId,
125
+ SUMMON_BLACK_QIRAJI_BATTLE_TANK_SPELL_ID,
126
+ } from '../../../cmangos-special-cases-s19.ts';
127
+ import {
128
+ BONE_MAGE_SUMMON_SPELL_IDS,
129
+ BONE_MINION_SUMMON_SPELL_IDS,
130
+
131
+ FORGIVENESS_SPELL_ID,
132
+ FORGIVENESS_PERMANENT_FEIGN_DEATH_SPELL_ID,
133
+ CALL_OF_THE_ASHBRINGER_SPELL_ID,
134
+
135
+ INITIALIZE_TANK_SPELL_ID,
136
+ LAND_MINE_DETONATION_SPELL_ID,
137
+ LAND_MINE_PERIODIC_SPELL_ID,
138
+ LAND_MINE_TRIGGER_SPELL_ID,
139
+ RC_TANK_CONTROL_SPELL_ID,
140
+ STEAM_TANK_PASSIVE_SPELL_ID,
141
+ SUMMON_BONE_MAGES_SPELL_ID,
142
+ SUMMON_BONE_MINIONS_SPELL_ID,
143
+ } from '../../../cmangos-special-cases-s20.ts';
144
+ import {
145
+ ELEMENTAL_SHIELD_DUMMY_SPELL_ID,
146
+ ELEMENTAL_SHIELD_PAYLOAD_SPELL_IDS,
147
+ pickElementalShieldSpellId,
148
+ } from '../../../cmangos-special-cases-s23.ts';
149
+
150
+ // ── Spell ids ───────────────────────────────────────────────────────────────
151
+
152
+ // Create Healthstone ranks. CMaNGOS switches on spell id → item row. Cite: Warlock.cpp:161–172; scriptdev2
153
+ // spell.sql.
154
+ export const CREATE_HEALTHSTONE_SPELL_IDS = [6201, 6202, 5699, 11729, 11730] as const;
155
+
156
+ /** Improved Healthstone talent auras. Cite: Warlock.cpp:140–149. */
157
+ export const IMPROVED_HEALTHSTONE_RANK1_SPELL_ID = 18692;
158
+ export const IMPROVED_HEALTHSTONE_RANK2_SPELL_ID = 18693;
159
+
160
+ /** Transformation 7671 → CastSpell(24085) on unitTarget. Cite: SpellEffects.cpp:362-368 case 7671. */
161
+ export const TRANSFORMATION_SPELL_ID = 7671;
162
+ export const TRANSFORM_VISUAL_SPELL_ID = 24085;
163
+
164
+ // Burning Spirit dummy 13489 — unitTarget casts 14744 on self. Cite: SpellEffects.cpp:497-502 case 13489.
165
+ export const BURNING_SPIRIT_DUMMY_SPELL_ID = 13489;
166
+ export const BURNING_SPIRIT_BUFF_SPELL_ID = 14744;
167
+
168
+ // Soul Link cast (dummy). Pet aura 25228 via spell_pet_auras. Cite: mangos.sql spell_pet_auras
169
+ // (19028,0,25228); Warlock.cpp SoulLink on 25228.
170
+ export const SOUL_LINK_SPELL_ID = 19028;
171
+ /** Soul Link pet split / damage-pct holder. Cite: scriptdev2 spell.sql (25228,'spell_soul_link'). */
172
+ export const SOUL_LINK_PET_AURA_SPELL_ID = 25228;
173
+
174
+ /** Tame Beast dummy finish. Cite: Hunter.cpp TameBeastDummy; scriptdev2 spell.sql 13535. */
175
+ export const TAME_BEAST_DUMMY_SPELL_ID = 13535;
176
+ /** Tame Beast final apply. Cite: Hunter.cpp:38 CastSpell(…, 13481, …). */
177
+ export const TAME_BEAST_FINAL_SPELL_ID = 13481;
178
+
179
+ // Touch of Weakness intermediate dummy (single id — CMaNGOS case 28598). Apply-rank → payload rewrite also
180
+ // lives in proc.ts (play-surface path). Cite: SpellEffects.cpp:1340 case 28598.
181
+ export const TOUCH_OF_WEAKNESS_TRIGGER_SPELL_ID = TOUCH_OF_WEAKNESS_INTERMEDIATE_SPELL_ID;
182
+
183
+ // Shadowguard intermediate dummy (single id — scriptdev2 spell_shadowguard). Apply-rank → payload rewrite
184
+ // also lives in proc.ts. Cite: Priest.cpp Shadowguard; scriptdev2 spell.sql 28376.
185
+ export const SHADOWGUARD_PROC_SPELL_ID = SHADOWGUARD_INTERMEDIATE_SPELL_ID;
186
+
187
+ /** Summon mounts with empty SCRIPT_EFFECT secondary. Cite: game-data raw effect 77. */
188
+ export const MOUNT_SCRIPT_SPELL_IDS = [5784, 13819, 23161, 23214] as const;
189
+
190
+ /** City teleports — real work is TELEPORT_UNITS (5); SCRIPT_EFFECT empty. */
191
+ export const TELEPORT_CITY_SCRIPT_SPELL_IDS = [3561, 3562, 3563, 3565, 3566, 3567] as const;
192
+
193
+ // Improved Fire Ward talent ranks (dummy amount for Fire Ward absorb). CMaNGOS has no EffectDummy body —
194
+ // two talent ranks only. Cite: Mage.cpp FireWardMage.
195
+ export const IMPROVED_FIRE_WARD_SPELL_IDS = [11094, 13043] as const;
196
+
197
+ /** Frost Warding talent ranks (dummy e1 amount for Frost Ward absorb). Cite: Mage.cpp FrostWardMage. */
198
+ export const FROST_WARDING_SPELL_IDS = [11189, 28332] as const;
199
+
200
+ /** Riding skill dummies. Cite: game-data 33388 / 33391. */
201
+ export const RIDING_APPRENTICE_SPELL_ID = 33388;
202
+ export const RIDING_JOURNEYMAN_SPELL_ID = 33391;
203
+
204
+ /** zzOLD / unused junk — explicit no-op. Cite: game-data names; no EffectDummy body. */
205
+ export const ZZOLD_DUMMY_SPELL_IDS = [966, 2866, 2894, 2895] as const;
206
+
207
+ // ── Healthstone item table ────────────────────────────────────────────────── Cite: Warlock.cpp:152–172
208
+ // itypes[5][3] + switch on spell id. Rows: Minor / Lesser / Healthstone / Greater / Major × rank 0/1/2.
209
+
210
+ const HEALTHSTONE_ITEM_TYPES: ReadonlyArray<readonly [number, number, number]> = [
211
+ [5512, 19004, 19005], // Minor — spell 6201
212
+ [5511, 19006, 19007], // Lesser — spell 6202
213
+ [5509, 19008, 19009], // Healthstone — spell 5699
214
+ [5510, 19010, 19011], // Greater — spell 11729
215
+ [9421, 19012, 19013], // Major — spell 11730
216
+ ];
217
+
218
+ const HEALTHSTONE_SPELL_ROW: Readonly<Record<number, number>> = {
219
+ 6201: 0,
220
+ 6202: 1,
221
+ 5699: 2,
222
+ 11729: 3,
223
+ 11730: 4,
224
+ };
225
+
226
+ // Resolve healthstone item id from cast spell + Improved Healthstone rank. Cite: Warlock.cpp:130–174
227
+ // GetUsableHealthStoneItemType.
228
+ export function healthstoneItemType(spellId: number, rank: 0 | 1 | 2 = 0): number {
229
+ const row = HEALTHSTONE_SPELL_ROW[spellId | 0];
230
+ if (row == null) return 0;
231
+ const r = rank === 1 || rank === 2 ? rank : 0;
232
+ return HEALTHSTONE_ITEM_TYPES[row][r] | 0;
233
+ }
234
+
235
+ // The Improved Healthstone rank from spent talent points. The C++ scans for its two dummy auras, and
236
+ // the same ranks are stored on the character's talents here. Cite: Warlock.cpp:137-149.
237
+ export function improvedHealthstoneRankFromTalents(
238
+ spent: Readonly<Record<number, number>> | undefined | null,
239
+ talentLookup: (id: number) => { ranks?: ReadonlyArray<{ spellId?: number }> } | undefined | null,
240
+ knownAuraSpellIds?: ReadonlyArray<number> | null,
241
+ ): 0 | 1 | 2 {
242
+ // Prefer live auras (matches C++ GetAurasByType order: 18693 checked after 18692 with break).
243
+ if (knownAuraSpellIds?.length) {
244
+ if (knownAuraSpellIds.includes(IMPROVED_HEALTHSTONE_RANK2_SPELL_ID)) return 2;
245
+ if (knownAuraSpellIds.includes(IMPROVED_HEALTHSTONE_RANK1_SPELL_ID)) return 1;
246
+ }
247
+ if (!spent) return 0;
248
+ for (const [tidStr, rankRaw] of Object.entries(spent)) {
249
+ const tal = talentLookup(Number(tidStr));
250
+ if (!tal?.ranks?.length) continue;
251
+ const isImprovedHs = tal.ranks.some(
252
+ (r) =>
253
+ ((r.spellId ?? 0) | 0) === IMPROVED_HEALTHSTONE_RANK1_SPELL_ID
254
+ || ((r.spellId ?? 0) | 0) === IMPROVED_HEALTHSTONE_RANK2_SPELL_ID,
255
+ );
256
+ if (!isImprovedHs) continue;
257
+ const rank = rankRaw | 0;
258
+ if (rank >= 2) return 2;
259
+ if (rank >= 1) return 1;
260
+ return 0;
261
+ }
262
+ return 0;
263
+ }
264
+
265
+ // Soul Link bake surface: a 30% split on the pet aura, plus 3% damage for self and pet from the
266
+ // scripted talent row, over a 30 minute toggle window. Cite: game-data 19028; Unit.cpp absorb split.
267
+
268
+ const SOUL_LINK_DAMAGE_PCT = 3;
269
+ const SOUL_LINK_SPLIT_PCT = 30;
270
+ const SOUL_LINK_SCHOOL_MASK = 127;
271
+ const SOUL_LINK_DURATION_MS = 1_800_000;
272
+
273
+ // Riding mounted-speed bake surface. Cite: game-data 33388 pct 60 / 33391 pct 100; aura 32.
274
+ const RIDING_APPRENTICE_SPEED_PCT = 60;
275
+ const RIDING_JOURNEYMAN_SPEED_PCT = 100;
276
+ /** SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED. Cite: SpellAuraDefines.h. */
277
+ const AURA_MOD_INCREASE_MOUNTED_SPEED = 32;
278
+
279
+ // ── Handlers ────────────────────────────────────────────────────────────────
280
+
281
+ // Create Healthstone picks the item type by Improved Healthstone rank and creates it. The default rank
282
+ // matches the baked conjure item ids. Cite: Warlock.cpp:119-174.
283
+ const handleCreateHealthstone: RegistryHandler = (state, _raw, _slot) => {
284
+ const spellId = state.spell.id | 0;
285
+ const rank = (state.ctx.improvedHealthstoneRank ?? 0) as 0 | 1 | 2;
286
+ const item = healthstoneItemType(spellId, rank);
287
+ if (!item) return true; // unknown rank/spell — handled empty
288
+ // DoCreateItem count = max(1, amount); SCRIPT_EFFECT amount 0 → 1.
289
+ // Cite: SpellEffects.cpp DoCreateItem :1974–1975; Warlock.cpp:127 DoCreateItem.
290
+ state.effects.push({ kind: 'conjure', item, count: 1 });
291
+ return true;
292
+ };
293
+
294
+ // Soul Link's dummy has no per-id body: the work is the pet aura and its own script. Below: Burning
295
+ // Spirit casts its buff on the target, and the parent also kills the spirit itself.
296
+
297
+ /** Transformation 7671 → CastSpell(24085) on unitTarget. Cite: SpellEffects.cpp EffectDummy case 7671. */
298
+ const handleTransformation: RegistryHandler = (state, _raw, _slot) => {
299
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: TRANSFORM_VISUAL_SPELL_ID });
300
+ state.effects.push({ kind: 'trigger_spell', spellId: TRANSFORM_VISUAL_SPELL_ID });
301
+ return true;
302
+ };
303
+
304
+ const handleBurningSpiritDummy: RegistryHandler = (state, _raw, _slot) => {
305
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: BURNING_SPIRIT_BUFF_SPELL_ID });
306
+ // Push effects even when INSTAKILL already filled effects[] (finalizeInterpret
307
+ // only promotes intents when effects are empty).
308
+ state.effects.push({ kind: 'trigger_spell', spellId: BURNING_SPIRIT_BUFF_SPELL_ID });
309
+ return true;
310
+ };
311
+
312
+ const handleSoulLink: RegistryHandler = (state, _raw, _slot) => {
313
+ state.effects.push({
314
+ kind: 'buff',
315
+ mod: 'damage_done_pct',
316
+ amount: SOUL_LINK_DAMAGE_PCT,
317
+ durationMs: SOUL_LINK_DURATION_MS,
318
+ applyTo: 'self',
319
+ });
320
+ state.effects.push({
321
+ kind: 'buff',
322
+ mod: 'damage_done_pct',
323
+ amount: SOUL_LINK_DAMAGE_PCT,
324
+ durationMs: SOUL_LINK_DURATION_MS,
325
+ applyTo: 'pet',
326
+ });
327
+ state.effects.push({
328
+ kind: 'split_damage',
329
+ pct: SOUL_LINK_SPLIT_PCT,
330
+ schoolMask: SOUL_LINK_SCHOOL_MASK,
331
+ durationMs: SOUL_LINK_DURATION_MS,
332
+ });
333
+ // spell_pet_auras applies 25228 to pet when owner has 19028.
334
+ // Cite: mangos.sql:13629 (19028,0,25228).
335
+ state.intents.push({ kind: 'cast_spell', spellId: SOUL_LINK_PET_AURA_SPELL_ID });
336
+ return true;
337
+ };
338
+
339
+ // The Tame Beast dummy casts the tame on the channel's unit target.
340
+ // Cite: Hunter.cpp:33-40.
341
+ const handleTameBeastDummy: RegistryHandler = (state, _raw, _slot) => {
342
+ if (state.ctx.channelObjectIsUnit) {
343
+ state.intents.push({ kind: 'cast_spell', spellId: TAME_BEAST_FINAL_SPELL_ID });
344
+ } else {
345
+ // Standalone interpret (no channel) still "handles" the intermediate.
346
+ state.effects.push({ kind: 'script_handled_noop', spellId: TAME_BEAST_DUMMY_SPELL_ID } as never);
347
+ }
348
+ return true;
349
+ };
350
+
351
+ // The Touch of Weakness intermediate dummy, the runtime path when the trigger was not already
352
+ // rewritten: it switches on the triggering rank and casts the debuff. Cite: SpellEffects.cpp:1340.
353
+ const handleTouchOfWeaknessTrigger: RegistryHandler = (state, _raw, _slot) => {
354
+ const byAura = state.ctx.triggeredByAuraSpellId;
355
+ if (byAura == null) {
356
+ // Standalone: intermediate is empty without a triggering aura rank.
357
+ state.effects.push({ kind: 'script_handled_noop', spellId: TOUCH_OF_WEAKNESS_TRIGGER_SPELL_ID } as never);
358
+ return true;
359
+ }
360
+ const spellId = TOUCH_OF_WEAKNESS_TRIGGER[byAura];
361
+ if (spellId) {
362
+ state.intents.push({ kind: 'cast_spell', spellId });
363
+ }
364
+ return true;
365
+ };
366
+
367
+ // The Shadowguard intermediate dummy, the runtime path when the trigger was not already rewritten:
368
+ // it switches on the triggering rank and casts the damage. Cite: Priest.cpp:56-77.
369
+ const handleShadowguard: RegistryHandler = (state, _raw, _slot) => {
370
+ const byAura = state.ctx.triggeredByAuraSpellId;
371
+ if (byAura == null) {
372
+ state.effects.push({ kind: 'script_handled_noop', spellId: SHADOWGUARD_INTERMEDIATE_SPELL_ID } as never);
373
+ return true;
374
+ }
375
+ const spellId = SHADOWGUARD_TRIGGER[byAura];
376
+ if (spellId) {
377
+ state.intents.push({ kind: 'cast_spell', spellId });
378
+ }
379
+ return true;
380
+ };
381
+
382
+ // The mount script secondary has no switch body — the mount is its aura slots — so this is an honest
383
+ // handled no-op, which keeps the opcode from reading as unhandled.
384
+ const handleMountScriptNoop: RegistryHandler = (_state, _raw, _slot) => true;
385
+
386
+ // The city teleport script secondary is empty; the real teleport is its own effect.
387
+ // Cite: SpellEffects.cpp:1683 EffectTeleportUnits; mangos.sql spell_target_position.
388
+ const handleTeleportCityScriptNoop: RegistryHandler = (_state, _raw, _slot) => true;
389
+
390
+ // The Improved Fire Ward and Frost Warding talent dummies have no body: the absorb bonus is applied
391
+ // later when the ward calculates. A handled no-op, with the amount left on the row for that consumer.
392
+ const handleWardTalentDummy: RegistryHandler = (_state, _raw, _slot) => true;
393
+
394
+ // The riding skill dummies are empty and the skill step is its own effect, while the bake stamps the
395
+ // mounted-speed surface. Re-emitted here for the oracle. Cite: game-data 33388 and 33391.
396
+ const handleRidingDummy: RegistryHandler = (state, _raw, _slot) => {
397
+ const id = state.spell.id | 0;
398
+ const pct =
399
+ id === RIDING_JOURNEYMAN_SPELL_ID
400
+ ? RIDING_JOURNEYMAN_SPEED_PCT
401
+ : RIDING_APPRENTICE_SPEED_PCT;
402
+ state.effects.push({
403
+ kind: 'speed',
404
+ aura: AURA_MOD_INCREASE_MOUNTED_SPEED,
405
+ pct,
406
+ durationMs: 0,
407
+ hostile: false,
408
+ });
409
+ return true;
410
+ };
411
+
412
+ // zzOLD / unused DUMMY or SCRIPT_EFFECT — explicit handled no-op. Cite: game-data zzOLD* rows;
413
+ // SpellEffects.cpp EffectDummy fallthrough / no case.
414
+ const handleZzOldNoop: RegistryHandler = (_state, _raw, _slot) => true;
415
+
416
+ /** Deterministic [0,1) from interpret ctx.rng, else 0 (first table row). */
417
+ function roll01(state: { ctx: { rng?: (() => number) | { next?: () => number } } }): number {
418
+ const r = state.ctx.rng;
419
+ if (typeof r === 'function') return r();
420
+ if (r && typeof r.next === 'function') return r.next();
421
+ return 0;
422
+ }
423
+
424
+ /** Deviate Fish 8063 → random one of 8064–8068. Cite: SpellEffects.cpp:369–377. */
425
+ const handleDeviateFish: RegistryHandler = (state, _raw, _slot) => {
426
+ const spellId = pickDeviateFishOutcome(roll01(state));
427
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
428
+ return true;
429
+ };
430
+
431
+ /** Cooked Deviate Fish 8213 → ninja/pirate morph by gender. Cite: SpellEffects.cpp:380–386. */
432
+ const handleCookedDeviate: RegistryHandler = (state, _raw, _slot) => {
433
+ // Gender defaults male when ctx omits it (bake-thin / tests). Cite: getGender GENDER_MALE=0.
434
+ const male = state.ctx.casterGender !== 1;
435
+ const spellId = pickCookedDeviateOutcome(roll01(state), male);
436
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
437
+ return true;
438
+ };
439
+
440
+ function pickRandomCostumeOutcome(roll: number, male: boolean): number {
441
+ switch (roll) {
442
+ case 0: return male ? 24708 : 24709;
443
+ case 1: return male ? 24711 : 24710;
444
+ case 2: return male ? 24712 : 24713;
445
+ case 3: return 24723;
446
+ case 4: return 24732;
447
+ case 5: return male ? 24735 : 24736;
448
+ case 6: return 24740;
449
+ default: return 24723; // Fallback
450
+ }
451
+ }
452
+
453
+ /** Random Costume 24720 → urand(0,6) table. Cite: SpellEffects.cpp:3865–3898. */
454
+ const handleRandomCostume: RegistryHandler = (state, _raw, _slot) => {
455
+ if (state.ctx.unitTargetIsPlayer === false) return true;
456
+
457
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 7) : 0;
458
+ // Gender defaults male when ctx omits it (bake-thin / tests). Cite: getGender GENDER_MALE=0.
459
+ const male = state.ctx.unitTargetGender !== 1;
460
+ const spellId = pickRandomCostumeOutcome(roll, male);
461
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
462
+ return true;
463
+ };
464
+
465
+ /** Universal Remote 8344 → random 8345/8346/8347 on unitTarget. Cite: SpellEffects.cpp:389–397. */
466
+ const handleUniversalRemote: RegistryHandler = (state, _raw, _slot) => {
467
+ const spellId = pickUniversalRemoteOutcome(roll01(state));
468
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
469
+ return true;
470
+ };
471
+
472
+ /** Curse of the Eye dummy 3360 → gender transform 10651/10653. Cite: SpellEffects.cpp:355–360. */
473
+ const handleCurseOfTheEyeDummy: RegistryHandler = (state, _raw, _slot) => {
474
+ // Default male transform when target gender omitted. Cite: SpellEffects.cpp:358 GENDER_MALE.
475
+ const male = state.ctx.unitTargetGender !== 1;
476
+ const spellId = curseOfTheEyeTransformSpellId(male);
477
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
478
+ return true;
479
+ };
480
+
481
+ // Polly Eats the E.C.A.C. 9976 → CastSpell(9998) + ForcedDespawn(100). ForcedDespawn is world despawn (not
482
+ // a combat effect); intent is the summon payload. Cite: SpellEffects.cpp:419–426.
483
+ const handlePollyEatsEcac: RegistryHandler = (state, _raw, _slot) => {
484
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: POLLY_JR_SPELL_ID });
485
+ return true;
486
+ };
487
+
488
+ /** Six Demon Bag 14537 — roll table includes Frostbolt 11538. Cite: SpellEffects.cpp:522–541. */
489
+ const handleSixDemonBag: RegistryHandler = (state, _raw, _slot) => {
490
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 100) : 0;
491
+ const { spellId } = pickSixDemonBagOutcome(roll);
492
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
493
+ return true;
494
+ };
495
+
496
+ // Bending Shinbone 8856 SCRIPT_EFFECT: urand(1,5) → 8854 (1) else 8855. Cite: SpellEffects.cpp:3680–3694.
497
+ const handleBendingShinbone: RegistryHandler = (state, _raw, _slot) => {
498
+ const roll15 = state.ctx.rng ? 1 + Math.floor(state.ctx.rng() * 5) : 2;
499
+ const spellId = pickBendingShinboneOutcome(roll15);
500
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
501
+ return true;
502
+ };
503
+
504
+ /** Gnomish Shrink Ray 13006 — roll table of grow/shrink outcomes. Cite: SpellEffects.cpp:447–467. */
505
+ const handleShrinkRay: RegistryHandler = (state, _raw, _slot) => {
506
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 100) : 50;
507
+ const { spellId } = pickShrinkRayOutcome(roll);
508
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
509
+ return true;
510
+ };
511
+
512
+ /** Net-o-Matic 13120 — 2% self root / 2% charge root / else normal root. Cite: SpellEffects.cpp:469–482. */
513
+ const handleNetOMatic: RegistryHandler = (state, _raw, _slot) => {
514
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 100) : 50;
515
+ const spellId = pickNetOMaticOutcome(roll);
516
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
517
+ return true;
518
+ };
519
+
520
+ // Gnomish Mind Control Cap 13180 — urand(0,9); reverse on player when roll==1. Cite:
521
+ // SpellEffects.cpp:484–495.
522
+ const handleMindControlCap: RegistryHandler = (state, _raw, _slot) => {
523
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 10) : 2;
524
+ // Target type unknown at interpret time — treat as player for reverse chance path.
525
+ const outcome = pickMindControlCapOutcome(roll, true);
526
+ if (outcome) {
527
+ state.intents.push({
528
+ kind: outcome.reverse ? 'trigger_spell_as_unit_target' : 'cast_triggered_spell',
529
+ spellId: outcome.spellId,
530
+ });
531
+ }
532
+ return true;
533
+ };
534
+
535
+ // Voodoo 17009 — casts random spell from list on player target. Cite: SpellEffects.cpp:616-626.
536
+ const handleVoodoo: RegistryHandler = (state, _raw, _slot) => {
537
+ if (state.ctx.unitTargetIsPlayer !== false) {
538
+ const spellId = pickVoodooOutcome(roll01(state));
539
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
540
+ }
541
+ return true;
542
+ };
543
+
544
+ // Noggenfogger Elixir 16589 — equal pick of 16595/16593/16591. Also stamps trigger_spell so
545
+ // resolveCombatSpell / OOC consume see a non-empty effects[]. Cite: SpellEffects.cpp:606–614; KI-592.
546
+ const handleNoggenfogger: RegistryHandler = (state, _raw, _slot) => {
547
+ const spellId = pickNoggenfoggerOutcome(roll01(state));
548
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
549
+ state.effects.push({ kind: 'trigger_spell', spellId });
550
+ return true;
551
+ };
552
+
553
+ // Shadow Portal 17950 — uniform roll of 6 portal spells. Cite: SpellEffects.cpp:667-676.
554
+ const handleShadowPortalDummy: RegistryHandler = (state, _raw, _slot) => {
555
+ const spellId = pickShadowPortalOutcome(roll01(state));
556
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
557
+ state.effects.push({ kind: 'trigger_spell', spellId });
558
+ return true;
559
+ };
560
+
561
+ /** Test Fetid Skull 17271 — 50/50 create item 17269/17270. Cite: SpellEffects.cpp:642–648. */
562
+ const handleTestFetidSkull: RegistryHandler = (state, _raw, _slot) => {
563
+ const spellId = pickTestFetidSkullOutcome(roll01(state));
564
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
565
+ return true;
566
+ };
567
+
568
+ // Wolfshead Helm Energy 17770 — CastSpell(29940) energize 20 energy. Cite: SpellEffects.cpp:661–665;
569
+ // spell_template 29940 bp19 → 20.
570
+ const handleWolfsheadHelmEnergy: RegistryHandler = (state, _raw, _slot) => {
571
+ state.intents.push({
572
+ kind: 'cast_triggered_spell',
573
+ spellId: WOLFSHEAD_HELM_ENERGY_TRIGGER_SPELL_ID,
574
+ });
575
+ // The play surface is an instant energy restore, since this is an energize and not a periodic, so it
576
+ // is modelled as a one-tick restore to keep the effect list non-empty at resolve.
577
+ state.effects.push({
578
+ kind: 'restore_power',
579
+ amountPerTick: WOLFSHEAD_HELM_ENERGY_AMOUNT,
580
+ powerType: POWER_ENERGY,
581
+ tickMs: 0,
582
+ durationMs: 0,
583
+ });
584
+ return true;
585
+ };
586
+
587
+ // Knock Away SCRIPT_EFFECT family — modifyThreatPercent on unitTarget. Cite: SpellEffects.cpp:3695–3727
588
+ // case 10101/18813/18945/….
589
+ const handleKnockAwayScriptThreat: RegistryHandler = (state, _raw, _slot) => {
590
+ const pct = knockAwayScriptThreatPct(state.spell.id | 0);
591
+ if (pct == null) return true;
592
+ state.effects.push({ kind: 'modify_threat_pct', pct });
593
+ return true;
594
+ };
595
+
596
+ /** Lava Bomb 19411 — unitTarget casts 20494 (Summon Lava Bomb 1). Cite: SpellEffects.cpp:737–742. */
597
+ const handleLavaBomb: RegistryHandler = (state, _raw, _slot) => {
598
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: LAVA_BOMB_SUMMON_SPELL_ID });
599
+ // Play surface: trigger_spell so applySpell can fire when 20494 is in kit.
600
+ state.effects.push({ kind: 'trigger_spell', spellId: LAVA_BOMB_SUMMON_SPELL_ID });
601
+ return true;
602
+ };
603
+
604
+ /** Lava Bomb 20474 → 20495. Cite: SpellEffects.cpp:753–757. */
605
+ const handleLavaBomb2: RegistryHandler = (state, _raw, _slot) => {
606
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: LAVA_BOMB_SUMMON_2_SPELL_ID });
607
+ state.effects.push({ kind: 'trigger_spell', spellId: LAVA_BOMB_SUMMON_2_SPELL_ID });
608
+ return true;
609
+ };
610
+
611
+ // Elemental Shield 22276: strip 22277-22281, then self-cast one. Cite: SpellEffects.cpp:819-829. Consume
612
+ // effects must precede trigger_spell or applySpell peels the shield it just applied.
613
+ const handleElementalShield: RegistryHandler = (state, _raw, _slot) => {
614
+ const picked = pickElementalShieldSpellId(roll01(state));
615
+ // C++ RemoveAurasDueToSpell loop then CastSpell. Cite: SpellEffects.cpp:824-827.
616
+ for (const id of ELEMENTAL_SHIELD_PAYLOAD_SPELL_IDS) {
617
+ state.intents.push({
618
+ kind: 'consume_aura',
619
+ spellId: id,
620
+ spellFamilyName: 0,
621
+ spellFamilyFlags: 0,
622
+ auraType: 0,
623
+ });
624
+ state.effects.push({
625
+ kind: 'consume_aura',
626
+ spellId: id,
627
+ spellFamilyName: 0,
628
+ spellFamilyFlags: 0,
629
+ auraType: 0,
630
+ });
631
+ }
632
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: picked });
633
+ state.effects.push({ kind: 'trigger_spell', spellId: picked });
634
+ return true;
635
+ };
636
+
637
+ // Warrior's Wrath 21977 — CastSpell(21887) spellmod on unitTarget. Cite: SpellEffects.cpp:1319–1324;
638
+ // ClassicDB 21887 aura 107 bp-51 → −50, DurIndex 1 → 10s.
639
+ const handleWarriorsWrath: RegistryHandler = (state, _raw, _slot) => {
640
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: WARRIORS_WRATH_MOD_SPELL_ID });
641
+ // Play surface: SPELL_AURA_ADD_FLAT_MODIFIER all-effects −50 for 10s (next_cast_mod shape).
642
+ // Cite: SpellEffects.cpp:1322; spell_template 21887; schema next_cast_mod effectPct.
643
+ state.effects.push({
644
+ kind: 'next_cast_mod',
645
+ appliesTo: 'any',
646
+ effectPct: WARRIORS_WRATH_MOD_AMOUNT,
647
+ durationMs: WARRIORS_WRATH_MOD_DURATION_MS,
648
+ });
649
+ return true;
650
+ };
651
+
652
+ // Shadow Flame 22539 SCRIPT_EFFECT — CastSpell(22682) unless Onyxia Scale Cloak 22683. Cite:
653
+ // SpellEffects.cpp:3738–3761.
654
+ const handleShadowFlameScript: RegistryHandler = (state, _raw, _slot) => {
655
+ // GetDummyAura(22683) on unitTarget. Cite: SpellEffects.cpp:3756–3757.
656
+ const auras = state.ctx.targetAuras ?? [];
657
+ const hasCloak = auras.some((a) => (a.spellId | 0) === ONYXIA_SCALE_CLOAK_SPELL_ID);
658
+ if (!shadowFlameAppliesDot(hasCloak)) return true;
659
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: SHADOW_FLAME_DOT_SPELL_ID });
660
+ // Sourced DoT payload (22682 absent from live bake). Cite: ClassicDB 22682.
661
+ state.effects.push({
662
+ kind: 'dot',
663
+ school: 'shadow',
664
+ min: SHADOW_FLAME_DOT_AMOUNT,
665
+ max: SHADOW_FLAME_DOT_AMOUNT,
666
+ tickMs: SHADOW_FLAME_DOT_TICK_MS,
667
+ durationMs: SHADOW_FLAME_DOT_DURATION_MS,
668
+ });
669
+ return true;
670
+ };
671
+
672
+ // Engineering dragonling / battle chicken dummies → summon companion spell. Cite: SpellEffects.cpp:882–908
673
+ // (requires CastItem on C++; item path always here).
674
+ const handleEngineeringCompanionDummy: RegistryHandler = (state, _raw, _slot) => {
675
+ const summonId = engineeringCompanionSummonSpellId(state.spell.id | 0);
676
+ if (!summonId) return true;
677
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: summonId });
678
+ state.effects.push({ kind: 'trigger_spell', spellId: summonId });
679
+ return true;
680
+ };
681
+
682
+ const handleGoblinBomb: RegistryHandler = (state, _raw, _slot) => {
683
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 100) : 50;
684
+ // Goblin Bomb requires a target to malfunction upon. Without one, target defaults to player as unit?
685
+ // C++: target->CastSpell(caster, ...) vs caster->CastSpell(caster, ...).
686
+ const outcome = pickGoblinBombOutcome(roll);
687
+ state.intents.push({
688
+ kind: outcome.reverse ? 'trigger_spell_as_unit_target' : 'cast_triggered_spell',
689
+ spellId: outcome.spellId,
690
+ });
691
+ return true;
692
+ };
693
+
694
+ // Gnomish Transporter 23453 — urand(0,5) ? 23441 success : 23446 fail. Cite: SpellEffects.cpp:1041–1046.
695
+ const handleGnomishTransporter: RegistryHandler = (state, _raw, _slot) => {
696
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 6) : 1;
697
+ const spellId = gnomishTransporterOutcomeSpellId(roll);
698
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
699
+ state.effects.push({ kind: 'trigger_spell', spellId });
700
+ return true;
701
+ };
702
+
703
+ // Transporter Arrival (Gadgetzan + Everlook) 23450 — urand(0,5). 0 -> 23444, 1-2 -> 23445. Cite: SpellEffects.cpp:1031-1040.
704
+ const handleTransporterArrival: RegistryHandler = (state, _raw, _slot) => {
705
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 6) : 3;
706
+ const spellId = transporterArrivalOutcomeSpellId(roll);
707
+ if (spellId) {
708
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
709
+ state.effects.push({ kind: 'trigger_spell', spellId });
710
+ }
711
+ return true;
712
+ };
713
+
714
+ // Hourglass Sand 23645 — RemoveAurasDueToSpell(23170) Brood Affliction: Bronze. Lifted to effects[]
715
+ // consume_aura; applySpell peels live. Cite: SpellEffects.cpp:1048–1052.
716
+ const handleHourglassSand: RegistryHandler = (state, _raw, _slot) => {
717
+ state.intents.push({
718
+ kind: 'consume_aura',
719
+ spellId: BROOD_AFFLICTION_BRONZE_SPELL_ID,
720
+ spellFamilyName: 0,
721
+ spellFamilyFlags: 0,
722
+ auraType: 0,
723
+ });
724
+ return true;
725
+ };
726
+
727
+ // Gift of Life 23725 — basepoints = maxHealth * 0.15 → 23782 max-health + 23783 heal. Cite:
728
+ // SpellEffects.cpp:1054–1060.
729
+ const handleGiftOfLife: RegistryHandler = (state, _raw, _slot) => {
730
+ const maxHp = state.ctx.casterMaxHealth ?? state.ctx.targetMaxHealth ?? 0;
731
+ const bp = giftOfLifeBasepoints(maxHp);
732
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: GIFT_OF_LIFE_MAX_HEALTH_SPELL_ID });
733
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: GIFT_OF_LIFE_HEAL_SPELL_ID });
734
+ // Play surface when companions absent: flat heal + max_health buff for 20s.
735
+ // Cite: ClassicDB 23782 aura 34 DurIndex 18 → 20s; 23783 HEAL with custom bp.
736
+ if (bp > 0) {
737
+ state.effects.push({
738
+ kind: 'buff',
739
+ mod: 'max_health',
740
+ amount: bp,
741
+ durationMs: GIFT_OF_LIFE_MAX_HEALTH_DURATION_MS,
742
+ applyTo: 'self',
743
+ });
744
+ state.effects.push({
745
+ kind: 'heal',
746
+ min: bp,
747
+ max: bp,
748
+ });
749
+ }
750
+ return true;
751
+ };
752
+
753
+ // Axe Flurry 24019 — CastSpell(24020) when LOS (LOS always true in session). Cite:
754
+ // SpellEffects.cpp:1080–1085.
755
+ const handleAxeFlurry: RegistryHandler = (state, _raw, _slot) => {
756
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: AXE_FLURRY_DAMAGE_SPELL_ID });
757
+ state.effects.push({ kind: 'trigger_spell', spellId: AXE_FLURRY_DAMAGE_SPELL_ID });
758
+ return true;
759
+ };
760
+
761
+ /** Stinger Charge Primer 24150 — HasAura(25187) ? 25191 : 25190. Cite: SpellEffects.cpp:1087–1094. */
762
+ const handleStingerChargePrimer: RegistryHandler = (state, _raw, _slot) => {
763
+ const auras = state.ctx.targetAuras ?? [];
764
+ const hasMark = auras.some((a) => (a.spellId | 0) === STINGER_CHARGE_MARK_AURA_SPELL_ID);
765
+ const spellId = stingerChargePrimerSpellId(hasMark);
766
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
767
+ state.effects.push({ kind: 'trigger_spell', spellId });
768
+ return true;
769
+ };
770
+
771
+ /** Stinger Charge Primer 26080 — HasAura(26078) ? 26082 : 26081. Cite: SpellEffects.cpp:1133–1139. */
772
+ const handleStingerChargePrimer26080: RegistryHandler = (state, _raw, _slot) => {
773
+ const auras = state.ctx.targetAuras ?? [];
774
+ const hasMark = auras.some((a) => (a.spellId | 0) === STINGER_CHARGE_MARK_26078_AURA_SPELL_ID);
775
+ const spellId = stingerChargePrimer26080SpellId(hasMark);
776
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
777
+ state.effects.push({ kind: 'trigger_spell', spellId });
778
+ return true;
779
+ };
780
+
781
+ /** Poisonous Blood 24320 → CastSpell(24321) on unitTarget. Cite: SpellEffects.cpp:3804–3807. */
782
+ const handlePoisonousBlood: RegistryHandler = (state, _raw, _slot) => {
783
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: POISONOUS_BLOOD_CLOUD_SPELL_ID });
784
+ state.effects.push({ kind: 'trigger_spell', spellId: POISONOUS_BLOOD_CLOUD_SPELL_ID });
785
+ return true;
786
+ };
787
+
788
+ // Brittle Armor 24590 — peel one stack of 24575 (applySpell also peels live). Cite:
789
+ // SpellEffects.cpp:3809–3810 RemoveAuraHolderFromStack(24575).
790
+ const handleBrittleArmorPeel: RegistryHandler = (state, _raw, _slot) => {
791
+ state.intents.push({
792
+ kind: 'consume_aura',
793
+ spellId: BRITTLE_ARMOR_STACK_SPELL_ID,
794
+ spellFamilyName: 0,
795
+ spellFamilyFlags: 0,
796
+ auraType: 0,
797
+ stacks: 1,
798
+ });
799
+ return true;
800
+ };
801
+
802
+ /** Hallow's End Trick dummy — urand of 13 morphs. Cite: SpellEffects.cpp:3812–3836 case 24714. */
803
+ const handleHallowsEndTrick: RegistryHandler = (state, _raw, _slot) => {
804
+ if (state.ctx.casterIsPlayer === false) return true;
805
+ const spellId = pickHallowsEndTrickOutcome(roll01(state));
806
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
807
+ state.effects.push({ kind: 'trigger_spell', spellId });
808
+ return true;
809
+ };
810
+
811
+ /** Hallow's End Candy 24930 — equal pick of 24924–24927. Cite: SpellEffects.cpp:1176–1181. */
812
+ const handleHallowsEndCandy: RegistryHandler = (state, _raw, _slot) => {
813
+ const spellId = pickHallowsEndCandyOutcome(roll01(state));
814
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
815
+ state.effects.push({ kind: 'trigger_spell', spellId });
816
+ return true;
817
+ };
818
+
819
+
820
+ const handleReindeerTransformation: RegistryHandler = (state, _raw, _slot) => {
821
+ const auras = state.ctx.casterAuras ?? [];
822
+ const isMounted = auras.some((a) => (a.auraType | 0) === SPELL_AURA_MOUNTED);
823
+ if (isMounted) {
824
+ const runSpeed = state.ctx.casterRunSpeedRate ?? 1.0;
825
+ const spellId = reindeerTransformSpellId(runSpeed);
826
+ state.intents.push({
827
+ kind: 'consume_aura',
828
+ spellFamilyName: 0,
829
+ spellFamilyFlags: 0,
830
+ auraType: SPELL_AURA_MOUNTED
831
+ });
832
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
833
+ state.effects.push({ kind: 'trigger_spell', spellId });
834
+ }
835
+ return true;
836
+ };
837
+
838
+ // Drain Mana (Moam) 25676 — CastSpell(25671) on unitTarget. Mana-power gate is refuseCmangosCheckCast.
839
+ // Cite: SpellEffects.cpp:3951–3955.
840
+ const handleDrainManaMoam: RegistryHandler = (state, _raw, _slot) => {
841
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: DRAIN_MANA_MOAM_TRIGGER_SPELL_ID });
842
+ state.effects.push({ kind: 'trigger_spell', spellId: DRAIN_MANA_MOAM_TRIGGER_SPELL_ID });
843
+ return true;
844
+ };
845
+
846
+ /** Drain Mana Obsidian Eradicator 26457 → 25755. Cite: SpellEffects.cpp:3957–3961. */
847
+ const handleDrainManaEradicator: RegistryHandler = (state, _raw, _slot) => {
848
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: DRAIN_MANA_ERADICATOR_TRIGGER_SPELL_ID });
849
+ state.effects.push({ kind: 'trigger_spell', spellId: DRAIN_MANA_ERADICATOR_TRIGGER_SPELL_ID });
850
+ return true;
851
+ };
852
+
853
+ /** Drain Mana Obsidian Nullifier 26559 → 25671. Cite: SpellEffects.cpp:3951–3955. */
854
+ const handleDrainManaNullifier: RegistryHandler = (state, _raw, _slot) => {
855
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: DRAIN_MANA_NULLIFIER_TRIGGER_SPELL_ID });
856
+ state.effects.push({ kind: 'trigger_spell', spellId: DRAIN_MANA_NULLIFIER_TRIGGER_SPELL_ID });
857
+ return true;
858
+ };
859
+
860
+ // Mercurial Shield 26465 — peel one stack of 26464. Cite: SpellEffects.cpp:3989–3991
861
+ // RemoveAuraHolderFromStack(26464).
862
+ const handleMercurialShieldPeel: RegistryHandler = (state, _raw, _slot) => {
863
+ state.intents.push({
864
+ kind: 'consume_aura',
865
+ spellId: MERCURIAL_SHIELD_STACK_SPELL_ID,
866
+ spellFamilyName: 0,
867
+ spellFamilyFlags: 0,
868
+ auraType: 0,
869
+ stacks: 1,
870
+ });
871
+ return true;
872
+ };
873
+
874
+ // Black Qiraji Battle Tank 26656 — area 3428 → 25863 else 26655. Area from ctx.areaId when present; default
875
+ // world mount. Cite: item_scripts.cpp:248–264.
876
+ const handleBlackQirajiMount: RegistryHandler = (state, _raw, _slot) => {
877
+ const areaId = (state.ctx as { areaId?: number }).areaId ?? 0;
878
+ const spellId = blackQirajiMountSpellId(areaId);
879
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
880
+ state.effects.push({ kind: 'trigger_spell', spellId });
881
+ return true;
882
+ };
883
+
884
+ // Summon Bone Minions 27687 — cast four minion summon scripts on unitTarget. Cite:
885
+ // SpellEffects.cpp:4110–4119.
886
+ const handleSummonBoneMinions: RegistryHandler = (state, _raw, _slot) => {
887
+ for (const spellId of BONE_MINION_SUMMON_SPELL_IDS) {
888
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
889
+ state.effects.push({ kind: 'trigger_spell', spellId });
890
+ }
891
+ return true;
892
+ };
893
+
894
+ // Summon Bone Mages 27695 — cast four mage summon scripts on unitTarget. Cite: SpellEffects.cpp:4121–4130.
895
+ const handleSummonBoneMages: RegistryHandler = (state, _raw, _slot) => {
896
+ for (const spellId of BONE_MAGE_SUMMON_SPELL_IDS) {
897
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
898
+ state.effects.push({ kind: 'trigger_spell', spellId });
899
+ }
900
+ return true;
901
+ };
902
+
903
+ // Initialize Tank 27749 — RC Tank Control 24936 + Steam Tank Passive 27747. Cite:
904
+ // SpellEffects.cpp:1240–1247.
905
+ const handleInitializeTank: RegistryHandler = (state, _raw, _slot) => {
906
+ for (const spellId of [RC_TANK_CONTROL_SPELL_ID, STEAM_TANK_PASSIVE_SPELL_ID] as const) {
907
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
908
+ state.effects.push({ kind: 'trigger_spell', spellId });
909
+ }
910
+ return true;
911
+ };
912
+
913
+ // Land Mine Trigger 28000 — detonation 25099 + remove Land Mine Periodic 27999. Cite:
914
+ // SpellEffects.cpp:1230–1238.
915
+ const handleLandMineTrigger: RegistryHandler = (state, _raw, _slot) => {
916
+ state.intents.push({ kind: 'cast_triggered_spell', spellId: LAND_MINE_DETONATION_SPELL_ID });
917
+ state.effects.push({ kind: 'trigger_spell', spellId: LAND_MINE_DETONATION_SPELL_ID });
918
+ // Peel the maintain aura so the mine stops re-arming. Cite: :1236 RemoveAurasDueToSpell(27999).
919
+ state.intents.push({
920
+ kind: 'consume_aura',
921
+ spellId: LAND_MINE_PERIODIC_SPELL_ID,
922
+ spellFamilyName: 0,
923
+ spellFamilyFlags: 0,
924
+ auraType: 0,
925
+ });
926
+ return true;
927
+ };
928
+
929
+ // Call of the Ashbringer 28414 — PlayDirectSound only (no combat payload). Cite:
930
+ // SpellEffects.cpp:1249–1255.
931
+ const handleCallOfTheAshbringer: RegistryHandler = (_state, _raw, _slot) => {
932
+ // Emote/sound cosmetic — intentionally empty effects (disposition + mention).
933
+ return true;
934
+ };
935
+
936
+ // Forgiveness 28697 — CastSpell(29266) on unitTarget. Cite:
937
+ // SpellEffects.cpp:1257-1261.
938
+ const handleForgiveness: RegistryHandler = (state, _raw, _slot) => {
939
+ state.intents.push({ kind: 'trigger_spell_as_unit_target', spellId: FORGIVENESS_PERMANENT_FEIGN_DEATH_SPELL_ID });
940
+ state.effects.push({ kind: 'trigger_spell', spellId: FORGIVENESS_PERMANENT_FEIGN_DEATH_SPELL_ID });
941
+ return true;
942
+ };
943
+
944
+ const handleElunesCandle: RegistryHandler = (state) => {
945
+ const roll = state.ctx.rng ? Math.floor(state.ctx.rng() * 5) : 0;
946
+ // InterpretContext currently lacks a target entry field, so we default to 0.
947
+ // This safely guarantees the fallback to ELUNES_CANDLE_DEFAULT_SPELL_ID (26636).
948
+ const targetEntry = 0;
949
+ const spellId = elunesCandleSpellId(targetEntry, roll);
950
+ state.intents.push({ kind: 'cast_triggered_spell', spellId });
951
+ return true;
952
+ };
953
+
954
+ // ── Pack maps ───────────────────────────────────────────────────────────────
955
+
956
+ const dummy: Record<number, RegistryHandler> = {
957
+ [ELUNES_CANDLE_SPELL_ID]: handleElunesCandle,
958
+ [TRANSFORMATION_SPELL_ID]: handleTransformation,
959
+ [BURNING_SPIRIT_DUMMY_SPELL_ID]: handleBurningSpiritDummy,
960
+ [SOUL_LINK_SPELL_ID]: handleSoulLink,
961
+ [TAME_BEAST_DUMMY_SPELL_ID]: handleTameBeastDummy,
962
+ [TOUCH_OF_WEAKNESS_TRIGGER_SPELL_ID]: handleTouchOfWeaknessTrigger,
963
+ [SHADOWGUARD_PROC_SPELL_ID]: handleShadowguard,
964
+ [RIDING_APPRENTICE_SPELL_ID]: handleRidingDummy,
965
+ [RIDING_JOURNEYMAN_SPELL_ID]: handleRidingDummy,
966
+ [DEVIATE_FISH_SPELL_ID]: handleDeviateFish,
967
+ [COOKED_DEVIATE_FISH_SPELL_ID]: handleCookedDeviate,
968
+ [RANDOM_COSTUME_SPELL_ID]: handleRandomCostume,
969
+ [UNIVERSAL_REMOTE_SPELL_ID]: handleUniversalRemote,
970
+ [CURSE_OF_THE_EYE_DUMMY_SPELL_ID]: handleCurseOfTheEyeDummy,
971
+ [POLLY_EATS_ECAC_SPELL_ID]: handlePollyEatsEcac,
972
+ [SIX_DEMON_BAG_SPELL_ID]: handleSixDemonBag,
973
+ [SHRINK_RAY_SPELL_ID]: handleShrinkRay,
974
+ [NET_O_MATIC_SPELL_ID]: handleNetOMatic,
975
+ [GNOMISH_MIND_CONTROL_CAP_SPELL_ID]: handleMindControlCap,
976
+ [VOODOO_SPELL_ID]: handleVoodoo,
977
+ [NOGGENFOGGER_ELIXIR_SPELL_ID]: handleNoggenfogger,
978
+ [SHADOW_PORTAL_SPELL_ID]: handleShadowPortalDummy,
979
+ [TEST_FETID_SKULL_SPELL_ID]: handleTestFetidSkull,
980
+ [WOLFSHEAD_HELM_ENERGY_SPELL_ID]: handleWolfsheadHelmEnergy,
981
+ [LAVA_BOMB_SPELL_ID]: handleLavaBomb,
982
+ [LAVA_BOMB_20474_SPELL_ID]: handleLavaBomb2,
983
+ // Chromaggus school shield. Cite: SpellEffects.cpp:819-829 case 22276.
984
+ [ELEMENTAL_SHIELD_DUMMY_SPELL_ID]: handleElementalShield,
985
+ [WARRIORS_WRATH_SPELL_ID]: handleWarriorsWrath,
986
+ [ARCANITE_DRAGONLING_SPELL_ID]: handleEngineeringCompanionDummy,
987
+ [MITHRIL_MECHANICAL_DRAGONLING_SPELL_ID]: handleEngineeringCompanionDummy,
988
+ [MECHANICAL_DRAGONLING_SPELL_ID]: handleEngineeringCompanionDummy,
989
+ [GNOMISH_BATTLE_CHICKEN_SPELL_ID]: handleEngineeringCompanionDummy,
990
+ [GOBLIN_BOMB_SPELL_ID]: handleGoblinBomb,
991
+ [GNOMISH_TRANSPORTER_SPELL_ID]: handleGnomishTransporter,
992
+ [TRANSPORTER_ARRIVAL_SPELL_ID]: handleTransporterArrival,
993
+ [HOURGLASS_SAND_SPELL_ID]: handleHourglassSand,
994
+ [GIFT_OF_LIFE_SPELL_ID]: handleGiftOfLife,
995
+ [AXE_FLURRY_SPELL_ID]: handleAxeFlurry,
996
+ [STINGER_CHARGE_PRIMER_SPELL_ID]: handleStingerChargePrimer,
997
+ [STINGER_CHARGE_PRIMER_26080_SPELL_ID]: handleStingerChargePrimer26080,
998
+ [HALLOWS_END_TRICK_SPELL_ID]: handleHallowsEndTrick,
999
+ [HALLOWS_END_CANDY_SPELL_ID]: handleHallowsEndCandy,
1000
+ // Land Mine Trigger + Ashbringer are EffectDummy (3). Cite: SpellEffects.cpp:1230 / 1249.
1001
+ [LAND_MINE_TRIGGER_SPELL_ID]: handleLandMineTrigger,
1002
+ [CALL_OF_THE_ASHBRINGER_SPELL_ID]: handleCallOfTheAshbringer,
1003
+ [FORGIVENESS_SPELL_ID]: handleForgiveness,
1004
+ [REINDEER_TRANSFORMATION_SPELL_ID]: handleReindeerTransformation,
1005
+ };
1006
+
1007
+ for (const id of IMPROVED_FIRE_WARD_SPELL_IDS) {
1008
+ dummy[id] = handleWardTalentDummy;
1009
+ }
1010
+ for (const id of FROST_WARDING_SPELL_IDS) {
1011
+ dummy[id] = handleWardTalentDummy;
1012
+ }
1013
+ // zzOLD dummies (2866/2894/2895 are effect 3; 966 is script — see script map).
1014
+ for (const id of [2866, 2894, 2895] as const) {
1015
+ dummy[id] = handleZzOldNoop;
1016
+ }
1017
+
1018
+ const script: Record<number, RegistryHandler> = {};
1019
+ for (const id of CREATE_HEALTHSTONE_SPELL_IDS) {
1020
+ script[id] = handleCreateHealthstone;
1021
+ }
1022
+ for (const id of MOUNT_SCRIPT_SPELL_IDS) {
1023
+ script[id] = handleMountScriptNoop;
1024
+ }
1025
+ for (const id of TELEPORT_CITY_SCRIPT_SPELL_IDS) {
1026
+ script[id] = handleTeleportCityScriptNoop;
1027
+ }
1028
+ script[966] = handleZzOldNoop; // zzOLD Group Astral Recall
1029
+ script[BENDING_SHINBONE_SPELL_ID] = handleBendingShinbone;
1030
+ // Knock Away SCRIPT_EFFECT threat reduction family. Cite: SpellEffects.cpp:3695–3727.
1031
+ for (const id of [
1032
+ KNOCK_AWAY_10101_SPELL_ID,
1033
+ KNOCK_AWAY_18103_SPELL_ID,
1034
+ KNOCK_AWAY_18670_SPELL_ID,
1035
+ KNOCK_AWAY_18813_SPELL_ID,
1036
+ KNOCK_AWAY_18945_SPELL_ID,
1037
+ KNOCK_AWAY_19633_SPELL_ID,
1038
+ KNOCK_AWAY_20686_SPELL_ID,
1039
+ KNOCK_AWAY_22920_SPELL_ID,
1040
+ KNOCK_AWAY_23382_SPELL_ID,
1041
+ KNOCK_AWAY_25778_SPELL_ID,
1042
+ KNOCK_AWAY_30013_SPELL_ID,
1043
+ KNOCK_AWAY_30121_SPELL_ID,
1044
+ ] as const) {
1045
+ script[id] = handleKnockAwayScriptThreat;
1046
+ }
1047
+ script[SHADOW_FLAME_SPELL_ID] = handleShadowFlameScript;
1048
+ script[POISONOUS_BLOOD_SPELL_ID] = handlePoisonousBlood;
1049
+ script[BRITTLE_ARMOR_PEEL_SPELL_ID] = handleBrittleArmorPeel;
1050
+ script[DRAIN_MANA_MOAM_SPELL_ID] = handleDrainManaMoam;
1051
+ script[DRAIN_MANA_ERADICATOR_SPELL_ID] = handleDrainManaEradicator;
1052
+ script[DRAIN_MANA_NULLIFIER_SPELL_ID] = handleDrainManaNullifier;
1053
+ script[MERCURIAL_SHIELD_PEEL_SPELL_ID] = handleMercurialShieldPeel;
1054
+ script[SUMMON_BLACK_QIRAJI_BATTLE_TANK_SPELL_ID] = handleBlackQirajiMount;
1055
+ // Boss multi-summon SCRIPT_EFFECT. Cite: SpellEffects.cpp:4110–4130.
1056
+ script[SUMMON_BONE_MINIONS_SPELL_ID] = handleSummonBoneMinions;
1057
+ script[SUMMON_BONE_MAGES_SPELL_ID] = handleSummonBoneMages;
1058
+ // Darkmoon RC tank init. Cite: SpellEffects.cpp:1240–1247 case 27749.
1059
+ script[INITIALIZE_TANK_SPELL_ID] = handleInitializeTank;
1060
+
1061
+ export const dummyScriptTailPack: RegistryPack = {
1062
+ id: 'dummy-script-tail',
1063
+ dummy,
1064
+ script,
1065
+ };