azeroth-shell 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/README.md +138 -2
  2. package/bin/azsh.mjs +19 -0
  3. package/docs/aifid/eventai-texts.json +4414 -0
  4. package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
  5. package/docs/dungeons/survey/pack-id-migration.json +2418 -0
  6. package/package.json +26 -4
  7. package/src/autopilot/bossSkip.ts +26 -0
  8. package/src/autopilot/combatRotation.ts +824 -0
  9. package/src/autopilot/config.ts +533 -0
  10. package/src/autopilot/consumables.ts +58 -0
  11. package/src/autopilot/encounterStand.ts +121 -0
  12. package/src/autopilot/objectGatePlan.ts +53 -0
  13. package/src/autopilot/pathEngage.ts +229 -0
  14. package/src/autopilot/plan.ts +1643 -0
  15. package/src/autopilot/questPolicy.ts +274 -0
  16. package/src/autopilot/routeStep.ts +69 -0
  17. package/src/autopilot/sessionReport.ts +88 -0
  18. package/src/autopilot/topOffPower.ts +26 -0
  19. package/src/autopilot/view.ts +476 -0
  20. package/src/cli/bootCheck.mjs +34 -0
  21. package/src/cli/bootData.mjs +57 -0
  22. package/src/cli/combatLogFilter.ts +153 -0
  23. package/src/cli/combatLogFormat.ts +613 -0
  24. package/src/cli/fileRepository.mjs +105 -0
  25. package/src/cli/gzLoader.mjs +31 -0
  26. package/src/cli/liveGauntletEscort.ts +978 -0
  27. package/src/cli/liveStratUndead.ts +305 -0
  28. package/src/cli/macroHostCombat.ts +545 -0
  29. package/src/cli/macroHostWorld.ts +330 -0
  30. package/src/cli/prefs.mjs +31 -0
  31. package/src/cli/register.mjs +4 -0
  32. package/src/cli/repl.mjs +693 -0
  33. package/src/cli/rotationText.mjs +226 -0
  34. package/src/cli/squad.mjs +105 -0
  35. package/src/cli/term.mjs +126 -0
  36. package/src/cli/text.mjs +122 -0
  37. package/src/cli/tui.mjs +626 -0
  38. package/src/cli/tuiArena.mjs +109 -0
  39. package/src/cli/tuiAutopilotSettings.mjs +93 -0
  40. package/src/cli/tuiBags.mjs +180 -0
  41. package/src/cli/tuiBars.mjs +133 -0
  42. package/src/cli/tuiBg.mjs +243 -0
  43. package/src/cli/tuiBulk.mjs +162 -0
  44. package/src/cli/tuiCheck.mjs +1882 -0
  45. package/src/cli/tuiCity.mjs +396 -0
  46. package/src/cli/tuiCompanionKit.mjs +300 -0
  47. package/src/cli/tuiCompanions.mjs +471 -0
  48. package/src/cli/tuiDev.mjs +62 -0
  49. package/src/cli/tuiDungeon.mjs +606 -0
  50. package/src/cli/tuiEnchantTarget.mjs +120 -0
  51. package/src/cli/tuiFight.mjs +577 -0
  52. package/src/cli/tuiFightPanes.mjs +228 -0
  53. package/src/cli/tuiFloor.mjs +506 -0
  54. package/src/cli/tuiGear.mjs +158 -0
  55. package/src/cli/tuiHonor.mjs +74 -0
  56. package/src/cli/tuiLoot.mjs +97 -0
  57. package/src/cli/tuiMacros.mjs +144 -0
  58. package/src/cli/tuiOutfitter.mjs +115 -0
  59. package/src/cli/tuiPet.mjs +116 -0
  60. package/src/cli/tuiProfessions.mjs +800 -0
  61. package/src/cli/tuiRaid.mjs +127 -0
  62. package/src/cli/tuiRep.mjs +65 -0
  63. package/src/cli/tuiSaves.mjs +69 -0
  64. package/src/cli/tuiSearch.mjs +363 -0
  65. package/src/cli/tuiSettings.mjs +151 -0
  66. package/src/cli/tuiSimLab.mjs +80 -0
  67. package/src/cli/tuiTalents.mjs +60 -0
  68. package/src/cli/tuiViews.mjs +1178 -0
  69. package/src/cli/tuiWiki.mjs +181 -0
  70. package/src/cli/tuiWorld.mjs +361 -0
  71. package/src/cli/wikiIndex.ts +259 -0
  72. package/src/cli/wikiSources.ts +355 -0
  73. package/src/data/alteracValley.ts +176 -0
  74. package/src/data/appearanceOptions.ts +534 -0
  75. package/src/data/applyLootChanceSanity.ts +21 -0
  76. package/src/data/createFlavor.ts +96 -0
  77. package/src/data/customItems.ts +33 -0
  78. package/src/data/dataStore.ts +1904 -0
  79. package/src/data/dungeonGameObjects.ts +84 -0
  80. package/src/data/dungeonPlateCover.ts +66 -0
  81. package/src/data/dungeonSpawns.ts +294 -0
  82. package/src/data/dungeons/alterac-valley.ts +135 -0
  83. package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
  84. package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
  85. package/src/data/dungeons/apply-instance-geometry.ts +65 -0
  86. package/src/data/dungeons/apply-spawn-placement.ts +171 -0
  87. package/src/data/dungeons/blackfathom-deeps.ts +539 -0
  88. package/src/data/dungeons/blackrock-depths.ts +1410 -0
  89. package/src/data/dungeons/blackwing-lair.ts +129 -0
  90. package/src/data/dungeons/boss-eventai.ts +8 -0
  91. package/src/data/dungeons/deadmines.ts +410 -0
  92. package/src/data/dungeons/dire-maul-east.ts +980 -0
  93. package/src/data/dungeons/dire-maul-north.ts +661 -0
  94. package/src/data/dungeons/dire-maul-west.ts +785 -0
  95. package/src/data/dungeons/dungeon-rooms.json +5479 -0
  96. package/src/data/dungeons/encounter-outdoors.json +359 -0
  97. package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
  98. package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
  99. package/src/data/dungeons/eventai/deadmines.ts +264 -0
  100. package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
  101. package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
  102. package/src/data/dungeons/eventai/helpers.ts +79 -0
  103. package/src/data/dungeons/eventai/index.ts +133 -0
  104. package/src/data/dungeons/eventai/lbrs.ts +372 -0
  105. package/src/data/dungeons/eventai/maraudon.ts +323 -0
  106. package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
  107. package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
  108. package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
  109. package/src/data/dungeons/eventai/scholomance.ts +680 -0
  110. package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
  111. package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
  112. package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
  113. package/src/data/dungeons/eventai/sm-library.ts +55 -0
  114. package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
  115. package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
  116. package/src/data/dungeons/eventai/the-stockade.ts +228 -0
  117. package/src/data/dungeons/eventai/ubrs.ts +225 -0
  118. package/src/data/dungeons/eventai/uldaman.ts +355 -0
  119. package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
  120. package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
  121. package/src/data/dungeons/gnomeregan.ts +909 -0
  122. package/src/data/dungeons/index.ts +126 -0
  123. package/src/data/dungeons/instance-geometry.json +5233 -0
  124. package/src/data/dungeons/key-sources.json +169 -0
  125. package/src/data/dungeons/lbrs.ts +996 -0
  126. package/src/data/dungeons/maraudon.ts +786 -0
  127. package/src/data/dungeons/molten-core.ts +194 -0
  128. package/src/data/dungeons/naxxramas.ts +173 -0
  129. package/src/data/dungeons/onyxias-lair.ts +71 -0
  130. package/src/data/dungeons/pack-from-clusters.ts +1256 -0
  131. package/src/data/dungeons/ragefire-chasm.ts +238 -0
  132. package/src/data/dungeons/razorfen-downs.ts +698 -0
  133. package/src/data/dungeons/razorfen-kraul.ts +766 -0
  134. package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
  135. package/src/data/dungeons/scholomance.ts +1076 -0
  136. package/src/data/dungeons/shadowfang-keep.ts +740 -0
  137. package/src/data/dungeons/sm-armory.ts +266 -0
  138. package/src/data/dungeons/sm-cathedral.ts +430 -0
  139. package/src/data/dungeons/sm-graveyard.ts +482 -0
  140. package/src/data/dungeons/sm-library.ts +337 -0
  141. package/src/data/dungeons/stratholme-live.ts +808 -0
  142. package/src/data/dungeons/stratholme-undead.ts +1164 -0
  143. package/src/data/dungeons/sunken-temple.ts +931 -0
  144. package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
  145. package/src/data/dungeons/the-stockade.ts +282 -0
  146. package/src/data/dungeons/ubrs.ts +1286 -0
  147. package/src/data/dungeons/uldaman.ts +685 -0
  148. package/src/data/dungeons/wailing-caverns.ts +356 -0
  149. package/src/data/dungeons/zul-farrak.ts +686 -0
  150. package/src/data/dungeons/zul-gurub.ts +142 -0
  151. package/src/data/dungeons.ts +42 -0
  152. package/src/data/fixtures.ts +446 -0
  153. package/src/data/gameobject-data.json.gz +0 -0
  154. package/src/data/item-data.json.gz +0 -0
  155. package/src/data/loot-data.json.gz +0 -0
  156. package/src/data/maps/atlas-approach-maps.json +1425 -0
  157. package/src/data/maps/atlas-landmarks.json +1711 -0
  158. package/src/data/maps/dungeon-viewports.json +392 -0
  159. package/src/data/materializeModDamagePercentTaken.ts +70 -0
  160. package/src/data/materializeModHealthRegen.ts +89 -0
  161. package/src/data/materializeSpellReputation.ts +26 -0
  162. package/src/data/pageTexts.ts +19 -0
  163. package/src/data/profession-data.json.gz +0 -0
  164. package/src/data/raid-plans/blackfathom-deeps.json +86 -0
  165. package/src/data/raid-plans/blackrock-depths.json +419 -0
  166. package/src/data/raid-plans/blackwing-lair.json +328 -0
  167. package/src/data/raid-plans/deadmines.json +55 -0
  168. package/src/data/raid-plans/dire-maul-east.json +94 -0
  169. package/src/data/raid-plans/dire-maul-north.json +70 -0
  170. package/src/data/raid-plans/dire-maul-west.json +75 -0
  171. package/src/data/raid-plans/gnomeregan.json +131 -0
  172. package/src/data/raid-plans/lbrs.json +176 -0
  173. package/src/data/raid-plans/maraudon.json +102 -0
  174. package/src/data/raid-plans/molten-core.json +169 -0
  175. package/src/data/raid-plans/naxxramas.json +354 -0
  176. package/src/data/raid-plans/onyxias-lair.json +18 -0
  177. package/src/data/raid-plans/ragefire-chasm.json +30 -0
  178. package/src/data/raid-plans/razorfen-downs.json +75 -0
  179. package/src/data/raid-plans/razorfen-kraul.json +53 -0
  180. package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
  181. package/src/data/raid-plans/scholomance.json +170 -0
  182. package/src/data/raid-plans/shadowfang-keep.json +87 -0
  183. package/src/data/raid-plans/sm-armory.json +53 -0
  184. package/src/data/raid-plans/sm-cathedral.json +72 -0
  185. package/src/data/raid-plans/sm-graveyard.json +63 -0
  186. package/src/data/raid-plans/sm-library.json +23 -0
  187. package/src/data/raid-plans/stratholme-live.json +129 -0
  188. package/src/data/raid-plans/stratholme-undead.json +73 -0
  189. package/src/data/raid-plans/sunken-temple.json +159 -0
  190. package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
  191. package/src/data/raid-plans/the-stockade.json +42 -0
  192. package/src/data/raid-plans/ubrs.json +53 -0
  193. package/src/data/raid-plans/uldaman.json +131 -0
  194. package/src/data/raid-plans/wailing-caverns.json +90 -0
  195. package/src/data/raid-plans/zul-farrak.json +156 -0
  196. package/src/data/raid-plans/zul-gurub.json +307 -0
  197. package/src/data/raidInstanceCreatures.mjs +473 -0
  198. package/src/data/rotations/index.ts +152 -0
  199. package/src/data/rotations/layout.mjs +72 -0
  200. package/src/data/rotations/pve/druid/balance.json +754 -0
  201. package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
  202. package/src/data/rotations/pve/druid/feral.json +2660 -0
  203. package/src/data/rotations/pve/druid/restoration.json +424 -0
  204. package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
  205. package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
  206. package/src/data/rotations/pve/hunter/survival.json +1373 -0
  207. package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
  208. package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
  209. package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
  210. package/src/data/rotations/pve/paladin/holy.json +755 -0
  211. package/src/data/rotations/pve/paladin/protection.json +962 -0
  212. package/src/data/rotations/pve/paladin/retribution.json +924 -0
  213. package/src/data/rotations/pve/priest/discipline.json +772 -0
  214. package/src/data/rotations/pve/priest/holy.json +707 -0
  215. package/src/data/rotations/pve/priest/shadow.json +787 -0
  216. package/src/data/rotations/pve/rogue/assassination.json +2477 -0
  217. package/src/data/rotations/pve/rogue/combat.json +2483 -0
  218. package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
  219. package/src/data/rotations/pve/shaman/elemental.json +1157 -0
  220. package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
  221. package/src/data/rotations/pve/shaman/restoration.json +592 -0
  222. package/src/data/rotations/pve/warlock/affliction.json +1185 -0
  223. package/src/data/rotations/pve/warlock/demonology.json +1165 -0
  224. package/src/data/rotations/pve/warlock/destruction.json +1177 -0
  225. package/src/data/rotations/pve/warrior/arms.json +3020 -0
  226. package/src/data/rotations/pve/warrior/fury.json +2996 -0
  227. package/src/data/rotations/pve/warrior/protection.json +2509 -0
  228. package/src/data/rotations/pvp/druid/balance.json +593 -0
  229. package/src/data/rotations/pvp/druid/feral.json +3276 -0
  230. package/src/data/rotations/pvp/druid/restoration.json +662 -0
  231. package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
  232. package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
  233. package/src/data/rotations/pvp/hunter/survival.json +635 -0
  234. package/src/data/rotations/pvp/mage/arcane.json +574 -0
  235. package/src/data/rotations/pvp/mage/fire.json +570 -0
  236. package/src/data/rotations/pvp/mage/frost.json +4048 -0
  237. package/src/data/rotations/pvp/paladin/holy.json +1498 -0
  238. package/src/data/rotations/pvp/paladin/protection.json +567 -0
  239. package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
  240. package/src/data/rotations/pvp/priest/discipline.json +1848 -0
  241. package/src/data/rotations/pvp/priest/holy.json +6340 -0
  242. package/src/data/rotations/pvp/priest/shadow.json +2329 -0
  243. package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
  244. package/src/data/rotations/pvp/rogue/combat.json +5258 -0
  245. package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
  246. package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
  247. package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
  248. package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
  249. package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
  250. package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
  251. package/src/data/rotations/pvp/warlock/destruction.json +638 -0
  252. package/src/data/rotations/pvp/warrior/arms.json +5665 -0
  253. package/src/data/rotations/pvp/warrior/fury.json +850 -0
  254. package/src/data/rotations/pvp/warrior/protection.json +777 -0
  255. package/src/data/schema/bundle.ts +511 -0
  256. package/src/data/schema/constants.ts +49 -0
  257. package/src/data/schema/creature.ts +454 -0
  258. package/src/data/schema/encounter.ts +155 -0
  259. package/src/data/schema/faction.ts +48 -0
  260. package/src/data/schema/item.ts +297 -0
  261. package/src/data/schema/itemEnchant.ts +105 -0
  262. package/src/data/schema/npc.ts +44 -0
  263. package/src/data/schema/primitives.ts +295 -0
  264. package/src/data/schema/profession.ts +226 -0
  265. package/src/data/schema/quest.ts +154 -0
  266. package/src/data/schema/spell.ts +1149 -0
  267. package/src/data/schema/talent.ts +74 -0
  268. package/src/data/schema/world.ts +124 -0
  269. package/src/data/schema.ts +19 -0
  270. package/src/data/skinNodeGapFill.ts +68 -0
  271. package/src/data/spell-data.json.gz +0 -0
  272. package/src/data/spell-script-targets.json +1 -0
  273. package/src/data/tables/ahItemValues.json.gz +0 -0
  274. package/src/data/tables/alteracValley.json.gz +0 -0
  275. package/src/data/tables/areatriggerTeleports.json.gz +0 -0
  276. package/src/data/tables/botNames.json.gz +0 -0
  277. package/src/data/tables/botPopulation.json.gz +0 -0
  278. package/src/data/tables/botSpecs.json.gz +0 -0
  279. package/src/data/tables/classLevelStats.json.gz +0 -0
  280. package/src/data/tables/combatConditions.json.gz +0 -0
  281. package/src/data/tables/combatSkillMeta.json.gz +0 -0
  282. package/src/data/tables/conditions.json.gz +0 -0
  283. package/src/data/tables/createInfo.json.gz +0 -0
  284. package/src/data/tables/creatureAggroGroups.json.gz +0 -0
  285. package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
  286. package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
  287. package/src/data/tables/creatureWeapons.json.gz +0 -0
  288. package/src/data/tables/creatures.json.gz +0 -0
  289. package/src/data/tables/dbScripts.json.gz +0 -0
  290. package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
  291. package/src/data/tables/dungeonCensus.json.gz +0 -0
  292. package/src/data/tables/dungeonGameObjects.json.gz +0 -0
  293. package/src/data/tables/dungeonPacks.json.gz +0 -0
  294. package/src/data/tables/dungeonPlateCover.json.gz +0 -0
  295. package/src/data/tables/dungeonSpawns.json.gz +0 -0
  296. package/src/data/tables/dungeonSurvey.json.gz +0 -0
  297. package/src/data/tables/durabilityCosts.json.gz +0 -0
  298. package/src/data/tables/durabilityQuality.json.gz +0 -0
  299. package/src/data/tables/enchantApplicators.json.gz +0 -0
  300. package/src/data/tables/entranceYards.json.gz +0 -0
  301. package/src/data/tables/explorationBasexp.json.gz +0 -0
  302. package/src/data/tables/factionTemplates.json.gz +0 -0
  303. package/src/data/tables/factions.json.gz +0 -0
  304. package/src/data/tables/gameEvents.json.gz +0 -0
  305. package/src/data/tables/gameObjects.json.gz +0 -0
  306. package/src/data/tables/gossipMenus.json.gz +0 -0
  307. package/src/data/tables/graveyards.json.gz +0 -0
  308. package/src/data/tables/instanceMaps.json.gz +0 -0
  309. package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
  310. package/src/data/tables/itemEnchants.json.gz +0 -0
  311. package/src/data/tables/itemRandomProperties.json.gz +0 -0
  312. package/src/data/tables/itemSets.json.gz +0 -0
  313. package/src/data/tables/items.json.gz +0 -0
  314. package/src/data/tables/levelStats.json.gz +0 -0
  315. package/src/data/tables/locks.json.gz +0 -0
  316. package/src/data/tables/map-pin-overrides.json.gz +0 -0
  317. package/src/data/tables/nonCombatTrash.json.gz +0 -0
  318. package/src/data/tables/npcTexts.json.gz +0 -0
  319. package/src/data/tables/pageTexts.json.gz +0 -0
  320. package/src/data/tables/petAbilityTP.json.gz +0 -0
  321. package/src/data/tables/petGenericSpells.json.gz +0 -0
  322. package/src/data/tables/petLevelStats.json.gz +0 -0
  323. package/src/data/tables/playerbot-weightscales.json.gz +0 -0
  324. package/src/data/tables/pools.json.gz +0 -0
  325. package/src/data/tables/quests.json.gz +0 -0
  326. package/src/data/tables/races.json.gz +0 -0
  327. package/src/data/tables/reputationRanks.json.gz +0 -0
  328. package/src/data/tables/reputationRates.json.gz +0 -0
  329. package/src/data/tables/reputationSpillover.json.gz +0 -0
  330. package/src/data/tables/ridingSpells.json.gz +0 -0
  331. package/src/data/tables/scriptTexts.json.gz +0 -0
  332. package/src/data/tables/soundClipVolume.json.gz +0 -0
  333. package/src/data/tables/spellChain.json.gz +0 -0
  334. package/src/data/tables/spellTeleports.json.gz +0 -0
  335. package/src/data/tables/spells.json.gz +0 -0
  336. package/src/data/tables/talents.json.gz +0 -0
  337. package/src/data/tables/tavernTriggers.json.gz +0 -0
  338. package/src/data/tables/taxiNodes.json.gz +0 -0
  339. package/src/data/tables/taxiRoutes.json.gz +0 -0
  340. package/src/data/tables/trainers.json.gz +0 -0
  341. package/src/data/tables/transports.json.gz +0 -0
  342. package/src/data/tables/travelAnchors.json.gz +0 -0
  343. package/src/data/tables/travelEdges.json.gz +0 -0
  344. package/src/data/tables/unitConditions.json.gz +0 -0
  345. package/src/data/tables/vendors.json.gz +0 -0
  346. package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
  347. package/src/data/tables/xp.json.gz +0 -0
  348. package/src/data/tables/zoneWeather.json.gz +0 -0
  349. package/src/data/tables/zones.json.gz +0 -0
  350. package/src/data/world-data.ts +56 -0
  351. package/src/data/zone-music-sets.json +2751 -0
  352. package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
  353. package/src/domain/audioQuality.mjs +145 -0
  354. package/src/domain/bg/ab.ts +433 -0
  355. package/src/domain/bg/arenaComps.ts +644 -0
  356. package/src/domain/bg/arenaLab.ts +695 -0
  357. package/src/domain/bg/arenaPace.ts +31 -0
  358. package/src/domain/bg/arenaRating.ts +110 -0
  359. package/src/domain/bg/av.ts +758 -0
  360. package/src/domain/bg/avEnemyPush.ts +219 -0
  361. package/src/domain/bg/avField.ts +283 -0
  362. package/src/domain/bg/avInstanceNodes.ts +197 -0
  363. package/src/domain/bg/avInstanceScore.ts +123 -0
  364. package/src/domain/bg/avQuestItems.ts +55 -0
  365. package/src/domain/bg/avQuests.ts +210 -0
  366. package/src/domain/bg/avSession.ts +196 -0
  367. package/src/domain/bg/bgConsumes.ts +269 -0
  368. package/src/domain/bg/bgPrebuff.ts +153 -0
  369. package/src/domain/bg/bgRest.ts +91 -0
  370. package/src/domain/bg/bgRoster.ts +305 -0
  371. package/src/domain/bg/bgTier.ts +61 -0
  372. package/src/domain/bg/bgWorld.ts +862 -0
  373. package/src/domain/bg/match.ts +215 -0
  374. package/src/domain/bg/strategies.ts +552 -0
  375. package/src/domain/bg/types.ts +291 -0
  376. package/src/domain/bg/wsg.ts +264 -0
  377. package/src/domain/bots/actionProviderSpec.ts +38 -0
  378. package/src/domain/bots/autoConsumables.ts +285 -0
  379. package/src/domain/bots/betweenPullRest.ts +239 -0
  380. package/src/domain/bots/botGear.ts +248 -0
  381. package/src/domain/bots/botInventory.ts +486 -0
  382. package/src/domain/bots/botPet.ts +535 -0
  383. package/src/domain/bots/botPool.ts +291 -0
  384. package/src/domain/bots/botProfessions.ts +334 -0
  385. package/src/domain/bots/companionActionBar.ts +209 -0
  386. package/src/domain/bots/companionHireCost.ts +236 -0
  387. package/src/domain/bots/companionMissions.ts +582 -0
  388. package/src/domain/bots/companionPrep.ts +254 -0
  389. package/src/domain/bots/companionQuests.ts +270 -0
  390. package/src/domain/bots/companionRep.ts +75 -0
  391. package/src/domain/bots/companionRotation.ts +708 -0
  392. package/src/domain/bots/companionXp.ts +66 -0
  393. package/src/domain/bots/consumableShare.ts +811 -0
  394. package/src/domain/bots/dpsMate.ts +1072 -0
  395. package/src/domain/bots/groupCompReport.ts +132 -0
  396. package/src/domain/bots/healthstoneSupply.ts +198 -0
  397. package/src/domain/bots/outfitter.ts +1056 -0
  398. package/src/domain/bots/paladinPrePull.ts +231 -0
  399. package/src/domain/bots/partyRole.ts +40 -0
  400. package/src/domain/bots/playerbotEquipCache.ts +412 -0
  401. package/src/domain/bots/playerbotItemEligibility.ts +60 -0
  402. package/src/domain/bots/playerbotStatWeight.ts +853 -0
  403. package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
  404. package/src/domain/bots/prePullBuffs.ts +219 -0
  405. package/src/domain/bots/prePullStealth.ts +82 -0
  406. package/src/domain/bots/runSupply.ts +251 -0
  407. package/src/domain/bots/runSupplyPrefs.ts +28 -0
  408. package/src/domain/bots/sendTradeGoods.ts +394 -0
  409. package/src/domain/bots/soulShardCap.ts +35 -0
  410. package/src/domain/bots/squad.ts +842 -0
  411. package/src/domain/bots/squadRun.ts +81 -0
  412. package/src/domain/character/actionbar.ts +346 -0
  413. package/src/domain/character/appearance.ts +165 -0
  414. package/src/domain/character/buildCombatant.ts +1726 -0
  415. package/src/domain/character/character.ts +356 -0
  416. package/src/domain/character/characterName.ts +43 -0
  417. package/src/domain/character/characterRatings.ts +424 -0
  418. package/src/domain/character/characterSpells.ts +282 -0
  419. package/src/domain/character/characterStats.ts +1559 -0
  420. package/src/domain/character/characterTalents.ts +398 -0
  421. package/src/domain/character/combatSkills.ts +994 -0
  422. package/src/domain/character/displayForm.ts +72 -0
  423. package/src/domain/character/formTalentAuras.ts +171 -0
  424. package/src/domain/character/forms.ts +499 -0
  425. package/src/domain/character/races.ts +40 -0
  426. package/src/domain/character/resurrectionSickness.ts +49 -0
  427. package/src/domain/character/spellbook.ts +169 -0
  428. package/src/domain/character/stanceBar.ts +354 -0
  429. package/src/domain/character/stancePrereq.ts +70 -0
  430. package/src/domain/character/talentBuilds.ts +63 -0
  431. package/src/domain/character/talentImport.ts +130 -0
  432. package/src/domain/character/talentLink.ts +123 -0
  433. package/src/domain/character/talents.ts +201 -0
  434. package/src/domain/core/conditionSnapshot.ts +92 -0
  435. package/src/domain/core/hover.ts +14 -0
  436. package/src/domain/core/ids.ts +58 -0
  437. package/src/domain/core/internalNameTags.ts +5 -0
  438. package/src/domain/core/runtimeDataPatches.ts +357 -0
  439. package/src/domain/creature/aiTargeting.ts +588 -0
  440. package/src/domain/creature/combatCondition.ts +157 -0
  441. package/src/domain/creature/creatureAggro.ts +804 -0
  442. package/src/domain/creature/creatureAi.ts +206 -0
  443. package/src/domain/creature/creatureAiConstants.ts +661 -0
  444. package/src/domain/creature/creatureCastList.ts +1007 -0
  445. package/src/domain/creature/creatureEventAi.ts +1409 -0
  446. package/src/domain/creature/creatureGroups.ts +144 -0
  447. package/src/domain/creature/creatureLinking.ts +333 -0
  448. package/src/domain/creature/creatureScaling.ts +320 -0
  449. package/src/domain/creature/creatureTrigger.ts +53 -0
  450. package/src/domain/creature/creatureWander.ts +74 -0
  451. package/src/domain/creature/eventAiTexts.ts +145 -0
  452. package/src/domain/creature/faction.ts +287 -0
  453. package/src/domain/creature/forcedReaction.ts +48 -0
  454. package/src/domain/creature/outdoorHuntable.ts +74 -0
  455. package/src/domain/creature/patrolPacks.ts +210 -0
  456. package/src/domain/creature/reputation.ts +967 -0
  457. package/src/domain/creature/unitFlags.ts +74 -0
  458. package/src/domain/creature/worldBosses.ts +393 -0
  459. package/src/domain/dungeonMusic.mjs +48 -0
  460. package/src/domain/economy/auction.ts +282 -0
  461. package/src/domain/economy/auctionBot.ts +1060 -0
  462. package/src/domain/economy/honorPrice.ts +100 -0
  463. package/src/domain/economy/mail.ts +958 -0
  464. package/src/domain/economy/money.ts +42 -0
  465. package/src/domain/economy/syntheticClassTrainers.ts +62 -0
  466. package/src/domain/economy/trading.ts +296 -0
  467. package/src/domain/economy/vendorSellAll.ts +252 -0
  468. package/src/domain/economy/vendorStock.ts +146 -0
  469. package/src/domain/items/ammo.ts +817 -0
  470. package/src/domain/items/bank.ts +162 -0
  471. package/src/domain/items/consumableFamily.ts +205 -0
  472. package/src/domain/items/craftUpgrades.ts +83 -0
  473. package/src/domain/items/createItem.ts +93 -0
  474. package/src/domain/items/durability.ts +581 -0
  475. package/src/domain/items/equipment.ts +441 -0
  476. package/src/domain/items/equipmentHelper.ts +767 -0
  477. package/src/domain/items/inventory.ts +561 -0
  478. package/src/domain/items/itemBonding.ts +93 -0
  479. package/src/domain/items/itemContainer.ts +245 -0
  480. package/src/domain/items/itemDisplayName.ts +33 -0
  481. package/src/domain/items/itemInstance.ts +181 -0
  482. package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
  483. package/src/domain/items/itemRandomProps.ts +77 -0
  484. package/src/domain/items/itemRestrictions.ts +329 -0
  485. package/src/domain/items/itemTeaches.ts +82 -0
  486. package/src/domain/items/itemUseCooldown.ts +52 -0
  487. package/src/domain/items/itemUseTarget.ts +90 -0
  488. package/src/domain/items/junkCategories.ts +174 -0
  489. package/src/domain/items/junkFilter.ts +368 -0
  490. package/src/domain/items/keyring.ts +131 -0
  491. package/src/domain/items/loot.ts +221 -0
  492. package/src/domain/items/mounts.ts +190 -0
  493. package/src/domain/items/onUsePayload.ts +102 -0
  494. package/src/domain/items/pendingLoot.ts +107 -0
  495. package/src/domain/items/relic.ts +105 -0
  496. package/src/domain/items/rocketBoots.ts +36 -0
  497. package/src/domain/items/sortContainer.ts +139 -0
  498. package/src/domain/items/spareContainers.ts +71 -0
  499. package/src/domain/items/spellReagentIndex.ts +131 -0
  500. package/src/domain/items/staleConsumables.ts +66 -0
  501. package/src/domain/items/weaponSpender.ts +110 -0
  502. package/src/domain/listDungeonIds.mjs +28 -0
  503. package/src/domain/macro/compose.ts +239 -0
  504. package/src/domain/macro/conditions.ts +260 -0
  505. package/src/domain/macro/creatureTypes.ts +40 -0
  506. package/src/domain/macro/describe.ts +169 -0
  507. package/src/domain/macro/icon.ts +60 -0
  508. package/src/domain/macro/index.ts +20 -0
  509. package/src/domain/macro/normalize.ts +112 -0
  510. package/src/domain/macro/parse.ts +316 -0
  511. package/src/domain/macro/plan.ts +288 -0
  512. package/src/domain/macro/rotation.ts +590 -0
  513. package/src/domain/macro/rotationEnv.ts +173 -0
  514. package/src/domain/macro/slots.ts +101 -0
  515. package/src/domain/macro/snapshot.ts +114 -0
  516. package/src/domain/macro/templates.ts +446 -0
  517. package/src/domain/macro/types.ts +70 -0
  518. package/src/domain/macro/units.ts +93 -0
  519. package/src/domain/macro/weaponTypes.ts +83 -0
  520. package/src/domain/nav/cityTeleports.ts +10 -0
  521. package/src/domain/nav/mounting.ts +113 -0
  522. package/src/domain/nav/nav.ts +43 -0
  523. package/src/domain/nav/navCollision.ts +606 -0
  524. package/src/domain/nav/navOutdoors.ts +91 -0
  525. package/src/domain/nav/navRegistry.ts +179 -0
  526. package/src/domain/nav/navRoomGraph.ts +302 -0
  527. package/src/domain/nav/navTypes.ts +43 -0
  528. package/src/domain/nav/navmesh.ts +1715 -0
  529. package/src/domain/nav/speed.ts +200 -0
  530. package/src/domain/nav/storey.ts +10 -0
  531. package/src/domain/nav/travel.ts +725 -0
  532. package/src/domain/nav/travelTypes.ts +75 -0
  533. package/src/domain/pet/pet.ts +1150 -0
  534. package/src/domain/pet/petActionBar.ts +180 -0
  535. package/src/domain/pet/petSpellbook.ts +39 -0
  536. package/src/domain/pet/petStable.ts +81 -0
  537. package/src/domain/professions/autoDisenchant.ts +236 -0
  538. package/src/domain/professions/characterEnchants.ts +176 -0
  539. package/src/domain/professions/craftCooldown.ts +52 -0
  540. package/src/domain/professions/enchantApply.ts +62 -0
  541. package/src/domain/professions/enchantTargets.ts +114 -0
  542. package/src/domain/professions/enchanting.ts +236 -0
  543. package/src/domain/professions/gatherFilter.ts +149 -0
  544. package/src/domain/professions/gearEnchant.ts +137 -0
  545. package/src/domain/professions/heldTools.ts +29 -0
  546. package/src/domain/professions/learnAllRecipes.ts +146 -0
  547. package/src/domain/professions/miningHarvest.ts +69 -0
  548. package/src/domain/professions/partyDisenchant.ts +294 -0
  549. package/src/domain/professions/partyWork.ts +83 -0
  550. package/src/domain/professions/pickpocket.ts +172 -0
  551. package/src/domain/professions/poisons.ts +240 -0
  552. package/src/domain/professions/professions.ts +677 -0
  553. package/src/domain/professions/rareNodes.ts +45 -0
  554. package/src/domain/professions/skinLoot.ts +27 -0
  555. package/src/domain/professions/vendorReagents.ts +152 -0
  556. package/src/domain/professions/weaponImbueHand.ts +171 -0
  557. package/src/domain/questFarmFilter.mjs +42 -0
  558. package/src/domain/quests/doQuest.ts +1204 -0
  559. package/src/domain/quests/gossip.ts +308 -0
  560. package/src/domain/quests/gossipTalk.ts +298 -0
  561. package/src/domain/quests/interpreter/canComplete.ts +150 -0
  562. package/src/domain/quests/interpreter/claim.ts +137 -0
  563. package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
  564. package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
  565. package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
  566. package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
  567. package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
  568. package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
  569. package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
  570. package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
  571. package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
  572. package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
  573. package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
  574. package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
  575. package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
  576. package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
  577. package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
  578. package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
  579. package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
  580. package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
  581. package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
  582. package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
  583. package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
  584. package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
  585. package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
  586. package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
  587. package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
  588. package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
  589. package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
  590. package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
  591. package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
  592. package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
  593. package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
  594. package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
  595. package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
  596. package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
  597. package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
  598. package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
  599. package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
  600. package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
  601. package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
  602. package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
  603. package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
  604. package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
  605. package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
  606. package/src/domain/quests/interpreter/diff.ts +349 -0
  607. package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
  608. package/src/domain/quests/interpreter/flags.ts +101 -0
  609. package/src/domain/quests/interpreter/index.ts +113 -0
  610. package/src/domain/quests/interpreter/live.ts +178 -0
  611. package/src/domain/quests/interpreter/types.ts +81 -0
  612. package/src/domain/quests/interpreter/updaters.ts +412 -0
  613. package/src/domain/quests/questCorpseUse.ts +155 -0
  614. package/src/domain/quests/questDialog.ts +43 -0
  615. package/src/domain/quests/questFight.ts +34 -0
  616. package/src/domain/quests/questObjectiveLabel.ts +39 -0
  617. package/src/domain/quests/questRewardChoice.ts +85 -0
  618. package/src/domain/quests/questScriptCredit.ts +26 -0
  619. package/src/domain/quests/questScriptItemUse.ts +74 -0
  620. package/src/domain/quests/questTameRods.ts +79 -0
  621. package/src/domain/quests/questlog.ts +1545 -0
  622. package/src/domain/quests/talkDeliver.ts +170 -0
  623. package/src/domain/raid/globalActionBar.ts +195 -0
  624. package/src/domain/raid/instanceRoster.ts +194 -0
  625. package/src/domain/raid/partySummon.ts +198 -0
  626. package/src/domain/raid/partyVault.ts +320 -0
  627. package/src/domain/raid/raidBossAbilities.ts +268 -0
  628. package/src/domain/raid/raidComp.ts +335 -0
  629. package/src/domain/raid/raidCustomRows.ts +453 -0
  630. package/src/domain/raid/raidEncounterGear.ts +298 -0
  631. package/src/domain/raid/raidEncounterTactics.ts +412 -0
  632. package/src/domain/raid/raidPlan.ts +509 -0
  633. package/src/domain/raid/raidPlanEdits.ts +98 -0
  634. package/src/domain/raid/raidPlanPacks.ts +480 -0
  635. package/src/domain/raid/raidRecovery.ts +183 -0
  636. package/src/domain/raid/raidRosterTemplate.ts +138 -0
  637. package/src/domain/rotation/auraSide.ts +68 -0
  638. package/src/domain/rotation/build.ts +3031 -0
  639. package/src/domain/rotation/classes/druid.ts +58 -0
  640. package/src/domain/rotation/classes/hooks.ts +59 -0
  641. package/src/domain/rotation/classes/hunter.ts +156 -0
  642. package/src/domain/rotation/classes/index.ts +104 -0
  643. package/src/domain/rotation/classes/mage.ts +99 -0
  644. package/src/domain/rotation/classes/paladin.ts +296 -0
  645. package/src/domain/rotation/classes/priest.ts +94 -0
  646. package/src/domain/rotation/classes/pullOpener.ts +92 -0
  647. package/src/domain/rotation/classes/rogue.ts +69 -0
  648. package/src/domain/rotation/classes/shaman.ts +29 -0
  649. package/src/domain/rotation/classes/supportSpec.ts +94 -0
  650. package/src/domain/rotation/classes/warlock.ts +81 -0
  651. package/src/domain/rotation/classes/warrior.ts +402 -0
  652. package/src/domain/rotation/classify.ts +1381 -0
  653. package/src/domain/rotation/condMetricPicker.ts +379 -0
  654. package/src/domain/rotation/consumables.ts +242 -0
  655. package/src/domain/rotation/evaluate.ts +1115 -0
  656. package/src/domain/rotation/finisherLadder.ts +145 -0
  657. package/src/domain/rotation/invent.ts +938 -0
  658. package/src/domain/rotation/killOrder.ts +30 -0
  659. package/src/domain/rotation/openerForm.ts +22 -0
  660. package/src/domain/rotation/paladinBuffs.ts +568 -0
  661. package/src/domain/rotation/prebuff.ts +283 -0
  662. package/src/domain/rotation/raidRowTuning.ts +34 -0
  663. package/src/domain/rotation/rotation.ts +11 -0
  664. package/src/domain/rotation/rotationProfiles.ts +180 -0
  665. package/src/domain/rotation/rotationSuggestions.ts +851 -0
  666. package/src/domain/rotation/ruleAfterChain.ts +49 -0
  667. package/src/domain/rotation/spec.ts +70 -0
  668. package/src/domain/rotation/spellPicker.ts +140 -0
  669. package/src/domain/rotation/stand.ts +143 -0
  670. package/src/domain/rotation/types.ts +718 -0
  671. package/src/domain/run/battlegroundRun.ts +111 -0
  672. package/src/domain/run/canEnterContext.ts +32 -0
  673. package/src/domain/run/death.ts +561 -0
  674. package/src/domain/run/deathRecovery.ts +289 -0
  675. package/src/domain/run/duel.ts +141 -0
  676. package/src/domain/run/dungeonRun.ts +344 -0
  677. package/src/domain/run/floorRest.ts +159 -0
  678. package/src/domain/run/honor.ts +557 -0
  679. package/src/domain/run/honorWeek.ts +180 -0
  680. package/src/domain/run/whenMap.ts +977 -0
  681. package/src/domain/scriptdev/arathiHighlands.ts +445 -0
  682. package/src/domain/scriptdev/ashenvale.ts +635 -0
  683. package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
  684. package/src/domain/scriptdev/azshara.ts +892 -0
  685. package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
  686. package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
  687. package/src/domain/scriptdev/blackrockSpire.ts +730 -0
  688. package/src/domain/scriptdev/blackwingLair.ts +521 -0
  689. package/src/domain/scriptdev/burningSteppes.ts +62 -0
  690. package/src/domain/scriptdev/classFilter.ts +43 -0
  691. package/src/domain/scriptdev/darkshore.ts +817 -0
  692. package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
  693. package/src/domain/scriptdev/deadmines.ts +331 -0
  694. package/src/domain/scriptdev/desolace.ts +1239 -0
  695. package/src/domain/scriptdev/direMaul.ts +859 -0
  696. package/src/domain/scriptdev/durotar.ts +532 -0
  697. package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
  698. package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
  699. package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
  700. package/src/domain/scriptdev/felwood.ts +1055 -0
  701. package/src/domain/scriptdev/feralas.ts +571 -0
  702. package/src/domain/scriptdev/feralasHelpers.ts +838 -0
  703. package/src/domain/scriptdev/gnomeregan.ts +466 -0
  704. package/src/domain/scriptdev/guards.ts +616 -0
  705. package/src/domain/scriptdev/hinterlands.ts +693 -0
  706. package/src/domain/scriptdev/host.ts +1134 -0
  707. package/src/domain/scriptdev/index.ts +123 -0
  708. package/src/domain/scriptdev/instanceRaids.ts +136 -0
  709. package/src/domain/scriptdev/itemScripts.ts +37 -0
  710. package/src/domain/scriptdev/lochModan.ts +283 -0
  711. package/src/domain/scriptdev/maraudon.ts +232 -0
  712. package/src/domain/scriptdev/moltenCore.ts +831 -0
  713. package/src/domain/scriptdev/moonglade.ts +659 -0
  714. package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
  715. package/src/domain/scriptdev/naxxramas.ts +577 -0
  716. package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
  717. package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
  718. package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
  719. package/src/domain/scriptdev/npcProfessions.ts +1025 -0
  720. package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
  721. package/src/domain/scriptdev/onyxiasLair.ts +313 -0
  722. package/src/domain/scriptdev/orgrimmar.ts +147 -0
  723. package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
  724. package/src/domain/scriptdev/razorfenDowns.ts +468 -0
  725. package/src/domain/scriptdev/razorfenKraul.ts +410 -0
  726. package/src/domain/scriptdev/redridgeMountains.ts +163 -0
  727. package/src/domain/scriptdev/registry.ts +945 -0
  728. package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
  729. package/src/domain/scriptdev/scarletMonastery.ts +713 -0
  730. package/src/domain/scriptdev/scholomance.ts +682 -0
  731. package/src/domain/scriptdev/searingGorge.ts +295 -0
  732. package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
  733. package/src/domain/scriptdev/silithus.ts +71 -0
  734. package/src/domain/scriptdev/silverpineForest.ts +662 -0
  735. package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
  736. package/src/domain/scriptdev/stormwindCity.ts +1192 -0
  737. package/src/domain/scriptdev/stranglethornVale.ts +402 -0
  738. package/src/domain/scriptdev/stratholme.ts +650 -0
  739. package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
  740. package/src/domain/scriptdev/sunkenTemple.ts +736 -0
  741. package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
  742. package/src/domain/scriptdev/tanaris.ts +391 -0
  743. package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
  744. package/src/domain/scriptdev/teldrassil.ts +143 -0
  745. package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
  746. package/src/domain/scriptdev/theBarrens.ts +709 -0
  747. package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
  748. package/src/domain/scriptdev/thousandNeedles.ts +426 -0
  749. package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
  750. package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
  751. package/src/domain/scriptdev/types.ts +1026 -0
  752. package/src/domain/scriptdev/uldaman.ts +437 -0
  753. package/src/domain/scriptdev/ungoroCrater.ts +549 -0
  754. package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
  755. package/src/domain/scriptdev/wailingCaverns.ts +700 -0
  756. package/src/domain/scriptdev/warEffort.ts +371 -0
  757. package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
  758. package/src/domain/scriptdev/westfall.ts +767 -0
  759. package/src/domain/scriptdev/wetlands.ts +660 -0
  760. package/src/domain/scriptdev/winterspring.ts +482 -0
  761. package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
  762. package/src/domain/scriptdev/worldBosses.ts +605 -0
  763. package/src/domain/scriptdev/zulfarrak.ts +478 -0
  764. package/src/domain/scriptdev/zulgurub.ts +1152 -0
  765. package/src/domain/sim/dummySim.ts +408 -0
  766. package/src/domain/sim/targetDummy.ts +29 -0
  767. package/src/domain/social/guild.ts +148 -0
  768. package/src/domain/spells/areaAuraMembership.ts +93 -0
  769. package/src/domain/spells/breakableStunCc.ts +166 -0
  770. package/src/domain/spells/cancelAura.ts +80 -0
  771. package/src/domain/spells/diminishing.ts +167 -0
  772. package/src/domain/spells/dispel.ts +149 -0
  773. package/src/domain/spells/dispelMechanic.ts +105 -0
  774. package/src/domain/spells/equipSpells.ts +247 -0
  775. package/src/domain/spells/learnOnTargets.ts +260 -0
  776. package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
  777. package/src/domain/spells/resurrectSpell.ts +124 -0
  778. package/src/domain/spells/spellPushback.ts +39 -0
  779. package/src/domain/spells/spellReflect.ts +43 -0
  780. package/src/domain/spells/stealth.ts +183 -0
  781. package/src/domain/spells/totem.ts +394 -0
  782. package/src/domain/spells/worldCast.ts +187 -0
  783. package/src/domain/world/areaTriggerLocks.ts +177 -0
  784. package/src/domain/world/dungeonMusic.ts +108 -0
  785. package/src/domain/world/gameEvents.ts +119 -0
  786. package/src/domain/world/gameObjects.ts +1030 -0
  787. package/src/domain/world/goEventFire.ts +234 -0
  788. package/src/domain/world/goMoTransport.ts +74 -0
  789. package/src/domain/world/goTransport.ts +81 -0
  790. package/src/domain/world/hazards.ts +459 -0
  791. package/src/domain/world/openLock.ts +398 -0
  792. package/src/domain/world/pools.ts +470 -0
  793. package/src/domain/world/restArea.ts +37 -0
  794. package/src/domain/world/weather.ts +201 -0
  795. package/src/domain/zoneAmbience.mjs +87 -0
  796. package/src/domain/zoneMusic.mjs +62 -0
  797. package/src/domain/zoneMusicQueue.mjs +7 -0
  798. package/src/engine/combat/activeSeal.ts +39 -0
  799. package/src/engine/combat/aiTargetResolve.ts +64 -0
  800. package/src/engine/combat/aoeCast.ts +289 -0
  801. package/src/engine/combat/applyConsumeAura.ts +74 -0
  802. package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
  803. package/src/engine/combat/applyDispelMechanic.ts +30 -0
  804. package/src/engine/combat/applyHealEffect.ts +301 -0
  805. package/src/engine/combat/applySchoolAbsorb.ts +114 -0
  806. package/src/engine/combat/applySpell.ts +3169 -0
  807. package/src/engine/combat/applySpellLate.ts +2026 -0
  808. package/src/engine/combat/applySpellLateBag.ts +144 -0
  809. package/src/engine/combat/areaAura.ts +283 -0
  810. package/src/engine/combat/attackTable.ts +508 -0
  811. package/src/engine/combat/battleRez.ts +87 -0
  812. package/src/engine/combat/castAction.ts +36 -0
  813. package/src/engine/combat/castTargetGates.ts +75 -0
  814. package/src/engine/combat/castableKit.ts +68 -0
  815. package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
  816. package/src/engine/combat/chainFan.ts +210 -0
  817. package/src/engine/combat/channel.ts +423 -0
  818. package/src/engine/combat/chaseCloseness.ts +95 -0
  819. package/src/engine/combat/cmangosCastGates.ts +129 -0
  820. package/src/engine/combat/combatFlag.ts +77 -0
  821. package/src/engine/combat/combatGeometry.ts +1329 -0
  822. package/src/engine/combat/combustion.ts +68 -0
  823. package/src/engine/combat/context.ts +730 -0
  824. package/src/engine/combat/createSession.ts +1165 -0
  825. package/src/engine/combat/creatureLeash.ts +38 -0
  826. package/src/engine/combat/crowdControl.ts +1259 -0
  827. package/src/engine/combat/dispelDuty.ts +54 -0
  828. package/src/engine/combat/dispelReflect.ts +609 -0
  829. package/src/engine/combat/displaceFloor.ts +113 -0
  830. package/src/engine/combat/duelBounds.ts +47 -0
  831. package/src/engine/combat/equippedItemGate.ts +297 -0
  832. package/src/engine/combat/evadeLifecycle.ts +63 -0
  833. package/src/engine/combat/eventAi.ts +2220 -0
  834. package/src/engine/combat/facing.ts +74 -0
  835. package/src/engine/combat/fearFlee.ts +137 -0
  836. package/src/engine/combat/fighterFactory.ts +1144 -0
  837. package/src/engine/combat/forceDespawnAction.ts +51 -0
  838. package/src/engine/combat/formulas.ts +807 -0
  839. package/src/engine/combat/friendlyFan.ts +55 -0
  840. package/src/engine/combat/groundPoolTick.ts +210 -0
  841. package/src/engine/combat/hazards.ts +114 -0
  842. package/src/engine/combat/healTargets.ts +226 -0
  843. package/src/engine/combat/heartbeatResist.ts +49 -0
  844. package/src/engine/combat/hostileItemUse.ts +75 -0
  845. package/src/engine/combat/interruptAuras.ts +66 -0
  846. package/src/engine/combat/itemRescue.ts +49 -0
  847. package/src/engine/combat/itemUse.ts +260 -0
  848. package/src/engine/combat/kitById.ts +23 -0
  849. package/src/engine/combat/knockBack.ts +201 -0
  850. package/src/engine/combat/leap.ts +89 -0
  851. package/src/engine/combat/mitigation.ts +587 -0
  852. package/src/engine/combat/modTaunt.ts +43 -0
  853. package/src/engine/combat/motionClaim.ts +268 -0
  854. package/src/engine/combat/motionGate.ts +150 -0
  855. package/src/engine/combat/motionGenerator.ts +27 -0
  856. package/src/engine/combat/navSight.ts +138 -0
  857. package/src/engine/combat/perfSink.ts +28 -0
  858. package/src/engine/combat/periodicDue.ts +55 -0
  859. package/src/engine/combat/petAuras.ts +86 -0
  860. package/src/engine/combat/pickAction.ts +3449 -0
  861. package/src/engine/combat/powerForm.ts +735 -0
  862. package/src/engine/combat/powerPools.ts +49 -0
  863. package/src/engine/combat/predicates.ts +538 -0
  864. package/src/engine/combat/procsDamage.ts +1823 -0
  865. package/src/engine/combat/reactiveGates.ts +135 -0
  866. package/src/engine/combat/roles.ts +389 -0
  867. package/src/engine/combat/rotationSubject.ts +78 -0
  868. package/src/engine/combat/ruleAfter.ts +106 -0
  869. package/src/engine/combat/seedDisplayAuras.ts +203 -0
  870. package/src/engine/combat/seedOocEffects.ts +317 -0
  871. package/src/engine/combat/seedSchoolImmunities.ts +45 -0
  872. package/src/engine/combat/session-types.ts +458 -0
  873. package/src/engine/combat/sessionApi.ts +1785 -0
  874. package/src/engine/combat/sessionCharge.ts +124 -0
  875. package/src/engine/combat/sessionChase.ts +869 -0
  876. package/src/engine/combat/sessionDeaths.ts +469 -0
  877. package/src/engine/combat/sessionFocus.ts +506 -0
  878. package/src/engine/combat/sessionFollow.ts +167 -0
  879. package/src/engine/combat/sessionGeometry.ts +188 -0
  880. package/src/engine/combat/sessionHome.ts +75 -0
  881. package/src/engine/combat/sessionInject.ts +719 -0
  882. package/src/engine/combat/sessionMechanicMove.ts +555 -0
  883. package/src/engine/combat/sessionMotion.ts +1553 -0
  884. package/src/engine/combat/sessionMotionKit.ts +247 -0
  885. package/src/engine/combat/sessionMoveIntent.ts +49 -0
  886. package/src/engine/combat/sessionMoveOrder.ts +200 -0
  887. package/src/engine/combat/sessionPathTo.ts +657 -0
  888. package/src/engine/combat/sessionPools.ts +688 -0
  889. package/src/engine/combat/sessionSteer.ts +144 -0
  890. package/src/engine/combat/sessionStepBack.ts +151 -0
  891. package/src/engine/combat/sessionStepWrap.ts +116 -0
  892. package/src/engine/combat/sessionView.ts +442 -0
  893. package/src/engine/combat/simEffects.ts +32 -0
  894. package/src/engine/combat/simFacade.ts +620 -0
  895. package/src/engine/combat/simPump.ts +264 -0
  896. package/src/engine/combat/simSnapshot.ts +165 -0
  897. package/src/engine/combat/simThreadPool.ts +35 -0
  898. package/src/engine/combat/skeramImages.ts +57 -0
  899. package/src/engine/combat/slowUpdate.ts +178 -0
  900. package/src/engine/combat/snapToFloor.ts +42 -0
  901. package/src/engine/combat/speedAura.ts +29 -0
  902. package/src/engine/combat/spellReagents.ts +71 -0
  903. package/src/engine/combat/stealthDetect.ts +93 -0
  904. package/src/engine/combat/stepBackMotion.ts +171 -0
  905. package/src/engine/combat/stepSession.ts +3102 -0
  906. package/src/engine/combat/summonCast.ts +243 -0
  907. package/src/engine/combat/thaddiusPolarity.ts +97 -0
  908. package/src/engine/combat/threat.ts +388 -0
  909. package/src/engine/combat/threatOps.ts +272 -0
  910. package/src/engine/combat/tickWorkerBody.ts +211 -0
  911. package/src/engine/combat/totemAuras.ts +122 -0
  912. package/src/engine/combat/triggerPayload.ts +42 -0
  913. package/src/engine/combat/triggeredCompanion.ts +63 -0
  914. package/src/engine/combat/types.ts +1897 -0
  915. package/src/engine/combat/useObjectTrap.ts +140 -0
  916. package/src/engine/combat/walkSurface.ts +54 -0
  917. package/src/engine/combat/weapon.ts +1248 -0
  918. package/src/engine/combat/worldFrame.ts +43 -0
  919. package/src/engine/combat.solo-golden.json +2242 -0
  920. package/src/engine/combat.ts +84 -0
  921. package/src/engine/core/detMath.ts +289 -0
  922. package/src/engine/core/events.ts +357 -0
  923. package/src/engine/core/rng.ts +36 -0
  924. package/src/engine/game/actionBars.ts +124 -0
  925. package/src/engine/game/activateObjectFromSpell.ts +320 -0
  926. package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
  927. package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
  928. package/src/engine/game/applyDoorFromDbScript.ts +388 -0
  929. package/src/engine/game/applyEscortFromDbScript.ts +290 -0
  930. package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
  931. package/src/engine/game/applyHoverFromDbScript.ts +110 -0
  932. package/src/engine/game/applyOocResurrect.ts +71 -0
  933. package/src/engine/game/applySpellDurability.ts +115 -0
  934. package/src/engine/game/applyTailFromDbScript.ts +478 -0
  935. package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
  936. package/src/engine/game/auctionMail.ts +269 -0
  937. package/src/engine/game/bagOverflow.ts +130 -0
  938. package/src/engine/game/bank.ts +110 -0
  939. package/src/engine/game/barAutofill.ts +26 -0
  940. package/src/engine/game/battleground.ts +369 -0
  941. package/src/engine/game/combatEnemySpec.ts +216 -0
  942. package/src/engine/game/combatObjectTraps.ts +167 -0
  943. package/src/engine/game/combatSeed.ts +320 -0
  944. package/src/engine/game/combatSession.ts +3241 -0
  945. package/src/engine/game/combatSessionClock.ts +62 -0
  946. package/src/engine/game/companionQuestActions.ts +242 -0
  947. package/src/engine/game/companionTraining.ts +40 -0
  948. package/src/engine/game/consumables.ts +624 -0
  949. package/src/engine/game/context.ts +53 -0
  950. package/src/engine/game/createHealthstone.ts +45 -0
  951. package/src/engine/game/deathFlow.ts +127 -0
  952. package/src/engine/game/devGrant.ts +117 -0
  953. package/src/engine/game/dynamicObject.ts +365 -0
  954. package/src/engine/game/enchantItem.ts +177 -0
  955. package/src/engine/game/equipmentHelper.ts +806 -0
  956. package/src/engine/game/factionState.ts +108 -0
  957. package/src/engine/game/garmentsOoc.ts +69 -0
  958. package/src/engine/game/globalActionBar.ts +179 -0
  959. package/src/engine/game/goInteractQuestCredit.ts +51 -0
  960. package/src/engine/game/goMoTransportUse.ts +61 -0
  961. package/src/engine/game/goTransportUse.ts +60 -0
  962. package/src/engine/game/healthstoneUpkeep.ts +59 -0
  963. package/src/engine/game/killSkin.ts +124 -0
  964. package/src/engine/game/learnFromItem.ts +118 -0
  965. package/src/engine/game/loadReconcile.ts +551 -0
  966. package/src/engine/game/loot.ts +294 -0
  967. package/src/engine/game/macros.ts +125 -0
  968. package/src/engine/game/mail.ts +293 -0
  969. package/src/engine/game/meetingStoneQueue.ts +75 -0
  970. package/src/engine/game/meetingStoneUse.ts +54 -0
  971. package/src/engine/game/newGameState.ts +363 -0
  972. package/src/engine/game/oocAuraInterrupt.ts +92 -0
  973. package/src/engine/game/oocCast.ts +241 -0
  974. package/src/engine/game/oocCastEffects.ts +803 -0
  975. package/src/engine/game/oocCastMethods.ts +1077 -0
  976. package/src/engine/game/openLockFromSpell.ts +174 -0
  977. package/src/engine/game/outdoorPvp.ts +187 -0
  978. package/src/engine/game/outfitter.ts +644 -0
  979. package/src/engine/game/paladinBoard.ts +393 -0
  980. package/src/engine/game/partyAuras.ts +121 -0
  981. package/src/engine/game/persistCombatAuras.ts +91 -0
  982. package/src/engine/game/pets.ts +459 -0
  983. package/src/engine/game/prePullHealthstones.ts +154 -0
  984. package/src/engine/game/professions.ts +2227 -0
  985. package/src/engine/game/pruneStaleRuntime.ts +39 -0
  986. package/src/engine/game/questFightCredit.ts +36 -0
  987. package/src/engine/game/questItemOnCorpse.ts +166 -0
  988. package/src/engine/game/questItemOnCreature.ts +103 -0
  989. package/src/engine/game/questLog.ts +879 -0
  990. package/src/engine/game/questSpellComplete.ts +21 -0
  991. package/src/engine/game/questTurnIn.ts +598 -0
  992. package/src/engine/game/raidParty.ts +32 -0
  993. package/src/engine/game/reagentBuyIn.ts +39 -0
  994. package/src/engine/game/regenRest.ts +186 -0
  995. package/src/engine/game/rotation.ts +425 -0
  996. package/src/engine/game/runFullDungeon.ts +611 -0
  997. package/src/engine/game/runSupply.ts +80 -0
  998. package/src/engine/game/sanitizeDriftedItems.ts +135 -0
  999. package/src/engine/game/scriptDevGoUse.ts +397 -0
  1000. package/src/engine/game/scriptDevInnkeeper.ts +150 -0
  1001. package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
  1002. package/src/engine/game/sendEventFromSpell.ts +87 -0
  1003. package/src/engine/game/sortContainers.ts +85 -0
  1004. package/src/engine/game/spellReputation.ts +69 -0
  1005. package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
  1006. package/src/engine/game/squadDungeon.ts +4222 -0
  1007. package/src/engine/game/squadQuestShare.ts +260 -0
  1008. package/src/engine/game/summonObjectSlot.ts +69 -0
  1009. package/src/engine/game/summonObjectWild.ts +73 -0
  1010. package/src/engine/game/summoningRitualUse.ts +141 -0
  1011. package/src/engine/game/talents.ts +356 -0
  1012. package/src/engine/game/tamingRodUse.ts +66 -0
  1013. package/src/engine/game/tempSpawnCreature.ts +136 -0
  1014. package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
  1015. package/src/engine/game/tickTimedQuests.ts +28 -0
  1016. package/src/engine/game/trade.ts +586 -0
  1017. package/src/engine/game/travel.ts +1155 -0
  1018. package/src/engine/game/types.ts +1855 -0
  1019. package/src/engine/game/vendorOffers.ts +244 -0
  1020. package/src/engine/game/weaponImbueItem.ts +281 -0
  1021. package/src/engine/game/worldSession.ts +183 -0
  1022. package/src/engine/game/worldState.ts +166 -0
  1023. package/src/engine/game.ts +968 -0
  1024. package/src/engine/spells/GAP.md +67 -0
  1025. package/src/engine/spells/absorbs.ts +376 -0
  1026. package/src/engine/spells/addTargetTrigger.ts +53 -0
  1027. package/src/engine/spells/auraPerSecondCost.ts +50 -0
  1028. package/src/engine/spells/auraStacking.ts +497 -0
  1029. package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
  1030. package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
  1031. package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
  1032. package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
  1033. package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
  1034. package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
  1035. package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
  1036. package/src/engine/spells/cmangos-special-cases.ts +1570 -0
  1037. package/src/engine/spells/conditions.ts +718 -0
  1038. package/src/engine/spells/effects.ts +203 -0
  1039. package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
  1040. package/src/engine/spells/immunity.ts +942 -0
  1041. package/src/engine/spells/intentEffects.ts +351 -0
  1042. package/src/engine/spells/interpreter/GAPS.md +21 -0
  1043. package/src/engine/spells/interpreter/amount.ts +109 -0
  1044. package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
  1045. package/src/engine/spells/interpreter/diff.ts +246 -0
  1046. package/src/engine/spells/interpreter/duration.ts +90 -0
  1047. package/src/engine/spells/interpreter/form-attrs.json +1 -0
  1048. package/src/engine/spells/interpreter/form-attrs.ts +95 -0
  1049. package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
  1050. package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
  1051. package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
  1052. package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
  1053. package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
  1054. package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
  1055. package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
  1056. package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
  1057. package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
  1058. package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
  1059. package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
  1060. package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
  1061. package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
  1062. package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
  1063. package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
  1064. package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
  1065. package/src/engine/spells/interpreter/handlers.ts +9 -0
  1066. package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
  1067. package/src/engine/spells/interpreter/index.ts +525 -0
  1068. package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
  1069. package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
  1070. package/src/engine/spells/interpreter/mage-portals.ts +37 -0
  1071. package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
  1072. package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
  1073. package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
  1074. package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
  1075. package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
  1076. package/src/engine/spells/interpreter/opcodes.ts +789 -0
  1077. package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
  1078. package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
  1079. package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
  1080. package/src/engine/spells/interpreter/proc.ts +443 -0
  1081. package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
  1082. package/src/engine/spells/interpreter/registry/index.ts +216 -0
  1083. package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
  1084. package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
  1085. package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
  1086. package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
  1087. package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
  1088. package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
  1089. package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
  1090. package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
  1091. package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
  1092. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
  1093. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
  1094. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
  1095. package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
  1096. package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
  1097. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
  1098. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
  1099. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
  1100. package/src/engine/spells/interpreter/registry/types.ts +48 -0
  1101. package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
  1102. package/src/engine/spells/interpreter/targeting.ts +90 -0
  1103. package/src/engine/spells/interpreter/types-intent.ts +1501 -0
  1104. package/src/engine/spells/interpreter/types.ts +419 -0
  1105. package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
  1106. package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
  1107. package/src/engine/spells/interrupt.ts +217 -0
  1108. package/src/engine/spells/meleeAttackReset.ts +60 -0
  1109. package/src/engine/spells/oocTriggerSpell.ts +49 -0
  1110. package/src/engine/spells/overrideClassScripts.ts +319 -0
  1111. package/src/engine/spells/parryHaste.ts +20 -0
  1112. package/src/engine/spells/procs.ts +300 -0
  1113. package/src/engine/spells/recovery.ts +203 -0
  1114. package/src/engine/spells/scriptTargetDest.ts +76 -0
  1115. package/src/engine/spells/scriptTargets.ts +85 -0
  1116. package/src/engine/spells/singleTargetAura.ts +82 -0
  1117. package/src/engine/spells/specialCasePayloads.ts +57 -0
  1118. package/src/engine/spells/spellAttributes.ts +249 -0
  1119. package/src/engine/spells/spellBonus.ts +143 -0
  1120. package/src/engine/spells/spellModIntents.ts +419 -0
  1121. package/src/engine/spells/spellMods.ts +283 -0
  1122. package/src/engine/spells/spellRadius.ts +15 -0
  1123. package/src/engine/spells/trapObjects.ts +26 -0
  1124. package/src/json.d.ts +7 -0
  1125. package/src/persistence/memoryRepository.ts +23 -0
  1126. package/src/persistence/saveBackups.ts +162 -0
  1127. package/src/persistence/saveFile.ts +68 -0
  1128. package/src/persistence/saveRepository.ts +11 -0
  1129. package/src/persistence/saveShape.ts +668 -0
  1130. package/src/progression/leveling.ts +89 -0
  1131. package/src/progression/rest.ts +1434 -0
  1132. package/src/progression/training.ts +226 -0
  1133. package/src/progression/xpGain.ts +369 -0
  1134. package/src/quests/quests.ts +1580 -0
  1135. package/src/world/aoePull.ts +198 -0
  1136. package/src/world/areaTableDbc.ts +39 -0
  1137. package/src/world/areaTableMapIdPairs.ts +141 -0
  1138. package/src/world/bakeSlug.ts +43 -0
  1139. package/src/world/continuousDungeon.ts +1250 -0
  1140. package/src/world/dungeonBakeProjection.ts +190 -0
  1141. package/src/world/dungeonMapDensity.ts +342 -0
  1142. package/src/world/dungeonMapProjection.ts +135 -0
  1143. package/src/world/dungeonNav.ts +904 -0
  1144. package/src/world/dungeonNpcSim.ts +147 -0
  1145. package/src/world/dungeonObjectives.ts +234 -0
  1146. package/src/world/dungeonPreset.ts +35 -0
  1147. package/src/world/dungeonRoute.ts +311 -0
  1148. package/src/world/dungeonRouteGeometry.ts +732 -0
  1149. package/src/world/dungeonRouteOrder.ts +1037 -0
  1150. package/src/world/dungeonWingRooms.ts +426 -0
  1151. package/src/world/escort.ts +296 -0
  1152. package/src/world/goPoolRoll.ts +75 -0
  1153. package/src/world/instanceObjects.ts +785 -0
  1154. package/src/world/instances.ts +1572 -0
  1155. package/src/world/meetingStones.ts +56 -0
  1156. package/src/world/navmeshFloors.ts +145 -0
  1157. package/src/world/nearGrid.ts +167 -0
  1158. package/src/world/packBudget.ts +613 -0
  1159. package/src/world/rareRoll.ts +335 -0
  1160. package/src/world/routeAuthoring.ts +132 -0
  1161. package/src/world/routeEdit.ts +209 -0
  1162. package/src/world/world.ts +812 -0
  1163. package/src/world/zoneHazards.ts +47 -0
