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,719 @@
1
+ // Peeled from createSession (Wave 4 createSession.md P1) — pattern (D).
2
+ // armEnemyCastState + inject/summon/despawn + ScriptDev onAggro-once.
3
+
4
+ import type { CombatContext, EnemyCastState } from './context.ts';
5
+ import type { CombatantSpec, Fighter } from './types.ts';
6
+ import type { ScriptDevAction } from '../../domain/scriptdev/types.ts';
7
+ import type { Rng } from '../core/rng.ts';
8
+ import type { Side, EnemySide } from '../core/events.ts';
9
+ import {
10
+ allySideAt, enemyIndexOfSide, enemySideAt, isAllySide, isEnemySide, MAX_ALLIES,
11
+ } from '../core/events.ts';
12
+ import { castableKitIds } from './castableKit.ts';
13
+ import { CREATURE_STATIC_FLAGS } from '../../domain/creature/creatureAiConstants.ts';
14
+ import { UNIT_FLAG } from '../../domain/creature/unitFlags.ts';
15
+ import { allowStoneskinGargoyleStoneForm } from '../../domain/scriptdev/naxxramas.ts';
16
+ import type { SpellDef, CreatureCastEntry } from '../../data/schema.ts';
17
+ import {
18
+ armCreatureCastSlots,
19
+ armEventAiState,
20
+ spawnOocSelfAuras,
21
+ castEntriesFromAiScripts,
22
+ enrichCastEntriesFromScripts,
23
+ hasCreatureCastSchedule,
24
+ mergeCastEntriesWithSpellList,
25
+ warnScheduleLessCreatureSpecial,
26
+ } from '../../domain/creature/creatureAi.ts';
27
+ import {
28
+ armScriptDevRuntime,
29
+ lifecycleActions,
30
+ scriptDevByCreature,
31
+ scriptDevScheduleForEntry,
32
+ } from '../../domain/scriptdev/index.ts';
33
+ import { ThreatManager, type CombatantId } from './threat.ts';
34
+ import {
35
+ injectEnemySlotPosition,
36
+ isEnemyCasterKit,
37
+ summonSpawnPosition,
38
+ type CombatPosYd,
39
+ type SummonWorldPoint,
40
+ } from './combatGeometry.ts';
41
+ import { applyForceDespawn, combatMovementFlavor } from './forceDespawnAction.ts';
42
+ import { makeFighter } from './fighterFactory.ts';
43
+ import { clampDisplacementToFloor, displaceFloorFromCfg } from './displaceFloor.ts';
44
+
45
+ export type SessionInjectDeps = {
46
+ dead: (f: Fighter) => boolean;
47
+ /** Resolve nearest living party side inside acquire for AttackStart seed. */
48
+ nearestPartyInAcquire: (enemySide: string) => CombatantId | null;
49
+ hostileTargetOf: (enemyF: Fighter) => Fighter;
50
+ /** Materialize kit for combat (createSession local or barrel). */
51
+ materializeSpecForCombat: (raw: CombatantSpec) => CombatantSpec;
52
+ };
53
+
54
+ /** Arm per-enemy cast / EventAI / ScriptDev state. Pure of session bag (rng + t). */
55
+ export function armEnemyCastState(
56
+ ef: Fighter,
57
+ rng: Rng,
58
+ outResetActions?: ScriptDevAction[],
59
+ t = 0,
60
+ ): EnemyCastState {
61
+ const spellById = new Map<number, SpellDef>(ef.spec.spells.map((s) => [s.id, s]));
62
+ const scripts = ef.spec.ai?.scripts;
63
+ // A PLAYER-CLASS BODY on an enemy seat - a duelist, an arena seat, a BG playerbot - is driven by
64
+ // its Rotation and carries no creature schedule, so its class kit is not a D4 defect. Same reason
65
+ // castableKit refuses to filter one. Cite: castableKit.ts:46-48; pickAction.ts:2915.
66
+ const playerBody = ef.spec.classId != null;
67
+ // S7: prefer top-level spellList; fall back to FE1 nest when only extract path ran.
68
+ const spellList =
69
+ ef.spec.spellList ??
70
+ ef.spec.ai?.spellLists ??
71
+ null;
72
+ // S9: ScriptDev IR schedule when creature is bound (and cast list not already ScriptDev-shaped).
73
+ const sdPlan =
74
+ ef.spec.creatureEntry != null
75
+ ? scriptDevScheduleForEntry(ef.spec.creatureEntry)
76
+ : null;
77
+ const sdIr =
78
+ ef.spec.creatureEntry != null
79
+ ? scriptDevByCreature(ef.spec.creatureEntry) ?? null
80
+ : null;
81
+ let entries: CreatureCastEntry[];
82
+ if (ef.spec.creatureCasts && ef.spec.creatureCasts.length > 0) {
83
+ // Rehydrate FRIENDLY_* / FACING / etc. params from full ai.scripts rows.
84
+ // Drop schedule-less bare `{spellId}` rows (D4) — keep EventAI / MAIN_SPELL / ScriptDev.
85
+ const enriched = enrichCastEntriesFromScripts(ef.spec.creatureCasts, scripts);
86
+ const scheduled = enriched.filter(hasCreatureCastSchedule);
87
+ if (scheduled.length < enriched.length) {
88
+ const dropped = enriched.filter((e) => !hasCreatureCastSchedule(e)).map((e) => e.spellId);
89
+ if (!playerBody) warnScheduleLessCreatureSpecial(ef.spec.name, dropped);
90
+ }
91
+ entries = scheduled;
92
+ } else if (sdPlan && sdPlan.castEntries.length > 0) {
93
+ // Bare kit + ScriptDev binding — arm IR timers (GAPS C.4).
94
+ entries = [...sdPlan.castEntries];
95
+ for (const sid of sdPlan.spellIds) {
96
+ if (spellById.has(sid)) continue;
97
+ const sp = ef.spec.spells.find((s) => s.id === sid);
98
+ if (sp) spellById.set(sid, sp);
99
+ }
100
+ } else if (scripts && scripts.length > 0) {
101
+ // CAST rows only — do not fall back to bare tpl spells (D4).
102
+ entries = castEntriesFromAiScripts(scripts);
103
+ } else if (spellList && spellList.length > 0) {
104
+ // Spell-list-only kit — arm via mergeCastEntriesWithSpellList below.
105
+ // Cite: UnitAI.cpp UpdateSpellLists; arm via castEntriesFromSpellList.
106
+ entries = [];
107
+ } else {
108
+ // Bare tpl kit, no schedule from any source → melee auto only (D4).
109
+ if (ef.spec.spells.length > 0 && !playerBody) {
110
+ warnScheduleLessCreatureSpecial(
111
+ ef.spec.name,
112
+ ef.spec.spells.map((s) => s.id),
113
+ );
114
+ }
115
+ entries = [];
116
+ }
117
+ // Append the spell-list timer slots, the same path the cast entries take. NOT when a ScriptDev IR owns
118
+ // the schedule: the IR IS the port of those rows, so merging the bake arms each ability twice.
119
+ if (!sdPlan?.castEntries.length) {
120
+ // ChanceRangedAttack is the base chance in ranged mode and chance - 50 in melee, so the
121
+ // creature's own auto-attack mode decides it. Cite: UnitAI.cpp:1227-1230.
122
+ entries = mergeCastEntriesWithSpellList(entries, spellList, rng, ef.mode === 'ranged');
123
+ }
124
+ const eventAi = armEventAiState(scripts, rng);
125
+ // Melee is disabled in the constructor for a no-melee critter, so 71 templates never have it to begin
126
+ // with. The 30 s flee itself is armed on combat entry, not here.
127
+ if (((ef.spec.staticFlags ?? 0) & CREATURE_STATIC_FLAGS.NO_MELEE_FLEE) !== 0) {
128
+ eventAi.meleeEnabled = false;
129
+ }
130
+ // Reset and constructor verbs that must land before the first swing. The action applier is not
131
+ // installed at arm time, so death prevention, health percentage and set_unattackable mirror here.
132
+ if (sdIr) {
133
+ for (const act of lifecycleActions(sdIr, 'onReset')) {
134
+ if (act.kind === 'set_death_prevention') {
135
+ eventAi.deathPrevention = act.enabled;
136
+ if (act.enabled) eventAi.deathPreventionFired = false;
137
+ } else if (act.kind === 'set_health_pct') {
138
+ const pct = Math.max(0, Math.min(100, act.pct));
139
+ ef.hp = Math.floor(ef.spec.maxHealth * (pct / 100));
140
+ } else if (act.kind === 'set_unattackable') {
141
+ // Same as applyScriptDevCombatActions. Cite: naxxramas.cpp:998-1000; boss_thaddius.cpp:112.
142
+ const entry = (ef.spec.creatureEntry ?? 0) | 0;
143
+ if (!allowStoneskinGargoyleStoneForm(entry, ef.spec.movementType)) continue;
144
+ ef.unattackableUntil = Math.max(ef.unattackableUntil, t + 3_600_000);
145
+ eventAi.unitFlags |= UNIT_FLAG.UNINTERACTIBLE;
146
+ } else if (
147
+ act.kind === 'cast_self'
148
+ && (act.spellId | 0) === 29154
149
+ && !allowStoneskinGargoyleStoneForm((ef.spec.creatureEntry ?? 0) | 0, ef.spec.movementType)
150
+ ) {
151
+ continue;
152
+ } else if (outResetActions) {
153
+ outResetActions.push(act);
154
+ }
155
+ }
156
+ }
157
+ return {
158
+ fighter: ef,
159
+ slots: armCreatureCastSlots(entries, spellById, rng),
160
+ // Drawn here so the OOC rows keep their arm-order place in the rng stream, applied by the
161
+ // caller once ctx.applySpell exists (createSession / injectEnemySpec).
162
+ spawnAuras: spawnOocSelfAuras(entries, spellById, rng),
163
+ pendingSlot: null,
164
+ // Open on the first in-combat evaluation: m_spellListCooldown is cleared by SetSpellList.
165
+ // Cite: UnitAI.cpp:1180-1181.
166
+ spellListPollAt: 0,
167
+ eventAi,
168
+ scriptDev: sdIr ? armScriptDevRuntime(sdIr) : null,
169
+ healer: entriesCarryHeal(entries, spellById),
170
+ };
171
+ }
172
+
173
+ // Does this creature's SCHEDULED kit heal? Read off the armed entries and their baked spells — a heal
174
+ // effect or a periodic heal aura — so the answer is the creature's own data and never its name.
175
+ function entriesCarryHeal(
176
+ entries: readonly CreatureCastEntry[],
177
+ spellById: Map<number, SpellDef>,
178
+ ): boolean {
179
+ for (const e of entries) {
180
+ const s = spellById.get(e.spellId);
181
+ if (!s) continue;
182
+ if (s.effects?.some((fx) => fx.kind === 'heal')) return true;
183
+ if (s.rawEffects?.some((r) => {
184
+ const eff = r.effect | 0;
185
+ // 67 HEAL_MAX_HEALTH, but not one aimed only at the caster: Thekal Transform 24169 tops HIM up
186
+ // at the phase change and that is a survival beat, not a healer's kit. 62 sat here in its place
187
+ // by a miscount and read all 46 Mana Burn casters as healers (Feugen 28135 Static Field).
188
+ // Cite: SpellEffectDefines.h:36,88,93; SpellTargetDefines.h:25 TARGET_UNIT_CASTER.
189
+ if (eff === 67) return (r.targetA | 0) !== 1 || (r.targetB | 0) !== 0;
190
+ if (eff === 10) return true;
191
+ return eff === 6 && (r.auraName | 0) === 8;
192
+ })) return true;
193
+ }
194
+ return false;
195
+ }
196
+
197
+ export function installSessionInject(ctx: CombatContext, deps: SessionInjectDeps): void {
198
+ const { dead, nearestPartyInAcquire, hostileTargetOf, materializeSpecForCombat } = deps;
199
+
200
+ // Two branches: the summon-table row when the action carries one, else the summoner's own feet at
201
+ // contact distance. Nothing without geometry, and the inject then keeps its slot-ring fallback.
202
+ const summonPositionFor = (
203
+ summoner: Fighter,
204
+ worldPos?: SummonWorldPoint,
205
+ ): { position: CombatPosYd } | null => {
206
+ if (!ctx.unitPositionsMutable) return null;
207
+ const at = ctx.posOf(summoner.side);
208
+ const feet = (): { position: CombatPosYd } | null => {
209
+ if (!at) return null;
210
+ // Fan repeats: guardians already out is a stable, RNG-free slot index.
211
+ const slot = ctx.guardianSidesBySummoner.get(summoner.side)?.size ?? 0;
212
+ return { position: summonSpawnPosition(at, slot) };
213
+ };
214
+ if (worldPos) {
215
+ const o = ctx.cfg.geometryAnchor?.frame === 'world-translated'
216
+ ? ctx.cfg.geometryAnchor.origin
217
+ : undefined;
218
+ // pull-local offsets carry no world bearing, so a world point cannot be translated
219
+ // into them — fall through to the summoner rather than draw a convincing lie.
220
+ if (o) {
221
+ const pos = { x: worldPos.x - o.x, y: worldPos.y - o.y };
222
+ // Summon rows are map-absolute, so a wrong map yields multi-kilometre offsets. The cap is the
223
+ // largest baked call-for-help radius. A script-target dest skips it — it was read off this map.
224
+ if (at && !worldPos.mapVerified) {
225
+ const dx = pos.x - at.x;
226
+ const dy = pos.y - at.y;
227
+ if (dx * dx + dy * dy > 100 * 100) return feet();
228
+ }
229
+ // Scatter points are a raw GetRandomPoint ring, so clamp them out from the walkable
230
+ // centre they were drawn around — §5 displacement rule, not a raster fallback.
231
+ if (worldPos.from) {
232
+ const from = { x: worldPos.from.x - o.x, y: worldPos.from.y - o.y };
233
+ return {
234
+ position: clampDisplacementToFloor(from, pos, displaceFloorFromCfg(ctx.cfg)),
235
+ };
236
+ }
237
+ return { position: pos };
238
+ }
239
+ }
240
+ return feet();
241
+ };
242
+
243
+ // A seat the other side of the tick seam already named. Free or dead here is the allocation the helper
244
+ // would have made; a living unit in it is a diverged roster, and an error rather than a second body.
245
+ const forcedSeat = (side: string, isBlock: (s: Side) => boolean): Side => {
246
+ if (!isBlock(side as Side)) throw new Error(`forced seat ${side} is outside its block`);
247
+ const cur = ctx.sideFighter?.(side as Side);
248
+ if (cur && cur.hp > 0) throw new Error(`forced seat ${side} holds a living ${cur.spec.name}`);
249
+ return side as Side;
250
+ };
251
+
252
+ // The mid-fight inject core, arming the cast scheduler and the threat manager and seeding threat on
253
+ // the player. Positioned by the geometry slot helper when the map is live, or by an explicit point.
254
+ const injectEnemySpec = (
255
+ raw: CombatantSpec,
256
+ opts?: {
257
+ summonerSide?: Side;
258
+ creatureId?: number;
259
+ position?: CombatPosYd;
260
+ /** When true, skip AttackStart threat seed (CALL_FOR_HELP may re-engage). */
261
+ passive?: boolean;
262
+ side?: string;
263
+ },
264
+ ): Fighter | null => {
265
+ if (ctx.ended) return null;
266
+ const effects = ctx.effects;
267
+ // Endless floor: recycle a dead enemy seat so a multi-pull does not grow the array forever. Off the
268
+ // STORE — the seat is named, not indexed, and the helper answers "first dead seat, else the next".
269
+ const seat = opts?.side != null
270
+ ? forcedSeat(opts.side, isEnemySide)
271
+ : ctx.freeSeatIn!(isEnemySide, enemySideAt, () => true, Number.POSITIVE_INFINITY);
272
+ if (seat == null) return null;
273
+ const side = seat as EnemySide;
274
+ const recycling = ctx.sideFighter?.(side) != null;
275
+ const add: Fighter = makeFighter(side, materializeSpecForCombat(raw));
276
+ ctx.rosterSeatEnemy!(side, add);
277
+ if (recycling) {
278
+ // Recycled slot: prior despawn/death must not suppress this unit's death event.
279
+ ctx.deathEmitted.delete(side);
280
+ // A recycled slot is a NEW creature on an old side string: the corpse's onAggro
281
+ // stamp would otherwise suppress this one's Aggro() for the rest of the run.
282
+ aggroLifecycleEmitted.delete(side);
283
+ aggroLifecyclePending.delete(side);
284
+ // Strip side-keyed auras/DoTs so a recycled passive does not inherit the corpse's
285
+ // Rend / SW:P and re-open combat (probe-controller-farpull E).
286
+ for (let i = effects.length - 1; i >= 0; i--) {
287
+ const ae = effects[i]!;
288
+ if (ae.target === side || ae.source === side) effects.splice(i, 1);
289
+ }
290
+ // Drop player/ally commitments that named the corpse slot.
291
+ if (ctx.explicitEnemyFocus === side) ctx.explicitEnemyFocus = null;
292
+ for (const [as, tgt] of [...ctx.allyManualTarget.entries()]) {
293
+ if (tgt === side) ctx.allyManualTarget.delete(as);
294
+ }
295
+ // playerFocus stays typed Fighter — leave it; ensurePlayerFocus reselects if dead.
296
+ }
297
+ const tm = new ThreatManager(side);
298
+ ctx.threatByOwner.set(side, tm);
299
+ const pendingResetActs: ScriptDevAction[] = [];
300
+ const armed = armEnemyCastState(add, ctx.rng, pendingResetActs, ctx.t);
301
+ ctx.enemyCastBySide.set(side, armed);
302
+ // A floor spawn walks in wearing what its OOC rows put on it at spawn, same as the pull did.
303
+ // Cite: CreatureEventAI.cpp:1404-1410 JustRespawned; :216-218 TIMER_OOC CheckEvent.
304
+ for (const sp of armed.spawnAuras) ctx.applySpell?.(add, add, sp);
305
+ if (pendingResetActs.length) ctx.applyScriptDevCombatActions?.(add, pendingResetActs);
306
+ // Watch for this unit's Aggro(). A floor spawn never exists at the session's first tick,
307
+ // so without this its onAggro row can never run. Only bosses carry one.
308
+ {
309
+ const e = (add.spec.creatureEntry ?? 0) | 0;
310
+ const ir = e ? scriptDevByCreature(e) : null;
311
+ if (ir && (lifecycleActions(ir, 'onAggro').length > 0 || ir.damageHealMirror)) {
312
+ aggroLifecyclePending.add(side);
313
+ }
314
+ }
315
+ // Geometry: place first so AttackStart can refuse out-of-range seeds.
316
+ if (opts?.position) {
317
+ if (!ctx.unitPositionsMutable) {
318
+ ctx.unitPositionsMutable = {};
319
+ }
320
+ ctx.unitPositionsMutable[side] = ctx.placeEnemyAt!(opts.position);
321
+ } else if (ctx.unitPositionsMutable) {
322
+ // Per-INJECT, not per-tick: the same split the initial seed makes, so a mid-fight spawn
323
+ // and an opening pack cannot disagree about the same body.
324
+ const caster = isEnemyCasterKit(add.spec.spells, {
325
+ maxPower: add.spec.maxPower,
326
+ castable: castableKitIds(add, ctx.spellOf),
327
+ });
328
+ // A spawn-ring SLOT, so the ordinal is the answer and not a lookup in disguise - the same
329
+ // category as combatGeometry.meleeOrbitSlot. Cite: ENGINE-REBUILD E1.1.
330
+ ctx.unitPositionsMutable[side] = injectEnemySlotPosition({
331
+ enemyIndex: enemyIndexOfSide(side), isCaster: caster,
332
+ });
333
+ }
334
+ // Spawn coord = the evade home until combat opens. A recycled slot must overwrite the
335
+ // corpse's home, never inherit it. Cite: HomeMovementGenerator.cpp:51 GetRespawnCoord.
336
+ const placed = ctx.unitPositionsMutable?.[side];
337
+ if (placed) ctx.enemyHomeYd?.set(side, { ...placed });
338
+ else ctx.enemyHomeYd?.delete(side);
339
+ // AttackStart only when a living party body is inside local acquisition, gated on the NEAREST member
340
+ // rather than the player: multi-sensor detection can pull a mob the player is 46 yd from.
341
+ if (!opts?.passive) {
342
+ const seedOn = nearestPartyInAcquire(side);
343
+ if (seedOn) tm.addThreatDirectly(seedOn, 1, false);
344
+ }
345
+ if (opts?.summonerSide) {
346
+ let set = ctx.guardianSidesBySummoner.get(opts.summonerSide);
347
+ if (!set) {
348
+ set = new Set();
349
+ ctx.guardianSidesBySummoner.set(opts.summonerSide, set);
350
+ }
351
+ set.add(side);
352
+ // The summoned-unit event on the SUMMONER, carrying the summoned entry so a row that names one can
353
+ // filter. Cite: CreatureEventAI.cpp SummonedCreature, the sibling of the just-died hook.
354
+ const summoner = ctx.sideFighter?.(opts.summonerSide);
355
+ if (summoner) {
356
+ ctx.notifyEventAiSummoned?.(summoner, (opts.creatureId ?? add.spec.creatureEntry ?? 0) | 0, false);
357
+ }
358
+ }
359
+ ctx.push({
360
+ t: ctx.t,
361
+ kind: 'summon',
362
+ actor: opts?.summonerSide ?? 'enemy',
363
+ side,
364
+ creatureId: opts?.creatureId ?? add.spec.creatureEntry ?? 0,
365
+ name: add.spec.name,
366
+ });
367
+ return add;
368
+ };
369
+
370
+ // VE mid-fight inject: resolve creatureId → spec, then injectEnemySpec. Cite: CreatureEventAI.cpp
371
+ // ACTION_T_SPAWN ~810–826 AttackStart(target).
372
+ const injectEnemySummon = (
373
+ summoner: Fighter,
374
+ creatureId: number,
375
+ durationMs: number,
376
+ /** Explicit spawn point in WORLD yards (ACTION_T_SUMMON_ID param3, or a script-target dest). */
377
+ worldPos?: SummonWorldPoint,
378
+ /** False for a TARGET_T_SELF row: the body spawns and does not open. Cite: CreatureEventAI.cpp:1023. */
379
+ opts?: { attackStart?: boolean },
380
+ ): Fighter | null => {
381
+ const resolve = ctx.cfg.resolveSummon;
382
+ if (!resolve) return null;
383
+ const raw = resolve(creatureId);
384
+ if (!raw) return null;
385
+ const attackStart = opts?.attackStart !== false;
386
+ const add = injectEnemySpec(raw, {
387
+ summonerSide: summoner.side,
388
+ creatureId,
389
+ ...(attackStart ? {} : { passive: true }),
390
+ ...(summonPositionFor(summoner, worldPos) ?? {}),
391
+ });
392
+ if (!add) return null;
393
+ // A timed despawn, where zero means it lives until killed. Voiding this piled Antu'sul's totems up
394
+ // one per cast forever — measured ten-plus live sides in 47 s.
395
+ if (durationMs > 0) add.summonDespawnAt = ctx.t + durationMs;
396
+ // A summon opens on its summoner's victim even when placed outside acquire range: the table points
397
+ // sit 75 yd out, and the gated seed left Antu'sul's broodlings idle for the whole fight.
398
+ const tm = attackStart ? ctx.threatByOwner.get(add.side) : undefined;
399
+ if (tm && tm.isEmpty()) {
400
+ const victim = hostileTargetOf(summoner);
401
+ if (victim && !dead(victim)) tm.addThreatDirectly(victim.side, 1, false);
402
+ }
403
+ // JustSummoned — summoned casts on self (Spread 17772). Cite: boss_jandice_barov.cpp:52-55.
404
+ const summonerEntry = (summoner.spec.creatureEntry ?? 0) | 0;
405
+ const summonerIr = summonerEntry > 0 ? scriptDevByCreature(summonerEntry) : undefined;
406
+ const summonedEntry = creatureId | 0;
407
+ for (const act of summonerIr?.lifecycle?.justSummoned ?? []) {
408
+ if ('creatureEntry' in act && act.creatureEntry != null && act.creatureEntry !== summonedEntry) continue;
409
+ if (act.kind === 'attack_summoner') {
410
+ const tm = ctx.threatByOwner.get(add.side);
411
+ if (tm) tm.addThreatDirectly(summoner.side, 1_000_000, false);
412
+ continue;
413
+ }
414
+ if (act.kind === 'attack_random') {
415
+ // Cite: boss_jeklik.cpp:155-156 SelectAttackingTarget(RANDOM) + AttackStart.
416
+ const tm = ctx.threatByOwner.get(add.side);
417
+ if (!tm) continue;
418
+ const pool: Fighter[] = [];
419
+ // Pet LAST, and the order is load-bearing: `rng.int` picks an INDEX into this pool, so
420
+ // `partyUnits()` (pet second) would draw a different unit. Cite: ENGINE-REBUILD E1.1.
421
+ if (!dead(ctx.player)) pool.push(ctx.player);
422
+ for (const a of ctx.livingAllies()) pool.push(a);
423
+ if (ctx.pet && !dead(ctx.pet)) pool.push(ctx.pet);
424
+ if (pool.length === 0) continue;
425
+ const tgt = pool[ctx.rng.int(0, pool.length - 1)]!;
426
+ tm.modifyAllThreatPercent(-100);
427
+ tm.addThreatDirectly(tgt.side, 1, false);
428
+ tm.setCurrentVictimByTarget(tgt.side);
429
+ ctx.push({ t: ctx.t, kind: 'attack_start', actor: add.side, target: tgt.side });
430
+ continue;
431
+ }
432
+ if (act.kind === 'mirror_summoner_health') {
433
+ // The image's max is a fraction of the SUMMONER's max, chosen by the summoner's own percent,
434
+ // and its current health is that same percent. Cite: boss_skeram.cpp:342-364.
435
+ const max = Math.max(1, summoner.spec.maxHealth);
436
+ const pct = Math.max(0, Math.min(100, (summoner.hp / max) * 100));
437
+ let frac = 0;
438
+ for (const band of act.bands) {
439
+ if (pct < band.belowPct) {
440
+ frac = band.fracOfMax;
441
+ break;
442
+ }
443
+ }
444
+ if (frac > 0) {
445
+ add.spec.maxHealth = Math.max(1, Math.floor(max * frac));
446
+ add.hp = Math.max(1, Math.floor(add.spec.maxHealth * (pct / 100)));
447
+ ctx.push({
448
+ t: ctx.t,
449
+ kind: 'flavor',
450
+ text: `${add.spec.name} splits off at ${Math.round(pct)}% of ${summoner.spec.name}.`,
451
+ });
452
+ }
453
+ continue;
454
+ }
455
+ if (act.kind !== 'cast_self') continue;
456
+ const sp =
457
+ add.spec.spells.find((s) => s.id === act.spellId)
458
+ ?? summoner.spec.spells.find((s) => s.id === act.spellId);
459
+ if (!sp) continue;
460
+ const applySpell = ctx.applySpell as
461
+ | ((src: Fighter, tgt: Fighter, spell: SpellDef) => void)
462
+ | undefined;
463
+ if (applySpell) applySpell(add, add, sp);
464
+ else {
465
+ ctx.push({
466
+ t: ctx.t,
467
+ kind: 'aura',
468
+ actor: add.side, // the 'aura' event's actor IS the holder; it has no target field
469
+ name: sp.name,
470
+ spellId: sp.id,
471
+ applied: true,
472
+ });
473
+ }
474
+ }
475
+ return add;
476
+ };
477
+
478
+ const forceDespawnEnemy = (ef: Fighter): void => {
479
+ if (dead(ef)) return;
480
+ ef.hp = 0;
481
+ // Despawn ≠ kill: suppress checkDeaths so stream GC / ForcedDespawn do not fire
482
+ // death events (and death SFX) for units that simply left the pool.
483
+ ctx.deathEmitted.add(ef.side);
484
+ ctx.push({ t: ctx.t, kind: 'despawn', actor: ef.side });
485
+ };
486
+
487
+ /** Once-per-side ScriptDev lifecycle.onAggro (createSession is always engaged). */
488
+ const aggroLifecycleEmitted = new Set<string>();
489
+ // Sides that carry an on-aggro script and have not opened combat yet. The continuous floor opens on a
490
+ // DEAD shell and streams spawns in after, so a first-tick sweep matched nothing and 114 were dead code.
491
+ const aggroLifecyclePending = new Set<EnemySide>();
492
+ const runScriptDevAggroLifecycle = (ef: Fighter): void => {
493
+ if (aggroLifecycleEmitted.has(ef.side)) return;
494
+ aggroLifecycleEmitted.add(ef.side);
495
+ const entry = (ef.spec.creatureEntry ?? 0) | 0;
496
+ if (!entry) return;
497
+ const bossIr = scriptDevByCreature(entry);
498
+ // Twin damage/heal mirror — wrap onDamaged/onHealed at pull (after crowdControl install).
499
+ if (bossIr?.damageHealMirror) ctx.ensureDamageHealMirrorHooks?.();
500
+ const t = ctx.t;
501
+ for (const act of bossIr ? lifecycleActions(bossIr, 'onAggro') : []) {
502
+ if (act.kind === 'set_combat_movement') {
503
+ // Cite: UnitAI.cpp:301-318 SetCombatMovement; westfall.cpp:229-232 Daphne Aggro.
504
+ // combatMovement= must stay near this kind check (census WIRING_SIDE_EFFECT_RE).
505
+ const ocs = ctx.enemyCastBySide.get(ef.side as EnemySide);
506
+ if (ocs) ocs.eventAi.combatMovement = act.enabled;
507
+ ctx.push({ t, kind: 'flavor', text: combatMovementFlavor(ef.spec.name, act.enabled) });
508
+ } else if (act.kind === 'flavor') {
509
+ void act; // internal port note, not player copy
510
+ } else if (act.kind === 'force_despawn') {
511
+ // Cite: Creature::ForcedDespawn; npcs_special.cpp:987-991 EnterEvade ForcedDespawn.
512
+ // forceDespawnEnemy passed by name keeps the census WIRING_SIDE_EFFECT_RE token here.
513
+ applyForceDespawn(act, ef, t, {
514
+ forceDespawnEnemy,
515
+ enemyCastBySide: ctx.enemyCastBySide,
516
+ push: ctx.push,
517
+ });
518
+ } else {
519
+ // cast_self / cast_on_group / set_instance_data / set_death_prevention / yell / …
520
+ // Cite: boss_vaelastrasz.cpp:152-153 Aggro Essence of the Red via shared apply.
521
+ ctx.applyScriptDevCombatActions?.(ef, [act]);
522
+ }
523
+ }
524
+ };
525
+
526
+ // Release a side from its summoner's guardian set. Without this the set only grows: the spawn slot is
527
+ // its size, so every re-summon landed a ring further out and a recycled seat kept its OLD owner.
528
+ const releaseGuardianSide = (side: Side): void => {
529
+ for (const [owner, owned] of ctx.guardianSidesBySummoner) {
530
+ if (!owned.delete(side)) continue;
531
+ if (owned.size === 0) ctx.guardianSidesBySummoner.delete(owner);
532
+ return;
533
+ }
534
+ };
535
+
536
+ // The seat half of a friendly inject, taking a spec rather than a summon id. Both the summon path
537
+ // below and `injectAllySpec` (a battleground guard walking into the player's fight) land here, so
538
+ // seat recycling, the guardian set and the side-keyed aura strip have exactly one implementation.
539
+ const seatFriendly = (
540
+ ownerSide: Side,
541
+ raw: import('./types.ts').CombatantSpec,
542
+ creatureId?: number,
543
+ forced?: string,
544
+ ): Fighter | null => {
545
+ if (ctx.ended) return null;
546
+ // Recycle a dead seat we created ourselves, never a party member's: theirs holds a corpse the party
547
+ // can still resurrect, and the UI indexes party frames by seat.
548
+ const seat = forced != null
549
+ ? forcedSeat(forced, isAllySide)
550
+ : ctx.freeSeatIn!(
551
+ isAllySide,
552
+ allySideAt,
553
+ (a) => a.spec.summonOwnerSide != null,
554
+ MAX_ALLIES,
555
+ );
556
+ if (seat == null) return null;
557
+ const side = seat;
558
+ const recycling = ctx.sideFighter?.(side) != null;
559
+ const add = makeFighter(side, materializeSpecForCombat(raw));
560
+ add.spec.summonOwnerSide = ownerSide;
561
+ if (creatureId != null) add.spec.creatureEntry ??= creatureId;
562
+ ctx.rosterSeatAlly!(side, add);
563
+ if (recycling) {
564
+ releaseGuardianSide(side);
565
+ ctx.deathEmitted.delete(side);
566
+ for (let i = ctx.effects.length - 1; i >= 0; i--) {
567
+ const ae = ctx.effects[i]!;
568
+ if (ae.target === side || ae.source === side) ctx.effects.splice(i, 1);
569
+ }
570
+ ctx.allyManualTarget.delete(side);
571
+ }
572
+ ctx.unitItems.set(side, []);
573
+ ctx.unitItemCd.set(side, new Map());
574
+ ctx.unitItemsSpent.set(side, new Map());
575
+ let owned = ctx.guardianSidesBySummoner.get(ownerSide);
576
+ if (!owned) {
577
+ owned = new Set();
578
+ ctx.guardianSidesBySummoner.set(ownerSide, owned);
579
+ }
580
+ owned.add(side);
581
+ return add;
582
+ };
583
+
584
+ // Add an ally body from a spec, at a world point. The battleground counterpart of injectEnemySpec:
585
+ // AV's own guards, marshals and general fight on the player's side and have to be real seats to do it.
586
+ const injectAllySpec = (
587
+ raw: import('./types.ts').CombatantSpec,
588
+ opts?: { ownerSide?: Side; position?: CombatPosYd; side?: string },
589
+ ): Fighter | null => {
590
+ const add = seatFriendly(opts?.ownerSide ?? 'player', raw, raw.creatureEntry, opts?.side);
591
+ if (!add) return null;
592
+ if (opts?.position && ctx.unitPositionsMutable) {
593
+ ctx.unitPositionsMutable[add.side] = opts.position;
594
+ }
595
+ ctx.push({
596
+ t: ctx.t,
597
+ kind: 'summon',
598
+ actor: opts?.ownerSide ?? 'player',
599
+ side: add.side,
600
+ creatureId: raw.creatureEntry ?? 0,
601
+ name: add.spec.name,
602
+ });
603
+ return add;
604
+ };
605
+
606
+ const injectFriendlySummon = (
607
+ summoner: Fighter,
608
+ creatureId: number,
609
+ durationMs: number,
610
+ worldPos?: SummonWorldPoint,
611
+ ): Fighter | null => {
612
+ if (ctx.ended) return null;
613
+ const raw = ctx.cfg.resolveSummon?.(creatureId);
614
+ if (!raw) return null;
615
+ const add = seatFriendly(summoner.side, raw, creatureId);
616
+ if (!add) return null;
617
+ const side = add.side;
618
+ const placed = summonPositionFor(summoner, worldPos);
619
+ if (placed && ctx.unitPositionsMutable) {
620
+ ctx.unitPositionsMutable[side] = placed.position;
621
+ }
622
+ if (durationMs > 0) add.summonDespawnAt = ctx.t + durationMs;
623
+ ctx.push({
624
+ t: ctx.t,
625
+ kind: 'summon',
626
+ actor: summoner.side,
627
+ side,
628
+ creatureId,
629
+ name: add.spec.name,
630
+ });
631
+ return add;
632
+ };
633
+
634
+ // Route a cast's summon to the summoner's OWN side. Faction, not side string, so a charmed body summons
635
+ // for whoever holds it. Cite: Unit.cpp TakeCharmOf SetFactionTemporary.
636
+ const injectSummonForCaster = (
637
+ summoner: Fighter,
638
+ creatureId: number,
639
+ durationMs: number,
640
+ worldPos?: SummonWorldPoint,
641
+ ): Fighter | null => (
642
+ ctx.factionOfFighter(summoner) === 'enemy'
643
+ ? injectEnemySummon(summoner, creatureId, durationMs, worldPos)
644
+ : injectFriendlySummon(summoner, creatureId, durationMs, worldPos)
645
+ );
646
+
647
+ // TEMPSPAWN timed despawn for friendly summons — runEnemyEventAi owns the enemy copy and never runs for
648
+ // an ally seat. Cite: SpellEffects.cpp:2765.
649
+ const expireFriendlySummons = (): void => {
650
+ const t = ctx.t;
651
+ for (const a of ctx.livingAllies()) {
652
+ if (a.spec.summonOwnerSide == null) continue;
653
+ if (a.summonDespawnAt == null || a.summonDespawnAt <= 0 || t < a.summonDespawnAt) continue;
654
+ a.summonDespawnAt = 0;
655
+ a.hp = 0;
656
+ releaseGuardianSide(a.side);
657
+ ctx.deathEmitted.add(a.side);
658
+ ctx.push({ t, kind: 'despawn', actor: a.side });
659
+ ctx.bumpRoster!();
660
+ }
661
+ // A summon that was KILLED never runs the branch above, so free its slot here or the
662
+ // spawn ring keeps widening for the rest of an endless floor.
663
+ for (const a of ctx.allyBlock()) {
664
+ if (a.spec.summonOwnerSide != null && !(a.hp > 0)) releaseGuardianSide(a.side);
665
+ }
666
+ };
667
+
668
+ // A second direct cast unsummons this caster's guardians of the same entry, which is also what keeps a
669
+ // re-cast from eating a fresh ally seat. The C++ also skips triggered casts; that half is not modelled.
670
+ const unsummonFriendlyGuardians = (
671
+ owner: Fighter,
672
+ creatureId: number,
673
+ createdBySpell: number,
674
+ ): number => {
675
+ let n = 0;
676
+ for (const a of ctx.livingAllies()) {
677
+ if (a.spec.summonOwnerSide !== owner.side) continue;
678
+ if (((a.spec.creatureEntry ?? 0) | 0) !== (creatureId | 0)) continue;
679
+ if (((a.spec.createdBySpell ?? 0) | 0) !== (createdBySpell | 0)) continue;
680
+ a.hp = 0;
681
+ a.summonDespawnAt = 0;
682
+ releaseGuardianSide(a.side);
683
+ ctx.deathEmitted.add(a.side);
684
+ ctx.push({ t: ctx.t, kind: 'despawn', actor: a.side });
685
+ n++;
686
+ }
687
+ if (n > 0) ctx.bumpRoster!();
688
+ return n;
689
+ };
690
+
691
+ ctx.injectEnemySpec = injectEnemySpec;
692
+ ctx.injectEnemySummon = injectEnemySummon;
693
+ ctx.injectFriendlySummon = injectFriendlySummon;
694
+ ctx.injectAllySpec = injectAllySpec;
695
+ ctx.unsummonFriendlyGuardians = unsummonFriendlyGuardians;
696
+ ctx.injectSummonForCaster = injectSummonForCaster;
697
+ ctx.expireFriendlySummons = expireFriendlySummons;
698
+ ctx.forceDespawnEnemy = forceDespawnEnemy;
699
+ // Fire onAggro for any watched side that has since entered combat. Cheap: the set only ever holds units
700
+ // whose creature entry has an onAggro IR, which is bosses.
701
+ const pumpScriptDevAggroLifecycle = (): void => {
702
+ if (aggroLifecyclePending.size === 0) return;
703
+ for (const side of [...aggroLifecyclePending]) {
704
+ const ef = ctx.sideFighter?.(side) ?? null;
705
+ if (!ef) {
706
+ aggroLifecyclePending.delete(side);
707
+ continue;
708
+ }
709
+ if (dead(ef)) continue; // a corpse can still be recycled into a live slot
710
+ const tm = ctx.threatByOwner.get(side);
711
+ if (!tm || tm.isEmpty()) continue;
712
+ aggroLifecyclePending.delete(side);
713
+ runScriptDevAggroLifecycle(ef);
714
+ }
715
+ };
716
+
717
+ ctx.runScriptDevAggroLifecycle = runScriptDevAggroLifecycle;
718
+ ctx.pumpScriptDevAggroLifecycle = pumpScriptDevAggroLifecycle;
719
+ }