azeroth-shell 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/README.md +138 -2
  2. package/bin/azsh.mjs +19 -0
  3. package/docs/aifid/eventai-texts.json +4414 -0
  4. package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
  5. package/docs/dungeons/survey/pack-id-migration.json +2418 -0
  6. package/package.json +26 -4
  7. package/src/autopilot/bossSkip.ts +26 -0
  8. package/src/autopilot/combatRotation.ts +824 -0
  9. package/src/autopilot/config.ts +533 -0
  10. package/src/autopilot/consumables.ts +58 -0
  11. package/src/autopilot/encounterStand.ts +121 -0
  12. package/src/autopilot/objectGatePlan.ts +53 -0
  13. package/src/autopilot/pathEngage.ts +229 -0
  14. package/src/autopilot/plan.ts +1643 -0
  15. package/src/autopilot/questPolicy.ts +274 -0
  16. package/src/autopilot/routeStep.ts +69 -0
  17. package/src/autopilot/sessionReport.ts +88 -0
  18. package/src/autopilot/topOffPower.ts +26 -0
  19. package/src/autopilot/view.ts +476 -0
  20. package/src/cli/bootCheck.mjs +34 -0
  21. package/src/cli/bootData.mjs +57 -0
  22. package/src/cli/combatLogFilter.ts +153 -0
  23. package/src/cli/combatLogFormat.ts +613 -0
  24. package/src/cli/fileRepository.mjs +105 -0
  25. package/src/cli/gzLoader.mjs +31 -0
  26. package/src/cli/liveGauntletEscort.ts +978 -0
  27. package/src/cli/liveStratUndead.ts +305 -0
  28. package/src/cli/macroHostCombat.ts +545 -0
  29. package/src/cli/macroHostWorld.ts +330 -0
  30. package/src/cli/prefs.mjs +31 -0
  31. package/src/cli/register.mjs +4 -0
  32. package/src/cli/repl.mjs +693 -0
  33. package/src/cli/rotationText.mjs +226 -0
  34. package/src/cli/squad.mjs +105 -0
  35. package/src/cli/term.mjs +126 -0
  36. package/src/cli/text.mjs +122 -0
  37. package/src/cli/tui.mjs +626 -0
  38. package/src/cli/tuiArena.mjs +109 -0
  39. package/src/cli/tuiAutopilotSettings.mjs +93 -0
  40. package/src/cli/tuiBags.mjs +180 -0
  41. package/src/cli/tuiBars.mjs +133 -0
  42. package/src/cli/tuiBg.mjs +243 -0
  43. package/src/cli/tuiBulk.mjs +162 -0
  44. package/src/cli/tuiCheck.mjs +1882 -0
  45. package/src/cli/tuiCity.mjs +396 -0
  46. package/src/cli/tuiCompanionKit.mjs +300 -0
  47. package/src/cli/tuiCompanions.mjs +471 -0
  48. package/src/cli/tuiDev.mjs +62 -0
  49. package/src/cli/tuiDungeon.mjs +606 -0
  50. package/src/cli/tuiEnchantTarget.mjs +120 -0
  51. package/src/cli/tuiFight.mjs +577 -0
  52. package/src/cli/tuiFightPanes.mjs +228 -0
  53. package/src/cli/tuiFloor.mjs +506 -0
  54. package/src/cli/tuiGear.mjs +158 -0
  55. package/src/cli/tuiHonor.mjs +74 -0
  56. package/src/cli/tuiLoot.mjs +97 -0
  57. package/src/cli/tuiMacros.mjs +144 -0
  58. package/src/cli/tuiOutfitter.mjs +115 -0
  59. package/src/cli/tuiPet.mjs +116 -0
  60. package/src/cli/tuiProfessions.mjs +800 -0
  61. package/src/cli/tuiRaid.mjs +127 -0
  62. package/src/cli/tuiRep.mjs +65 -0
  63. package/src/cli/tuiSaves.mjs +69 -0
  64. package/src/cli/tuiSearch.mjs +363 -0
  65. package/src/cli/tuiSettings.mjs +151 -0
  66. package/src/cli/tuiSimLab.mjs +80 -0
  67. package/src/cli/tuiTalents.mjs +60 -0
  68. package/src/cli/tuiViews.mjs +1178 -0
  69. package/src/cli/tuiWiki.mjs +181 -0
  70. package/src/cli/tuiWorld.mjs +361 -0
  71. package/src/cli/wikiIndex.ts +259 -0
  72. package/src/cli/wikiSources.ts +355 -0
  73. package/src/data/alteracValley.ts +176 -0
  74. package/src/data/appearanceOptions.ts +534 -0
  75. package/src/data/applyLootChanceSanity.ts +21 -0
  76. package/src/data/createFlavor.ts +96 -0
  77. package/src/data/customItems.ts +33 -0
  78. package/src/data/dataStore.ts +1904 -0
  79. package/src/data/dungeonGameObjects.ts +84 -0
  80. package/src/data/dungeonPlateCover.ts +66 -0
  81. package/src/data/dungeonSpawns.ts +294 -0
  82. package/src/data/dungeons/alterac-valley.ts +135 -0
  83. package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
  84. package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
  85. package/src/data/dungeons/apply-instance-geometry.ts +65 -0
  86. package/src/data/dungeons/apply-spawn-placement.ts +171 -0
  87. package/src/data/dungeons/blackfathom-deeps.ts +539 -0
  88. package/src/data/dungeons/blackrock-depths.ts +1410 -0
  89. package/src/data/dungeons/blackwing-lair.ts +129 -0
  90. package/src/data/dungeons/boss-eventai.ts +8 -0
  91. package/src/data/dungeons/deadmines.ts +410 -0
  92. package/src/data/dungeons/dire-maul-east.ts +980 -0
  93. package/src/data/dungeons/dire-maul-north.ts +661 -0
  94. package/src/data/dungeons/dire-maul-west.ts +785 -0
  95. package/src/data/dungeons/dungeon-rooms.json +5479 -0
  96. package/src/data/dungeons/encounter-outdoors.json +359 -0
  97. package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
  98. package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
  99. package/src/data/dungeons/eventai/deadmines.ts +264 -0
  100. package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
  101. package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
  102. package/src/data/dungeons/eventai/helpers.ts +79 -0
  103. package/src/data/dungeons/eventai/index.ts +133 -0
  104. package/src/data/dungeons/eventai/lbrs.ts +372 -0
  105. package/src/data/dungeons/eventai/maraudon.ts +323 -0
  106. package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
  107. package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
  108. package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
  109. package/src/data/dungeons/eventai/scholomance.ts +680 -0
  110. package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
  111. package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
  112. package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
  113. package/src/data/dungeons/eventai/sm-library.ts +55 -0
  114. package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
  115. package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
  116. package/src/data/dungeons/eventai/the-stockade.ts +228 -0
  117. package/src/data/dungeons/eventai/ubrs.ts +225 -0
  118. package/src/data/dungeons/eventai/uldaman.ts +355 -0
  119. package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
  120. package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
  121. package/src/data/dungeons/gnomeregan.ts +909 -0
  122. package/src/data/dungeons/index.ts +126 -0
  123. package/src/data/dungeons/instance-geometry.json +5233 -0
  124. package/src/data/dungeons/key-sources.json +169 -0
  125. package/src/data/dungeons/lbrs.ts +996 -0
  126. package/src/data/dungeons/maraudon.ts +786 -0
  127. package/src/data/dungeons/molten-core.ts +194 -0
  128. package/src/data/dungeons/naxxramas.ts +173 -0
  129. package/src/data/dungeons/onyxias-lair.ts +71 -0
  130. package/src/data/dungeons/pack-from-clusters.ts +1256 -0
  131. package/src/data/dungeons/ragefire-chasm.ts +238 -0
  132. package/src/data/dungeons/razorfen-downs.ts +698 -0
  133. package/src/data/dungeons/razorfen-kraul.ts +766 -0
  134. package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
  135. package/src/data/dungeons/scholomance.ts +1076 -0
  136. package/src/data/dungeons/shadowfang-keep.ts +740 -0
  137. package/src/data/dungeons/sm-armory.ts +266 -0
  138. package/src/data/dungeons/sm-cathedral.ts +430 -0
  139. package/src/data/dungeons/sm-graveyard.ts +482 -0
  140. package/src/data/dungeons/sm-library.ts +337 -0
  141. package/src/data/dungeons/stratholme-live.ts +808 -0
  142. package/src/data/dungeons/stratholme-undead.ts +1164 -0
  143. package/src/data/dungeons/sunken-temple.ts +931 -0
  144. package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
  145. package/src/data/dungeons/the-stockade.ts +282 -0
  146. package/src/data/dungeons/ubrs.ts +1286 -0
  147. package/src/data/dungeons/uldaman.ts +685 -0
  148. package/src/data/dungeons/wailing-caverns.ts +356 -0
  149. package/src/data/dungeons/zul-farrak.ts +686 -0
  150. package/src/data/dungeons/zul-gurub.ts +142 -0
  151. package/src/data/dungeons.ts +42 -0
  152. package/src/data/fixtures.ts +446 -0
  153. package/src/data/gameobject-data.json.gz +0 -0
  154. package/src/data/item-data.json.gz +0 -0
  155. package/src/data/loot-data.json.gz +0 -0
  156. package/src/data/maps/atlas-approach-maps.json +1425 -0
  157. package/src/data/maps/atlas-landmarks.json +1711 -0
  158. package/src/data/maps/dungeon-viewports.json +392 -0
  159. package/src/data/materializeModDamagePercentTaken.ts +70 -0
  160. package/src/data/materializeModHealthRegen.ts +89 -0
  161. package/src/data/materializeSpellReputation.ts +26 -0
  162. package/src/data/pageTexts.ts +19 -0
  163. package/src/data/profession-data.json.gz +0 -0
  164. package/src/data/raid-plans/blackfathom-deeps.json +86 -0
  165. package/src/data/raid-plans/blackrock-depths.json +419 -0
  166. package/src/data/raid-plans/blackwing-lair.json +328 -0
  167. package/src/data/raid-plans/deadmines.json +55 -0
  168. package/src/data/raid-plans/dire-maul-east.json +94 -0
  169. package/src/data/raid-plans/dire-maul-north.json +70 -0
  170. package/src/data/raid-plans/dire-maul-west.json +75 -0
  171. package/src/data/raid-plans/gnomeregan.json +131 -0
  172. package/src/data/raid-plans/lbrs.json +176 -0
  173. package/src/data/raid-plans/maraudon.json +102 -0
  174. package/src/data/raid-plans/molten-core.json +169 -0
  175. package/src/data/raid-plans/naxxramas.json +354 -0
  176. package/src/data/raid-plans/onyxias-lair.json +18 -0
  177. package/src/data/raid-plans/ragefire-chasm.json +30 -0
  178. package/src/data/raid-plans/razorfen-downs.json +75 -0
  179. package/src/data/raid-plans/razorfen-kraul.json +53 -0
  180. package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
  181. package/src/data/raid-plans/scholomance.json +170 -0
  182. package/src/data/raid-plans/shadowfang-keep.json +87 -0
  183. package/src/data/raid-plans/sm-armory.json +53 -0
  184. package/src/data/raid-plans/sm-cathedral.json +72 -0
  185. package/src/data/raid-plans/sm-graveyard.json +63 -0
  186. package/src/data/raid-plans/sm-library.json +23 -0
  187. package/src/data/raid-plans/stratholme-live.json +129 -0
  188. package/src/data/raid-plans/stratholme-undead.json +73 -0
  189. package/src/data/raid-plans/sunken-temple.json +159 -0
  190. package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
  191. package/src/data/raid-plans/the-stockade.json +42 -0
  192. package/src/data/raid-plans/ubrs.json +53 -0
  193. package/src/data/raid-plans/uldaman.json +131 -0
  194. package/src/data/raid-plans/wailing-caverns.json +90 -0
  195. package/src/data/raid-plans/zul-farrak.json +156 -0
  196. package/src/data/raid-plans/zul-gurub.json +307 -0
  197. package/src/data/raidInstanceCreatures.mjs +473 -0
  198. package/src/data/rotations/index.ts +152 -0
  199. package/src/data/rotations/layout.mjs +72 -0
  200. package/src/data/rotations/pve/druid/balance.json +754 -0
  201. package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
  202. package/src/data/rotations/pve/druid/feral.json +2660 -0
  203. package/src/data/rotations/pve/druid/restoration.json +424 -0
  204. package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
  205. package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
  206. package/src/data/rotations/pve/hunter/survival.json +1373 -0
  207. package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
  208. package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
  209. package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
  210. package/src/data/rotations/pve/paladin/holy.json +755 -0
  211. package/src/data/rotations/pve/paladin/protection.json +962 -0
  212. package/src/data/rotations/pve/paladin/retribution.json +924 -0
  213. package/src/data/rotations/pve/priest/discipline.json +772 -0
  214. package/src/data/rotations/pve/priest/holy.json +707 -0
  215. package/src/data/rotations/pve/priest/shadow.json +787 -0
  216. package/src/data/rotations/pve/rogue/assassination.json +2477 -0
  217. package/src/data/rotations/pve/rogue/combat.json +2483 -0
  218. package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
  219. package/src/data/rotations/pve/shaman/elemental.json +1157 -0
  220. package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
  221. package/src/data/rotations/pve/shaman/restoration.json +592 -0
  222. package/src/data/rotations/pve/warlock/affliction.json +1185 -0
  223. package/src/data/rotations/pve/warlock/demonology.json +1165 -0
  224. package/src/data/rotations/pve/warlock/destruction.json +1177 -0
  225. package/src/data/rotations/pve/warrior/arms.json +3020 -0
  226. package/src/data/rotations/pve/warrior/fury.json +2996 -0
  227. package/src/data/rotations/pve/warrior/protection.json +2509 -0
  228. package/src/data/rotations/pvp/druid/balance.json +593 -0
  229. package/src/data/rotations/pvp/druid/feral.json +3276 -0
  230. package/src/data/rotations/pvp/druid/restoration.json +662 -0
  231. package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
  232. package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
  233. package/src/data/rotations/pvp/hunter/survival.json +635 -0
  234. package/src/data/rotations/pvp/mage/arcane.json +574 -0
  235. package/src/data/rotations/pvp/mage/fire.json +570 -0
  236. package/src/data/rotations/pvp/mage/frost.json +4048 -0
  237. package/src/data/rotations/pvp/paladin/holy.json +1498 -0
  238. package/src/data/rotations/pvp/paladin/protection.json +567 -0
  239. package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
  240. package/src/data/rotations/pvp/priest/discipline.json +1848 -0
  241. package/src/data/rotations/pvp/priest/holy.json +6340 -0
  242. package/src/data/rotations/pvp/priest/shadow.json +2329 -0
  243. package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
  244. package/src/data/rotations/pvp/rogue/combat.json +5258 -0
  245. package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
  246. package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
  247. package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
  248. package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
  249. package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
  250. package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
  251. package/src/data/rotations/pvp/warlock/destruction.json +638 -0
  252. package/src/data/rotations/pvp/warrior/arms.json +5665 -0
  253. package/src/data/rotations/pvp/warrior/fury.json +850 -0
  254. package/src/data/rotations/pvp/warrior/protection.json +777 -0
  255. package/src/data/schema/bundle.ts +511 -0
  256. package/src/data/schema/constants.ts +49 -0
  257. package/src/data/schema/creature.ts +454 -0
  258. package/src/data/schema/encounter.ts +155 -0
  259. package/src/data/schema/faction.ts +48 -0
  260. package/src/data/schema/item.ts +297 -0
  261. package/src/data/schema/itemEnchant.ts +105 -0
  262. package/src/data/schema/npc.ts +44 -0
  263. package/src/data/schema/primitives.ts +295 -0
  264. package/src/data/schema/profession.ts +226 -0
  265. package/src/data/schema/quest.ts +154 -0
  266. package/src/data/schema/spell.ts +1149 -0
  267. package/src/data/schema/talent.ts +74 -0
  268. package/src/data/schema/world.ts +124 -0
  269. package/src/data/schema.ts +19 -0
  270. package/src/data/skinNodeGapFill.ts +68 -0
  271. package/src/data/spell-data.json.gz +0 -0
  272. package/src/data/spell-script-targets.json +1 -0
  273. package/src/data/tables/ahItemValues.json.gz +0 -0
  274. package/src/data/tables/alteracValley.json.gz +0 -0
  275. package/src/data/tables/areatriggerTeleports.json.gz +0 -0
  276. package/src/data/tables/botNames.json.gz +0 -0
  277. package/src/data/tables/botPopulation.json.gz +0 -0
  278. package/src/data/tables/botSpecs.json.gz +0 -0
  279. package/src/data/tables/classLevelStats.json.gz +0 -0
  280. package/src/data/tables/combatConditions.json.gz +0 -0
  281. package/src/data/tables/combatSkillMeta.json.gz +0 -0
  282. package/src/data/tables/conditions.json.gz +0 -0
  283. package/src/data/tables/createInfo.json.gz +0 -0
  284. package/src/data/tables/creatureAggroGroups.json.gz +0 -0
  285. package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
  286. package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
  287. package/src/data/tables/creatureWeapons.json.gz +0 -0
  288. package/src/data/tables/creatures.json.gz +0 -0
  289. package/src/data/tables/dbScripts.json.gz +0 -0
  290. package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
  291. package/src/data/tables/dungeonCensus.json.gz +0 -0
  292. package/src/data/tables/dungeonGameObjects.json.gz +0 -0
  293. package/src/data/tables/dungeonPacks.json.gz +0 -0
  294. package/src/data/tables/dungeonPlateCover.json.gz +0 -0
  295. package/src/data/tables/dungeonSpawns.json.gz +0 -0
  296. package/src/data/tables/dungeonSurvey.json.gz +0 -0
  297. package/src/data/tables/durabilityCosts.json.gz +0 -0
  298. package/src/data/tables/durabilityQuality.json.gz +0 -0
  299. package/src/data/tables/enchantApplicators.json.gz +0 -0
  300. package/src/data/tables/entranceYards.json.gz +0 -0
  301. package/src/data/tables/explorationBasexp.json.gz +0 -0
  302. package/src/data/tables/factionTemplates.json.gz +0 -0
  303. package/src/data/tables/factions.json.gz +0 -0
  304. package/src/data/tables/gameEvents.json.gz +0 -0
  305. package/src/data/tables/gameObjects.json.gz +0 -0
  306. package/src/data/tables/gossipMenus.json.gz +0 -0
  307. package/src/data/tables/graveyards.json.gz +0 -0
  308. package/src/data/tables/instanceMaps.json.gz +0 -0
  309. package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
  310. package/src/data/tables/itemEnchants.json.gz +0 -0
  311. package/src/data/tables/itemRandomProperties.json.gz +0 -0
  312. package/src/data/tables/itemSets.json.gz +0 -0
  313. package/src/data/tables/items.json.gz +0 -0
  314. package/src/data/tables/levelStats.json.gz +0 -0
  315. package/src/data/tables/locks.json.gz +0 -0
  316. package/src/data/tables/map-pin-overrides.json.gz +0 -0
  317. package/src/data/tables/nonCombatTrash.json.gz +0 -0
  318. package/src/data/tables/npcTexts.json.gz +0 -0
  319. package/src/data/tables/pageTexts.json.gz +0 -0
  320. package/src/data/tables/petAbilityTP.json.gz +0 -0
  321. package/src/data/tables/petGenericSpells.json.gz +0 -0
  322. package/src/data/tables/petLevelStats.json.gz +0 -0
  323. package/src/data/tables/playerbot-weightscales.json.gz +0 -0
  324. package/src/data/tables/pools.json.gz +0 -0
  325. package/src/data/tables/quests.json.gz +0 -0
  326. package/src/data/tables/races.json.gz +0 -0
  327. package/src/data/tables/reputationRanks.json.gz +0 -0
  328. package/src/data/tables/reputationRates.json.gz +0 -0
  329. package/src/data/tables/reputationSpillover.json.gz +0 -0
  330. package/src/data/tables/ridingSpells.json.gz +0 -0
  331. package/src/data/tables/scriptTexts.json.gz +0 -0
  332. package/src/data/tables/soundClipVolume.json.gz +0 -0
  333. package/src/data/tables/spellChain.json.gz +0 -0
  334. package/src/data/tables/spellTeleports.json.gz +0 -0
  335. package/src/data/tables/spells.json.gz +0 -0
  336. package/src/data/tables/talents.json.gz +0 -0
  337. package/src/data/tables/tavernTriggers.json.gz +0 -0
  338. package/src/data/tables/taxiNodes.json.gz +0 -0
  339. package/src/data/tables/taxiRoutes.json.gz +0 -0
  340. package/src/data/tables/trainers.json.gz +0 -0
  341. package/src/data/tables/transports.json.gz +0 -0
  342. package/src/data/tables/travelAnchors.json.gz +0 -0
  343. package/src/data/tables/travelEdges.json.gz +0 -0
  344. package/src/data/tables/unitConditions.json.gz +0 -0
  345. package/src/data/tables/vendors.json.gz +0 -0
  346. package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
  347. package/src/data/tables/xp.json.gz +0 -0
  348. package/src/data/tables/zoneWeather.json.gz +0 -0
  349. package/src/data/tables/zones.json.gz +0 -0
  350. package/src/data/world-data.ts +56 -0
  351. package/src/data/zone-music-sets.json +2751 -0
  352. package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
  353. package/src/domain/audioQuality.mjs +145 -0
  354. package/src/domain/bg/ab.ts +433 -0
  355. package/src/domain/bg/arenaComps.ts +644 -0
  356. package/src/domain/bg/arenaLab.ts +695 -0
  357. package/src/domain/bg/arenaPace.ts +31 -0
  358. package/src/domain/bg/arenaRating.ts +110 -0
  359. package/src/domain/bg/av.ts +758 -0
  360. package/src/domain/bg/avEnemyPush.ts +219 -0
  361. package/src/domain/bg/avField.ts +283 -0
  362. package/src/domain/bg/avInstanceNodes.ts +197 -0
  363. package/src/domain/bg/avInstanceScore.ts +123 -0
  364. package/src/domain/bg/avQuestItems.ts +55 -0
  365. package/src/domain/bg/avQuests.ts +210 -0
  366. package/src/domain/bg/avSession.ts +196 -0
  367. package/src/domain/bg/bgConsumes.ts +269 -0
  368. package/src/domain/bg/bgPrebuff.ts +153 -0
  369. package/src/domain/bg/bgRest.ts +91 -0
  370. package/src/domain/bg/bgRoster.ts +305 -0
  371. package/src/domain/bg/bgTier.ts +61 -0
  372. package/src/domain/bg/bgWorld.ts +862 -0
  373. package/src/domain/bg/match.ts +215 -0
  374. package/src/domain/bg/strategies.ts +552 -0
  375. package/src/domain/bg/types.ts +291 -0
  376. package/src/domain/bg/wsg.ts +264 -0
  377. package/src/domain/bots/actionProviderSpec.ts +38 -0
  378. package/src/domain/bots/autoConsumables.ts +285 -0
  379. package/src/domain/bots/betweenPullRest.ts +239 -0
  380. package/src/domain/bots/botGear.ts +248 -0
  381. package/src/domain/bots/botInventory.ts +486 -0
  382. package/src/domain/bots/botPet.ts +535 -0
  383. package/src/domain/bots/botPool.ts +291 -0
  384. package/src/domain/bots/botProfessions.ts +334 -0
  385. package/src/domain/bots/companionActionBar.ts +209 -0
  386. package/src/domain/bots/companionHireCost.ts +236 -0
  387. package/src/domain/bots/companionMissions.ts +582 -0
  388. package/src/domain/bots/companionPrep.ts +254 -0
  389. package/src/domain/bots/companionQuests.ts +270 -0
  390. package/src/domain/bots/companionRep.ts +75 -0
  391. package/src/domain/bots/companionRotation.ts +708 -0
  392. package/src/domain/bots/companionXp.ts +66 -0
  393. package/src/domain/bots/consumableShare.ts +811 -0
  394. package/src/domain/bots/dpsMate.ts +1072 -0
  395. package/src/domain/bots/groupCompReport.ts +132 -0
  396. package/src/domain/bots/healthstoneSupply.ts +198 -0
  397. package/src/domain/bots/outfitter.ts +1056 -0
  398. package/src/domain/bots/paladinPrePull.ts +231 -0
  399. package/src/domain/bots/partyRole.ts +40 -0
  400. package/src/domain/bots/playerbotEquipCache.ts +412 -0
  401. package/src/domain/bots/playerbotItemEligibility.ts +60 -0
  402. package/src/domain/bots/playerbotStatWeight.ts +853 -0
  403. package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
  404. package/src/domain/bots/prePullBuffs.ts +219 -0
  405. package/src/domain/bots/prePullStealth.ts +82 -0
  406. package/src/domain/bots/runSupply.ts +251 -0
  407. package/src/domain/bots/runSupplyPrefs.ts +28 -0
  408. package/src/domain/bots/sendTradeGoods.ts +394 -0
  409. package/src/domain/bots/soulShardCap.ts +35 -0
  410. package/src/domain/bots/squad.ts +842 -0
  411. package/src/domain/bots/squadRun.ts +81 -0
  412. package/src/domain/character/actionbar.ts +346 -0
  413. package/src/domain/character/appearance.ts +165 -0
  414. package/src/domain/character/buildCombatant.ts +1726 -0
  415. package/src/domain/character/character.ts +356 -0
  416. package/src/domain/character/characterName.ts +43 -0
  417. package/src/domain/character/characterRatings.ts +424 -0
  418. package/src/domain/character/characterSpells.ts +282 -0
  419. package/src/domain/character/characterStats.ts +1559 -0
  420. package/src/domain/character/characterTalents.ts +398 -0
  421. package/src/domain/character/combatSkills.ts +994 -0
  422. package/src/domain/character/displayForm.ts +72 -0
  423. package/src/domain/character/formTalentAuras.ts +171 -0
  424. package/src/domain/character/forms.ts +499 -0
  425. package/src/domain/character/races.ts +40 -0
  426. package/src/domain/character/resurrectionSickness.ts +49 -0
  427. package/src/domain/character/spellbook.ts +169 -0
  428. package/src/domain/character/stanceBar.ts +354 -0
  429. package/src/domain/character/stancePrereq.ts +70 -0
  430. package/src/domain/character/talentBuilds.ts +63 -0
  431. package/src/domain/character/talentImport.ts +130 -0
  432. package/src/domain/character/talentLink.ts +123 -0
  433. package/src/domain/character/talents.ts +201 -0
  434. package/src/domain/core/conditionSnapshot.ts +92 -0
  435. package/src/domain/core/hover.ts +14 -0
  436. package/src/domain/core/ids.ts +58 -0
  437. package/src/domain/core/internalNameTags.ts +5 -0
  438. package/src/domain/core/runtimeDataPatches.ts +357 -0
  439. package/src/domain/creature/aiTargeting.ts +588 -0
  440. package/src/domain/creature/combatCondition.ts +157 -0
  441. package/src/domain/creature/creatureAggro.ts +804 -0
  442. package/src/domain/creature/creatureAi.ts +206 -0
  443. package/src/domain/creature/creatureAiConstants.ts +661 -0
  444. package/src/domain/creature/creatureCastList.ts +1007 -0
  445. package/src/domain/creature/creatureEventAi.ts +1409 -0
  446. package/src/domain/creature/creatureGroups.ts +144 -0
  447. package/src/domain/creature/creatureLinking.ts +333 -0
  448. package/src/domain/creature/creatureScaling.ts +320 -0
  449. package/src/domain/creature/creatureTrigger.ts +53 -0
  450. package/src/domain/creature/creatureWander.ts +74 -0
  451. package/src/domain/creature/eventAiTexts.ts +145 -0
  452. package/src/domain/creature/faction.ts +287 -0
  453. package/src/domain/creature/forcedReaction.ts +48 -0
  454. package/src/domain/creature/outdoorHuntable.ts +74 -0
  455. package/src/domain/creature/patrolPacks.ts +210 -0
  456. package/src/domain/creature/reputation.ts +967 -0
  457. package/src/domain/creature/unitFlags.ts +74 -0
  458. package/src/domain/creature/worldBosses.ts +393 -0
  459. package/src/domain/dungeonMusic.mjs +48 -0
  460. package/src/domain/economy/auction.ts +282 -0
  461. package/src/domain/economy/auctionBot.ts +1060 -0
  462. package/src/domain/economy/honorPrice.ts +100 -0
  463. package/src/domain/economy/mail.ts +958 -0
  464. package/src/domain/economy/money.ts +42 -0
  465. package/src/domain/economy/syntheticClassTrainers.ts +62 -0
  466. package/src/domain/economy/trading.ts +296 -0
  467. package/src/domain/economy/vendorSellAll.ts +252 -0
  468. package/src/domain/economy/vendorStock.ts +146 -0
  469. package/src/domain/items/ammo.ts +817 -0
  470. package/src/domain/items/bank.ts +162 -0
  471. package/src/domain/items/consumableFamily.ts +205 -0
  472. package/src/domain/items/craftUpgrades.ts +83 -0
  473. package/src/domain/items/createItem.ts +93 -0
  474. package/src/domain/items/durability.ts +581 -0
  475. package/src/domain/items/equipment.ts +441 -0
  476. package/src/domain/items/equipmentHelper.ts +767 -0
  477. package/src/domain/items/inventory.ts +561 -0
  478. package/src/domain/items/itemBonding.ts +93 -0
  479. package/src/domain/items/itemContainer.ts +245 -0
  480. package/src/domain/items/itemDisplayName.ts +33 -0
  481. package/src/domain/items/itemInstance.ts +181 -0
  482. package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
  483. package/src/domain/items/itemRandomProps.ts +77 -0
  484. package/src/domain/items/itemRestrictions.ts +329 -0
  485. package/src/domain/items/itemTeaches.ts +82 -0
  486. package/src/domain/items/itemUseCooldown.ts +52 -0
  487. package/src/domain/items/itemUseTarget.ts +90 -0
  488. package/src/domain/items/junkCategories.ts +174 -0
  489. package/src/domain/items/junkFilter.ts +368 -0
  490. package/src/domain/items/keyring.ts +131 -0
  491. package/src/domain/items/loot.ts +221 -0
  492. package/src/domain/items/mounts.ts +190 -0
  493. package/src/domain/items/onUsePayload.ts +102 -0
  494. package/src/domain/items/pendingLoot.ts +107 -0
  495. package/src/domain/items/relic.ts +105 -0
  496. package/src/domain/items/rocketBoots.ts +36 -0
  497. package/src/domain/items/sortContainer.ts +139 -0
  498. package/src/domain/items/spareContainers.ts +71 -0
  499. package/src/domain/items/spellReagentIndex.ts +131 -0
  500. package/src/domain/items/staleConsumables.ts +66 -0
  501. package/src/domain/items/weaponSpender.ts +110 -0
  502. package/src/domain/listDungeonIds.mjs +28 -0
  503. package/src/domain/macro/compose.ts +239 -0
  504. package/src/domain/macro/conditions.ts +260 -0
  505. package/src/domain/macro/creatureTypes.ts +40 -0
  506. package/src/domain/macro/describe.ts +169 -0
  507. package/src/domain/macro/icon.ts +60 -0
  508. package/src/domain/macro/index.ts +20 -0
  509. package/src/domain/macro/normalize.ts +112 -0
  510. package/src/domain/macro/parse.ts +316 -0
  511. package/src/domain/macro/plan.ts +288 -0
  512. package/src/domain/macro/rotation.ts +590 -0
  513. package/src/domain/macro/rotationEnv.ts +173 -0
  514. package/src/domain/macro/slots.ts +101 -0
  515. package/src/domain/macro/snapshot.ts +114 -0
  516. package/src/domain/macro/templates.ts +446 -0
  517. package/src/domain/macro/types.ts +70 -0
  518. package/src/domain/macro/units.ts +93 -0
  519. package/src/domain/macro/weaponTypes.ts +83 -0
  520. package/src/domain/nav/cityTeleports.ts +10 -0
  521. package/src/domain/nav/mounting.ts +113 -0
  522. package/src/domain/nav/nav.ts +43 -0
  523. package/src/domain/nav/navCollision.ts +606 -0
  524. package/src/domain/nav/navOutdoors.ts +91 -0
  525. package/src/domain/nav/navRegistry.ts +179 -0
  526. package/src/domain/nav/navRoomGraph.ts +302 -0
  527. package/src/domain/nav/navTypes.ts +43 -0
  528. package/src/domain/nav/navmesh.ts +1715 -0
  529. package/src/domain/nav/speed.ts +200 -0
  530. package/src/domain/nav/storey.ts +10 -0
  531. package/src/domain/nav/travel.ts +725 -0
  532. package/src/domain/nav/travelTypes.ts +75 -0
  533. package/src/domain/pet/pet.ts +1150 -0
  534. package/src/domain/pet/petActionBar.ts +180 -0
  535. package/src/domain/pet/petSpellbook.ts +39 -0
  536. package/src/domain/pet/petStable.ts +81 -0
  537. package/src/domain/professions/autoDisenchant.ts +236 -0
  538. package/src/domain/professions/characterEnchants.ts +176 -0
  539. package/src/domain/professions/craftCooldown.ts +52 -0
  540. package/src/domain/professions/enchantApply.ts +62 -0
  541. package/src/domain/professions/enchantTargets.ts +114 -0
  542. package/src/domain/professions/enchanting.ts +236 -0
  543. package/src/domain/professions/gatherFilter.ts +149 -0
  544. package/src/domain/professions/gearEnchant.ts +137 -0
  545. package/src/domain/professions/heldTools.ts +29 -0
  546. package/src/domain/professions/learnAllRecipes.ts +146 -0
  547. package/src/domain/professions/miningHarvest.ts +69 -0
  548. package/src/domain/professions/partyDisenchant.ts +294 -0
  549. package/src/domain/professions/partyWork.ts +83 -0
  550. package/src/domain/professions/pickpocket.ts +172 -0
  551. package/src/domain/professions/poisons.ts +240 -0
  552. package/src/domain/professions/professions.ts +677 -0
  553. package/src/domain/professions/rareNodes.ts +45 -0
  554. package/src/domain/professions/skinLoot.ts +27 -0
  555. package/src/domain/professions/vendorReagents.ts +152 -0
  556. package/src/domain/professions/weaponImbueHand.ts +171 -0
  557. package/src/domain/questFarmFilter.mjs +42 -0
  558. package/src/domain/quests/doQuest.ts +1204 -0
  559. package/src/domain/quests/gossip.ts +308 -0
  560. package/src/domain/quests/gossipTalk.ts +298 -0
  561. package/src/domain/quests/interpreter/canComplete.ts +150 -0
  562. package/src/domain/quests/interpreter/claim.ts +137 -0
  563. package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
  564. package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
  565. package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
  566. package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
  567. package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
  568. package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
  569. package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
  570. package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
  571. package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
  572. package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
  573. package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
  574. package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
  575. package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
  576. package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
  577. package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
  578. package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
  579. package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
  580. package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
  581. package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
  582. package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
  583. package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
  584. package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
  585. package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
  586. package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
  587. package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
  588. package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
  589. package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
  590. package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
  591. package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
  592. package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
  593. package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
  594. package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
  595. package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
  596. package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
  597. package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
  598. package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
  599. package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
  600. package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
  601. package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
  602. package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
  603. package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
  604. package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
  605. package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
  606. package/src/domain/quests/interpreter/diff.ts +349 -0
  607. package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
  608. package/src/domain/quests/interpreter/flags.ts +101 -0
  609. package/src/domain/quests/interpreter/index.ts +113 -0
  610. package/src/domain/quests/interpreter/live.ts +178 -0
  611. package/src/domain/quests/interpreter/types.ts +81 -0
  612. package/src/domain/quests/interpreter/updaters.ts +412 -0
  613. package/src/domain/quests/questCorpseUse.ts +155 -0
  614. package/src/domain/quests/questDialog.ts +43 -0
  615. package/src/domain/quests/questFight.ts +34 -0
  616. package/src/domain/quests/questObjectiveLabel.ts +39 -0
  617. package/src/domain/quests/questRewardChoice.ts +85 -0
  618. package/src/domain/quests/questScriptCredit.ts +26 -0
  619. package/src/domain/quests/questScriptItemUse.ts +74 -0
  620. package/src/domain/quests/questTameRods.ts +79 -0
  621. package/src/domain/quests/questlog.ts +1545 -0
  622. package/src/domain/quests/talkDeliver.ts +170 -0
  623. package/src/domain/raid/globalActionBar.ts +195 -0
  624. package/src/domain/raid/instanceRoster.ts +194 -0
  625. package/src/domain/raid/partySummon.ts +198 -0
  626. package/src/domain/raid/partyVault.ts +320 -0
  627. package/src/domain/raid/raidBossAbilities.ts +268 -0
  628. package/src/domain/raid/raidComp.ts +335 -0
  629. package/src/domain/raid/raidCustomRows.ts +453 -0
  630. package/src/domain/raid/raidEncounterGear.ts +298 -0
  631. package/src/domain/raid/raidEncounterTactics.ts +412 -0
  632. package/src/domain/raid/raidPlan.ts +509 -0
  633. package/src/domain/raid/raidPlanEdits.ts +98 -0
  634. package/src/domain/raid/raidPlanPacks.ts +480 -0
  635. package/src/domain/raid/raidRecovery.ts +183 -0
  636. package/src/domain/raid/raidRosterTemplate.ts +138 -0
  637. package/src/domain/rotation/auraSide.ts +68 -0
  638. package/src/domain/rotation/build.ts +3031 -0
  639. package/src/domain/rotation/classes/druid.ts +58 -0
  640. package/src/domain/rotation/classes/hooks.ts +59 -0
  641. package/src/domain/rotation/classes/hunter.ts +156 -0
  642. package/src/domain/rotation/classes/index.ts +104 -0
  643. package/src/domain/rotation/classes/mage.ts +99 -0
  644. package/src/domain/rotation/classes/paladin.ts +296 -0
  645. package/src/domain/rotation/classes/priest.ts +94 -0
  646. package/src/domain/rotation/classes/pullOpener.ts +92 -0
  647. package/src/domain/rotation/classes/rogue.ts +69 -0
  648. package/src/domain/rotation/classes/shaman.ts +29 -0
  649. package/src/domain/rotation/classes/supportSpec.ts +94 -0
  650. package/src/domain/rotation/classes/warlock.ts +81 -0
  651. package/src/domain/rotation/classes/warrior.ts +402 -0
  652. package/src/domain/rotation/classify.ts +1381 -0
  653. package/src/domain/rotation/condMetricPicker.ts +379 -0
  654. package/src/domain/rotation/consumables.ts +242 -0
  655. package/src/domain/rotation/evaluate.ts +1115 -0
  656. package/src/domain/rotation/finisherLadder.ts +145 -0
  657. package/src/domain/rotation/invent.ts +938 -0
  658. package/src/domain/rotation/killOrder.ts +30 -0
  659. package/src/domain/rotation/openerForm.ts +22 -0
  660. package/src/domain/rotation/paladinBuffs.ts +568 -0
  661. package/src/domain/rotation/prebuff.ts +283 -0
  662. package/src/domain/rotation/raidRowTuning.ts +34 -0
  663. package/src/domain/rotation/rotation.ts +11 -0
  664. package/src/domain/rotation/rotationProfiles.ts +180 -0
  665. package/src/domain/rotation/rotationSuggestions.ts +851 -0
  666. package/src/domain/rotation/ruleAfterChain.ts +49 -0
  667. package/src/domain/rotation/spec.ts +70 -0
  668. package/src/domain/rotation/spellPicker.ts +140 -0
  669. package/src/domain/rotation/stand.ts +143 -0
  670. package/src/domain/rotation/types.ts +718 -0
  671. package/src/domain/run/battlegroundRun.ts +111 -0
  672. package/src/domain/run/canEnterContext.ts +32 -0
  673. package/src/domain/run/death.ts +561 -0
  674. package/src/domain/run/deathRecovery.ts +289 -0
  675. package/src/domain/run/duel.ts +141 -0
  676. package/src/domain/run/dungeonRun.ts +344 -0
  677. package/src/domain/run/floorRest.ts +159 -0
  678. package/src/domain/run/honor.ts +557 -0
  679. package/src/domain/run/honorWeek.ts +180 -0
  680. package/src/domain/run/whenMap.ts +977 -0
  681. package/src/domain/scriptdev/arathiHighlands.ts +445 -0
  682. package/src/domain/scriptdev/ashenvale.ts +635 -0
  683. package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
  684. package/src/domain/scriptdev/azshara.ts +892 -0
  685. package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
  686. package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
  687. package/src/domain/scriptdev/blackrockSpire.ts +730 -0
  688. package/src/domain/scriptdev/blackwingLair.ts +521 -0
  689. package/src/domain/scriptdev/burningSteppes.ts +62 -0
  690. package/src/domain/scriptdev/classFilter.ts +43 -0
  691. package/src/domain/scriptdev/darkshore.ts +817 -0
  692. package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
  693. package/src/domain/scriptdev/deadmines.ts +331 -0
  694. package/src/domain/scriptdev/desolace.ts +1239 -0
  695. package/src/domain/scriptdev/direMaul.ts +859 -0
  696. package/src/domain/scriptdev/durotar.ts +532 -0
  697. package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
  698. package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
  699. package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
  700. package/src/domain/scriptdev/felwood.ts +1055 -0
  701. package/src/domain/scriptdev/feralas.ts +571 -0
  702. package/src/domain/scriptdev/feralasHelpers.ts +838 -0
  703. package/src/domain/scriptdev/gnomeregan.ts +466 -0
  704. package/src/domain/scriptdev/guards.ts +616 -0
  705. package/src/domain/scriptdev/hinterlands.ts +693 -0
  706. package/src/domain/scriptdev/host.ts +1134 -0
  707. package/src/domain/scriptdev/index.ts +123 -0
  708. package/src/domain/scriptdev/instanceRaids.ts +136 -0
  709. package/src/domain/scriptdev/itemScripts.ts +37 -0
  710. package/src/domain/scriptdev/lochModan.ts +283 -0
  711. package/src/domain/scriptdev/maraudon.ts +232 -0
  712. package/src/domain/scriptdev/moltenCore.ts +831 -0
  713. package/src/domain/scriptdev/moonglade.ts +659 -0
  714. package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
  715. package/src/domain/scriptdev/naxxramas.ts +577 -0
  716. package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
  717. package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
  718. package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
  719. package/src/domain/scriptdev/npcProfessions.ts +1025 -0
  720. package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
  721. package/src/domain/scriptdev/onyxiasLair.ts +313 -0
  722. package/src/domain/scriptdev/orgrimmar.ts +147 -0
  723. package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
  724. package/src/domain/scriptdev/razorfenDowns.ts +468 -0
  725. package/src/domain/scriptdev/razorfenKraul.ts +410 -0
  726. package/src/domain/scriptdev/redridgeMountains.ts +163 -0
  727. package/src/domain/scriptdev/registry.ts +945 -0
  728. package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
  729. package/src/domain/scriptdev/scarletMonastery.ts +713 -0
  730. package/src/domain/scriptdev/scholomance.ts +682 -0
  731. package/src/domain/scriptdev/searingGorge.ts +295 -0
  732. package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
  733. package/src/domain/scriptdev/silithus.ts +71 -0
  734. package/src/domain/scriptdev/silverpineForest.ts +662 -0
  735. package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
  736. package/src/domain/scriptdev/stormwindCity.ts +1192 -0
  737. package/src/domain/scriptdev/stranglethornVale.ts +402 -0
  738. package/src/domain/scriptdev/stratholme.ts +650 -0
  739. package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
  740. package/src/domain/scriptdev/sunkenTemple.ts +736 -0
  741. package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
  742. package/src/domain/scriptdev/tanaris.ts +391 -0
  743. package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
  744. package/src/domain/scriptdev/teldrassil.ts +143 -0
  745. package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
  746. package/src/domain/scriptdev/theBarrens.ts +709 -0
  747. package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
  748. package/src/domain/scriptdev/thousandNeedles.ts +426 -0
  749. package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
  750. package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
  751. package/src/domain/scriptdev/types.ts +1026 -0
  752. package/src/domain/scriptdev/uldaman.ts +437 -0
  753. package/src/domain/scriptdev/ungoroCrater.ts +549 -0
  754. package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
  755. package/src/domain/scriptdev/wailingCaverns.ts +700 -0
  756. package/src/domain/scriptdev/warEffort.ts +371 -0
  757. package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
  758. package/src/domain/scriptdev/westfall.ts +767 -0
  759. package/src/domain/scriptdev/wetlands.ts +660 -0
  760. package/src/domain/scriptdev/winterspring.ts +482 -0
  761. package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
  762. package/src/domain/scriptdev/worldBosses.ts +605 -0
  763. package/src/domain/scriptdev/zulfarrak.ts +478 -0
  764. package/src/domain/scriptdev/zulgurub.ts +1152 -0
  765. package/src/domain/sim/dummySim.ts +408 -0
  766. package/src/domain/sim/targetDummy.ts +29 -0
  767. package/src/domain/social/guild.ts +148 -0
  768. package/src/domain/spells/areaAuraMembership.ts +93 -0
  769. package/src/domain/spells/breakableStunCc.ts +166 -0
  770. package/src/domain/spells/cancelAura.ts +80 -0
  771. package/src/domain/spells/diminishing.ts +167 -0
  772. package/src/domain/spells/dispel.ts +149 -0
  773. package/src/domain/spells/dispelMechanic.ts +105 -0
  774. package/src/domain/spells/equipSpells.ts +247 -0
  775. package/src/domain/spells/learnOnTargets.ts +260 -0
  776. package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
  777. package/src/domain/spells/resurrectSpell.ts +124 -0
  778. package/src/domain/spells/spellPushback.ts +39 -0
  779. package/src/domain/spells/spellReflect.ts +43 -0
  780. package/src/domain/spells/stealth.ts +183 -0
  781. package/src/domain/spells/totem.ts +394 -0
  782. package/src/domain/spells/worldCast.ts +187 -0
  783. package/src/domain/world/areaTriggerLocks.ts +177 -0
  784. package/src/domain/world/dungeonMusic.ts +108 -0
  785. package/src/domain/world/gameEvents.ts +119 -0
  786. package/src/domain/world/gameObjects.ts +1030 -0
  787. package/src/domain/world/goEventFire.ts +234 -0
  788. package/src/domain/world/goMoTransport.ts +74 -0
  789. package/src/domain/world/goTransport.ts +81 -0
  790. package/src/domain/world/hazards.ts +459 -0
  791. package/src/domain/world/openLock.ts +398 -0
  792. package/src/domain/world/pools.ts +470 -0
  793. package/src/domain/world/restArea.ts +37 -0
  794. package/src/domain/world/weather.ts +201 -0
  795. package/src/domain/zoneAmbience.mjs +87 -0
  796. package/src/domain/zoneMusic.mjs +62 -0
  797. package/src/domain/zoneMusicQueue.mjs +7 -0
  798. package/src/engine/combat/activeSeal.ts +39 -0
  799. package/src/engine/combat/aiTargetResolve.ts +64 -0
  800. package/src/engine/combat/aoeCast.ts +289 -0
  801. package/src/engine/combat/applyConsumeAura.ts +74 -0
  802. package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
  803. package/src/engine/combat/applyDispelMechanic.ts +30 -0
  804. package/src/engine/combat/applyHealEffect.ts +301 -0
  805. package/src/engine/combat/applySchoolAbsorb.ts +114 -0
  806. package/src/engine/combat/applySpell.ts +3169 -0
  807. package/src/engine/combat/applySpellLate.ts +2026 -0
  808. package/src/engine/combat/applySpellLateBag.ts +144 -0
  809. package/src/engine/combat/areaAura.ts +283 -0
  810. package/src/engine/combat/attackTable.ts +508 -0
  811. package/src/engine/combat/battleRez.ts +87 -0
  812. package/src/engine/combat/castAction.ts +36 -0
  813. package/src/engine/combat/castTargetGates.ts +75 -0
  814. package/src/engine/combat/castableKit.ts +68 -0
  815. package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
  816. package/src/engine/combat/chainFan.ts +210 -0
  817. package/src/engine/combat/channel.ts +423 -0
  818. package/src/engine/combat/chaseCloseness.ts +95 -0
  819. package/src/engine/combat/cmangosCastGates.ts +129 -0
  820. package/src/engine/combat/combatFlag.ts +77 -0
  821. package/src/engine/combat/combatGeometry.ts +1329 -0
  822. package/src/engine/combat/combustion.ts +68 -0
  823. package/src/engine/combat/context.ts +730 -0
  824. package/src/engine/combat/createSession.ts +1165 -0
  825. package/src/engine/combat/creatureLeash.ts +38 -0
  826. package/src/engine/combat/crowdControl.ts +1259 -0
  827. package/src/engine/combat/dispelDuty.ts +54 -0
  828. package/src/engine/combat/dispelReflect.ts +609 -0
  829. package/src/engine/combat/displaceFloor.ts +113 -0
  830. package/src/engine/combat/duelBounds.ts +47 -0
  831. package/src/engine/combat/equippedItemGate.ts +297 -0
  832. package/src/engine/combat/evadeLifecycle.ts +63 -0
  833. package/src/engine/combat/eventAi.ts +2220 -0
  834. package/src/engine/combat/facing.ts +74 -0
  835. package/src/engine/combat/fearFlee.ts +137 -0
  836. package/src/engine/combat/fighterFactory.ts +1144 -0
  837. package/src/engine/combat/forceDespawnAction.ts +51 -0
  838. package/src/engine/combat/formulas.ts +807 -0
  839. package/src/engine/combat/friendlyFan.ts +55 -0
  840. package/src/engine/combat/groundPoolTick.ts +210 -0
  841. package/src/engine/combat/hazards.ts +114 -0
  842. package/src/engine/combat/healTargets.ts +226 -0
  843. package/src/engine/combat/heartbeatResist.ts +49 -0
  844. package/src/engine/combat/hostileItemUse.ts +75 -0
  845. package/src/engine/combat/interruptAuras.ts +66 -0
  846. package/src/engine/combat/itemRescue.ts +49 -0
  847. package/src/engine/combat/itemUse.ts +260 -0
  848. package/src/engine/combat/kitById.ts +23 -0
  849. package/src/engine/combat/knockBack.ts +201 -0
  850. package/src/engine/combat/leap.ts +89 -0
  851. package/src/engine/combat/mitigation.ts +587 -0
  852. package/src/engine/combat/modTaunt.ts +43 -0
  853. package/src/engine/combat/motionClaim.ts +268 -0
  854. package/src/engine/combat/motionGate.ts +150 -0
  855. package/src/engine/combat/motionGenerator.ts +27 -0
  856. package/src/engine/combat/navSight.ts +138 -0
  857. package/src/engine/combat/perfSink.ts +28 -0
  858. package/src/engine/combat/periodicDue.ts +55 -0
  859. package/src/engine/combat/petAuras.ts +86 -0
  860. package/src/engine/combat/pickAction.ts +3449 -0
  861. package/src/engine/combat/powerForm.ts +735 -0
  862. package/src/engine/combat/powerPools.ts +49 -0
  863. package/src/engine/combat/predicates.ts +538 -0
  864. package/src/engine/combat/procsDamage.ts +1823 -0
  865. package/src/engine/combat/reactiveGates.ts +135 -0
  866. package/src/engine/combat/roles.ts +389 -0
  867. package/src/engine/combat/rotationSubject.ts +78 -0
  868. package/src/engine/combat/ruleAfter.ts +106 -0
  869. package/src/engine/combat/seedDisplayAuras.ts +203 -0
  870. package/src/engine/combat/seedOocEffects.ts +317 -0
  871. package/src/engine/combat/seedSchoolImmunities.ts +45 -0
  872. package/src/engine/combat/session-types.ts +458 -0
  873. package/src/engine/combat/sessionApi.ts +1785 -0
  874. package/src/engine/combat/sessionCharge.ts +124 -0
  875. package/src/engine/combat/sessionChase.ts +869 -0
  876. package/src/engine/combat/sessionDeaths.ts +469 -0
  877. package/src/engine/combat/sessionFocus.ts +506 -0
  878. package/src/engine/combat/sessionFollow.ts +167 -0
  879. package/src/engine/combat/sessionGeometry.ts +188 -0
  880. package/src/engine/combat/sessionHome.ts +75 -0
  881. package/src/engine/combat/sessionInject.ts +719 -0
  882. package/src/engine/combat/sessionMechanicMove.ts +555 -0
  883. package/src/engine/combat/sessionMotion.ts +1553 -0
  884. package/src/engine/combat/sessionMotionKit.ts +247 -0
  885. package/src/engine/combat/sessionMoveIntent.ts +49 -0
  886. package/src/engine/combat/sessionMoveOrder.ts +200 -0
  887. package/src/engine/combat/sessionPathTo.ts +657 -0
  888. package/src/engine/combat/sessionPools.ts +688 -0
  889. package/src/engine/combat/sessionSteer.ts +144 -0
  890. package/src/engine/combat/sessionStepBack.ts +151 -0
  891. package/src/engine/combat/sessionStepWrap.ts +116 -0
  892. package/src/engine/combat/sessionView.ts +442 -0
  893. package/src/engine/combat/simEffects.ts +32 -0
  894. package/src/engine/combat/simFacade.ts +620 -0
  895. package/src/engine/combat/simPump.ts +264 -0
  896. package/src/engine/combat/simSnapshot.ts +165 -0
  897. package/src/engine/combat/simThreadPool.ts +35 -0
  898. package/src/engine/combat/skeramImages.ts +57 -0
  899. package/src/engine/combat/slowUpdate.ts +178 -0
  900. package/src/engine/combat/snapToFloor.ts +42 -0
  901. package/src/engine/combat/speedAura.ts +29 -0
  902. package/src/engine/combat/spellReagents.ts +71 -0
  903. package/src/engine/combat/stealthDetect.ts +93 -0
  904. package/src/engine/combat/stepBackMotion.ts +171 -0
  905. package/src/engine/combat/stepSession.ts +3102 -0
  906. package/src/engine/combat/summonCast.ts +243 -0
  907. package/src/engine/combat/thaddiusPolarity.ts +97 -0
  908. package/src/engine/combat/threat.ts +388 -0
  909. package/src/engine/combat/threatOps.ts +272 -0
  910. package/src/engine/combat/tickWorkerBody.ts +211 -0
  911. package/src/engine/combat/totemAuras.ts +122 -0
  912. package/src/engine/combat/triggerPayload.ts +42 -0
  913. package/src/engine/combat/triggeredCompanion.ts +63 -0
  914. package/src/engine/combat/types.ts +1897 -0
  915. package/src/engine/combat/useObjectTrap.ts +140 -0
  916. package/src/engine/combat/walkSurface.ts +54 -0
  917. package/src/engine/combat/weapon.ts +1248 -0
  918. package/src/engine/combat/worldFrame.ts +43 -0
  919. package/src/engine/combat.solo-golden.json +2242 -0
  920. package/src/engine/combat.ts +84 -0
  921. package/src/engine/core/detMath.ts +289 -0
  922. package/src/engine/core/events.ts +357 -0
  923. package/src/engine/core/rng.ts +36 -0
  924. package/src/engine/game/actionBars.ts +124 -0
  925. package/src/engine/game/activateObjectFromSpell.ts +320 -0
  926. package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
  927. package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
  928. package/src/engine/game/applyDoorFromDbScript.ts +388 -0
  929. package/src/engine/game/applyEscortFromDbScript.ts +290 -0
  930. package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
  931. package/src/engine/game/applyHoverFromDbScript.ts +110 -0
  932. package/src/engine/game/applyOocResurrect.ts +71 -0
  933. package/src/engine/game/applySpellDurability.ts +115 -0
  934. package/src/engine/game/applyTailFromDbScript.ts +478 -0
  935. package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
  936. package/src/engine/game/auctionMail.ts +269 -0
  937. package/src/engine/game/bagOverflow.ts +130 -0
  938. package/src/engine/game/bank.ts +110 -0
  939. package/src/engine/game/barAutofill.ts +26 -0
  940. package/src/engine/game/battleground.ts +369 -0
  941. package/src/engine/game/combatEnemySpec.ts +216 -0
  942. package/src/engine/game/combatObjectTraps.ts +167 -0
  943. package/src/engine/game/combatSeed.ts +320 -0
  944. package/src/engine/game/combatSession.ts +3241 -0
  945. package/src/engine/game/combatSessionClock.ts +62 -0
  946. package/src/engine/game/companionQuestActions.ts +242 -0
  947. package/src/engine/game/companionTraining.ts +40 -0
  948. package/src/engine/game/consumables.ts +624 -0
  949. package/src/engine/game/context.ts +53 -0
  950. package/src/engine/game/createHealthstone.ts +45 -0
  951. package/src/engine/game/deathFlow.ts +127 -0
  952. package/src/engine/game/devGrant.ts +117 -0
  953. package/src/engine/game/dynamicObject.ts +365 -0
  954. package/src/engine/game/enchantItem.ts +177 -0
  955. package/src/engine/game/equipmentHelper.ts +806 -0
  956. package/src/engine/game/factionState.ts +108 -0
  957. package/src/engine/game/garmentsOoc.ts +69 -0
  958. package/src/engine/game/globalActionBar.ts +179 -0
  959. package/src/engine/game/goInteractQuestCredit.ts +51 -0
  960. package/src/engine/game/goMoTransportUse.ts +61 -0
  961. package/src/engine/game/goTransportUse.ts +60 -0
  962. package/src/engine/game/healthstoneUpkeep.ts +59 -0
  963. package/src/engine/game/killSkin.ts +124 -0
  964. package/src/engine/game/learnFromItem.ts +118 -0
  965. package/src/engine/game/loadReconcile.ts +551 -0
  966. package/src/engine/game/loot.ts +294 -0
  967. package/src/engine/game/macros.ts +125 -0
  968. package/src/engine/game/mail.ts +293 -0
  969. package/src/engine/game/meetingStoneQueue.ts +75 -0
  970. package/src/engine/game/meetingStoneUse.ts +54 -0
  971. package/src/engine/game/newGameState.ts +363 -0
  972. package/src/engine/game/oocAuraInterrupt.ts +92 -0
  973. package/src/engine/game/oocCast.ts +241 -0
  974. package/src/engine/game/oocCastEffects.ts +803 -0
  975. package/src/engine/game/oocCastMethods.ts +1077 -0
  976. package/src/engine/game/openLockFromSpell.ts +174 -0
  977. package/src/engine/game/outdoorPvp.ts +187 -0
  978. package/src/engine/game/outfitter.ts +644 -0
  979. package/src/engine/game/paladinBoard.ts +393 -0
  980. package/src/engine/game/partyAuras.ts +121 -0
  981. package/src/engine/game/persistCombatAuras.ts +91 -0
  982. package/src/engine/game/pets.ts +459 -0
  983. package/src/engine/game/prePullHealthstones.ts +154 -0
  984. package/src/engine/game/professions.ts +2227 -0
  985. package/src/engine/game/pruneStaleRuntime.ts +39 -0
  986. package/src/engine/game/questFightCredit.ts +36 -0
  987. package/src/engine/game/questItemOnCorpse.ts +166 -0
  988. package/src/engine/game/questItemOnCreature.ts +103 -0
  989. package/src/engine/game/questLog.ts +879 -0
  990. package/src/engine/game/questSpellComplete.ts +21 -0
  991. package/src/engine/game/questTurnIn.ts +598 -0
  992. package/src/engine/game/raidParty.ts +32 -0
  993. package/src/engine/game/reagentBuyIn.ts +39 -0
  994. package/src/engine/game/regenRest.ts +186 -0
  995. package/src/engine/game/rotation.ts +425 -0
  996. package/src/engine/game/runFullDungeon.ts +611 -0
  997. package/src/engine/game/runSupply.ts +80 -0
  998. package/src/engine/game/sanitizeDriftedItems.ts +135 -0
  999. package/src/engine/game/scriptDevGoUse.ts +397 -0
  1000. package/src/engine/game/scriptDevInnkeeper.ts +150 -0
  1001. package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
  1002. package/src/engine/game/sendEventFromSpell.ts +87 -0
  1003. package/src/engine/game/sortContainers.ts +85 -0
  1004. package/src/engine/game/spellReputation.ts +69 -0
  1005. package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
  1006. package/src/engine/game/squadDungeon.ts +4222 -0
  1007. package/src/engine/game/squadQuestShare.ts +260 -0
  1008. package/src/engine/game/summonObjectSlot.ts +69 -0
  1009. package/src/engine/game/summonObjectWild.ts +73 -0
  1010. package/src/engine/game/summoningRitualUse.ts +141 -0
  1011. package/src/engine/game/talents.ts +356 -0
  1012. package/src/engine/game/tamingRodUse.ts +66 -0
  1013. package/src/engine/game/tempSpawnCreature.ts +136 -0
  1014. package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
  1015. package/src/engine/game/tickTimedQuests.ts +28 -0
  1016. package/src/engine/game/trade.ts +586 -0
  1017. package/src/engine/game/travel.ts +1155 -0
  1018. package/src/engine/game/types.ts +1855 -0
  1019. package/src/engine/game/vendorOffers.ts +244 -0
  1020. package/src/engine/game/weaponImbueItem.ts +281 -0
  1021. package/src/engine/game/worldSession.ts +183 -0
  1022. package/src/engine/game/worldState.ts +166 -0
  1023. package/src/engine/game.ts +968 -0
  1024. package/src/engine/spells/GAP.md +67 -0
  1025. package/src/engine/spells/absorbs.ts +376 -0
  1026. package/src/engine/spells/addTargetTrigger.ts +53 -0
  1027. package/src/engine/spells/auraPerSecondCost.ts +50 -0
  1028. package/src/engine/spells/auraStacking.ts +497 -0
  1029. package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
  1030. package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
  1031. package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
  1032. package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
  1033. package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
  1034. package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
  1035. package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
  1036. package/src/engine/spells/cmangos-special-cases.ts +1570 -0
  1037. package/src/engine/spells/conditions.ts +718 -0
  1038. package/src/engine/spells/effects.ts +203 -0
  1039. package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
  1040. package/src/engine/spells/immunity.ts +942 -0
  1041. package/src/engine/spells/intentEffects.ts +351 -0
  1042. package/src/engine/spells/interpreter/GAPS.md +21 -0
  1043. package/src/engine/spells/interpreter/amount.ts +109 -0
  1044. package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
  1045. package/src/engine/spells/interpreter/diff.ts +246 -0
  1046. package/src/engine/spells/interpreter/duration.ts +90 -0
  1047. package/src/engine/spells/interpreter/form-attrs.json +1 -0
  1048. package/src/engine/spells/interpreter/form-attrs.ts +95 -0
  1049. package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
  1050. package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
  1051. package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
  1052. package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
  1053. package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
  1054. package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
  1055. package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
  1056. package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
  1057. package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
  1058. package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
  1059. package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
  1060. package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
  1061. package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
  1062. package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
  1063. package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
  1064. package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
  1065. package/src/engine/spells/interpreter/handlers.ts +9 -0
  1066. package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
  1067. package/src/engine/spells/interpreter/index.ts +525 -0
  1068. package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
  1069. package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
  1070. package/src/engine/spells/interpreter/mage-portals.ts +37 -0
  1071. package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
  1072. package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
  1073. package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
  1074. package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
  1075. package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
  1076. package/src/engine/spells/interpreter/opcodes.ts +789 -0
  1077. package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
  1078. package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
  1079. package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
  1080. package/src/engine/spells/interpreter/proc.ts +443 -0
  1081. package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
  1082. package/src/engine/spells/interpreter/registry/index.ts +216 -0
  1083. package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
  1084. package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
  1085. package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
  1086. package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
  1087. package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
  1088. package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
  1089. package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
  1090. package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
  1091. package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
  1092. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
  1093. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
  1094. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
  1095. package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
  1096. package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
  1097. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
  1098. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
  1099. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
  1100. package/src/engine/spells/interpreter/registry/types.ts +48 -0
  1101. package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
  1102. package/src/engine/spells/interpreter/targeting.ts +90 -0
  1103. package/src/engine/spells/interpreter/types-intent.ts +1501 -0
  1104. package/src/engine/spells/interpreter/types.ts +419 -0
  1105. package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
  1106. package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
  1107. package/src/engine/spells/interrupt.ts +217 -0
  1108. package/src/engine/spells/meleeAttackReset.ts +60 -0
  1109. package/src/engine/spells/oocTriggerSpell.ts +49 -0
  1110. package/src/engine/spells/overrideClassScripts.ts +319 -0
  1111. package/src/engine/spells/parryHaste.ts +20 -0
  1112. package/src/engine/spells/procs.ts +300 -0
  1113. package/src/engine/spells/recovery.ts +203 -0
  1114. package/src/engine/spells/scriptTargetDest.ts +76 -0
  1115. package/src/engine/spells/scriptTargets.ts +85 -0
  1116. package/src/engine/spells/singleTargetAura.ts +82 -0
  1117. package/src/engine/spells/specialCasePayloads.ts +57 -0
  1118. package/src/engine/spells/spellAttributes.ts +249 -0
  1119. package/src/engine/spells/spellBonus.ts +143 -0
  1120. package/src/engine/spells/spellModIntents.ts +419 -0
  1121. package/src/engine/spells/spellMods.ts +283 -0
  1122. package/src/engine/spells/spellRadius.ts +15 -0
  1123. package/src/engine/spells/trapObjects.ts +26 -0
  1124. package/src/json.d.ts +7 -0
  1125. package/src/persistence/memoryRepository.ts +23 -0
  1126. package/src/persistence/saveBackups.ts +162 -0
  1127. package/src/persistence/saveFile.ts +68 -0
  1128. package/src/persistence/saveRepository.ts +11 -0
  1129. package/src/persistence/saveShape.ts +668 -0
  1130. package/src/progression/leveling.ts +89 -0
  1131. package/src/progression/rest.ts +1434 -0
  1132. package/src/progression/training.ts +226 -0
  1133. package/src/progression/xpGain.ts +369 -0
  1134. package/src/quests/quests.ts +1580 -0
  1135. package/src/world/aoePull.ts +198 -0
  1136. package/src/world/areaTableDbc.ts +39 -0
  1137. package/src/world/areaTableMapIdPairs.ts +141 -0
  1138. package/src/world/bakeSlug.ts +43 -0
  1139. package/src/world/continuousDungeon.ts +1250 -0
  1140. package/src/world/dungeonBakeProjection.ts +190 -0
  1141. package/src/world/dungeonMapDensity.ts +342 -0
  1142. package/src/world/dungeonMapProjection.ts +135 -0
  1143. package/src/world/dungeonNav.ts +904 -0
  1144. package/src/world/dungeonNpcSim.ts +147 -0
  1145. package/src/world/dungeonObjectives.ts +234 -0
  1146. package/src/world/dungeonPreset.ts +35 -0
  1147. package/src/world/dungeonRoute.ts +311 -0
  1148. package/src/world/dungeonRouteGeometry.ts +732 -0
  1149. package/src/world/dungeonRouteOrder.ts +1037 -0
  1150. package/src/world/dungeonWingRooms.ts +426 -0
  1151. package/src/world/escort.ts +296 -0
  1152. package/src/world/goPoolRoll.ts +75 -0
  1153. package/src/world/instanceObjects.ts +785 -0
  1154. package/src/world/instances.ts +1572 -0
  1155. package/src/world/meetingStones.ts +56 -0
  1156. package/src/world/navmeshFloors.ts +145 -0
  1157. package/src/world/nearGrid.ts +167 -0
  1158. package/src/world/packBudget.ts +613 -0
  1159. package/src/world/rareRoll.ts +335 -0
  1160. package/src/world/routeAuthoring.ts +132 -0
  1161. package/src/world/routeEdit.ts +209 -0
  1162. package/src/world/world.ts +812 -0
  1163. package/src/world/zoneHazards.ts +47 -0
