azeroth-shell 0.0.0-stage → 0.1.1

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 +35 -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 +144 -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,1192 @@
1
+ // Stormwind City ScriptDev IR ports. Source: eastern_kingdoms/stormwind_city.cpp — Bartleby,
2
+ // Dashel Stonefist, Katrana Prestor, Squire Rowe, Reginald Windsor, Mattingly and Afrasiabi.
3
+
4
+ import type { ScriptDevIR } from './types.ts';
5
+
6
+ // Constants — stormwind_city.cpp + world_eastern_kingdoms.h
7
+
8
+ // stormwind_city.cpp:45–47 npc_bartleby
9
+ export const FACTION_ENEMY = 168;
10
+ export const QUEST_BEAT = 1640;
11
+ export const NPC_BARTLEBY = 6090;
12
+
13
+ /** DamageTaken HP% gate — yield when post-hit HP would be < 15%. Cite: stormwind_city.cpp:60 */
14
+ export const BARTLEBY_YIELD_HP_PCT = 15;
15
+
16
+ // TEMPFACTION flags for Bartleby QuestAccept. Cite: Creature.h:577–578; stormwind_city.cpp:76
17
+ // TEMPFACTION_RESTORE_RESPAWN | TEMPFACTION_RESTORE_COMBAT_STOP
18
+ export const TEMPFACTION_RESTORE_RESPAWN = 0x01;
19
+ export const TEMPFACTION_RESTORE_COMBAT_STOP = 0x02;
20
+ export const BARTLEBY_TEMPFACTION_FLAGS =
21
+ TEMPFACTION_RESTORE_RESPAWN | TEMPFACTION_RESTORE_COMBAT_STOP;
22
+
23
+ // stormwind_city.cpp:91–108 npc_dashel_stonefist
24
+ export const SAY_PROGRESS_1_DAS = 1961;
25
+ export const SAY_PROGRESS_2_DAS = 1712;
26
+ export const SAY_PROGRESS_3_DAS = 1713;
27
+ export const SAY_PROGRESS_4_THU = 1716;
28
+ export const SAY_PROGRESS_5_THU = 1715;
29
+ export const QUEST_MISSING_DIPLO_PT8 = 1447;
30
+ export const NPC_OLD_TOWN_THUG = 4969;
31
+ export const FACTION_NEUTRAL = 189;
32
+ export const FACTION_FRIENDLY_TO_ALL = 35;
33
+ /** Cite: stormwind_city.cpp:107 — enum present; SetDeathPrevention used in fight */
34
+ export const SPELL_UNKILLABLE_OFF = 13835;
35
+ export const NPC_DASHEL_STONEFIST = 4961;
36
+
37
+ // Dashel StartEvent delay after quest accept. Cite: stormwind_city.cpp:202 ResetTimer(DASHEL_START_EVENT,
38
+ // 2000)
39
+ export const DASHEL_START_EVENT_MS = 2000;
40
+
41
+ /** Low-HP yield threshold. Cite: stormwind_city.cpp:374 GetHealthPercent() <= 20.f */
42
+ export const DASHEL_YIELD_HP_PCT = 20;
43
+
44
+ // Evade timer after yield before MoveTargetedHome. Cite: stormwind_city.cpp:405
45
+ // ResetTimer(DASHEL_EVADE_EVENT, 2000)
46
+ export const DASHEL_EVADE_EVENT_MS = 2000;
47
+
48
+ // End-event stage arm after JustReachedHome. Cite: stormwind_city.cpp:263 / :269
49
+ // ResetTimer(DASHEL_END_EVENT, 3000)
50
+ export const DASHEL_END_EVENT_ARM_MS = 3000;
51
+
52
+ /** Thug TEMPSPAWN_TIMED_OOC_OR_DEAD_DESPAWN. Cite: stormwind_city.cpp:427 / :435 120000 */
53
+ export const DASHEL_THUG_DESPAWN_MS = 120_000;
54
+
55
+ /** Thug spawn / waypoint / reset positions. Cite: stormwind_city.cpp:110–123 */
56
+ export const DASHEL_THUG_SPAWN = [
57
+ {
58
+ x: -8687.311,
59
+ y: 446.7531,
60
+ z: 100.05593,
61
+ o: 5.12632,
62
+ cite: 'stormwind_city.cpp:111 aThugSpawnPosition[0]',
63
+ },
64
+ {
65
+ x: -8669.205,
66
+ y: 448.4405,
67
+ z: 99.74935,
68
+ o: 3.75387,
69
+ cite: 'stormwind_city.cpp:112 aThugSpawnPosition[1]',
70
+ },
71
+ ] as const;
72
+
73
+ export const DASHEL_THUG_WAYPOINT = [
74
+ {
75
+ x: -8684.558,
76
+ y: 442.7352,
77
+ z: 99.480316,
78
+ cite: 'stormwind_city.cpp:116 aThugWaypointPosition[0]',
79
+ },
80
+ {
81
+ x: -8675.7,
82
+ y: 443.8787,
83
+ z: 99.641556,
84
+ cite: 'stormwind_city.cpp:117 aThugWaypointPosition[1]',
85
+ },
86
+ ] as const;
87
+
88
+ export const DASHEL_THUG_RESET = [
89
+ {
90
+ x: -8686.397461,
91
+ y: 447.595703,
92
+ z: 99.994408,
93
+ cite: 'stormwind_city.cpp:121 aThugResetPosition[0]',
94
+ },
95
+ {
96
+ x: -8669.338867,
97
+ y: 448.362976,
98
+ z: 99.740005,
99
+ cite: 'stormwind_city.cpp:122 aThugResetPosition[1]',
100
+ },
101
+ ] as const;
102
+
103
+ /** End-event stage timers (HandleEndEvent). Cite: stormwind_city.cpp:282–320 */
104
+ export const DASHEL_END_STAGE_TIMERS_MS = {
105
+ /** case 1 → case 2 */
106
+ 1: 1500,
107
+ /** case 2 → case 3 */
108
+ 2: 1000,
109
+ /** case 3 → case 4 */
110
+ 3: 1500,
111
+ /** case 4 → case 5 */
112
+ 4: 1000,
113
+ } as const;
114
+
115
+ // stormwind_city.cpp:454–460 / 467–494 Lady Katrana Prestor
116
+ export const GOSSIP_ITEM_KAT_1 = -3000120;
117
+ export const GOSSIP_ITEM_KAT_2 = -3000121;
118
+ export const GOSSIP_ITEM_KAT_3 = -3000122;
119
+ export const GOSSIP_ITEM_KAT_4 = -3000123;
120
+ export const GOSSIP_TEXT_KAT = [2693, 2694, 2695, 2696] as const;
121
+ export const QUEST_TRUE_MASTERS = 4185;
122
+ export const NPC_LADY_KATRANA_PRESTOR = 1749;
123
+ /** Bake starter/ender for 4185. Cite: quests.json; world_eastern_kingdoms.h NPC_BOLVAR */
124
+ export const NPC_BOLVAR = 1748;
125
+
126
+ // stormwind_city.cpp:503–523 Squire Rowe / Windsor intro
127
+ export const SAY_SIGNAL_SENT = -1000822;
128
+ export const SAY_DISMOUNT = -1000823;
129
+ export const SAY_WELCOME = -1000824;
130
+ export const GOSSIP_ITEM_WINDSOR = -3000106;
131
+ export const GOSSIP_TEXT_ID_DEFAULT = 9063;
132
+ export const GOSSIP_TEXT_ID_PROGRESS = 9064;
133
+ export const GOSSIP_TEXT_ID_START = 9065;
134
+ export const NPC_WINDSOR_MOUNT = 12581;
135
+ export const SPELL_BLUE_FIREWORK = 11540;
136
+ export const SPELL_DISMISS_HORSE = 20000;
137
+ export const SPELL_WINDSOR_INSPIRATION = 20273;
138
+ export const QUEST_STORMWIND_RENDEZVOUS = 6402;
139
+ export const QUEST_THE_GREAT_MASQUERADE = 6403;
140
+ export const NPC_SQUIRE_ROWE = 17804;
141
+
142
+ /** Intro dialogue step delays. Cite: stormwind_city.cpp:525–533 aIntroDialogue */
143
+ export const ROWE_INTRO_DIALOGUE = [
144
+ { entry: 12580, delayMs: 3000, cite: 'stormwind_city.cpp:527 NPC_WINDSOR wait 3000' },
145
+ { entry: 12581, delayMs: 1000, cite: 'stormwind_city.cpp:528 NPC_WINDSOR_MOUNT 1000' },
146
+ { entry: -1000823, delayMs: 2000, cite: 'stormwind_city.cpp:529 SAY_DISMOUNT 2000' },
147
+ { entry: 6402, delayMs: 2000, cite: 'stormwind_city.cpp:530 QUEST_STORMWIND_RENDEZVOUS face 2000' },
148
+ { entry: 6403, delayMs: 0, cite: 'stormwind_city.cpp:531 QUEST_THE_GREAT_MASQUERADE welcome 0' },
149
+ ] as const;
150
+
151
+ export const WINDSOR_SPAWN_LOC = {
152
+ x: -9145.68,
153
+ y: 373.79,
154
+ z: 90.64,
155
+ cite: 'stormwind_city.cpp:535 aWindsorSpawnLoc',
156
+ } as const;
157
+
158
+ export const WINDSOR_MOVE_LOC = {
159
+ x: -9050.39,
160
+ y: 443.55,
161
+ z: 93.05,
162
+ cite: 'stormwind_city.cpp:536 aWindsorMoveLoc',
163
+ } as const;
164
+
165
+ // world_eastern_kingdoms.h:8–12 + stormwind_city.cpp Windsor
166
+ export const NPC_JONATHAN = 466;
167
+ export const NPC_WRYNN = 1747;
168
+ export const NPC_PRESTOR = 1749;
169
+ export const NPC_WINDSOR = 12580;
170
+
171
+ // stormwind_city.cpp:707–775 combat + keep spells
172
+ export const SAY_WINDSOR_QUEST_ACCEPT = -1000825;
173
+ export const SAY_WINDSOR_GET_READY = -1000826;
174
+ export const SAY_PRESTOR_SIEZE = -1000827;
175
+ export const GOSSIP_ITEM_REGINALD = -3000107;
176
+ export const GOSSIP_TEXT_ID_MASQUERADE = 5633;
177
+ export const SPELL_ONYXIA_TRANSFORM = 20409;
178
+ export const SPELL_WINDSOR_READ = 20358;
179
+ export const SPELL_WINDSOR_DEATH = 20465;
180
+ export const SPELL_ONYXIA_DESPAWN = 20466;
181
+ export const SPELL_HAMMER_OF_JUSTICE = 10308;
182
+ export const SPELL_SHIELD_WALL = 871;
183
+ export const SPELL_STRONG_CLEAVE = 8255;
184
+ export const NPC_GUARD_ROYAL = 1756;
185
+ export const NPC_GUARD_CITY = 68;
186
+ export const NPC_GUARD_PATROLLER = 1976;
187
+ export const NPC_GUARD_ONYXIA = 12739;
188
+ export const MAX_ROYAL_GUARDS = 6;
189
+
190
+ /** Hammer of Justice Reset / re-arm. Cite: stormwind_city.cpp:888 urand(0, 1000); :1256 = 60000 */
191
+ export const WINDSOR_HAMMER_INIT_MIN_MS = 0;
192
+ export const WINDSOR_HAMMER_INIT_MAX_MS = 1000;
193
+ export const WINDSOR_HAMMER_REPEAT_MS = 60_000;
194
+
195
+ /** Strong Cleave Reset / re-arm. Cite: stormwind_city.cpp:889 urand(1000, 3000); :1264 urand(1000, 5000) */
196
+ export const WINDSOR_CLEAVE_INIT_MIN_MS = 1000;
197
+ export const WINDSOR_CLEAVE_INIT_MAX_MS = 3000;
198
+ export const WINDSOR_CLEAVE_REPEAT_MIN_MS = 1000;
199
+ export const WINDSOR_CLEAVE_REPEAT_MAX_MS = 5000;
200
+
201
+ // Guard-check poll while Onyxia guards alive. Cite: stormwind_city.cpp:1125 / :1244 m_guardCheckTimer =
202
+ // 1000
203
+ export const WINDSOR_GUARD_CHECK_MS = 1000;
204
+
205
+ // stormwind_city.cpp:1321–1328 Mattingly / Afrasiabi
206
+ export const GO_HEAD_OF_NEFARIAN_SW = 179882;
207
+ export const GO_HEAD_OF_ONYXIA_SW = 179558;
208
+ export const GOSSIP_HEAD_MAT = 5754;
209
+ export const GOSSIP_HEAD_AFRA = 6027;
210
+ export const NPC_MAJOR_MATTINGLY = 14394;
211
+ export const NPC_FIELD_MARSHAL_AFRASIABI = 14721;
212
+ /** Head GO search radius. Cite: stormwind_city.cpp:1333 / :1345 100.f */
213
+ export const HEAD_GO_SEARCH_YD = 100;
214
+
215
+ // Pure helpers — Bartleby
216
+
217
+ export interface BartlebyDamageTakenResult {
218
+ /** Clamp damage so at least 1 HP remains. */
219
+ clampDamage: boolean;
220
+ /** New damage value when clampDamage (min(damage, health-1)). */
221
+ damageOut: number;
222
+ questCredit: boolean;
223
+ questId: number | null;
224
+ enterEvade: boolean;
225
+ cite: string;
226
+ }
227
+
228
+ // Port of npc_bartlebyAI::DamageTaken. Cite: stormwind_city.cpp:58–68 Yields when damage would kill OR
229
+ // post-hit HP% would be < 15.
230
+ export function bartlebyDamageTaken(
231
+ health: number,
232
+ maxHealth: number,
233
+ damage: number,
234
+ dealerIsPlayer: boolean,
235
+ ): BartlebyDamageTakenResult {
236
+ if (maxHealth <= 0 || health <= 0) {
237
+ return {
238
+ clampDamage: false,
239
+ damageOut: damage,
240
+ questCredit: false,
241
+ questId: null,
242
+ enterEvade: false,
243
+ cite: 'stormwind_city.cpp:58-68 invalid health',
244
+ };
245
+ }
246
+ const wouldKill = damage > health;
247
+ const postHp = health - damage;
248
+ const postPct = (postHp * 100) / maxHealth;
249
+ const yieldNow = wouldKill || postPct < BARTLEBY_YIELD_HP_PCT;
250
+ if (!yieldNow) {
251
+ return {
252
+ clampDamage: false,
253
+ damageOut: damage,
254
+ questCredit: false,
255
+ questId: null,
256
+ enterEvade: false,
257
+ cite: 'stormwind_city.cpp:60 HP still >= 15% after hit → no-op',
258
+ };
259
+ }
260
+ const damageOut = Math.min(damage, Math.max(health - 1, 0));
261
+ return {
262
+ clampDamage: true,
263
+ damageOut,
264
+ questCredit: dealerIsPlayer,
265
+ questId: dealerIsPlayer ? QUEST_BEAT : null,
266
+ enterEvade: true,
267
+ cite: 'stormwind_city.cpp:60-67 clamp + AreaExploredOrEventHappens(1640) + EnterEvadeMode',
268
+ };
269
+ }
270
+
271
+ export interface BartlebyQuestAcceptResult {
272
+ handled: boolean;
273
+ factionId: number;
274
+ factionFlags: number;
275
+ attackStart: boolean;
276
+ cite: string;
277
+ }
278
+
279
+ /** Port of QuestAccept_npc_bartleby. Cite: stormwind_city.cpp:72–79 */
280
+ export function bartlebyQuestAccept(questId: number): BartlebyQuestAcceptResult {
281
+ if (questId !== QUEST_BEAT) {
282
+ return {
283
+ handled: false,
284
+ factionId: 0,
285
+ factionFlags: 0,
286
+ attackStart: false,
287
+ cite: 'stormwind_city.cpp:74 quest != 1640 → no-op (still returns true in cpp)',
288
+ };
289
+ }
290
+ return {
291
+ handled: true,
292
+ factionId: FACTION_ENEMY,
293
+ factionFlags: BARTLEBY_TEMPFACTION_FLAGS,
294
+ attackStart: true,
295
+ cite: 'stormwind_city.cpp:76-77 FACTION_ENEMY 168 + AttackStart',
296
+ };
297
+ }
298
+
299
+ // Pure helpers — Dashel Stonefist
300
+
301
+ export interface DashelQuestAcceptResult {
302
+ handled: boolean;
303
+ textId: number | null;
304
+ factionId: number;
305
+ stripQuestGiver: boolean;
306
+ reactAggressive: boolean;
307
+ thugSpawns: typeof DASHEL_THUG_SPAWN;
308
+ thugWaypoints: typeof DASHEL_THUG_WAYPOINT;
309
+ thugDespawnMs: number;
310
+ startEventMs: number;
311
+ cite: string;
312
+ }
313
+
314
+ /** Port of QuestAccept_npc_dashel_stonefist fight setup. Cite: stormwind_city.cpp:413–447 */
315
+ export function dashelQuestAccept(questId: number): DashelQuestAcceptResult {
316
+ if (questId !== QUEST_MISSING_DIPLO_PT8) {
317
+ return {
318
+ handled: false,
319
+ textId: null,
320
+ factionId: 0,
321
+ stripQuestGiver: false,
322
+ reactAggressive: false,
323
+ thugSpawns: DASHEL_THUG_SPAWN,
324
+ thugWaypoints: DASHEL_THUG_WAYPOINT,
325
+ thugDespawnMs: 0,
326
+ startEventMs: 0,
327
+ cite: 'stormwind_city.cpp:415 quest != 1447 → no-op',
328
+ };
329
+ }
330
+ return {
331
+ handled: true,
332
+ textId: SAY_PROGRESS_1_DAS,
333
+ factionId: FACTION_NEUTRAL,
334
+ stripQuestGiver: true,
335
+ reactAggressive: true,
336
+ thugSpawns: DASHEL_THUG_SPAWN,
337
+ thugWaypoints: DASHEL_THUG_WAYPOINT,
338
+ thugDespawnMs: DASHEL_THUG_DESPAWN_MS,
339
+ startEventMs: DASHEL_START_EVENT_MS,
340
+ cite: 'stormwind_city.cpp:420-442 SAY_1 + faction 189 + thugs + StartEvent 2000',
341
+ };
342
+ }
343
+
344
+ export interface DashelLowHpResult {
345
+ yielded: boolean;
346
+ textId: number | null;
347
+ factionId: number;
348
+ stopCombat: boolean;
349
+ thugsYield: boolean;
350
+ evadeTimerMs: number;
351
+ dialogStarted: boolean;
352
+ cite: string;
353
+ }
354
+
355
+ /** Port of ExecuteAction DASHEL_LOW_HP while quest fight active. Cite: stormwind_city.cpp:372–409 */
356
+ export function dashelLowHp(
357
+ hpPct: number,
358
+ questFightStarted: boolean,
359
+ ): DashelLowHpResult {
360
+ if (!questFightStarted || hpPct > DASHEL_YIELD_HP_PCT) {
361
+ return {
362
+ yielded: false,
363
+ textId: null,
364
+ factionId: 0,
365
+ stopCombat: false,
366
+ thugsYield: false,
367
+ evadeTimerMs: 0,
368
+ dialogStarted: false,
369
+ cite: 'stormwind_city.cpp:374 !questFight or HP > 20 → no-op',
370
+ };
371
+ }
372
+ return {
373
+ yielded: true,
374
+ textId: SAY_PROGRESS_2_DAS,
375
+ factionId: FACTION_FRIENDLY_TO_ALL,
376
+ stopCombat: true,
377
+ thugsYield: true,
378
+ evadeTimerMs: DASHEL_EVADE_EVENT_MS,
379
+ dialogStarted: true,
380
+ cite: 'stormwind_city.cpp:376-407 SAY_2 + faction 35 + stop + thugs yield + evade 2000',
381
+ };
382
+ }
383
+
384
+ export interface DashelReachedHomeResult {
385
+ textId: number | null;
386
+ /** Next m_phaseThugEventStage (1 if thugs alive, 5 if dead). */
387
+ phaseStage: number;
388
+ endEventMs: number;
389
+ cite: string;
390
+ }
391
+
392
+ /** Port of JustReachedHome while m_dialogStarted. Cite: stormwind_city.cpp:251–271 */
393
+ export function dashelReachedHome(
394
+ dialogStarted: boolean,
395
+ thugsAlive: boolean,
396
+ ): DashelReachedHomeResult {
397
+ if (!dialogStarted) {
398
+ return {
399
+ textId: null,
400
+ phaseStage: 0,
401
+ endEventMs: 0,
402
+ cite: 'stormwind_city.cpp:254 !m_dialogStarted → no end event',
403
+ };
404
+ }
405
+ if (thugsAlive) {
406
+ return {
407
+ textId: SAY_PROGRESS_3_DAS,
408
+ phaseStage: 1,
409
+ endEventMs: DASHEL_END_EVENT_ARM_MS,
410
+ cite: 'stormwind_city.cpp:258-263 SAY_3 + stage 1 + END_EVENT 3000',
411
+ };
412
+ }
413
+ return {
414
+ textId: SAY_PROGRESS_3_DAS,
415
+ phaseStage: 5,
416
+ endEventMs: DASHEL_END_EVENT_ARM_MS,
417
+ cite: 'stormwind_city.cpp:266-269 SAY_3 + stage 5 skip RP + END_EVENT 3000',
418
+ };
419
+ }
420
+
421
+ export interface DashelEndEventResult {
422
+ handled: boolean;
423
+ /** Broadcast text for thug lines (stage 1/2). */
424
+ textId: number | null;
425
+ /** Thug index to ResetThug MovePoint(10) (stage 3/4). */
426
+ resetThugIndex: number | null;
427
+ questCredit: boolean;
428
+ questId: number | null;
429
+ /** Next stage after ++m_phaseThugEventStage. */
430
+ nextStage: number;
431
+ nextTimerMs: number;
432
+ resetMachine: boolean;
433
+ cite: string;
434
+ }
435
+
436
+ // Port of one HandleEndEvent stage, which the C++ gates on m_thugsAlive. The dead-thug skip jumps
437
+ // to stage 5 with thugsAlive false, so its credit has a dedicated helper. Cite: cpp:274–328.
438
+ export function dashelEndEventStage(
439
+ stage: number,
440
+ thugsAlive: boolean,
441
+ ): DashelEndEventResult {
442
+ if (!thugsAlive) {
443
+ // Dead-thug skip: JustReachedHome arms stage 5; FO6 explore credit is the
444
+ // product stand-in (AreaExploredOrEventHappens). Document both.
445
+ if (stage === 5) {
446
+ return {
447
+ handled: true,
448
+ textId: null,
449
+ resetThugIndex: null,
450
+ questCredit: true,
451
+ questId: QUEST_MISSING_DIPLO_PT8,
452
+ nextStage: 6,
453
+ nextTimerMs: 0,
454
+ resetMachine: true,
455
+ cite: 'stormwind_city.cpp:266-269 stage 5 skip RP → credit 1447 (FO6 finishEscort stand-in; HandleEndEvent body is thugsAlive-gated)',
456
+ };
457
+ }
458
+ return {
459
+ handled: false,
460
+ textId: null,
461
+ resetThugIndex: null,
462
+ questCredit: false,
463
+ questId: null,
464
+ nextStage: stage,
465
+ nextTimerMs: 0,
466
+ resetMachine: false,
467
+ cite: 'stormwind_city.cpp:277 !m_thugsAlive → HandleEndEvent body no-op',
468
+ };
469
+ }
470
+ switch (stage) {
471
+ case 1:
472
+ return {
473
+ handled: true,
474
+ textId: SAY_PROGRESS_4_THU,
475
+ resetThugIndex: null,
476
+ questCredit: false,
477
+ questId: null,
478
+ nextStage: 2,
479
+ nextTimerMs: DASHEL_END_STAGE_TIMERS_MS[1],
480
+ resetMachine: false,
481
+ cite: 'stormwind_city.cpp:282-289 case 1 SAY_4 thug0 + 1500',
482
+ };
483
+ case 2:
484
+ return {
485
+ handled: true,
486
+ textId: SAY_PROGRESS_5_THU,
487
+ resetThugIndex: null,
488
+ questCredit: false,
489
+ questId: null,
490
+ nextStage: 3,
491
+ nextTimerMs: DASHEL_END_STAGE_TIMERS_MS[2],
492
+ resetMachine: false,
493
+ cite: 'stormwind_city.cpp:291-299 case 2 SAY_5 thug1 + 1000',
494
+ };
495
+ case 3:
496
+ return {
497
+ handled: true,
498
+ textId: null,
499
+ resetThugIndex: 0,
500
+ questCredit: false,
501
+ questId: null,
502
+ nextStage: 4,
503
+ nextTimerMs: DASHEL_END_STAGE_TIMERS_MS[3],
504
+ resetMachine: false,
505
+ cite: 'stormwind_city.cpp:301-305 case 3 ResetThug(0) + 1500',
506
+ };
507
+ case 4:
508
+ return {
509
+ handled: true,
510
+ textId: null,
511
+ resetThugIndex: 1,
512
+ questCredit: false,
513
+ questId: null,
514
+ nextStage: 5,
515
+ nextTimerMs: DASHEL_END_STAGE_TIMERS_MS[4],
516
+ resetMachine: false,
517
+ cite: 'stormwind_city.cpp:307-311 case 4 ResetThug(1) + 1000',
518
+ };
519
+ case 5:
520
+ return {
521
+ handled: true,
522
+ textId: null,
523
+ resetThugIndex: null,
524
+ questCredit: true,
525
+ questId: QUEST_MISSING_DIPLO_PT8,
526
+ nextStage: 6,
527
+ nextTimerMs: 0,
528
+ resetMachine: true,
529
+ cite: 'stormwind_city.cpp:313-320 case 5 AreaExploredOrEventHappens(1447) + Reset',
530
+ };
531
+ default:
532
+ return {
533
+ handled: false,
534
+ textId: null,
535
+ resetThugIndex: null,
536
+ questCredit: false,
537
+ questId: null,
538
+ nextStage: stage,
539
+ nextTimerMs: 0,
540
+ resetMachine: false,
541
+ cite: 'stormwind_city.cpp:322 default break',
542
+ };
543
+ }
544
+ }
545
+
546
+ // Pure helpers — Lady Katrana Prestor gossip
547
+
548
+ /** GossipHello for Prestor when quest 4185 incomplete. Cite: stormwind_city.cpp:462–472 */
549
+ export function prestorGossipHello(quest4185Incomplete: boolean): {
550
+ showKatItem: boolean;
551
+ textId: number;
552
+ cite: string;
553
+ } {
554
+ return {
555
+ showKatItem: quest4185Incomplete,
556
+ textId: GOSSIP_TEXT_KAT[0],
557
+ cite: 'stormwind_city.cpp:467-470 ADD_GOSSIP KAT_1 if 4185 incomplete; menu 2693',
558
+ };
559
+ }
560
+
561
+ export interface PrestorGossipSelectResult {
562
+ handled: boolean;
563
+ nextAction: number | null;
564
+ nextItemId: number | null;
565
+ textId: number | null;
566
+ closeMenu: boolean;
567
+ questCredit: boolean;
568
+ questId: number | null;
569
+ cite: string;
570
+ }
571
+
572
+ // Port of GossipSelect_npc_lady_katrana_prestor. Cite: stormwind_city.cpp:475–496 action 0 =
573
+ // GOSSIP_ACTION_INFO_DEF, … +3 credits 4185.
574
+ export function prestorGossipSelect(action: number): PrestorGossipSelectResult {
575
+ // GOSSIP_ACTION_INFO_DEF is typically 1000 in CMaNGOS; cpp uses relative
576
+ // GOSSIP_ACTION_INFO_DEF / +1 / +2 / +3. Model relative steps 0..3.
577
+ switch (action) {
578
+ case 0:
579
+ return {
580
+ handled: true,
581
+ nextAction: 1,
582
+ nextItemId: GOSSIP_ITEM_KAT_2,
583
+ textId: GOSSIP_TEXT_KAT[1],
584
+ closeMenu: false,
585
+ questCredit: false,
586
+ questId: null,
587
+ cite: 'stormwind_city.cpp:479-481 action DEF → KAT_2 + menu 2694',
588
+ };
589
+ case 1:
590
+ return {
591
+ handled: true,
592
+ nextAction: 2,
593
+ nextItemId: GOSSIP_ITEM_KAT_3,
594
+ textId: GOSSIP_TEXT_KAT[2],
595
+ closeMenu: false,
596
+ questCredit: false,
597
+ questId: null,
598
+ cite: 'stormwind_city.cpp:483-485 action DEF+1 → KAT_3 + menu 2695',
599
+ };
600
+ case 2:
601
+ return {
602
+ handled: true,
603
+ nextAction: 3,
604
+ nextItemId: GOSSIP_ITEM_KAT_4,
605
+ textId: GOSSIP_TEXT_KAT[3],
606
+ closeMenu: false,
607
+ questCredit: false,
608
+ questId: null,
609
+ cite: 'stormwind_city.cpp:487-489 action DEF+2 → KAT_4 + menu 2696',
610
+ };
611
+ case 3:
612
+ return {
613
+ handled: true,
614
+ nextAction: null,
615
+ nextItemId: null,
616
+ textId: null,
617
+ closeMenu: true,
618
+ questCredit: true,
619
+ questId: QUEST_TRUE_MASTERS,
620
+ cite: 'stormwind_city.cpp:491-493 CLOSE + AreaExploredOrEventHappens(4185)',
621
+ };
622
+ default:
623
+ return {
624
+ handled: false,
625
+ nextAction: null,
626
+ nextItemId: null,
627
+ textId: null,
628
+ closeMenu: false,
629
+ questCredit: false,
630
+ questId: null,
631
+ cite: 'stormwind_city.cpp:475-496 unknown action',
632
+ };
633
+ }
634
+ }
635
+
636
+ // Pure helpers — Squire Rowe
637
+
638
+ export interface RoweGossipHelloResult {
639
+ textId: number;
640
+ showWindsorItem: boolean;
641
+ cite: string;
642
+ }
643
+
644
+ // Port of GossipHello_npc_squire_rowe eligibility. Cite: stormwind_city.cpp:663–687 Eligible when (6402
645
+ // complete & unrewarded) OR (6402 rewarded & 6403 incomplete).
646
+ export function roweGossipHello(opts: {
647
+ quest6402CompleteUnrewarded: boolean;
648
+ quest6402Rewarded: boolean;
649
+ quest6403Complete: boolean;
650
+ eventInProgress: boolean;
651
+ }): RoweGossipHelloResult {
652
+ const eligible =
653
+ opts.quest6402CompleteUnrewarded ||
654
+ (opts.quest6402Rewarded && !opts.quest6403Complete);
655
+ if (!eligible) {
656
+ return {
657
+ textId: GOSSIP_TEXT_ID_DEFAULT,
658
+ showWindsorItem: false,
659
+ cite: 'stormwind_city.cpp:684-685 default menu 9063',
660
+ };
661
+ }
662
+ if (opts.eventInProgress) {
663
+ return {
664
+ textId: GOSSIP_TEXT_ID_PROGRESS,
665
+ showWindsorItem: false,
666
+ cite: 'stormwind_city.cpp:676-677 event in progress menu 9064',
667
+ };
668
+ }
669
+ return {
670
+ textId: GOSSIP_TEXT_ID_START,
671
+ showWindsorItem: true,
672
+ cite: 'stormwind_city.cpp:680-681 ADD WINDSOR item + menu 9065',
673
+ };
674
+ }
675
+
676
+ /** Rowe escort WaypointReached. Cite: stormwind_city.cpp:584–601 */
677
+ export const ROWE_WAYPOINTS = [
678
+ {
679
+ pointId: 3,
680
+ /** UNIT_STAND_STATE_KNEEL. Cite: Unit.h:105 = 8 */
681
+ standState: 8 as number | null,
682
+ castSpellId: null as number | null,
683
+ summonWindsor: false,
684
+ textId: null as number | null,
685
+ pauseEscort: false,
686
+ cite: 'stormwind_city.cpp:588-589 case 3 UNIT_STAND_STATE_KNEEL; Unit.h:105',
687
+ },
688
+ {
689
+ pointId: 4,
690
+ /** UNIT_STAND_STATE_STAND. Cite: Unit.h:97 = 0 */
691
+ standState: 0,
692
+ castSpellId: SPELL_BLUE_FIREWORK,
693
+ summonWindsor: true,
694
+ textId: null,
695
+ pauseEscort: false,
696
+ cite: 'stormwind_city.cpp:591-595 case 4 firework 11540 + STAND + Summon NPC_WINDSOR',
697
+ },
698
+ {
699
+ pointId: 7,
700
+ standState: null,
701
+ castSpellId: null,
702
+ summonWindsor: false,
703
+ textId: SAY_SIGNAL_SENT,
704
+ pauseEscort: true,
705
+ cite: 'stormwind_city.cpp:597-599 case 7 SAY_SIGNAL_SENT + pause',
706
+ },
707
+ ] as const;
708
+
709
+ export interface RoweWaypointResult {
710
+ handled: boolean;
711
+ standState: number | null;
712
+ castSpellId: number | null;
713
+ summonWindsor: boolean;
714
+ textId: number | null;
715
+ pauseEscort: boolean;
716
+ cite: string;
717
+ }
718
+
719
+ export function roweWaypointReached(pointId: number): RoweWaypointResult {
720
+ const step = ROWE_WAYPOINTS.find((w) => w.pointId === pointId);
721
+ if (!step) {
722
+ return {
723
+ handled: false,
724
+ standState: null,
725
+ castSpellId: null,
726
+ summonWindsor: false,
727
+ textId: null,
728
+ pauseEscort: false,
729
+ cite: 'stormwind_city.cpp:584-601 no case',
730
+ };
731
+ }
732
+ return {
733
+ handled: true,
734
+ standState: step.standState,
735
+ castSpellId: step.castSpellId,
736
+ summonWindsor: step.summonWindsor,
737
+ textId: step.textId,
738
+ pauseEscort: step.pauseEscort,
739
+ cite: step.cite,
740
+ };
741
+ }
742
+
743
+ // Pure helpers — Reginald Windsor
744
+
745
+ export interface WindsorQuestAcceptResult {
746
+ handled: boolean;
747
+ startDialogueTextId: number | null;
748
+ cite: string;
749
+ }
750
+
751
+ // Port of QuestAccept_npc_reginald_windsor → DoStartEscort. Cite: stormwind_city.cpp:1273–1281, 1212–1216
752
+ export function windsorQuestAccept(questId: number): WindsorQuestAcceptResult {
753
+ if (questId !== QUEST_THE_GREAT_MASQUERADE) {
754
+ return {
755
+ handled: false,
756
+ startDialogueTextId: null,
757
+ cite: 'stormwind_city.cpp:1275 quest != 6403 → no-op',
758
+ };
759
+ }
760
+ return {
761
+ handled: true,
762
+ startDialogueTextId: SAY_WINDSOR_QUEST_ACCEPT,
763
+ cite: 'stormwind_city.cpp:1214-1215 StartNextDialogueText SAY_WINDSOR_QUEST_ACCEPT',
764
+ };
765
+ }
766
+
767
+ /** Keep-event gossip gate. Cite: stormwind_city.cpp:1284–1305 */
768
+ export function windsorKeepGossipReady(opts: {
769
+ isKeepReady: boolean;
770
+ quest6403Complete: boolean;
771
+ quest6402Rewarded: boolean;
772
+ }): { showKeepItem: boolean; textId: number; cite: string } {
773
+ if (
774
+ opts.isKeepReady &&
775
+ !opts.quest6403Complete &&
776
+ opts.quest6402Rewarded
777
+ ) {
778
+ return {
779
+ showKeepItem: true,
780
+ textId: GOSSIP_TEXT_ID_MASQUERADE,
781
+ cite: 'stormwind_city.cpp:1292-1295 ADD REGINALD item + menu 5633',
782
+ };
783
+ }
784
+ return {
785
+ showKeepItem: false,
786
+ textId: 0,
787
+ cite: 'stormwind_city.cpp:1297-1302 default quest menu',
788
+ };
789
+ }
790
+
791
+ /** Masquerade finale credit step. Cite: stormwind_city.cpp:1169–1177 SAY_BOLVAR_KEEP_15 → explore 6403 */
792
+ export function windsorMasqueradeCredit(): {
793
+ questId: number;
794
+ textIds: number[];
795
+ cite: string;
796
+ } {
797
+ return {
798
+ questId: QUEST_THE_GREAT_MASQUERADE,
799
+ textIds: [-1000870, -1000871], // SAY_WINDSOR_KEEP_16 + EMOTE_WINDSOR_DIE
800
+ cite: 'stormwind_city.cpp:1169-1177 RewardPlayerAndGroupAtEventExplored(6403)',
801
+ };
802
+ }
803
+
804
+ // Pure helpers — Mattingly / Afrasiabi head gossip
805
+
806
+ /** Port of GossipHello_npc_major_mattingly. Cite: stormwind_city.cpp:1330–1339 */
807
+ export function mattinglyGossipId(
808
+ defaultGossipMenuId: number,
809
+ onyxiaHeadSpawned: boolean,
810
+ ): { gossipId: number; cite: string } {
811
+ if (onyxiaHeadSpawned) {
812
+ return {
813
+ gossipId: GOSSIP_HEAD_MAT,
814
+ cite: 'stormwind_city.cpp:1333-1335 GO_HEAD_OF_ONYXIA_SW spawned → GOSSIP_HEAD_MAT 5754',
815
+ };
816
+ }
817
+ return {
818
+ gossipId: defaultGossipMenuId,
819
+ cite: 'stormwind_city.cpp:1332 default GossipMenuId',
820
+ };
821
+ }
822
+
823
+ /** Port of GossipHello_npc_field_marshal_afrasiabi. Cite: stormwind_city.cpp:1342–1351 */
824
+ export function afrasiabiGossipId(
825
+ defaultGossipMenuId: number,
826
+ nefarianHeadSpawned: boolean,
827
+ ): { gossipId: number; cite: string } {
828
+ if (nefarianHeadSpawned) {
829
+ return {
830
+ gossipId: GOSSIP_HEAD_AFRA,
831
+ cite: 'stormwind_city.cpp:1345-1347 GO_HEAD_OF_NEFARIAN_SW spawned → GOSSIP_HEAD_AFRA 6027',
832
+ };
833
+ }
834
+ return {
835
+ gossipId: defaultGossipMenuId,
836
+ cite: 'stormwind_city.cpp:1344 default GossipMenuId',
837
+ };
838
+ }
839
+
840
+ // ScriptDev IR — npc_bartleby
841
+
842
+ // npc_bartlebyAI, creature 6090. No combat cast timers — a DamageTaken yield below 15% HP gives
843
+ // quest 1640 credit and evades. Cite: stormwind_city.cpp:49–85.
844
+ export const NPC_BARTLEBY_SCRIPT: ScriptDevIR = {
845
+ name: 'npc_bartleby',
846
+ boundCreatures: [NPC_BARTLEBY],
847
+ sourceFile: 'eastern_kingdoms/stormwind_city.cpp',
848
+ spellIds: [],
849
+ timers: [],
850
+ phases: [
851
+ {
852
+ phase: 1,
853
+ hpBelowPct: BARTLEBY_YIELD_HP_PCT,
854
+ actions: [
855
+ {
856
+ kind: 'quest_credit',
857
+ entry: QUEST_BEAT,
858
+ cite: 'stormwind_city.cpp:64 AreaExploredOrEventHappens(QUEST_BEAT=1640)',
859
+ },
860
+ {
861
+ kind: 'stop_combat',
862
+ cite: 'stormwind_city.cpp:66 EnterEvadeMode after yield clamp',
863
+ },
864
+ {
865
+ kind: 'flavor',
866
+ text: 'DamageTaken yield <15% - clamp leave 1 HP + explore 1640 + evade',
867
+ cite: 'stormwind_city.cpp:58-68; bartlebyDamageTaken pure helper',
868
+ },
869
+ ],
870
+ cite: 'stormwind_city.cpp:60 post-hit HP% < 15 yield (DamageTaken)',
871
+ },
872
+ ],
873
+ lifecycle: {
874
+ onReset: [
875
+ {
876
+ kind: 'flavor',
877
+ text: 'npc_bartlebyAI Reset empty (DamageTaken yield only)',
878
+ cite: 'stormwind_city.cpp:56 Reset() override {}',
879
+ },
880
+ ],
881
+ },
882
+ cites: [
883
+ 'stormwind_city.cpp:39-85 npc_bartleby',
884
+ 'stormwind_city.cpp:45-47 FACTION_ENEMY=168 QUEST_BEAT=1640',
885
+ 'stormwind_city.cpp:58-68 DamageTaken <15% clamp + explore 1640 + evade',
886
+ 'stormwind_city.cpp:72-79 QuestAccept FACTION_ENEMY + AttackStart',
887
+ ],
888
+ };
889
+
890
+ // ScriptDev IR — npc_dashel_stonefist
891
+
892
+ // npc_dashel_stonefistAI, creature 4961. No UpdateAI cast timers — a timerless low-HP action plus
893
+ // custom OOC events. The ≤20% yield is a phase; the full RP lives in pure helpers.
894
+ export const NPC_DASHEL_STONEFIST_SCRIPT: ScriptDevIR = {
895
+ name: 'npc_dashel_stonefist',
896
+ boundCreatures: [NPC_DASHEL_STONEFIST],
897
+ sourceFile: 'eastern_kingdoms/stormwind_city.cpp',
898
+ spellIds: [SPELL_UNKILLABLE_OFF],
899
+ timers: [],
900
+ phases: [
901
+ {
902
+ phase: 1,
903
+ hpBelowPct: DASHEL_YIELD_HP_PCT,
904
+ actions: [
905
+ {
906
+ kind: 'yell',
907
+ textId: SAY_PROGRESS_2_DAS,
908
+ cite: 'stormwind_city.cpp:379 DoBroadcastText SAY_PROGRESS_2_DAS=1712',
909
+ },
910
+ {
911
+ kind: 'stop_combat',
912
+ cite: 'stormwind_city.cpp:382-385 AttackStop + CombatStop + ResetThreat',
913
+ },
914
+ {
915
+ kind: 'flavor',
916
+ text: 'FACTION_FRIENDLY_TO_ALL 35 + thugs yield + evade 2000 + dialog → explore 1447',
917
+ cite: 'stormwind_city.cpp:381-407; dashelLowHp / dashelEndEventStage pure helpers',
918
+ },
919
+ ],
920
+ cite: 'stormwind_city.cpp:374 GetHealthPercent() <= 20.f DASHEL_LOW_HP quest fight',
921
+ },
922
+ ],
923
+ lifecycle: {
924
+ onReset: [
925
+ {
926
+ kind: 'flavor',
927
+ text: 'Reset clears thugs/playerGuid; restore QUESTGIVER; REACT_PASSIVE; fail quest if mid-fight',
928
+ cite: 'stormwind_city.cpp:160-191',
929
+ },
930
+ ],
931
+ },
932
+ unusedBindings: [
933
+ {
934
+ entry: NPC_OLD_TOWN_THUG,
935
+ kind: 'creature',
936
+ reason:
937
+ 'NPC 4969 Old Town Thug is quest-fight summon-only (stormwind_city.cpp:427-439); absent from product bake - IR ported; spawn/waypoint/reset coords in DASHEL_THUG_*',
938
+ cite: 'stormwind_city.cpp:102,110-123,427-439; loadRealBundle missing 4969',
939
+ },
940
+ ],
941
+ cites: [
942
+ 'stormwind_city.cpp:87-448 npc_dashel_stonefist',
943
+ 'stormwind_city.cpp:94-108 SAY/quest/faction/SPELL_UNKILLABLE_OFF=13835',
944
+ 'stormwind_city.cpp:202 StartEvent delay 2000',
945
+ 'stormwind_city.cpp:233-236 HandleStartEvent SetDeathPrevention + AttackStart',
946
+ 'stormwind_city.cpp:251-271 JustReachedHome SAY_3 + END_EVENT 3000',
947
+ 'stormwind_city.cpp:274-328 HandleEndEvent stages 1-5 credit 1447',
948
+ 'stormwind_city.cpp:372-409 DASHEL_LOW_HP <=20%',
949
+ 'stormwind_city.cpp:413-447 QuestAccept 1447 thugs + StartEvent',
950
+ ],
951
+ };
952
+
953
+ // ScriptDev IR — npc_lady_katrana_prestor
954
+
955
+ // Cite: stormwind_city.cpp:462–497 gossip only (no AI). Binding: creature 1749 ScriptName
956
+ // npc_lady_katrana_prestor. Also NPC_PRESTOR for Windsor masquerade (world_eastern_kingdoms.h).
957
+ export const NPC_LADY_KATRANA_PRESTOR_SCRIPT: ScriptDevIR = {
958
+ name: 'npc_lady_katrana_prestor',
959
+ boundCreatures: [NPC_LADY_KATRANA_PRESTOR],
960
+ sourceFile: 'eastern_kingdoms/stormwind_city.cpp',
961
+ spellIds: [],
962
+ timers: [],
963
+ gossipHello: {
964
+ defaultTextId: GOSSIP_TEXT_KAT[0],
965
+ cite: 'stormwind_city.cpp:470 SEND_GOSSIP_MENU 2693; prestorGossipHello pure helper for 4185 item',
966
+ },
967
+ lifecycle: {
968
+ onReset: [
969
+ {
970
+ kind: 'flavor',
971
+ text: 'gossip-only (no GetAI / no combat timers)',
972
+ cite: 'stormwind_city.cpp:1368-1372 pGossipHello + pGossipSelect only',
973
+ },
974
+ ],
975
+ },
976
+ cites: [
977
+ 'stormwind_city.cpp:450-497 npc_lady_katrana_prestor',
978
+ 'stormwind_city.cpp:456-459 GOSSIP_ITEM_KAT_1..4',
979
+ 'stormwind_city.cpp:462-472 GossipHello 4185 incomplete → KAT_1 + menu 2693',
980
+ 'stormwind_city.cpp:475-496 GossipSelect chain 2694-2696 + explore 4185',
981
+ ],
982
+ };
983
+
984
+ // ScriptDev IR — npc_squire_rowe
985
+
986
+ // Cite: stormwind_city.cpp:538–700 npc_squire_roweAI Binding: creature 17804 ScriptName npc_squire_rowe —
987
+ // ABSENT from bake (unused-binding). Escort + intro dialogue pure helpers still ported.
988
+ export const NPC_SQUIRE_ROWE_SCRIPT: ScriptDevIR = {
989
+ name: 'npc_squire_rowe',
990
+ boundCreatures: [NPC_SQUIRE_ROWE],
991
+ sourceFile: 'eastern_kingdoms/stormwind_city.cpp',
992
+ spellIds: [SPELL_BLUE_FIREWORK, SPELL_DISMISS_HORSE, SPELL_WINDSOR_INSPIRATION],
993
+ timers: [],
994
+ unusedBindings: [
995
+ {
996
+ entry: NPC_SQUIRE_ROWE,
997
+ kind: 'creature',
998
+ reason:
999
+ 'Creature 17804 Squire Rowe is DB-bound ScriptName npc_squire_rowe but absent from product bake - IR + pure helpers ported; product cannot spawn until rebake',
1000
+ cite: 'stormwind_city.cpp:1354-1379; loadRealBundle missing 17804',
1001
+ },
1002
+ {
1003
+ entry: NPC_WINDSOR_MOUNT,
1004
+ kind: 'creature',
1005
+ reason:
1006
+ 'NPC 12581 Windsor mount is visual-only for intro unmount (SPELL_DISMISS_HORSE 20000); absent from bake',
1007
+ cite: 'stormwind_city.cpp:515,608-615; loadRealBundle missing 12581',
1008
+ },
1009
+ ],
1010
+ lifecycle: {
1011
+ onReset: [
1012
+ {
1013
+ kind: 'flavor',
1014
+ text: 'npc_escortAI Reset empty; m_isEventInProgress cleared on Windsor despawn',
1015
+ cite: 'stormwind_city.cpp:551 Reset() override {}',
1016
+ },
1017
+ ],
1018
+ },
1019
+ cites: [
1020
+ 'stormwind_city.cpp:499-700 npc_squire_rowe',
1021
+ 'stormwind_city.cpp:517-519 SPELL_BLUE_FIREWORK=11540 DISMISS_HORSE=20000 WINDSOR_INSPIRATION=20273',
1022
+ 'stormwind_city.cpp:521-522 QUEST_STORMWIND_RENDEZVOUS=6402 THE_GREAT_MASQUERADE=6403',
1023
+ 'stormwind_city.cpp:525-533 aIntroDialogue delays',
1024
+ 'stormwind_city.cpp:584-601 WaypointReached WP3/4/7',
1025
+ 'stormwind_city.cpp:604-641 JustDidDialogueStep unmount + welcome',
1026
+ 'stormwind_city.cpp:663-700 GossipHello/Select start escort',
1027
+ ],
1028
+ };
1029
+
1030
+ // ScriptDev IR — npc_reginald_windsor
1031
+
1032
+ // Cite: stormwind_city.cpp:860–1318 npc_reginald_windsorAI Binding: creature 12580 ScriptName
1033
+ // npc_reginald_windsor (in bake). Combat kit on UpdateEscortAI when hostile; escort/dialogue pure helpers.
1034
+ export const NPC_REGINALD_WINDSOR_SCRIPT: ScriptDevIR = {
1035
+ name: 'npc_reginald_windsor',
1036
+ boundCreatures: [NPC_WINDSOR],
1037
+ sourceFile: 'eastern_kingdoms/stormwind_city.cpp',
1038
+ spellIds: [
1039
+ SPELL_HAMMER_OF_JUSTICE,
1040
+ SPELL_SHIELD_WALL,
1041
+ SPELL_STRONG_CLEAVE,
1042
+ SPELL_WINDSOR_INSPIRATION,
1043
+ SPELL_ONYXIA_TRANSFORM,
1044
+ SPELL_WINDSOR_READ,
1045
+ SPELL_WINDSOR_DEATH,
1046
+ SPELL_ONYXIA_DESPAWN,
1047
+ ],
1048
+ timers: [
1049
+ {
1050
+ id: 'hammer_of_justice',
1051
+ spellId: SPELL_HAMMER_OF_JUSTICE,
1052
+ initialMinMs: WINDSOR_HAMMER_INIT_MIN_MS,
1053
+ initialMaxMs: WINDSOR_HAMMER_INIT_MAX_MS,
1054
+ repeatMinMs: WINDSOR_HAMMER_REPEAT_MS,
1055
+ repeatMaxMs: WINDSOR_HAMMER_REPEAT_MS,
1056
+ target: 'victim',
1057
+ cite: 'stormwind_city.cpp:888,1253-1257 Hammer init urand(0,1000) re-arm 60000 victim',
1058
+ },
1059
+ {
1060
+ id: 'strong_cleave',
1061
+ spellId: SPELL_STRONG_CLEAVE,
1062
+ initialMinMs: WINDSOR_CLEAVE_INIT_MIN_MS,
1063
+ initialMaxMs: WINDSOR_CLEAVE_INIT_MAX_MS,
1064
+ repeatMinMs: WINDSOR_CLEAVE_REPEAT_MIN_MS,
1065
+ repeatMaxMs: WINDSOR_CLEAVE_REPEAT_MAX_MS,
1066
+ target: 'victim',
1067
+ cite: 'stormwind_city.cpp:889,1261-1265 Strong Cleave init urand(1000,3000) re-arm urand(1000,5000) victim',
1068
+ },
1069
+ ],
1070
+ lifecycle: {
1071
+ onAggro: [
1072
+ {
1073
+ kind: 'cast_self',
1074
+ spellId: SPELL_SHIELD_WALL,
1075
+ cite: 'stormwind_city.cpp:892-895 Aggro DoCastSpellIfCan SPELL_SHIELD_WALL=871',
1076
+ },
1077
+ ],
1078
+ onReset: [
1079
+ {
1080
+ kind: 'flavor',
1081
+ text: 'Reset: hammer urand(0,1000) cleave urand(1000,3000); questgiver flag script-controlled',
1082
+ cite: 'stormwind_city.cpp:884-890,866 RemoveFlag QUESTGIVER',
1083
+ },
1084
+ ],
1085
+ },
1086
+ unusedBindings: [
1087
+ {
1088
+ entry: NPC_WRYNN,
1089
+ kind: 'creature',
1090
+ reason:
1091
+ 'NPC 1747 King Varian Wrynn is masquerade keep cast (world_eastern_kingdoms.h); absent from product bake - dialogue steps still documented',
1092
+ cite: 'world_eastern_kingdoms.h:9; stormwind_city.cpp:1057-1078; loadRealBundle missing 1747',
1093
+ },
1094
+ {
1095
+ entry: NPC_GUARD_PATROLLER,
1096
+ kind: 'creature',
1097
+ reason:
1098
+ 'NPC 1976 used as dialogue token NPC_GUARD_PATROLLER (reset Bolvar/Wrynn); absent from bake',
1099
+ cite: 'stormwind_city.cpp:771,1179-1201; loadRealBundle missing 1976',
1100
+ },
1101
+ {
1102
+ entry: NPC_GUARD_ONYXIA,
1103
+ kind: 'creature',
1104
+ reason:
1105
+ 'NPC 12739 Onyxia guard is UpdateEntry morph target for royal guards; absent from bake',
1106
+ cite: 'stormwind_city.cpp:772,1118; loadRealBundle missing 12739',
1107
+ },
1108
+ ],
1109
+ cites: [
1110
+ 'stormwind_city.cpp:703-1318 npc_reginald_windsor',
1111
+ 'stormwind_city.cpp:759-767 combat + keep spells',
1112
+ 'stormwind_city.cpp:884-890 Reset hammer/cleave timers',
1113
+ 'stormwind_city.cpp:892-895 Aggro Shield Wall',
1114
+ 'stormwind_city.cpp:897-947 WaypointReached WP1/2/4/12/23/26',
1115
+ 'stormwind_city.cpp:970-1203 JustDidDialogueStep keep finale + explore 6403',
1116
+ 'stormwind_city.cpp:1220-1269 UpdateEscortAI dialogue + hammer + cleave',
1117
+ 'stormwind_city.cpp:1273-1318 QuestAccept 6403 + keep gossip',
1118
+ 'world_eastern_kingdoms.h:8-12 NPC_JONATHAN=466 WRYNN=1747 BOLVAR=1748 PRESTOR=1749 WINDSOR=12580',
1119
+ ],
1120
+ };
1121
+
1122
+ // ScriptDev IR — npc_major_mattingly
1123
+
1124
+ // Cite: stormwind_city.cpp:1330–1339 gossip only. Binding: creature 14394 ScriptName npc_major_mattingly.
1125
+ // Celebration ender for quest 7496 Celebrating Good Times.
1126
+ export const NPC_MAJOR_MATTINGLY_SCRIPT: ScriptDevIR = {
1127
+ name: 'npc_major_mattingly',
1128
+ boundCreatures: [NPC_MAJOR_MATTINGLY],
1129
+ sourceFile: 'eastern_kingdoms/stormwind_city.cpp',
1130
+ spellIds: [],
1131
+ timers: [],
1132
+ unusedBindings: [
1133
+ {
1134
+ entry: GO_HEAD_OF_ONYXIA_SW,
1135
+ kind: 'go',
1136
+ reason:
1137
+ 'GO 179558 Head of Onyxia (SW) gates gossip menu 5754 when spawned within 100yd; absent from product bake - default GossipMenuId path remains',
1138
+ cite: 'stormwind_city.cpp:1324,1333-1335; loadRealBundle missing 179558',
1139
+ },
1140
+ ],
1141
+ lifecycle: {
1142
+ onReset: [
1143
+ {
1144
+ kind: 'flavor',
1145
+ text: 'gossip-only head-of-Onyxia menu swap (mattinglyGossipId pure helper)',
1146
+ cite: 'stormwind_city.cpp:1330-1339',
1147
+ },
1148
+ ],
1149
+ },
1150
+ cites: [
1151
+ 'stormwind_city.cpp:1321-1339 npc_major_mattingly',
1152
+ 'stormwind_city.cpp:1324 GO_HEAD_OF_ONYXIA_SW=179558',
1153
+ 'stormwind_city.cpp:1326 GOSSIP_HEAD_MAT=5754',
1154
+ 'stormwind_city.cpp:1389-1392 RegisterSelf pGossipHello',
1155
+ ],
1156
+ };
1157
+
1158
+ // ScriptDev IR — npc_field_marshal_afrasiabi
1159
+
1160
+ // Cite: stormwind_city.cpp:1342–1351 gossip only. Binding: creature 14721 ScriptName
1161
+ // npc_field_marshal_afrasiabi. Celebration ender for quest 7782 The Lord of Blackrock.
1162
+ export const NPC_FIELD_MARSHAL_AFRASIABI_SCRIPT: ScriptDevIR = {
1163
+ name: 'npc_field_marshal_afrasiabi',
1164
+ boundCreatures: [NPC_FIELD_MARSHAL_AFRASIABI],
1165
+ sourceFile: 'eastern_kingdoms/stormwind_city.cpp',
1166
+ spellIds: [],
1167
+ timers: [],
1168
+ unusedBindings: [
1169
+ {
1170
+ entry: GO_HEAD_OF_NEFARIAN_SW,
1171
+ kind: 'go',
1172
+ reason:
1173
+ 'GO 179882 Head of Nefarian (SW) gates gossip menu 6027 when spawned within 100yd; absent from product bake - default GossipMenuId path remains',
1174
+ cite: 'stormwind_city.cpp:1323,1345-1347; loadRealBundle missing 179882',
1175
+ },
1176
+ ],
1177
+ lifecycle: {
1178
+ onReset: [
1179
+ {
1180
+ kind: 'flavor',
1181
+ text: 'gossip-only head-of-Nefarian menu swap (afrasiabiGossipId pure helper)',
1182
+ cite: 'stormwind_city.cpp:1342-1351',
1183
+ },
1184
+ ],
1185
+ },
1186
+ cites: [
1187
+ 'stormwind_city.cpp:1321-1351 npc_field_marshal_afrasiabi',
1188
+ 'stormwind_city.cpp:1323 GO_HEAD_OF_NEFARIAN_SW=179882',
1189
+ 'stormwind_city.cpp:1327 GOSSIP_HEAD_AFRA=6027',
1190
+ 'stormwind_city.cpp:1394-1397 RegisterSelf pGossipHello',
1191
+ ],
1192
+ };