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,1194 @@
1
+ // QI4 — scriptdev2 residual quest-script registry, keyed by family id and/or quest entry. Opcodes
2
+ // go through OPCODE_HANDLERS; this covers the accept and reward hooks that are not dbscript rows.
3
+
4
+ import type { DbScriptIntent } from './types.ts';
5
+ import type { DbScriptRow } from '../../../../data/schema.ts';
6
+ import {
7
+ NPC_FLAG_CHANGE_REMOVE,
8
+ UNIT_FLAG_CHANGE_REMOVE,
9
+ UNIT_STAND_STATE_STAND,
10
+ } from './opcodes.ts';
11
+ // Sibling family bodies (filesize ratchet — keep map under 1500 lines).
12
+ import { QUEST_MISSING_IN_ACTION, runRedridgeMountains } from './registryRedridge.ts';
13
+ import { QUEST_SUNTARA_STONES, runSearingGorge } from './registrySearingGorge.ts';
14
+ import { QUEST_ERLAND, QUEST_PYREWOOD_AMBUSH, runSilverpineForest } from './registrySilverpineForest.ts';
15
+ import {
16
+ QUEST_BEAT, QUEST_MISSING_DIPLO_PT8, QUEST_STORMWIND_RENDEZVOUS, QUEST_THE_GREAT_MASQUERADE, runStormwindCity,
17
+ } from './registryStormwindCity.ts';
18
+ import { QUEST_SAVING_YENNIKU, runStranglethornVale } from './registryStranglethornVale.ts';
19
+ import { QUEST_MEDALLION_FAITH, QUEST_RESTLESS_SOUL, runStratholmeScripts } from './registryStratholme.ts';
20
+ import {
21
+ QUEST_THE_CHARGE_OF_DRAGONFLIGHTS,
22
+ runSunkenTempleScripts,
23
+ } from './registrySunkenTemple.ts';
24
+ import { QUEST_GALENS_ESCAPE, runSwampOfSorrows } from './registrySwampOfSorrows.ts';
25
+ import { QUEST_590, QUEST_ULAG, runTirisfalGlades } from './registryTirisfalGlades.ts';
26
+ import {
27
+ QUEST_IN_DREAMS,
28
+ QUEST_SCARLET_SUBTERFUGE,
29
+ runWesternPlaguelands,
30
+ } from './registryWesternPlaguelands.ts';
31
+ import { QUEST_DEFIAS_BROTHERHOOD, QUEST_TOME_VALOR, runWestfall } from './registryWestfall.ts';
32
+ import { QUEST_MISSING_DIPLOMAT11, runWetlands } from './registryWetlands.ts';
33
+ import { SIBLING_REGISTRIES } from './registrySiblings.ts';
34
+ /** Hook phase for a registry entry. */
35
+ export type QuestScriptHook = 'accept' | 'reward' | 'complete' | 'frame';
36
+
37
+ // One scriptdev2 residual entry — pure behaviour description. Implementations emit intents (same vocabulary
38
+ // as opcode handlers where possible).
39
+ export interface QuestScriptEntry {
40
+ /** Family path e.g. `eastern_kingdoms/elwynn`. */
41
+ family?: string;
42
+ /** Primary quest id when entry is quest-keyed. */
43
+ questId?: number;
44
+ /** All quest ids covered when family-keyed. */
45
+ questIds?: number[];
46
+ /** Which C++ hooks were ported. */
47
+ hooks?: QuestScriptHook[];
48
+ /** Optional pre-authored dbscript-like rows for fixtures. */
49
+ rows?: DbScriptRow[];
50
+ // Pure hook body — returns intents for accept/reward. Deterministic — no wall clock / non-deterministic
51
+ // RNG.
52
+ run?: (phase: QuestScriptHook, questId: number) => DbScriptIntent[];
53
+ /** Source citation (CMaNGOS ScriptDevAI file:line). */
54
+ cite?: string;
55
+ }
56
+
57
+ // ── eastern_kingdoms/arathi_highlands sourced constants ──────────────────────
58
+ // Cite: arathi_highlands.cpp enums + Creature.h TemporaryFactionFlags + AIDefines.h
59
+
60
+ /** Cite: arathi_highlands.cpp:52 QUEST_SUNKEN_TREASURE */
61
+ const QUEST_SUNKEN_TREASURE = 665;
62
+ /** Cite: arathi_highlands.cpp:144 QUEST_HINTS_NEW_PLAGUE */
63
+ const QUEST_HINTS_NEW_PLAGUE = 660;
64
+ /** Cite: arathi_highlands.cpp:51 FACTION_BOOTY_BAY */
65
+ const FACTION_BOOTY_BAY = 120;
66
+ // Cite: Creature.h:577 TEMPFACTION_RESTORE_RESPAWN = 0x01 Used by QuestAccept_npc_professor_phizzlethorpe
67
+ // SetFactionTemporary.
68
+ const TEMPFACTION_RESTORE_RESPAWN = 0x01;
69
+ /** Cite: arathi_highlands.cpp:40 SAY_PROGRESS_1 = -1000264 */
70
+ const SAY_PROGRESS_1 = -1000264;
71
+ /** Cite: arathi_highlands.cpp:127 SAY_START = -1000948 */
72
+ const SAY_START = -1000948;
73
+ /** Cite: AIDefines.h:43 AI_EVENT_START_ESCORT = 100 */
74
+ const AI_EVENT_START_ESCORT = 100;
75
+ // Cite: Unit.h:477 UNIT_FLAG_IMMUNE_TO_NPC = 0x00000200 Kinelory ReceiveAIEvent removes this flag after
76
+ // escort start.
77
+ const UNIT_FLAG_IMMUNE_TO_NPC = 0x00000200;
78
+
79
+ // QuestAccept_npc_professor_phizzlethorpe — quest 665 Sunken Treasure: temporary Booty Bay faction,
80
+ // say, and escort start. Cite: arathi_highlands.cpp:103–114; WP21 credit at :84–88.
81
+ function runProfessorPhizzlethorpeAccept(): DbScriptIntent[] {
82
+ const citeFaction = 'arathi_highlands.cpp:107 SetFactionTemporary(FACTION_BOOTY_BAY, TEMPFACTION_RESTORE_RESPAWN)';
83
+ const citeTalk = 'arathi_highlands.cpp:108 DoScriptText(SAY_PROGRESS_1)';
84
+ const citeEscort = 'arathi_highlands.cpp:110–111 npc_escortAI::Start - FO6 degraded finishEscort';
85
+ return [
86
+ {
87
+ kind: 'set_faction',
88
+ factionId: FACTION_BOOTY_BAY,
89
+ flags: TEMPFACTION_RESTORE_RESPAWN,
90
+ cleared: false,
91
+ cite: citeFaction,
92
+ },
93
+ {
94
+ kind: 'talk',
95
+ textId: SAY_PROGRESS_1,
96
+ stringTemplateId: 0,
97
+ cite: citeTalk,
98
+ },
99
+ {
100
+ kind: 'skip',
101
+ reason: 'escort Start(false, player, quest, true) - FO6 degraded finishEscort',
102
+ cite: citeEscort,
103
+ },
104
+ ];
105
+ }
106
+
107
+ // QuestAccept_npc_kinelory — quest 660 Hints of a New Plague?: the AI event clears IMMUNE_TO_NPC,
108
+ // says the start line and begins the escort. Cite: arathi_highlands.cpp:248–254 and :204–212.
109
+ function runKineloryAccept(questId: number): DbScriptIntent[] {
110
+ const citeEvent =
111
+ 'arathi_highlands.cpp:251 SendAIEvent(AI_EVENT_START_ESCORT, player, creature, questId)';
112
+ const citeTalk = 'arathi_highlands.cpp:209 DoScriptText(SAY_START) via ReceiveAIEvent';
113
+ const citeFlags =
114
+ 'arathi_highlands.cpp:208,211 SetImmuneToNPC(false) / RemoveFlag(UNIT_FLAG_IMMUNE_TO_NPC)';
115
+ const citeEscort =
116
+ 'arathi_highlands.cpp:210 npc_escortAI::Start - FO6 degraded finishEscort';
117
+ // Creature starts with UNIT_FLAG_IMMUNE_TO_NPC; remove → result 0 when only that bit set.
118
+ const priorFlags = UNIT_FLAG_IMMUNE_TO_NPC;
119
+ const resultFlags = priorFlags & ~UNIT_FLAG_IMMUNE_TO_NPC;
120
+ return [
121
+ {
122
+ kind: 'send_ai_event',
123
+ eventType: AI_EVENT_START_ESCORT,
124
+ radius: 0,
125
+ value: questId,
126
+ mode: 'receive_on_source',
127
+ cite: citeEvent,
128
+ },
129
+ {
130
+ kind: 'talk',
131
+ textId: SAY_START,
132
+ stringTemplateId: 0,
133
+ cite: citeTalk,
134
+ },
135
+ {
136
+ kind: 'modify_unit_flags',
137
+ flag: UNIT_FLAG_IMMUNE_TO_NPC,
138
+ changeFlag: UNIT_FLAG_CHANGE_REMOVE,
139
+ mode: 'remove',
140
+ resultFlags,
141
+ cite: citeFlags,
142
+ },
143
+ {
144
+ kind: 'skip',
145
+ reason: 'escort Start(false, player, quest, true) - FO6 degraded finishEscort',
146
+ cite: citeEscort,
147
+ },
148
+ ];
149
+ }
150
+
151
+ // Family pack: eastern_kingdoms/arathi_highlands.cpp Hooks: pQuestAcceptNPC professor_phizzlethorpe (665),
152
+ // kinelory (660).
153
+ function runArathiHighlands(phase: QuestScriptHook, questId: number): DbScriptIntent[] {
154
+ if (phase !== 'accept') return [];
155
+ if (questId === QUEST_SUNKEN_TREASURE) return runProfessorPhizzlethorpeAccept();
156
+ if (questId === QUEST_HINTS_NEW_PLAGUE) return runKineloryAccept(questId);
157
+ return [];
158
+ }
159
+
160
+ // ── eastern_kingdoms/blackrock_depths/blackrock_depths sourced constants ─────
161
+ // Cite: blackrock_depths.cpp + ScriptDevAIMgr.h EscortFaction + Unit.h NPC flags
162
+
163
+ /** Cite: blackrock_depths.cpp:1151 QUEST_JAIL_BREAK */
164
+ const QUEST_JAIL_BREAK = 4322;
165
+ /** Cite: blackrock_depths.cpp:178 QUEST_THE_CHALLENGE */
166
+ const QUEST_THE_CHALLENGE = 9015;
167
+ /** Cite: blackrock_depths.cpp:704 QUEST_POTION_LOVE */
168
+ const QUEST_POTION_LOVE = 4201;
169
+ /** Cite: blackrock_depths.cpp:872 QUEST_ALE */
170
+ const QUEST_ALE = 4295;
171
+ // Cite: ScriptDevAIMgr.h:48 FACTION_ESCORT_A_NEUTRAL_ACTIVE = 231 Used by QuestAccept_npc_marshal_windsor
172
+ // SetFactionTemporary.
173
+ const FACTION_ESCORT_A_NEUTRAL_ACTIVE = 231;
174
+ /** Cite: Creature.h:577 TEMPFACTION_RESTORE_RESPAWN = 0x01 (shared with arathi — same enum). */
175
+ const TEMPFACTION_RESTORE_RESPAWN_BRD = TEMPFACTION_RESTORE_RESPAWN;
176
+ /** Cite: blackrock_depths.cpp:864 SAY_GOT_BEER = -1230000 */
177
+ const SAY_GOT_BEER = -1230000;
178
+ /** Cite: blackrock_depths.cpp:179 NPC_THELDREN_QUEST_CREDIT = 16166 */
179
+ const NPC_THELDREN_QUEST_CREDIT = 16166;
180
+ /** Cite: Unit.h:510 UNIT_NPC_FLAG_GOSSIP = 0x00000001 */
181
+ const UNIT_NPC_FLAG_GOSSIP = 0x00000001;
182
+ /** Cite: Unit.h:511 UNIT_NPC_FLAG_QUESTGIVER = 0x00000002 */
183
+ const UNIT_NPC_FLAG_QUESTGIVER = 0x00000002;
184
+
185
+ // QuestAccept_npc_marshal_windsor — quest 4322 Jail Break!: temporary escort faction and Start.
186
+ // Cite: blackrock_depths.cpp:1360–1372; WP58 explore credit at :1315–1321.
187
+ function runMarshalWindsorAccept(): DbScriptIntent[] {
188
+ const citeFaction =
189
+ 'blackrock_depths.cpp:1364 SetFactionTemporary(FACTION_ESCORT_A_NEUTRAL_ACTIVE, TEMPFACTION_RESTORE_RESPAWN)';
190
+ const citeEscort =
191
+ 'blackrock_depths.cpp:1366–1367 npc_escortAI::Start - FO6 degraded finishEscort';
192
+ return [
193
+ {
194
+ kind: 'set_faction',
195
+ factionId: FACTION_ESCORT_A_NEUTRAL_ACTIVE,
196
+ flags: TEMPFACTION_RESTORE_RESPAWN_BRD,
197
+ cleared: false,
198
+ cite: citeFaction,
199
+ },
200
+ {
201
+ kind: 'skip',
202
+ reason: 'escort Start(false, player, quest) - FO6 degraded finishEscort',
203
+ cite: citeEscort,
204
+ },
205
+ ];
206
+ }
207
+
208
+ // QuestRewarded_npc_mistress_nagmara — quest 4201: strip GOSSIP and QUESTGIVER on Nagmara,
209
+ // QUESTGIVER on Rocknot, then chase. Timed romance phases stay degraded. Cite: brd.cpp:837–850.
210
+ function runMistressNagmaraReward(): DbScriptIntent[] {
211
+ const citeGossip =
212
+ 'blackrock_depths.cpp:736 RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_GOSSIP)';
213
+ const citeQg =
214
+ 'blackrock_depths.cpp:737 RemoveFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)';
215
+ const citeRocknot =
216
+ 'blackrock_depths.cpp:738 pRocknot->RemoveFlag(UNIT_NPC_FLAG_QUESTGIVER)';
217
+ const citeChase =
218
+ 'blackrock_depths.cpp:740–742 MoveIdle/MoveChase Rocknot + phase=1 - instance romance FO6';
219
+ // Prior: GOSSIP|QUESTGIVER typical questgiver; sequential removes → 0.
220
+ const prior = UNIT_NPC_FLAG_GOSSIP | UNIT_NPC_FLAG_QUESTGIVER;
221
+ const afterGossip = prior & ~UNIT_NPC_FLAG_GOSSIP;
222
+ const afterQg = afterGossip & ~UNIT_NPC_FLAG_QUESTGIVER;
223
+ return [
224
+ {
225
+ kind: 'modify_npc_flags',
226
+ flag: UNIT_NPC_FLAG_GOSSIP,
227
+ changeFlag: NPC_FLAG_CHANGE_REMOVE,
228
+ mode: 'remove',
229
+ resultFlags: afterGossip,
230
+ cite: citeGossip,
231
+ },
232
+ {
233
+ kind: 'modify_npc_flags',
234
+ flag: UNIT_NPC_FLAG_QUESTGIVER,
235
+ changeFlag: NPC_FLAG_CHANGE_REMOVE,
236
+ mode: 'remove',
237
+ resultFlags: afterQg,
238
+ cite: citeQg,
239
+ },
240
+ {
241
+ kind: 'skip',
242
+ reason: 'Rocknot RemoveFlag(QUESTGIVER) - buddy creature host-side',
243
+ cite: citeRocknot,
244
+ },
245
+ {
246
+ kind: 'skip',
247
+ reason: 'MoveChase Rocknot + romance phase machine - instance FO6',
248
+ cite: citeChase,
249
+ },
250
+ ];
251
+ }
252
+
253
+ // QuestRewarded_npc_rocknot — quest 4295 Rocknot's Ale: face the player, say, emote timer and
254
+ // SetData SPECIAL. The instance early-out is omitted in the zone model. Cite: brd.cpp:1081–1107.
255
+ function runRocknotReward(): DbScriptIntent[] {
256
+ const citeFace = 'blackrock_depths.cpp:1096 SetFacingToObject(player)';
257
+ const citeTalk = 'blackrock_depths.cpp:1097 DoScriptText(SAY_GOT_BEER)';
258
+ const citeEmote =
259
+ 'blackrock_depths.cpp:1098–1099 m_uiEmoteTimer=1500 + instance SetData(SPECIAL) - AI/instance FO6';
260
+ return [
261
+ {
262
+ kind: 'skip',
263
+ reason: 'SetFacingToObject(player) - host resolves facing',
264
+ cite: citeFace,
265
+ },
266
+ {
267
+ kind: 'talk',
268
+ textId: SAY_GOT_BEER,
269
+ stringTemplateId: 0,
270
+ cite: citeTalk,
271
+ },
272
+ {
273
+ kind: 'skip',
274
+ reason: 'emote timer + TYPE_ROCKNOT SPECIAL - instance bar event FO6',
275
+ cite: citeEmote,
276
+ },
277
+ ];
278
+ }
279
+
280
+ // DoChallengeQuestCredit — quest 9015 The Challenge: kill credit for players still on it, fired
281
+ // when the gladiators die rather than from an accept hook. Cite: brd.cpp:298–307.
282
+ function runTheChallengeCredit(): DbScriptIntent[] {
283
+ const cite =
284
+ 'blackrock_depths.cpp:306 pPlayer->KilledMonsterCredit(NPC_THELDREN_QUEST_CREDIT)';
285
+ return [
286
+ {
287
+ kind: 'kill_credit',
288
+ creatureEntry: NPC_THELDREN_QUEST_CREDIT,
289
+ cite,
290
+ },
291
+ ];
292
+ }
293
+
294
+ // Family pack: eastern_kingdoms/blackrock_depths/blackrock_depths.cpp Hooks: QuestRewarded nagmara (4201),
295
+ // rocknot (4295); QuestAccept windsor (4322). Residual: DoChallengeQuestCredit (9015) on gladiator wipe.
296
+ function runBlackrockDepths(phase: QuestScriptHook, questId: number): DbScriptIntent[] {
297
+ if (phase === 'accept' && questId === QUEST_JAIL_BREAK) {
298
+ return runMarshalWindsorAccept();
299
+ }
300
+ if (phase === 'reward' && questId === QUEST_POTION_LOVE) {
301
+ return runMistressNagmaraReward();
302
+ }
303
+ if (phase === 'reward' && questId === QUEST_ALE) {
304
+ return runRocknotReward();
305
+ }
306
+ if (
307
+ (phase === 'frame' || phase === 'complete') &&
308
+ questId === QUEST_THE_CHALLENGE
309
+ ) {
310
+ return runTheChallengeCredit();
311
+ }
312
+ return [];
313
+ }
314
+
315
+ // ── eastern_kingdoms/blackwing_lair/boss_vaelastrasz sourced constants ───────
316
+ // Cite: boss_vaelastrasz.cpp + blackwing_lair.h + sc_instance.h EncounterState
317
+
318
+ /** Cite: boss_vaelastrasz.cpp:64 QUEST_NEFARIUS_CORRUPTION */
319
+ const QUEST_NEFARIUS_CORRUPTION = 8730;
320
+ // Cite: blackwing_lair.h:20 TYPE_QUEST_SCEPTER = 8 BWL encounter slot for the Scepter of the Shifting Sands
321
+ // epic (Red Shard).
322
+ const TYPE_QUEST_SCEPTER = 8;
323
+ // Cite: sc_instance.h:15 IN_PROGRESS = 1 EncounterState used by SetData(TYPE_QUEST_SCEPTER, IN_PROGRESS) on
324
+ // accept.
325
+ const ENCOUNTER_IN_PROGRESS = 1;
326
+
327
+ // QuestAccept_boss_vaelastrasz — quest 8730: sets TYPE_QUEST_SCEPTER IN_PROGRESS, which arms the
328
+ // scepter chain. Timed Nefarius taunts stay instance-side. Cite: boss_vaelastrasz.cpp:359–368.
329
+ function runVaelastraszAccept(): DbScriptIntent[] {
330
+ const citeSet =
331
+ 'boss_vaelastrasz.cpp:364 pInstance->SetData(TYPE_QUEST_SCEPTER, IN_PROGRESS)';
332
+ const citeTimer =
333
+ 'blackwing_lair.cpp:259–262 m_uiScepterEpicTimer=2000 + step=0; Update 5h taunts FO6';
334
+ return [
335
+ {
336
+ kind: 'set_instance_data',
337
+ type: TYPE_QUEST_SCEPTER,
338
+ data: ENCOUNTER_IN_PROGRESS,
339
+ cite: citeSet,
340
+ },
341
+ {
342
+ kind: 'skip',
343
+ reason:
344
+ 'TYPE_QUEST_SCEPTER IN_PROGRESS starts m_uiScepterEpicTimer=2000 + 5h Nefarius taunt Update - instance FO6',
345
+ cite: citeTimer,
346
+ },
347
+ ];
348
+ }
349
+
350
+ // Family pack: eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp Hooks: pQuestAcceptNPC
351
+ // QuestAccept_boss_vaelastrasz (8730).
352
+ function runBossVaelastrasz(phase: QuestScriptHook, questId: number): DbScriptIntent[] {
353
+ if (phase !== 'accept') return [];
354
+ if (questId === QUEST_NEFARIUS_CORRUPTION) return runVaelastraszAccept();
355
+ return [];
356
+ }
357
+
358
+ // ── eastern_kingdoms/burning_steppes sourced constants ───────────────────────
359
+ // Cite: burning_steppes.cpp npc_grark_lorkrub quest accept + escort end credit
360
+
361
+ // Cite: burning_steppes.cpp:72 QUEST_ID_PRECARIOUS_PREDICAMENT = 4121 Escort "Precarious Predicament" —
362
+ // accept starts npc_escortAI.
363
+ const QUEST_PRECARIOUS_PREDICAMENT = 4121;
364
+ // Cite: burning_steppes.cpp:66 NPC_GRARK_LORKRUB = 9520 Quest giver for 4121 after capture (quest 4122 /
365
+ // spell Capture Grark).
366
+ const NPC_GRARK_LORKRUB = 9520;
367
+
368
+ // QuestAccept_npc_grark_lorkrub — quest 4121 Precarious Predicament: the accept body is the escort
369
+ // Start alone; Lexlort's outro carries the explore credit. Cite: burning_steppes.cpp:324–335.
370
+ function runGrarkLorkrubAccept(): DbScriptIntent[] {
371
+ const citeEscort =
372
+ `burning_steppes.cpp:328–329 npc_grark_lorkrub (${NPC_GRARK_LORKRUB}) ` +
373
+ 'npc_escortAI::Start(false, player, quest) - FO6 degraded finishEscort';
374
+ const citeCredit =
375
+ 'burning_steppes.cpp:242–243 RewardPlayerAndGroupAtEventExplored(4121) at SAY_LEXLORT_4 - FO6 finishEscort';
376
+ return [
377
+ {
378
+ kind: 'skip',
379
+ reason:
380
+ 'escort Start(false, player, quest) - FO6 degraded finishEscort (ambush WPs + Lexlort outro)',
381
+ cite: citeEscort,
382
+ },
383
+ {
384
+ kind: 'skip',
385
+ reason:
386
+ 'escort end RewardPlayerAndGroupAtEventExplored(4121) - FO6 finishEscort models credit',
387
+ cite: citeCredit,
388
+ },
389
+ ];
390
+ }
391
+
392
+ // Family pack: eastern_kingdoms/burning_steppes.cpp Hooks: pQuestAcceptNPC QuestAccept_npc_grark_lorkrub
393
+ // (4121).
394
+ function runBurningSteppes(phase: QuestScriptHook, questId: number): DbScriptIntent[] {
395
+ if (phase !== 'accept') return [];
396
+ if (questId === QUEST_PRECARIOUS_PREDICAMENT) return runGrarkLorkrubAccept();
397
+ return [];
398
+ }
399
+
400
+ // ── eastern_kingdoms/eastern_plaguelands sourced constants ───────────────────
401
+ // Cite: eastern_plaguelands.cpp npc_eris_havenfire quest accept + balance event
402
+
403
+ // Cite: eastern_plaguelands.cpp:57 QUEST_BALANCE_OF_LIGHT_AND_SHADOW = 7622 Priest event: save 50 peasants
404
+ // before 15 are slain.
405
+ const QUEST_BALANCE_OF_LIGHT_AND_SHADOW = 7622;
406
+ // Cite: bake starterCreatureEntries / classic-db creature_questrelation Eris Havenfire (npc_eris_havenfire
407
+ // script name).
408
+ const NPC_ERIS_HAVENFIRE = 14494;
409
+ // Cite: eastern_plaguelands.cpp:61 MAX_SAVED_PEASANT = 50 Event-win threshold for
410
+ // AreaExploredOrEventHappens.
411
+ const MAX_SAVED_PEASANT = 50;
412
+ // Cite: eastern_plaguelands.cpp:60 MAX_KILLED_PEASANT = 15 FailQuest threshold during the balance event.
413
+ const MAX_KILLED_PEASANT = 15;
414
+ // Cite: Unit.h:511 UNIT_NPC_FLAG_QUESTGIVER = 0x00000002 DoStartBalanceEvent removes this so Eris is not
415
+ // re-accepted mid-event.
416
+ const UNIT_NPC_FLAG_QUESTGIVER_EPL = UNIT_NPC_FLAG_QUESTGIVER;
417
+
418
+ // QuestAccept_npc_eris_havenfire — quest 7622: clears QUESTGIVER and arms the balance event, which
419
+ // credits at 50 saved and fails at 15 killed. Cite: eastern_plaguelands.cpp:345–354, :227–244.
420
+ function runErisHavenfireAccept(): DbScriptIntent[] {
421
+ const citeQg =
422
+ `eastern_plaguelands.cpp:229 DoStartBalanceEvent RemoveFlag(UNIT_NPC_FLAG_QUESTGIVER) ` +
423
+ `npc_eris_havenfire (${NPC_ERIS_HAVENFIRE})`;
424
+ const citeStart =
425
+ 'eastern_plaguelands.cpp:231–232 m_uiEventTimer=5000 + m_uiArcherCheckTargetTimer=2000; ' +
426
+ 'UpdateAI waves/archers/footsoldiers FO6';
427
+ const citeWin =
428
+ `eastern_plaguelands.cpp:238 AreaExploredOrEventHappens(7622) at ${MAX_SAVED_PEASANT} saved - FO6 finishEscort`;
429
+ const citeFail =
430
+ `eastern_plaguelands.cpp:169 FailQuest(7622) at ${MAX_KILLED_PEASANT} slain - host fail FO6`;
431
+ // Reset() sets QUESTGIVER; accept removes that bit → 0 when only that flag is set.
432
+ const prior = UNIT_NPC_FLAG_QUESTGIVER_EPL;
433
+ const resultFlags = prior & ~UNIT_NPC_FLAG_QUESTGIVER_EPL;
434
+ return [
435
+ {
436
+ kind: 'modify_npc_flags',
437
+ flag: UNIT_NPC_FLAG_QUESTGIVER_EPL,
438
+ changeFlag: NPC_FLAG_CHANGE_REMOVE,
439
+ mode: 'remove',
440
+ resultFlags,
441
+ cite: citeQg,
442
+ },
443
+ {
444
+ kind: 'skip',
445
+ reason:
446
+ 'DoStartBalanceEvent timers + peasant/scourge wave AI - zone combat FO6',
447
+ cite: citeStart,
448
+ },
449
+ {
450
+ kind: 'skip',
451
+ reason:
452
+ `event end AreaExploredOrEventHappens(7622) at ${MAX_SAVED_PEASANT} saved - FO6 finishEscort`,
453
+ cite: citeWin,
454
+ },
455
+ {
456
+ kind: 'skip',
457
+ reason:
458
+ `event fail FailQuest(7622) at ${MAX_KILLED_PEASANT} slain - host fail FO6`,
459
+ cite: citeFail,
460
+ },
461
+ ];
462
+ }
463
+
464
+ // Family pack: eastern_kingdoms/eastern_plaguelands.cpp Hooks: pQuestAcceptNPC
465
+ // QuestAccept_npc_eris_havenfire (7622).
466
+ function runEasternPlaguelands(phase: QuestScriptHook, questId: number): DbScriptIntent[] {
467
+ if (phase !== 'accept') return [];
468
+ if (questId === QUEST_BALANCE_OF_LIGHT_AND_SHADOW) return runErisHavenfireAccept();
469
+ return [];
470
+ }
471
+
472
+ // ── eastern_kingdoms/gnomeregan/gnomeregan sourced constants ─────────────────
473
+ // Cite: gnomeregan.cpp npc_kernobee quest accept + FollowerAI end credit
474
+
475
+ /** Cite: gnomeregan.cpp:639 QUEST_A_FINE_MESS = 2904 Escort Kernobee out of Gnomeregan ("A Fine Mess"). */
476
+ const QUEST_A_FINE_MESS = 2904;
477
+ // Cite: scriptdev2.sql ScriptName='npc_kernobee' WHERE entry=7850 Bake starterCreatureEntries[0]=7850
478
+ // (Kernobee).
479
+ const NPC_KERNOBEE = 7850;
480
+ /** Cite: AIDefines.h:45 AI_EVENT_START_EVENT = 102 QuestAccept_npc_kernobee SendAIEvent event type. */
481
+ const AI_EVENT_START_EVENT = 102;
482
+ // Cite: Unit.h:97 UNIT_STAND_STATE_STAND = 0 ReceiveAIEvent stands Kernobee (UDB often ships him
483
+ // UNIT_STAND_STATE_DEAD=7). opcodes.ts UNIT_STAND_STATE_STAND re-export used below.
484
+ const UNIT_STAND_STATE_STAND_KERNOBEE = UNIT_STAND_STATE_STAND;
485
+ // Cite: gnomeregan.cpp:643–647 aKernobeePositions [0] end check {-330.92, -3.03, -152.85}; [1] door walkout
486
+ // {-297.32, -7.32, -152.85}. Zone-granular FO6 — coordinates documented, not simulated.
487
+ const KERNOBEE_END_POS = { x: -330.92, y: -3.03, z: -152.85 } as const;
488
+ /** Cite: gnomeregan.cpp:687 ForcedDespawn(2000) after end-pos credit. */
489
+ const KERNOBEE_DESPAWN_MS = 2000;
490
+
491
+ // QuestAccept_npc_kernobee — quest 2904 A Fine Mess: stand, then follow the player; reaching the
492
+ // exit gives the explore credit. Cite: gnomeregan.cpp:700–706, :661–687.
493
+ function runKernobeeAccept(questId: number): DbScriptIntent[] {
494
+ const citeEvent =
495
+ `gnomeregan.cpp:703 npc_kernobee (${NPC_KERNOBEE}) ` +
496
+ 'SendAIEvent(AI_EVENT_START_EVENT, player, creature, questId)';
497
+ const citeStand =
498
+ 'gnomeregan.cpp:666 SetStandState(UNIT_STAND_STATE_STAND) via ReceiveAIEvent';
499
+ const citeFollow =
500
+ 'gnomeregan.cpp:667 StartFollow(player, 0, quest) - FO6 degraded FollowerAI finishEscort';
501
+ const citeCredit =
502
+ `gnomeregan.cpp:681–687 end-pos (${KERNOBEE_END_POS.x},${KERNOBEE_END_POS.y},${KERNOBEE_END_POS.z}) ` +
503
+ `RewardPlayerAndGroupAtEventExplored(2904) + ForcedDespawn(${KERNOBEE_DESPAWN_MS}) - FO6 finishEscort`;
504
+ return [
505
+ {
506
+ kind: 'send_ai_event',
507
+ eventType: AI_EVENT_START_EVENT,
508
+ radius: 0,
509
+ value: questId,
510
+ mode: 'receive_on_source',
511
+ cite: citeEvent,
512
+ },
513
+ {
514
+ kind: 'stand_state',
515
+ standState: UNIT_STAND_STATE_STAND_KERNOBEE,
516
+ cite: citeStand,
517
+ },
518
+ {
519
+ kind: 'skip',
520
+ reason:
521
+ 'StartFollow(player, 0, quest) - FO6 degraded FollowerAI finishEscort (Clockwerk Run)',
522
+ cite: citeFollow,
523
+ },
524
+ {
525
+ kind: 'skip',
526
+ reason:
527
+ `end-pos RewardPlayerAndGroupAtEventExplored(2904) + MovePoint door + ForcedDespawn(${KERNOBEE_DESPAWN_MS}) - FO6 finishEscort`,
528
+ cite: citeCredit,
529
+ },
530
+ ];
531
+ }
532
+
533
+ // Family pack: eastern_kingdoms/gnomeregan/gnomeregan.cpp Hooks: pQuestAcceptNPC QuestAccept_npc_kernobee
534
+ // (2904). (npc_blastmaster_emi_shortfuse is instance encounter gossip — not a quest hook.)
535
+ function runGnomeregan(phase: QuestScriptHook, questId: number): DbScriptIntent[] {
536
+ if (phase !== 'accept') return [];
537
+ if (questId === QUEST_A_FINE_MESS) return runKernobeeAccept(questId);
538
+ return [];
539
+ }
540
+
541
+ // ── eastern_kingdoms/hinterlands sourced constants ───────────────────────────
542
+ // Cite: hinterlands.cpp npc_00x09hl + npc_rinji quest accept escorts
543
+
544
+ // Cite: hinterlands.cpp:49 QUEST_RESQUE_OOX_09 = 836 Escort Homing Robot OOX-09/HL ("Rescue OOX-09/HL!").
545
+ const QUEST_RESQUE_OOX_09 = 836;
546
+ // Cite: hinterlands.cpp:182 QUEST_RINJI_TRAPPED = 2742 Escort Rin'ji from Quel'Danil Lodge ("Rin'ji is
547
+ // Trapped!").
548
+ const QUEST_RINJI_TRAPPED = 2742;
549
+ // Cite: bake starterCreatureEntries / classic-db creature_questrelation Homing Robot OOX-09/HL (npc_00x09hl
550
+ // script name).
551
+ const NPC_OOX_09_HL = 7806;
552
+ /** Cite: bake starterCreatureEntries — Rin'ji (npc_rinji). */
553
+ const NPC_RINJI = 7780;
554
+ /** Cite: hinterlands.cpp:43 SAY_OOX_START = -1000287 DoScriptText on OOX accept. */
555
+ const SAY_OOX_START = -1000287;
556
+ // Cite: ScriptDevAIMgr.h:53 FACTION_ESCORT_N_FRIEND_ACTIVE = 495 QuestAccept_npc_00x09hl
557
+ // SetFactionTemporary.
558
+ const FACTION_ESCORT_N_FRIEND_ACTIVE = 495;
559
+ // Cite: Creature.h:577 TEMPFACTION_RESTORE_RESPAWN = 0x01 (shared enum — same value as arathi
560
+ // TEMPFACTION_RESTORE_RESPAWN).
561
+ const TEMPFACTION_RESTORE_RESPAWN_HL = TEMPFACTION_RESTORE_RESPAWN;
562
+ // Cite: Creature.h:582 TEMPFACTION_TOGGLE_IMMUNE_TO_NPC = 0x20 Combined with RESTORE_RESPAWN in OOX
563
+ // SetFactionTemporary flags.
564
+ const TEMPFACTION_TOGGLE_IMMUNE_TO_NPC = 0x20;
565
+ // Cite: hinterlands.cpp:155 TEMPFACTION_RESTORE_RESPAWN | TEMPFACTION_TOGGLE_IMMUNE_TO_NPC = 0x01 | 0x20 =
566
+ // 0x21
567
+ const OOX_TEMP_FACTION_FLAGS =
568
+ TEMPFACTION_RESTORE_RESPAWN_HL | TEMPFACTION_TOGGLE_IMMUNE_TO_NPC;
569
+ // Cite: Unit.h:97 UNIT_STAND_STATE_STAND = 0 OOX Reset() ships DEAD; accept stands him. opcodes.ts
570
+ // re-export.
571
+ const UNIT_STAND_STATE_STAND_OOX = UNIT_STAND_STATE_STAND;
572
+ /** Cite: hinterlands.cpp:185 GO_RINJI_CAGE = 142036 Accept opens nearest cage via UseDoorOrButton. */
573
+ const GO_RINJI_CAGE = 142036;
574
+ // Cite: Unit.h:477 UNIT_FLAG_IMMUNE_TO_NPC = 0x00000200 QuestAccept_npc_rinji removes this after escort
575
+ // Start.
576
+ const UNIT_FLAG_IMMUNE_TO_NPC_HL = 0x00000200;
577
+
578
+ // QuestAccept_npc_00x09hl — quest 836 Rescue OOX-09/HL!: say, stand, temporary escort faction and
579
+ // Start; WP65 carries the explore credit. Cite: hinterlands.cpp:148–161 and :81–85.
580
+ function runOox09hlAccept(): DbScriptIntent[] {
581
+ const citeTalk =
582
+ `hinterlands.cpp:152 npc_00x09hl (${NPC_OOX_09_HL}) DoScriptText(SAY_OOX_START)`;
583
+ const citeActive = 'hinterlands.cpp:153 SetActiveObjectState(true)';
584
+ const citeStand = 'hinterlands.cpp:154 SetStandState(UNIT_STAND_STATE_STAND)';
585
+ const citeFaction =
586
+ 'hinterlands.cpp:155 SetFactionTemporary(FACTION_ESCORT_N_FRIEND_ACTIVE, ' +
587
+ 'TEMPFACTION_RESTORE_RESPAWN | TEMPFACTION_TOGGLE_IMMUNE_TO_NPC)';
588
+ const citeEscort =
589
+ 'hinterlands.cpp:157–158 npc_escortAI::Start(false, player, quest) - FO6 degraded finishEscort';
590
+ const citeCredit =
591
+ 'hinterlands.cpp:83–84 RewardPlayerAndGroupAtEventExplored(836) at WP65 - FO6 finishEscort';
592
+ return [
593
+ {
594
+ kind: 'talk',
595
+ textId: SAY_OOX_START,
596
+ stringTemplateId: 0,
597
+ cite: citeTalk,
598
+ },
599
+ {
600
+ kind: 'set_active_object',
601
+ active: true,
602
+ cite: citeActive,
603
+ },
604
+ {
605
+ kind: 'stand_state',
606
+ standState: UNIT_STAND_STATE_STAND_OOX,
607
+ cite: citeStand,
608
+ },
609
+ {
610
+ kind: 'set_faction',
611
+ factionId: FACTION_ESCORT_N_FRIEND_ACTIVE,
612
+ flags: OOX_TEMP_FACTION_FLAGS,
613
+ cleared: false,
614
+ cite: citeFaction,
615
+ },
616
+ {
617
+ kind: 'skip',
618
+ reason:
619
+ 'escort Start(false, player, quest) - FO6 degraded finishEscort (ambush WPs + OOX end)',
620
+ cite: citeEscort,
621
+ },
622
+ {
623
+ kind: 'skip',
624
+ reason:
625
+ 'escort end RewardPlayerAndGroupAtEventExplored(836) - FO6 finishEscort models credit',
626
+ cite: citeCredit,
627
+ },
628
+ ];
629
+ }
630
+
631
+ // QuestAccept_npc_rinji — quest 2742 Rin'ji is Trapped!: open the cage, clear IMMUNE_TO_NPC and
632
+ // start the escort; WP18 carries the credit. Cite: hinterlands.cpp:338–351 and :287–291.
633
+ function runRinjiAccept(): DbScriptIntent[] {
634
+ const citeCage =
635
+ `hinterlands.cpp:342–343 GetClosestGameObjectWithEntry(GO_RINJI_CAGE=${GO_RINJI_CAGE}) ` +
636
+ 'UseDoorOrButton - host GO activation';
637
+ const citeEscort =
638
+ `hinterlands.cpp:345–346 npc_rinji (${NPC_RINJI}) npc_escortAI::Start(false, player, quest) - FO6 degraded finishEscort`;
639
+ const citeFlags =
640
+ 'hinterlands.cpp:348 RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC)';
641
+ const citeCredit =
642
+ 'hinterlands.cpp:288–289 RewardPlayerAndGroupAtEventExplored(2742) at WP18 - FO6 finishEscort';
643
+ // Cage creature ships immune; remove → 0 when only that bit set.
644
+ const priorFlags = UNIT_FLAG_IMMUNE_TO_NPC_HL;
645
+ const resultFlags = priorFlags & ~UNIT_FLAG_IMMUNE_TO_NPC_HL;
646
+ return [
647
+ {
648
+ kind: 'skip',
649
+ reason: `UseDoorOrButton on GO_RINJI_CAGE (${GO_RINJI_CAGE}) - host GO activation`,
650
+ cite: citeCage,
651
+ },
652
+ {
653
+ kind: 'skip',
654
+ reason:
655
+ 'escort Start(false, player, quest) - FO6 degraded finishEscort (ambush WPs + Rinji complete)',
656
+ cite: citeEscort,
657
+ },
658
+ {
659
+ kind: 'modify_unit_flags',
660
+ flag: UNIT_FLAG_IMMUNE_TO_NPC_HL,
661
+ changeFlag: UNIT_FLAG_CHANGE_REMOVE,
662
+ mode: 'remove',
663
+ resultFlags,
664
+ cite: citeFlags,
665
+ },
666
+ {
667
+ kind: 'skip',
668
+ reason:
669
+ 'escort end RewardPlayerAndGroupAtEventExplored(2742) - FO6 finishEscort models credit',
670
+ cite: citeCredit,
671
+ },
672
+ ];
673
+ }
674
+
675
+ // Family pack: eastern_kingdoms/hinterlands.cpp Hooks: pQuestAcceptNPC QuestAccept_npc_00x09hl (836),
676
+ // QuestAccept_npc_rinji (2742).
677
+ function runHinterlands(phase: QuestScriptHook, questId: number): DbScriptIntent[] {
678
+ if (phase !== 'accept') return [];
679
+ if (questId === QUEST_RESQUE_OOX_09) return runOox09hlAccept();
680
+ if (questId === QUEST_RINJI_TRAPPED) return runRinjiAccept();
681
+ return [];
682
+ }
683
+
684
+ // ── eastern_kingdoms/loch_modan sourced constants ────────────────────────────
685
+ // Cite: loch_modan.cpp npc_miran quest accept escort
686
+
687
+ // Cite: loch_modan.cpp:39 QUEST_PROTECTING_THE_SHIPMENT = 309 Escort Miran from Thelsamar to Ironband's
688
+ // Excavation ("Protecting the Shipment").
689
+ const QUEST_PROTECTING_THE_SHIPMENT = 309;
690
+ /** Cite: bake starterCreatureEntries / classic-db creature_questrelation Miran (npc_miran script name). */
691
+ const NPC_MIRAN = 1379;
692
+ /** Cite: loch_modan.cpp:48 MIRAN_ESCORT_PATH = 1379 Path id passed to npc_escortAI::Start on accept. */
693
+ const MIRAN_ESCORT_PATH = 1379;
694
+ // Cite: loch_modan.cpp:46 NPC_DARK_IRON_RAIDER = 2149 Ambush summons at escort WP17 (not accept-hook — FO6
695
+ // zone).
696
+ const NPC_DARK_IRON_RAIDER = 2149;
697
+ /** Cite: loch_modan.cpp:94 ForcedDespawn(15000) at WP21 after explore credit. */
698
+ const MIRAN_DESPAWN_MS = 15000;
699
+ // Cite: loch_modan.cpp:41–43 SAY_MIRAN_1/2/3 (broadcast_text) — waypoint talk, not accept-hook. Documented
700
+ // for whole-chain mapping.
701
+ const SAY_MIRAN_1 = 510;
702
+ const SAY_MIRAN_2 = 511;
703
+ const SAY_MIRAN_3 = 498;
704
+
705
+ // QuestAccept_npc_miran — quest 309 Protecting the Shipment: escort path 1379, with the WP21
706
+ // explore credit and a WP17 ambush. Cite: loch_modan.cpp:123–131 and :77–120.
707
+ function runMiranAccept(): DbScriptIntent[] {
708
+ const citeEscort =
709
+ `loch_modan.cpp:127–128 npc_miran (${NPC_MIRAN}) npc_escortAI::Start(` +
710
+ `false, player, quest, false, false, MIRAN_ESCORT_PATH=${MIRAN_ESCORT_PATH}) - FO6 degraded finishEscort`;
711
+ const citeAmbush =
712
+ `loch_modan.cpp:84–87 WP17 SummonCreature(NPC_DARK_IRON_RAIDER=${NPC_DARK_IRON_RAIDER} ×2) ` +
713
+ `+ SAY_MIRAN_1=${SAY_MIRAN_1}/SAY_MIRAN_2=${SAY_MIRAN_2} - FO6 zone ambush`;
714
+ const citeCredit =
715
+ `loch_modan.cpp:89–94 WP21 DoBroadcastText(SAY_MIRAN_3=${SAY_MIRAN_3}) + ` +
716
+ `RewardPlayerAndGroupAtEventExplored(309) + ForcedDespawn(${MIRAN_DESPAWN_MS}) - FO6 finishEscort`;
717
+ return [
718
+ {
719
+ kind: 'skip',
720
+ reason:
721
+ `escort Start(false, player, quest, false, false, path=${MIRAN_ESCORT_PATH}) - FO6 degraded finishEscort`,
722
+ cite: citeEscort,
723
+ },
724
+ {
725
+ kind: 'skip',
726
+ reason:
727
+ `WP17 ambush NPC_DARK_IRON_RAIDER (${NPC_DARK_IRON_RAIDER}) ×2 - FO6 zone ambush`,
728
+ cite: citeAmbush,
729
+ },
730
+ {
731
+ kind: 'skip',
732
+ reason:
733
+ `WP21 RewardPlayerAndGroupAtEventExplored(309) + ForcedDespawn(${MIRAN_DESPAWN_MS}) - FO6 finishEscort`,
734
+ cite: citeCredit,
735
+ },
736
+ ];
737
+ }
738
+
739
+ // Family pack: eastern_kingdoms/loch_modan.cpp Hooks: pQuestAcceptNPC QuestAccept_npc_miran (309).
740
+ // (SDComment mentions 3181 Pebblebitty gossip gate — not a quest accept/reward hook.)
741
+ function runLochModan(phase: QuestScriptHook, questId: number): DbScriptIntent[] {
742
+ if (phase !== 'accept') return [];
743
+ if (questId === QUEST_PROTECTING_THE_SHIPMENT) return runMiranAccept();
744
+ return [];
745
+ }
746
+
747
+ // Registry map — string family keys and numeric quest ids. next-batch.mjs accepts [id],
748
+ // 'family/id', family: and questId(s):. Keys stay here so the parser sees them.
749
+ export const QUEST_SCRIPT_REGISTRY: Record<string | number, QuestScriptEntry> = {
750
+ // Arathi Highlands — Sunken Treasure (665) + Hints of a New Plague? (660). Cite:
751
+ // ScriptDevAI/scripts/eastern_kingdoms/arathi_highlands.cpp
752
+ 'eastern_kingdoms/arathi_highlands': {
753
+ family: 'eastern_kingdoms/arathi_highlands',
754
+ questIds: [QUEST_SUNKEN_TREASURE, QUEST_HINTS_NEW_PLAGUE],
755
+ hooks: ['accept'],
756
+ cite: 'eastern_kingdoms/arathi_highlands.cpp:103–114,204–212,248–254',
757
+ run: runArathiHighlands,
758
+ },
759
+ // Quest-keyed aliases so resolveQuestScript hits O(1) on the primary claim.
760
+ [QUEST_SUNKEN_TREASURE]: {
761
+ family: 'eastern_kingdoms/arathi_highlands',
762
+ questId: QUEST_SUNKEN_TREASURE,
763
+ questIds: [QUEST_SUNKEN_TREASURE],
764
+ hooks: ['accept'],
765
+ cite: 'eastern_kingdoms/arathi_highlands.cpp:103–114 QuestAccept_npc_professor_phizzlethorpe',
766
+ run: runArathiHighlands,
767
+ },
768
+ [QUEST_HINTS_NEW_PLAGUE]: {
769
+ family: 'eastern_kingdoms/arathi_highlands',
770
+ questId: QUEST_HINTS_NEW_PLAGUE,
771
+ questIds: [QUEST_HINTS_NEW_PLAGUE],
772
+ hooks: ['accept'],
773
+ cite: 'eastern_kingdoms/arathi_highlands.cpp:248–254 QuestAccept_npc_kinelory',
774
+ run: runArathiHighlands,
775
+ },
776
+
777
+ // Blackrock Depths — Jail Break (4322), The Challenge (9015), plus the Love Potion (4201) and
778
+ // Rocknot's Ale (4295) reward hooks. Cite: eastern_kingdoms/blackrock_depths.cpp.
779
+ 'eastern_kingdoms/blackrock_depths/blackrock_depths': {
780
+ family: 'eastern_kingdoms/blackrock_depths/blackrock_depths',
781
+ questIds: [
782
+ QUEST_JAIL_BREAK,
783
+ QUEST_THE_CHALLENGE,
784
+ QUEST_POTION_LOVE,
785
+ QUEST_ALE,
786
+ ],
787
+ hooks: ['accept', 'reward', 'frame', 'complete'],
788
+ cite:
789
+ 'eastern_kingdoms/blackrock_depths/blackrock_depths.cpp:727–742,837–850,1081–1107,1360–1372,298–307',
790
+ run: runBlackrockDepths,
791
+ },
792
+ [QUEST_JAIL_BREAK]: {
793
+ family: 'eastern_kingdoms/blackrock_depths/blackrock_depths',
794
+ questId: QUEST_JAIL_BREAK,
795
+ questIds: [QUEST_JAIL_BREAK],
796
+ hooks: ['accept'],
797
+ cite: 'blackrock_depths.cpp:1360–1372 QuestAccept_npc_marshal_windsor',
798
+ run: runBlackrockDepths,
799
+ },
800
+ [QUEST_THE_CHALLENGE]: {
801
+ family: 'eastern_kingdoms/blackrock_depths/blackrock_depths',
802
+ questId: QUEST_THE_CHALLENGE,
803
+ questIds: [QUEST_THE_CHALLENGE],
804
+ hooks: ['frame', 'complete'],
805
+ cite: 'blackrock_depths.cpp:298–307 DoChallengeQuestCredit',
806
+ run: runBlackrockDepths,
807
+ },
808
+ [QUEST_POTION_LOVE]: {
809
+ family: 'eastern_kingdoms/blackrock_depths/blackrock_depths',
810
+ questId: QUEST_POTION_LOVE,
811
+ questIds: [QUEST_POTION_LOVE],
812
+ hooks: ['reward'],
813
+ cite: 'blackrock_depths.cpp:837–850 QuestRewarded_npc_mistress_nagmara',
814
+ run: runBlackrockDepths,
815
+ },
816
+ [QUEST_ALE]: {
817
+ family: 'eastern_kingdoms/blackrock_depths/blackrock_depths',
818
+ questId: QUEST_ALE,
819
+ questIds: [QUEST_ALE],
820
+ hooks: ['reward'],
821
+ cite: 'blackrock_depths.cpp:1081–1107 QuestRewarded_npc_rocknot',
822
+ run: runBlackrockDepths,
823
+ },
824
+
825
+ // Blackwing Lair — Nefarius's Corruption (8730) via Vaelastrasz quest accept. Cite:
826
+ // ScriptDevAI/scripts/eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp
827
+ 'eastern_kingdoms/blackwing_lair/boss_vaelastrasz': {
828
+ family: 'eastern_kingdoms/blackwing_lair/boss_vaelastrasz',
829
+ questIds: [QUEST_NEFARIUS_CORRUPTION],
830
+ hooks: ['accept'],
831
+ cite: 'eastern_kingdoms/blackwing_lair/boss_vaelastrasz.cpp:359–368',
832
+ run: runBossVaelastrasz,
833
+ },
834
+ [QUEST_NEFARIUS_CORRUPTION]: {
835
+ family: 'eastern_kingdoms/blackwing_lair/boss_vaelastrasz',
836
+ questId: QUEST_NEFARIUS_CORRUPTION,
837
+ questIds: [QUEST_NEFARIUS_CORRUPTION],
838
+ hooks: ['accept'],
839
+ cite: 'boss_vaelastrasz.cpp:359–368 QuestAccept_boss_vaelastrasz',
840
+ run: runBossVaelastrasz,
841
+ },
842
+
843
+ // Burning Steppes — Precarious Predicament (4121) via the Grark Lorkrub accept. The quest is
844
+ // absent from the current bake though classic-db has it. Cite: burning_steppes.cpp.
845
+ 'eastern_kingdoms/burning_steppes': {
846
+ family: 'eastern_kingdoms/burning_steppes',
847
+ questIds: [QUEST_PRECARIOUS_PREDICAMENT],
848
+ hooks: ['accept'],
849
+ cite: 'eastern_kingdoms/burning_steppes.cpp:324–335,240–246',
850
+ run: runBurningSteppes,
851
+ },
852
+ [QUEST_PRECARIOUS_PREDICAMENT]: {
853
+ family: 'eastern_kingdoms/burning_steppes',
854
+ questId: QUEST_PRECARIOUS_PREDICAMENT,
855
+ questIds: [QUEST_PRECARIOUS_PREDICAMENT],
856
+ hooks: ['accept'],
857
+ cite: 'burning_steppes.cpp:324–335 QuestAccept_npc_grark_lorkrub',
858
+ run: runBurningSteppes,
859
+ },
860
+
861
+ // Eastern Plaguelands — The Balance of Light and Shadow (7622) via Eris Havenfire. Cite:
862
+ // ScriptDevAI/scripts/eastern_kingdoms/eastern_plaguelands.cpp
863
+ 'eastern_kingdoms/eastern_plaguelands': {
864
+ family: 'eastern_kingdoms/eastern_plaguelands',
865
+ questIds: [QUEST_BALANCE_OF_LIGHT_AND_SHADOW],
866
+ hooks: ['accept'],
867
+ cite: 'eastern_kingdoms/eastern_plaguelands.cpp:227–233,345–354,235–244',
868
+ run: runEasternPlaguelands,
869
+ },
870
+ [QUEST_BALANCE_OF_LIGHT_AND_SHADOW]: {
871
+ family: 'eastern_kingdoms/eastern_plaguelands',
872
+ questId: QUEST_BALANCE_OF_LIGHT_AND_SHADOW,
873
+ questIds: [QUEST_BALANCE_OF_LIGHT_AND_SHADOW],
874
+ hooks: ['accept'],
875
+ cite: 'eastern_plaguelands.cpp:345–354 QuestAccept_npc_eris_havenfire',
876
+ run: runEasternPlaguelands,
877
+ },
878
+
879
+ // Gnomeregan — A Fine Mess (2904) via Kernobee FollowerAI quest accept. Cite:
880
+ // ScriptDevAI/scripts/eastern_kingdoms/gnomeregan/gnomeregan.cpp
881
+ 'eastern_kingdoms/gnomeregan/gnomeregan': {
882
+ family: 'eastern_kingdoms/gnomeregan/gnomeregan',
883
+ questIds: [QUEST_A_FINE_MESS],
884
+ hooks: ['accept'],
885
+ cite: 'eastern_kingdoms/gnomeregan/gnomeregan.cpp:661–668,678–687,700–706',
886
+ run: runGnomeregan,
887
+ },
888
+ [QUEST_A_FINE_MESS]: {
889
+ family: 'eastern_kingdoms/gnomeregan/gnomeregan',
890
+ questId: QUEST_A_FINE_MESS,
891
+ questIds: [QUEST_A_FINE_MESS],
892
+ hooks: ['accept'],
893
+ cite: 'gnomeregan.cpp:700–706 QuestAccept_npc_kernobee',
894
+ run: runGnomeregan,
895
+ },
896
+
897
+ // The Hinterlands — Rescue OOX-09/HL! (836) + Rin'ji is Trapped! (2742). Cite:
898
+ // ScriptDevAI/scripts/eastern_kingdoms/hinterlands.cpp
899
+ 'eastern_kingdoms/hinterlands': {
900
+ family: 'eastern_kingdoms/hinterlands',
901
+ questIds: [QUEST_RESQUE_OOX_09, QUEST_RINJI_TRAPPED],
902
+ hooks: ['accept'],
903
+ cite: 'eastern_kingdoms/hinterlands.cpp:148–161,338–351,81–85,287–291',
904
+ run: runHinterlands,
905
+ },
906
+ [QUEST_RESQUE_OOX_09]: {
907
+ family: 'eastern_kingdoms/hinterlands',
908
+ questId: QUEST_RESQUE_OOX_09,
909
+ questIds: [QUEST_RESQUE_OOX_09],
910
+ hooks: ['accept'],
911
+ cite: 'hinterlands.cpp:148–161 QuestAccept_npc_00x09hl',
912
+ run: runHinterlands,
913
+ },
914
+ [QUEST_RINJI_TRAPPED]: {
915
+ family: 'eastern_kingdoms/hinterlands',
916
+ questId: QUEST_RINJI_TRAPPED,
917
+ questIds: [QUEST_RINJI_TRAPPED],
918
+ hooks: ['accept'],
919
+ cite: 'hinterlands.cpp:338–351 QuestAccept_npc_rinji',
920
+ run: runHinterlands,
921
+ },
922
+
923
+ // Loch Modan — Protecting the Shipment (309) via Miran quest accept escort. Cite:
924
+ // ScriptDevAI/scripts/eastern_kingdoms/loch_modan.cpp
925
+ 'eastern_kingdoms/loch_modan': {
926
+ family: 'eastern_kingdoms/loch_modan',
927
+ questIds: [QUEST_PROTECTING_THE_SHIPMENT],
928
+ hooks: ['accept'],
929
+ cite: 'eastern_kingdoms/loch_modan.cpp:123–131,77–96',
930
+ run: runLochModan,
931
+ },
932
+ [QUEST_PROTECTING_THE_SHIPMENT]: {
933
+ family: 'eastern_kingdoms/loch_modan',
934
+ questId: QUEST_PROTECTING_THE_SHIPMENT,
935
+ questIds: [QUEST_PROTECTING_THE_SHIPMENT],
936
+ hooks: ['accept'],
937
+ cite: 'loch_modan.cpp:123–131 QuestAccept_npc_miran',
938
+ run: runLochModan,
939
+ },
940
+
941
+ // Redridge Mountains — Missing In Action (219) via Corporal Keeshan escort. Cite:
942
+ // ScriptDevAI/scripts/eastern_kingdoms/redridge_mountains.cpp
943
+ 'eastern_kingdoms/redridge_mountains': {
944
+ family: 'eastern_kingdoms/redridge_mountains',
945
+ questIds: [QUEST_MISSING_IN_ACTION],
946
+ hooks: ['accept'],
947
+ cite: 'eastern_kingdoms/redridge_mountains.cpp:52–59,92–98,62–84',
948
+ run: runRedridgeMountains,
949
+ },
950
+ [QUEST_MISSING_IN_ACTION]: {
951
+ family: 'eastern_kingdoms/redridge_mountains',
952
+ questId: QUEST_MISSING_IN_ACTION,
953
+ questIds: [QUEST_MISSING_IN_ACTION],
954
+ hooks: ['accept'],
955
+ cite: 'redridge_mountains.cpp:92–98 QuestAccept_npc_corporal_keeshan',
956
+ run: runRedridgeMountains,
957
+ },
958
+
959
+ // Searing Gorge — Suntara Stones (3367) via Dorius Stonetender escort. Cite:
960
+ // ScriptDevAI/scripts/eastern_kingdoms/searing_gorge.cpp
961
+ 'eastern_kingdoms/searing_gorge': {
962
+ family: 'eastern_kingdoms/searing_gorge',
963
+ questIds: [QUEST_SUNTARA_STONES],
964
+ hooks: ['accept'],
965
+ cite: 'eastern_kingdoms/searing_gorge.cpp:79–87,89–99,140–149',
966
+ run: runSearingGorge,
967
+ },
968
+ [QUEST_SUNTARA_STONES]: {
969
+ family: 'eastern_kingdoms/searing_gorge',
970
+ questId: QUEST_SUNTARA_STONES,
971
+ questIds: [QUEST_SUNTARA_STONES],
972
+ hooks: ['accept'],
973
+ cite: 'searing_gorge.cpp:140–149 QuestAccept_npc_dorius_stonetender',
974
+ run: runSearingGorge,
975
+ },
976
+
977
+ // Silverpine Forest — Escorting Erland (435) + Pyrewood Ambush (452). Cite:
978
+ // ScriptDevAI/scripts/eastern_kingdoms/silverpine_forest.cpp
979
+ 'eastern_kingdoms/silverpine_forest': {
980
+ family: 'eastern_kingdoms/silverpine_forest',
981
+ questIds: [QUEST_ERLAND, QUEST_PYREWOOD_AMBUSH],
982
+ hooks: ['accept'],
983
+ cite: 'eastern_kingdoms/silverpine_forest.cpp:115–125,190–199,290–300,63–99,226–244',
984
+ run: runSilverpineForest,
985
+ },
986
+ [QUEST_ERLAND]: {
987
+ family: 'eastern_kingdoms/silverpine_forest',
988
+ questId: QUEST_ERLAND,
989
+ questIds: [QUEST_ERLAND],
990
+ hooks: ['accept'],
991
+ cite: 'silverpine_forest.cpp:115–125 QuestAccept_npc_deathstalker_erland',
992
+ run: runSilverpineForest,
993
+ },
994
+ [QUEST_PYREWOOD_AMBUSH]: {
995
+ family: 'eastern_kingdoms/silverpine_forest',
996
+ questId: QUEST_PYREWOOD_AMBUSH,
997
+ questIds: [QUEST_PYREWOOD_AMBUSH],
998
+ hooks: ['accept'],
999
+ cite: 'silverpine_forest.cpp:290–300 QuestAccept_npc_deathstalker_faerleia',
1000
+ run: runSilverpineForest,
1001
+ },
1002
+
1003
+ // Stormwind City — 1447 / 1640 / 6402 / 6403. Cite: stormwind_city.cpp
1004
+ 'eastern_kingdoms/stormwind_city': {
1005
+ family: 'eastern_kingdoms/stormwind_city',
1006
+ questIds: [QUEST_MISSING_DIPLO_PT8, QUEST_BEAT, QUEST_STORMWIND_RENDEZVOUS, QUEST_THE_GREAT_MASQUERADE],
1007
+ hooks: ['accept'],
1008
+ cite: 'stormwind_city.cpp:72–79,413–447,1273–1281,663–700,1212–1216',
1009
+ run: runStormwindCity,
1010
+ },
1011
+ [QUEST_MISSING_DIPLO_PT8]: {
1012
+ family: 'eastern_kingdoms/stormwind_city', questId: QUEST_MISSING_DIPLO_PT8,
1013
+ questIds: [QUEST_MISSING_DIPLO_PT8], hooks: ['accept'],
1014
+ cite: 'stormwind_city.cpp:413–447 QuestAccept_npc_dashel_stonefist', run: runStormwindCity,
1015
+ },
1016
+ [QUEST_BEAT]: {
1017
+ family: 'eastern_kingdoms/stormwind_city', questId: QUEST_BEAT,
1018
+ questIds: [QUEST_BEAT], hooks: ['accept'],
1019
+ cite: 'stormwind_city.cpp:72–79 QuestAccept_npc_bartleby', run: runStormwindCity,
1020
+ },
1021
+ [QUEST_STORMWIND_RENDEZVOUS]: {
1022
+ family: 'eastern_kingdoms/stormwind_city', questId: QUEST_STORMWIND_RENDEZVOUS,
1023
+ questIds: [QUEST_STORMWIND_RENDEZVOUS], hooks: ['accept'],
1024
+ cite: 'stormwind_city.cpp:663–700 squire_rowe gossip (no pQuestAcceptNPC)', run: runStormwindCity,
1025
+ },
1026
+ [QUEST_THE_GREAT_MASQUERADE]: {
1027
+ family: 'eastern_kingdoms/stormwind_city', questId: QUEST_THE_GREAT_MASQUERADE,
1028
+ questIds: [QUEST_THE_GREAT_MASQUERADE], hooks: ['accept'],
1029
+ cite: 'stormwind_city.cpp:1273–1281 QuestAccept_npc_reginald_windsor', run: runStormwindCity,
1030
+ },
1031
+ // Stranglethorn Vale — 592 Saving Yenniku (mob_yenniku SpellHit residual).
1032
+ 'eastern_kingdoms/stranglethorn_vale': {
1033
+ family: 'eastern_kingdoms/stranglethorn_vale', questIds: [QUEST_SAVING_YENNIKU],
1034
+ hooks: ['frame', 'complete'], cite: 'stranglethorn_vale.cpp:55–82,84–96 mob_yenniku SpellHit',
1035
+ run: runStranglethornVale,
1036
+ },
1037
+ [QUEST_SAVING_YENNIKU]: {
1038
+ family: 'eastern_kingdoms/stranglethorn_vale', questId: QUEST_SAVING_YENNIKU,
1039
+ questIds: [QUEST_SAVING_YENNIKU], hooks: ['frame', 'complete'],
1040
+ cite: 'stranglethorn_vale.cpp:55–82 SpellHit + EnterEvadeMode', run: runStranglethornVale,
1041
+ },
1042
+ // Stratholme — 5122 Aurius reward + 5282 Restless Soul residual (census).
1043
+ 'eastern_kingdoms/stratholme/stratholmeScripts': {
1044
+ family: 'eastern_kingdoms/stratholme/stratholmeScripts',
1045
+ questIds: [QUEST_MEDALLION_FAITH, QUEST_RESTLESS_SOUL], hooks: ['reward', 'frame', 'complete'],
1046
+ cite: 'stratholmeScripts.cpp:316–329,165–198; stratholme.cpp:475–482', run: runStratholmeScripts,
1047
+ },
1048
+ [QUEST_MEDALLION_FAITH]: {
1049
+ family: 'eastern_kingdoms/stratholme/stratholmeScripts', questId: QUEST_MEDALLION_FAITH,
1050
+ questIds: [QUEST_MEDALLION_FAITH], hooks: ['reward'], run: runStratholmeScripts,
1051
+ cite: 'stratholmeScripts.cpp:316–329 QuestRewarded_npc_aurius',
1052
+ },
1053
+ [QUEST_RESTLESS_SOUL]: {
1054
+ family: 'eastern_kingdoms/stratholme/stratholmeScripts', questId: QUEST_RESTLESS_SOUL,
1055
+ questIds: [QUEST_RESTLESS_SOUL], hooks: ['frame', 'complete'], run: runStratholmeScripts,
1056
+ cite: 'stratholmeScripts.cpp:165–198 mob_restless_soul credit',
1057
+ },
1058
+ // Sunken Temple — 8555 Charge of the Dragonflights (AT residual → Malfurion).
1059
+ 'eastern_kingdoms/sunken_temple/sunken_templeScripts': {
1060
+ family: 'eastern_kingdoms/sunken_temple/sunken_templeScripts',
1061
+ questIds: [QUEST_THE_CHARGE_OF_DRAGONFLIGHTS],
1062
+ hooks: ['frame', 'complete'],
1063
+ cite: 'sunken_templeScripts.cpp:44–61,78–143 AreaTrigger_at_shade_of_eranikus',
1064
+ run: runSunkenTempleScripts,
1065
+ },
1066
+ [QUEST_THE_CHARGE_OF_DRAGONFLIGHTS]: {
1067
+ family: 'eastern_kingdoms/sunken_temple/sunken_templeScripts',
1068
+ questId: QUEST_THE_CHARGE_OF_DRAGONFLIGHTS,
1069
+ questIds: [QUEST_THE_CHARGE_OF_DRAGONFLIGHTS],
1070
+ hooks: ['frame', 'complete'],
1071
+ cite: 'sunken_templeScripts.cpp:44–61 AT gate on rewarded 8555',
1072
+ run: runSunkenTempleScripts,
1073
+ },
1074
+
1075
+ // Swamp of Sorrows — Galen's Escape (1393) via Galen Goodward escort. Cite:
1076
+ // ScriptDevAI/scripts/eastern_kingdoms/swamp_of_sorrows.cpp
1077
+ 'eastern_kingdoms/swamp_of_sorrows': {
1078
+ family: 'eastern_kingdoms/swamp_of_sorrows',
1079
+ questIds: [QUEST_GALENS_ESCAPE],
1080
+ hooks: ['accept'],
1081
+ cite: 'eastern_kingdoms/swamp_of_sorrows.cpp:139–152,70–117',
1082
+ run: runSwampOfSorrows,
1083
+ },
1084
+ [QUEST_GALENS_ESCAPE]: {
1085
+ family: 'eastern_kingdoms/swamp_of_sorrows',
1086
+ questId: QUEST_GALENS_ESCAPE,
1087
+ questIds: [QUEST_GALENS_ESCAPE],
1088
+ hooks: ['accept'],
1089
+ cite: 'swamp_of_sorrows.cpp:139–152 QuestAccept_npc_galen_goodward',
1090
+ run: runSwampOfSorrows,
1091
+ },
1092
+
1093
+ // Tirisfal Glades — A Rogue's Deal (590) Calvin duel + Ulag the Cleaver (1819) mausoleum GO residual.
1094
+ // Cite: ScriptDevAI/scripts/eastern_kingdoms/tirisfal_glades.cpp
1095
+ 'eastern_kingdoms/tirisfal_glades': {
1096
+ family: 'eastern_kingdoms/tirisfal_glades',
1097
+ questIds: [QUEST_590, QUEST_ULAG],
1098
+ hooks: ['accept', 'frame', 'complete'],
1099
+ cite: 'eastern_kingdoms/tirisfal_glades.cpp:47–75,109–178',
1100
+ run: runTirisfalGlades,
1101
+ },
1102
+ [QUEST_590]: {
1103
+ family: 'eastern_kingdoms/tirisfal_glades',
1104
+ questId: QUEST_590,
1105
+ questIds: [QUEST_590],
1106
+ hooks: ['accept'],
1107
+ cite: 'tirisfal_glades.cpp:170–178 QuestAccept_npc_calvin_montague',
1108
+ run: runTirisfalGlades,
1109
+ },
1110
+ [QUEST_ULAG]: {
1111
+ family: 'eastern_kingdoms/tirisfal_glades',
1112
+ questId: QUEST_ULAG,
1113
+ questIds: [QUEST_ULAG],
1114
+ hooks: ['frame', 'complete'],
1115
+ cite: 'tirisfal_glades.cpp:47–75 GOUse_go_mausoleum_door/trigger',
1116
+ run: runTirisfalGlades,
1117
+ },
1118
+
1119
+ // Western Plaguelands — Scarlet Subterfuge (5862) reward + In Dreams (5944) accept via Taelan Fordring.
1120
+ // Cite: ScriptDevAI/scripts/eastern_kingdoms/western_plaguelands.cpp
1121
+ 'eastern_kingdoms/western_plaguelands': {
1122
+ family: 'eastern_kingdoms/western_plaguelands',
1123
+ questIds: [QUEST_SCARLET_SUBTERFUGE, QUEST_IN_DREAMS],
1124
+ hooks: ['accept', 'reward'],
1125
+ cite: 'eastern_kingdoms/western_plaguelands.cpp:653–667,319–328,398–418,559–564',
1126
+ run: runWesternPlaguelands,
1127
+ },
1128
+ [QUEST_SCARLET_SUBTERFUGE]: {
1129
+ family: 'eastern_kingdoms/western_plaguelands',
1130
+ questId: QUEST_SCARLET_SUBTERFUGE,
1131
+ questIds: [QUEST_SCARLET_SUBTERFUGE],
1132
+ hooks: ['reward'],
1133
+ cite: 'western_plaguelands.cpp:661–667 QuestRewarded_npc_taelan_fordring',
1134
+ run: runWesternPlaguelands,
1135
+ },
1136
+ [QUEST_IN_DREAMS]: {
1137
+ family: 'eastern_kingdoms/western_plaguelands',
1138
+ questId: QUEST_IN_DREAMS,
1139
+ questIds: [QUEST_IN_DREAMS],
1140
+ hooks: ['accept'],
1141
+ cite: 'western_plaguelands.cpp:653–659 QuestAccept_npc_taelan_fordring',
1142
+ run: runWesternPlaguelands,
1143
+ },
1144
+
1145
+ // Westfall — 1651 Daphne / 155 Defias Traitor. Cite: westfall.cpp
1146
+ 'eastern_kingdoms/westfall': {
1147
+ family: 'eastern_kingdoms/westfall',
1148
+ questIds: [QUEST_TOME_VALOR, QUEST_DEFIAS_BROTHERHOOD],
1149
+ hooks: ['accept'],
1150
+ cite: 'eastern_kingdoms/westfall.cpp:315–323,392–402,166–169,368–374',
1151
+ run: runWestfall,
1152
+ },
1153
+ [QUEST_TOME_VALOR]: {
1154
+ family: 'eastern_kingdoms/westfall', questId: QUEST_TOME_VALOR,
1155
+ questIds: [QUEST_TOME_VALOR], hooks: ['accept'],
1156
+ cite: 'westfall.cpp:315–323 QuestAccept_npc_daphne_stilwell', run: runWestfall,
1157
+ },
1158
+ [QUEST_DEFIAS_BROTHERHOOD]: {
1159
+ family: 'eastern_kingdoms/westfall', questId: QUEST_DEFIAS_BROTHERHOOD,
1160
+ questIds: [QUEST_DEFIAS_BROTHERHOOD], hooks: ['accept'],
1161
+ cite: 'westfall.cpp:392–402 QuestAccept_npc_defias_traitor', run: runWestfall,
1162
+ },
1163
+ // Wetlands — 1249 Missing Diplomat (Mikhail → Slim). Cite: wetlands.cpp
1164
+ 'eastern_kingdoms/wetlands': {
1165
+ family: 'eastern_kingdoms/wetlands',
1166
+ questIds: [QUEST_MISSING_DIPLOMAT11],
1167
+ hooks: ['accept'],
1168
+ cite: 'eastern_kingdoms/wetlands.cpp:207–223,158–163,98–115,165–176',
1169
+ run: runWetlands,
1170
+ },
1171
+ [QUEST_MISSING_DIPLOMAT11]: {
1172
+ family: 'eastern_kingdoms/wetlands', questId: QUEST_MISSING_DIPLOMAT11,
1173
+ questIds: [QUEST_MISSING_DIPLOMAT11], hooks: ['accept'],
1174
+ cite: 'wetlands.cpp:207–223 QuestAccept_npc_mikhail', run: runWetlands,
1175
+ },
1176
+ // MACHINE-READ by scripts/qi4/next-batch.mjs (greps /family:'…'/): spread-ins have no literal
1177
+ // key, so this IS their registration. Append, never reword. family: 'kalimdor/ashenvale' family: 'kalimdor/azshara' family: 'kalimdor/darkshore' family: 'kalimdor/desolace' family: 'kalimdor/dustwallow_marsh' family: 'kalimdor/felwood' family: 'kalimdor/feralas' family: 'kalimdor/moonglade' family: 'kalimdor/razorfen_downs/razorfen_downs' family: 'kalimdor/razorfen_kraul/razorfen_kraul' family: 'kalimdor/stonetalon_mountains' family: 'kalimdor/tanaris' family: 'kalimdor/teldrassil' family: 'kalimdor/the_barrens' family: 'kalimdor/thousand_needles' family: 'kalimdor/ungoro_crater' family: 'kalimdor/winterspring' family: 'world/areatrigger_scripts' family: 'world/go_scripts' family: 'world/npc_professions' family: 'world/npcs_special' family: 'world/war_effort'
1178
+ ...SIBLING_REGISTRIES,
1179
+ };
1180
+
1181
+ /** Resolve a registry entry by quest id (direct key or family membership). */
1182
+ export function resolveQuestScript(questId: number): QuestScriptEntry | undefined {
1183
+ const direct = QUEST_SCRIPT_REGISTRY[questId];
1184
+ if (direct) return direct;
1185
+ for (const entry of Object.values(QUEST_SCRIPT_REGISTRY)) {
1186
+ if (entry.questId === questId) return entry;
1187
+ if (entry.questIds?.includes(questId)) return entry;
1188
+ }
1189
+ return undefined;
1190
+ }
1191
+
1192
+ export function isQuestScriptRegistered(questId: number): boolean {
1193
+ return resolveQuestScript(questId) != null;
1194
+ }