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,688 @@
1
+ // Peeled from createSession (Wave 4 createSession.md P3) — pattern (D).
2
+ // Roster/pool gens, living* pools, fightersOrder/bySide, free-fire / livingCombatEnemies.
3
+
4
+ import type { CombatContext } from './context.ts';
5
+ import { ALLY_HEAL_THRESHOLD } from './types.ts';
6
+ import type { Fighter } from './types.ts';
7
+ import type { EnemySide, Side } from '../core/events.ts';
8
+ import { isAllySide, isEnemySide, isTotemSide, type TotemSide } from '../core/events.ts';
9
+ import { CREATURE_STATIC_FLAGS2 } from '../../domain/creature/creatureAiConstants.ts';
10
+ import { navSightClear } from './navSight.ts';
11
+ import { CHARGE_INTERCEPT_MAX_YD, sameStoreyYd } from './combatGeometry.ts';
12
+
13
+ export type SessionPoolsDeps = {
14
+ /** Same liveness rule as createSession `dead` (`!(hp > 0)`). */
15
+ dead: (f: Fighter) => boolean;
16
+ // The seats createSession dealt, in order, ONCE. Nothing keeps them: `bySideMap` is the storage from
17
+ // here on, and `enemyBlock()` / `allyBlock()` are the ordered views over it.
18
+ seedEnemies: readonly Fighter[];
19
+ seedAllies: readonly Fighter[];
20
+ };
21
+
22
+ export function installSessionPools(ctx: CombatContext, deps: SessionPoolsDeps): void {
23
+ const dead = deps.dead;
24
+ const { player, enemy, pet, totems, cfg } = ctx;
25
+
26
+ // E7: tick/roster-scoped memo for fightersOrder + faction pools (docs/raids/performance-plan §3B).
27
+ // Composition gen (inject/totem) vs pool gen (death/charm) vs pos gen (acquire sorts).
28
+ let rosterGen = 0;
29
+ let poolGen = 0;
30
+ let fightersOrderCache: Fighter[] | null = null;
31
+ let fightersOrderCacheGen = -1;
32
+ let fightersOrderCacheTotems: Fighter[] = [];
33
+ let partyUnitsCache: Fighter[] | null = null;
34
+ let partyUnitsCacheGen = -1;
35
+ let allSeatsCache: Fighter[] | null = null;
36
+ let allSeatsCacheGen = -1;
37
+ let enemyBlockCache: Fighter[] | null = null;
38
+ let enemyBlockCacheGen = -1;
39
+ let allyBlockCache: Fighter[] | null = null;
40
+ let allyBlockCacheGen = -1;
41
+ const friendlyPoolCache = new Map<string, { gen: number; pool: Fighter[] }>();
42
+ const hostilesNoAcqCache = new Map<string, { gen: number; list: Fighter[] }>();
43
+ const hostilesAcqCache = new Map<string, { poolGen: number; posGen: number; list: Fighter[] }>();
44
+ const freeFireCache = new Map<string, {
45
+ poolGen: number;
46
+ posGen: number;
47
+ focus: string | null;
48
+ manual: string | null;
49
+ threatN: number;
50
+ list: Fighter[];
51
+ }>();
52
+ let livingEnemiesCache: Fighter[] | null = null;
53
+ let livingEnemiesCacheGen = -1;
54
+ let livingFriendliesCache: Fighter[] | null = null;
55
+ let livingFriendliesCacheGen = -1;
56
+ let livingAlliesCache: Fighter[] | null = null;
57
+ let livingAlliesCacheGen = -1;
58
+ // SIDE -> UNIT, and this Map IS the roster: the seat arrays it mirrored are gone from the context. Safe
59
+ // to maintain incrementally only because one place writes it. Gate: src/dev/smoke/rosterCoherence.mjs.
60
+ const bySideMap = new Map<string, Fighter>();
61
+ // GUID -> SEAT, the inverse of `spec.guid`, by the same one writer. Without it `sideOfGuid` walks the
62
+ // roster per call, and callers ask inside loops — 40 units times 50 entities every tick.
63
+ const guidToSide = new Map<number, Side>();
64
+ const seatUnit = (f: Fighter, outgoing?: Fighter): void => {
65
+ const gone = (outgoing?.spec.guid ?? 0) | 0;
66
+ if (gone !== 0 && guidToSide.get(gone) === outgoing!.side) guidToSide.delete(gone);
67
+ bySideMap.set(f.side, f);
68
+ const g = (f.spec.guid ?? 0) | 0;
69
+ if (g !== 0) guidToSide.set(g, f.side);
70
+ };
71
+ /** The seat a world id currently occupies. Set/cleared by stampUnitGuid / releaseUnitGuid. */
72
+ const noteUnitGuid = (side: Side, guid: number | null): void => {
73
+ if (guid == null) {
74
+ for (const [g, s] of guidToSide) if (s === side) guidToSide.delete(g);
75
+ return;
76
+ }
77
+ guidToSide.set(guid | 0, side);
78
+ };
79
+ const unitByGuid = (guid: number): Fighter | undefined => {
80
+ const side = guidToSide.get(guid | 0);
81
+ return side != null ? bySideMap.get(side) : undefined;
82
+ };
83
+ const clearPoolCaches = (): void => {
84
+ friendlyPoolCache.clear();
85
+ hostilesNoAcqCache.clear();
86
+ hostilesAcqCache.clear();
87
+ freeFireCache.clear();
88
+ livingEnemiesCache = null;
89
+ livingEnemiesCacheGen = -1;
90
+ livingFriendliesCache = null;
91
+ livingFriendliesCacheGen = -1;
92
+ livingAlliesCache = null;
93
+ livingAlliesCacheGen = -1;
94
+ };
95
+ const bumpRoster = (): void => {
96
+ rosterGen++;
97
+ poolGen++;
98
+ fightersOrderCache = null;
99
+ fightersOrderCacheGen = -1;
100
+ partyUnitsCache = null;
101
+ partyUnitsCacheGen = -1;
102
+ allSeatsCache = null;
103
+ allSeatsCacheGen = -1;
104
+ enemyBlockCache = null;
105
+ enemyBlockCacheGen = -1;
106
+ allyBlockCache = null;
107
+ allyBlockCacheGen = -1;
108
+ clearPoolCaches();
109
+ };
110
+ // THE ONE WRITER for roster membership: seat and generation move together, so a caller cannot do one
111
+ // and not the other. A SEAT IS NAMED BY ITS SIDE, and the ordinal conversion lives here alone.
112
+ const rosterSeatEnemy = (side: EnemySide, f: Fighter): void => {
113
+ seatUnit(f, bySideMap.get(side));
114
+ bumpRoster();
115
+ };
116
+ const rosterSeatAlly = (side: Side, f: Fighter): void => {
117
+ seatUnit(f, bySideMap.get(side));
118
+ bumpRoster();
119
+ };
120
+ // One BLOCK's seats, alive or dead, in turn order — the middle answer between `allSeats()` and the
121
+ // living views, for sweeps that act ON a corpse. Memoized on ROSTER gen, since a death keeps its seat.
122
+ const enemyBlock = (): readonly Fighter[] => {
123
+ if (enemyBlockCache && enemyBlockCacheGen === rosterGen) return enemyBlockCache;
124
+ const o: Fighter[] = [];
125
+ for (const f of bySideMap.values()) if (isEnemySide(f.side)) o.push(f);
126
+ enemyBlockCache = o;
127
+ enemyBlockCacheGen = rosterGen;
128
+ return o;
129
+ };
130
+ const allyBlock = (): readonly Fighter[] => {
131
+ if (allyBlockCache && allyBlockCacheGen === rosterGen) return allyBlockCache;
132
+ const o: Fighter[] = [];
133
+ for (const f of bySideMap.values()) if (isAllySide(f.side)) o.push(f);
134
+ allyBlockCache = o;
135
+ allyBlockCacheGen = rosterGen;
136
+ return o;
137
+ };
138
+ // The seat an inject should take: the first DEAD seat in the block, else the next ordinal. `want` is
139
+ // the block's recycle rule — an ally seat takes only one this session summoned. Null when full.
140
+ const freeSeatIn = (
141
+ isBlock: (s: Side) => boolean,
142
+ nameAt: (i: number) => Side,
143
+ want: (f: Fighter) => boolean,
144
+ cap: number,
145
+ ): Side | null => {
146
+ let n = 0;
147
+ let free: Side | null = null;
148
+ for (const f of bySideMap.values()) {
149
+ if (!isBlock(f.side)) continue;
150
+ n++;
151
+ if (free === null && !(f.hp > 0) && want(f)) free = f.side;
152
+ }
153
+ if (free !== null) return free;
154
+ if (n >= cap) return null;
155
+ // A forced seat (tick seam) can leave a gap below the count, so the ordinal is checked against
156
+ // the store rather than assumed free. Same answer as before whenever there is no gap.
157
+ let i = n;
158
+ while (bySideMap.has(nameAt(i))) i++;
159
+ return nameAt(i);
160
+ };
161
+ const rosterSetTotem = (side: TotemSide, f: Fighter): void => {
162
+ totems.set(side, f);
163
+ seatUnit(f);
164
+ bumpRoster();
165
+ };
166
+ const rosterClearTotem = (side: TotemSide): void => {
167
+ const gone = totems.get(side);
168
+ totems.delete(side);
169
+ if (gone) bySideMap.delete(gone.side);
170
+ bumpRoster();
171
+ };
172
+
173
+ /** Membership of friendly/hostile pools changed without fightersOrder composition change. */
174
+ const bumpPool = (): void => {
175
+ poolGen++;
176
+ clearPoolCaches();
177
+ };
178
+
179
+ // Turn order: player, pet, allies, totems, enemies, cached until roster mutation. Block is the seat's
180
+ // KIND and order within it is Map insertion order, which is exactly what the seat array's order was.
181
+ const fightersOrder = (): Fighter[] => {
182
+ if (fightersOrderCache && fightersOrderCacheGen === rosterGen) {
183
+ // Totem hp can hit 0 before unsummonTotem bumps roster — drop stale. Re-check only the totems the
184
+ // cached order holds: the old form scanned all 56 fighters per hit, 3.8% of tick self time.
185
+ let totemOk = true;
186
+ for (const f of fightersOrderCacheTotems) {
187
+ if (!(f.hp > 0)) { totemOk = false; break; }
188
+ }
189
+ if (totemOk) return fightersOrderCache;
190
+ }
191
+ // One pass, two blocks. A seat that somehow appeared twice in an array is here once, which
192
+ // is what `rosterCoherence`'s no-duplicate-seat arm already requires.
193
+ const allyBlock: Fighter[] = [];
194
+ const enemyBlock: Fighter[] = [];
195
+ for (const f of bySideMap.values()) {
196
+ if (isAllySide(f.side)) allyBlock.push(f);
197
+ else if (isEnemySide(f.side)) enemyBlock.push(f);
198
+ }
199
+ const o: Fighter[] = [player];
200
+ if (pet) o.push(pet);
201
+ for (const al of allyBlock) o.push(al);
202
+ fightersOrderCacheTotems = [];
203
+ // Summon order, which is deterministic — the four-slot walk this replaced could not name
204
+ // two shamans' seats apart.
205
+ for (const tot of totems.values()) {
206
+ if (tot && tot.hp > 0) { o.push(tot); fightersOrderCacheTotems.push(tot); }
207
+ }
208
+ for (const ef of enemyBlock) o.push(ef);
209
+ fightersOrderCache = o;
210
+ fightersOrderCacheGen = rosterGen;
211
+ return o;
212
+ };
213
+
214
+ // Player, pet, companions as one list in turn order. Four sites built it by hand for the aggro pulse,
215
+ // two inside per-tick loops. Same memo rule as `fightersOrder`; the pet is included even when absent.
216
+ const partyUnits = (): readonly Fighter[] => {
217
+ if (partyUnitsCache && partyUnitsCacheGen === rosterGen) return partyUnitsCache;
218
+ const o: Fighter[] = [player];
219
+ if (pet) o.push(pet);
220
+ for (const f of bySideMap.values()) if (isAllySide(f.side)) o.push(f);
221
+ partyUnitsCache = o;
222
+ partyUnitsCacheGen = rosterGen;
223
+ return o;
224
+ };
225
+
226
+ // EVERY seat, alive or dead, totems included. NOT `fightersOrder()`: that drops a dead totem, and a
227
+ // sweep that snaps NaN HP has to reach a unit before its liveness is judged.
228
+ const allSeats = (): readonly Fighter[] => {
229
+ if (allSeatsCache && allSeatsCacheGen === rosterGen) return allSeatsCache;
230
+ const o: Fighter[] = [];
231
+ for (const f of bySideMap.values()) o.push(f);
232
+ allSeatsCache = o;
233
+ allSeatsCacheGen = rosterGen;
234
+ return o;
235
+ };
236
+
237
+ // Seeded once from the seats createSession dealt; every change after this comes through the
238
+ // writers above. Nothing re-derives it, which is the point.
239
+ bySideMap.set('player', player);
240
+ if (pet) bySideMap.set(pet.side, pet);
241
+ for (const a of deps.seedAllies) if (!bySideMap.has(a.side)) bySideMap.set(a.side, a);
242
+ for (const e of deps.seedEnemies) if (!bySideMap.has(e.side)) bySideMap.set(e.side, e);
243
+ for (const tot of totems.values()) if (tot && !bySideMap.has(tot.side)) bySideMap.set(tot.side, tot);
244
+ for (const f of bySideMap.values()) {
245
+ const g = (f.spec.guid ?? 0) | 0;
246
+ if (g !== 0) guidToSide.set(g, f.side);
247
+ }
248
+
249
+ const sideFighter = (s: Side): Fighter | undefined => bySideMap.get(s);
250
+ const bySide = (s: Side): Fighter => {
251
+ const hit = sideFighter(s);
252
+ if (hit) return hit;
253
+ // Same miss fallbacks as the old linear scan (unknown enemy → primary, else player).
254
+ // A floor session may hold no primary at all, and then there is nothing to miss to.
255
+ if (isEnemySide(s) && enemy) return enemy;
256
+ if (s === 'pet') return pet!;
257
+ return player;
258
+ };
259
+
260
+ // Same liveness rule as `dead()` (`!(hp > 0)`) so NaN HP counts as dead.
261
+ // poolGen-stamped: Cleave / Magma / Multi-Shot used to re-filter enemies[] per impact.
262
+ const livingEnemies = (): Fighter[] => {
263
+ if (livingEnemiesCache && livingEnemiesCacheGen === poolGen) {
264
+ let ok = true;
265
+ for (const e of livingEnemiesCache) {
266
+ if (!(e.hp > 0)) { ok = false; break; }
267
+ }
268
+ if (ok) return livingEnemiesCache;
269
+ }
270
+ // Off the store. Order is what the seat array's was: within a block a Map keeps a recycled key in
271
+ // place and appends a new one, exactly as `enemies[idx] = f` and `push` did.
272
+ const out: Fighter[] = [];
273
+ for (const e of bySideMap.values()) if (isEnemySide(e.side) && e.hp > 0) out.push(e);
274
+ livingEnemiesCache = out;
275
+ livingEnemiesCacheGen = poolGen;
276
+ return out;
277
+ };
278
+ // The ALLY-seat twin of `livingEnemies`. Liveness ONLY, no charm filter: that is what separates it
279
+ // from `livingFriendlies`, which is the TARGETING pool and drops a charmed unit.
280
+ const livingAllies = (): Fighter[] => {
281
+ if (livingAlliesCache && livingAlliesCacheGen === poolGen) {
282
+ let ok = true;
283
+ for (const a of livingAlliesCache) {
284
+ if (!(a.hp > 0)) { ok = false; break; }
285
+ }
286
+ if (ok) return livingAlliesCache;
287
+ }
288
+ const out: Fighter[] = [];
289
+ for (const a of bySideMap.values()) if (isAllySide(a.side) && a.hp > 0) out.push(a);
290
+ livingAlliesCache = out;
291
+ livingAlliesCacheGen = poolGen;
292
+ return out;
293
+ };
294
+ // Floor stream injects passives with empty threat, so free AI must not treat them as "pull everything
295
+ // in range" — only threat, or an explicit player or ally target.
296
+ const enemyHasThreat = (ef: Fighter): boolean => {
297
+ if (!isEnemySide(ef.side)) return true;
298
+ const tm = ctx.threatOf(ef);
299
+ return !tm || !tm.isEmpty();
300
+ };
301
+ const allEnemiesDead = (): boolean => {
302
+ for (const e of bySideMap.values()) if (isEnemySide(e.side) && e.hp > 0) return false;
303
+ return true;
304
+ };
305
+ // Full party wipe: player AND every companion down. A dead player with living allies is not a wipe;
306
+ // solo still ends on player death, and the pet is benched rather than counted.
307
+ const partyWiped = (): boolean => {
308
+ if (!dead(player)) return false;
309
+ let standing: Fighter[] | null = null;
310
+ for (const a of bySideMap.values()) {
311
+ if (!isAllySide(a.side) || dead(a) || a.spec.summonOwnerSide != null) continue;
312
+ (standing ??= []).push(a);
313
+ }
314
+ if (!standing) return true;
315
+ // A COMPANION'S PET IS NOT A PARTY MEMBER either. A warlock's demon outliving its owner held
316
+ // the wipe open and the run "continued" on a pet. Cite: Player.cpp:1666-1673 RemovePet.
317
+ for (const a of bySideMap.values()) {
318
+ const petSide = a.spec.petSide;
319
+ if (petSide == null || !isAllySide(a.side)) continue;
320
+ const i = standing.findIndex((l) => l.side === petSide);
321
+ if (i >= 0) standing.splice(i, 1);
322
+ }
323
+ return standing.length === 0;
324
+ };
325
+
326
+ // Faction bucket: party seats are 'player', enemies 'enemy'. Drives the Dispel Magic positive rule,
327
+ // and charm temporarily flips the charmed unit. Cite: Unit.cpp TakeCharmOf SetFactionTemporary.
328
+ const nativeFactionOf = (side: Side): 'player' | 'enemy' => (isEnemySide(side) ? 'enemy' : 'player');
329
+ const isUnattackable = (f: Fighter, observer?: Fighter | null): boolean => {
330
+ if (f.unattackableUntil > ctx.t) return true;
331
+ if (f.feigningUntil > ctx.t) {
332
+ if (observer && ((observer.spec.staticFlags2 ?? 0) & CREATURE_STATIC_FLAGS2.IGNORE_FEIGN_DEATH) !== 0) {
333
+ return false;
334
+ }
335
+ return true;
336
+ }
337
+ return false;
338
+ };
339
+ const isCharmed = (f: Fighter): boolean => f.charmedUntil > ctx.t && f.charmedBy != null;
340
+ /** Live faction after charm side-switch. Charmer side's native faction wins. */
341
+ const factionOfFighter = (f: Fighter): 'player' | 'enemy' => {
342
+ if (isCharmed(f) && f.charmedBy != null) return nativeFactionOf(f.charmedBy);
343
+ return nativeFactionOf(f.side);
344
+ };
345
+ const factionOf = (side: Side): 'player' | 'enemy' => {
346
+ // Prefer fighter lookup so charm flips apply to pool/dispel rules.
347
+ // Miss stays nativeFactionOf — do not use bySide fallbacks (those hand back player/enemy).
348
+ if (side === 'player') return factionOfFighter(player);
349
+ if (side === 'pet' && pet) return factionOfFighter(pet);
350
+ if (isAllySide(side) || isEnemySide(side)) {
351
+ const f = sideFighter(side);
352
+ if (f) return factionOfFighter(f);
353
+ }
354
+ return nativeFactionOf(side);
355
+ };
356
+ const livingHostilesFor = (f: Fighter): Fighter[] => {
357
+ const myFac = factionOfFighter(f);
358
+ const ignores = ((f.spec.staticFlags2 ?? 0) & CREATURE_STATIC_FLAGS2.IGNORE_FEIGN_DEATH) !== 0;
359
+ const cacheKey = myFac + (ignores ? '_ign' : '');
360
+ const acq = cfg.acquireRangeYd;
361
+ // Same opposite-faction living set for every unit of a faction (self is same-faction, so
362
+ // the old per-caller `x.side === f.side` skip was redundant). Share it on poolGen.
363
+ const factionOpp = (): Fighter[] => {
364
+ const hit = hostilesNoAcqCache.get(cacheKey);
365
+ if (hit && hit.gen === poolGen) {
366
+ if (hit.list.every((h) => !dead(h) && !isUnattackable(h, f))) return hit.list;
367
+ }
368
+ const out: Fighter[] = [];
369
+ for (const x of fightersOrder()) {
370
+ if (dead(x) || isUnattackable(x, f)) continue;
371
+ if (factionOfFighter(x) === myFac) continue;
372
+ out.push(x);
373
+ }
374
+ hostilesNoAcqCache.set(cacheKey, { gen: poolGen, list: out });
375
+ return out;
376
+ };
377
+ // Local acquisition for whole-map sessions: only hostiles in range, nearest first. Without it
378
+ // `foeOf` tunnels the first unit in fighter order, which in a 20-unit map session is 800 yd away.
379
+ if (acq != null && ctx.unitPositionsMutable) {
380
+ const hit = hostilesAcqCache.get(f.side);
381
+ if (hit && hit.poolGen === poolGen && hit.posGen === ctx.posGen) {
382
+ // Drop newly-dead without full rebuild when only liveness flipped.
383
+ if (hit.list.every((h) => !dead(h) && !isUnattackable(h, f))) return hit.list;
384
+ }
385
+ const out = factionOpp();
386
+ const near: Array<{ h: Fighter; d: number }> = [];
387
+ const from = ctx.posOf(f.side);
388
+ for (const h of out) {
389
+ if (!sameStoreyYd(from, ctx.posOf(h.side))) continue;
390
+ const d = ctx.distanceBetween(f, h);
391
+ if (d != null && d <= acq) near.push({ h, d });
392
+ }
393
+ near.sort((a, b) => a.d - b.d);
394
+ const list = near.map((e) => e.h);
395
+ hostilesAcqCache.set(f.side, { poolGen, posGen: ctx.posGen, list });
396
+ return list;
397
+ }
398
+ return factionOpp();
399
+ };
400
+ const friendlyPoolOf = (f: Fighter): Fighter[] => {
401
+ const myFac = factionOfFighter(f);
402
+ // Charmed units fight for the other side — never heal/buff them as "friendly".
403
+ // Cite: TakeCharmOf faction flip; heal triage must use faction-after-charm.
404
+ const buildBase = (): Fighter[] => {
405
+ const out: Fighter[] = [];
406
+ for (const x of fightersOrder()) {
407
+ if (dead(x) || isCharmed(x)) continue;
408
+ if (factionOfFighter(x) !== myFac) continue;
409
+ out.push(x);
410
+ }
411
+ return out;
412
+ };
413
+ // Endless enemy threat filter flips often — cache only the base, re-filter threat.
414
+ // Cite: injectEnemySpec passive; RANGE-ARCHITECTURE class B; DoSelectLowestHpFriendly.
415
+ if (cfg.endless && myFac === 'enemy') {
416
+ let base: Fighter[];
417
+ const hit = friendlyPoolCache.get(myFac);
418
+ if (hit && hit.gen === poolGen && hit.pool.every((x) => !dead(x) && !isCharmed(x))) {
419
+ base = hit.pool;
420
+ } else {
421
+ base = buildBase();
422
+ friendlyPoolCache.set(myFac, { gen: poolGen, pool: base });
423
+ }
424
+ return base.filter((x) => x.side === f.side || enemyHasThreat(x));
425
+ }
426
+ const hit = friendlyPoolCache.get(myFac);
427
+ if (hit && hit.gen === poolGen) {
428
+ if (hit.pool.every((x) => !dead(x) && !isCharmed(x) && factionOfFighter(x) === myFac)) {
429
+ return hit.pool;
430
+ }
431
+ }
432
+ const pool = buildBase();
433
+ friendlyPoolCache.set(myFac, { gen: poolGen, pool });
434
+ return pool;
435
+ };
436
+ // Living free friendlies, the player side's heal/buff pool; an enemy healer must use
437
+ // `friendlyPoolOf`. NO TOTEMS — both AoE target checks refuse one. Cite: GridNotifiers.h:1157, :979.
438
+ const livingFriendlies = (): Fighter[] => {
439
+ if (livingFriendliesCache && livingFriendliesCacheGen === poolGen) {
440
+ let ok = true;
441
+ for (const fr of livingFriendliesCache) {
442
+ if (!(fr.hp > 0) || isCharmed(fr)) { ok = false; break; }
443
+ }
444
+ if (ok) return livingFriendliesCache;
445
+ }
446
+ // `partyUnits()` is the same three blocks in the same order, already composed off the store
447
+ // and memoized on roster gen, so this filters it instead of re-walking the seat fields (E1.1).
448
+ const out: Fighter[] = [];
449
+ for (const fr of partyUnits()) if (fr.hp > 0 && !isCharmed(fr)) out.push(fr);
450
+ livingFriendliesCache = out;
451
+ livingFriendliesCacheGen = poolGen;
452
+ return out;
453
+ };
454
+ // Lowest-HP-percent living free unit in `pool`. Deterministic — fixed iteration order, first-lowest wins
455
+ // ties. Pool must already exclude dead/charmed.
456
+ const lowestHpInPool = (pool: readonly Fighter[]): Fighter | null => {
457
+ let best: Fighter | null = null;
458
+ let bestPct = Number.POSITIVE_INFINITY;
459
+ for (const fr of pool) {
460
+ // Never triage a totem: immune to SPELL_EFFECT_HEAL / ENERGIZE, and its 5 HP make one
461
+ // splash the lowest-HP body on the side. Cite: Entities/Totem.cpp:261-280.
462
+ if (isTotemSide(fr.side)) continue;
463
+ const pct = fr.hp / Math.max(1, fr.spec.maxHealth);
464
+ if (pct < bestPct) { best = fr; bestPct = pct; }
465
+ }
466
+ return best;
467
+ };
468
+ // Heal triage for the player party (ally AI / player groupRole healer). Enemy casters must use
469
+ // lowestHpFriendlyOf(caster) — faction-relative.
470
+ const lowestHpFriendly = (): Fighter | null => lowestHpInPool(livingFriendlies());
471
+ // Faction-relative heal triage, and under local acquisition it sees only friendlies inside that
472
+ // radius — a healer must not top someone off across the whole map. Cite: DoSelectLowestHpFriendly.
473
+ const lowestHpFriendlyOf = (f: Fighter): Fighter | null => {
474
+ let pool = friendlyPoolOf(f);
475
+ // A macro aimed this cast at a named ally: honour it while it is legal. Everything else
476
+ // (every AI cast, every unpinned player cast) falls through to triage below.
477
+ if (f.friendlyPin) {
478
+ const pinned = pool.find((x) => x.side === f.friendlyPin && !dead(x));
479
+ if (pinned) return pinned;
480
+ }
481
+ const acq = cfg.acquireRangeYd;
482
+ if (acq != null && ctx.unitPositionsMutable) {
483
+ pool = pool.filter((x) => {
484
+ if (x.side === f.side) return true;
485
+ const d = ctx.distanceBetween(f, x);
486
+ return d == null || d <= acq;
487
+ });
488
+ }
489
+ // Prefer a WOUNDED ally this caster can see. With none sighted the pool stands, so the cast gate
490
+ // refuses instead of this quietly topping off a healthy body. Cite: Spell.cpp:4742 CheckCast.
491
+ if (cfg.navLos && ctx.unitPositionsMutable) {
492
+ const seen = pool.filter(
493
+ (x) => x.hp / Math.max(1, x.spec.maxHealth) < ALLY_HEAL_THRESHOLD
494
+ && (x.side === f.side || navSightClear(cfg, ctx.posOf(f.side), ctx.posOf(x.side))),
495
+ );
496
+ if (seen.length > 0) pool = seen;
497
+ }
498
+ // Arena only: GetHealTarget job order, not raw lowest-HP. A healer at 55% is picked over a
499
+ // DPS at 40% so the kill-target lives. Cite: PlayerbotClassAI.cpp:31-34 thresholds, :314-327.
500
+ if (cfg.enemiesAreATeam === true) {
501
+ const pctOf = (u: Fighter): number => (u.hp / Math.max(1, u.spec.maxHealth)) * 100;
502
+ const living = pool.filter((u) => !dead(u) && !isTotemSide(u.side));
503
+ const best = (xs: Fighter[]): Fighter | null => lowestHpInPool(xs);
504
+ const tank = best(living.filter((u) => u.spec.groupRole === 'tank' && pctOf(u) <= 80));
505
+ if (tank) return tank;
506
+ const healer = best(living.filter((u) => u.spec.groupRole === 'healer' && pctOf(u) <= 60));
507
+ if (healer) return healer;
508
+ const dps = best(living.filter(
509
+ (u) => u.spec.groupRole !== 'tank' && u.spec.groupRole !== 'healer' && pctOf(u) <= 30,
510
+ ));
511
+ if (dps) return dps;
512
+ const hurt = best(living.filter((u) => pctOf(u) < 100));
513
+ if (hurt) return hurt;
514
+ }
515
+ return lowestHpInPool(pool);
516
+ };
517
+ // Prefer real enemies over charmed former-allies, but never force "everyone kill the MC". Below:
518
+ // damage can never kill an enemy under death prevention or the UNKILLABLE flag, floored at 1 HP.
519
+ const isUnkillableEnemy = (h: Fighter): boolean => {
520
+ if (!isEnemySide(h.side)) return false;
521
+ if (((h.spec.staticFlags ?? 0) & 0x08) !== 0) return true;
522
+ return ctx.enemyCastBySide.get(h.side as EnemySide)?.eventAi.deathPrevention === true;
523
+ };
524
+ ctx.isUnkillableEnemy = isUnkillableEnemy;
525
+
526
+ const preferFocusHostile = (hostiles: Fighter[], from?: Fighter): Fighter | null => {
527
+ if (hostiles.length === 0) return null;
528
+ // A mob under break-on-damage CC is a last resort, not a first pick: AUTO-reselect handed back
529
+ // list order, which is the sheep as often as not. A stun is not skipped, and a click still wins.
530
+ const protectedCc = ctx.ccProtected;
531
+ const free = protectedCc ? hostiles.filter((h) => !protectedCc(h)) : hostiles;
532
+ let pool = free.length > 0 ? free : hostiles;
533
+ // An enemy under death prevention can never drop below 1 HP, so time on it is wasted by
534
+ // construction. Measured: 95,708 damage into one over 184 s, 0 of 9 dead; his adds were the fight.
535
+ const killable = pool.filter((h) => !isUnkillableEnemy(h));
536
+ if (killable.length > 0) pool = killable;
537
+ // Kill healers first (Flamewaker Healers at 100% HP). Creature kit: enemyCastBySide.healer;
538
+ // player-shaped seats: groupRole (squad.ts:766). Cite: PlayerbotClassAI.cpp:659 GetBotJob.
539
+ // The creature's own armed kit always counts. `groupRole` counts only in an ARENA: it is a
540
+ // player-shaped seat's role, and reading it in a raid re-aimed the whole party — Thaddius's
541
+ // adds stopped reviving alone, the drakonid constructs found no corpses and Jin'do died with
542
+ // no ward standing (smoke:slow, measured with and without). Cite: PlayerbotClassAI.cpp:659.
543
+ const isHealer = (h: Fighter): boolean =>
544
+ ctx.enemyCastBySide.get(h.side as EnemySide)?.healer === true
545
+ || (cfg.enemiesAreATeam === true && h.spec.groupRole === 'healer');
546
+ let healers = pool.filter(isHealer);
547
+ // Arena: healer-first among bodies inside Charge/Intercept 25 yd, else a reachable body.
548
+ // Cite: PlayerbotWarriorAI.cpp:175-176; plan §W11 (44 yd healer never closes).
549
+ if (cfg.enemiesAreATeam === true && from != null && ctx.distanceBetween) {
550
+ const inGapCloser = (h: Fighter): boolean => {
551
+ const d = ctx.distanceBetween(from, h);
552
+ return d != null && d <= CHARGE_INTERCEPT_MAX_YD;
553
+ };
554
+ const nearHealers = healers.filter(inGapCloser);
555
+ if (nearHealers.length > 0) {
556
+ healers = nearHealers;
557
+ } else {
558
+ const near = pool.filter(inGapCloser);
559
+ if (near.length > 0) {
560
+ pool = near;
561
+ healers = [];
562
+ }
563
+ }
564
+ }
565
+ if (healers.length > 0 && healers.length < pool.length) pool = healers;
566
+ const native = pool.find((h) => !isCharmed(h));
567
+ return native ?? pool[0]!;
568
+ };
569
+ const foePoolOf = (f: Fighter): Fighter[] => livingHostilesFor(f);
570
+
571
+ // Free-fire pool for the party: on a normal pull every living hostile is the fight. On the endless
572
+ // stream only enemies with threat or an explicit click, not every passive in the 48 yd stream.
573
+ const freeFireHostilesFor = (f: Fighter): Fighter[] => {
574
+ const all = livingHostilesFor(f);
575
+ if (!cfg.endless) return all;
576
+ // Drop ally/player latches that name a dead or non-hostile side before free-fire
577
+ // would re-arm a recycled passive on that slot (probe-controller-farpull A).
578
+ if (isAllySide(f.side)) {
579
+ const m = ctx.allyManualTarget.get(f.side);
580
+ if (m != null && !all.some((h) => h.side === m && !dead(h))) {
581
+ ctx.allyManualTarget.delete(f.side);
582
+ }
583
+ }
584
+ if (ctx.explicitEnemyFocus != null) {
585
+ const ef = bySideMap.get(ctx.explicitEnemyFocus);
586
+ if (!ef || dead(ef)) ctx.explicitEnemyFocus = null;
587
+ }
588
+ let threatN = 0;
589
+ for (const e of livingEnemies()) if (enemyHasThreat(e)) threatN++;
590
+ const focus = ctx.explicitEnemyFocus ?? null;
591
+ const manual = isAllySide(f.side) ? (ctx.allyManualTarget.get(f.side) ?? null) : null;
592
+ const cached = freeFireCache.get(f.side);
593
+ if (
594
+ cached
595
+ && cached.poolGen === poolGen
596
+ && cached.posGen === ctx.posGen
597
+ && cached.focus === focus
598
+ && cached.manual === manual
599
+ && cached.threatN === threatN
600
+ ) return cached.list;
601
+ // Sight is a PREFERENCE here, never a bar. Never acquire through a floor, but a mob already on our
602
+ // threat list stays legal: deleting the last one empties the pool and the party refuses to swing.
603
+ const seenOf = (h: Fighter): boolean =>
604
+ !cfg.navLos || navSightClear(cfg, ctx.posOf(f.side), ctx.posOf(h.side));
605
+ const pool: Fighter[] = [];
606
+ let anySeen = false;
607
+ // Record sight in the first pass — the filter used to call seenOf again for the same pair.
608
+ const seen = new Set<Fighter['side']>();
609
+ for (const h of all) {
610
+ if (!isEnemySide(h.side)) { pool.push(h); continue; }
611
+ // An explicit click still wins: the player may target what they can see on screen.
612
+ if (ctx.explicitEnemyFocus != null && h.side === ctx.explicitEnemyFocus) {
613
+ pool.push(h);
614
+ anySeen = true;
615
+ continue;
616
+ }
617
+ if (isAllySide(f.side) && ctx.allyManualTarget.get(f.side) === h.side) {
618
+ pool.push(h);
619
+ anySeen = true;
620
+ continue;
621
+ }
622
+ if (!enemyHasThreat(h)) continue;
623
+ pool.push(h);
624
+ if (seenOf(h)) {
625
+ anySeen = true;
626
+ seen.add(h.side);
627
+ }
628
+ }
629
+ // Something in sight to fight ⇒ fight that, and leave the mob behind the floor alone.
630
+ // Nothing in sight ⇒ the unseen attacker IS the fight; standing down is not an option.
631
+ const list = !anySeen ? pool : pool.filter((h) => {
632
+ if (!isEnemySide(h.side)) return true;
633
+ if (ctx.explicitEnemyFocus != null && h.side === ctx.explicitEnemyFocus) return true;
634
+ if (isAllySide(f.side) && ctx.allyManualTarget.get(f.side) === h.side) return true;
635
+ return seen.has(h.side);
636
+ });
637
+ freeFireCache.set(f.side, {
638
+ poolGen, posGen: ctx.posGen, focus, manual, threatN, list,
639
+ });
640
+ return list;
641
+ };
642
+ // Combat-relevant enemies for multi-target AI, Sweeping Strikes, untargeted threat pulses. Endless: never
643
+ // the whole passive stream. Cite: injectEnemySpec passive.
644
+ const livingCombatEnemies = (): Fighter[] => {
645
+ if (!cfg.endless) return livingEnemies();
646
+ return livingEnemies().filter((e) => {
647
+ if (enemyHasThreat(e)) return true;
648
+ if (ctx.explicitEnemyFocus != null && e.side === ctx.explicitEnemyFocus) return true;
649
+ return false;
650
+ });
651
+ };
652
+
653
+ ctx.bumpRoster = bumpRoster;
654
+ ctx.rosterSeatEnemy = rosterSeatEnemy;
655
+ ctx.freeSeatIn = freeSeatIn;
656
+ ctx.rosterSeatAlly = rosterSeatAlly;
657
+ ctx.rosterSetTotem = rosterSetTotem;
658
+ ctx.rosterClearTotem = rosterClearTotem;
659
+ ctx.unitByGuid = unitByGuid;
660
+ ctx.noteUnitGuid = noteUnitGuid;
661
+ ctx.bumpPool = bumpPool;
662
+ ctx.fightersOrder = fightersOrder;
663
+ ctx.partyUnits = partyUnits;
664
+ ctx.allSeats = allSeats;
665
+ ctx.enemyBlock = enemyBlock;
666
+ ctx.allyBlock = allyBlock;
667
+ ctx.bySide = bySide;
668
+ ctx.sideFighter = sideFighter;
669
+ ctx.livingEnemies = livingEnemies;
670
+ ctx.livingAllies = livingAllies;
671
+ ctx.enemyHasThreat = enemyHasThreat;
672
+ ctx.allEnemiesDead = allEnemiesDead;
673
+ ctx.partyWiped = partyWiped;
674
+ ctx.nativeFactionOf = nativeFactionOf;
675
+ ctx.isUnattackable = isUnattackable;
676
+ ctx.isCharmed = isCharmed;
677
+ ctx.factionOfFighter = factionOfFighter;
678
+ ctx.factionOf = factionOf;
679
+ ctx.livingHostilesFor = livingHostilesFor;
680
+ ctx.friendlyPoolOf = friendlyPoolOf;
681
+ ctx.livingFriendlies = livingFriendlies;
682
+ ctx.lowestHpFriendly = lowestHpFriendly;
683
+ ctx.lowestHpFriendlyOf = lowestHpFriendlyOf;
684
+ ctx.preferFocusHostile = preferFocusHostile;
685
+ ctx.foePoolOf = foePoolOf;
686
+ ctx.freeFireHostilesFor = freeFireHostilesFor;
687
+ ctx.livingCombatEnemies = livingCombatEnemies;
688
+ }