azeroth-shell 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/README.md +138 -2
  2. package/bin/azsh.mjs +19 -0
  3. package/docs/aifid/eventai-texts.json +4414 -0
  4. package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
  5. package/docs/dungeons/survey/pack-id-migration.json +2418 -0
  6. package/package.json +35 -4
  7. package/src/autopilot/bossSkip.ts +26 -0
  8. package/src/autopilot/combatRotation.ts +824 -0
  9. package/src/autopilot/config.ts +533 -0
  10. package/src/autopilot/consumables.ts +58 -0
  11. package/src/autopilot/encounterStand.ts +121 -0
  12. package/src/autopilot/objectGatePlan.ts +53 -0
  13. package/src/autopilot/pathEngage.ts +229 -0
  14. package/src/autopilot/plan.ts +1643 -0
  15. package/src/autopilot/questPolicy.ts +274 -0
  16. package/src/autopilot/routeStep.ts +69 -0
  17. package/src/autopilot/sessionReport.ts +88 -0
  18. package/src/autopilot/topOffPower.ts +26 -0
  19. package/src/autopilot/view.ts +476 -0
  20. package/src/cli/bootCheck.mjs +34 -0
  21. package/src/cli/bootData.mjs +57 -0
  22. package/src/cli/combatLogFilter.ts +153 -0
  23. package/src/cli/combatLogFormat.ts +613 -0
  24. package/src/cli/fileRepository.mjs +105 -0
  25. package/src/cli/gzLoader.mjs +31 -0
  26. package/src/cli/liveGauntletEscort.ts +978 -0
  27. package/src/cli/liveStratUndead.ts +305 -0
  28. package/src/cli/macroHostCombat.ts +545 -0
  29. package/src/cli/macroHostWorld.ts +330 -0
  30. package/src/cli/prefs.mjs +31 -0
  31. package/src/cli/register.mjs +4 -0
  32. package/src/cli/repl.mjs +693 -0
  33. package/src/cli/rotationText.mjs +226 -0
  34. package/src/cli/squad.mjs +105 -0
  35. package/src/cli/term.mjs +144 -0
  36. package/src/cli/text.mjs +122 -0
  37. package/src/cli/tui.mjs +626 -0
  38. package/src/cli/tuiArena.mjs +109 -0
  39. package/src/cli/tuiAutopilotSettings.mjs +93 -0
  40. package/src/cli/tuiBags.mjs +180 -0
  41. package/src/cli/tuiBars.mjs +133 -0
  42. package/src/cli/tuiBg.mjs +243 -0
  43. package/src/cli/tuiBulk.mjs +162 -0
  44. package/src/cli/tuiCheck.mjs +1882 -0
  45. package/src/cli/tuiCity.mjs +396 -0
  46. package/src/cli/tuiCompanionKit.mjs +300 -0
  47. package/src/cli/tuiCompanions.mjs +471 -0
  48. package/src/cli/tuiDev.mjs +62 -0
  49. package/src/cli/tuiDungeon.mjs +606 -0
  50. package/src/cli/tuiEnchantTarget.mjs +120 -0
  51. package/src/cli/tuiFight.mjs +577 -0
  52. package/src/cli/tuiFightPanes.mjs +228 -0
  53. package/src/cli/tuiFloor.mjs +506 -0
  54. package/src/cli/tuiGear.mjs +158 -0
  55. package/src/cli/tuiHonor.mjs +74 -0
  56. package/src/cli/tuiLoot.mjs +97 -0
  57. package/src/cli/tuiMacros.mjs +144 -0
  58. package/src/cli/tuiOutfitter.mjs +115 -0
  59. package/src/cli/tuiPet.mjs +116 -0
  60. package/src/cli/tuiProfessions.mjs +800 -0
  61. package/src/cli/tuiRaid.mjs +127 -0
  62. package/src/cli/tuiRep.mjs +65 -0
  63. package/src/cli/tuiSaves.mjs +69 -0
  64. package/src/cli/tuiSearch.mjs +363 -0
  65. package/src/cli/tuiSettings.mjs +151 -0
  66. package/src/cli/tuiSimLab.mjs +80 -0
  67. package/src/cli/tuiTalents.mjs +60 -0
  68. package/src/cli/tuiViews.mjs +1178 -0
  69. package/src/cli/tuiWiki.mjs +181 -0
  70. package/src/cli/tuiWorld.mjs +361 -0
  71. package/src/cli/wikiIndex.ts +259 -0
  72. package/src/cli/wikiSources.ts +355 -0
  73. package/src/data/alteracValley.ts +176 -0
  74. package/src/data/appearanceOptions.ts +534 -0
  75. package/src/data/applyLootChanceSanity.ts +21 -0
  76. package/src/data/createFlavor.ts +96 -0
  77. package/src/data/customItems.ts +33 -0
  78. package/src/data/dataStore.ts +1904 -0
  79. package/src/data/dungeonGameObjects.ts +84 -0
  80. package/src/data/dungeonPlateCover.ts +66 -0
  81. package/src/data/dungeonSpawns.ts +294 -0
  82. package/src/data/dungeons/alterac-valley.ts +135 -0
  83. package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
  84. package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
  85. package/src/data/dungeons/apply-instance-geometry.ts +65 -0
  86. package/src/data/dungeons/apply-spawn-placement.ts +171 -0
  87. package/src/data/dungeons/blackfathom-deeps.ts +539 -0
  88. package/src/data/dungeons/blackrock-depths.ts +1410 -0
  89. package/src/data/dungeons/blackwing-lair.ts +129 -0
  90. package/src/data/dungeons/boss-eventai.ts +8 -0
  91. package/src/data/dungeons/deadmines.ts +410 -0
  92. package/src/data/dungeons/dire-maul-east.ts +980 -0
  93. package/src/data/dungeons/dire-maul-north.ts +661 -0
  94. package/src/data/dungeons/dire-maul-west.ts +785 -0
  95. package/src/data/dungeons/dungeon-rooms.json +5479 -0
  96. package/src/data/dungeons/encounter-outdoors.json +359 -0
  97. package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
  98. package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
  99. package/src/data/dungeons/eventai/deadmines.ts +264 -0
  100. package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
  101. package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
  102. package/src/data/dungeons/eventai/helpers.ts +79 -0
  103. package/src/data/dungeons/eventai/index.ts +133 -0
  104. package/src/data/dungeons/eventai/lbrs.ts +372 -0
  105. package/src/data/dungeons/eventai/maraudon.ts +323 -0
  106. package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
  107. package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
  108. package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
  109. package/src/data/dungeons/eventai/scholomance.ts +680 -0
  110. package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
  111. package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
  112. package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
  113. package/src/data/dungeons/eventai/sm-library.ts +55 -0
  114. package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
  115. package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
  116. package/src/data/dungeons/eventai/the-stockade.ts +228 -0
  117. package/src/data/dungeons/eventai/ubrs.ts +225 -0
  118. package/src/data/dungeons/eventai/uldaman.ts +355 -0
  119. package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
  120. package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
  121. package/src/data/dungeons/gnomeregan.ts +909 -0
  122. package/src/data/dungeons/index.ts +126 -0
  123. package/src/data/dungeons/instance-geometry.json +5233 -0
  124. package/src/data/dungeons/key-sources.json +169 -0
  125. package/src/data/dungeons/lbrs.ts +996 -0
  126. package/src/data/dungeons/maraudon.ts +786 -0
  127. package/src/data/dungeons/molten-core.ts +194 -0
  128. package/src/data/dungeons/naxxramas.ts +173 -0
  129. package/src/data/dungeons/onyxias-lair.ts +71 -0
  130. package/src/data/dungeons/pack-from-clusters.ts +1256 -0
  131. package/src/data/dungeons/ragefire-chasm.ts +238 -0
  132. package/src/data/dungeons/razorfen-downs.ts +698 -0
  133. package/src/data/dungeons/razorfen-kraul.ts +766 -0
  134. package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
  135. package/src/data/dungeons/scholomance.ts +1076 -0
  136. package/src/data/dungeons/shadowfang-keep.ts +740 -0
  137. package/src/data/dungeons/sm-armory.ts +266 -0
  138. package/src/data/dungeons/sm-cathedral.ts +430 -0
  139. package/src/data/dungeons/sm-graveyard.ts +482 -0
  140. package/src/data/dungeons/sm-library.ts +337 -0
  141. package/src/data/dungeons/stratholme-live.ts +808 -0
  142. package/src/data/dungeons/stratholme-undead.ts +1164 -0
  143. package/src/data/dungeons/sunken-temple.ts +931 -0
  144. package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
  145. package/src/data/dungeons/the-stockade.ts +282 -0
  146. package/src/data/dungeons/ubrs.ts +1286 -0
  147. package/src/data/dungeons/uldaman.ts +685 -0
  148. package/src/data/dungeons/wailing-caverns.ts +356 -0
  149. package/src/data/dungeons/zul-farrak.ts +686 -0
  150. package/src/data/dungeons/zul-gurub.ts +142 -0
  151. package/src/data/dungeons.ts +42 -0
  152. package/src/data/fixtures.ts +446 -0
  153. package/src/data/gameobject-data.json.gz +0 -0
  154. package/src/data/item-data.json.gz +0 -0
  155. package/src/data/loot-data.json.gz +0 -0
  156. package/src/data/maps/atlas-approach-maps.json +1425 -0
  157. package/src/data/maps/atlas-landmarks.json +1711 -0
  158. package/src/data/maps/dungeon-viewports.json +392 -0
  159. package/src/data/materializeModDamagePercentTaken.ts +70 -0
  160. package/src/data/materializeModHealthRegen.ts +89 -0
  161. package/src/data/materializeSpellReputation.ts +26 -0
  162. package/src/data/pageTexts.ts +19 -0
  163. package/src/data/profession-data.json.gz +0 -0
  164. package/src/data/raid-plans/blackfathom-deeps.json +86 -0
  165. package/src/data/raid-plans/blackrock-depths.json +419 -0
  166. package/src/data/raid-plans/blackwing-lair.json +328 -0
  167. package/src/data/raid-plans/deadmines.json +55 -0
  168. package/src/data/raid-plans/dire-maul-east.json +94 -0
  169. package/src/data/raid-plans/dire-maul-north.json +70 -0
  170. package/src/data/raid-plans/dire-maul-west.json +75 -0
  171. package/src/data/raid-plans/gnomeregan.json +131 -0
  172. package/src/data/raid-plans/lbrs.json +176 -0
  173. package/src/data/raid-plans/maraudon.json +102 -0
  174. package/src/data/raid-plans/molten-core.json +169 -0
  175. package/src/data/raid-plans/naxxramas.json +354 -0
  176. package/src/data/raid-plans/onyxias-lair.json +18 -0
  177. package/src/data/raid-plans/ragefire-chasm.json +30 -0
  178. package/src/data/raid-plans/razorfen-downs.json +75 -0
  179. package/src/data/raid-plans/razorfen-kraul.json +53 -0
  180. package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
  181. package/src/data/raid-plans/scholomance.json +170 -0
  182. package/src/data/raid-plans/shadowfang-keep.json +87 -0
  183. package/src/data/raid-plans/sm-armory.json +53 -0
  184. package/src/data/raid-plans/sm-cathedral.json +72 -0
  185. package/src/data/raid-plans/sm-graveyard.json +63 -0
  186. package/src/data/raid-plans/sm-library.json +23 -0
  187. package/src/data/raid-plans/stratholme-live.json +129 -0
  188. package/src/data/raid-plans/stratholme-undead.json +73 -0
  189. package/src/data/raid-plans/sunken-temple.json +159 -0
  190. package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
  191. package/src/data/raid-plans/the-stockade.json +42 -0
  192. package/src/data/raid-plans/ubrs.json +53 -0
  193. package/src/data/raid-plans/uldaman.json +131 -0
  194. package/src/data/raid-plans/wailing-caverns.json +90 -0
  195. package/src/data/raid-plans/zul-farrak.json +156 -0
  196. package/src/data/raid-plans/zul-gurub.json +307 -0
  197. package/src/data/raidInstanceCreatures.mjs +473 -0
  198. package/src/data/rotations/index.ts +152 -0
  199. package/src/data/rotations/layout.mjs +72 -0
  200. package/src/data/rotations/pve/druid/balance.json +754 -0
  201. package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
  202. package/src/data/rotations/pve/druid/feral.json +2660 -0
  203. package/src/data/rotations/pve/druid/restoration.json +424 -0
  204. package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
  205. package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
  206. package/src/data/rotations/pve/hunter/survival.json +1373 -0
  207. package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
  208. package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
  209. package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
  210. package/src/data/rotations/pve/paladin/holy.json +755 -0
  211. package/src/data/rotations/pve/paladin/protection.json +962 -0
  212. package/src/data/rotations/pve/paladin/retribution.json +924 -0
  213. package/src/data/rotations/pve/priest/discipline.json +772 -0
  214. package/src/data/rotations/pve/priest/holy.json +707 -0
  215. package/src/data/rotations/pve/priest/shadow.json +787 -0
  216. package/src/data/rotations/pve/rogue/assassination.json +2477 -0
  217. package/src/data/rotations/pve/rogue/combat.json +2483 -0
  218. package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
  219. package/src/data/rotations/pve/shaman/elemental.json +1157 -0
  220. package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
  221. package/src/data/rotations/pve/shaman/restoration.json +592 -0
  222. package/src/data/rotations/pve/warlock/affliction.json +1185 -0
  223. package/src/data/rotations/pve/warlock/demonology.json +1165 -0
  224. package/src/data/rotations/pve/warlock/destruction.json +1177 -0
  225. package/src/data/rotations/pve/warrior/arms.json +3020 -0
  226. package/src/data/rotations/pve/warrior/fury.json +2996 -0
  227. package/src/data/rotations/pve/warrior/protection.json +2509 -0
  228. package/src/data/rotations/pvp/druid/balance.json +593 -0
  229. package/src/data/rotations/pvp/druid/feral.json +3276 -0
  230. package/src/data/rotations/pvp/druid/restoration.json +662 -0
  231. package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
  232. package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
  233. package/src/data/rotations/pvp/hunter/survival.json +635 -0
  234. package/src/data/rotations/pvp/mage/arcane.json +574 -0
  235. package/src/data/rotations/pvp/mage/fire.json +570 -0
  236. package/src/data/rotations/pvp/mage/frost.json +4048 -0
  237. package/src/data/rotations/pvp/paladin/holy.json +1498 -0
  238. package/src/data/rotations/pvp/paladin/protection.json +567 -0
  239. package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
  240. package/src/data/rotations/pvp/priest/discipline.json +1848 -0
  241. package/src/data/rotations/pvp/priest/holy.json +6340 -0
  242. package/src/data/rotations/pvp/priest/shadow.json +2329 -0
  243. package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
  244. package/src/data/rotations/pvp/rogue/combat.json +5258 -0
  245. package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
  246. package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
  247. package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
  248. package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
  249. package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
  250. package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
  251. package/src/data/rotations/pvp/warlock/destruction.json +638 -0
  252. package/src/data/rotations/pvp/warrior/arms.json +5665 -0
  253. package/src/data/rotations/pvp/warrior/fury.json +850 -0
  254. package/src/data/rotations/pvp/warrior/protection.json +777 -0
  255. package/src/data/schema/bundle.ts +511 -0
  256. package/src/data/schema/constants.ts +49 -0
  257. package/src/data/schema/creature.ts +454 -0
  258. package/src/data/schema/encounter.ts +155 -0
  259. package/src/data/schema/faction.ts +48 -0
  260. package/src/data/schema/item.ts +297 -0
  261. package/src/data/schema/itemEnchant.ts +105 -0
  262. package/src/data/schema/npc.ts +44 -0
  263. package/src/data/schema/primitives.ts +295 -0
  264. package/src/data/schema/profession.ts +226 -0
  265. package/src/data/schema/quest.ts +154 -0
  266. package/src/data/schema/spell.ts +1149 -0
  267. package/src/data/schema/talent.ts +74 -0
  268. package/src/data/schema/world.ts +124 -0
  269. package/src/data/schema.ts +19 -0
  270. package/src/data/skinNodeGapFill.ts +68 -0
  271. package/src/data/spell-data.json.gz +0 -0
  272. package/src/data/spell-script-targets.json +1 -0
  273. package/src/data/tables/ahItemValues.json.gz +0 -0
  274. package/src/data/tables/alteracValley.json.gz +0 -0
  275. package/src/data/tables/areatriggerTeleports.json.gz +0 -0
  276. package/src/data/tables/botNames.json.gz +0 -0
  277. package/src/data/tables/botPopulation.json.gz +0 -0
  278. package/src/data/tables/botSpecs.json.gz +0 -0
  279. package/src/data/tables/classLevelStats.json.gz +0 -0
  280. package/src/data/tables/combatConditions.json.gz +0 -0
  281. package/src/data/tables/combatSkillMeta.json.gz +0 -0
  282. package/src/data/tables/conditions.json.gz +0 -0
  283. package/src/data/tables/createInfo.json.gz +0 -0
  284. package/src/data/tables/creatureAggroGroups.json.gz +0 -0
  285. package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
  286. package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
  287. package/src/data/tables/creatureWeapons.json.gz +0 -0
  288. package/src/data/tables/creatures.json.gz +0 -0
  289. package/src/data/tables/dbScripts.json.gz +0 -0
  290. package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
  291. package/src/data/tables/dungeonCensus.json.gz +0 -0
  292. package/src/data/tables/dungeonGameObjects.json.gz +0 -0
  293. package/src/data/tables/dungeonPacks.json.gz +0 -0
  294. package/src/data/tables/dungeonPlateCover.json.gz +0 -0
  295. package/src/data/tables/dungeonSpawns.json.gz +0 -0
  296. package/src/data/tables/dungeonSurvey.json.gz +0 -0
  297. package/src/data/tables/durabilityCosts.json.gz +0 -0
  298. package/src/data/tables/durabilityQuality.json.gz +0 -0
  299. package/src/data/tables/enchantApplicators.json.gz +0 -0
  300. package/src/data/tables/entranceYards.json.gz +0 -0
  301. package/src/data/tables/explorationBasexp.json.gz +0 -0
  302. package/src/data/tables/factionTemplates.json.gz +0 -0
  303. package/src/data/tables/factions.json.gz +0 -0
  304. package/src/data/tables/gameEvents.json.gz +0 -0
  305. package/src/data/tables/gameObjects.json.gz +0 -0
  306. package/src/data/tables/gossipMenus.json.gz +0 -0
  307. package/src/data/tables/graveyards.json.gz +0 -0
  308. package/src/data/tables/instanceMaps.json.gz +0 -0
  309. package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
  310. package/src/data/tables/itemEnchants.json.gz +0 -0
  311. package/src/data/tables/itemRandomProperties.json.gz +0 -0
  312. package/src/data/tables/itemSets.json.gz +0 -0
  313. package/src/data/tables/items.json.gz +0 -0
  314. package/src/data/tables/levelStats.json.gz +0 -0
  315. package/src/data/tables/locks.json.gz +0 -0
  316. package/src/data/tables/map-pin-overrides.json.gz +0 -0
  317. package/src/data/tables/nonCombatTrash.json.gz +0 -0
  318. package/src/data/tables/npcTexts.json.gz +0 -0
  319. package/src/data/tables/pageTexts.json.gz +0 -0
  320. package/src/data/tables/petAbilityTP.json.gz +0 -0
  321. package/src/data/tables/petGenericSpells.json.gz +0 -0
  322. package/src/data/tables/petLevelStats.json.gz +0 -0
  323. package/src/data/tables/playerbot-weightscales.json.gz +0 -0
  324. package/src/data/tables/pools.json.gz +0 -0
  325. package/src/data/tables/quests.json.gz +0 -0
  326. package/src/data/tables/races.json.gz +0 -0
  327. package/src/data/tables/reputationRanks.json.gz +0 -0
  328. package/src/data/tables/reputationRates.json.gz +0 -0
  329. package/src/data/tables/reputationSpillover.json.gz +0 -0
  330. package/src/data/tables/ridingSpells.json.gz +0 -0
  331. package/src/data/tables/scriptTexts.json.gz +0 -0
  332. package/src/data/tables/soundClipVolume.json.gz +0 -0
  333. package/src/data/tables/spellChain.json.gz +0 -0
  334. package/src/data/tables/spellTeleports.json.gz +0 -0
  335. package/src/data/tables/spells.json.gz +0 -0
  336. package/src/data/tables/talents.json.gz +0 -0
  337. package/src/data/tables/tavernTriggers.json.gz +0 -0
  338. package/src/data/tables/taxiNodes.json.gz +0 -0
  339. package/src/data/tables/taxiRoutes.json.gz +0 -0
  340. package/src/data/tables/trainers.json.gz +0 -0
  341. package/src/data/tables/transports.json.gz +0 -0
  342. package/src/data/tables/travelAnchors.json.gz +0 -0
  343. package/src/data/tables/travelEdges.json.gz +0 -0
  344. package/src/data/tables/unitConditions.json.gz +0 -0
  345. package/src/data/tables/vendors.json.gz +0 -0
  346. package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
  347. package/src/data/tables/xp.json.gz +0 -0
  348. package/src/data/tables/zoneWeather.json.gz +0 -0
  349. package/src/data/tables/zones.json.gz +0 -0
  350. package/src/data/world-data.ts +56 -0
  351. package/src/data/zone-music-sets.json +2751 -0
  352. package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
  353. package/src/domain/audioQuality.mjs +145 -0
  354. package/src/domain/bg/ab.ts +433 -0
  355. package/src/domain/bg/arenaComps.ts +644 -0
  356. package/src/domain/bg/arenaLab.ts +695 -0
  357. package/src/domain/bg/arenaPace.ts +31 -0
  358. package/src/domain/bg/arenaRating.ts +110 -0
  359. package/src/domain/bg/av.ts +758 -0
  360. package/src/domain/bg/avEnemyPush.ts +219 -0
  361. package/src/domain/bg/avField.ts +283 -0
  362. package/src/domain/bg/avInstanceNodes.ts +197 -0
  363. package/src/domain/bg/avInstanceScore.ts +123 -0
  364. package/src/domain/bg/avQuestItems.ts +55 -0
  365. package/src/domain/bg/avQuests.ts +210 -0
  366. package/src/domain/bg/avSession.ts +196 -0
  367. package/src/domain/bg/bgConsumes.ts +269 -0
  368. package/src/domain/bg/bgPrebuff.ts +153 -0
  369. package/src/domain/bg/bgRest.ts +91 -0
  370. package/src/domain/bg/bgRoster.ts +305 -0
  371. package/src/domain/bg/bgTier.ts +61 -0
  372. package/src/domain/bg/bgWorld.ts +862 -0
  373. package/src/domain/bg/match.ts +215 -0
  374. package/src/domain/bg/strategies.ts +552 -0
  375. package/src/domain/bg/types.ts +291 -0
  376. package/src/domain/bg/wsg.ts +264 -0
  377. package/src/domain/bots/actionProviderSpec.ts +38 -0
  378. package/src/domain/bots/autoConsumables.ts +285 -0
  379. package/src/domain/bots/betweenPullRest.ts +239 -0
  380. package/src/domain/bots/botGear.ts +248 -0
  381. package/src/domain/bots/botInventory.ts +486 -0
  382. package/src/domain/bots/botPet.ts +535 -0
  383. package/src/domain/bots/botPool.ts +291 -0
  384. package/src/domain/bots/botProfessions.ts +334 -0
  385. package/src/domain/bots/companionActionBar.ts +209 -0
  386. package/src/domain/bots/companionHireCost.ts +236 -0
  387. package/src/domain/bots/companionMissions.ts +582 -0
  388. package/src/domain/bots/companionPrep.ts +254 -0
  389. package/src/domain/bots/companionQuests.ts +270 -0
  390. package/src/domain/bots/companionRep.ts +75 -0
  391. package/src/domain/bots/companionRotation.ts +708 -0
  392. package/src/domain/bots/companionXp.ts +66 -0
  393. package/src/domain/bots/consumableShare.ts +811 -0
  394. package/src/domain/bots/dpsMate.ts +1072 -0
  395. package/src/domain/bots/groupCompReport.ts +132 -0
  396. package/src/domain/bots/healthstoneSupply.ts +198 -0
  397. package/src/domain/bots/outfitter.ts +1056 -0
  398. package/src/domain/bots/paladinPrePull.ts +231 -0
  399. package/src/domain/bots/partyRole.ts +40 -0
  400. package/src/domain/bots/playerbotEquipCache.ts +412 -0
  401. package/src/domain/bots/playerbotItemEligibility.ts +60 -0
  402. package/src/domain/bots/playerbotStatWeight.ts +853 -0
  403. package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
  404. package/src/domain/bots/prePullBuffs.ts +219 -0
  405. package/src/domain/bots/prePullStealth.ts +82 -0
  406. package/src/domain/bots/runSupply.ts +251 -0
  407. package/src/domain/bots/runSupplyPrefs.ts +28 -0
  408. package/src/domain/bots/sendTradeGoods.ts +394 -0
  409. package/src/domain/bots/soulShardCap.ts +35 -0
  410. package/src/domain/bots/squad.ts +842 -0
  411. package/src/domain/bots/squadRun.ts +81 -0
  412. package/src/domain/character/actionbar.ts +346 -0
  413. package/src/domain/character/appearance.ts +165 -0
  414. package/src/domain/character/buildCombatant.ts +1726 -0
  415. package/src/domain/character/character.ts +356 -0
  416. package/src/domain/character/characterName.ts +43 -0
  417. package/src/domain/character/characterRatings.ts +424 -0
  418. package/src/domain/character/characterSpells.ts +282 -0
  419. package/src/domain/character/characterStats.ts +1559 -0
  420. package/src/domain/character/characterTalents.ts +398 -0
  421. package/src/domain/character/combatSkills.ts +994 -0
  422. package/src/domain/character/displayForm.ts +72 -0
  423. package/src/domain/character/formTalentAuras.ts +171 -0
  424. package/src/domain/character/forms.ts +499 -0
  425. package/src/domain/character/races.ts +40 -0
  426. package/src/domain/character/resurrectionSickness.ts +49 -0
  427. package/src/domain/character/spellbook.ts +169 -0
  428. package/src/domain/character/stanceBar.ts +354 -0
  429. package/src/domain/character/stancePrereq.ts +70 -0
  430. package/src/domain/character/talentBuilds.ts +63 -0
  431. package/src/domain/character/talentImport.ts +130 -0
  432. package/src/domain/character/talentLink.ts +123 -0
  433. package/src/domain/character/talents.ts +201 -0
  434. package/src/domain/core/conditionSnapshot.ts +92 -0
  435. package/src/domain/core/hover.ts +14 -0
  436. package/src/domain/core/ids.ts +58 -0
  437. package/src/domain/core/internalNameTags.ts +5 -0
  438. package/src/domain/core/runtimeDataPatches.ts +357 -0
  439. package/src/domain/creature/aiTargeting.ts +588 -0
  440. package/src/domain/creature/combatCondition.ts +157 -0
  441. package/src/domain/creature/creatureAggro.ts +804 -0
  442. package/src/domain/creature/creatureAi.ts +206 -0
  443. package/src/domain/creature/creatureAiConstants.ts +661 -0
  444. package/src/domain/creature/creatureCastList.ts +1007 -0
  445. package/src/domain/creature/creatureEventAi.ts +1409 -0
  446. package/src/domain/creature/creatureGroups.ts +144 -0
  447. package/src/domain/creature/creatureLinking.ts +333 -0
  448. package/src/domain/creature/creatureScaling.ts +320 -0
  449. package/src/domain/creature/creatureTrigger.ts +53 -0
  450. package/src/domain/creature/creatureWander.ts +74 -0
  451. package/src/domain/creature/eventAiTexts.ts +145 -0
  452. package/src/domain/creature/faction.ts +287 -0
  453. package/src/domain/creature/forcedReaction.ts +48 -0
  454. package/src/domain/creature/outdoorHuntable.ts +74 -0
  455. package/src/domain/creature/patrolPacks.ts +210 -0
  456. package/src/domain/creature/reputation.ts +967 -0
  457. package/src/domain/creature/unitFlags.ts +74 -0
  458. package/src/domain/creature/worldBosses.ts +393 -0
  459. package/src/domain/dungeonMusic.mjs +48 -0
  460. package/src/domain/economy/auction.ts +282 -0
  461. package/src/domain/economy/auctionBot.ts +1060 -0
  462. package/src/domain/economy/honorPrice.ts +100 -0
  463. package/src/domain/economy/mail.ts +958 -0
  464. package/src/domain/economy/money.ts +42 -0
  465. package/src/domain/economy/syntheticClassTrainers.ts +62 -0
  466. package/src/domain/economy/trading.ts +296 -0
  467. package/src/domain/economy/vendorSellAll.ts +252 -0
  468. package/src/domain/economy/vendorStock.ts +146 -0
  469. package/src/domain/items/ammo.ts +817 -0
  470. package/src/domain/items/bank.ts +162 -0
  471. package/src/domain/items/consumableFamily.ts +205 -0
  472. package/src/domain/items/craftUpgrades.ts +83 -0
  473. package/src/domain/items/createItem.ts +93 -0
  474. package/src/domain/items/durability.ts +581 -0
  475. package/src/domain/items/equipment.ts +441 -0
  476. package/src/domain/items/equipmentHelper.ts +767 -0
  477. package/src/domain/items/inventory.ts +561 -0
  478. package/src/domain/items/itemBonding.ts +93 -0
  479. package/src/domain/items/itemContainer.ts +245 -0
  480. package/src/domain/items/itemDisplayName.ts +33 -0
  481. package/src/domain/items/itemInstance.ts +181 -0
  482. package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
  483. package/src/domain/items/itemRandomProps.ts +77 -0
  484. package/src/domain/items/itemRestrictions.ts +329 -0
  485. package/src/domain/items/itemTeaches.ts +82 -0
  486. package/src/domain/items/itemUseCooldown.ts +52 -0
  487. package/src/domain/items/itemUseTarget.ts +90 -0
  488. package/src/domain/items/junkCategories.ts +174 -0
  489. package/src/domain/items/junkFilter.ts +368 -0
  490. package/src/domain/items/keyring.ts +131 -0
  491. package/src/domain/items/loot.ts +221 -0
  492. package/src/domain/items/mounts.ts +190 -0
  493. package/src/domain/items/onUsePayload.ts +102 -0
  494. package/src/domain/items/pendingLoot.ts +107 -0
  495. package/src/domain/items/relic.ts +105 -0
  496. package/src/domain/items/rocketBoots.ts +36 -0
  497. package/src/domain/items/sortContainer.ts +139 -0
  498. package/src/domain/items/spareContainers.ts +71 -0
  499. package/src/domain/items/spellReagentIndex.ts +131 -0
  500. package/src/domain/items/staleConsumables.ts +66 -0
  501. package/src/domain/items/weaponSpender.ts +110 -0
  502. package/src/domain/listDungeonIds.mjs +28 -0
  503. package/src/domain/macro/compose.ts +239 -0
  504. package/src/domain/macro/conditions.ts +260 -0
  505. package/src/domain/macro/creatureTypes.ts +40 -0
  506. package/src/domain/macro/describe.ts +169 -0
  507. package/src/domain/macro/icon.ts +60 -0
  508. package/src/domain/macro/index.ts +20 -0
  509. package/src/domain/macro/normalize.ts +112 -0
  510. package/src/domain/macro/parse.ts +316 -0
  511. package/src/domain/macro/plan.ts +288 -0
  512. package/src/domain/macro/rotation.ts +590 -0
  513. package/src/domain/macro/rotationEnv.ts +173 -0
  514. package/src/domain/macro/slots.ts +101 -0
  515. package/src/domain/macro/snapshot.ts +114 -0
  516. package/src/domain/macro/templates.ts +446 -0
  517. package/src/domain/macro/types.ts +70 -0
  518. package/src/domain/macro/units.ts +93 -0
  519. package/src/domain/macro/weaponTypes.ts +83 -0
  520. package/src/domain/nav/cityTeleports.ts +10 -0
  521. package/src/domain/nav/mounting.ts +113 -0
  522. package/src/domain/nav/nav.ts +43 -0
  523. package/src/domain/nav/navCollision.ts +606 -0
  524. package/src/domain/nav/navOutdoors.ts +91 -0
  525. package/src/domain/nav/navRegistry.ts +179 -0
  526. package/src/domain/nav/navRoomGraph.ts +302 -0
  527. package/src/domain/nav/navTypes.ts +43 -0
  528. package/src/domain/nav/navmesh.ts +1715 -0
  529. package/src/domain/nav/speed.ts +200 -0
  530. package/src/domain/nav/storey.ts +10 -0
  531. package/src/domain/nav/travel.ts +725 -0
  532. package/src/domain/nav/travelTypes.ts +75 -0
  533. package/src/domain/pet/pet.ts +1150 -0
  534. package/src/domain/pet/petActionBar.ts +180 -0
  535. package/src/domain/pet/petSpellbook.ts +39 -0
  536. package/src/domain/pet/petStable.ts +81 -0
  537. package/src/domain/professions/autoDisenchant.ts +236 -0
  538. package/src/domain/professions/characterEnchants.ts +176 -0
  539. package/src/domain/professions/craftCooldown.ts +52 -0
  540. package/src/domain/professions/enchantApply.ts +62 -0
  541. package/src/domain/professions/enchantTargets.ts +114 -0
  542. package/src/domain/professions/enchanting.ts +236 -0
  543. package/src/domain/professions/gatherFilter.ts +149 -0
  544. package/src/domain/professions/gearEnchant.ts +137 -0
  545. package/src/domain/professions/heldTools.ts +29 -0
  546. package/src/domain/professions/learnAllRecipes.ts +146 -0
  547. package/src/domain/professions/miningHarvest.ts +69 -0
  548. package/src/domain/professions/partyDisenchant.ts +294 -0
  549. package/src/domain/professions/partyWork.ts +83 -0
  550. package/src/domain/professions/pickpocket.ts +172 -0
  551. package/src/domain/professions/poisons.ts +240 -0
  552. package/src/domain/professions/professions.ts +677 -0
  553. package/src/domain/professions/rareNodes.ts +45 -0
  554. package/src/domain/professions/skinLoot.ts +27 -0
  555. package/src/domain/professions/vendorReagents.ts +152 -0
  556. package/src/domain/professions/weaponImbueHand.ts +171 -0
  557. package/src/domain/questFarmFilter.mjs +42 -0
  558. package/src/domain/quests/doQuest.ts +1204 -0
  559. package/src/domain/quests/gossip.ts +308 -0
  560. package/src/domain/quests/gossipTalk.ts +298 -0
  561. package/src/domain/quests/interpreter/canComplete.ts +150 -0
  562. package/src/domain/quests/interpreter/claim.ts +137 -0
  563. package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
  564. package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
  565. package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
  566. package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
  567. package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
  568. package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
  569. package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
  570. package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
  571. package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
  572. package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
  573. package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
  574. package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
  575. package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
  576. package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
  577. package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
  578. package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
  579. package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
  580. package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
  581. package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
  582. package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
  583. package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
  584. package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
  585. package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
  586. package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
  587. package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
  588. package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
  589. package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
  590. package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
  591. package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
  592. package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
  593. package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
  594. package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
  595. package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
  596. package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
  597. package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
  598. package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
  599. package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
  600. package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
  601. package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
  602. package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
  603. package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
  604. package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
  605. package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
  606. package/src/domain/quests/interpreter/diff.ts +349 -0
  607. package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
  608. package/src/domain/quests/interpreter/flags.ts +101 -0
  609. package/src/domain/quests/interpreter/index.ts +113 -0
  610. package/src/domain/quests/interpreter/live.ts +178 -0
  611. package/src/domain/quests/interpreter/types.ts +81 -0
  612. package/src/domain/quests/interpreter/updaters.ts +412 -0
  613. package/src/domain/quests/questCorpseUse.ts +155 -0
  614. package/src/domain/quests/questDialog.ts +43 -0
  615. package/src/domain/quests/questFight.ts +34 -0
  616. package/src/domain/quests/questObjectiveLabel.ts +39 -0
  617. package/src/domain/quests/questRewardChoice.ts +85 -0
  618. package/src/domain/quests/questScriptCredit.ts +26 -0
  619. package/src/domain/quests/questScriptItemUse.ts +74 -0
  620. package/src/domain/quests/questTameRods.ts +79 -0
  621. package/src/domain/quests/questlog.ts +1545 -0
  622. package/src/domain/quests/talkDeliver.ts +170 -0
  623. package/src/domain/raid/globalActionBar.ts +195 -0
  624. package/src/domain/raid/instanceRoster.ts +194 -0
  625. package/src/domain/raid/partySummon.ts +198 -0
  626. package/src/domain/raid/partyVault.ts +320 -0
  627. package/src/domain/raid/raidBossAbilities.ts +268 -0
  628. package/src/domain/raid/raidComp.ts +335 -0
  629. package/src/domain/raid/raidCustomRows.ts +453 -0
  630. package/src/domain/raid/raidEncounterGear.ts +298 -0
  631. package/src/domain/raid/raidEncounterTactics.ts +412 -0
  632. package/src/domain/raid/raidPlan.ts +509 -0
  633. package/src/domain/raid/raidPlanEdits.ts +98 -0
  634. package/src/domain/raid/raidPlanPacks.ts +480 -0
  635. package/src/domain/raid/raidRecovery.ts +183 -0
  636. package/src/domain/raid/raidRosterTemplate.ts +138 -0
  637. package/src/domain/rotation/auraSide.ts +68 -0
  638. package/src/domain/rotation/build.ts +3031 -0
  639. package/src/domain/rotation/classes/druid.ts +58 -0
  640. package/src/domain/rotation/classes/hooks.ts +59 -0
  641. package/src/domain/rotation/classes/hunter.ts +156 -0
  642. package/src/domain/rotation/classes/index.ts +104 -0
  643. package/src/domain/rotation/classes/mage.ts +99 -0
  644. package/src/domain/rotation/classes/paladin.ts +296 -0
  645. package/src/domain/rotation/classes/priest.ts +94 -0
  646. package/src/domain/rotation/classes/pullOpener.ts +92 -0
  647. package/src/domain/rotation/classes/rogue.ts +69 -0
  648. package/src/domain/rotation/classes/shaman.ts +29 -0
  649. package/src/domain/rotation/classes/supportSpec.ts +94 -0
  650. package/src/domain/rotation/classes/warlock.ts +81 -0
  651. package/src/domain/rotation/classes/warrior.ts +402 -0
  652. package/src/domain/rotation/classify.ts +1381 -0
  653. package/src/domain/rotation/condMetricPicker.ts +379 -0
  654. package/src/domain/rotation/consumables.ts +242 -0
  655. package/src/domain/rotation/evaluate.ts +1115 -0
  656. package/src/domain/rotation/finisherLadder.ts +145 -0
  657. package/src/domain/rotation/invent.ts +938 -0
  658. package/src/domain/rotation/killOrder.ts +30 -0
  659. package/src/domain/rotation/openerForm.ts +22 -0
  660. package/src/domain/rotation/paladinBuffs.ts +568 -0
  661. package/src/domain/rotation/prebuff.ts +283 -0
  662. package/src/domain/rotation/raidRowTuning.ts +34 -0
  663. package/src/domain/rotation/rotation.ts +11 -0
  664. package/src/domain/rotation/rotationProfiles.ts +180 -0
  665. package/src/domain/rotation/rotationSuggestions.ts +851 -0
  666. package/src/domain/rotation/ruleAfterChain.ts +49 -0
  667. package/src/domain/rotation/spec.ts +70 -0
  668. package/src/domain/rotation/spellPicker.ts +140 -0
  669. package/src/domain/rotation/stand.ts +143 -0
  670. package/src/domain/rotation/types.ts +718 -0
  671. package/src/domain/run/battlegroundRun.ts +111 -0
  672. package/src/domain/run/canEnterContext.ts +32 -0
  673. package/src/domain/run/death.ts +561 -0
  674. package/src/domain/run/deathRecovery.ts +289 -0
  675. package/src/domain/run/duel.ts +141 -0
  676. package/src/domain/run/dungeonRun.ts +344 -0
  677. package/src/domain/run/floorRest.ts +159 -0
  678. package/src/domain/run/honor.ts +557 -0
  679. package/src/domain/run/honorWeek.ts +180 -0
  680. package/src/domain/run/whenMap.ts +977 -0
  681. package/src/domain/scriptdev/arathiHighlands.ts +445 -0
  682. package/src/domain/scriptdev/ashenvale.ts +635 -0
  683. package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
  684. package/src/domain/scriptdev/azshara.ts +892 -0
  685. package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
  686. package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
  687. package/src/domain/scriptdev/blackrockSpire.ts +730 -0
  688. package/src/domain/scriptdev/blackwingLair.ts +521 -0
  689. package/src/domain/scriptdev/burningSteppes.ts +62 -0
  690. package/src/domain/scriptdev/classFilter.ts +43 -0
  691. package/src/domain/scriptdev/darkshore.ts +817 -0
  692. package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
  693. package/src/domain/scriptdev/deadmines.ts +331 -0
  694. package/src/domain/scriptdev/desolace.ts +1239 -0
  695. package/src/domain/scriptdev/direMaul.ts +859 -0
  696. package/src/domain/scriptdev/durotar.ts +532 -0
  697. package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
  698. package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
  699. package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
  700. package/src/domain/scriptdev/felwood.ts +1055 -0
  701. package/src/domain/scriptdev/feralas.ts +571 -0
  702. package/src/domain/scriptdev/feralasHelpers.ts +838 -0
  703. package/src/domain/scriptdev/gnomeregan.ts +466 -0
  704. package/src/domain/scriptdev/guards.ts +616 -0
  705. package/src/domain/scriptdev/hinterlands.ts +693 -0
  706. package/src/domain/scriptdev/host.ts +1134 -0
  707. package/src/domain/scriptdev/index.ts +123 -0
  708. package/src/domain/scriptdev/instanceRaids.ts +136 -0
  709. package/src/domain/scriptdev/itemScripts.ts +37 -0
  710. package/src/domain/scriptdev/lochModan.ts +283 -0
  711. package/src/domain/scriptdev/maraudon.ts +232 -0
  712. package/src/domain/scriptdev/moltenCore.ts +831 -0
  713. package/src/domain/scriptdev/moonglade.ts +659 -0
  714. package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
  715. package/src/domain/scriptdev/naxxramas.ts +577 -0
  716. package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
  717. package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
  718. package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
  719. package/src/domain/scriptdev/npcProfessions.ts +1025 -0
  720. package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
  721. package/src/domain/scriptdev/onyxiasLair.ts +313 -0
  722. package/src/domain/scriptdev/orgrimmar.ts +147 -0
  723. package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
  724. package/src/domain/scriptdev/razorfenDowns.ts +468 -0
  725. package/src/domain/scriptdev/razorfenKraul.ts +410 -0
  726. package/src/domain/scriptdev/redridgeMountains.ts +163 -0
  727. package/src/domain/scriptdev/registry.ts +945 -0
  728. package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
  729. package/src/domain/scriptdev/scarletMonastery.ts +713 -0
  730. package/src/domain/scriptdev/scholomance.ts +682 -0
  731. package/src/domain/scriptdev/searingGorge.ts +295 -0
  732. package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
  733. package/src/domain/scriptdev/silithus.ts +71 -0
  734. package/src/domain/scriptdev/silverpineForest.ts +662 -0
  735. package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
  736. package/src/domain/scriptdev/stormwindCity.ts +1192 -0
  737. package/src/domain/scriptdev/stranglethornVale.ts +402 -0
  738. package/src/domain/scriptdev/stratholme.ts +650 -0
  739. package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
  740. package/src/domain/scriptdev/sunkenTemple.ts +736 -0
  741. package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
  742. package/src/domain/scriptdev/tanaris.ts +391 -0
  743. package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
  744. package/src/domain/scriptdev/teldrassil.ts +143 -0
  745. package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
  746. package/src/domain/scriptdev/theBarrens.ts +709 -0
  747. package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
  748. package/src/domain/scriptdev/thousandNeedles.ts +426 -0
  749. package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
  750. package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
  751. package/src/domain/scriptdev/types.ts +1026 -0
  752. package/src/domain/scriptdev/uldaman.ts +437 -0
  753. package/src/domain/scriptdev/ungoroCrater.ts +549 -0
  754. package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
  755. package/src/domain/scriptdev/wailingCaverns.ts +700 -0
  756. package/src/domain/scriptdev/warEffort.ts +371 -0
  757. package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
  758. package/src/domain/scriptdev/westfall.ts +767 -0
  759. package/src/domain/scriptdev/wetlands.ts +660 -0
  760. package/src/domain/scriptdev/winterspring.ts +482 -0
  761. package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
  762. package/src/domain/scriptdev/worldBosses.ts +605 -0
  763. package/src/domain/scriptdev/zulfarrak.ts +478 -0
  764. package/src/domain/scriptdev/zulgurub.ts +1152 -0
  765. package/src/domain/sim/dummySim.ts +408 -0
  766. package/src/domain/sim/targetDummy.ts +29 -0
  767. package/src/domain/social/guild.ts +148 -0
  768. package/src/domain/spells/areaAuraMembership.ts +93 -0
  769. package/src/domain/spells/breakableStunCc.ts +166 -0
  770. package/src/domain/spells/cancelAura.ts +80 -0
  771. package/src/domain/spells/diminishing.ts +167 -0
  772. package/src/domain/spells/dispel.ts +149 -0
  773. package/src/domain/spells/dispelMechanic.ts +105 -0
  774. package/src/domain/spells/equipSpells.ts +247 -0
  775. package/src/domain/spells/learnOnTargets.ts +260 -0
  776. package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
  777. package/src/domain/spells/resurrectSpell.ts +124 -0
  778. package/src/domain/spells/spellPushback.ts +39 -0
  779. package/src/domain/spells/spellReflect.ts +43 -0
  780. package/src/domain/spells/stealth.ts +183 -0
  781. package/src/domain/spells/totem.ts +394 -0
  782. package/src/domain/spells/worldCast.ts +187 -0
  783. package/src/domain/world/areaTriggerLocks.ts +177 -0
  784. package/src/domain/world/dungeonMusic.ts +108 -0
  785. package/src/domain/world/gameEvents.ts +119 -0
  786. package/src/domain/world/gameObjects.ts +1030 -0
  787. package/src/domain/world/goEventFire.ts +234 -0
  788. package/src/domain/world/goMoTransport.ts +74 -0
  789. package/src/domain/world/goTransport.ts +81 -0
  790. package/src/domain/world/hazards.ts +459 -0
  791. package/src/domain/world/openLock.ts +398 -0
  792. package/src/domain/world/pools.ts +470 -0
  793. package/src/domain/world/restArea.ts +37 -0
  794. package/src/domain/world/weather.ts +201 -0
  795. package/src/domain/zoneAmbience.mjs +87 -0
  796. package/src/domain/zoneMusic.mjs +62 -0
  797. package/src/domain/zoneMusicQueue.mjs +7 -0
  798. package/src/engine/combat/activeSeal.ts +39 -0
  799. package/src/engine/combat/aiTargetResolve.ts +64 -0
  800. package/src/engine/combat/aoeCast.ts +289 -0
  801. package/src/engine/combat/applyConsumeAura.ts +74 -0
  802. package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
  803. package/src/engine/combat/applyDispelMechanic.ts +30 -0
  804. package/src/engine/combat/applyHealEffect.ts +301 -0
  805. package/src/engine/combat/applySchoolAbsorb.ts +114 -0
  806. package/src/engine/combat/applySpell.ts +3169 -0
  807. package/src/engine/combat/applySpellLate.ts +2026 -0
  808. package/src/engine/combat/applySpellLateBag.ts +144 -0
  809. package/src/engine/combat/areaAura.ts +283 -0
  810. package/src/engine/combat/attackTable.ts +508 -0
  811. package/src/engine/combat/battleRez.ts +87 -0
  812. package/src/engine/combat/castAction.ts +36 -0
  813. package/src/engine/combat/castTargetGates.ts +75 -0
  814. package/src/engine/combat/castableKit.ts +68 -0
  815. package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
  816. package/src/engine/combat/chainFan.ts +210 -0
  817. package/src/engine/combat/channel.ts +423 -0
  818. package/src/engine/combat/chaseCloseness.ts +95 -0
  819. package/src/engine/combat/cmangosCastGates.ts +129 -0
  820. package/src/engine/combat/combatFlag.ts +77 -0
  821. package/src/engine/combat/combatGeometry.ts +1329 -0
  822. package/src/engine/combat/combustion.ts +68 -0
  823. package/src/engine/combat/context.ts +730 -0
  824. package/src/engine/combat/createSession.ts +1165 -0
  825. package/src/engine/combat/creatureLeash.ts +38 -0
  826. package/src/engine/combat/crowdControl.ts +1259 -0
  827. package/src/engine/combat/dispelDuty.ts +54 -0
  828. package/src/engine/combat/dispelReflect.ts +609 -0
  829. package/src/engine/combat/displaceFloor.ts +113 -0
  830. package/src/engine/combat/duelBounds.ts +47 -0
  831. package/src/engine/combat/equippedItemGate.ts +297 -0
  832. package/src/engine/combat/evadeLifecycle.ts +63 -0
  833. package/src/engine/combat/eventAi.ts +2220 -0
  834. package/src/engine/combat/facing.ts +74 -0
  835. package/src/engine/combat/fearFlee.ts +137 -0
  836. package/src/engine/combat/fighterFactory.ts +1144 -0
  837. package/src/engine/combat/forceDespawnAction.ts +51 -0
  838. package/src/engine/combat/formulas.ts +807 -0
  839. package/src/engine/combat/friendlyFan.ts +55 -0
  840. package/src/engine/combat/groundPoolTick.ts +210 -0
  841. package/src/engine/combat/hazards.ts +114 -0
  842. package/src/engine/combat/healTargets.ts +226 -0
  843. package/src/engine/combat/heartbeatResist.ts +49 -0
  844. package/src/engine/combat/hostileItemUse.ts +75 -0
  845. package/src/engine/combat/interruptAuras.ts +66 -0
  846. package/src/engine/combat/itemRescue.ts +49 -0
  847. package/src/engine/combat/itemUse.ts +260 -0
  848. package/src/engine/combat/kitById.ts +23 -0
  849. package/src/engine/combat/knockBack.ts +201 -0
  850. package/src/engine/combat/leap.ts +89 -0
  851. package/src/engine/combat/mitigation.ts +587 -0
  852. package/src/engine/combat/modTaunt.ts +43 -0
  853. package/src/engine/combat/motionClaim.ts +268 -0
  854. package/src/engine/combat/motionGate.ts +150 -0
  855. package/src/engine/combat/motionGenerator.ts +27 -0
  856. package/src/engine/combat/navSight.ts +138 -0
  857. package/src/engine/combat/perfSink.ts +28 -0
  858. package/src/engine/combat/periodicDue.ts +55 -0
  859. package/src/engine/combat/petAuras.ts +86 -0
  860. package/src/engine/combat/pickAction.ts +3449 -0
  861. package/src/engine/combat/powerForm.ts +735 -0
  862. package/src/engine/combat/powerPools.ts +49 -0
  863. package/src/engine/combat/predicates.ts +538 -0
  864. package/src/engine/combat/procsDamage.ts +1823 -0
  865. package/src/engine/combat/reactiveGates.ts +135 -0
  866. package/src/engine/combat/roles.ts +389 -0
  867. package/src/engine/combat/rotationSubject.ts +78 -0
  868. package/src/engine/combat/ruleAfter.ts +106 -0
  869. package/src/engine/combat/seedDisplayAuras.ts +203 -0
  870. package/src/engine/combat/seedOocEffects.ts +317 -0
  871. package/src/engine/combat/seedSchoolImmunities.ts +45 -0
  872. package/src/engine/combat/session-types.ts +458 -0
  873. package/src/engine/combat/sessionApi.ts +1785 -0
  874. package/src/engine/combat/sessionCharge.ts +124 -0
  875. package/src/engine/combat/sessionChase.ts +869 -0
  876. package/src/engine/combat/sessionDeaths.ts +469 -0
  877. package/src/engine/combat/sessionFocus.ts +506 -0
  878. package/src/engine/combat/sessionFollow.ts +167 -0
  879. package/src/engine/combat/sessionGeometry.ts +188 -0
  880. package/src/engine/combat/sessionHome.ts +75 -0
  881. package/src/engine/combat/sessionInject.ts +719 -0
  882. package/src/engine/combat/sessionMechanicMove.ts +555 -0
  883. package/src/engine/combat/sessionMotion.ts +1553 -0
  884. package/src/engine/combat/sessionMotionKit.ts +247 -0
  885. package/src/engine/combat/sessionMoveIntent.ts +49 -0
  886. package/src/engine/combat/sessionMoveOrder.ts +200 -0
  887. package/src/engine/combat/sessionPathTo.ts +657 -0
  888. package/src/engine/combat/sessionPools.ts +688 -0
  889. package/src/engine/combat/sessionSteer.ts +144 -0
  890. package/src/engine/combat/sessionStepBack.ts +151 -0
  891. package/src/engine/combat/sessionStepWrap.ts +116 -0
  892. package/src/engine/combat/sessionView.ts +442 -0
  893. package/src/engine/combat/simEffects.ts +32 -0
  894. package/src/engine/combat/simFacade.ts +620 -0
  895. package/src/engine/combat/simPump.ts +264 -0
  896. package/src/engine/combat/simSnapshot.ts +165 -0
  897. package/src/engine/combat/simThreadPool.ts +35 -0
  898. package/src/engine/combat/skeramImages.ts +57 -0
  899. package/src/engine/combat/slowUpdate.ts +178 -0
  900. package/src/engine/combat/snapToFloor.ts +42 -0
  901. package/src/engine/combat/speedAura.ts +29 -0
  902. package/src/engine/combat/spellReagents.ts +71 -0
  903. package/src/engine/combat/stealthDetect.ts +93 -0
  904. package/src/engine/combat/stepBackMotion.ts +171 -0
  905. package/src/engine/combat/stepSession.ts +3102 -0
  906. package/src/engine/combat/summonCast.ts +243 -0
  907. package/src/engine/combat/thaddiusPolarity.ts +97 -0
  908. package/src/engine/combat/threat.ts +388 -0
  909. package/src/engine/combat/threatOps.ts +272 -0
  910. package/src/engine/combat/tickWorkerBody.ts +211 -0
  911. package/src/engine/combat/totemAuras.ts +122 -0
  912. package/src/engine/combat/triggerPayload.ts +42 -0
  913. package/src/engine/combat/triggeredCompanion.ts +63 -0
  914. package/src/engine/combat/types.ts +1897 -0
  915. package/src/engine/combat/useObjectTrap.ts +140 -0
  916. package/src/engine/combat/walkSurface.ts +54 -0
  917. package/src/engine/combat/weapon.ts +1248 -0
  918. package/src/engine/combat/worldFrame.ts +43 -0
  919. package/src/engine/combat.solo-golden.json +2242 -0
  920. package/src/engine/combat.ts +84 -0
  921. package/src/engine/core/detMath.ts +289 -0
  922. package/src/engine/core/events.ts +357 -0
  923. package/src/engine/core/rng.ts +36 -0
  924. package/src/engine/game/actionBars.ts +124 -0
  925. package/src/engine/game/activateObjectFromSpell.ts +320 -0
  926. package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
  927. package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
  928. package/src/engine/game/applyDoorFromDbScript.ts +388 -0
  929. package/src/engine/game/applyEscortFromDbScript.ts +290 -0
  930. package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
  931. package/src/engine/game/applyHoverFromDbScript.ts +110 -0
  932. package/src/engine/game/applyOocResurrect.ts +71 -0
  933. package/src/engine/game/applySpellDurability.ts +115 -0
  934. package/src/engine/game/applyTailFromDbScript.ts +478 -0
  935. package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
  936. package/src/engine/game/auctionMail.ts +269 -0
  937. package/src/engine/game/bagOverflow.ts +130 -0
  938. package/src/engine/game/bank.ts +110 -0
  939. package/src/engine/game/barAutofill.ts +26 -0
  940. package/src/engine/game/battleground.ts +369 -0
  941. package/src/engine/game/combatEnemySpec.ts +216 -0
  942. package/src/engine/game/combatObjectTraps.ts +167 -0
  943. package/src/engine/game/combatSeed.ts +320 -0
  944. package/src/engine/game/combatSession.ts +3241 -0
  945. package/src/engine/game/combatSessionClock.ts +62 -0
  946. package/src/engine/game/companionQuestActions.ts +242 -0
  947. package/src/engine/game/companionTraining.ts +40 -0
  948. package/src/engine/game/consumables.ts +624 -0
  949. package/src/engine/game/context.ts +53 -0
  950. package/src/engine/game/createHealthstone.ts +45 -0
  951. package/src/engine/game/deathFlow.ts +127 -0
  952. package/src/engine/game/devGrant.ts +117 -0
  953. package/src/engine/game/dynamicObject.ts +365 -0
  954. package/src/engine/game/enchantItem.ts +177 -0
  955. package/src/engine/game/equipmentHelper.ts +806 -0
  956. package/src/engine/game/factionState.ts +108 -0
  957. package/src/engine/game/garmentsOoc.ts +69 -0
  958. package/src/engine/game/globalActionBar.ts +179 -0
  959. package/src/engine/game/goInteractQuestCredit.ts +51 -0
  960. package/src/engine/game/goMoTransportUse.ts +61 -0
  961. package/src/engine/game/goTransportUse.ts +60 -0
  962. package/src/engine/game/healthstoneUpkeep.ts +59 -0
  963. package/src/engine/game/killSkin.ts +124 -0
  964. package/src/engine/game/learnFromItem.ts +118 -0
  965. package/src/engine/game/loadReconcile.ts +551 -0
  966. package/src/engine/game/loot.ts +294 -0
  967. package/src/engine/game/macros.ts +125 -0
  968. package/src/engine/game/mail.ts +293 -0
  969. package/src/engine/game/meetingStoneQueue.ts +75 -0
  970. package/src/engine/game/meetingStoneUse.ts +54 -0
  971. package/src/engine/game/newGameState.ts +363 -0
  972. package/src/engine/game/oocAuraInterrupt.ts +92 -0
  973. package/src/engine/game/oocCast.ts +241 -0
  974. package/src/engine/game/oocCastEffects.ts +803 -0
  975. package/src/engine/game/oocCastMethods.ts +1077 -0
  976. package/src/engine/game/openLockFromSpell.ts +174 -0
  977. package/src/engine/game/outdoorPvp.ts +187 -0
  978. package/src/engine/game/outfitter.ts +644 -0
  979. package/src/engine/game/paladinBoard.ts +393 -0
  980. package/src/engine/game/partyAuras.ts +121 -0
  981. package/src/engine/game/persistCombatAuras.ts +91 -0
  982. package/src/engine/game/pets.ts +459 -0
  983. package/src/engine/game/prePullHealthstones.ts +154 -0
  984. package/src/engine/game/professions.ts +2227 -0
  985. package/src/engine/game/pruneStaleRuntime.ts +39 -0
  986. package/src/engine/game/questFightCredit.ts +36 -0
  987. package/src/engine/game/questItemOnCorpse.ts +166 -0
  988. package/src/engine/game/questItemOnCreature.ts +103 -0
  989. package/src/engine/game/questLog.ts +879 -0
  990. package/src/engine/game/questSpellComplete.ts +21 -0
  991. package/src/engine/game/questTurnIn.ts +598 -0
  992. package/src/engine/game/raidParty.ts +32 -0
  993. package/src/engine/game/reagentBuyIn.ts +39 -0
  994. package/src/engine/game/regenRest.ts +186 -0
  995. package/src/engine/game/rotation.ts +425 -0
  996. package/src/engine/game/runFullDungeon.ts +611 -0
  997. package/src/engine/game/runSupply.ts +80 -0
  998. package/src/engine/game/sanitizeDriftedItems.ts +135 -0
  999. package/src/engine/game/scriptDevGoUse.ts +397 -0
  1000. package/src/engine/game/scriptDevInnkeeper.ts +150 -0
  1001. package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
  1002. package/src/engine/game/sendEventFromSpell.ts +87 -0
  1003. package/src/engine/game/sortContainers.ts +85 -0
  1004. package/src/engine/game/spellReputation.ts +69 -0
  1005. package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
  1006. package/src/engine/game/squadDungeon.ts +4222 -0
  1007. package/src/engine/game/squadQuestShare.ts +260 -0
  1008. package/src/engine/game/summonObjectSlot.ts +69 -0
  1009. package/src/engine/game/summonObjectWild.ts +73 -0
  1010. package/src/engine/game/summoningRitualUse.ts +141 -0
  1011. package/src/engine/game/talents.ts +356 -0
  1012. package/src/engine/game/tamingRodUse.ts +66 -0
  1013. package/src/engine/game/tempSpawnCreature.ts +136 -0
  1014. package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
  1015. package/src/engine/game/tickTimedQuests.ts +28 -0
  1016. package/src/engine/game/trade.ts +586 -0
  1017. package/src/engine/game/travel.ts +1155 -0
  1018. package/src/engine/game/types.ts +1855 -0
  1019. package/src/engine/game/vendorOffers.ts +244 -0
  1020. package/src/engine/game/weaponImbueItem.ts +281 -0
  1021. package/src/engine/game/worldSession.ts +183 -0
  1022. package/src/engine/game/worldState.ts +166 -0
  1023. package/src/engine/game.ts +968 -0
  1024. package/src/engine/spells/GAP.md +67 -0
  1025. package/src/engine/spells/absorbs.ts +376 -0
  1026. package/src/engine/spells/addTargetTrigger.ts +53 -0
  1027. package/src/engine/spells/auraPerSecondCost.ts +50 -0
  1028. package/src/engine/spells/auraStacking.ts +497 -0
  1029. package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
  1030. package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
  1031. package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
  1032. package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
  1033. package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
  1034. package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
  1035. package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
  1036. package/src/engine/spells/cmangos-special-cases.ts +1570 -0
  1037. package/src/engine/spells/conditions.ts +718 -0
  1038. package/src/engine/spells/effects.ts +203 -0
  1039. package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
  1040. package/src/engine/spells/immunity.ts +942 -0
  1041. package/src/engine/spells/intentEffects.ts +351 -0
  1042. package/src/engine/spells/interpreter/GAPS.md +21 -0
  1043. package/src/engine/spells/interpreter/amount.ts +109 -0
  1044. package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
  1045. package/src/engine/spells/interpreter/diff.ts +246 -0
  1046. package/src/engine/spells/interpreter/duration.ts +90 -0
  1047. package/src/engine/spells/interpreter/form-attrs.json +1 -0
  1048. package/src/engine/spells/interpreter/form-attrs.ts +95 -0
  1049. package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
  1050. package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
  1051. package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
  1052. package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
  1053. package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
  1054. package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
  1055. package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
  1056. package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
  1057. package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
  1058. package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
  1059. package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
  1060. package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
  1061. package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
  1062. package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
  1063. package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
  1064. package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
  1065. package/src/engine/spells/interpreter/handlers.ts +9 -0
  1066. package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
  1067. package/src/engine/spells/interpreter/index.ts +525 -0
  1068. package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
  1069. package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
  1070. package/src/engine/spells/interpreter/mage-portals.ts +37 -0
  1071. package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
  1072. package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
  1073. package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
  1074. package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
  1075. package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
  1076. package/src/engine/spells/interpreter/opcodes.ts +789 -0
  1077. package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
  1078. package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
  1079. package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
  1080. package/src/engine/spells/interpreter/proc.ts +443 -0
  1081. package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
  1082. package/src/engine/spells/interpreter/registry/index.ts +216 -0
  1083. package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
  1084. package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
  1085. package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
  1086. package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
  1087. package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
  1088. package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
  1089. package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
  1090. package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
  1091. package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
  1092. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
  1093. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
  1094. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
  1095. package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
  1096. package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
  1097. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
  1098. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
  1099. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
  1100. package/src/engine/spells/interpreter/registry/types.ts +48 -0
  1101. package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
  1102. package/src/engine/spells/interpreter/targeting.ts +90 -0
  1103. package/src/engine/spells/interpreter/types-intent.ts +1501 -0
  1104. package/src/engine/spells/interpreter/types.ts +419 -0
  1105. package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
  1106. package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
  1107. package/src/engine/spells/interrupt.ts +217 -0
  1108. package/src/engine/spells/meleeAttackReset.ts +60 -0
  1109. package/src/engine/spells/oocTriggerSpell.ts +49 -0
  1110. package/src/engine/spells/overrideClassScripts.ts +319 -0
  1111. package/src/engine/spells/parryHaste.ts +20 -0
  1112. package/src/engine/spells/procs.ts +300 -0
  1113. package/src/engine/spells/recovery.ts +203 -0
  1114. package/src/engine/spells/scriptTargetDest.ts +76 -0
  1115. package/src/engine/spells/scriptTargets.ts +85 -0
  1116. package/src/engine/spells/singleTargetAura.ts +82 -0
  1117. package/src/engine/spells/specialCasePayloads.ts +57 -0
  1118. package/src/engine/spells/spellAttributes.ts +249 -0
  1119. package/src/engine/spells/spellBonus.ts +143 -0
  1120. package/src/engine/spells/spellModIntents.ts +419 -0
  1121. package/src/engine/spells/spellMods.ts +283 -0
  1122. package/src/engine/spells/spellRadius.ts +15 -0
  1123. package/src/engine/spells/trapObjects.ts +26 -0
  1124. package/src/json.d.ts +7 -0
  1125. package/src/persistence/memoryRepository.ts +23 -0
  1126. package/src/persistence/saveBackups.ts +162 -0
  1127. package/src/persistence/saveFile.ts +68 -0
  1128. package/src/persistence/saveRepository.ts +11 -0
  1129. package/src/persistence/saveShape.ts +668 -0
  1130. package/src/progression/leveling.ts +89 -0
  1131. package/src/progression/rest.ts +1434 -0
  1132. package/src/progression/training.ts +226 -0
  1133. package/src/progression/xpGain.ts +369 -0
  1134. package/src/quests/quests.ts +1580 -0
  1135. package/src/world/aoePull.ts +198 -0
  1136. package/src/world/areaTableDbc.ts +39 -0
  1137. package/src/world/areaTableMapIdPairs.ts +141 -0
  1138. package/src/world/bakeSlug.ts +43 -0
  1139. package/src/world/continuousDungeon.ts +1250 -0
  1140. package/src/world/dungeonBakeProjection.ts +190 -0
  1141. package/src/world/dungeonMapDensity.ts +342 -0
  1142. package/src/world/dungeonMapProjection.ts +135 -0
  1143. package/src/world/dungeonNav.ts +904 -0
  1144. package/src/world/dungeonNpcSim.ts +147 -0
  1145. package/src/world/dungeonObjectives.ts +234 -0
  1146. package/src/world/dungeonPreset.ts +35 -0
  1147. package/src/world/dungeonRoute.ts +311 -0
  1148. package/src/world/dungeonRouteGeometry.ts +732 -0
  1149. package/src/world/dungeonRouteOrder.ts +1037 -0
  1150. package/src/world/dungeonWingRooms.ts +426 -0
  1151. package/src/world/escort.ts +296 -0
  1152. package/src/world/goPoolRoll.ts +75 -0
  1153. package/src/world/instanceObjects.ts +785 -0
  1154. package/src/world/instances.ts +1572 -0
  1155. package/src/world/meetingStones.ts +56 -0
  1156. package/src/world/navmeshFloors.ts +145 -0
  1157. package/src/world/nearGrid.ts +167 -0
  1158. package/src/world/packBudget.ts +613 -0
  1159. package/src/world/rareRoll.ts +335 -0
  1160. package/src/world/routeAuthoring.ts +132 -0
  1161. package/src/world/routeEdit.ts +209 -0
  1162. package/src/world/world.ts +812 -0
  1163. package/src/world/zoneHazards.ts +47 -0
