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,812 @@
1
+ import type { DataStore } from '../data/dataStore.ts';
2
+ import type {
3
+ CreatureDef, CreatureSpawnPos, ZoneDef, TrainerDef, VendorDef, GatherNodeDef, ProfTrainerDef, GameObjectDef,
4
+ } from '../data/schema.ts';
5
+ import type { Character } from '../domain/character/character.ts';
6
+ import { questNeededItems, sourceDropItemEntries, type QuestLog } from '../domain/quests/questlog.ts';
7
+ import {
8
+ LOCK_KEY_SKILL,
9
+ SKILL_HERBALISM,
10
+ SKILL_MINING,
11
+ isFreeOpenLockType,
12
+ lockHasFreeOpenCase,
13
+ skillByLockType,
14
+ } from '../domain/world/openLock.ts';
15
+ import {
16
+ goUseHasOutcome,
17
+ goVisibleForPlayer,
18
+ type GoPlayerVisibility,
19
+ } from '../domain/world/gameObjects.ts';
20
+ import { firstPageForGo } from '../data/pageTexts.ts';
21
+ import { scriptDevByGo } from '../domain/scriptdev/index.ts';
22
+ import { canAttackCreature, canInteractWithCreature } from '../domain/creature/faction.ts';
23
+ import { unitCannotBeAttacked } from '../domain/creature/unitFlags.ts';
24
+ import { isScriptCreditOnlyTarget } from '../domain/quests/questScriptCredit.ts';
25
+ import { offeredQuests } from '../quests/quests.ts';
26
+ import {
27
+ getCreatureAttackDistance,
28
+ isNoAggroOnSight,
29
+ resolveOutdoorPackAssist,
30
+ selectCallForHelp,
31
+ selectGuardAiAssistFromSpawns,
32
+ isGuardOrCivilian,
33
+ selectSpatialPull,
34
+ type AssistCandidate,
35
+ type PackSpawnPos,
36
+ type SpatialPullHit,
37
+ type SpatialPullCandidate,
38
+ type SpatialPullOpts,
39
+ type SpatialPullOrigin,
40
+ } from '../domain/creature/creatureAi.ts';
41
+ import {
42
+ worldBossEntriesForZone,
43
+ worldBossSpawnsForZone,
44
+ worldBossTemplateFor,
45
+ } from '../domain/creature/worldBosses.ts';
46
+ import { resolveCreatureDefForCombat } from '../data/dungeons/boss-eventai.ts';
47
+ import {
48
+ clusterSpatialCandidates,
49
+ packIdAtPosition,
50
+ } from '../data/dungeons/pack-from-clusters.ts';
51
+ import viewportsJson from '../data/maps/dungeon-viewports.json' with { type: 'json' };
52
+ import {
53
+ aggroHasLineOfSight,
54
+ mapNavGrid,
55
+ type NavGrid,
56
+ } from './dungeonNav.ts';
57
+ import { projectWorld, type Viewport } from './dungeonMapProjection.ts';
58
+ import { type15GameObjectsInZone } from '../domain/world/goMoTransport.ts';
59
+ import { type11GameObjectsInZone } from '../domain/world/goTransport.ts';
60
+ import { corpseUseFarmEntries, corpseUseFightEntries, corpseUseSummonedEntries } from '../domain/quests/questCorpseUse.ts';
61
+
62
+ /**
63
+ * Creatures listed as grindable in this zone (plus quest-summoned kill targets when
64
+ * `questlog` is given). When `race` is set, same-faction / Friendly+ NPCs are excluded
65
+ * so Horde cannot farm Horde civilians and Alliance cannot farm Alliance guards.
66
+ * Active quest kill targets that are not outdoor-non-grind (CIVILIAN / faction-35 /
67
+ * same-side noXp) stay listed so Binding still surfaces via questSummonedTargets.
68
+ * Wave T: outdoor world bosses (Kazzak / Azuregos / emerald dragons) merge in from
69
+ * pure-code zone lists so green dragons absent from the bake still appear.
70
+ * Cite: domain/creature/faction.ts canAttackCreature; Unit::CanAttack; domain/creature/worldBosses.ts.
71
+ */
72
+ export function huntableCreatures(
73
+ ds: DataStore,
74
+ zoneId: string,
75
+ questlog?: QuestLog,
76
+ race?: number,
77
+ ): CreatureDef[] {
78
+ const zone = ds.zone(zoneId);
79
+ if (!zone) return [];
80
+ let base = zone.huntable.map((e) => ds.creature(e)).filter((c): c is CreatureDef => !!c);
81
+ // Wave T — world bosses not (or not fully) on zone.huntable
82
+ for (const entry of worldBossEntriesForZone(zoneId)) {
83
+ if (base.some((b) => b.entry === entry)) continue;
84
+ const c =
85
+ resolveCreatureDefForCombat(entry, (id) => ds.creature(id)) ??
86
+ worldBossTemplateFor(entry);
87
+ if (c) base.push(c);
88
+ }
89
+ if (questlog) {
90
+ for (const c of questSummonedTargets(ds, zoneId, questlog)) {
91
+ if (!base.some((b) => b.entry === c.entry)) base.push(c);
92
+ }
93
+ }
94
+ // Script helpers / named triggers are not grind targets (KI-683).
95
+ base = base.filter((c) => !/trigger/i.test(c.name ?? ''));
96
+ if (race != null) {
97
+ const questKills = questlog ? questTargets(ds, questlog).kills : null;
98
+ base = base.filter(
99
+ // The quest-kill exemption exists so The Binding still surfaces its Voidwalker, but it
100
+ // must not resurrect something the client cannot target.
101
+ (c) => canAttackCreature(ds, race, c.entry)
102
+ || ((questKills?.has(c.entry) ?? false) && !unitCannotBeAttacked(c)),
103
+ );
104
+ }
105
+ return base;
106
+ }
107
+
108
+ // CQ5: creature entries that spawn in SOME zone (huntable list or spatial spawns).
109
+ // Cached per DataStore — zone lists are immutable after boot.
110
+ const spawnedAnywhereCache = new WeakMap<DataStore, Set<number>>();
111
+ function spawnedAnywhere(ds: DataStore, entry: number): boolean {
112
+ let set = spawnedAnywhereCache.get(ds);
113
+ if (!set) {
114
+ set = new Set<number>();
115
+ for (const z of ds.zones()) {
116
+ for (const e of z.huntable ?? []) set.add(e);
117
+ for (const s of z.spawns ?? []) set.add(s.entry);
118
+ }
119
+ spawnedAnywhereCache.set(ds, set);
120
+ }
121
+ return set.has(entry);
122
+ }
123
+
124
+ /**
125
+ * CQ5 — ritual / script-summoned quest kill targets. Some kill objectives point at
126
+ * creatures that exist only when a quest script summons them (warlock Binding demons
127
+ * 5676/5677 via the Tome at the summoning circle, Big Will 6238 in the Affray event,
128
+ * Ulag 6390 at the Brill mausoleum — CMaNGOS spawns each from a quest/event script).
129
+ * They are baked CreatureDefs but spawn in NO zone. While such a quest is ACTIVE with
130
+ * the kill unmet, the target surfaces as huntable in the zones that OFFER the quest —
131
+ * the text-RPG stand-in for "perform the ritual where the quest lives". Kill credit
132
+ * then flows through the ordinary resolveFight path.
133
+ */
134
+ export function questSummonedTargets(ds: DataStore, zoneId: string, questlog: QuestLog): CreatureDef[] {
135
+ const zone = ds.zone(zoneId);
136
+ if (!zone?.quests?.length) return [];
137
+ const offered = new Set(zone.quests);
138
+ const out: CreatureDef[] = [];
139
+ for (const qs of questlog.quests) {
140
+ if (qs.status !== 'active') continue;
141
+ if (!offered.has(qs.entry)) continue;
142
+ const def = ds.quest(qs.entry);
143
+ if (!def) continue;
144
+ for (const kt of def.killTargets ?? []) {
145
+ if ((qs.kills?.[String(kt.creatureEntry)] ?? 0) >= kt.count) continue;
146
+ if (spawnedAnywhere(ds, kt.creatureEntry)) continue;
147
+ // Standing in a dungeon is not "spawns in no zone": Lord Incendius 9017 is BRD census,
148
+ // and surfacing him outdoors handed the solo run a boss pull (map 230).
149
+ if (ds.isInstanceCreature(kt.creatureEntry)) continue;
150
+ // Same for a battleground: the five Arathi Basin credit markers 15001-15005 and the six
151
+ // AV air commanders are inside maps 30/489/529, not standing in an outdoor zone.
152
+ if (ds.isBattlegroundCreature(kt.creatureEntry)) continue;
153
+ // Type-2 corpse-use summons (8612 Screecher Spirit) are gossip credit, not huntable.
154
+ // Cite: spell_script_target type 2; gossip 1405 cmd 8. Binding tomes stay CQ5 (type 0).
155
+ if (corpseUseSummonedEntries(ds, def).includes(kt.creatureEntry)) continue;
156
+ const c = ds.creature(kt.creatureEntry);
157
+ // A doodad is not a fight. UNIT_FLAG_UNINTERACTIBLE and friends are the exact CanAttack
158
+ // refusal mask: the Andorhal Towers, the AV "Trigger *" air commanders, the Capture Quest
159
+ // Doodads. 24 of 603 kill targets carry it. Cite: Relations.cpp:365.
160
+ if (unitCannotBeAttacked(c)) continue;
161
+ // Friendly + noXp is script credit, never a pull (Tamed Kodo, J'eevee). The Binding's
162
+ // summons carry no noXp and stay. Cite: combatSession.ts:578-586.
163
+ if (isScriptCreditOnlyTarget(ds, kt.creatureEntry, questlog)) continue;
164
+ if (c && !out.some((o) => o.entry === c.entry)) out.push(c);
165
+ }
166
+ }
167
+ return out;
168
+ }
169
+
170
+ /**
171
+ * Sourced spawn placements for a zone (Wave 4C). Empty when the zone has no
172
+ * baked `spawns` — callers must fall back to tier/list hunt, not invent coords.
173
+ * Wave T: merges world-boss spawn overlays (creature table / WorldState.cpp).
174
+ */
175
+ export function zoneSpawns(ds: DataStore, zoneId: string): CreatureSpawnPos[] {
176
+ const base = ds.zone(zoneId)?.spawns ?? [];
177
+ const wb = worldBossSpawnsForZone(zoneId);
178
+ if (!wb.length) return base;
179
+ // Prefer bake rows when present for the same entry; append overlays for gaps.
180
+ const have = new Set(base.map((s) => s.entry));
181
+ const extra = wb.filter((s) => !have.has(s.entry));
182
+ return extra.length ? [...base, ...extra] : base;
183
+ }
184
+
185
+ /** Whether this zone can do spatial attackDistance pulls (positions present). */
186
+ export function zoneHasSpatialSpawns(ds: DataStore, zoneId: string): boolean {
187
+ return (ds.zone(zoneId)?.spawns?.length ?? 0) > 0;
188
+ }
189
+
190
+ // Every spawn of a creature entry in the zone, in a stable order (map, then x, then y). A caller
191
+ // choosing a pull origin picks from these — the first row is a corner spawn as often as a camp.
192
+ export function pullOriginsForCreature(
193
+ ds: DataStore,
194
+ zoneId: string,
195
+ entry: number,
196
+ ): CreatureSpawnPos[] {
197
+ const list = zoneSpawns(ds, zoneId).filter((s) => s.entry === entry);
198
+ list.sort((a, b) => a.map - b.map || a.x - b.x || a.y - b.y);
199
+ return list;
200
+ }
201
+
202
+ // Pick a stable pull origin for a creature entry: first spawn of that entry in the zone (sorted by map,
203
+ // then x, then y). Null when no positions exist.
204
+ export function pullOriginForCreature(
205
+ ds: DataStore,
206
+ zoneId: string,
207
+ entry: number,
208
+ ): CreatureSpawnPos | null {
209
+ return pullOriginsForCreature(ds, zoneId, entry)[0] ?? null;
210
+ }
211
+
212
+ /** Viewport for a Classic map id from committed dungeon-viewports.json (first match). */
213
+ function viewportForMap(mapId: number): Viewport | null {
214
+ const file = viewportsJson as Record<string, {
215
+ box?: number[];
216
+ mapId?: number;
217
+ }>;
218
+ for (const raw of Object.values(file)) {
219
+ if (!raw || raw.mapId !== mapId) continue;
220
+ if (!Array.isArray(raw.box) || raw.box.length !== 4) continue;
221
+ const box = raw.box.map(Number) as [number, number, number, number];
222
+ if (!box.every(Number.isFinite)) continue;
223
+ return { box, mapId };
224
+ }
225
+ return null;
226
+ }
227
+
228
+ /**
229
+ * LoS predicate from a registered map nav grid + viewport projection.
230
+ * Fail-open (always true) when nav/viewport missing — outdoor zones have no walls.
231
+ * Cite: UnitAI.cpp DetectOrAttack ~530–536 IsWithinLOSInMap.
232
+ */
233
+ export function aggroLosForMap(
234
+ mapId: number,
235
+ grid?: NavGrid | null,
236
+ viewport?: Viewport | null,
237
+ ): SpatialPullOpts['hasLineOfSight'] | undefined {
238
+ const g = grid ?? mapNavGrid(mapId);
239
+ const vp = viewport ?? viewportForMap(mapId);
240
+ if (!g || !vp) return undefined;
241
+ return (origin, candidate) => {
242
+ const aPct = projectWorld(vp, { x: origin.x, y: origin.y, z: origin.z });
243
+ const bPct = projectWorld(vp, { x: candidate.x, y: candidate.y, z: candidate.z });
244
+ return aggroHasLineOfSight(
245
+ g,
246
+ { pct: aPct, z: origin.z },
247
+ { pct: bPct, z: candidate.z },
248
+ );
249
+ };
250
+ }
251
+
252
+ /**
253
+ * Spatial aggro at a world point: creatures whose spawn is within their
254
+ * GetAttackDistance of `origin`, with LoS when a map nav grid is registered and
255
+ * pack-scope when candidates resolve to CFH clusters. Returns [] when the zone
256
+ * has no spawns (tier-only hunt — do not invent).
257
+ * Cite: Unit::GetAttackDistance; UnitAI DetectOrAttack (LOS); pack-clusters packs.
258
+ */
259
+ export function spatialPullAt(
260
+ ds: DataStore,
261
+ zoneId: string,
262
+ origin: SpatialPullOrigin,
263
+ playerLevel: number,
264
+ opts?: {
265
+ requireAggroOnSight?: boolean;
266
+ targetIsPlayerPet?: boolean;
267
+ excludeOriginSpawn?: boolean;
268
+ primaryEntry?: number;
269
+ /** Override LoS (tests). `null` disables LoS even when map nav is registered. */
270
+ hasLineOfSight?: SpatialPullOpts['hasLineOfSight'] | null;
271
+ scopeToNearestPack?: boolean;
272
+ packLinks?: ReadonlyMap<string, readonly string[]>;
273
+ },
274
+ ): SpatialPullHit[] {
275
+ const spawns = zoneSpawns(ds, zoneId);
276
+ if (!spawns.length) return [];
277
+
278
+ const mapId = origin.map ?? spawns[0]?.map;
279
+ const candidates: SpatialPullCandidate[] = [];
280
+ for (const s of spawns) {
281
+ const cdef = ds.creature(s.entry);
282
+ if (!cdef) continue;
283
+ const packId =
284
+ mapId != null ? packIdAtPosition(mapId, { x: s.x, y: s.y }) : undefined;
285
+ candidates.push({
286
+ entry: s.entry,
287
+ x: s.x,
288
+ y: s.y,
289
+ map: s.map,
290
+ level: cdef.level,
291
+ detectionRange: cdef.detectionRange,
292
+ extraFlags: cdef.extraFlags,
293
+ ...(packId ? { packId } : {}),
294
+ });
295
+ }
296
+
297
+ let hasLos = opts?.hasLineOfSight;
298
+ if (hasLos === null) hasLos = undefined;
299
+ else if (hasLos === undefined && mapId != null) {
300
+ hasLos = aggroLosForMap(mapId);
301
+ }
302
+
303
+ return selectSpatialPull(origin, playerLevel, candidates, {
304
+ requireAggroOnSight: opts?.requireAggroOnSight,
305
+ targetIsPlayerPet: opts?.targetIsPlayerPet,
306
+ excludeOriginSpawn: opts?.excludeOriginSpawn,
307
+ primaryEntry: opts?.primaryEntry,
308
+ hasLineOfSight: hasLos,
309
+ scopeToNearestPack: opts?.scopeToNearestPack,
310
+ packLinks: opts?.packLinks,
311
+ });
312
+ }
313
+
314
+ /**
315
+ * Adds that would join a player-initiated pull of `primaryEntry` when spawn
316
+ * positions exist: origin = that entry's spawn; neighbors within *their*
317
+ * attackDistance (passive sight), LoS + nearest-pack scoped when geometry exists.
318
+ * Empty when no positions / no origin spawn.
319
+ * Does not invent multi-combat — returns the entry list for 4A/4B consumers.
320
+ */
321
+ export function spatialAddsForPull(
322
+ ds: DataStore,
323
+ zoneId: string,
324
+ primaryEntry: number,
325
+ playerLevel: number,
326
+ ): SpatialPullHit[] {
327
+ const origin = pullOriginForCreature(ds, zoneId, primaryEntry);
328
+ if (!origin) return [];
329
+ return spatialPullAt(ds, zoneId, origin, playerLevel, {
330
+ requireAggroOnSight: true,
331
+ excludeOriginSpawn: true,
332
+ primaryEntry,
333
+ });
334
+ }
335
+
336
+ /**
337
+ * Spatial pull over a dungeon's CFH/Detection clusters (not zone.spawns).
338
+ * Pack-scoped + LoS when nav is registered for `mapId`. Primary surface for
339
+ * "walk into this pack" in instances.
340
+ *
341
+ * Cite: pack-clusters.json; UnitAI DetectOrAttack; selectSpatialPull.
342
+ */
343
+ export function spatialPullOnMap(
344
+ ds: DataStore,
345
+ mapId: number,
346
+ origin: SpatialPullOrigin,
347
+ playerLevel: number,
348
+ opts?: {
349
+ requireAggroOnSight?: boolean;
350
+ hasLineOfSight?: SpatialPullOpts['hasLineOfSight'] | null;
351
+ scopeToNearestPack?: boolean;
352
+ packLinks?: ReadonlyMap<string, readonly string[]>;
353
+ /** Nav/viewport overrides (tests load floorplan without global registry). */
354
+ navGrid?: NavGrid | null;
355
+ viewport?: Viewport | null;
356
+ },
357
+ ): SpatialPullHit[] {
358
+ const candidates = clusterSpatialCandidates(mapId, (entry) => ds.creature(entry));
359
+ if (!candidates.length) return [];
360
+
361
+ let hasLos = opts?.hasLineOfSight;
362
+ if (hasLos === null) hasLos = undefined;
363
+ else if (hasLos === undefined) {
364
+ hasLos = aggroLosForMap(mapId, opts?.navGrid, opts?.viewport);
365
+ }
366
+
367
+ return selectSpatialPull(
368
+ { ...origin, map: origin.map ?? mapId },
369
+ playerLevel,
370
+ candidates,
371
+ {
372
+ requireAggroOnSight: opts?.requireAggroOnSight,
373
+ hasLineOfSight: hasLos,
374
+ scopeToNearestPack: opts?.scopeToNearestPack,
375
+ packLinks: opts?.packLinks,
376
+ },
377
+ );
378
+ }
379
+
380
+ // Aggro/pull radius for a creature vs a player level (Unit::GetAttackDistance). System 9 — used by
381
+ // autopilot/world when distance is modeled; always pure.
382
+ export function creatureAttackDistance(
383
+ creature: CreatureDef,
384
+ playerLevel: number,
385
+ opts?: { targetIsPlayerPet?: boolean; aggroRate?: number },
386
+ ): number {
387
+ return getCreatureAttackDistance(creature.level, playerLevel, {
388
+ detectionRange: creature.detectionRange,
389
+ targetIsPlayerPet: opts?.targetIsPlayerPet,
390
+ aggroRate: opts?.aggroRate,
391
+ });
392
+ }
393
+
394
+ // Whether this creature passively engages on sight (false when NO_AGGRO_ON_SIGHT). Explicit
395
+ // player-initiated fights still allowed; this only gates passive aggro.
396
+ export function creatureAggroOnSight(creature: CreatureDef): boolean {
397
+ return !isNoAggroOnSight(creature.extraFlags);
398
+ }
399
+
400
+ /**
401
+ * Call-for-help selection seam: given a caller CreatureDef and neighbor list with
402
+ * distances, return eligible assistants. Multi-combat packs wire this when available.
403
+ * Cite: Creature.cpp CallAssistance / CanAssistTo.
404
+ */
405
+ export function callForHelpFrom(
406
+ caller: CreatureDef,
407
+ neighbors: AssistCandidate[],
408
+ opts?: { alreadyCalledAssistance?: boolean },
409
+ ): AssistCandidate[] {
410
+ // NO_CALL_ASSIST is on the caller's ExtraFlags — selectCallForHelp reads it.
411
+ return selectCallForHelp(
412
+ {
413
+ callForHelpRadius: caller.callForHelpRadius,
414
+ extraFlags: caller.extraFlags,
415
+ alreadyCalledAssistance: opts?.alreadyCalledAssistance,
416
+ },
417
+ neighbors,
418
+ );
419
+ }
420
+
421
+ /**
422
+ * Pack assist for a player-initiated pull of `primaryEntry` in a zone with baked
423
+ * spawns (Wave 4B). Entry-hunt: prefer an isolated primary spawn; keep helpers
424
+ * only from creature_linking_template within searchRange (Princess, Fozruk, Morna)
425
+ * or unique Rank>=1 elites with one outdoor spawn worldwide, within Detection
426
+ * (Otto + Falconcrest). Guid-level CallAssistance is not modeled outdoors.
427
+ *
428
+ * Empty when: no zone spawns, no origin, NO_CALL_ASSIST, isolated + unlinked
429
+ * normal-rank primary. Does not invent pack graphs from spawn-pool co-location.
430
+ *
431
+ * Cite: Creature.cpp CallAssistance ~2148-2164; creature_linking_template;
432
+ * domain `resolveOutdoorPackAssist`.
433
+ */
434
+ export function packAssistForPull(
435
+ ds: DataStore,
436
+ zoneId: string,
437
+ primaryEntry: number,
438
+ opts?: { alreadyCalledAssistance?: boolean },
439
+ ): AssistCandidate[] {
440
+ const callerDef = ds.creature(primaryEntry);
441
+ if (!callerDef) return [];
442
+
443
+ const raw = zoneSpawns(ds, zoneId);
444
+ if (!raw.length) return [];
445
+
446
+ // Annotate spawns with ExtraFlags + Faction for CanAssistTo.
447
+ // Primary sites get the caller's flags/faction so same-faction checks are exact.
448
+ const spawns: PackSpawnPos[] = [];
449
+ for (const s of raw) {
450
+ const cdef = ds.creature(s.entry);
451
+ const isPrimary = s.entry === primaryEntry;
452
+ spawns.push({
453
+ entry: s.entry,
454
+ x: s.x,
455
+ y: s.y,
456
+ map: s.map,
457
+ extraFlags: isPrimary ? callerDef.extraFlags : cdef?.extraFlags,
458
+ factionId: isPrimary ? callerDef.factionId : cdef?.factionId,
459
+ rank: isPrimary ? callerDef.scaling?.rank : cdef?.scaling?.rank,
460
+ detectionRange: isPrimary ? callerDef.detectionRange : cdef?.detectionRange,
461
+ });
462
+ }
463
+
464
+ const worldSpawnCounts = new Map<number, number>();
465
+ for (const z of ds.zones()) {
466
+ for (const s of z.spawns ?? []) {
467
+ worldSpawnCounts.set(s.entry, (worldSpawnCounts.get(s.entry) ?? 0) + 1);
468
+ }
469
+ }
470
+
471
+ return resolveOutdoorPackAssist(
472
+ {
473
+ callForHelpRadius: callerDef.callForHelpRadius,
474
+ extraFlags: callerDef.extraFlags,
475
+ alreadyCalledAssistance: opts?.alreadyCalledAssistance,
476
+ },
477
+ primaryEntry,
478
+ spawns,
479
+ worldSpawnCounts,
480
+ );
481
+ }
482
+
483
+ // GuardAI.cpp:72 — idle IsGuard neighbors within 20 yd of a pulled guard/civilian. Victim is the player (no
484
+ // outdoor pose); only the creature-who branch can fire.
485
+ export function guardAiAssistForPull(
486
+ ds: DataStore,
487
+ zoneId: string,
488
+ primaryEntry: number,
489
+ ): AssistCandidate[] {
490
+ const whoDef = ds.creature(primaryEntry);
491
+ if (!whoDef || !isGuardOrCivilian(whoDef.extraFlags)) return [];
492
+ const raw = zoneSpawns(ds, zoneId);
493
+ if (!raw.length) return [];
494
+ const sites = raw.filter((s) => s.entry === primaryEntry);
495
+ if (!sites.length) return [];
496
+ sites.sort((a, b) => a.map - b.map || a.x - b.x || a.y - b.y);
497
+ const origin = sites[0]!;
498
+ const spawns: PackSpawnPos[] = [];
499
+ for (const s of raw) {
500
+ const cdef = ds.creature(s.entry);
501
+ spawns.push({
502
+ entry: s.entry,
503
+ x: s.x,
504
+ y: s.y,
505
+ map: s.map,
506
+ extraFlags: cdef?.extraFlags,
507
+ factionId: cdef?.factionId,
508
+ });
509
+ }
510
+ return selectGuardAiAssistFromSpawns(
511
+ { entry: primaryEntry, x: origin.x, y: origin.y, extraFlags: whoDef.extraFlags },
512
+ spawns,
513
+ );
514
+ }
515
+
516
+ /** Zone ids in which the given creature entry is listed as huntable (its spawn zones for grinding / quest targets). */
517
+ export function spawnZonesForCreature(ds: DataStore, creatureEntry: number): string[] {
518
+ const out: string[] = [];
519
+ for (const z of ds.zones()) {
520
+ if ((z.huntable ?? []).includes(creatureEntry)) out.push(z.id);
521
+ }
522
+ return out;
523
+ }
524
+
525
+ /**
526
+ * What the player's ACTIVE quests still send them after, for highlighting in the hub:
527
+ * `kills` = creature entries with an unmet kill objective; `items` = quest item entries
528
+ * still to be collected. `objects` = GameObject entries for pickup/click/interact objectives.
529
+ * The UI marks a mob when it's a kill target or drops a needed item, a gather node, and
530
+ * surfaces objects in the gathering section. Completed/turned-in quests contribute nothing.
531
+ */
532
+ export function questTargets(ds: DataStore, log: QuestLog): { kills: Set<number>; items: Set<number>; objects: Set<number> } {
533
+ const kills = new Set<number>();
534
+ const items = new Set<number>();
535
+ const objects = new Set<number>();
536
+ for (const qs of log.quests) {
537
+ if (qs.status !== 'active') continue;
538
+ const q = ds.quest(qs.entry);
539
+ if (!q) continue;
540
+ for (const kt of q.killTargets) {
541
+ if ((qs.kills[String(kt.creatureEntry)] ?? 0) < kt.count) {
542
+ const summoned = corpseUseSummonedEntries(ds, q);
543
+ if (summoned.includes(kt.creatureEntry)) {
544
+ for (const e of corpseUseFarmEntries(ds, q)) kills.add(e);
545
+ } else {
546
+ kills.add(kt.creatureEntry);
547
+ }
548
+ }
549
+ }
550
+ for (const e of corpseUseFightEntries(ds, q, qs)) kills.add(e);
551
+ for (const it of q.itemTargets) items.add(it.item);
552
+ for (const item of sourceDropItemEntries(q)) items.add(item);
553
+ for (const ot of (q.objectTargets || [])) {
554
+ const cur = (qs.objects || {})[String(ot.objectEntry)] ?? 0;
555
+ if (cur < ot.count) objects.add(ot.objectEntry);
556
+ }
557
+ }
558
+ return { kills, items, objects };
559
+ }
560
+
561
+ /** Whether a creature is worth a quest marker: a live kill target or a needed-item dropper. */
562
+ export function isQuestMob(ds: DataStore, cr: CreatureDef, targets: { kills: Set<number>; items: Set<number>; objects?: Set<number> }): boolean {
563
+ if (targets.kills.has(cr.entry)) return true;
564
+ if (!targets.items.size) return false;
565
+ // QI3: any loot row for a still-tracked quest item (condition gating is applied by the
566
+ // planner's creatureDropsItem / huntableQuests path when deciding fights).
567
+ return ds.lootTable(cr.lootId).some((e) => targets.items.has(e.item));
568
+ }
569
+
570
+ export function neighbourZones(ds: DataStore, zoneId: string): ZoneDef[] {
571
+ const zone = ds.zone(zoneId);
572
+ if (!zone) return [];
573
+ return zone.neighbors.map((id) => ds.zone(id)).filter((z): z is ZoneDef => !!z);
574
+ }
575
+
576
+ /** The trainer for a given class present in the zone, if any. */
577
+ export function zoneTrainer(ds: DataStore, zoneId: string, cls: number): TrainerDef | undefined {
578
+ const zone = ds.zone(zoneId);
579
+ const link = zone?.trainers.find((t) => t.cls === cls);
580
+ return link ? ds.trainer(link.entry) : undefined;
581
+ }
582
+
583
+ /** Weapon masters (TrainerType=2) present in the zone, if any. */
584
+ export function zoneWeaponTrainers(ds: DataStore, zoneId: string): TrainerDef[] {
585
+ const zone = ds.zone(zoneId);
586
+ if (!zone?.weaponTrainers?.length) return [];
587
+ return zone.weaponTrainers
588
+ .map((e) => ds.trainer(e))
589
+ .filter((t): t is TrainerDef => !!t);
590
+ }
591
+
592
+ /** Hunter pet trainers present in the zone (empty if none — `zone.petTrainers` is optional). */
593
+ export function zonePetTrainers(ds: DataStore, zoneId: string): TrainerDef[] {
594
+ const zone = ds.zone(zoneId);
595
+ if (!zone?.petTrainers?.length) return [];
596
+ return zone.petTrainers
597
+ .map((e) => ds.trainer(e))
598
+ .filter((t): t is TrainerDef => !!t);
599
+ }
600
+
601
+ /** Vendor entries spawned in the zone: baked zone.vendors plus innkeepers who have a stock table. */
602
+ export function zoneVendorEntries(zone: { vendors?: number[]; innkeepers?: { entry: number }[] }): number[] {
603
+ const seen = new Set<number>();
604
+ const out: number[] = [];
605
+ const add = (e: number): void => {
606
+ if (!(e > 0) || seen.has(e)) return;
607
+ seen.add(e);
608
+ out.push(e);
609
+ };
610
+ for (const e of zone.vendors ?? []) add(e);
611
+ for (const i of zone.innkeepers ?? []) add(i.entry);
612
+ return out;
613
+ }
614
+
615
+ /**
616
+ * Vendors present in the zone (empty if none — a zone's `vendors` list is optional).
617
+ * Innkeepers with an npc_vendor table are merchants too (Helbrek / Flagon of Mead).
618
+ * PRODUCT RULE: the two capital halls have no door. `requiredVisualRank` stays baked (12 NPCs,
619
+ * Player.cpp:19962 ENTER_HALL_RANK 6) but nothing gates on it — Honor Points buy the shelf, so
620
+ * hiding the quartermaster behind a rank would hide the currency's only sink.
621
+ */
622
+ export function zoneVendors(ds: DataStore, zoneId: string): VendorDef[] {
623
+ const zone = ds.zone(zoneId);
624
+ if (!zone) return [];
625
+ return zoneVendorEntries(zone)
626
+ .map((e) => ds.vendor(e))
627
+ .filter((v): v is VendorDef => !!v);
628
+ }
629
+
630
+ // The zone's vendors who will deal with this character: enemy-faction merchants and factions you
631
+ // declared war on refuse. Cite: ItemHandler.cpp:704 GetNPCIfCanInteractWith(UNIT_NPC_FLAG_VENDOR).
632
+ export function interactableZoneVendors(
633
+ ds: DataStore,
634
+ zoneId: string,
635
+ race: number,
636
+ atWar?: ReadonlySet<number>,
637
+ ): VendorDef[] {
638
+ return zoneVendors(ds, zoneId).filter((v) => canInteractWithCreature(ds, race, v.entry, atWar));
639
+ }
640
+
641
+ export type VendorStockHit = { vendorEntry: number; zoneId: string };
642
+
643
+ const vendorHitsByItem = new WeakMap<DataStore, Map<number, VendorStockHit[]>>();
644
+
645
+ function vendorHitsIndex(ds: DataStore): Map<number, VendorStockHit[]> {
646
+ let idx = vendorHitsByItem.get(ds);
647
+ if (idx) return idx;
648
+ idx = new Map();
649
+ for (const z of ds.zones()) {
650
+ for (const e of zoneVendorEntries(z)) {
651
+ const v = ds.vendor(e);
652
+ if (!v) continue;
653
+ for (const item of v.items) {
654
+ const list = idx.get(item);
655
+ const hit = { vendorEntry: v.entry, zoneId: z.id };
656
+ if (list) list.push(hit);
657
+ else idx.set(item, [hit]);
658
+ }
659
+ }
660
+ }
661
+ vendorHitsByItem.set(ds, idx);
662
+ return idx;
663
+ }
664
+
665
+ /** Prefer a merchant in `currentZone`, else any zone that stocks `itemId`. */
666
+ export function findVendorSelling(
667
+ ds: DataStore,
668
+ itemId: number,
669
+ currentZone: string,
670
+ ): VendorStockHit | null {
671
+ const hits = vendorHitsIndex(ds).get(itemId);
672
+ if (!hits || hits.length === 0) return null;
673
+ const known = (h: VendorStockHit): boolean => !!ds.vendor(h.vendorEntry);
674
+ const local = hits.find((h) => h.zoneId === currentZone && known(h));
675
+ if (local) return local;
676
+ return hits.find(known) ?? null;
677
+ }
678
+
679
+ /** Every zone-attached vendor that lists `itemId`; the same index findVendorSelling reads. */
680
+ export function vendorsSelling(ds: DataStore, itemId: number): VendorStockHit[] {
681
+ return vendorHitsIndex(ds).get(itemId) ?? [];
682
+ }
683
+
684
+ /** Gather nodes harvestable in the zone (mining/herbalism/fishing; empty if none). */
685
+ export function zoneNodes(ds: DataStore, zoneId: string): GatherNodeDef[] {
686
+ const zone = ds.zone(zoneId);
687
+ if (!zone) return [];
688
+ return (zone.nodes ?? []).map((id) => ds.gatherNode(id)).filter((n): n is GatherNodeDef => !!n);
689
+ }
690
+
691
+ /** Profession trainers present in the zone (empty if none). */
692
+ export function zoneProfTrainers(ds: DataStore, zoneId: string): ProfTrainerDef[] {
693
+ const zone = ds.zone(zoneId);
694
+ if (!zone) return [];
695
+ return (zone.profTrainers ?? []).map((e) => ds.profTrainer(e)).filter((t): t is ProfTrainerDef => !!t);
696
+ }
697
+
698
+ /** GameObjects (chests, clickables, nodes, containers) present/spawned in the zone.
699
+ * Uses real per-zone spawns from ZoneDef.objects (G2). Falls back to quest-ref derivation
700
+ * only for zones that have no baked `objects` field yet (pre-G2 data or no spawns in slice).
701
+ */
702
+ export function zoneGameObjects(ds: DataStore, zoneId: string): GameObjectDef[] {
703
+ const zone = ds.zone(zoneId);
704
+ if (!zone) return [];
705
+ // Real baked spawns (Lane G) take precedence so chests/clickables/nodes appear in-zone.
706
+ // Quest-ref fallback is kept only when the zone lacks an `objects` key entirely.
707
+ if (zone.objects !== undefined) {
708
+ const baked = (zone.objects ?? []).map((e) => ds.gameObject(e)).filter((g): g is GameObjectDef => !!g);
709
+ const extra = [
710
+ ...type11GameObjectsInZone(zoneId, ds.travelEdges(), (e) => ds.gameObject(e)),
711
+ ...type15GameObjectsInZone(zoneId, ds.transports(), (e) => ds.gameObject(e)),
712
+ ];
713
+ if (!extra.length) return baked;
714
+ const seen = new Set(baked.map((g) => g.entry));
715
+ for (const g of extra) if (!seen.has(g.entry)) baked.push(g);
716
+ return baked;
717
+ }
718
+ const ids = new Set<number>();
719
+ for (const qe of zone.quests ?? []) {
720
+ const q = ds.quest(qe);
721
+ if (q) for (const ot of (q.objectTargets || [])) ids.add(ot.objectEntry);
722
+ }
723
+ return [...ids].map((e) => ds.gameObject(e)).filter((g): g is GameObjectDef => !!g);
724
+ }
725
+
726
+ /**
727
+ * GameObject entries some quest names — an objective target, a goStarter or a goEnder. `zoneGoVisible`
728
+ * reads it so a Use that only ever mattered to a quest still shows its row. Built in one pass over
729
+ * `ds.quests()` because that map grows on `attachQuests`; callers hold the set for a render.
730
+ */
731
+ export function questReferencedGoEntries(ds: DataStore): Set<number> {
732
+ const s = new Set<number>();
733
+ for (const q of ds.quests()) {
734
+ for (const ot of (q.objectTargets ?? [])) s.add(ot.objectEntry);
735
+ if (q.goStarter) s.add(q.goStarter);
736
+ if (q.goEnder) s.add(q.goEnder);
737
+ for (const e of (q.goStarterEntries ?? [])) s.add(e);
738
+ for (const e of (q.goEnderEntries ?? [])) s.add(e);
739
+ }
740
+ return s;
741
+ }
742
+
743
+ /** Herb / vein GOs — already on the Gather row, or unusable without the skill. */
744
+ function isHerbOrMineGo(ds: DataStore, go: GameObjectDef): boolean {
745
+ const lock = go.lockId != null ? ds.lock(go.lockId) : undefined;
746
+ if (lockHasFreeOpenCase(lock)) return false;
747
+ const node = ds.gatherNode(go.entry);
748
+ if (node && (node.skill === 'herbalism' || node.skill === 'mining')) return true;
749
+ const hard = (lock?.cases ?? []).filter(
750
+ (c) => c.type === LOCK_KEY_SKILL && !isFreeOpenLockType(c.index) && c.index !== 0,
751
+ );
752
+ if (!hard.length) return false;
753
+ return hard.every((c) => {
754
+ const skill = skillByLockType(c.index);
755
+ return skill === SKILL_HERBALISM || skill === SKILL_MINING;
756
+ });
757
+ }
758
+
759
+ /**
760
+ * Object list on Main: drop herb/vein rows, then drop the rows whose Use resolves ok and shows the
761
+ * player nothing at all (`goUseHasOutcome`). Pass `questRefs` from `questReferencedGoEntries` once
762
+ * per render; without it only the herb/vein rule applies.
763
+ */
764
+ export function zoneGoVisible(ds: DataStore, go: GameObjectDef, questRefs?: ReadonlySet<number>): boolean {
765
+ if (isHerbOrMineGo(ds, go)) return false;
766
+ if (!questRefs) return true;
767
+ return goUseHasOutcome(go, {
768
+ questReferenced: questRefs.has(go.entry),
769
+ hasPageText: firstPageForGo(go.entry) != null,
770
+ isGatherNode: !!ds.gatherNode(go.entry),
771
+ hasScriptedUse: ds.goUseScripts(go.entry).length > 0 || !!scriptDevByGo(go.entry)?.goUse,
772
+ });
773
+ }
774
+
775
+ /** Quest log + fishing line for `goVisibleForPlayer` / `zoneGoListedForPlayer`. */
776
+ export function makeGoPlayerVisibility(
777
+ ds: DataStore,
778
+ log: QuestLog,
779
+ hasFishing: boolean,
780
+ ): GoPlayerVisibility {
781
+ const incompleteQuestIds = new Set<number>();
782
+ for (const q of log.quests) {
783
+ if (q.status === 'active') incompleteQuestIds.add(q.entry);
784
+ }
785
+ return {
786
+ incompleteQuestIds,
787
+ neededItems: questNeededItems(log, (e) => ds.quest(e)),
788
+ neededGoEntries: questTargets(ds, log).objects,
789
+ hasFishing,
790
+ };
791
+ }
792
+
793
+ /** zoneGoVisible plus quest/fishing Use gates. Player view from makeGoPlayerVisibility. */
794
+ export function zoneGoListedForPlayer(
795
+ ds: DataStore,
796
+ go: GameObjectDef,
797
+ questRefs: ReadonlySet<number> | undefined,
798
+ player: GoPlayerVisibility,
799
+ ): boolean {
800
+ if (!zoneGoVisible(ds, go, questRefs)) return false;
801
+ return goVisibleForPlayer(go, player, (lootId) => ds.lootTable(`go:${lootId}`));
802
+ }
803
+
804
+ export function canTravel(ds: DataStore, fromZone: string, toZone: string): boolean {
805
+ const zone = ds.zone(fromZone);
806
+ return !!zone && zone.neighbors.includes(toZone);
807
+ }
808
+
809
+ /** How many quests a zone offers that the character can accept right now — a hint for travel/map. */
810
+ export function availableQuestCount(ds: DataStore, zoneId: string, char: Character, log: QuestLog): number {
811
+ return offeredQuests(ds, zoneId, char, log).filter((o) => o.canAccept).length;
812
+ }