@@ -0,0 +1,817 @@
1
+ // Classic hunter ammo pipeline — pure helpers, with no invented DPS or levels: callers pass
2
+ // ItemDef fields from the bake. Cite: Player.cpp _ApplyAmmoBonuses 7591–7621; Spell.cpp TakeAmmo.
3
+
4
+ import type { DataStore } from '../../data/dataStore.ts';
5
+ import type { ItemDef } from '../../data/schema.ts';
6
+ import type { Character } from '../character/character.ts';
7
+ import { equippedEntry } from './itemInstance.ts';
8
+ import { BAG_SLOTS } from './equipment.ts';
9
+ import type { Inventory } from './inventory.ts';
10
+ import { BACKPACK_SLOTS, addItem, countItem, removeItem } from './inventory.ts';
11
+
12
+ // ---- ItemPrototype.h constants (Classic 1.12) --------------------------------
13
+
14
+ /** ITEM_CLASS_PROJECTILE */
15
+ export const ITEM_CLASS_PROJECTILE = 6;
16
+ /** ITEM_CLASS_WEAPON */
17
+ export const ITEM_CLASS_WEAPON = 2;
18
+ /** ITEM_CLASS_QUIVER */
19
+ export const ITEM_CLASS_QUIVER = 11;
20
+
21
+ /** ITEM_SUBCLASS_ARROW / BULLET (class 6) */
22
+ export const ITEM_SUBCLASS_ARROW = 2;
23
+ export const ITEM_SUBCLASS_BULLET = 3;
24
+
25
+ /** Weapon subclasses that interact with ammo (ItemPrototype.h ~197–214) */
26
+ export const ITEM_SUBCLASS_WEAPON_BOW = 2;
27
+ export const ITEM_SUBCLASS_WEAPON_GUN = 3;
28
+ export const ITEM_SUBCLASS_WEAPON_THROWN = 16;
29
+ export const ITEM_SUBCLASS_WEAPON_CROSSBOW = 18;
30
+ export const ITEM_SUBCLASS_WEAPON_WAND = 19;
31
+
32
+ /** Quiver subclasses (class 11) */
33
+ export const ITEM_SUBCLASS_QUIVER = 2;
34
+ export const ITEM_SUBCLASS_AMMO_POUCH = 3;
35
+
36
+ /** BagFamily: ARROWS=1, BULLETS=2 (ItemPrototype.h ~95–104) */
37
+ export const BAG_FAMILY_ARROWS = 1;
38
+ export const BAG_FAMILY_BULLETS = 2;
39
+
40
+ /** INVTYPE_AMMO = 24; INVTYPE_THROWN = 25; INVTYPE_QUIVER = 27 (often 18 on class-11 in DB) */
41
+ export const INVTYPE_AMMO = 24;
42
+ export const INVTYPE_THROWN = 25;
43
+
44
+ // ---- Failure reasons (source-aligned strings for domain/game) ----------------
45
+
46
+ export const AMMO_ERR = {
47
+ DEAD: 'You are dead',
48
+ ONLY_AMMO: 'Only ammo can go here',
49
+ NOT_FOUND: 'Item not found',
50
+ LEVEL: (lvl: number) => `Requires level ${lvl}`,
51
+ CLASS: 'Your class cannot use that',
52
+ NO_AMMO: 'Out of ammo',
53
+ ONLY1_QUIVER: 'You can only equip one quiver',
54
+ ONLY1_AMMOPOUCH: 'You can only equip one ammo pouch',
55
+ BAG_FAMILY: 'That item cannot go in this bag',
56
+ } as const;
57
+
58
+ // ---- Type helpers ------------------------------------------------------------
59
+
60
+ /** Resolve weapon subclass from ItemDef (weaponSubclass preferred; typeName fallback). */
61
+ export function weaponSubclassOf(item: ItemDef | undefined): number | undefined {
62
+ if (!item) return undefined;
63
+ if (item.weaponSubclass != null) return item.weaponSubclass;
64
+ // typeName fallback for fixtures / pre-subclass bakes
65
+ switch (item.typeName) {
66
+ case 'Bow': return ITEM_SUBCLASS_WEAPON_BOW;
67
+ case 'Gun': return ITEM_SUBCLASS_WEAPON_GUN;
68
+ case 'Crossbow': return ITEM_SUBCLASS_WEAPON_CROSSBOW;
69
+ case 'Wand': return ITEM_SUBCLASS_WEAPON_WAND;
70
+ case 'Thrown': return ITEM_SUBCLASS_WEAPON_THROWN;
71
+ default: return undefined;
72
+ }
73
+ }
74
+
75
+ /** Projectile subclass (arrow=2 / bullet=3) from ItemDef. */
76
+ export function projectileSubclassOf(item: ItemDef | undefined): number | undefined {
77
+ if (!item) return undefined;
78
+ if (item.itemSubclass != null && (
79
+ item.itemClass === ITEM_CLASS_PROJECTILE
80
+ || item.ammoDps
81
+ || item.inventoryType === INVTYPE_AMMO
82
+ )) {
83
+ return item.itemSubclass;
84
+ }
85
+ // bagFamily mirrors arrow/bullet when subclass not baked
86
+ if (item.bagFamily === BAG_FAMILY_ARROWS) return ITEM_SUBCLASS_ARROW;
87
+ if (item.bagFamily === BAG_FAMILY_BULLETS) return ITEM_SUBCLASS_BULLET;
88
+ return undefined;
89
+ }
90
+
91
+ /** True when item is INVTYPE_AMMO / class-6 projectile (CanUseAmmo inventory-type gate). */
92
+ export function isAmmoItem(item: ItemDef | undefined): boolean {
93
+ if (!item) return false;
94
+ if (item.inventoryType === INVTYPE_AMMO) return true;
95
+ if (item.itemClass === ITEM_CLASS_PROJECTILE) return true;
96
+ // Pre-class bake: ammoDps is only set on class-6 projectiles (enrich-item-economy).
97
+ return !!item.ammoDps;
98
+ }
99
+
100
+ /** True when weapon needs projectile ammo (bow/gun/crossbow). Wand and thrown do not. */
101
+ export function weaponNeedsProjectileAmmo(weapon: ItemDef | undefined): boolean {
102
+ const sub = weaponSubclassOf(weapon);
103
+ return (
104
+ sub === ITEM_SUBCLASS_WEAPON_BOW
105
+ || sub === ITEM_SUBCLASS_WEAPON_GUN
106
+ || sub === ITEM_SUBCLASS_WEAPON_CROSSBOW
107
+ );
108
+ }
109
+
110
+ export function weaponIsWand(weapon: ItemDef | undefined): boolean {
111
+ return weaponSubclassOf(weapon) === ITEM_SUBCLASS_WEAPON_WAND;
112
+ }
113
+
114
+ export function weaponIsThrown(weapon: ItemDef | undefined): boolean {
115
+ if (!weapon) return false;
116
+ const sub = weaponSubclassOf(weapon);
117
+ if (sub === ITEM_SUBCLASS_WEAPON_THROWN) return true;
118
+ if (weapon.inventoryType === INVTYPE_THROWN) return true;
119
+ return weapon.typeName === 'Thrown';
120
+ }
121
+
122
+ /** Class-11 quiver or ammo pouch. */
123
+ export function isQuiverOrPouch(item: ItemDef | undefined): boolean {
124
+ if (!item) return false;
125
+ if (item.itemClass === ITEM_CLASS_QUIVER) return true;
126
+ // Fallback: subclass + bag slot when itemClass not yet baked
127
+ if (item.slot === 'bag' && item.itemSubclass != null) {
128
+ return item.itemSubclass === ITEM_SUBCLASS_QUIVER || item.itemSubclass === ITEM_SUBCLASS_AMMO_POUCH;
129
+ }
130
+ return false;
131
+ }
132
+
133
+ export function isQuiver(item: ItemDef | undefined): boolean {
134
+ if (!isQuiverOrPouch(item)) return false;
135
+ return (item!.itemSubclass ?? -1) === ITEM_SUBCLASS_QUIVER;
136
+ }
137
+
138
+ export function isAmmoPouch(item: ItemDef | undefined): boolean {
139
+ if (!isQuiverOrPouch(item)) return false;
140
+ return (item!.itemSubclass ?? -1) === ITEM_SUBCLASS_AMMO_POUCH;
141
+ }
142
+
143
+ // ---- CanUseAmmo / SetAmmo / RemoveAmmo ----------------------------------------
144
+
145
+ export interface CanUseAmmoResult {
146
+ ok: boolean;
147
+ reason?: string;
148
+ }
149
+
150
+ // Player::CanUseAmmo — alive + INVTYPE_AMMO + CanUseItem (level / class). Cite: Player.cpp 9805–9830.
151
+ // Skill/spell/honor gates omitted when data absent.
152
+ export function canUseAmmo(
153
+ char: Pick<Character, 'level' | 'cls' | 'health'>,
154
+ item: ItemDef | undefined,
155
+ ): CanUseAmmoResult {
156
+ if (!item) return { ok: false, reason: AMMO_ERR.NOT_FOUND };
157
+ // Alive: health > 0 when tracked; absent health treated as alive (fixtures).
158
+ if (char.health != null && !(char.health > 0)) return { ok: false, reason: AMMO_ERR.DEAD };
159
+ if (!isAmmoItem(item)) return { ok: false, reason: AMMO_ERR.ONLY_AMMO };
160
+ if (char.level < (item.requiredLevel ?? 0)) {
161
+ return { ok: false, reason: AMMO_ERR.LEVEL(item.requiredLevel ?? 0) };
162
+ }
163
+ if (item.allowClass && !item.allowClass.includes(char.cls)) {
164
+ return { ok: false, reason: AMMO_ERR.CLASS };
165
+ }
166
+ return { ok: true };
167
+ }
168
+
169
+ /** Pure SetAmmo: returns new char with ammoItem set, or error. Cite: Player.cpp SetAmmo 9832–9855. */
170
+ export function setAmmo(
171
+ char: Character,
172
+ ds: DataStore,
173
+ entry: number,
174
+ ): { ok: true; char: Character } | { ok: false; reason: string; char: Character } {
175
+ if (!entry) return { ok: false, reason: AMMO_ERR.NOT_FOUND, char };
176
+ const item = ds.item(entry);
177
+ const gate = canUseAmmo(char, item);
178
+ if (!gate.ok) return { ok: false, reason: gate.reason ?? AMMO_ERR.NOT_FOUND, char };
179
+ if (char.ammoItem === entry) return { ok: true, char };
180
+ return { ok: true, char: { ...char, ammoItem: entry } };
181
+ }
182
+
183
+ // Pure RemoveAmmo: clear selection (DPS zeroed by buildCombatant when ammoItem absent). Cite: Player.cpp
184
+ // RemoveAmmo 9857–9866.
185
+ export function removeAmmo(char: Character): Character {
186
+ if (char.ammoItem == null) return char;
187
+ const next = { ...char };
188
+ delete next.ammoItem;
189
+ return next;
190
+ }
191
+
192
+ // ---- Compatibility + DPS -----------------------------------------------------
193
+
194
+ /** Player::CheckAmmoCompatibility — bow/xbow→arrow, gun→bullet; else false. Cite: Player.cpp 7623–7654. */
195
+ export function checkAmmoCompatibility(
196
+ weapon: ItemDef | undefined,
197
+ ammo: ItemDef | undefined,
198
+ ): boolean {
199
+ if (!weapon || !ammo) return false;
200
+ // Weapon must be a weapon class (or have weapon damage / subclass).
201
+ const wSub = weaponSubclassOf(weapon);
202
+ if (wSub == null && !weapon.weapon) return false;
203
+ const aSub = projectileSubclassOf(ammo);
204
+ if (aSub == null) return false;
205
+ switch (wSub) {
206
+ case ITEM_SUBCLASS_WEAPON_BOW:
207
+ case ITEM_SUBCLASS_WEAPON_CROSSBOW:
208
+ return aSub === ITEM_SUBCLASS_ARROW;
209
+ case ITEM_SUBCLASS_WEAPON_GUN:
210
+ return aSub === ITEM_SUBCLASS_BULLET;
211
+ default:
212
+ return false;
213
+ }
214
+ }
215
+
216
+ export interface AmmoDpsPair {
217
+ dpsMin: number;
218
+ dpsMax: number;
219
+ }
220
+
221
+ // Effective ammo DPS for ranged min/max (mirrors _ApplyAmmoBonuses zeroing). Zero when missing selection,
222
+ // missing count, incompatible, or no baked ammoDps. Cite: Player.cpp 7591–7621.
223
+ export function ammoDpsFromSelection(
224
+ char: Pick<Character, 'ammoItem' | 'equipped'>,
225
+ inv: Inventory,
226
+ ds: DataStore,
227
+ ): AmmoDpsPair {
228
+ const zero = { dpsMin: 0, dpsMax: 0 };
229
+ if (char.ammoItem == null) return zero;
230
+ const ammo = ds.item(char.ammoItem);
231
+ if (!ammo?.ammoDps) return zero;
232
+ if (countItem(inv, char.ammoItem) < 1) return zero;
233
+ const weaponEntry = equippedEntry(char.equipped.ranged);
234
+ const weapon = weaponEntry != null ? ds.item(weaponEntry) : undefined;
235
+ if (!checkAmmoCompatibility(weapon, ammo)) return zero;
236
+ return { dpsMin: ammo.ammoDps.dpsMin, dpsMax: ammo.ammoDps.dpsMax };
237
+ }
238
+
239
+ // ---- FindAmmo (bot-style scan) ------------------------------------------------
240
+
241
+ // Scan inventory for a compatible projectile the character can use. Cite: PlayerbotAI.cpp FindAmmo
242
+ // 2107–2136.
243
+ export function findCompatibleAmmo(
244
+ char: Character,
245
+ inv: Inventory,
246
+ ds: DataStore,
247
+ ): number | undefined {
248
+ const weaponEntry = equippedEntry(char.equipped.ranged);
249
+ const weapon = weaponEntry != null ? ds.item(weaponEntry) : undefined;
250
+ // Without a weapon, create-pass still SetAmmo if CanUseAmmo — prefer any usable projectile.
251
+ for (const s of inv.stacks) {
252
+ if (s.count < 1) continue;
253
+ const it = ds.item(s.item);
254
+ if (!it || !isAmmoItem(it)) continue;
255
+ if (!canUseAmmo(char, it).ok) continue;
256
+ if (weapon && weaponNeedsProjectileAmmo(weapon) && !checkAmmoCompatibility(weapon, it)) continue;
257
+ // If no weapon yet, any canUseAmmo projectile is fine (DPS stays 0 until compatible weapon).
258
+ if (!weapon || !weaponNeedsProjectileAmmo(weapon) || checkAmmoCompatibility(weapon, it)) {
259
+ return s.item;
260
+ }
261
+ }
262
+ return undefined;
263
+ }
264
+
265
+ // Best compatible ammo for an equipped projectile weapon, from the STORE rather than a bag: bots
266
+ // never buy arrows, so every generated hunter fought at ammoDps 0. Memoized on catalog length.
267
+ const ammoMemo = new WeakMap<DataStore, { catalog: number; best: Map<string, number | undefined> }>();
268
+
269
+ export function bestAmmoForWeapon(
270
+ ds: DataStore,
271
+ weapon: ItemDef | undefined,
272
+ level: number,
273
+ ): number | undefined {
274
+ if (!weaponNeedsProjectileAmmo(weapon)) return undefined;
275
+ const all = ds.allItems?.() ?? [];
276
+ const key = `${weapon?.entry ?? 0}:${level}`;
277
+ let memo = ammoMemo.get(ds);
278
+ if (!memo || memo.catalog !== all.length) {
279
+ memo = { catalog: all.length, best: new Map() };
280
+ ammoMemo.set(ds, memo);
281
+ } else {
282
+ const hit = memo.best.get(key);
283
+ if (hit !== undefined || memo.best.has(key)) return hit;
284
+ }
285
+ let best: { entry: number; dps: number } | undefined;
286
+ for (const it of all) {
287
+ if (!isAmmoItem(it)) continue;
288
+ if ((it.requiredLevel ?? 0) > level) continue;
289
+ if (!checkAmmoCompatibility(weapon, it)) continue;
290
+ const dps = it.ammoDps ? (it.ammoDps.dpsMin + it.ammoDps.dpsMax) / 2 : 0;
291
+ if (dps <= 0) continue;
292
+ // Deterministic: higher dps wins, lower entry breaks ties.
293
+ if (!best || dps > best.dps || (dps === best.dps && it.entry < best.entry)) {
294
+ best = { entry: it.entry, dps };
295
+ }
296
+ }
297
+ memo.best.set(key, best?.entry);
298
+ return best?.entry;
299
+ }
300
+
301
+ // Auto-select ammo when none valid (count 0 or unset), after acquiring a projectile. Cite: Player create
302
+ // second pass 939–942 + bot FindAmmo policy.
303
+ export function maybeAutoSelectAmmo(
304
+ char: Character,
305
+ inv: Inventory,
306
+ ds: DataStore,
307
+ acquiredEntry?: number,
308
+ ): Character {
309
+ const selected = char.ammoItem;
310
+ const selectedOk =
311
+ selected != null
312
+ && countItem(inv, selected) >= 1
313
+ && canUseAmmo(char, ds.item(selected)).ok;
314
+ if (selectedOk) {
315
+ // Keep selection; if weapon exists, compatibility only affects DPS not selection.
316
+ return char;
317
+ }
318
+ if (acquiredEntry != null) {
319
+ const acq = ds.item(acquiredEntry);
320
+ if (acq && canUseAmmo(char, acq).ok && countItem(inv, acquiredEntry) >= 1) {
321
+ const rangedEntry = equippedEntry(char.equipped.ranged);
322
+ const weapon = rangedEntry != null ? ds.item(rangedEntry) : undefined;
323
+ if (!weapon || !weaponNeedsProjectileAmmo(weapon) || checkAmmoCompatibility(weapon, acq)) {
324
+ return { ...char, ammoItem: acquiredEntry };
325
+ }
326
+ }
327
+ }
328
+ const found = findCompatibleAmmo(char, inv, ds);
329
+ if (found != null) return { ...char, ammoItem: found };
330
+ // Clear dead selection
331
+ if (char.ammoItem != null && countItem(inv, char.ammoItem) < 1) return removeAmmo(char);
332
+ return char;
333
+ }
334
+
335
+ // ---- Need-ammo gate (Spell CheckCast NO_AMMO) --------------------------------
336
+
337
+ export type RangedAmmoGate =
338
+ | { ok: true; mode: 'wand' | 'none' | 'projectile' | 'thrown'; ammoEntry?: number }
339
+ | { ok: false; reason: string };
340
+
341
+ // Whether a ranged physical/weapon shot may fire given selection + inventory. Cite: Spell.cpp CheckCast
342
+ // 6730–6793.
343
+ export function rangedAmmoGate(
344
+ char: Pick<Character, 'ammoItem' | 'equipped'>,
345
+ inv: Inventory,
346
+ ds: DataStore,
347
+ ): RangedAmmoGate {
348
+ const weaponEntry = equippedEntry(char.equipped.ranged);
349
+ const weapon = weaponEntry != null ? ds.item(weaponEntry) : undefined;
350
+ if (!weapon) return { ok: false, reason: AMMO_ERR.NO_AMMO };
351
+
352
+ if (weaponIsWand(weapon)) return { ok: true, mode: 'wand' };
353
+ if (weaponIsThrown(weapon)) {
354
+ // The thrown stack is the equipped item itself. Phonecraft equips one entry and keeps extras
355
+ // in bags, so ownership of at least 1 is the gate — the paperdoll counts.
356
+ const entry = weaponEntry!;
357
+ const bagCount = countItem(inv, entry);
358
+ // Equipped thrown always "has" the one on the paperdoll.
359
+ if (bagCount + 1 < 1) return { ok: false, reason: AMMO_ERR.NO_AMMO };
360
+ return { ok: true, mode: 'thrown', ammoEntry: entry };
361
+ }
362
+ if (!weaponNeedsProjectileAmmo(weapon)) return { ok: true, mode: 'none' };
363
+
364
+ const ammoId = char.ammoItem;
365
+ if (!ammoId) return { ok: false, reason: AMMO_ERR.NO_AMMO };
366
+ const ammo = ds.item(ammoId);
367
+ if (!ammo || !isAmmoItem(ammo)) return { ok: false, reason: AMMO_ERR.NO_AMMO };
368
+ if (!checkAmmoCompatibility(weapon, ammo)) return { ok: false, reason: AMMO_ERR.NO_AMMO };
369
+ if (countItem(inv, ammoId) < 1) return { ok: false, reason: AMMO_ERR.NO_AMMO };
370
+ return { ok: true, mode: 'projectile', ammoEntry: ammoId };
371
+ }
372
+
373
+ // ---- TakeAmmo after successful shot ------------------------------------------
374
+
375
+ export interface TakeAmmoResult {
376
+ inventory: Inventory;
377
+ char: Character;
378
+ /** Entry destroyed (ammo or thrown stack), if any. */
379
+ consumedEntry?: number;
380
+ consumedCount: number;
381
+ /** True when ranged slot thrown was fully depleted (unequip needed by caller). */
382
+ thrownDepleted?: boolean;
383
+ }
384
+
385
+ // Spell::TakeAmmo order: wand early-out, thrown stack or durability, else destroy 1 selected ammo.
386
+ // Non-stacking thrown returns consumedCount 0 and leaves thrownDurability for the caller.
387
+ export function takeAmmoAfterRangedShot(
388
+ char: Character,
389
+ inv: Inventory,
390
+ ds: DataStore,
391
+ ): TakeAmmoResult {
392
+ const weaponEntry = equippedEntry(char.equipped.ranged);
393
+ const weapon = weaponEntry != null ? ds.item(weaponEntry) : undefined;
394
+ if (!weapon || weaponIsWand(weapon)) {
395
+ return { inventory: inv, char, consumedCount: 0 };
396
+ }
397
+
398
+ if (weaponIsThrown(weapon)) {
399
+ const stackable = weapon.stackable ?? 1;
400
+ if (stackable <= 1) {
401
+ // Non-stack thrown: durability path (DurabilityPointLossForEquipSlot). No inventory mutate.
402
+ return {
403
+ inventory: inv,
404
+ char,
405
+ consumedCount: 0,
406
+ consumedEntry: weaponEntry,
407
+ thrownDepleted: false,
408
+ };
409
+ }
410
+ // Stackable thrown: remove from bags first and unequip only when bags are empty, since our
411
+ // model is 1 equipped entry plus optional bag stacks.
412
+ const bagCount = countItem(inv, weaponEntry!);
413
+ if (bagCount >= 1) {
414
+ const [nextInv, n] = removeItem(inv, weaponEntry!, 1);
415
+ return { inventory: nextInv, char, consumedEntry: weaponEntry, consumedCount: n };
416
+ }
417
+ // No bag stacks: consume the equipped unit → clear ranged slot.
418
+ const equipped = { ...char.equipped };
419
+ delete equipped.ranged;
420
+ return {
421
+ inventory: inv,
422
+ char: { ...char, equipped },
423
+ consumedEntry: weaponEntry,
424
+ consumedCount: 1,
425
+ thrownDepleted: true,
426
+ };
427
+ }
428
+
429
+ const ammoId = char.ammoItem;
430
+ if (!ammoId) return { inventory: inv, char, consumedCount: 0 };
431
+ const [nextInv, n] = removeItem(inv, ammoId, 1);
432
+ let nextChar = char;
433
+ if (n > 0 && countItem(nextInv, ammoId) < 1) {
434
+ // Selection exhausted — clear and optionally find next (bot-like once).
435
+ nextChar = removeAmmo(char);
436
+ const found = findCompatibleAmmo(nextChar, nextInv, ds);
437
+ if (found != null) nextChar = { ...nextChar, ammoItem: found };
438
+ }
439
+ return { inventory: nextInv, char: nextChar, consumedEntry: ammoId, consumedCount: n };
440
+ }
441
+
442
+ // ---- Bag family / one quiver -------------------------------------------------
443
+
444
+ /** ItemCanGoIntoBag for class-11 quiver/pouch (and generic containers). Cite: Item.cpp 134–181. */
445
+ export function itemCanGoIntoBag(
446
+ item: ItemDef | undefined,
447
+ bag: ItemDef | undefined,
448
+ ): boolean {
449
+ if (!item || !bag) return false;
450
+ const bagClass = bag.itemClass;
451
+ const bagSub = bag.itemSubclass;
452
+
453
+ // Class-1 generic containers accept anything.
454
+ if (bagClass === 1 || (bag.slot === 'bag' && bagClass == null && !isQuiverOrPouch(bag))) {
455
+ return true;
456
+ }
457
+
458
+ if (bagClass === ITEM_CLASS_QUIVER || isQuiverOrPouch(bag)) {
459
+ const sub = bagSub ?? bag.itemSubclass;
460
+ if (sub === ITEM_SUBCLASS_QUIVER || isQuiver(bag)) {
461
+ // Arrows only: BagFamily ARROWS or projectile subclass arrow
462
+ if (item.bagFamily === BAG_FAMILY_ARROWS) return true;
463
+ if (projectileSubclassOf(item) === ITEM_SUBCLASS_ARROW) return true;
464
+ return false;
465
+ }
466
+ if (sub === ITEM_SUBCLASS_AMMO_POUCH || isAmmoPouch(bag)) {
467
+ if (item.bagFamily === BAG_FAMILY_BULLETS) return true;
468
+ if (projectileSubclassOf(item) === ITEM_SUBCLASS_BULLET) return true;
469
+ return false;
470
+ }
471
+ return false;
472
+ }
473
+
474
+ // Unknown specialized bags: conservative reject only if bagFamily on bag is set.
475
+ if (bag.bagFamily != null && bag.bagFamily !== 0) {
476
+ return item.bagFamily === bag.bagFamily;
477
+ }
478
+ return true;
479
+ }
480
+
481
+ /** Only one class-11 among bag bar slots. Cite: Player.cpp 9452–9469 ONLY1_QUIVER / ONLY1_AMMOPOUCH. */
482
+ export function canEquipQuiverOrPouch(
483
+ char: Pick<Character, 'equipped'>,
484
+ ds: DataStore,
485
+ entry: number,
486
+ opts?: { swapSlot?: string },
487
+ ): CanUseAmmoResult {
488
+ const item = ds.item(entry);
489
+ if (!item || !isQuiverOrPouch(item)) return { ok: true }; // not a class-11 — no extra gate
490
+ for (const slot of BAG_SLOTS) {
491
+ if (opts?.swapSlot === slot) continue;
492
+ const worn = equippedEntry(char.equipped[slot]);
493
+ if (worn == null || worn === entry) continue;
494
+ const bag = ds.item(worn);
495
+ if (bag && isQuiverOrPouch(bag)) {
496
+ return {
497
+ ok: false,
498
+ reason: isAmmoPouch(bag) ? AMMO_ERR.ONLY1_AMMOPOUCH : AMMO_ERR.ONLY1_QUIVER,
499
+ };
500
+ }
501
+ }
502
+ return { ok: true };
503
+ }
504
+
505
+ // Whether a ranged physical auto/shot may consume projectile ammo at this combat tick. Used by the combat
506
+ // engine with a live remaining count (not full inventory).
507
+ export function combatProjectileAmmoOk(
508
+ weaponSubclass: number | undefined,
509
+ ammoEntry: number | undefined,
510
+ ammoCount: number,
511
+ ammoSubclass: number | undefined,
512
+ ): boolean {
513
+ if (
514
+ weaponSubclass !== ITEM_SUBCLASS_WEAPON_BOW
515
+ && weaponSubclass !== ITEM_SUBCLASS_WEAPON_GUN
516
+ && weaponSubclass !== ITEM_SUBCLASS_WEAPON_CROSSBOW
517
+ ) {
518
+ return true; // wand/thrown/none — not this gate
519
+ }
520
+ if (!ammoEntry || ammoCount < 1 || ammoSubclass == null) return false;
521
+ if (
522
+ weaponSubclass === ITEM_SUBCLASS_WEAPON_BOW
523
+ || weaponSubclass === ITEM_SUBCLASS_WEAPON_CROSSBOW
524
+ ) {
525
+ return ammoSubclass === ITEM_SUBCLASS_ARROW;
526
+ }
527
+ if (weaponSubclass === ITEM_SUBCLASS_WEAPON_GUN) {
528
+ return ammoSubclass === ITEM_SUBCLASS_BULLET;
529
+ }
530
+ return false;
531
+ }
532
+
533
+ // ---- Quiver / pouch ranged haste (SPELL_AURA_MOD_RANGED_AMMO_HASTE) -----------
534
+
535
+ // Parse Classic equip-spell text "Increases ranged attack speed by N%." Cite: SpellAuras.cpp
536
+ // HandleRangedAmmoHaste; item equipSpells 14824–14829 descriptions.
537
+ export function rangedAmmoHastePctFromSpell(ds: DataStore, spellId: number): number {
538
+ const sp = ds.spell(spellId);
539
+ if (!sp?.description) return 0;
540
+ const m = sp.description.match(/ranged attack speed by\s+(\d+)\s*%/i);
541
+ return m ? Number(m[1]) : 0;
542
+ }
543
+
544
+ // Highest MOD_RANGED_AMMO_HASTE % on a single quiver/pouch (its equipSpells). One item never stacks
545
+ // multiple haste auras with itself — take max.
546
+ export function ammoHastePctFromItem(ds: DataStore, item: ItemDef | undefined): number {
547
+ if (!item || !isQuiverOrPouch(item)) return 0;
548
+ let best = 0;
549
+ for (const sid of item.equipSpells ?? []) {
550
+ best = Math.max(best, rangedAmmoHastePctFromSpell(ds, sid));
551
+ }
552
+ return best;
553
+ }
554
+
555
+ // Whether this class-11 container matches the equipped projectile weapon family. Bow/crossbow → quiver
556
+ // (arrows); gun → ammo pouch (bullets). No projectile weapon → either is allowed (storage / prep).
557
+ export function quiverPouchMatchesRangedWeapon(
558
+ container: ItemDef | undefined,
559
+ rangedWeapon: ItemDef | undefined,
560
+ ): boolean {
561
+ if (!container || !isQuiverOrPouch(container)) return false;
562
+ const wsub = weaponSubclassOf(rangedWeapon);
563
+ if (wsub === ITEM_SUBCLASS_WEAPON_BOW || wsub === ITEM_SUBCLASS_WEAPON_CROSSBOW) {
564
+ return isQuiver(container);
565
+ }
566
+ if (wsub === ITEM_SUBCLASS_WEAPON_GUN) {
567
+ return isAmmoPouch(container);
568
+ }
569
+ return true;
570
+ }
571
+
572
+ // Highest ammo-haste % from equipped class-11 quiver or pouch equipSpells. Only the max applies —
573
+ // the source never stacks MOD_RANGED_AMMO_HASTE. Cite: HandleRangedAmmoHaste.
574
+ export function equippedQuiverRangedHastePct(
575
+ char: Pick<Character, 'equipped'>,
576
+ ds: DataStore,
577
+ ): number {
578
+ let best = 0;
579
+ for (const slot of BAG_SLOTS) {
580
+ const entry = equippedEntry(char.equipped[slot]);
581
+ if (entry == null) continue;
582
+ const bag = ds.item(entry);
583
+ if (!bag || !isQuiverOrPouch(bag)) continue;
584
+ best = Math.max(best, ammoHastePctFromItem(ds, bag));
585
+ }
586
+ return best;
587
+ }
588
+
589
+ // ---- Bag sections / family capacity (quiver = arrows only, pouch = bullets) -
590
+
591
+ export interface CapacitySplit {
592
+ /** Backpack + generic class-1 bags. */
593
+ generic: number;
594
+ /** Class-11 quiver slots (arrows only). */
595
+ arrows: number;
596
+ /** Class-11 ammo pouch slots (bullets only). */
597
+ bullets: number;
598
+ }
599
+
600
+ export function capacitySplit(
601
+ char: Pick<Character, 'equipped'>,
602
+ ds: DataStore,
603
+ ): CapacitySplit {
604
+ let generic = BACKPACK_SLOTS;
605
+ let arrows = 0;
606
+ let bullets = 0;
607
+ for (const slot of BAG_SLOTS) {
608
+ const entry = equippedEntry(char.equipped[slot]);
609
+ if (entry == null) continue;
610
+ const it = ds.item(entry);
611
+ if (!it || it.slot !== 'bag') continue;
612
+ const n = it.bagSlots ?? 0;
613
+ if (isQuiver(it)) arrows += n;
614
+ else if (isAmmoPouch(it)) bullets += n;
615
+ else generic += n;
616
+ }
617
+ return { generic, arrows, bullets };
618
+ }
619
+
620
+ export type BagSectionKind = 'backpack' | 'bag' | 'quiver' | 'ammo_pouch';
621
+
622
+ export interface BagSection {
623
+ kind: BagSectionKind;
624
+ /** UI label (Backpack / item name). */
625
+ label: string;
626
+ /** Equipped bag entry when not the backpack. */
627
+ bagEntry?: number;
628
+ /** Absolute start index in the packed flat inventory layout. */
629
+ startIndex: number;
630
+ slots: number;
631
+ /** BagFamily filter: 0 generic, 1 arrows, 2 bullets. */
632
+ bagFamily: number;
633
+ }
634
+
635
+ // Ordered bag sections for UI + packing (backpack, then bag1..4). Cite: Player bag bar; ItemCanGoIntoBag
636
+ // for class 11.
637
+ export function bagSections(
638
+ char: Pick<Character, 'equipped'>,
639
+ ds: DataStore,
640
+ ): BagSection[] {
641
+ const out: BagSection[] = [];
642
+ let idx = 0;
643
+ out.push({
644
+ kind: 'backpack',
645
+ label: 'Backpack',
646
+ startIndex: idx,
647
+ slots: 16,
648
+ bagFamily: 0,
649
+ });
650
+ idx += 16;
651
+ for (const slot of BAG_SLOTS) {
652
+ const entry = equippedEntry(char.equipped[slot]);
653
+ if (entry == null) continue;
654
+ const it = ds.item(entry);
655
+ if (!it || it.slot !== 'bag') continue;
656
+ const n = it.bagSlots ?? 0;
657
+ if (n <= 0) continue;
658
+ let kind: BagSectionKind = 'bag';
659
+ let bagFamily = 0;
660
+ if (isQuiver(it)) {
661
+ kind = 'quiver';
662
+ bagFamily = BAG_FAMILY_ARROWS;
663
+ } else if (isAmmoPouch(it)) {
664
+ kind = 'ammo_pouch';
665
+ bagFamily = BAG_FAMILY_BULLETS;
666
+ }
667
+ out.push({
668
+ kind,
669
+ label: it.name,
670
+ bagEntry: entry,
671
+ startIndex: idx,
672
+ slots: n,
673
+ bagFamily,
674
+ });
675
+ idx += n;
676
+ }
677
+ return out;
678
+ }
679
+
680
+ function isArrowProjectile(item: ItemDef | undefined): boolean {
681
+ return projectileSubclassOf(item) === ITEM_SUBCLASS_ARROW;
682
+ }
683
+
684
+ function isBulletProjectile(item: ItemDef | undefined): boolean {
685
+ return projectileSubclassOf(item) === ITEM_SUBCLASS_BULLET;
686
+ }
687
+
688
+ export interface SlotUsage {
689
+ genericUsed: number;
690
+ arrowsInSpecialty: number;
691
+ bulletsInSpecialty: number;
692
+ freeGeneric: number;
693
+ freeArrows: number;
694
+ freeBullets: number;
695
+ }
696
+
697
+ // How stacks occupy generic vs specialty capacity (prefer specialty for matching ammo). Overflow
698
+ // arrows/bullets sit in generic slots.
699
+ export function slotUsage(
700
+ inv: Inventory,
701
+ char: Pick<Character, 'equipped'>,
702
+ ds: DataStore,
703
+ ): SlotUsage {
704
+ const cap = capacitySplit(char, ds);
705
+ let arrowStacks = 0;
706
+ let bulletStacks = 0;
707
+ let otherStacks = 0;
708
+ for (const s of inv.stacks) {
709
+ const it = ds.item(s.item);
710
+ if (isArrowProjectile(it)) arrowStacks += 1;
711
+ else if (isBulletProjectile(it)) bulletStacks += 1;
712
+ else otherStacks += 1;
713
+ }
714
+ const arrowsInSpecialty = Math.min(arrowStacks, cap.arrows);
715
+ const bulletsInSpecialty = Math.min(bulletStacks, cap.bullets);
716
+ const arrowsInGeneric = arrowStacks - arrowsInSpecialty;
717
+ const bulletsInGeneric = bulletStacks - bulletsInSpecialty;
718
+ const genericUsed = otherStacks + arrowsInGeneric + bulletsInGeneric;
719
+ return {
720
+ genericUsed,
721
+ arrowsInSpecialty,
722
+ bulletsInSpecialty,
723
+ freeGeneric: Math.max(0, cap.generic - genericUsed),
724
+ freeArrows: Math.max(0, cap.arrows - arrowsInSpecialty),
725
+ freeBullets: Math.max(0, cap.bullets - bulletsInSpecialty),
726
+ };
727
+ }
728
+
729
+ // Free specialty+generic slots that can accept this item (new stacks after merge). Non-ammo cannot use
730
+ // quiver/pouch capacity. Cite: ItemCanGoIntoBag.
731
+ export function freeSlotsForItem(
732
+ inv: Inventory,
733
+ char: Pick<Character, 'equipped'>,
734
+ ds: DataStore,
735
+ entry: number,
736
+ ): number {
737
+ const it = ds.item(entry);
738
+ const usage = slotUsage(inv, char, ds);
739
+ if (isArrowProjectile(it)) return usage.freeGeneric + usage.freeArrows;
740
+ if (isBulletProjectile(it)) return usage.freeGeneric + usage.freeBullets;
741
+ return usage.freeGeneric;
742
+ }
743
+
744
+ /** Family-aware canFit: fills existing stacks first, then needs free specialty/generic slots. */
745
+ export function canFitWithBagFamily(
746
+ inv: Inventory,
747
+ char: Pick<Character, 'equipped'>,
748
+ ds: DataStore,
749
+ entry: number,
750
+ count: number,
751
+ maxStack: number,
752
+ ): boolean {
753
+ if (count <= 0) return true;
754
+ const capStack = Math.max(1, maxStack);
755
+ let remaining = count;
756
+ for (const s of inv.stacks) {
757
+ if (s.item === entry && s.count < capStack) remaining -= capStack - s.count;
758
+ if (remaining <= 0) return true;
759
+ }
760
+ const needSlots = Math.ceil(remaining / capStack);
761
+ return needSlots <= freeSlotsForItem(inv, char, ds, entry);
762
+ }
763
+
764
+ // Pack stacks so specialty bag index ranges hold matching ammo first, with overflow and other gear
765
+ // filling generic bags. Relative order inside each bucket is preserved.
766
+ export function packInventoryByBagFamily(
767
+ inv: Inventory,
768
+ char: Pick<Character, 'equipped'>,
769
+ ds: DataStore,
770
+ ): Inventory {
771
+ const sections = bagSections(char, ds);
772
+ if (!sections.some((s) => s.kind === 'quiver' || s.kind === 'ammo_pouch')) {
773
+ return { stacks: inv.stacks.map((s) => ({ ...s })) };
774
+ }
775
+
776
+ const arrows: Inventory['stacks'] = [];
777
+ const bullets: Inventory['stacks'] = [];
778
+ const others: Inventory['stacks'] = [];
779
+ for (const s of inv.stacks) {
780
+ const it = ds.item(s.item);
781
+ if (isArrowProjectile(it)) arrows.push({ ...s });
782
+ else if (isBulletProjectile(it)) bullets.push({ ...s });
783
+ else others.push({ ...s });
784
+ }
785
+
786
+ const cap = capacitySplit(char, ds);
787
+ // Specialty fill first, then remaining projectiles overflow into generic with others.
788
+ const arrowSpec = arrows.slice(0, cap.arrows);
789
+ const arrowOver = arrows.slice(cap.arrows);
790
+ const bulletSpec = bullets.slice(0, cap.bullets);
791
+ const bulletOver = bullets.slice(cap.bullets);
792
+ const generic = [...others, ...arrowOver, ...bulletOver];
793
+
794
+ // Flat layout in section order: generic stacks first up to the generic cap, then arrow specialty,
795
+ // then bullet specialty. Empties are not stored — the UI pads them.
796
+ const genericCap = cap.generic;
797
+ const genericKept = generic.slice(0, genericCap);
798
+ // If somehow over generic+specialty, keep remainder at end (canFit should prevent).
799
+ const genericExtra = generic.slice(genericCap);
800
+
801
+ return {
802
+ stacks: [...genericKept, ...arrowSpec, ...bulletSpec, ...genericExtra],
803
+ };
804
+ }
805
+
806
+ /** addItem then pack so projectiles fill quiver/pouch before overflowing into bags. */
807
+ export function addItemPreferAmmoBag(
808
+ inv: Inventory,
809
+ char: Pick<Character, 'equipped'>,
810
+ ds: DataStore,
811
+ entry: number,
812
+ count: number,
813
+ maxStack: number,
814
+ ): Inventory {
815
+ const next = addItem(inv, entry, count, maxStack);
816
+ return packInventoryByBagFamily(next, char, ds);
817
+ }