@@ -0,0 +1,807 @@
1
+ // Pure numeric helpers and tunable constants for combat and progression. Callers pass roll values in,
2
+ // so everything stays testable. The armor and partial-resist tables live in mitigation.ts.
3
+
4
+ import {
5
+ effectiveMagicResistancePercent,
6
+ spellMissChancePercent,
7
+ SPELL_DAMAGE_CLASS,
8
+ } from './mitigation.ts';
9
+
10
+ // Re-export armor mitigation so existing `from './formulas'` imports keep working.
11
+ export { armorMitigation } from './mitigation.ts';
12
+
13
+ // Attack table (skill-based CMaNGOS port) — see attackTable.ts for gap notes + citations.
14
+ export {
15
+ skillMaxForLevel,
16
+ canGlanceInCombat,
17
+ canCrushInCombat,
18
+ calculateEffectiveMissChance,
19
+ calculateEffectiveDodgeChance,
20
+ calculateEffectiveParryChance,
21
+ calculateEffectiveBlockChance,
22
+ calculateEffectiveCrushChance,
23
+ calculateEffectiveDazeChance,
24
+ calculateAbilityDeflectChance,
25
+ SPELL_RANGE_IDX,
26
+ calculateEffectiveGlanceChance,
27
+ calculateEffectiveCritChance,
28
+ glanceDamageMultiplier,
29
+ glanceDamageMultiplierFromContext,
30
+ meleeAttackTable,
31
+ pickMeleeOutcome,
32
+ pickMeleeSpellLand,
33
+ remapRangedWhiteOutcome,
34
+ meleeOutcomeMultiplier,
35
+ resolveMeleeAttack,
36
+ type AttackResult,
37
+ type AttackTypeKind,
38
+ type AttackContext,
39
+ type AttackTable,
40
+ } from './attackTable.ts';
41
+
42
+ export const TUNING = {
43
+ tickMs: 100,
44
+ // A runaway safety bound only, not a product time limit. Real pulls run longer than a couple of
45
+ // minutes, and ending those as a timeout made the resolver treat them as a player death.
46
+ maxMs: 30 * 60 * 1000, // 30 min combat-sim time
47
+ gcdMs: 1500,
48
+
49
+ meleeHitChance: 0.95, // vs an even-level target (miss folds in dodge/parry for MVP)
50
+ spellHitChance: 0.96,
51
+ baseCritChance: 0.05,
52
+ meleeCritMult: 2,
53
+ spellCritMult: 1.5,
54
+
55
+ // Haste floor (cast times floor separately or not at all).
56
+ // Melee crit/dodge from agi: use meleeCritFromAgility / dodgeFromAgility (class curves), not flat rates.
57
+ minGcdMs: 1000,
58
+
59
+ // Energy regen (CMaNGOS Player.cpp POWER_ENERGY): addvalue = uint32(diff/100) * Rate.Energy
60
+ // with REGEN_TIME_FULL = 2000 ms → 20 energy / 2 s at rate 1.0 → 10 energy/sec in and out of combat.
61
+ energyPerSec: 10,
62
+ /** Combo point cap (Unit.cpp AddComboPoints clamps to 5). */
63
+ comboPointsMax: 5,
64
+
65
+ // Sitting / not standing: health (and OOC paths that still apply it) ×1.5. source: Player.cpp
66
+ // RegenerateHealth — `if (!IsStandState()) addvalue *= 1.5`
67
+ sitRegenMult: 1.5,
68
+
69
+ // Legacy fallback only when pet_levelstats is absent (fixtures / pre-3A bake). Wave 3A: real HP from
70
+ // pet_levelstats via petInitStats.
71
+ petHealthFrac: 0.7,
72
+ mendPetThreshold: 0.6, // the AI/rotation casts Mend Pet below this pet-health fraction
73
+ /** Legacy mana scale when pet_levelstats is absent. Wave 3A: summon mana from table row. */
74
+ petManaPerLevel: 15,
75
+ // Hunter pet focus: 24 per 4 s quantum at the default rate, so 6 a second to a max of 100. Used in
76
+ // combat and out of it. Cite: Pet.cpp:698–707; Creature.cpp:836–837.
77
+ focusPer4Sec: 24,
78
+ focusRegenPeriodMs: 4000,
79
+ hpPerStamina: 10, // combat HP granted per point of a `stamina` buff (Imp's Blood Pact); WoW's 1:10
80
+
81
+ // ---- crowd control / resistances (all tunable) ----
82
+ drSteps: [1, 0.5, 0.25, 0], // diminishing returns per category: full, ½, ¼, then immune
83
+ drResetMs: 15_000, // a DR category resets this long after its last application wears off
84
+ // Pause between flee legs. Cite: RandomMovementGenerator.cpp:234 FleeingMovementGenerator
85
+ // → AbstractRandomMovementGenerator(…, 500, 1500); Update ~99–108 urand(min,max).
86
+ fearFleeRepickMinMs: 500,
87
+ fearFleeRepickMaxMs: 1_500,
88
+ resistCcFactor: 0.5, // fraction of average magic mitigation that becomes CC full-resist chance
89
+ } as const;
90
+
91
+ // Quarantined constants — NOT used by combat. Rage on swing and on hit are now the reward function,
92
+ // rage decay is its own, and the threat shares are the manager's sticky victim. Do not re-export.
93
+ export const DEPRECATED_TUNING = {
94
+ rageOnSwing: 8,
95
+ rageOnTakeHit: 4,
96
+ rageDecayPerSec: 2,
97
+ petThreatShare: 0.35,
98
+ stoneclawThreatShare: 0.65,
99
+ } as const;
100
+
101
+ // The chance one damaging hit shakes a FEAR or a ROOT off early, measured against a cap built from
102
+ // the VICTIM's level. Both auras route to the SAME handler, and DoT ticks do roll it.
103
+ export function ccDamageBreakChance(victimLevel: number, damage: number): number {
104
+ if (!(damage > 0)) return 0;
105
+ const lvl = victimLevel | 0;
106
+ const maxDmg = lvl > 8 ? 25 * lvl - 150 : 50;
107
+ return Math.min(1, damage / maxDmg);
108
+ }
109
+
110
+ /** @deprecated Name predates roots sharing the handler — use {@link ccDamageBreakChance}. */
111
+ export const fearBreakChance = ccDamageBreakChance;
112
+
113
+ /** 5-second rule window after a mana spend (Unit.h SetLastManaUse / m_lastManaUseTimer = 5000). */
114
+ export const LAST_MANA_USE_MS = 5000;
115
+
116
+ // Power / regen (CMaNGOS Classic 1.12) — docs/cmangos_mapping/combat/rage.md,
117
+ // docs/cmangos_mapping/stats/regen.md, docs/cmangos_mapping/pets/mechanics.md
118
+
119
+ // Rage conversion coefficient at `level` (denominator in RewardRage). source: Player.cpp RewardRage
120
+ // ~2270–2274; docs/cmangos_mapping/combat/rage.md
121
+ export function rageConversion(level: number): number {
122
+ const L = Math.max(1, level);
123
+ return (0.0091107836 * L * L) + (3.225598133 * L) + 4.2652911;
124
+ }
125
+
126
+ // Rage gained from damage dealt or taken, in UI units. There is NO weapon-speed hit factor and no
127
+ // halving in the classic core — that shape is community theorycraft CMaNGOS does not implement.
128
+ export function rewardRage(
129
+ damage: number,
130
+ level: number,
131
+ isAttacker: boolean,
132
+ rateIncome = 1,
133
+ /** Berserker Rage 18499: ×1.3 on *taken* rage only (Player.cpp:2284–2286). */
134
+ berserkerRage = false,
135
+ ): number {
136
+ if (damage <= 0 || level <= 0) return 0;
137
+ let addRage = damage / rageConversion(level) * (isAttacker ? 7.5 : 2.5);
138
+ if (!isAttacker && berserkerRage) addRage *= 1.3;
139
+ addRage *= rateIncome;
140
+ // Match C++ uint32(addRage * 10) then map internal → UI (/10).
141
+ return Math.floor(addRage * 10) / 10;
142
+ }
143
+
144
+ // UI rage lost over an interval while out of combat. At the default rate that is 2.5 rage per 2 s,
145
+ // about 1.25 a second. Cite: Player.cpp:2335–2340.
146
+ export function rageDecayAmount(diffMs: number, rateLoss = 1): number {
147
+ if (diffMs <= 0) return 0;
148
+ const internal = Math.floor(diffMs / 200) * 2.5 * rateLoss;
149
+ return internal / 10;
150
+ }
151
+
152
+ // Health per second from spirit, on the class OCT coefficients — a class-switched linear curve.
153
+ // Negative results are clamped by the callers. Cite: Unit.cpp OCTRegenHPPerSpirit ~11863.
154
+ export function octRegenHpPerSpirit(classId: number, spirit: number): number {
155
+ // Coefficients from Unit.cpp:Unit::OCTRegenHPPerSpirit switch (hardcoded, not invented).
156
+ const Spirit = spirit;
157
+ switch (classId) {
158
+ case 11: return Spirit * 0.11 + 1; // CLASS_DRUID
159
+ case 3: return Spirit * 0.43 - 5.5; // CLASS_HUNTER
160
+ case 8: return Spirit * 0.11 + 1; // CLASS_MAGE
161
+ case 2: return Spirit * 0.25; // CLASS_PALADIN
162
+ case 5: return Spirit * 0.15 + 1.4; // CLASS_PRIEST
163
+ case 4: return Spirit * 0.84 - 13; // CLASS_ROGUE
164
+ case 7: return Spirit * 0.28 - 3.6; // CLASS_SHAMAN
165
+ case 9: return Spirit * 0.12 + 1.5; // CLASS_WARLOCK
166
+ case 1: return Spirit * 1.26 - 22.6; // CLASS_WARRIOR
167
+ default: return 0;
168
+ }
169
+ }
170
+
171
+ // Mana per second from spirit, on the class OCT coefficients; a class with no mana pool returns 0.
172
+ // The C++ hardcodes these rather than reading a runtime DBC. Cite: Unit.cpp ~11886.
173
+ export function octRegenMpPerSpirit(classId: number, spirit: number): number {
174
+ // Coefficients from Unit.cpp:Unit::OCTRegenMPPerSpirit switch (hardcoded, not invented).
175
+ const Spirit = spirit;
176
+ let addvalue = 0;
177
+ switch (classId) {
178
+ case 11: // DRUID
179
+ case 3: // HUNTER
180
+ case 2: // PALADIN
181
+ case 9: // WARLOCK
182
+ addvalue = Spirit / 5 + 15;
183
+ break;
184
+ case 8: // MAGE
185
+ case 5: // PRIEST
186
+ addvalue = Spirit / 4 + 12.5;
187
+ break;
188
+ case 7: // SHAMAN
189
+ addvalue = Spirit / 5 + 17;
190
+ break;
191
+ default:
192
+ return 0; // warrior / rogue — no mana
193
+ }
194
+ // source: Unit.cpp:Unit::OCTRegenMPPerSpirit — "per tick which occurs every 2 seconds"
195
+ return addvalue / 2.0;
196
+ }
197
+
198
+ // UpdateManaRegen — the spirit OCT term, the mp5 aura and the five-second-rule interrupt percent,
199
+ // returned per second. The regen multiplier is the product of the percent auras, default 1.
200
+ export function updateManaRegen(
201
+ classId: number,
202
+ spirit: number,
203
+ mp5FromAuras = 0,
204
+ interruptPct = 0,
205
+ powerRegenMultiplier = 1,
206
+ ): { modManaRegen: number; modManaRegenInterrupt: number } {
207
+ let power_regen = octRegenMpPerSpirit(classId, spirit);
208
+ // Cite: StatSystem.cpp:551–552 power_regen *= GetTotalAuraMultiplierByMiscValue(110, POWER_MANA).
209
+ if (powerRegenMultiplier > 0 && powerRegenMultiplier !== 1) {
210
+ power_regen *= powerRegenMultiplier;
211
+ }
212
+ const power_regen_mp5 = mp5FromAuras / 5.0;
213
+ const pct = Math.min(100, Math.max(0, interruptPct));
214
+ return {
215
+ modManaRegen: power_regen_mp5 + power_regen,
216
+ modManaRegenInterrupt: power_regen_mp5 + power_regen * pct / 100.0,
217
+ };
218
+ }
219
+
220
+ // Product of (100+amount)/100 for SPELL_AURA_MOD_POWER_REGEN_PERCENT amounts. Cite: Unit.cpp:4611–4622
221
+ // GetTotalAuraMultiplierByMiscValue.
222
+ export function powerRegenPercentMultiplier(amounts: readonly number[]): number {
223
+ let mult = 1;
224
+ for (const a of amounts) {
225
+ if (!a) continue;
226
+ mult *= (100 + a) / 100;
227
+ }
228
+ return mult;
229
+ }
230
+
231
+ // Focus gained over `diffMs` for hunter pets (24 * Rate.Focus every 4s quantum). source:
232
+ // Creature.cpp:836–837; Pet.cpp RegenerateAll ~698–707
233
+ function focusRegenAmount(diffMs: number, rateFocus = 1): number {
234
+ if (diffMs <= 0) return 0;
235
+ const periods = Math.floor(diffMs / TUNING.focusRegenPeriodMs);
236
+ return periods * TUNING.focusPer4Sec * rateFocus;
237
+ }
238
+
239
+ // Combat mana a PET gains over an interval while not under the five-second rule. The max-mana
240
+ // fallback is gated on not being a pet, so an unresolvable OCT returns 0 rather than a made-up rate.
241
+ export function petCombatManaRegenAmount(
242
+ diffMs: number,
243
+ intellect: number,
244
+ spirit: number,
245
+ classId?: number | null,
246
+ rateMana = 1,
247
+ ): number {
248
+ if (diffMs <= 0 || intellect <= 0) return 0;
249
+ const periods = Math.floor(diffMs / TUNING.focusRegenPeriodMs);
250
+ if (periods <= 0) return 0;
251
+ // OCTRegenMPPerSpirit is class-switched (Unit.cpp:11886–11906). Pets use
252
+ // their creature UnitClass (or fallback from scaling / mana).
253
+ const oct = classId != null && classId > 0 ? octRegenMpPerSpirit(classId, spirit) : 0;
254
+ if (oct <= 0) return 0;
255
+ // Per 4s tick: sqrt(int) * OCT * rate / 5 * timerMultiplier(4)
256
+ const perPeriod = Math.sqrt(intellect) * oct * rateMana / 5 * 4;
257
+ return periods * perPeriod;
258
+ }
259
+
260
+ // OOC pet mana regen per second: maxValue/3.0 per Pet::RegenerateAll 4s quantum. Converted to a continuous
261
+ // per-second rate for `rest.ts` (same pattern as focus OOC). source: Creature.cpp:830; Pet.cpp:698–708
262
+ export function petOocManaRegenPerSec(maxMana: number): number {
263
+ if (maxMana <= 0) return 0;
264
+ return (maxMana / 3) / (TUNING.focusRegenPeriodMs / 1000);
265
+ }
266
+
267
+ // Out-of-combat health regen per second, preferring the class OCT curve when the class is known. The
268
+ // sitting multiplier is the caller's. Deprecated without a class — a generic fallback only.
269
+ export function healthRegenPerSec(spirit: number, level: number, classId?: number): number {
270
+ if (classId != null && classId > 0) {
271
+ return Math.max(0, octRegenHpPerSpirit(classId, spirit));
272
+ }
273
+ // Legacy generic (pre-OCT); pets without a class id still use this path.
274
+ return spirit * 0.12 + level * 0.2 + 0.5;
275
+ }
276
+
277
+ // Mana per second at FULL spirit, with no five-second rule. Deprecated and class-agnostic: prefer
278
+ // updateManaRegen, which takes the class, the mp5 and the interrupt percent.
279
+ function manaRegenPerSec(spirit: number, classId?: number, mp5 = 0): number {
280
+ if (classId != null && classId > 0) {
281
+ return updateManaRegen(classId, spirit, mp5, 0).modManaRegen;
282
+ }
283
+ return spirit * 0.18 + 1.5;
284
+ }
285
+
286
+ /** Linear interpolation between min and max by a [0,1) roll. */
287
+ export function rollBetween(min: number, max: number, roll01: number): number {
288
+ return min + (max - min) * roll01;
289
+ }
290
+
291
+ const clamp = (x: number, lo: number, hi: number): number => Math.max(lo, Math.min(hi, x));
292
+
293
+ // Attack table: see attackTable.ts (re-exported above).
294
+
295
+ // Apply shield block absorb to physical damage: the blocked amount is the block value capped at the
296
+ // damage, and what remains may be 0 on a full block. Cite: Unit.cpp MELEE_HIT_BLOCK ~2033.
297
+ export function applyShieldBlockAbsorb(damage: number, blockValue: number, blockValuePct: number = 0): number {
298
+ if (damage <= 0) return 0;
299
+ let bv = Math.max(0, blockValue | 0);
300
+ if (blockValuePct > 0) {
301
+ bv = (bv * (100 + blockValuePct)) / 100;
302
+ } else if (blockValuePct < 0) {
303
+ bv = (bv * Math.max(0, 100 + blockValuePct)) / 100;
304
+ }
305
+ const blocked = Math.min(bv, damage);
306
+ return Math.max(0, damage - blocked);
307
+ }
308
+
309
+ // Spell hit chance on the magic path — a 4% base miss plus the level gap. The `base` argument is kept
310
+ // for call-site compatibility; a custom value falls back to the old level-gap shape.
311
+ export function spellHitChance(atkLevel: number, defLevel: number, base = 0.96): number {
312
+ if (base !== 0.96) {
313
+ const gap = defLevel - atkLevel;
314
+ return clamp(base - 0.02 * Math.max(0, gap) - (gap >= 3 ? 0.01 : 0), 0.1, 1);
315
+ }
316
+ // Equal level: 4% miss → 0.96 hit. +3 vs NPC: 17% miss → 0.83 hit.
317
+ const missPct = spellMissChancePercent({ atkLevel, defLevel, victimPlayerControlled: false });
318
+ return clamp(1 - missPct / 100, 0.01, 1);
319
+ }
320
+
321
+ /** Spell crit. MAGIC/NONE skip level suppression; MELEE/RANGED (or omitted) keep 1%/level. Cite: Unit.cpp:3814–3823. */
322
+ export function spellCritChance(
323
+ baseCrit: number,
324
+ atkLevel: number,
325
+ defLevel: number,
326
+ dmgClass?: number,
327
+ ): number {
328
+ if (dmgClass === SPELL_DAMAGE_CLASS.MAGIC || dmgClass === SPELL_DAMAGE_CLASS.NONE) {
329
+ return clamp(baseCrit, 0, 1);
330
+ }
331
+ return clamp(baseCrit - 0.01 * Math.max(0, defLevel - atkLevel), 0, 1);
332
+ }
333
+
334
+ // Stamina -> bonus health. Classic: 1 health per point up to 20, then 10 per point. `baseHp`
335
+ // (player_classlevelstats) is "before the stamina bonus".
336
+ export function staminaToHealth(baseHp: number, sta: number): number {
337
+ const bonus = sta <= 20 ? sta : 20 + (sta - 20) * 10;
338
+ return Math.round(baseHp + bonus);
339
+ }
340
+
341
+ /** Intellect -> bonus mana. Classic: 1 mana per point up to 20, then 15 per point. */
342
+ export function intellectToMana(baseMana: number, intel: number): number {
343
+ const bonus = intel <= 20 ? intel : 20 + (intel - 20) * 15;
344
+ return Math.round(baseMana + bonus);
345
+ }
346
+
347
+ // Haste percent to the speed factor the timer scaler divides by. Positive haste shortens; NEGATIVE
348
+ // haste lengthens by that percent instead of the symmetric form, which is what the C++ does.
349
+ export function hasteFactor(haste: number): number {
350
+ if (!haste) return 1;
351
+ if (haste > 0) return 1 + haste / 100;
352
+ // Slow: time *= (100 + |haste|) / 100 → factor = 100 / (100 + |haste|).
353
+ // Cap |haste| at 99.99 so factor never reaches 0 (CMaNGOS −100 guard).
354
+ const slowPct = Math.min(-haste, 99.99);
355
+ return 100 / (100 + slowPct);
356
+ }
357
+
358
+ // The unarmed band and attack time a DISARM falls back to. Disarm does NOT stop the swing: the C++
359
+ // substitutes the base damage band and forces the base attack time. Off hand and ranged are exempt.
360
+ export const UNARMED_DMG_MIN = 1;
361
+ export const UNARMED_DMG_MAX = 2;
362
+ export const BASE_ATTACK_TIME_MS = 2000;
363
+
364
+ /** Same profile with the unarmed band and BASE_ATTACK_TIME. Generic so WeaponProfile survives. */
365
+ export function disarmedWeaponProfile<T extends {
366
+ dmgMin: number;
367
+ dmgMax: number;
368
+ speedMs: number;
369
+ }>(w: T): T {
370
+ return {
371
+ ...w,
372
+ dmgMin: UNARMED_DMG_MIN,
373
+ dmgMax: UNARMED_DMG_MAX,
374
+ speedMs: BASE_ATTACK_TIME_MS,
375
+ };
376
+ }
377
+
378
+ export function scaleTime(baseMs: number, haste: number, floorMs = 0): number {
379
+ if (baseMs <= 0) return 0;
380
+ const scaled = Math.round(baseMs / hasteFactor(haste));
381
+ return floorMs > 0 ? Math.max(floorMs, scaled) : scaled;
382
+ }
383
+
384
+ // ---- CMaNGOS Classic 1.12 stats pipeline (pure ports) ---------------------
385
+ // Cite: Player.cpp GetMeleeCritFromAgility / GetDodgeFromAgility; StatSystem.cpp UpdateAttackPower.
386
+
387
+ /** Linear class-rate interpolation used by crit/dodge from agi (lvl 1 ↔ 60 tables). */
388
+ function classRateAtLevel(valLevel1: number, valLevel60: number, level: number): number {
389
+ const lvl = Math.max(1, level);
390
+ return valLevel1 * (60.0 - lvl) / 59.0 + valLevel60 * (lvl - 1.0) / 59.0;
391
+ }
392
+
393
+ // Melee crit % from agility (percentage points, e.g. 5.0 = 5%). source: Player.cpp GetMeleeCritFromAgility;
394
+ // docs/cmangos_mapping/stats/derived-crit-dodge-spellcrit.md
395
+ export function meleeCritFromAgility(classId: number, level: number, agi: number): number {
396
+ let valLevel1 = 0.0;
397
+ let valLevel60 = 0.0;
398
+ switch (classId) {
399
+ case 2: case 7: case 11: // paladin, shaman, druid
400
+ valLevel1 = 4.6; valLevel60 = 20.0; break;
401
+ case 8: // mage
402
+ valLevel1 = 12.9; valLevel60 = 20.0; break;
403
+ case 4: // rogue
404
+ valLevel1 = 2.2; valLevel60 = 29.0; break;
405
+ case 3: // hunter
406
+ valLevel1 = 3.5; valLevel60 = 53.0; break;
407
+ case 5: // priest
408
+ valLevel1 = 11.0; valLevel60 = 20.0; break;
409
+ case 9: // warlock
410
+ valLevel1 = 8.4; valLevel60 = 20.0; break;
411
+ case 1: // warrior
412
+ valLevel1 = 3.9; valLevel60 = 20.0; break;
413
+ default:
414
+ return 0.0;
415
+ }
416
+ const classrate = classRateAtLevel(valLevel1, valLevel60, level);
417
+ if (classrate <= 0) return 0.0;
418
+ return agi / classrate;
419
+ }
420
+
421
+ // Dodge percentage points from agility alone; the class base is added separately by the caller.
422
+ // Cite: Player.cpp GetDodgeFromAgility, with the base array in StatSystem.cpp.
423
+ export function dodgeFromAgility(classId: number, level: number, agi: number): number {
424
+ let valLevel1 = 0.0;
425
+ let valLevel60 = 0.0;
426
+ switch (classId) {
427
+ case 2: case 7: case 11: // paladin, shaman, druid
428
+ valLevel1 = 4.6; valLevel60 = 20.0; break;
429
+ case 8: // mage
430
+ valLevel1 = 12.9; valLevel60 = 20.0; break;
431
+ case 4: // rogue
432
+ valLevel1 = 1.1; valLevel60 = 14.5; break;
433
+ case 3: // hunter
434
+ valLevel1 = 1.8; valLevel60 = 26.5; break;
435
+ case 5: // priest
436
+ valLevel1 = 11.0; valLevel60 = 20.0; break;
437
+ case 9: // warlock
438
+ valLevel1 = 8.4; valLevel60 = 20.0; break;
439
+ case 1: // warrior
440
+ valLevel1 = 3.9; valLevel60 = 20.0; break;
441
+ default:
442
+ return 0.0;
443
+ }
444
+ const classrate = classRateAtLevel(valLevel1, valLevel60, level);
445
+ if (classrate <= 0) return 0.0;
446
+ return agi / classrate;
447
+ }
448
+
449
+ // Class base dodge % (percentage points). Indexed by class id; unused slots 0. source: StatSystem.cpp
450
+ // PLAYER_BASE_DODGE[MAX_CLASSES]
451
+ export const PLAYER_BASE_DODGE: readonly number[] = [
452
+ 0.00, // [0] unused
453
+ 0.00, // [1] warrior
454
+ 0.75, // [2] paladin
455
+ 0.64, // [3] hunter
456
+ 0.00, // [4] rogue
457
+ 3.00, // [5] priest
458
+ 0.00, // [6] unused
459
+ 1.75, // [7] shaman
460
+ 3.25, // [8] mage
461
+ 2.00, // [9] warlock
462
+ 0.00, // [10] unused
463
+ 0.75, // [11] druid
464
+ ] as const;
465
+
466
+ /** Total dodge % from class base + agility (percentage points). */
467
+ export function dodgeChancePercent(classId: number, level: number, agi: number): number {
468
+ const base = (classId >= 0 && classId < PLAYER_BASE_DODGE.length) ? PLAYER_BASE_DODGE[classId]! : 0;
469
+ return base + dodgeFromAgility(classId, level, agi);
470
+ }
471
+
472
+ // Spell crit % from intellect (percentage points). chance = base + INT / (rate0 + rate1 * LEVEL) source:
473
+ // Player.cpp GetSpellCritFromIntellect; docs/cmangos_mapping/stats/derived-crit-dodge-spellcrit.md
474
+ const SPELL_CRIT_DATA: readonly { base: number; rate0: number; rate1: number }[] = [
475
+ { base: 0.0, rate0: 0.0, rate1: 10.0 }, // 0 unused
476
+ { base: 0.0, rate0: 0.0, rate1: 10.0 }, // 1 warrior
477
+ { base: 3.70, rate0: 14.77, rate1: 0.65 }, // 2 paladin
478
+ { base: 0.0, rate0: 0.0, rate1: 10.0 }, // 3 hunter (FIXME in CMaNGOS)
479
+ { base: 0.0, rate0: 0.0, rate1: 10.0 }, // 4 rogue
480
+ { base: 2.97, rate0: 10.03, rate1: 0.82 }, // 5 priest
481
+ { base: 0.0, rate0: 0.0, rate1: 10.0 }, // 6 unused
482
+ { base: 3.54, rate0: 11.51, rate1: 0.80 }, // 7 shaman
483
+ { base: 3.70, rate0: 14.77, rate1: 0.65 }, // 8 mage
484
+ { base: 3.18, rate0: 11.30, rate1: 0.82 }, // 9 warlock
485
+ { base: 0.0, rate0: 0.0, rate1: 10.0 }, // 10 unused
486
+ { base: 3.33, rate0: 12.41, rate1: 0.79 }, // 11 druid
487
+ ];
488
+
489
+ export function spellCritFromIntellect(classId: number, level: number, intellect: number): number {
490
+ if (classId < 0 || classId >= SPELL_CRIT_DATA.length) return 0.0;
491
+ const d = SPELL_CRIT_DATA[classId]!;
492
+ const critRatio = d.rate0 + d.rate1 * Math.max(1, level);
493
+ if (critRatio <= 0) return d.base;
494
+ return d.base + intellect / critRatio;
495
+ }
496
+
497
+ // The shapeshift flag for the agility attack bonus, extracted from the 1.12.1 client DBC: Cat carries
498
+ // it and no other playable form does.
499
+ export const SHAPESHIFT_FLAG_AGILITY_ATTACK_BONUS = 0x00000020;
500
+
501
+ /** Form ids whose DBC flags1 include AGILITY_ATTACK_BONUS (only Cat in 1.12.1). */
502
+ export const FORMS_WITH_AGI_ATTACK_BONUS: ReadonlySet<number> = new Set([1]);
503
+
504
+ export function formHasAgiAttackBonus(formId: number | undefined | null): boolean {
505
+ if (formId == null || formId === 0) return false;
506
+ return FORMS_WITH_AGI_ATTACK_BONUS.has(formId | 0);
507
+ }
508
+
509
+ // Melee attack power base, before the unit-mod flat and multiplier, on the per-class curves. A form
510
+ // carrying the agility attack bonus adds full agility on top.
511
+ export function meleeAttackPowerFromStats(
512
+ classId: number,
513
+ level: number,
514
+ str: number,
515
+ agi: number,
516
+ formAgiAttackBonus = false,
517
+ ): number {
518
+ const lvl = level;
519
+ let val2 = 0.0;
520
+ switch (classId) {
521
+ case 1: // warrior — StatSystem.cpp:246
522
+ case 2: // paladin — StatSystem.cpp:247
523
+ val2 = lvl * 3.0 + str * 2.0 - 20.0;
524
+ break;
525
+ case 4: // rogue — StatSystem.cpp:248
526
+ case 3: // hunter — StatSystem.cpp:249
527
+ val2 = lvl * 2.0 + str + agi - 20.0;
528
+ break;
529
+ case 7: // shaman — StatSystem.cpp:250
530
+ val2 = lvl * 2.0 + str * 2.0 - 20.0;
531
+ break;
532
+ case 11: // druid — StatSystem.cpp:253: level * 3 + str * 2 - 20, plus AGI when SHAPESHIFT_FLAG_AGILITY_ATTACK_BONUS (Cat).
533
+ val2 = lvl * 3.0 + str * 2.0 - 20.0 + (formAgiAttackBonus ? agi : 0);
534
+ break;
535
+ case 8: // mage — StatSystem.cpp:260
536
+ case 5: // priest — StatSystem.cpp:261
537
+ case 9: // warlock — StatSystem.cpp:262
538
+ val2 = str - 10.0;
539
+ break;
540
+ default:
541
+ val2 = 0.0;
542
+ break;
543
+ }
544
+ return val2;
545
+ }
546
+
547
+ // Ranged attack power base, before the unit-mod flat and multiplier: hunters double both terms,
548
+ // rogues and warriors take one each, and the cat and bear forms take none at all.
549
+ export function rangedAttackPowerFromStats(
550
+ classId: number,
551
+ level: number,
552
+ agi: number,
553
+ formId = 0,
554
+ ): number {
555
+ const lvl = level;
556
+ switch (classId) {
557
+ case 3: // hunter — StatSystem.cpp:225
558
+ return lvl * 2.0 + agi * 2.0 - 10.0;
559
+ case 4: // rogue — StatSystem.cpp:226
560
+ case 1: // warrior — StatSystem.cpp:227
561
+ return lvl + agi - 10.0;
562
+ case 11: { // druid — StatSystem.cpp:228–237
563
+ // FORM_CAT=1, FORM_BEAR=5, FORM_DIREBEAR=8 (SpellDefines.h / schema SHAPESHIFT_FORM)
564
+ if (formId === 1 || formId === 5 || formId === 8) return 0.0;
565
+ return agi - 10.0;
566
+ }
567
+ default: // StatSystem.cpp:239
568
+ return agi - 10.0;
569
+ }
570
+ }
571
+
572
+ // The strength contribution coefficient to melee AP, for equipment scoring and mid-fight strength
573
+ // buffs — 1 or 2, derived from the same per-class curve.
574
+ export function meleeApPerStrength(classId: number): number {
575
+ switch (classId) {
576
+ case 1: case 2: case 7: case 11: return 2; // warrior, paladin, shaman, druid
577
+ case 3: case 4: case 5: case 8: case 9: return 1; // hunter, rogue, priest, mage, warlock
578
+ default: return 0;
579
+ }
580
+ }
581
+
582
+ // Shield block VALUE, the flat damage absorbed on a successful block, not the block chance:
583
+ // (flat + strength / 20 − 1) × percent, floored at 0. Cite: Player.cpp GetShieldBlockValue ~4878.
584
+ export function shieldBlockValue(str: number, auraFlat = 0, auraPct = 1): number {
585
+ // source: Player.cpp:Player::GetShieldBlockValue — str/20 - 1, clamp 0, uint32 truncate
586
+ let value = (auraFlat + str / 20 - 1) * auraPct;
587
+ if (value < 0) value = 0;
588
+ return Math.floor(value);
589
+ }
590
+
591
+ // The layered unit-mod total: (base + create) × base percent, plus the total value, × the total
592
+ // percent. Both percentages default to 1, as the C++ initialises them.
593
+ export function unitModValue(
594
+ baseValue: number,
595
+ create: number,
596
+ basePct = 1,
597
+ totalValue = 0,
598
+ totalPct = 1,
599
+ ): number {
600
+ if (totalPct <= 0) return 0;
601
+ let value = baseValue + create;
602
+ value *= basePct;
603
+ value += totalValue;
604
+ value *= totalPct;
605
+ return value;
606
+ }
607
+
608
+ // Final attack power from the class base, the flat total and the multiplier. The multiplier here is
609
+ // the full factor, where 1.0 is no change, matching the layered helper above.
610
+ export function totalAttackPower(baseAp: number, totalValue = 0, basePct = 1, totalPct = 1): number {
611
+ const v = unitModValue(baseAp, 0, basePct, totalValue, totalPct);
612
+ return Math.max(0, Math.floor(v));
613
+ }
614
+
615
+ // Armor from total agility doubled, plus the gear, enchant and aura flats. Cite: StatSystem.cpp
616
+ // UpdateArmor; Player.cpp InitStatsForLevel SetArmor(createAgi*2).
617
+ export function armorFromAgiAndGear(agi: number, gearAndAuraArmor: number): number {
618
+ return Math.floor(agi * 2.0 + gearAndAuraArmor);
619
+ }
620
+
621
+ // The DISPLAY-only percentage bonus from skill over the level cap. CMaNGOS applies it to the printed
622
+ // value alone — combat reads the pre-skill number, so this must never reach a roll.
623
+ export function skillDisplayBonusPercentPoints(skill: number, level: number): number {
624
+ const cap = Math.max(1, Math.floor(level)) * 5; // Unit.h GetSkillMaxForLevel
625
+ return (skill - cap) * 0.04;
626
+ }
627
+
628
+ /** @deprecated Prefer meleeCritFromAgility(classId, level, agi) / 100. A thin warrior-L60-shaped
629
+ * fallback, kept only for call sites with no class context. */
630
+ function critChanceFromAgi(agi: number): number {
631
+ // Warrior L60 rate is 20 agi per 1% — historical TUNING.agiPerCrit shape, not authoritative.
632
+ return meleeCritFromAgility(1, 60, agi) / 100;
633
+ }
634
+
635
+ /** @deprecated Prefer dodgeChancePercent(classId, level, agi) / 100. */
636
+ function dodgeChanceFromAgi(agi: number): number {
637
+ return dodgeFromAgility(1, 60, agi) / 100;
638
+ }
639
+
640
+ /** @deprecated Prefer meleeAttackPowerFromStats(classId, level, str, agi). A warrior-shaped curve for
641
+ * call sites that only have a level and strength. */
642
+ function attackPowerFromStats(level: number, str: number): number {
643
+ return Math.max(0, meleeAttackPowerFromStats(1, level, str, 0));
644
+ }
645
+
646
+ // ---- Resistances & crowd control ------------------------------------------
647
+ // The average-resist helpers are rng-free, for CC land rolls; combat DAMAGE uses the partial table.
648
+
649
+ // The average fraction of magic damage resistance removes, with no partial table. For CC, the UI and
650
+ // tests only — combat damage must roll the table. Returns 0 at or below zero resistance.
651
+ export function resistMitigation(resistance: number, casterLevel: number): number {
652
+ if (resistance <= 0) return 0;
653
+ const pct = effectiveMagicResistancePercent({
654
+ school: 'fire', // school-agnostic average of a raw resistance amount
655
+ resistance,
656
+ attackerLevel: casterLevel,
657
+ victimLevel: casterLevel,
658
+ binary: false,
659
+ victimIsNpc: false,
660
+ });
661
+ return Math.max(0, pct) / 100;
662
+ }
663
+
664
+ // The legacy CC full-resist roll. applySpell no longer uses it, since hostile CC shares the cast's own
665
+ // hit result; it survives for the inline proc CC path.
666
+ export function ccResistChance(resistance: number, atkLevel: number, defLevel: number): number {
667
+ const level = 1 - spellHitChance(atkLevel, defLevel); // same level-gap shape as a spell miss
668
+ const fromRes = resistMitigation(resistance, atkLevel) * TUNING.resistCcFactor;
669
+ return clamp(level + fromRes, 0, 0.9);
670
+ }
671
+
672
+ // Diminishing-returns duration multiplier for the Nth application in a category (0 → full, 1 → ½, 2 → ¼, ≥3
673
+ // → immune). Pure arithmetic — DR draws no rng.
674
+ export function drFactor(step: number): number {
675
+ const s = TUNING.drSteps;
676
+ return s[Math.min(Math.max(0, step), s.length - 1)];
677
+ }
678
+
679
+ // Off-hand physical damage TOTAL_PCT default (50% weapon+AP). source: Unit.cpp constructor ~375–376
680
+ // `m_auraModifiersGroup[UNIT_MOD_DAMAGE_OFFHAND][TOTAL_PCT] = 0.5f`
681
+ export const OFFHAND_DAMAGE_TOTAL_PCT = 0.5;
682
+
683
+ // The off-hand total percent after the off-hand damage aura. That percent is a MOD of the 0.5 default,
684
+ // so a full Dual Wield Specialization gives 0.625, not 0.75.
685
+ export function offhandDamageTotalPct(pctBonus: number | undefined): number {
686
+ const pct = Number(pctBonus) || 0;
687
+ return OFFHAND_DAMAGE_TOTAL_PCT * (100 + pct) / 100;
688
+ }
689
+
690
+ // The crit multiplier after the versus-creature-type aura: the base times one plus the bonus, when the
691
+ // victim's type matches. Heals never take it — the C++ guards the whole block.
692
+ export function critMultiplierWithVersus(
693
+ base: number,
694
+ rows: ReadonlyArray<{ creatureTypeMask: number; amount: number }> | undefined,
695
+ creatureType: number | undefined,
696
+ ): number {
697
+ const type = (creatureType ?? 0) | 0;
698
+ if (!rows?.length || type < 1) return base;
699
+ const typeMask = 1 << (type - 1);
700
+ let bonus = 0;
701
+ for (const r of rows) if (((r.creatureTypeMask ?? 0) | 0) & typeMask) bonus += r.amount;
702
+ return bonus ? base * (1 + bonus / 100) : base;
703
+ }
704
+
705
+ /** Unarmed fallback when !CanUseEquippedWeapon (Unit.h BASE_MINDAMAGE / BASE_MAXDAMAGE). */
706
+ export const BASE_MINDAMAGE = 1;
707
+ export const BASE_MAXDAMAGE = 2;
708
+
709
+ // Inputs for CalculateMinMaxDamage. The defaults match the C++ unit-mod init, except that an off-hand
710
+ // caller should pass the off-hand total percent.
711
+ export interface MinMaxDamageArgs {
712
+ weaponMin: number;
713
+ weaponMax: number;
714
+ attackPower: number;
715
+ /** Attack time in ms; att_speed = speedMs/1000 when !normalized. */
716
+ speedMs: number;
717
+ /** UNIT_MOD_* BASE_VALUE (usually 0 for players). */
718
+ baseValueMod?: number;
719
+ basePct?: number;
720
+ totalValue?: number;
721
+ /** UNIT_MOD_* TOTAL_PCT; off-hand default is 0.5 in Unit.cpp. */
722
+ totalPct?: number;
723
+ // GetEnchantmentModifier flat — only applied on the equipped-weapon branch. Gap: Phonecraft item/enchant
724
+ // data has no baked weapon-damage flat today → pass 0.
725
+ enchantFlat?: number;
726
+ /** Ranged ammo DPS (min/max) × att_speed added to weapon. Gap: no ammo DPS in schema → 0. */
727
+ ammoDpsMin?: number;
728
+ ammoDpsMax?: number;
729
+ /** IsAttackSpeedOverridenShapeShift — form level×speed weapon bands. */
730
+ formOverride?: boolean;
731
+ /** Level for form override (clamped ≤60). */
732
+ level?: number;
733
+ /** CanUseEquippedWeapon; false → BASE_MINDAMAGE/BASE_MAXDAMAGE. Default true. */
734
+ canUseWeapon?: boolean;
735
+ // Multi-damage-line index. When index ≠ 0 on equipped branch, base_value and total_value are zeroed
736
+ // (secondary weapon damage lines carry no AP/enchant).
737
+ index?: number;
738
+ // Normalized ability path: use normalizedSpeedSec as att_speed (GetAPMultiplier). White attacks leave
739
+ // this false.
740
+ normalized?: boolean;
741
+ /** Seconds; required when normalized=true (dagger 1.7 / 1H 2.4 / 2H 3.3 / ranged 2.8). */
742
+ normalizedSpeedSec?: number;
743
+ }
744
+
745
+ // The CalculateMinMaxDamage structure, giving min and max before the damage roll: the base value is
746
+ // attack power over 14 times the attack speed, then the weapon band through both percent layers.
747
+ export function calculateMinMaxDamage(args: MinMaxDamageArgs): { min: number; max: number } {
748
+ const attSpeed = args.normalized && args.normalizedSpeedSec != null
749
+ ? Math.max(0, args.normalizedSpeedSec)
750
+ : Math.max(0, args.speedMs) / 1000;
751
+
752
+ let baseValue = (args.baseValueMod ?? 0) + (args.attackPower / 14) * attSpeed;
753
+ const basePct = args.basePct ?? 1;
754
+ let totalValue = args.totalValue ?? 0;
755
+ const totalPct = args.totalPct ?? 1;
756
+
757
+ let weaponMin = args.weaponMin;
758
+ let weaponMax = args.weaponMax;
759
+
760
+ if (args.formOverride) {
761
+ let lvl = (args.level ?? 1) | 0;
762
+ if (lvl > 60) lvl = 60;
763
+ if (lvl < 1) lvl = 1;
764
+ weaponMin = lvl * 0.85 * attSpeed;
765
+ weaponMax = lvl * 1.25 * attSpeed;
766
+ } else if (args.canUseWeapon === false) {
767
+ weaponMin = BASE_MINDAMAGE;
768
+ weaponMax = BASE_MAXDAMAGE;
769
+ } else {
770
+ totalValue += args.enchantFlat ?? 0;
771
+ if (args.ammoDpsMin != null && args.ammoDpsMin !== 0) {
772
+ weaponMin += args.ammoDpsMin * attSpeed;
773
+ }
774
+ if (args.ammoDpsMax != null && args.ammoDpsMax !== 0) {
775
+ weaponMax += args.ammoDpsMax * attSpeed;
776
+ }
777
+ if ((args.index ?? 0) !== 0) {
778
+ baseValue = 0;
779
+ totalValue = 0;
780
+ }
781
+ }
782
+
783
+ return {
784
+ min: ((baseValue + weaponMin) * basePct + totalValue) * totalPct,
785
+ max: ((baseValue + weaponMax) * basePct + totalValue) * totalPct,
786
+ };
787
+ }
788
+
789
+ // Roll raw white or ability weapon damage between that min and max. The options select the off-hand
790
+ // half, a form override and the enchant or ammo hooks; omitted, it matches the prior shape.
791
+ export function meleeBaseDamage(
792
+ weaponMin: number,
793
+ weaponMax: number,
794
+ attackPower: number,
795
+ speedMs: number,
796
+ roll01: number,
797
+ opts?: Omit<MinMaxDamageArgs, 'weaponMin' | 'weaponMax' | 'attackPower' | 'speedMs'>,
798
+ ): number {
799
+ const range = calculateMinMaxDamage({
800
+ weaponMin,
801
+ weaponMax,
802
+ attackPower,
803
+ speedMs,
804
+ ...opts,
805
+ });
806
+ return rollBetween(range.min, range.max, roll01);
807
+ }