@@ -0,0 +1,1025 @@
1
+ // World npc_professions ScriptDev IR ports. Source: scripts/world/npc_professions.cpp —
2
+ // npc_prof_blacksmith, npc_prof_leather and go_soothsaying_for_dummies. Every value cites file:line.
3
+
4
+ import type { ScriptDevIR } from './types.ts';
5
+
6
+ // Constants — npc_professions.cpp enums
7
+
8
+ /** Cite: npc_professions.cpp:97 S_WEAPON = 9787 */
9
+ export const S_WEAPON = 9787;
10
+ /** Cite: npc_professions.cpp:98 S_ARMOR = 9788 */
11
+ export const S_ARMOR = 9788;
12
+ /** Cite: npc_professions.cpp:99 S_HAMMER = 17040 */
13
+ export const S_HAMMER = 17040;
14
+ /** Cite: npc_professions.cpp:100 S_AXE = 17041 */
15
+ export const S_AXE = 17041;
16
+ /** Cite: npc_professions.cpp:101 S_SWORD = 17039 */
17
+ export const S_SWORD = 17039;
18
+ /** Cite: npc_professions.cpp:102 S_LEARN_WEAPON = 9789 */
19
+ export const S_LEARN_WEAPON = 9789;
20
+ /** Cite: npc_professions.cpp:103 S_LEARN_ARMOR = 9790 */
21
+ export const S_LEARN_ARMOR = 9790;
22
+ /** Cite: npc_professions.cpp:104 S_LEARN_HAMMER = 17044 */
23
+ export const S_LEARN_HAMMER = 17044;
24
+ /** Cite: npc_professions.cpp:105 S_LEARN_AXE = 17043 */
25
+ export const S_LEARN_AXE = 17043;
26
+ /** Cite: npc_professions.cpp:106 S_LEARN_SWORD = 17042 */
27
+ export const S_LEARN_SWORD = 17042;
28
+ /** Cite: npc_professions.cpp:107 S_REP_ARMOR = 17451 */
29
+ export const S_REP_ARMOR = 17451;
30
+ /** Cite: npc_professions.cpp:108 S_REP_WEAPON = 17452 */
31
+ export const S_REP_WEAPON = 17452;
32
+
33
+ /** Cite: npc_professions.cpp:109 REP_ARMOR = 46 (Blacksmithing - Armorsmithing) */
34
+ export const REP_ARMOR = 46;
35
+ /** Cite: npc_professions.cpp:110 REP_WEAPON = 289 (Blacksmithing - Weaponsmithing) */
36
+ export const REP_WEAPON = 289;
37
+ /** Cite: npc_professions.cpp:111 REP_HAMMER = 569 */
38
+ export const REP_HAMMER = 569;
39
+ /** Cite: npc_professions.cpp:112 REP_AXE = 570 */
40
+ export const REP_AXE = 570;
41
+ /** Cite: npc_professions.cpp:113 REP_SWORD = 571 */
42
+ export const REP_SWORD = 571;
43
+
44
+ /** Cite: SharedDefines.h ReputationRank REP_FRIENDLY = 4 */
45
+ export const REP_FRIENDLY = 4;
46
+
47
+ /** Cite: npc_professions.cpp:116 S_DRAGON = 10656 */
48
+ export const S_DRAGON = 10656;
49
+ /** Cite: npc_professions.cpp:117 S_ELEMENTAL = 10658 */
50
+ export const S_ELEMENTAL = 10658;
51
+ /** Cite: npc_professions.cpp:118 S_TRIBAL = 10660 */
52
+ export const S_TRIBAL = 10660;
53
+ /** Cite: npc_professions.cpp:119 S_LEARN_DRAGON = 10657 */
54
+ export const S_LEARN_DRAGON = 10657;
55
+ /** Cite: npc_professions.cpp:120 S_LEARN_ELEMENTAL = 10659 */
56
+ export const S_LEARN_ELEMENTAL = 10659;
57
+ /** Cite: npc_professions.cpp:121 S_LEARN_TRIBAL = 10661 */
58
+ export const S_LEARN_TRIBAL = 10661;
59
+ /** Cite: npc_professions.cpp:122 S_UNLEARN_DRAGON = 36434 */
60
+ export const S_UNLEARN_DRAGON = 36434;
61
+ /** Cite: npc_professions.cpp:123 S_UNLEARN_ELEMENTAL = 36328 */
62
+ export const S_UNLEARN_ELEMENTAL = 36328;
63
+ /** Cite: npc_professions.cpp:124 S_UNLEARN_TRIBAL = 36433 */
64
+ export const S_UNLEARN_TRIBAL = 36433;
65
+
66
+ /** Cite: npc_professions.cpp:140 Q_DRAGON_ALLY = 5141 */
67
+ export const Q_DRAGON_ALLY = 5141;
68
+ /** Cite: npc_professions.cpp:141 Q_DRAGON_HORDE = 5145 */
69
+ export const Q_DRAGON_HORDE = 5145;
70
+ /** Cite: npc_professions.cpp:142 Q_ELEMENTAL_ALLY = 5144 */
71
+ export const Q_ELEMENTAL_ALLY = 5144;
72
+ /** Cite: npc_professions.cpp:143 Q_ELEMENTAL_HORDE = 5146 */
73
+ export const Q_ELEMENTAL_HORDE = 5146;
74
+ /** Cite: npc_professions.cpp:144 Q_TRIBAL_ALLY = 5143 */
75
+ export const Q_TRIBAL_ALLY = 5143;
76
+ /** Cite: npc_professions.cpp:145 Q_TRIBAL_HORDE = 5148 */
77
+ export const Q_TRIBAL_HORDE = 5148;
78
+
79
+ /** Cite: npc_professions.cpp:151 N_TRAINER_SMITHOMNI1 = 11145 Myolor Sunderfury */
80
+ export const N_TRAINER_SMITHOMNI1 = 11145;
81
+ /** Cite: npc_professions.cpp:152 N_TRAINER_SMITHOMNI2 = 11176 Krathok Moltenfist */
82
+ export const N_TRAINER_SMITHOMNI2 = 11176;
83
+ /** Cite: npc_professions.cpp:153 N_TRAINER_WEAPON1 = 11146 Ironus Coldsteel */
84
+ export const N_TRAINER_WEAPON1 = 11146;
85
+ /** Cite: npc_professions.cpp:154 N_TRAINER_WEAPON2 = 11178 Borgosh Corebender */
86
+ export const N_TRAINER_WEAPON2 = 11178;
87
+ /** Cite: npc_professions.cpp:155 N_TRAINER_ARMOR1 = 5164 Grumnus Steelshaper */
88
+ export const N_TRAINER_ARMOR1 = 5164;
89
+ /** Cite: npc_professions.cpp:156 N_TRAINER_ARMOR2 = 11177 Okothos Ironrager */
90
+ export const N_TRAINER_ARMOR2 = 11177;
91
+ /** Cite: npc_professions.cpp:157 N_TRAINER_HAMMER = 11191 Lilith the Lithe */
92
+ export const N_TRAINER_HAMMER = 11191;
93
+ /** Cite: npc_professions.cpp:158 N_TRAINER_AXE = 11192 Kilram */
94
+ export const N_TRAINER_AXE = 11192;
95
+ /** Cite: npc_professions.cpp:159 N_TRAINER_SWORD = 11193 Seril Scourgebane */
96
+ export const N_TRAINER_SWORD = 11193;
97
+
98
+ /** Cite: npc_professions.cpp:162 N_TRAINER_DRAGON1 = 7866 Peter Galen */
99
+ export const N_TRAINER_DRAGON1 = 7866;
100
+ /** Cite: npc_professions.cpp:163 N_TRAINER_DRAGON2 = 7867 Thorkaf Dragoneye */
101
+ export const N_TRAINER_DRAGON2 = 7867;
102
+ /** Cite: npc_professions.cpp:164 N_TRAINER_ELEMENTAL1 = 7868 Sarah Tanner */
103
+ export const N_TRAINER_ELEMENTAL1 = 7868;
104
+ /** Cite: npc_professions.cpp:165 N_TRAINER_ELEMENTAL2 = 7869 Brumn Winterhoof */
105
+ export const N_TRAINER_ELEMENTAL2 = 7869;
106
+ /** Cite: npc_professions.cpp:166 N_TRAINER_TRIBAL1 = 7870 Caryssia Moonhunter */
107
+ export const N_TRAINER_TRIBAL1 = 7870;
108
+ /** Cite: npc_professions.cpp:167 N_TRAINER_TRIBAL2 = 7871 Se'Jib */
109
+ export const N_TRAINER_TRIBAL2 = 7871;
110
+
111
+ // GO Soothsaying for Dummies — commented binding. Cite: npc_professions.cpp:37 UPDATE ScriptName; :638–645
112
+ // pGOUse commented; :665–669 RegisterSelf commented.
113
+ export const GO_SOOTHSAYING_FOR_DUMMIES = 177226;
114
+
115
+ // Skill line ids from the extract-professions SkillLine map and classic-db RequiredSkill on the
116
+ // BS specialization quests: 164 blacksmithing, 165 leatherworking.
117
+ export const SKILL_BLACKSMITHING = 164;
118
+ export const SKILL_LEATHERWORKING = 165;
119
+
120
+ /** Gossip senders (file-local, not sc_gossip defaults). Cite: npc_professions.cpp:57–59 */
121
+ export const GOSSIP_SENDER_LEARN = 50;
122
+ export const GOSSIP_SENDER_UNLEARN = 51;
123
+ export const GOSSIP_SENDER_CHECK = 52;
124
+
125
+ // sc_gossip.h GOSSIP_SENDER_MAIN / GOSSIP_ACTION_*. Cite: sc_gossip.h:112–114 GOSSIP_ACTION_INFO_DEF=1000,
126
+ // TRADE=1, TRAIN=2, SENDER_MAIN=1
127
+ export const GOSSIP_SENDER_MAIN = 1;
128
+ export const GOSSIP_ACTION_TRADE = 1;
129
+ export const GOSSIP_ACTION_TRAIN = 2;
130
+ export const GOSSIP_ACTION_INFO_DEF = 1000;
131
+
132
+ /** Relative action offsets used in cpp (absolute = INFO_DEF + n). */
133
+ export const BS_ACTION_LEARN_ARMOR = 1;
134
+ export const BS_ACTION_LEARN_WEAPON = 2;
135
+ export const BS_ACTION_UNLEARN_WEAPON = 3;
136
+ export const BS_ACTION_UNLEARN_ARMOR = 4;
137
+ export const BS_ACTION_LEARN_HAMMER = 5;
138
+ export const BS_ACTION_LEARN_AXE = 6;
139
+ export const BS_ACTION_LEARN_SWORD = 7;
140
+ export const BS_ACTION_UNLEARN_HAMMER = 8;
141
+ export const BS_ACTION_UNLEARN_AXE = 9;
142
+ export const BS_ACTION_UNLEARN_SWORD = 10;
143
+
144
+ export const LW_ACTION_UNLEARN_DRAGON = 1;
145
+ export const LW_ACTION_LEARN_DRAGON = 2;
146
+ export const LW_ACTION_UNLEARN_ELEMENTAL = 3;
147
+ export const LW_ACTION_LEARN_ELEMENTAL = 4;
148
+ export const LW_ACTION_UNLEARN_TRIBAL = 5;
149
+ export const LW_ACTION_LEARN_TRIBAL = 6;
150
+
151
+ // Skill and level gates. Cite: npc_professions.cpp:288 skill ≥ 225; :319 level > 49 and skill ≥ 250;
152
+ // :504 skill ≥ 225 and level > 39.
153
+ export const BS_OMNI_SKILL_MIN = 225;
154
+ export const BS_WEAPON_SUB_SKILL_MIN = 250;
155
+ export const BS_WEAPON_SUB_LEVEL_MIN = 50; // cpp: GetLevel() > 49
156
+ export const LW_SPEC_SKILL_MIN = 225;
157
+ export const LW_SPEC_LEVEL_MIN = 40; // cpp: GetLevel() > 39
158
+
159
+ // Unlearn cost brackets (copper). Cite: npc_professions.cpp:174–183 GetUnlearnCostMedium Cite:
160
+ // npc_professions.cpp:185–190 GetUnlearnCostLow
161
+ export const UNLEARN_COST_MEDIUM_LT_51 = 250_000;
162
+ export const UNLEARN_COST_MEDIUM_LT_66 = 500_000;
163
+ export const UNLEARN_COST_MEDIUM_GE_66 = 1_000_000;
164
+ export const UNLEARN_COST_LOW_LT_66 = 50_000;
165
+ export const UNLEARN_COST_LOW_GE_66 = 100_000;
166
+
167
+ /** Cite: SpellDefines.h TRIGGERED_OLD_TRIGGERED (QI4 residual / cpp CastSpell). */
168
+ export const TRIGGERED_OLD_TRIGGERED = 0x1;
169
+
170
+ /** ProfessionUnlearnSpells recipe spell removals by unlearn type. Cite: npc_professions.cpp:223–267 */
171
+ export const PROFESSION_UNLEARN_SPELLS: Record<number, readonly number[]> = {
172
+ [S_UNLEARN_DRAGON]: [
173
+ 36076, 36079, 35576, 35577, 35575, 35582, 35584, 35580,
174
+ ],
175
+ [S_UNLEARN_ELEMENTAL]: [36074, 36077, 35590, 35591, 35589],
176
+ [S_UNLEARN_TRIBAL]: [35585, 35587, 35588, 36075, 36078],
177
+ };
178
+
179
+ /** All DB-bound blacksmith ScriptName creatures (corpus boundCreatures). */
180
+ export const BS_BOUND_CREATURES = [
181
+ N_TRAINER_ARMOR1,
182
+ N_TRAINER_SMITHOMNI1,
183
+ N_TRAINER_WEAPON1,
184
+ N_TRAINER_SMITHOMNI2,
185
+ N_TRAINER_ARMOR2,
186
+ N_TRAINER_WEAPON2,
187
+ N_TRAINER_HAMMER,
188
+ N_TRAINER_AXE,
189
+ N_TRAINER_SWORD,
190
+ ] as const;
191
+
192
+ /** All DB-bound leather ScriptName creatures. */
193
+ export const LW_BOUND_CREATURES = [
194
+ N_TRAINER_DRAGON1,
195
+ N_TRAINER_DRAGON2,
196
+ N_TRAINER_ELEMENTAL1,
197
+ N_TRAINER_ELEMENTAL2,
198
+ N_TRAINER_TRIBAL1,
199
+ N_TRAINER_TRIBAL2,
200
+ ] as const;
201
+
202
+ // Pure helpers — cost formulas
203
+
204
+ /** Port of GetUnlearnCostMedium (blacksmith weapon sub + leather). Cite: npc_professions.cpp:174–183 */
205
+ export function getUnlearnCostMedium(level: number): number {
206
+ if (level < 51) return UNLEARN_COST_MEDIUM_LT_51;
207
+ if (level < 66) return UNLEARN_COST_MEDIUM_LT_66;
208
+ return UNLEARN_COST_MEDIUM_GE_66;
209
+ }
210
+
211
+ /** Port of GetUnlearnCostLow (armor/weapon specialty unlearn confirm). Cite: npc_professions.cpp:185–190 */
212
+ export function getUnlearnCostLow(level: number): number {
213
+ if (level < 66) return UNLEARN_COST_LOW_LT_66;
214
+ return UNLEARN_COST_LOW_GE_66;
215
+ }
216
+
217
+ /** Port of HasWeaponSub. Cite: npc_professions.cpp:273–276 */
218
+ function collectionHas(
219
+ c: ReadonlySet<number> | readonly number[],
220
+ id: number,
221
+ ): boolean {
222
+ // Both Set and readonly arrays are iterable — avoid Array.isArray/Set narrowing traps
223
+ // with ReadonlySet (interface, not class).
224
+ for (const x of c) if (x === id) return true;
225
+ return false;
226
+ }
227
+
228
+ export function hasWeaponSub(knownSpells: ReadonlySet<number> | readonly number[]): boolean {
229
+ return collectionHas(knownSpells, S_HAMMER)
230
+ || collectionHas(knownSpells, S_AXE)
231
+ || collectionHas(knownSpells, S_SWORD);
232
+ }
233
+
234
+ /** Port of IsEligibleSpecializeLW. Cite: npc_professions.cpp:481–493 */
235
+ export function isEligibleSpecializeLW(opts: {
236
+ knownSpells: ReadonlySet<number> | readonly number[];
237
+ questRewarded: ReadonlySet<number> | readonly number[];
238
+ }): boolean {
239
+ const hasSpell = (id: number) => collectionHas(opts.knownSpells, id);
240
+ const hasQuest = (id: number) => collectionHas(opts.questRewarded, id);
241
+ if (hasSpell(S_DRAGON) || hasSpell(S_ELEMENTAL) || hasSpell(S_TRIBAL)) {
242
+ return false;
243
+ }
244
+ return (
245
+ hasQuest(Q_DRAGON_ALLY) ||
246
+ hasQuest(Q_DRAGON_HORDE) ||
247
+ hasQuest(Q_ELEMENTAL_ALLY) ||
248
+ hasQuest(Q_ELEMENTAL_HORDE) ||
249
+ hasQuest(Q_TRIBAL_ALLY) ||
250
+ hasQuest(Q_TRIBAL_HORDE)
251
+ );
252
+ }
253
+
254
+ // Pure helpers — blacksmith gossip
255
+
256
+ export type BlacksmithGossipItem =
257
+ | { kind: 'learn_armor'; action: number; cite: string }
258
+ | { kind: 'learn_weapon'; action: number; cite: string }
259
+ | { kind: 'unlearn_weapon'; action: number; cite: string }
260
+ | { kind: 'unlearn_armor'; action: number; cite: string }
261
+ | { kind: 'learn_hammer'; action: number; cite: string }
262
+ | { kind: 'unlearn_hammer'; action: number; cite: string }
263
+ | { kind: 'learn_axe'; action: number; cite: string }
264
+ | { kind: 'unlearn_axe'; action: number; cite: string }
265
+ | { kind: 'learn_sword'; action: number; cite: string }
266
+ | { kind: 'unlearn_sword'; action: number; cite: string }
267
+ | { kind: 'train'; action: number; cite: string }
268
+ | { kind: 'trade'; action: number; cite: string };
269
+
270
+ export interface BlacksmithGossipHelloResult {
271
+ items: BlacksmithGossipItem[];
272
+ cite: string;
273
+ }
274
+
275
+ // Port of GossipHello_npc_prof_blacksmith option set (sans default menu text). Cite:
276
+ // npc_professions.cpp:278–346
277
+ export function blacksmithGossipHello(opts: {
278
+ creatureEntry: number;
279
+ skillBlacksmithing: number;
280
+ level: number;
281
+ knownSpells: ReadonlySet<number> | readonly number[];
282
+ repArmorRank: number;
283
+ repWeaponRank: number;
284
+ isTrainer?: boolean;
285
+ isVendor?: boolean;
286
+ }): BlacksmithGossipHelloResult {
287
+ const has = (id: number) => collectionHas(opts.knownSpells, id);
288
+ const items: BlacksmithGossipItem[] = [];
289
+ const e = opts.creatureEntry;
290
+
291
+ if (opts.isVendor) {
292
+ items.push({
293
+ kind: 'trade',
294
+ action: GOSSIP_ACTION_TRADE,
295
+ cite: 'npc_professions.cpp:282-283 vendor browse goods',
296
+ });
297
+ }
298
+
299
+ // WEAPONSMITH & ARMORSMITH — skill ≥ 225
300
+ // Cite: npc_professions.cpp:288–317
301
+ if (opts.skillBlacksmithing >= BS_OMNI_SKILL_MIN) {
302
+ if (e === N_TRAINER_SMITHOMNI1 || e === N_TRAINER_SMITHOMNI2) {
303
+ if (!has(S_ARMOR) && !has(S_WEAPON) && opts.repArmorRank === REP_FRIENDLY) {
304
+ items.push({
305
+ kind: 'learn_armor',
306
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_LEARN_ARMOR,
307
+ cite: 'npc_professions.cpp:293-294 omni learn armor if Friendly REP_ARMOR',
308
+ });
309
+ }
310
+ if (!has(S_WEAPON) && !has(S_ARMOR) && opts.repWeaponRank === REP_FRIENDLY) {
311
+ items.push({
312
+ kind: 'learn_weapon',
313
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_LEARN_WEAPON,
314
+ cite: 'npc_professions.cpp:295-296 omni learn weapon if Friendly REP_WEAPON',
315
+ });
316
+ }
317
+ }
318
+ if (e === N_TRAINER_WEAPON1 || e === N_TRAINER_WEAPON2) {
319
+ if (has(S_WEAPON)) {
320
+ items.push({
321
+ kind: 'unlearn_weapon',
322
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_UNLEARN_WEAPON,
323
+ cite: 'npc_professions.cpp:300-302 weapon trainer unlearn when has S_WEAPON',
324
+ });
325
+ if (opts.isTrainer) {
326
+ items.push({
327
+ kind: 'train',
328
+ action: GOSSIP_ACTION_TRAIN,
329
+ cite: 'npc_professions.cpp:303-304 trainer list',
330
+ });
331
+ }
332
+ }
333
+ }
334
+ if (e === N_TRAINER_ARMOR1 || e === N_TRAINER_ARMOR2) {
335
+ if (has(S_ARMOR)) {
336
+ items.push({
337
+ kind: 'unlearn_armor',
338
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_UNLEARN_ARMOR,
339
+ cite: 'npc_professions.cpp:309-311 armor trainer unlearn when has S_ARMOR',
340
+ });
341
+ if (opts.isTrainer) {
342
+ items.push({
343
+ kind: 'train',
344
+ action: GOSSIP_ACTION_TRAIN,
345
+ cite: 'npc_professions.cpp:312-313 trainer list',
346
+ });
347
+ }
348
+ }
349
+ }
350
+ }
351
+
352
+ // WEAPONSMITH SPEC — has S_WEAPON, level > 49, skill ≥ 250
353
+ // Cite: npc_professions.cpp:319–342
354
+ if (
355
+ has(S_WEAPON) &&
356
+ opts.level > 49 &&
357
+ opts.skillBlacksmithing >= BS_WEAPON_SUB_SKILL_MIN
358
+ ) {
359
+ const sub = hasWeaponSub(opts.knownSpells);
360
+ if (e === N_TRAINER_HAMMER) {
361
+ if (!sub) {
362
+ items.push({
363
+ kind: 'learn_hammer',
364
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_LEARN_HAMMER,
365
+ cite: 'npc_professions.cpp:324-325 learn hammer when no weapon sub',
366
+ });
367
+ }
368
+ if (has(S_HAMMER)) {
369
+ items.push({
370
+ kind: 'unlearn_hammer',
371
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_UNLEARN_HAMMER,
372
+ cite: 'npc_professions.cpp:326-327 unlearn hammer',
373
+ });
374
+ }
375
+ }
376
+ if (e === N_TRAINER_AXE) {
377
+ if (!sub) {
378
+ items.push({
379
+ kind: 'learn_axe',
380
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_LEARN_AXE,
381
+ cite: 'npc_professions.cpp:330-331 learn axe when no weapon sub',
382
+ });
383
+ }
384
+ if (has(S_AXE)) {
385
+ items.push({
386
+ kind: 'unlearn_axe',
387
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_UNLEARN_AXE,
388
+ cite: 'npc_professions.cpp:332-333 unlearn axe',
389
+ });
390
+ }
391
+ }
392
+ if (e === N_TRAINER_SWORD) {
393
+ if (!sub) {
394
+ items.push({
395
+ kind: 'learn_sword',
396
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_LEARN_SWORD,
397
+ cite: 'npc_professions.cpp:336-337 learn sword when no weapon sub',
398
+ });
399
+ }
400
+ if (has(S_SWORD)) {
401
+ items.push({
402
+ kind: 'unlearn_sword',
403
+ action: GOSSIP_ACTION_INFO_DEF + BS_ACTION_UNLEARN_SWORD,
404
+ cite: 'npc_professions.cpp:338-339 unlearn sword',
405
+ });
406
+ }
407
+ }
408
+ }
409
+
410
+ return {
411
+ items,
412
+ cite: 'npc_professions.cpp:278-346 GossipHello_npc_prof_blacksmith',
413
+ };
414
+ }
415
+
416
+ export type BlacksmithGossipSelectResult =
417
+ | {
418
+ handled: true;
419
+ phase: 'confirm_learn' | 'confirm_unlearn' | 'cast_learn' | 'close' | 'trade' | 'train';
420
+ castSpellId: number | null;
421
+ confirmCostCopper: number | null;
422
+ closeMenu: boolean;
423
+ cite: string;
424
+ }
425
+ | { handled: false; cite: string };
426
+
427
+ // Port of GossipSelect / SendActionMenu / SendConfirm* for the blacksmith. A relative action may be
428
+ // INFO_DEF + n or a bare n; both conventions are accepted. Cite: npc_professions.cpp:348–464.
429
+ export function blacksmithGossipSelect(opts: {
430
+ sender: number;
431
+ action: number;
432
+ level: number;
433
+ knownSpells: ReadonlySet<number> | readonly number[];
434
+ creatureEntry: number;
435
+ }): BlacksmithGossipSelectResult {
436
+ const has = (id: number) => collectionHas(opts.knownSpells, id);
437
+ // Normalize to offset from INFO_DEF when absolute.
438
+ const act =
439
+ opts.action >= GOSSIP_ACTION_INFO_DEF
440
+ ? opts.action - GOSSIP_ACTION_INFO_DEF
441
+ : opts.action;
442
+
443
+ // LEARN sender → confirm learn re-show
444
+ // Cite: npc_professions.cpp:394–417,459
445
+ if (opts.sender === GOSSIP_SENDER_LEARN) {
446
+ return {
447
+ handled: true,
448
+ phase: 'confirm_learn',
449
+ castSpellId: null,
450
+ confirmCostCopper: null,
451
+ closeMenu: false,
452
+ cite: 'npc_professions.cpp:394-417 SendConfirmLearn_npc_prof_blacksmith',
453
+ };
454
+ }
455
+
456
+ // UNLEARN sender → confirm unlearn with cost box
457
+ // Cite: npc_professions.cpp:420–451,460
458
+ if (opts.sender === GOSSIP_SENDER_UNLEARN) {
459
+ let cost: number | null = null;
460
+ const e = opts.creatureEntry;
461
+ if (
462
+ e === N_TRAINER_WEAPON1 ||
463
+ e === N_TRAINER_WEAPON2 ||
464
+ e === N_TRAINER_ARMOR1 ||
465
+ e === N_TRAINER_ARMOR2
466
+ ) {
467
+ cost = getUnlearnCostLow(opts.level);
468
+ } else if (
469
+ e === N_TRAINER_HAMMER ||
470
+ e === N_TRAINER_AXE ||
471
+ e === N_TRAINER_SWORD
472
+ ) {
473
+ cost = getUnlearnCostMedium(opts.level);
474
+ }
475
+ return {
476
+ handled: true,
477
+ phase: 'confirm_unlearn',
478
+ castSpellId: null,
479
+ confirmCostCopper: cost,
480
+ closeMenu: false,
481
+ cite: 'npc_professions.cpp:420-451 SendConfirmUnlearn_npc_prof_blacksmith',
482
+ };
483
+ }
484
+
485
+ // MAIN / CHECK → action menu Cite: npc_professions.cpp:348–392,458,461 TRADE/TRAIN are absolute sc_gossip
486
+ // actions 1/2 — never INFO_DEF+n (INFO_DEF+1 = learn armor, INFO_DEF+2 = learn weapon).
487
+ if (opts.sender === GOSSIP_SENDER_MAIN || opts.sender === GOSSIP_SENDER_CHECK) {
488
+ if (opts.action === GOSSIP_ACTION_TRADE) {
489
+ return {
490
+ handled: true,
491
+ phase: 'trade',
492
+ castSpellId: null,
493
+ confirmCostCopper: null,
494
+ closeMenu: false,
495
+ cite: 'npc_professions.cpp:352-354 SEND_VENDORLIST',
496
+ };
497
+ }
498
+ if (opts.action === GOSSIP_ACTION_TRAIN) {
499
+ return {
500
+ handled: true,
501
+ phase: 'train',
502
+ castSpellId: null,
503
+ confirmCostCopper: null,
504
+ closeMenu: false,
505
+ cite: 'npc_professions.cpp:355-357 SEND_TRAINERLIST',
506
+ };
507
+ }
508
+ if (act === BS_ACTION_LEARN_ARMOR) {
509
+ return {
510
+ handled: true,
511
+ phase: 'cast_learn',
512
+ castSpellId: has(S_ARMOR) ? null : S_LEARN_ARMOR,
513
+ confirmCostCopper: null,
514
+ closeMenu: true,
515
+ cite: 'npc_professions.cpp:359-366 CastSpell S_LEARN_ARMOR if !HasSpell(S_ARMOR)',
516
+ };
517
+ }
518
+ if (act === BS_ACTION_LEARN_WEAPON) {
519
+ return {
520
+ handled: true,
521
+ phase: 'cast_learn',
522
+ castSpellId: has(S_WEAPON) ? null : S_LEARN_WEAPON,
523
+ confirmCostCopper: null,
524
+ closeMenu: true,
525
+ cite: 'npc_professions.cpp:367-374 CastSpell S_LEARN_WEAPON if !HasSpell(S_WEAPON)',
526
+ };
527
+ }
528
+ if (act === BS_ACTION_LEARN_HAMMER) {
529
+ return {
530
+ handled: true,
531
+ phase: 'cast_learn',
532
+ castSpellId: S_LEARN_HAMMER,
533
+ confirmCostCopper: null,
534
+ closeMenu: true,
535
+ cite: 'npc_professions.cpp:376-378 CastSpell S_LEARN_HAMMER',
536
+ };
537
+ }
538
+ if (act === BS_ACTION_LEARN_AXE) {
539
+ return {
540
+ handled: true,
541
+ phase: 'cast_learn',
542
+ castSpellId: S_LEARN_AXE,
543
+ confirmCostCopper: null,
544
+ closeMenu: true,
545
+ cite: 'npc_professions.cpp:380-382 CastSpell S_LEARN_AXE',
546
+ };
547
+ }
548
+ if (act === BS_ACTION_LEARN_SWORD) {
549
+ return {
550
+ handled: true,
551
+ phase: 'cast_learn',
552
+ castSpellId: S_LEARN_SWORD,
553
+ confirmCostCopper: null,
554
+ closeMenu: true,
555
+ cite: 'npc_professions.cpp:384-386 CastSpell S_LEARN_SWORD',
556
+ };
557
+ }
558
+ // Unlearn actions + unknown → CLOSE only (cpp default).
559
+ // Cite: npc_professions.cpp:388-390
560
+ return {
561
+ handled: true,
562
+ phase: 'close',
563
+ castSpellId: null,
564
+ confirmCostCopper: null,
565
+ closeMenu: true,
566
+ cite: 'npc_professions.cpp:388-390 default CLOSE_GOSSIP_MENU (unlearn cast not in SendActionMenu)',
567
+ };
568
+ }
569
+
570
+ return { handled: false, cite: 'npc_professions.cpp:454-464 unknown sender' };
571
+ }
572
+
573
+ // Pure helpers — leather gossip
574
+
575
+ export type LeatherGossipItem =
576
+ | { kind: 'unlearn_dragon'; action: number; costCopper: number; cite: string }
577
+ | { kind: 'learn_dragon'; action: number; cite: string }
578
+ | { kind: 'unlearn_elemental'; action: number; costCopper: number; cite: string }
579
+ | { kind: 'learn_elemental'; action: number; cite: string }
580
+ | { kind: 'unlearn_tribal'; action: number; costCopper: number; cite: string }
581
+ | { kind: 'learn_tribal'; action: number; cite: string }
582
+ | { kind: 'train'; action: number; cite: string }
583
+ | { kind: 'trade'; action: number; cite: string };
584
+
585
+ export interface LeatherGossipHelloResult {
586
+ items: LeatherGossipItem[];
587
+ cite: string;
588
+ }
589
+
590
+ /** Port of GossipHello_npc_prof_leather option set. Cite: npc_professions.cpp:495–546 */
591
+ export function leatherGossipHello(opts: {
592
+ creatureEntry: number;
593
+ skillLeatherworking: number;
594
+ level: number;
595
+ knownSpells: ReadonlySet<number> | readonly number[];
596
+ questRewarded: ReadonlySet<number> | readonly number[];
597
+ isTrainer?: boolean;
598
+ isVendor?: boolean;
599
+ }): LeatherGossipHelloResult {
600
+ const has = (id: number) => collectionHas(opts.knownSpells, id);
601
+ const items: LeatherGossipItem[] = [];
602
+ const e = opts.creatureEntry;
603
+ const cost = getUnlearnCostMedium(opts.level);
604
+ const eligible = isEligibleSpecializeLW({
605
+ knownSpells: opts.knownSpells,
606
+ questRewarded: opts.questRewarded,
607
+ });
608
+
609
+ if (opts.isVendor) {
610
+ items.push({
611
+ kind: 'trade',
612
+ action: GOSSIP_ACTION_TRADE,
613
+ cite: 'npc_professions.cpp:499-500 vendor browse goods',
614
+ });
615
+ }
616
+
617
+ // Cite: npc_professions.cpp:504–542
618
+ if (
619
+ opts.skillLeatherworking >= LW_SPEC_SKILL_MIN &&
620
+ opts.level > 39
621
+ ) {
622
+ if (e === N_TRAINER_DRAGON1 || e === N_TRAINER_DRAGON2) {
623
+ if (has(S_DRAGON)) {
624
+ items.push({
625
+ kind: 'unlearn_dragon',
626
+ action: GOSSIP_ACTION_INFO_DEF + LW_ACTION_UNLEARN_DRAGON,
627
+ costCopper: cost,
628
+ cite: 'npc_professions.cpp:510-514 unlearn dragon + optional train',
629
+ });
630
+ if (opts.isTrainer) {
631
+ items.push({
632
+ kind: 'train',
633
+ action: GOSSIP_ACTION_TRAIN,
634
+ cite: 'npc_professions.cpp:513-514 trainer list',
635
+ });
636
+ }
637
+ } else if (eligible) {
638
+ items.push({
639
+ kind: 'learn_dragon',
640
+ action: GOSSIP_ACTION_INFO_DEF + LW_ACTION_LEARN_DRAGON,
641
+ cite: 'npc_professions.cpp:516-517 learn dragon if eligible',
642
+ });
643
+ }
644
+ }
645
+ if (e === N_TRAINER_ELEMENTAL1 || e === N_TRAINER_ELEMENTAL2) {
646
+ if (has(S_ELEMENTAL)) {
647
+ items.push({
648
+ kind: 'unlearn_elemental',
649
+ action: GOSSIP_ACTION_INFO_DEF + LW_ACTION_UNLEARN_ELEMENTAL,
650
+ costCopper: cost,
651
+ cite: 'npc_professions.cpp:521-525 unlearn elemental + optional train',
652
+ });
653
+ if (opts.isTrainer) {
654
+ items.push({
655
+ kind: 'train',
656
+ action: GOSSIP_ACTION_TRAIN,
657
+ cite: 'npc_professions.cpp:524-525 trainer list',
658
+ });
659
+ }
660
+ } else if (eligible) {
661
+ items.push({
662
+ kind: 'learn_elemental',
663
+ action: GOSSIP_ACTION_INFO_DEF + LW_ACTION_LEARN_ELEMENTAL,
664
+ cite: 'npc_professions.cpp:527-528 learn elemental if eligible',
665
+ });
666
+ }
667
+ }
668
+ if (e === N_TRAINER_TRIBAL1 || e === N_TRAINER_TRIBAL2) {
669
+ if (has(S_TRIBAL)) {
670
+ items.push({
671
+ kind: 'unlearn_tribal',
672
+ action: GOSSIP_ACTION_INFO_DEF + LW_ACTION_UNLEARN_TRIBAL,
673
+ costCopper: cost,
674
+ cite: 'npc_professions.cpp:532-536 unlearn tribal + optional train',
675
+ });
676
+ if (opts.isTrainer) {
677
+ items.push({
678
+ kind: 'train',
679
+ action: GOSSIP_ACTION_TRAIN,
680
+ cite: 'npc_professions.cpp:535-536 trainer list',
681
+ });
682
+ }
683
+ } else if (eligible) {
684
+ items.push({
685
+ kind: 'learn_tribal',
686
+ action: GOSSIP_ACTION_INFO_DEF + LW_ACTION_LEARN_TRIBAL,
687
+ cite: 'npc_professions.cpp:538-539 learn tribal if eligible',
688
+ });
689
+ }
690
+ }
691
+ }
692
+
693
+ return {
694
+ items,
695
+ cite: 'npc_professions.cpp:495-546 GossipHello_npc_prof_leather',
696
+ };
697
+ }
698
+
699
+ export type LeatherGossipSelectResult =
700
+ | {
701
+ handled: true;
702
+ phase:
703
+ | 'trade'
704
+ | 'train'
705
+ | 'cast_learn'
706
+ | 'cast_unlearn'
707
+ | 'error_money'
708
+ | 'error_equipped'
709
+ | 'close';
710
+ castSpellId: number | null;
711
+ removeRecipeSpells: readonly number[];
712
+ moneyDelta: number;
713
+ closeMenu: boolean;
714
+ cite: string;
715
+ }
716
+ | { handled: false; cite: string };
717
+
718
+ // Port of SendActionMenu_npc_prof_leather; `equippedOk` stands in for EquippedOk, which the caller
719
+ // supplies. Cite: npc_professions.cpp:548–620.
720
+ export function leatherGossipSelect(opts: {
721
+ sender: number;
722
+ action: number;
723
+ level: number;
724
+ moneyCopper: number;
725
+ /** EquippedOk result for the pending unlearn spell (true = safe to unlearn). */
726
+ equippedOk: boolean;
727
+ }): LeatherGossipSelectResult {
728
+ if (opts.sender !== GOSSIP_SENDER_MAIN && opts.sender !== GOSSIP_SENDER_CHECK) {
729
+ return { handled: false, cite: 'npc_professions.cpp:622-631 unknown sender' };
730
+ }
731
+
732
+ const act =
733
+ opts.action >= GOSSIP_ACTION_INFO_DEF
734
+ ? opts.action - GOSSIP_ACTION_INFO_DEF
735
+ : opts.action;
736
+ const cost = getUnlearnCostMedium(opts.level);
737
+
738
+ // TRADE/TRAIN are absolute sc_gossip actions 1/2 — never INFO_DEF+n
739
+ // (INFO_DEF+1 = unlearn dragon, INFO_DEF+2 = learn dragon).
740
+ if (opts.action === GOSSIP_ACTION_TRADE) {
741
+ return {
742
+ handled: true,
743
+ phase: 'trade',
744
+ castSpellId: null,
745
+ removeRecipeSpells: [],
746
+ moneyDelta: 0,
747
+ closeMenu: false,
748
+ cite: 'npc_professions.cpp:552-554 SEND_VENDORLIST',
749
+ };
750
+ }
751
+ if (opts.action === GOSSIP_ACTION_TRAIN) {
752
+ return {
753
+ handled: true,
754
+ phase: 'train',
755
+ castSpellId: null,
756
+ removeRecipeSpells: [],
757
+ moneyDelta: 0,
758
+ closeMenu: false,
759
+ cite: 'npc_professions.cpp:555-557 SEND_TRAINERLIST',
760
+ };
761
+ }
762
+
763
+ const unlearnBranch = (
764
+ unlearnSpell: number,
765
+ cite: string,
766
+ ): LeatherGossipSelectResult => {
767
+ if (!opts.equippedOk) {
768
+ return {
769
+ handled: true,
770
+ phase: 'error_equipped',
771
+ castSpellId: null,
772
+ removeRecipeSpells: [],
773
+ moneyDelta: 0,
774
+ closeMenu: true,
775
+ cite: `${cite}; npc_professions.cpp:571-572 SendEquipError when !EquippedOk`,
776
+ };
777
+ }
778
+ if (opts.moneyCopper < cost) {
779
+ return {
780
+ handled: true,
781
+ phase: 'error_money',
782
+ castSpellId: null,
783
+ removeRecipeSpells: [],
784
+ moneyDelta: 0,
785
+ closeMenu: true,
786
+ cite: `${cite}; npc_professions.cpp:569-570 SendBuyError not enough money`,
787
+ };
788
+ }
789
+ return {
790
+ handled: true,
791
+ phase: 'cast_unlearn',
792
+ castSpellId: unlearnSpell,
793
+ removeRecipeSpells: PROFESSION_UNLEARN_SPELLS[unlearnSpell] ?? [],
794
+ moneyDelta: -cost,
795
+ closeMenu: true,
796
+ cite,
797
+ };
798
+ };
799
+
800
+ if (act === LW_ACTION_UNLEARN_DRAGON) {
801
+ return unlearnBranch(
802
+ S_UNLEARN_DRAGON,
803
+ 'npc_professions.cpp:559-574 unlearn dragon CastSpell + ProfessionUnlearnSpells + money',
804
+ );
805
+ }
806
+ if (act === LW_ACTION_LEARN_DRAGON) {
807
+ return {
808
+ handled: true,
809
+ phase: 'cast_learn',
810
+ castSpellId: S_LEARN_DRAGON,
811
+ removeRecipeSpells: [],
812
+ moneyDelta: 0,
813
+ closeMenu: true,
814
+ cite: 'npc_professions.cpp:575-577 CastSpell S_LEARN_DRAGON',
815
+ };
816
+ }
817
+ if (act === LW_ACTION_UNLEARN_ELEMENTAL) {
818
+ return unlearnBranch(
819
+ S_UNLEARN_ELEMENTAL,
820
+ 'npc_professions.cpp:579-594 unlearn elemental CastSpell + ProfessionUnlearnSpells + money',
821
+ );
822
+ }
823
+ if (act === LW_ACTION_LEARN_ELEMENTAL) {
824
+ return {
825
+ handled: true,
826
+ phase: 'cast_learn',
827
+ castSpellId: S_LEARN_ELEMENTAL,
828
+ removeRecipeSpells: [],
829
+ moneyDelta: 0,
830
+ closeMenu: true,
831
+ cite: 'npc_professions.cpp:595-597 CastSpell S_LEARN_ELEMENTAL',
832
+ };
833
+ }
834
+ if (act === LW_ACTION_UNLEARN_TRIBAL) {
835
+ return unlearnBranch(
836
+ S_UNLEARN_TRIBAL,
837
+ 'npc_professions.cpp:599-614 unlearn tribal CastSpell + ProfessionUnlearnSpells + money',
838
+ );
839
+ }
840
+ if (act === LW_ACTION_LEARN_TRIBAL) {
841
+ return {
842
+ handled: true,
843
+ phase: 'cast_learn',
844
+ castSpellId: S_LEARN_TRIBAL,
845
+ removeRecipeSpells: [],
846
+ moneyDelta: 0,
847
+ closeMenu: true,
848
+ cite: 'npc_professions.cpp:615-617 CastSpell S_LEARN_TRIBAL',
849
+ };
850
+ }
851
+
852
+ return {
853
+ handled: true,
854
+ phase: 'close',
855
+ castSpellId: null,
856
+ removeRecipeSpells: [],
857
+ moneyDelta: 0,
858
+ closeMenu: true,
859
+ cite: 'npc_professions.cpp:548-620 unknown action close',
860
+ };
861
+ }
862
+
863
+ // ScriptDev IR — npc_prof_blacksmith
864
+
865
+ const BS_ABSENT_UNUSED = (
866
+ entry: number,
867
+ name: string,
868
+ ): NonNullable<ScriptDevIR['unusedBindings']>[number] => ({
869
+ entry,
870
+ kind: 'creature',
871
+ reason:
872
+ `NPC ${entry} ${name} is DB-bound to npc_prof_blacksmith (gossip learn/unlearn ` +
873
+ 'blacksmith specializations) but absent from product tables/creatures bake - ' +
874
+ 'IR + pure helpers (blacksmithGossipHello/Select) ported; may still appear on ' +
875
+ 'profession-data.profTrainers for trainer UI; product creature spawn until rebake',
876
+ cite: `npc_professions.cpp:149-159 N_TRAINER_*; scriptdev-corpus boundCreatures; loadRealBundle missing ${entry}`,
877
+ });
878
+
879
+ // npc_prof_blacksmith gossip only, no UpdateAI. Bound to 5164, 11145–11146, 11176–11178 and
880
+ // 11191–11193; four of those are still missing from the creature bake.
881
+ export const NPC_PROF_BLACKSMITH: ScriptDevIR = {
882
+ name: 'npc_prof_blacksmith',
883
+ boundCreatures: [...BS_BOUND_CREATURES],
884
+ sourceFile: 'world/npc_professions.cpp',
885
+ // Player-side specialization learn/rep spells (not AI combat kit).
886
+ // Corpus spellIds=[] — listed here for IR completeness; combat bake may lack them.
887
+ spellIds: [
888
+ S_WEAPON,
889
+ S_ARMOR,
890
+ S_HAMMER,
891
+ S_AXE,
892
+ S_SWORD,
893
+ S_LEARN_WEAPON,
894
+ S_LEARN_ARMOR,
895
+ S_LEARN_HAMMER,
896
+ S_LEARN_AXE,
897
+ S_LEARN_SWORD,
898
+ S_REP_ARMOR,
899
+ S_REP_WEAPON,
900
+ ],
901
+ timers: [],
902
+ unusedBindings: [
903
+ // Present after service-NPC bake: 5164, 11145, 11146, 11177, 11178
904
+ BS_ABSENT_UNUSED(N_TRAINER_SMITHOMNI2, 'Krathok Moltenfist'),
905
+ BS_ABSENT_UNUSED(N_TRAINER_HAMMER, 'Lilith the Lithe'),
906
+ BS_ABSENT_UNUSED(N_TRAINER_AXE, 'Kilram'),
907
+ BS_ABSENT_UNUSED(N_TRAINER_SWORD, 'Seril Scourgebane'),
908
+ ],
909
+ lifecycle: {
910
+ onReset: [
911
+ {
912
+ kind: 'flavor',
913
+ text: 'gossip-only blacksmith specialization learn/unlearn (blacksmithGossipHello/Select pure helpers)',
914
+ cite: 'npc_professions.cpp:278-464',
915
+ },
916
+ ],
917
+ },
918
+ cites: [
919
+ 'npc_professions.cpp:278-346 GossipHello_npc_prof_blacksmith',
920
+ 'npc_professions.cpp:348-392 SendActionMenu_npc_prof_blacksmith',
921
+ 'npc_professions.cpp:394-451 SendConfirmLearn/Unlearn',
922
+ 'npc_professions.cpp:454-464 GossipSelect_npc_prof_blacksmith',
923
+ 'npc_professions.cpp:174-190 GetUnlearnCostMedium/Low',
924
+ 'npc_professions.cpp:97-113 SpecializationSpells blacksmith',
925
+ 'npc_professions.cpp:149-159 SpecializationTrainers blacksmith',
926
+ 'npc_professions.cpp:651-657 RegisterSelf pGossipHello/Select',
927
+ 'npc_professions.cpp:466-475 QuestComplete residual → QI4 registryNpcProfessions',
928
+ ],
929
+ };
930
+
931
+ // ScriptDev IR — npc_prof_leather
932
+
933
+ const LW_ABSENT_UNUSED = (
934
+ entry: number,
935
+ name: string,
936
+ ): NonNullable<ScriptDevIR['unusedBindings']>[number] => ({
937
+ entry,
938
+ kind: 'creature',
939
+ reason:
940
+ `NPC ${entry} ${name} is DB-bound to npc_prof_leather (gossip learn/unlearn ` +
941
+ 'leatherworking specializations) but absent from product tables/creatures bake - ' +
942
+ 'IR + pure helpers (leatherGossipHello/Select) ported; may still appear on ' +
943
+ 'profession-data.profTrainers; product creature spawn until rebake',
944
+ cite: `npc_professions.cpp:161-167 N_TRAINER_*; scriptdev-corpus boundCreatures; loadRealBundle missing ${entry}`,
945
+ });
946
+
947
+ // npc_prof_leather gossip only, no UpdateAI. Bound to creatures 7866–7871, all present after the
948
+ // service-NPC faction bake. Cite: npc_professions.cpp:481–632.
949
+ export const NPC_PROF_LEATHER: ScriptDevIR = {
950
+ name: 'npc_prof_leather',
951
+ boundCreatures: [...LW_BOUND_CREATURES],
952
+ sourceFile: 'world/npc_professions.cpp',
953
+ spellIds: [
954
+ S_DRAGON,
955
+ S_ELEMENTAL,
956
+ S_TRIBAL,
957
+ S_LEARN_DRAGON,
958
+ S_LEARN_ELEMENTAL,
959
+ S_LEARN_TRIBAL,
960
+ S_UNLEARN_DRAGON,
961
+ S_UNLEARN_ELEMENTAL,
962
+ S_UNLEARN_TRIBAL,
963
+ ],
964
+ timers: [],
965
+ unusedBindings: [],
966
+
967
+ lifecycle: {
968
+ onReset: [
969
+ {
970
+ kind: 'flavor',
971
+ text: 'gossip-only leatherworking specialization learn/unlearn (leatherGossipHello/Select pure helpers)',
972
+ cite: 'npc_professions.cpp:481-632',
973
+ },
974
+ ],
975
+ },
976
+ cites: [
977
+ 'npc_professions.cpp:481-493 IsEligibleSpecializeLW',
978
+ 'npc_professions.cpp:495-546 GossipHello_npc_prof_leather',
979
+ 'npc_professions.cpp:548-620 SendActionMenu_npc_prof_leather',
980
+ 'npc_professions.cpp:622-632 GossipSelect_npc_prof_leather',
981
+ 'npc_professions.cpp:196-221 EquippedOk',
982
+ 'npc_professions.cpp:223-267 ProfessionUnlearnSpells',
983
+ 'npc_professions.cpp:116-124 SpecializationSpells leather',
984
+ 'npc_professions.cpp:161-167 SpecializationTrainers leather',
985
+ 'npc_professions.cpp:659-663 RegisterSelf pGossipHello/Select',
986
+ ],
987
+ };
988
+
989
+ // ScriptDev IR — go_soothsaying_for_dummies (commented residual)
990
+
991
+ // go_soothsaying_for_dummies — the pGOUse body and RegisterSelf are both commented out upstream,
992
+ // so this is documented for census completeness only. Cite: npc_professions.cpp:638–669.
993
+ export const GO_SOOTHSAYING_FOR_DUMMIES_SCRIPT: ScriptDevIR = {
994
+ name: 'go_soothsaying_for_dummies',
995
+ boundCreatures: [],
996
+ boundGos: [GO_SOOTHSAYING_FOR_DUMMIES],
997
+ sourceFile: 'world/npc_professions.cpp',
998
+ spellIds: [S_LEARN_DRAGON],
999
+ timers: [],
1000
+ unusedBindings: [
1001
+ {
1002
+ entry: GO_SOOTHSAYING_FOR_DUMMIES,
1003
+ kind: 'go',
1004
+ reason:
1005
+ 'GO 177226 Soothsaying for Dummies: pGOUse + RegisterSelf fully commented in ' +
1006
+ 'npc_professions.cpp (:638-645, :665-669); residual would open gossip menu 5584 ' +
1007
+ 'with learn-dragon item. Absent from product bake - IR documents residual only',
1008
+ cite: 'npc_professions.cpp:37,638-645,665-669; loadRealBundle missing 177226',
1009
+ },
1010
+ ],
1011
+ lifecycle: {
1012
+ onReset: [
1013
+ {
1014
+ kind: 'flavor',
1015
+ text: 'commented GO residual - gossip menu 5584 learn dragon (not RegisterSelf)',
1016
+ cite: 'npc_professions.cpp:638-645',
1017
+ },
1018
+ ],
1019
+ },
1020
+ cites: [
1021
+ 'npc_professions.cpp:37 UPDATE gameobject_template ScriptName go_soothsaying_for_dummies entry 177226',
1022
+ 'npc_professions.cpp:638-645 GOUse_go_soothsaying_for_dummies commented',
1023
+ 'npc_professions.cpp:665-669 RegisterSelf commented',
1024
+ ],
1025
+ };