azeroth-shell 0.0.0-stage → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/README.md +138 -2
  2. package/bin/azsh.mjs +19 -0
  3. package/docs/aifid/eventai-texts.json +4414 -0
  4. package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
  5. package/docs/dungeons/survey/pack-id-migration.json +2418 -0
  6. package/package.json +35 -4
  7. package/src/autopilot/bossSkip.ts +26 -0
  8. package/src/autopilot/combatRotation.ts +824 -0
  9. package/src/autopilot/config.ts +533 -0
  10. package/src/autopilot/consumables.ts +58 -0
  11. package/src/autopilot/encounterStand.ts +121 -0
  12. package/src/autopilot/objectGatePlan.ts +53 -0
  13. package/src/autopilot/pathEngage.ts +229 -0
  14. package/src/autopilot/plan.ts +1643 -0
  15. package/src/autopilot/questPolicy.ts +274 -0
  16. package/src/autopilot/routeStep.ts +69 -0
  17. package/src/autopilot/sessionReport.ts +88 -0
  18. package/src/autopilot/topOffPower.ts +26 -0
  19. package/src/autopilot/view.ts +476 -0
  20. package/src/cli/bootCheck.mjs +34 -0
  21. package/src/cli/bootData.mjs +57 -0
  22. package/src/cli/combatLogFilter.ts +153 -0
  23. package/src/cli/combatLogFormat.ts +613 -0
  24. package/src/cli/fileRepository.mjs +105 -0
  25. package/src/cli/gzLoader.mjs +31 -0
  26. package/src/cli/liveGauntletEscort.ts +978 -0
  27. package/src/cli/liveStratUndead.ts +305 -0
  28. package/src/cli/macroHostCombat.ts +545 -0
  29. package/src/cli/macroHostWorld.ts +330 -0
  30. package/src/cli/prefs.mjs +31 -0
  31. package/src/cli/register.mjs +4 -0
  32. package/src/cli/repl.mjs +693 -0
  33. package/src/cli/rotationText.mjs +226 -0
  34. package/src/cli/squad.mjs +105 -0
  35. package/src/cli/term.mjs +144 -0
  36. package/src/cli/text.mjs +122 -0
  37. package/src/cli/tui.mjs +626 -0
  38. package/src/cli/tuiArena.mjs +109 -0
  39. package/src/cli/tuiAutopilotSettings.mjs +93 -0
  40. package/src/cli/tuiBags.mjs +180 -0
  41. package/src/cli/tuiBars.mjs +133 -0
  42. package/src/cli/tuiBg.mjs +243 -0
  43. package/src/cli/tuiBulk.mjs +162 -0
  44. package/src/cli/tuiCheck.mjs +1882 -0
  45. package/src/cli/tuiCity.mjs +396 -0
  46. package/src/cli/tuiCompanionKit.mjs +300 -0
  47. package/src/cli/tuiCompanions.mjs +471 -0
  48. package/src/cli/tuiDev.mjs +62 -0
  49. package/src/cli/tuiDungeon.mjs +606 -0
  50. package/src/cli/tuiEnchantTarget.mjs +120 -0
  51. package/src/cli/tuiFight.mjs +577 -0
  52. package/src/cli/tuiFightPanes.mjs +228 -0
  53. package/src/cli/tuiFloor.mjs +506 -0
  54. package/src/cli/tuiGear.mjs +158 -0
  55. package/src/cli/tuiHonor.mjs +74 -0
  56. package/src/cli/tuiLoot.mjs +97 -0
  57. package/src/cli/tuiMacros.mjs +144 -0
  58. package/src/cli/tuiOutfitter.mjs +115 -0
  59. package/src/cli/tuiPet.mjs +116 -0
  60. package/src/cli/tuiProfessions.mjs +800 -0
  61. package/src/cli/tuiRaid.mjs +127 -0
  62. package/src/cli/tuiRep.mjs +65 -0
  63. package/src/cli/tuiSaves.mjs +69 -0
  64. package/src/cli/tuiSearch.mjs +363 -0
  65. package/src/cli/tuiSettings.mjs +151 -0
  66. package/src/cli/tuiSimLab.mjs +80 -0
  67. package/src/cli/tuiTalents.mjs +60 -0
  68. package/src/cli/tuiViews.mjs +1178 -0
  69. package/src/cli/tuiWiki.mjs +181 -0
  70. package/src/cli/tuiWorld.mjs +361 -0
  71. package/src/cli/wikiIndex.ts +259 -0
  72. package/src/cli/wikiSources.ts +355 -0
  73. package/src/data/alteracValley.ts +176 -0
  74. package/src/data/appearanceOptions.ts +534 -0
  75. package/src/data/applyLootChanceSanity.ts +21 -0
  76. package/src/data/createFlavor.ts +96 -0
  77. package/src/data/customItems.ts +33 -0
  78. package/src/data/dataStore.ts +1904 -0
  79. package/src/data/dungeonGameObjects.ts +84 -0
  80. package/src/data/dungeonPlateCover.ts +66 -0
  81. package/src/data/dungeonSpawns.ts +294 -0
  82. package/src/data/dungeons/alterac-valley.ts +135 -0
  83. package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
  84. package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
  85. package/src/data/dungeons/apply-instance-geometry.ts +65 -0
  86. package/src/data/dungeons/apply-spawn-placement.ts +171 -0
  87. package/src/data/dungeons/blackfathom-deeps.ts +539 -0
  88. package/src/data/dungeons/blackrock-depths.ts +1410 -0
  89. package/src/data/dungeons/blackwing-lair.ts +129 -0
  90. package/src/data/dungeons/boss-eventai.ts +8 -0
  91. package/src/data/dungeons/deadmines.ts +410 -0
  92. package/src/data/dungeons/dire-maul-east.ts +980 -0
  93. package/src/data/dungeons/dire-maul-north.ts +661 -0
  94. package/src/data/dungeons/dire-maul-west.ts +785 -0
  95. package/src/data/dungeons/dungeon-rooms.json +5479 -0
  96. package/src/data/dungeons/encounter-outdoors.json +359 -0
  97. package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
  98. package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
  99. package/src/data/dungeons/eventai/deadmines.ts +264 -0
  100. package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
  101. package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
  102. package/src/data/dungeons/eventai/helpers.ts +79 -0
  103. package/src/data/dungeons/eventai/index.ts +133 -0
  104. package/src/data/dungeons/eventai/lbrs.ts +372 -0
  105. package/src/data/dungeons/eventai/maraudon.ts +323 -0
  106. package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
  107. package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
  108. package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
  109. package/src/data/dungeons/eventai/scholomance.ts +680 -0
  110. package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
  111. package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
  112. package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
  113. package/src/data/dungeons/eventai/sm-library.ts +55 -0
  114. package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
  115. package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
  116. package/src/data/dungeons/eventai/the-stockade.ts +228 -0
  117. package/src/data/dungeons/eventai/ubrs.ts +225 -0
  118. package/src/data/dungeons/eventai/uldaman.ts +355 -0
  119. package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
  120. package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
  121. package/src/data/dungeons/gnomeregan.ts +909 -0
  122. package/src/data/dungeons/index.ts +126 -0
  123. package/src/data/dungeons/instance-geometry.json +5233 -0
  124. package/src/data/dungeons/key-sources.json +169 -0
  125. package/src/data/dungeons/lbrs.ts +996 -0
  126. package/src/data/dungeons/maraudon.ts +786 -0
  127. package/src/data/dungeons/molten-core.ts +194 -0
  128. package/src/data/dungeons/naxxramas.ts +173 -0
  129. package/src/data/dungeons/onyxias-lair.ts +71 -0
  130. package/src/data/dungeons/pack-from-clusters.ts +1256 -0
  131. package/src/data/dungeons/ragefire-chasm.ts +238 -0
  132. package/src/data/dungeons/razorfen-downs.ts +698 -0
  133. package/src/data/dungeons/razorfen-kraul.ts +766 -0
  134. package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
  135. package/src/data/dungeons/scholomance.ts +1076 -0
  136. package/src/data/dungeons/shadowfang-keep.ts +740 -0
  137. package/src/data/dungeons/sm-armory.ts +266 -0
  138. package/src/data/dungeons/sm-cathedral.ts +430 -0
  139. package/src/data/dungeons/sm-graveyard.ts +482 -0
  140. package/src/data/dungeons/sm-library.ts +337 -0
  141. package/src/data/dungeons/stratholme-live.ts +808 -0
  142. package/src/data/dungeons/stratholme-undead.ts +1164 -0
  143. package/src/data/dungeons/sunken-temple.ts +931 -0
  144. package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
  145. package/src/data/dungeons/the-stockade.ts +282 -0
  146. package/src/data/dungeons/ubrs.ts +1286 -0
  147. package/src/data/dungeons/uldaman.ts +685 -0
  148. package/src/data/dungeons/wailing-caverns.ts +356 -0
  149. package/src/data/dungeons/zul-farrak.ts +686 -0
  150. package/src/data/dungeons/zul-gurub.ts +142 -0
  151. package/src/data/dungeons.ts +42 -0
  152. package/src/data/fixtures.ts +446 -0
  153. package/src/data/gameobject-data.json.gz +0 -0
  154. package/src/data/item-data.json.gz +0 -0
  155. package/src/data/loot-data.json.gz +0 -0
  156. package/src/data/maps/atlas-approach-maps.json +1425 -0
  157. package/src/data/maps/atlas-landmarks.json +1711 -0
  158. package/src/data/maps/dungeon-viewports.json +392 -0
  159. package/src/data/materializeModDamagePercentTaken.ts +70 -0
  160. package/src/data/materializeModHealthRegen.ts +89 -0
  161. package/src/data/materializeSpellReputation.ts +26 -0
  162. package/src/data/pageTexts.ts +19 -0
  163. package/src/data/profession-data.json.gz +0 -0
  164. package/src/data/raid-plans/blackfathom-deeps.json +86 -0
  165. package/src/data/raid-plans/blackrock-depths.json +419 -0
  166. package/src/data/raid-plans/blackwing-lair.json +328 -0
  167. package/src/data/raid-plans/deadmines.json +55 -0
  168. package/src/data/raid-plans/dire-maul-east.json +94 -0
  169. package/src/data/raid-plans/dire-maul-north.json +70 -0
  170. package/src/data/raid-plans/dire-maul-west.json +75 -0
  171. package/src/data/raid-plans/gnomeregan.json +131 -0
  172. package/src/data/raid-plans/lbrs.json +176 -0
  173. package/src/data/raid-plans/maraudon.json +102 -0
  174. package/src/data/raid-plans/molten-core.json +169 -0
  175. package/src/data/raid-plans/naxxramas.json +354 -0
  176. package/src/data/raid-plans/onyxias-lair.json +18 -0
  177. package/src/data/raid-plans/ragefire-chasm.json +30 -0
  178. package/src/data/raid-plans/razorfen-downs.json +75 -0
  179. package/src/data/raid-plans/razorfen-kraul.json +53 -0
  180. package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
  181. package/src/data/raid-plans/scholomance.json +170 -0
  182. package/src/data/raid-plans/shadowfang-keep.json +87 -0
  183. package/src/data/raid-plans/sm-armory.json +53 -0
  184. package/src/data/raid-plans/sm-cathedral.json +72 -0
  185. package/src/data/raid-plans/sm-graveyard.json +63 -0
  186. package/src/data/raid-plans/sm-library.json +23 -0
  187. package/src/data/raid-plans/stratholme-live.json +129 -0
  188. package/src/data/raid-plans/stratholme-undead.json +73 -0
  189. package/src/data/raid-plans/sunken-temple.json +159 -0
  190. package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
  191. package/src/data/raid-plans/the-stockade.json +42 -0
  192. package/src/data/raid-plans/ubrs.json +53 -0
  193. package/src/data/raid-plans/uldaman.json +131 -0
  194. package/src/data/raid-plans/wailing-caverns.json +90 -0
  195. package/src/data/raid-plans/zul-farrak.json +156 -0
  196. package/src/data/raid-plans/zul-gurub.json +307 -0
  197. package/src/data/raidInstanceCreatures.mjs +473 -0
  198. package/src/data/rotations/index.ts +152 -0
  199. package/src/data/rotations/layout.mjs +72 -0
  200. package/src/data/rotations/pve/druid/balance.json +754 -0
  201. package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
  202. package/src/data/rotations/pve/druid/feral.json +2660 -0
  203. package/src/data/rotations/pve/druid/restoration.json +424 -0
  204. package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
  205. package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
  206. package/src/data/rotations/pve/hunter/survival.json +1373 -0
  207. package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
  208. package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
  209. package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
  210. package/src/data/rotations/pve/paladin/holy.json +755 -0
  211. package/src/data/rotations/pve/paladin/protection.json +962 -0
  212. package/src/data/rotations/pve/paladin/retribution.json +924 -0
  213. package/src/data/rotations/pve/priest/discipline.json +772 -0
  214. package/src/data/rotations/pve/priest/holy.json +707 -0
  215. package/src/data/rotations/pve/priest/shadow.json +787 -0
  216. package/src/data/rotations/pve/rogue/assassination.json +2477 -0
  217. package/src/data/rotations/pve/rogue/combat.json +2483 -0
  218. package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
  219. package/src/data/rotations/pve/shaman/elemental.json +1157 -0
  220. package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
  221. package/src/data/rotations/pve/shaman/restoration.json +592 -0
  222. package/src/data/rotations/pve/warlock/affliction.json +1185 -0
  223. package/src/data/rotations/pve/warlock/demonology.json +1165 -0
  224. package/src/data/rotations/pve/warlock/destruction.json +1177 -0
  225. package/src/data/rotations/pve/warrior/arms.json +3020 -0
  226. package/src/data/rotations/pve/warrior/fury.json +2996 -0
  227. package/src/data/rotations/pve/warrior/protection.json +2509 -0
  228. package/src/data/rotations/pvp/druid/balance.json +593 -0
  229. package/src/data/rotations/pvp/druid/feral.json +3276 -0
  230. package/src/data/rotations/pvp/druid/restoration.json +662 -0
  231. package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
  232. package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
  233. package/src/data/rotations/pvp/hunter/survival.json +635 -0
  234. package/src/data/rotations/pvp/mage/arcane.json +574 -0
  235. package/src/data/rotations/pvp/mage/fire.json +570 -0
  236. package/src/data/rotations/pvp/mage/frost.json +4048 -0
  237. package/src/data/rotations/pvp/paladin/holy.json +1498 -0
  238. package/src/data/rotations/pvp/paladin/protection.json +567 -0
  239. package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
  240. package/src/data/rotations/pvp/priest/discipline.json +1848 -0
  241. package/src/data/rotations/pvp/priest/holy.json +6340 -0
  242. package/src/data/rotations/pvp/priest/shadow.json +2329 -0
  243. package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
  244. package/src/data/rotations/pvp/rogue/combat.json +5258 -0
  245. package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
  246. package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
  247. package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
  248. package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
  249. package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
  250. package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
  251. package/src/data/rotations/pvp/warlock/destruction.json +638 -0
  252. package/src/data/rotations/pvp/warrior/arms.json +5665 -0
  253. package/src/data/rotations/pvp/warrior/fury.json +850 -0
  254. package/src/data/rotations/pvp/warrior/protection.json +777 -0
  255. package/src/data/schema/bundle.ts +511 -0
  256. package/src/data/schema/constants.ts +49 -0
  257. package/src/data/schema/creature.ts +454 -0
  258. package/src/data/schema/encounter.ts +155 -0
  259. package/src/data/schema/faction.ts +48 -0
  260. package/src/data/schema/item.ts +297 -0
  261. package/src/data/schema/itemEnchant.ts +105 -0
  262. package/src/data/schema/npc.ts +44 -0
  263. package/src/data/schema/primitives.ts +295 -0
  264. package/src/data/schema/profession.ts +226 -0
  265. package/src/data/schema/quest.ts +154 -0
  266. package/src/data/schema/spell.ts +1149 -0
  267. package/src/data/schema/talent.ts +74 -0
  268. package/src/data/schema/world.ts +124 -0
  269. package/src/data/schema.ts +19 -0
  270. package/src/data/skinNodeGapFill.ts +68 -0
  271. package/src/data/spell-data.json.gz +0 -0
  272. package/src/data/spell-script-targets.json +1 -0
  273. package/src/data/tables/ahItemValues.json.gz +0 -0
  274. package/src/data/tables/alteracValley.json.gz +0 -0
  275. package/src/data/tables/areatriggerTeleports.json.gz +0 -0
  276. package/src/data/tables/botNames.json.gz +0 -0
  277. package/src/data/tables/botPopulation.json.gz +0 -0
  278. package/src/data/tables/botSpecs.json.gz +0 -0
  279. package/src/data/tables/classLevelStats.json.gz +0 -0
  280. package/src/data/tables/combatConditions.json.gz +0 -0
  281. package/src/data/tables/combatSkillMeta.json.gz +0 -0
  282. package/src/data/tables/conditions.json.gz +0 -0
  283. package/src/data/tables/createInfo.json.gz +0 -0
  284. package/src/data/tables/creatureAggroGroups.json.gz +0 -0
  285. package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
  286. package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
  287. package/src/data/tables/creatureWeapons.json.gz +0 -0
  288. package/src/data/tables/creatures.json.gz +0 -0
  289. package/src/data/tables/dbScripts.json.gz +0 -0
  290. package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
  291. package/src/data/tables/dungeonCensus.json.gz +0 -0
  292. package/src/data/tables/dungeonGameObjects.json.gz +0 -0
  293. package/src/data/tables/dungeonPacks.json.gz +0 -0
  294. package/src/data/tables/dungeonPlateCover.json.gz +0 -0
  295. package/src/data/tables/dungeonSpawns.json.gz +0 -0
  296. package/src/data/tables/dungeonSurvey.json.gz +0 -0
  297. package/src/data/tables/durabilityCosts.json.gz +0 -0
  298. package/src/data/tables/durabilityQuality.json.gz +0 -0
  299. package/src/data/tables/enchantApplicators.json.gz +0 -0
  300. package/src/data/tables/entranceYards.json.gz +0 -0
  301. package/src/data/tables/explorationBasexp.json.gz +0 -0
  302. package/src/data/tables/factionTemplates.json.gz +0 -0
  303. package/src/data/tables/factions.json.gz +0 -0
  304. package/src/data/tables/gameEvents.json.gz +0 -0
  305. package/src/data/tables/gameObjects.json.gz +0 -0
  306. package/src/data/tables/gossipMenus.json.gz +0 -0
  307. package/src/data/tables/graveyards.json.gz +0 -0
  308. package/src/data/tables/instanceMaps.json.gz +0 -0
  309. package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
  310. package/src/data/tables/itemEnchants.json.gz +0 -0
  311. package/src/data/tables/itemRandomProperties.json.gz +0 -0
  312. package/src/data/tables/itemSets.json.gz +0 -0
  313. package/src/data/tables/items.json.gz +0 -0
  314. package/src/data/tables/levelStats.json.gz +0 -0
  315. package/src/data/tables/locks.json.gz +0 -0
  316. package/src/data/tables/map-pin-overrides.json.gz +0 -0
  317. package/src/data/tables/nonCombatTrash.json.gz +0 -0
  318. package/src/data/tables/npcTexts.json.gz +0 -0
  319. package/src/data/tables/pageTexts.json.gz +0 -0
  320. package/src/data/tables/petAbilityTP.json.gz +0 -0
  321. package/src/data/tables/petGenericSpells.json.gz +0 -0
  322. package/src/data/tables/petLevelStats.json.gz +0 -0
  323. package/src/data/tables/playerbot-weightscales.json.gz +0 -0
  324. package/src/data/tables/pools.json.gz +0 -0
  325. package/src/data/tables/quests.json.gz +0 -0
  326. package/src/data/tables/races.json.gz +0 -0
  327. package/src/data/tables/reputationRanks.json.gz +0 -0
  328. package/src/data/tables/reputationRates.json.gz +0 -0
  329. package/src/data/tables/reputationSpillover.json.gz +0 -0
  330. package/src/data/tables/ridingSpells.json.gz +0 -0
  331. package/src/data/tables/scriptTexts.json.gz +0 -0
  332. package/src/data/tables/soundClipVolume.json.gz +0 -0
  333. package/src/data/tables/spellChain.json.gz +0 -0
  334. package/src/data/tables/spellTeleports.json.gz +0 -0
  335. package/src/data/tables/spells.json.gz +0 -0
  336. package/src/data/tables/talents.json.gz +0 -0
  337. package/src/data/tables/tavernTriggers.json.gz +0 -0
  338. package/src/data/tables/taxiNodes.json.gz +0 -0
  339. package/src/data/tables/taxiRoutes.json.gz +0 -0
  340. package/src/data/tables/trainers.json.gz +0 -0
  341. package/src/data/tables/transports.json.gz +0 -0
  342. package/src/data/tables/travelAnchors.json.gz +0 -0
  343. package/src/data/tables/travelEdges.json.gz +0 -0
  344. package/src/data/tables/unitConditions.json.gz +0 -0
  345. package/src/data/tables/vendors.json.gz +0 -0
  346. package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
  347. package/src/data/tables/xp.json.gz +0 -0
  348. package/src/data/tables/zoneWeather.json.gz +0 -0
  349. package/src/data/tables/zones.json.gz +0 -0
  350. package/src/data/world-data.ts +56 -0
  351. package/src/data/zone-music-sets.json +2751 -0
  352. package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
  353. package/src/domain/audioQuality.mjs +145 -0
  354. package/src/domain/bg/ab.ts +433 -0
  355. package/src/domain/bg/arenaComps.ts +644 -0
  356. package/src/domain/bg/arenaLab.ts +695 -0
  357. package/src/domain/bg/arenaPace.ts +31 -0
  358. package/src/domain/bg/arenaRating.ts +110 -0
  359. package/src/domain/bg/av.ts +758 -0
  360. package/src/domain/bg/avEnemyPush.ts +219 -0
  361. package/src/domain/bg/avField.ts +283 -0
  362. package/src/domain/bg/avInstanceNodes.ts +197 -0
  363. package/src/domain/bg/avInstanceScore.ts +123 -0
  364. package/src/domain/bg/avQuestItems.ts +55 -0
  365. package/src/domain/bg/avQuests.ts +210 -0
  366. package/src/domain/bg/avSession.ts +196 -0
  367. package/src/domain/bg/bgConsumes.ts +269 -0
  368. package/src/domain/bg/bgPrebuff.ts +153 -0
  369. package/src/domain/bg/bgRest.ts +91 -0
  370. package/src/domain/bg/bgRoster.ts +305 -0
  371. package/src/domain/bg/bgTier.ts +61 -0
  372. package/src/domain/bg/bgWorld.ts +862 -0
  373. package/src/domain/bg/match.ts +215 -0
  374. package/src/domain/bg/strategies.ts +552 -0
  375. package/src/domain/bg/types.ts +291 -0
  376. package/src/domain/bg/wsg.ts +264 -0
  377. package/src/domain/bots/actionProviderSpec.ts +38 -0
  378. package/src/domain/bots/autoConsumables.ts +285 -0
  379. package/src/domain/bots/betweenPullRest.ts +239 -0
  380. package/src/domain/bots/botGear.ts +248 -0
  381. package/src/domain/bots/botInventory.ts +486 -0
  382. package/src/domain/bots/botPet.ts +535 -0
  383. package/src/domain/bots/botPool.ts +291 -0
  384. package/src/domain/bots/botProfessions.ts +334 -0
  385. package/src/domain/bots/companionActionBar.ts +209 -0
  386. package/src/domain/bots/companionHireCost.ts +236 -0
  387. package/src/domain/bots/companionMissions.ts +582 -0
  388. package/src/domain/bots/companionPrep.ts +254 -0
  389. package/src/domain/bots/companionQuests.ts +270 -0
  390. package/src/domain/bots/companionRep.ts +75 -0
  391. package/src/domain/bots/companionRotation.ts +708 -0
  392. package/src/domain/bots/companionXp.ts +66 -0
  393. package/src/domain/bots/consumableShare.ts +811 -0
  394. package/src/domain/bots/dpsMate.ts +1072 -0
  395. package/src/domain/bots/groupCompReport.ts +132 -0
  396. package/src/domain/bots/healthstoneSupply.ts +198 -0
  397. package/src/domain/bots/outfitter.ts +1056 -0
  398. package/src/domain/bots/paladinPrePull.ts +231 -0
  399. package/src/domain/bots/partyRole.ts +40 -0
  400. package/src/domain/bots/playerbotEquipCache.ts +412 -0
  401. package/src/domain/bots/playerbotItemEligibility.ts +60 -0
  402. package/src/domain/bots/playerbotStatWeight.ts +853 -0
  403. package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
  404. package/src/domain/bots/prePullBuffs.ts +219 -0
  405. package/src/domain/bots/prePullStealth.ts +82 -0
  406. package/src/domain/bots/runSupply.ts +251 -0
  407. package/src/domain/bots/runSupplyPrefs.ts +28 -0
  408. package/src/domain/bots/sendTradeGoods.ts +394 -0
  409. package/src/domain/bots/soulShardCap.ts +35 -0
  410. package/src/domain/bots/squad.ts +842 -0
  411. package/src/domain/bots/squadRun.ts +81 -0
  412. package/src/domain/character/actionbar.ts +346 -0
  413. package/src/domain/character/appearance.ts +165 -0
  414. package/src/domain/character/buildCombatant.ts +1726 -0
  415. package/src/domain/character/character.ts +356 -0
  416. package/src/domain/character/characterName.ts +43 -0
  417. package/src/domain/character/characterRatings.ts +424 -0
  418. package/src/domain/character/characterSpells.ts +282 -0
  419. package/src/domain/character/characterStats.ts +1559 -0
  420. package/src/domain/character/characterTalents.ts +398 -0
  421. package/src/domain/character/combatSkills.ts +994 -0
  422. package/src/domain/character/displayForm.ts +72 -0
  423. package/src/domain/character/formTalentAuras.ts +171 -0
  424. package/src/domain/character/forms.ts +499 -0
  425. package/src/domain/character/races.ts +40 -0
  426. package/src/domain/character/resurrectionSickness.ts +49 -0
  427. package/src/domain/character/spellbook.ts +169 -0
  428. package/src/domain/character/stanceBar.ts +354 -0
  429. package/src/domain/character/stancePrereq.ts +70 -0
  430. package/src/domain/character/talentBuilds.ts +63 -0
  431. package/src/domain/character/talentImport.ts +130 -0
  432. package/src/domain/character/talentLink.ts +123 -0
  433. package/src/domain/character/talents.ts +201 -0
  434. package/src/domain/core/conditionSnapshot.ts +92 -0
  435. package/src/domain/core/hover.ts +14 -0
  436. package/src/domain/core/ids.ts +58 -0
  437. package/src/domain/core/internalNameTags.ts +5 -0
  438. package/src/domain/core/runtimeDataPatches.ts +357 -0
  439. package/src/domain/creature/aiTargeting.ts +588 -0
  440. package/src/domain/creature/combatCondition.ts +157 -0
  441. package/src/domain/creature/creatureAggro.ts +804 -0
  442. package/src/domain/creature/creatureAi.ts +206 -0
  443. package/src/domain/creature/creatureAiConstants.ts +661 -0
  444. package/src/domain/creature/creatureCastList.ts +1007 -0
  445. package/src/domain/creature/creatureEventAi.ts +1409 -0
  446. package/src/domain/creature/creatureGroups.ts +144 -0
  447. package/src/domain/creature/creatureLinking.ts +333 -0
  448. package/src/domain/creature/creatureScaling.ts +320 -0
  449. package/src/domain/creature/creatureTrigger.ts +53 -0
  450. package/src/domain/creature/creatureWander.ts +74 -0
  451. package/src/domain/creature/eventAiTexts.ts +145 -0
  452. package/src/domain/creature/faction.ts +287 -0
  453. package/src/domain/creature/forcedReaction.ts +48 -0
  454. package/src/domain/creature/outdoorHuntable.ts +74 -0
  455. package/src/domain/creature/patrolPacks.ts +210 -0
  456. package/src/domain/creature/reputation.ts +967 -0
  457. package/src/domain/creature/unitFlags.ts +74 -0
  458. package/src/domain/creature/worldBosses.ts +393 -0
  459. package/src/domain/dungeonMusic.mjs +48 -0
  460. package/src/domain/economy/auction.ts +282 -0
  461. package/src/domain/economy/auctionBot.ts +1060 -0
  462. package/src/domain/economy/honorPrice.ts +100 -0
  463. package/src/domain/economy/mail.ts +958 -0
  464. package/src/domain/economy/money.ts +42 -0
  465. package/src/domain/economy/syntheticClassTrainers.ts +62 -0
  466. package/src/domain/economy/trading.ts +296 -0
  467. package/src/domain/economy/vendorSellAll.ts +252 -0
  468. package/src/domain/economy/vendorStock.ts +146 -0
  469. package/src/domain/items/ammo.ts +817 -0
  470. package/src/domain/items/bank.ts +162 -0
  471. package/src/domain/items/consumableFamily.ts +205 -0
  472. package/src/domain/items/craftUpgrades.ts +83 -0
  473. package/src/domain/items/createItem.ts +93 -0
  474. package/src/domain/items/durability.ts +581 -0
  475. package/src/domain/items/equipment.ts +441 -0
  476. package/src/domain/items/equipmentHelper.ts +767 -0
  477. package/src/domain/items/inventory.ts +561 -0
  478. package/src/domain/items/itemBonding.ts +93 -0
  479. package/src/domain/items/itemContainer.ts +245 -0
  480. package/src/domain/items/itemDisplayName.ts +33 -0
  481. package/src/domain/items/itemInstance.ts +181 -0
  482. package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
  483. package/src/domain/items/itemRandomProps.ts +77 -0
  484. package/src/domain/items/itemRestrictions.ts +329 -0
  485. package/src/domain/items/itemTeaches.ts +82 -0
  486. package/src/domain/items/itemUseCooldown.ts +52 -0
  487. package/src/domain/items/itemUseTarget.ts +90 -0
  488. package/src/domain/items/junkCategories.ts +174 -0
  489. package/src/domain/items/junkFilter.ts +368 -0
  490. package/src/domain/items/keyring.ts +131 -0
  491. package/src/domain/items/loot.ts +221 -0
  492. package/src/domain/items/mounts.ts +190 -0
  493. package/src/domain/items/onUsePayload.ts +102 -0
  494. package/src/domain/items/pendingLoot.ts +107 -0
  495. package/src/domain/items/relic.ts +105 -0
  496. package/src/domain/items/rocketBoots.ts +36 -0
  497. package/src/domain/items/sortContainer.ts +139 -0
  498. package/src/domain/items/spareContainers.ts +71 -0
  499. package/src/domain/items/spellReagentIndex.ts +131 -0
  500. package/src/domain/items/staleConsumables.ts +66 -0
  501. package/src/domain/items/weaponSpender.ts +110 -0
  502. package/src/domain/listDungeonIds.mjs +28 -0
  503. package/src/domain/macro/compose.ts +239 -0
  504. package/src/domain/macro/conditions.ts +260 -0
  505. package/src/domain/macro/creatureTypes.ts +40 -0
  506. package/src/domain/macro/describe.ts +169 -0
  507. package/src/domain/macro/icon.ts +60 -0
  508. package/src/domain/macro/index.ts +20 -0
  509. package/src/domain/macro/normalize.ts +112 -0
  510. package/src/domain/macro/parse.ts +316 -0
  511. package/src/domain/macro/plan.ts +288 -0
  512. package/src/domain/macro/rotation.ts +590 -0
  513. package/src/domain/macro/rotationEnv.ts +173 -0
  514. package/src/domain/macro/slots.ts +101 -0
  515. package/src/domain/macro/snapshot.ts +114 -0
  516. package/src/domain/macro/templates.ts +446 -0
  517. package/src/domain/macro/types.ts +70 -0
  518. package/src/domain/macro/units.ts +93 -0
  519. package/src/domain/macro/weaponTypes.ts +83 -0
  520. package/src/domain/nav/cityTeleports.ts +10 -0
  521. package/src/domain/nav/mounting.ts +113 -0
  522. package/src/domain/nav/nav.ts +43 -0
  523. package/src/domain/nav/navCollision.ts +606 -0
  524. package/src/domain/nav/navOutdoors.ts +91 -0
  525. package/src/domain/nav/navRegistry.ts +179 -0
  526. package/src/domain/nav/navRoomGraph.ts +302 -0
  527. package/src/domain/nav/navTypes.ts +43 -0
  528. package/src/domain/nav/navmesh.ts +1715 -0
  529. package/src/domain/nav/speed.ts +200 -0
  530. package/src/domain/nav/storey.ts +10 -0
  531. package/src/domain/nav/travel.ts +725 -0
  532. package/src/domain/nav/travelTypes.ts +75 -0
  533. package/src/domain/pet/pet.ts +1150 -0
  534. package/src/domain/pet/petActionBar.ts +180 -0
  535. package/src/domain/pet/petSpellbook.ts +39 -0
  536. package/src/domain/pet/petStable.ts +81 -0
  537. package/src/domain/professions/autoDisenchant.ts +236 -0
  538. package/src/domain/professions/characterEnchants.ts +176 -0
  539. package/src/domain/professions/craftCooldown.ts +52 -0
  540. package/src/domain/professions/enchantApply.ts +62 -0
  541. package/src/domain/professions/enchantTargets.ts +114 -0
  542. package/src/domain/professions/enchanting.ts +236 -0
  543. package/src/domain/professions/gatherFilter.ts +149 -0
  544. package/src/domain/professions/gearEnchant.ts +137 -0
  545. package/src/domain/professions/heldTools.ts +29 -0
  546. package/src/domain/professions/learnAllRecipes.ts +146 -0
  547. package/src/domain/professions/miningHarvest.ts +69 -0
  548. package/src/domain/professions/partyDisenchant.ts +294 -0
  549. package/src/domain/professions/partyWork.ts +83 -0
  550. package/src/domain/professions/pickpocket.ts +172 -0
  551. package/src/domain/professions/poisons.ts +240 -0
  552. package/src/domain/professions/professions.ts +677 -0
  553. package/src/domain/professions/rareNodes.ts +45 -0
  554. package/src/domain/professions/skinLoot.ts +27 -0
  555. package/src/domain/professions/vendorReagents.ts +152 -0
  556. package/src/domain/professions/weaponImbueHand.ts +171 -0
  557. package/src/domain/questFarmFilter.mjs +42 -0
  558. package/src/domain/quests/doQuest.ts +1204 -0
  559. package/src/domain/quests/gossip.ts +308 -0
  560. package/src/domain/quests/gossipTalk.ts +298 -0
  561. package/src/domain/quests/interpreter/canComplete.ts +150 -0
  562. package/src/domain/quests/interpreter/claim.ts +137 -0
  563. package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
  564. package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
  565. package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
  566. package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
  567. package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
  568. package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
  569. package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
  570. package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
  571. package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
  572. package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
  573. package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
  574. package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
  575. package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
  576. package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
  577. package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
  578. package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
  579. package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
  580. package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
  581. package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
  582. package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
  583. package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
  584. package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
  585. package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
  586. package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
  587. package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
  588. package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
  589. package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
  590. package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
  591. package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
  592. package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
  593. package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
  594. package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
  595. package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
  596. package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
  597. package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
  598. package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
  599. package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
  600. package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
  601. package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
  602. package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
  603. package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
  604. package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
  605. package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
  606. package/src/domain/quests/interpreter/diff.ts +349 -0
  607. package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
  608. package/src/domain/quests/interpreter/flags.ts +101 -0
  609. package/src/domain/quests/interpreter/index.ts +113 -0
  610. package/src/domain/quests/interpreter/live.ts +178 -0
  611. package/src/domain/quests/interpreter/types.ts +81 -0
  612. package/src/domain/quests/interpreter/updaters.ts +412 -0
  613. package/src/domain/quests/questCorpseUse.ts +155 -0
  614. package/src/domain/quests/questDialog.ts +43 -0
  615. package/src/domain/quests/questFight.ts +34 -0
  616. package/src/domain/quests/questObjectiveLabel.ts +39 -0
  617. package/src/domain/quests/questRewardChoice.ts +85 -0
  618. package/src/domain/quests/questScriptCredit.ts +26 -0
  619. package/src/domain/quests/questScriptItemUse.ts +74 -0
  620. package/src/domain/quests/questTameRods.ts +79 -0
  621. package/src/domain/quests/questlog.ts +1545 -0
  622. package/src/domain/quests/talkDeliver.ts +170 -0
  623. package/src/domain/raid/globalActionBar.ts +195 -0
  624. package/src/domain/raid/instanceRoster.ts +194 -0
  625. package/src/domain/raid/partySummon.ts +198 -0
  626. package/src/domain/raid/partyVault.ts +320 -0
  627. package/src/domain/raid/raidBossAbilities.ts +268 -0
  628. package/src/domain/raid/raidComp.ts +335 -0
  629. package/src/domain/raid/raidCustomRows.ts +453 -0
  630. package/src/domain/raid/raidEncounterGear.ts +298 -0
  631. package/src/domain/raid/raidEncounterTactics.ts +412 -0
  632. package/src/domain/raid/raidPlan.ts +509 -0
  633. package/src/domain/raid/raidPlanEdits.ts +98 -0
  634. package/src/domain/raid/raidPlanPacks.ts +480 -0
  635. package/src/domain/raid/raidRecovery.ts +183 -0
  636. package/src/domain/raid/raidRosterTemplate.ts +138 -0
  637. package/src/domain/rotation/auraSide.ts +68 -0
  638. package/src/domain/rotation/build.ts +3031 -0
  639. package/src/domain/rotation/classes/druid.ts +58 -0
  640. package/src/domain/rotation/classes/hooks.ts +59 -0
  641. package/src/domain/rotation/classes/hunter.ts +156 -0
  642. package/src/domain/rotation/classes/index.ts +104 -0
  643. package/src/domain/rotation/classes/mage.ts +99 -0
  644. package/src/domain/rotation/classes/paladin.ts +296 -0
  645. package/src/domain/rotation/classes/priest.ts +94 -0
  646. package/src/domain/rotation/classes/pullOpener.ts +92 -0
  647. package/src/domain/rotation/classes/rogue.ts +69 -0
  648. package/src/domain/rotation/classes/shaman.ts +29 -0
  649. package/src/domain/rotation/classes/supportSpec.ts +94 -0
  650. package/src/domain/rotation/classes/warlock.ts +81 -0
  651. package/src/domain/rotation/classes/warrior.ts +402 -0
  652. package/src/domain/rotation/classify.ts +1381 -0
  653. package/src/domain/rotation/condMetricPicker.ts +379 -0
  654. package/src/domain/rotation/consumables.ts +242 -0
  655. package/src/domain/rotation/evaluate.ts +1115 -0
  656. package/src/domain/rotation/finisherLadder.ts +145 -0
  657. package/src/domain/rotation/invent.ts +938 -0
  658. package/src/domain/rotation/killOrder.ts +30 -0
  659. package/src/domain/rotation/openerForm.ts +22 -0
  660. package/src/domain/rotation/paladinBuffs.ts +568 -0
  661. package/src/domain/rotation/prebuff.ts +283 -0
  662. package/src/domain/rotation/raidRowTuning.ts +34 -0
  663. package/src/domain/rotation/rotation.ts +11 -0
  664. package/src/domain/rotation/rotationProfiles.ts +180 -0
  665. package/src/domain/rotation/rotationSuggestions.ts +851 -0
  666. package/src/domain/rotation/ruleAfterChain.ts +49 -0
  667. package/src/domain/rotation/spec.ts +70 -0
  668. package/src/domain/rotation/spellPicker.ts +140 -0
  669. package/src/domain/rotation/stand.ts +143 -0
  670. package/src/domain/rotation/types.ts +718 -0
  671. package/src/domain/run/battlegroundRun.ts +111 -0
  672. package/src/domain/run/canEnterContext.ts +32 -0
  673. package/src/domain/run/death.ts +561 -0
  674. package/src/domain/run/deathRecovery.ts +289 -0
  675. package/src/domain/run/duel.ts +141 -0
  676. package/src/domain/run/dungeonRun.ts +344 -0
  677. package/src/domain/run/floorRest.ts +159 -0
  678. package/src/domain/run/honor.ts +557 -0
  679. package/src/domain/run/honorWeek.ts +180 -0
  680. package/src/domain/run/whenMap.ts +977 -0
  681. package/src/domain/scriptdev/arathiHighlands.ts +445 -0
  682. package/src/domain/scriptdev/ashenvale.ts +635 -0
  683. package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
  684. package/src/domain/scriptdev/azshara.ts +892 -0
  685. package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
  686. package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
  687. package/src/domain/scriptdev/blackrockSpire.ts +730 -0
  688. package/src/domain/scriptdev/blackwingLair.ts +521 -0
  689. package/src/domain/scriptdev/burningSteppes.ts +62 -0
  690. package/src/domain/scriptdev/classFilter.ts +43 -0
  691. package/src/domain/scriptdev/darkshore.ts +817 -0
  692. package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
  693. package/src/domain/scriptdev/deadmines.ts +331 -0
  694. package/src/domain/scriptdev/desolace.ts +1239 -0
  695. package/src/domain/scriptdev/direMaul.ts +859 -0
  696. package/src/domain/scriptdev/durotar.ts +532 -0
  697. package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
  698. package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
  699. package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
  700. package/src/domain/scriptdev/felwood.ts +1055 -0
  701. package/src/domain/scriptdev/feralas.ts +571 -0
  702. package/src/domain/scriptdev/feralasHelpers.ts +838 -0
  703. package/src/domain/scriptdev/gnomeregan.ts +466 -0
  704. package/src/domain/scriptdev/guards.ts +616 -0
  705. package/src/domain/scriptdev/hinterlands.ts +693 -0
  706. package/src/domain/scriptdev/host.ts +1134 -0
  707. package/src/domain/scriptdev/index.ts +123 -0
  708. package/src/domain/scriptdev/instanceRaids.ts +136 -0
  709. package/src/domain/scriptdev/itemScripts.ts +37 -0
  710. package/src/domain/scriptdev/lochModan.ts +283 -0
  711. package/src/domain/scriptdev/maraudon.ts +232 -0
  712. package/src/domain/scriptdev/moltenCore.ts +831 -0
  713. package/src/domain/scriptdev/moonglade.ts +659 -0
  714. package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
  715. package/src/domain/scriptdev/naxxramas.ts +577 -0
  716. package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
  717. package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
  718. package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
  719. package/src/domain/scriptdev/npcProfessions.ts +1025 -0
  720. package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
  721. package/src/domain/scriptdev/onyxiasLair.ts +313 -0
  722. package/src/domain/scriptdev/orgrimmar.ts +147 -0
  723. package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
  724. package/src/domain/scriptdev/razorfenDowns.ts +468 -0
  725. package/src/domain/scriptdev/razorfenKraul.ts +410 -0
  726. package/src/domain/scriptdev/redridgeMountains.ts +163 -0
  727. package/src/domain/scriptdev/registry.ts +945 -0
  728. package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
  729. package/src/domain/scriptdev/scarletMonastery.ts +713 -0
  730. package/src/domain/scriptdev/scholomance.ts +682 -0
  731. package/src/domain/scriptdev/searingGorge.ts +295 -0
  732. package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
  733. package/src/domain/scriptdev/silithus.ts +71 -0
  734. package/src/domain/scriptdev/silverpineForest.ts +662 -0
  735. package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
  736. package/src/domain/scriptdev/stormwindCity.ts +1192 -0
  737. package/src/domain/scriptdev/stranglethornVale.ts +402 -0
  738. package/src/domain/scriptdev/stratholme.ts +650 -0
  739. package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
  740. package/src/domain/scriptdev/sunkenTemple.ts +736 -0
  741. package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
  742. package/src/domain/scriptdev/tanaris.ts +391 -0
  743. package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
  744. package/src/domain/scriptdev/teldrassil.ts +143 -0
  745. package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
  746. package/src/domain/scriptdev/theBarrens.ts +709 -0
  747. package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
  748. package/src/domain/scriptdev/thousandNeedles.ts +426 -0
  749. package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
  750. package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
  751. package/src/domain/scriptdev/types.ts +1026 -0
  752. package/src/domain/scriptdev/uldaman.ts +437 -0
  753. package/src/domain/scriptdev/ungoroCrater.ts +549 -0
  754. package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
  755. package/src/domain/scriptdev/wailingCaverns.ts +700 -0
  756. package/src/domain/scriptdev/warEffort.ts +371 -0
  757. package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
  758. package/src/domain/scriptdev/westfall.ts +767 -0
  759. package/src/domain/scriptdev/wetlands.ts +660 -0
  760. package/src/domain/scriptdev/winterspring.ts +482 -0
  761. package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
  762. package/src/domain/scriptdev/worldBosses.ts +605 -0
  763. package/src/domain/scriptdev/zulfarrak.ts +478 -0
  764. package/src/domain/scriptdev/zulgurub.ts +1152 -0
  765. package/src/domain/sim/dummySim.ts +408 -0
  766. package/src/domain/sim/targetDummy.ts +29 -0
  767. package/src/domain/social/guild.ts +148 -0
  768. package/src/domain/spells/areaAuraMembership.ts +93 -0
  769. package/src/domain/spells/breakableStunCc.ts +166 -0
  770. package/src/domain/spells/cancelAura.ts +80 -0
  771. package/src/domain/spells/diminishing.ts +167 -0
  772. package/src/domain/spells/dispel.ts +149 -0
  773. package/src/domain/spells/dispelMechanic.ts +105 -0
  774. package/src/domain/spells/equipSpells.ts +247 -0
  775. package/src/domain/spells/learnOnTargets.ts +260 -0
  776. package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
  777. package/src/domain/spells/resurrectSpell.ts +124 -0
  778. package/src/domain/spells/spellPushback.ts +39 -0
  779. package/src/domain/spells/spellReflect.ts +43 -0
  780. package/src/domain/spells/stealth.ts +183 -0
  781. package/src/domain/spells/totem.ts +394 -0
  782. package/src/domain/spells/worldCast.ts +187 -0
  783. package/src/domain/world/areaTriggerLocks.ts +177 -0
  784. package/src/domain/world/dungeonMusic.ts +108 -0
  785. package/src/domain/world/gameEvents.ts +119 -0
  786. package/src/domain/world/gameObjects.ts +1030 -0
  787. package/src/domain/world/goEventFire.ts +234 -0
  788. package/src/domain/world/goMoTransport.ts +74 -0
  789. package/src/domain/world/goTransport.ts +81 -0
  790. package/src/domain/world/hazards.ts +459 -0
  791. package/src/domain/world/openLock.ts +398 -0
  792. package/src/domain/world/pools.ts +470 -0
  793. package/src/domain/world/restArea.ts +37 -0
  794. package/src/domain/world/weather.ts +201 -0
  795. package/src/domain/zoneAmbience.mjs +87 -0
  796. package/src/domain/zoneMusic.mjs +62 -0
  797. package/src/domain/zoneMusicQueue.mjs +7 -0
  798. package/src/engine/combat/activeSeal.ts +39 -0
  799. package/src/engine/combat/aiTargetResolve.ts +64 -0
  800. package/src/engine/combat/aoeCast.ts +289 -0
  801. package/src/engine/combat/applyConsumeAura.ts +74 -0
  802. package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
  803. package/src/engine/combat/applyDispelMechanic.ts +30 -0
  804. package/src/engine/combat/applyHealEffect.ts +301 -0
  805. package/src/engine/combat/applySchoolAbsorb.ts +114 -0
  806. package/src/engine/combat/applySpell.ts +3169 -0
  807. package/src/engine/combat/applySpellLate.ts +2026 -0
  808. package/src/engine/combat/applySpellLateBag.ts +144 -0
  809. package/src/engine/combat/areaAura.ts +283 -0
  810. package/src/engine/combat/attackTable.ts +508 -0
  811. package/src/engine/combat/battleRez.ts +87 -0
  812. package/src/engine/combat/castAction.ts +36 -0
  813. package/src/engine/combat/castTargetGates.ts +75 -0
  814. package/src/engine/combat/castableKit.ts +68 -0
  815. package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
  816. package/src/engine/combat/chainFan.ts +210 -0
  817. package/src/engine/combat/channel.ts +423 -0
  818. package/src/engine/combat/chaseCloseness.ts +95 -0
  819. package/src/engine/combat/cmangosCastGates.ts +129 -0
  820. package/src/engine/combat/combatFlag.ts +77 -0
  821. package/src/engine/combat/combatGeometry.ts +1329 -0
  822. package/src/engine/combat/combustion.ts +68 -0
  823. package/src/engine/combat/context.ts +730 -0
  824. package/src/engine/combat/createSession.ts +1165 -0
  825. package/src/engine/combat/creatureLeash.ts +38 -0
  826. package/src/engine/combat/crowdControl.ts +1259 -0
  827. package/src/engine/combat/dispelDuty.ts +54 -0
  828. package/src/engine/combat/dispelReflect.ts +609 -0
  829. package/src/engine/combat/displaceFloor.ts +113 -0
  830. package/src/engine/combat/duelBounds.ts +47 -0
  831. package/src/engine/combat/equippedItemGate.ts +297 -0
  832. package/src/engine/combat/evadeLifecycle.ts +63 -0
  833. package/src/engine/combat/eventAi.ts +2220 -0
  834. package/src/engine/combat/facing.ts +74 -0
  835. package/src/engine/combat/fearFlee.ts +137 -0
  836. package/src/engine/combat/fighterFactory.ts +1144 -0
  837. package/src/engine/combat/forceDespawnAction.ts +51 -0
  838. package/src/engine/combat/formulas.ts +807 -0
  839. package/src/engine/combat/friendlyFan.ts +55 -0
  840. package/src/engine/combat/groundPoolTick.ts +210 -0
  841. package/src/engine/combat/hazards.ts +114 -0
  842. package/src/engine/combat/healTargets.ts +226 -0
  843. package/src/engine/combat/heartbeatResist.ts +49 -0
  844. package/src/engine/combat/hostileItemUse.ts +75 -0
  845. package/src/engine/combat/interruptAuras.ts +66 -0
  846. package/src/engine/combat/itemRescue.ts +49 -0
  847. package/src/engine/combat/itemUse.ts +260 -0
  848. package/src/engine/combat/kitById.ts +23 -0
  849. package/src/engine/combat/knockBack.ts +201 -0
  850. package/src/engine/combat/leap.ts +89 -0
  851. package/src/engine/combat/mitigation.ts +587 -0
  852. package/src/engine/combat/modTaunt.ts +43 -0
  853. package/src/engine/combat/motionClaim.ts +268 -0
  854. package/src/engine/combat/motionGate.ts +150 -0
  855. package/src/engine/combat/motionGenerator.ts +27 -0
  856. package/src/engine/combat/navSight.ts +138 -0
  857. package/src/engine/combat/perfSink.ts +28 -0
  858. package/src/engine/combat/periodicDue.ts +55 -0
  859. package/src/engine/combat/petAuras.ts +86 -0
  860. package/src/engine/combat/pickAction.ts +3449 -0
  861. package/src/engine/combat/powerForm.ts +735 -0
  862. package/src/engine/combat/powerPools.ts +49 -0
  863. package/src/engine/combat/predicates.ts +538 -0
  864. package/src/engine/combat/procsDamage.ts +1823 -0
  865. package/src/engine/combat/reactiveGates.ts +135 -0
  866. package/src/engine/combat/roles.ts +389 -0
  867. package/src/engine/combat/rotationSubject.ts +78 -0
  868. package/src/engine/combat/ruleAfter.ts +106 -0
  869. package/src/engine/combat/seedDisplayAuras.ts +203 -0
  870. package/src/engine/combat/seedOocEffects.ts +317 -0
  871. package/src/engine/combat/seedSchoolImmunities.ts +45 -0
  872. package/src/engine/combat/session-types.ts +458 -0
  873. package/src/engine/combat/sessionApi.ts +1785 -0
  874. package/src/engine/combat/sessionCharge.ts +124 -0
  875. package/src/engine/combat/sessionChase.ts +869 -0
  876. package/src/engine/combat/sessionDeaths.ts +469 -0
  877. package/src/engine/combat/sessionFocus.ts +506 -0
  878. package/src/engine/combat/sessionFollow.ts +167 -0
  879. package/src/engine/combat/sessionGeometry.ts +188 -0
  880. package/src/engine/combat/sessionHome.ts +75 -0
  881. package/src/engine/combat/sessionInject.ts +719 -0
  882. package/src/engine/combat/sessionMechanicMove.ts +555 -0
  883. package/src/engine/combat/sessionMotion.ts +1553 -0
  884. package/src/engine/combat/sessionMotionKit.ts +247 -0
  885. package/src/engine/combat/sessionMoveIntent.ts +49 -0
  886. package/src/engine/combat/sessionMoveOrder.ts +200 -0
  887. package/src/engine/combat/sessionPathTo.ts +657 -0
  888. package/src/engine/combat/sessionPools.ts +688 -0
  889. package/src/engine/combat/sessionSteer.ts +144 -0
  890. package/src/engine/combat/sessionStepBack.ts +151 -0
  891. package/src/engine/combat/sessionStepWrap.ts +116 -0
  892. package/src/engine/combat/sessionView.ts +442 -0
  893. package/src/engine/combat/simEffects.ts +32 -0
  894. package/src/engine/combat/simFacade.ts +620 -0
  895. package/src/engine/combat/simPump.ts +264 -0
  896. package/src/engine/combat/simSnapshot.ts +165 -0
  897. package/src/engine/combat/simThreadPool.ts +35 -0
  898. package/src/engine/combat/skeramImages.ts +57 -0
  899. package/src/engine/combat/slowUpdate.ts +178 -0
  900. package/src/engine/combat/snapToFloor.ts +42 -0
  901. package/src/engine/combat/speedAura.ts +29 -0
  902. package/src/engine/combat/spellReagents.ts +71 -0
  903. package/src/engine/combat/stealthDetect.ts +93 -0
  904. package/src/engine/combat/stepBackMotion.ts +171 -0
  905. package/src/engine/combat/stepSession.ts +3102 -0
  906. package/src/engine/combat/summonCast.ts +243 -0
  907. package/src/engine/combat/thaddiusPolarity.ts +97 -0
  908. package/src/engine/combat/threat.ts +388 -0
  909. package/src/engine/combat/threatOps.ts +272 -0
  910. package/src/engine/combat/tickWorkerBody.ts +211 -0
  911. package/src/engine/combat/totemAuras.ts +122 -0
  912. package/src/engine/combat/triggerPayload.ts +42 -0
  913. package/src/engine/combat/triggeredCompanion.ts +63 -0
  914. package/src/engine/combat/types.ts +1897 -0
  915. package/src/engine/combat/useObjectTrap.ts +140 -0
  916. package/src/engine/combat/walkSurface.ts +54 -0
  917. package/src/engine/combat/weapon.ts +1248 -0
  918. package/src/engine/combat/worldFrame.ts +43 -0
  919. package/src/engine/combat.solo-golden.json +2242 -0
  920. package/src/engine/combat.ts +84 -0
  921. package/src/engine/core/detMath.ts +289 -0
  922. package/src/engine/core/events.ts +357 -0
  923. package/src/engine/core/rng.ts +36 -0
  924. package/src/engine/game/actionBars.ts +124 -0
  925. package/src/engine/game/activateObjectFromSpell.ts +320 -0
  926. package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
  927. package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
  928. package/src/engine/game/applyDoorFromDbScript.ts +388 -0
  929. package/src/engine/game/applyEscortFromDbScript.ts +290 -0
  930. package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
  931. package/src/engine/game/applyHoverFromDbScript.ts +110 -0
  932. package/src/engine/game/applyOocResurrect.ts +71 -0
  933. package/src/engine/game/applySpellDurability.ts +115 -0
  934. package/src/engine/game/applyTailFromDbScript.ts +478 -0
  935. package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
  936. package/src/engine/game/auctionMail.ts +269 -0
  937. package/src/engine/game/bagOverflow.ts +130 -0
  938. package/src/engine/game/bank.ts +110 -0
  939. package/src/engine/game/barAutofill.ts +26 -0
  940. package/src/engine/game/battleground.ts +369 -0
  941. package/src/engine/game/combatEnemySpec.ts +216 -0
  942. package/src/engine/game/combatObjectTraps.ts +167 -0
  943. package/src/engine/game/combatSeed.ts +320 -0
  944. package/src/engine/game/combatSession.ts +3241 -0
  945. package/src/engine/game/combatSessionClock.ts +62 -0
  946. package/src/engine/game/companionQuestActions.ts +242 -0
  947. package/src/engine/game/companionTraining.ts +40 -0
  948. package/src/engine/game/consumables.ts +624 -0
  949. package/src/engine/game/context.ts +53 -0
  950. package/src/engine/game/createHealthstone.ts +45 -0
  951. package/src/engine/game/deathFlow.ts +127 -0
  952. package/src/engine/game/devGrant.ts +117 -0
  953. package/src/engine/game/dynamicObject.ts +365 -0
  954. package/src/engine/game/enchantItem.ts +177 -0
  955. package/src/engine/game/equipmentHelper.ts +806 -0
  956. package/src/engine/game/factionState.ts +108 -0
  957. package/src/engine/game/garmentsOoc.ts +69 -0
  958. package/src/engine/game/globalActionBar.ts +179 -0
  959. package/src/engine/game/goInteractQuestCredit.ts +51 -0
  960. package/src/engine/game/goMoTransportUse.ts +61 -0
  961. package/src/engine/game/goTransportUse.ts +60 -0
  962. package/src/engine/game/healthstoneUpkeep.ts +59 -0
  963. package/src/engine/game/killSkin.ts +124 -0
  964. package/src/engine/game/learnFromItem.ts +118 -0
  965. package/src/engine/game/loadReconcile.ts +551 -0
  966. package/src/engine/game/loot.ts +294 -0
  967. package/src/engine/game/macros.ts +125 -0
  968. package/src/engine/game/mail.ts +293 -0
  969. package/src/engine/game/meetingStoneQueue.ts +75 -0
  970. package/src/engine/game/meetingStoneUse.ts +54 -0
  971. package/src/engine/game/newGameState.ts +363 -0
  972. package/src/engine/game/oocAuraInterrupt.ts +92 -0
  973. package/src/engine/game/oocCast.ts +241 -0
  974. package/src/engine/game/oocCastEffects.ts +803 -0
  975. package/src/engine/game/oocCastMethods.ts +1077 -0
  976. package/src/engine/game/openLockFromSpell.ts +174 -0
  977. package/src/engine/game/outdoorPvp.ts +187 -0
  978. package/src/engine/game/outfitter.ts +644 -0
  979. package/src/engine/game/paladinBoard.ts +393 -0
  980. package/src/engine/game/partyAuras.ts +121 -0
  981. package/src/engine/game/persistCombatAuras.ts +91 -0
  982. package/src/engine/game/pets.ts +459 -0
  983. package/src/engine/game/prePullHealthstones.ts +154 -0
  984. package/src/engine/game/professions.ts +2227 -0
  985. package/src/engine/game/pruneStaleRuntime.ts +39 -0
  986. package/src/engine/game/questFightCredit.ts +36 -0
  987. package/src/engine/game/questItemOnCorpse.ts +166 -0
  988. package/src/engine/game/questItemOnCreature.ts +103 -0
  989. package/src/engine/game/questLog.ts +879 -0
  990. package/src/engine/game/questSpellComplete.ts +21 -0
  991. package/src/engine/game/questTurnIn.ts +598 -0
  992. package/src/engine/game/raidParty.ts +32 -0
  993. package/src/engine/game/reagentBuyIn.ts +39 -0
  994. package/src/engine/game/regenRest.ts +186 -0
  995. package/src/engine/game/rotation.ts +425 -0
  996. package/src/engine/game/runFullDungeon.ts +611 -0
  997. package/src/engine/game/runSupply.ts +80 -0
  998. package/src/engine/game/sanitizeDriftedItems.ts +135 -0
  999. package/src/engine/game/scriptDevGoUse.ts +397 -0
  1000. package/src/engine/game/scriptDevInnkeeper.ts +150 -0
  1001. package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
  1002. package/src/engine/game/sendEventFromSpell.ts +87 -0
  1003. package/src/engine/game/sortContainers.ts +85 -0
  1004. package/src/engine/game/spellReputation.ts +69 -0
  1005. package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
  1006. package/src/engine/game/squadDungeon.ts +4222 -0
  1007. package/src/engine/game/squadQuestShare.ts +260 -0
  1008. package/src/engine/game/summonObjectSlot.ts +69 -0
  1009. package/src/engine/game/summonObjectWild.ts +73 -0
  1010. package/src/engine/game/summoningRitualUse.ts +141 -0
  1011. package/src/engine/game/talents.ts +356 -0
  1012. package/src/engine/game/tamingRodUse.ts +66 -0
  1013. package/src/engine/game/tempSpawnCreature.ts +136 -0
  1014. package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
  1015. package/src/engine/game/tickTimedQuests.ts +28 -0
  1016. package/src/engine/game/trade.ts +586 -0
  1017. package/src/engine/game/travel.ts +1155 -0
  1018. package/src/engine/game/types.ts +1855 -0
  1019. package/src/engine/game/vendorOffers.ts +244 -0
  1020. package/src/engine/game/weaponImbueItem.ts +281 -0
  1021. package/src/engine/game/worldSession.ts +183 -0
  1022. package/src/engine/game/worldState.ts +166 -0
  1023. package/src/engine/game.ts +968 -0
  1024. package/src/engine/spells/GAP.md +67 -0
  1025. package/src/engine/spells/absorbs.ts +376 -0
  1026. package/src/engine/spells/addTargetTrigger.ts +53 -0
  1027. package/src/engine/spells/auraPerSecondCost.ts +50 -0
  1028. package/src/engine/spells/auraStacking.ts +497 -0
  1029. package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
  1030. package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
  1031. package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
  1032. package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
  1033. package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
  1034. package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
  1035. package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
  1036. package/src/engine/spells/cmangos-special-cases.ts +1570 -0
  1037. package/src/engine/spells/conditions.ts +718 -0
  1038. package/src/engine/spells/effects.ts +203 -0
  1039. package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
  1040. package/src/engine/spells/immunity.ts +942 -0
  1041. package/src/engine/spells/intentEffects.ts +351 -0
  1042. package/src/engine/spells/interpreter/GAPS.md +21 -0
  1043. package/src/engine/spells/interpreter/amount.ts +109 -0
  1044. package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
  1045. package/src/engine/spells/interpreter/diff.ts +246 -0
  1046. package/src/engine/spells/interpreter/duration.ts +90 -0
  1047. package/src/engine/spells/interpreter/form-attrs.json +1 -0
  1048. package/src/engine/spells/interpreter/form-attrs.ts +95 -0
  1049. package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
  1050. package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
  1051. package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
  1052. package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
  1053. package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
  1054. package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
  1055. package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
  1056. package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
  1057. package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
  1058. package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
  1059. package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
  1060. package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
  1061. package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
  1062. package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
  1063. package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
  1064. package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
  1065. package/src/engine/spells/interpreter/handlers.ts +9 -0
  1066. package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
  1067. package/src/engine/spells/interpreter/index.ts +525 -0
  1068. package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
  1069. package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
  1070. package/src/engine/spells/interpreter/mage-portals.ts +37 -0
  1071. package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
  1072. package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
  1073. package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
  1074. package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
  1075. package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
  1076. package/src/engine/spells/interpreter/opcodes.ts +789 -0
  1077. package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
  1078. package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
  1079. package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
  1080. package/src/engine/spells/interpreter/proc.ts +443 -0
  1081. package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
  1082. package/src/engine/spells/interpreter/registry/index.ts +216 -0
  1083. package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
  1084. package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
  1085. package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
  1086. package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
  1087. package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
  1088. package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
  1089. package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
  1090. package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
  1091. package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
  1092. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
  1093. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
  1094. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
  1095. package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
  1096. package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
  1097. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
  1098. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
  1099. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
  1100. package/src/engine/spells/interpreter/registry/types.ts +48 -0
  1101. package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
  1102. package/src/engine/spells/interpreter/targeting.ts +90 -0
  1103. package/src/engine/spells/interpreter/types-intent.ts +1501 -0
  1104. package/src/engine/spells/interpreter/types.ts +419 -0
  1105. package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
  1106. package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
  1107. package/src/engine/spells/interrupt.ts +217 -0
  1108. package/src/engine/spells/meleeAttackReset.ts +60 -0
  1109. package/src/engine/spells/oocTriggerSpell.ts +49 -0
  1110. package/src/engine/spells/overrideClassScripts.ts +319 -0
  1111. package/src/engine/spells/parryHaste.ts +20 -0
  1112. package/src/engine/spells/procs.ts +300 -0
  1113. package/src/engine/spells/recovery.ts +203 -0
  1114. package/src/engine/spells/scriptTargetDest.ts +76 -0
  1115. package/src/engine/spells/scriptTargets.ts +85 -0
  1116. package/src/engine/spells/singleTargetAura.ts +82 -0
  1117. package/src/engine/spells/specialCasePayloads.ts +57 -0
  1118. package/src/engine/spells/spellAttributes.ts +249 -0
  1119. package/src/engine/spells/spellBonus.ts +143 -0
  1120. package/src/engine/spells/spellModIntents.ts +419 -0
  1121. package/src/engine/spells/spellMods.ts +283 -0
  1122. package/src/engine/spells/spellRadius.ts +15 -0
  1123. package/src/engine/spells/trapObjects.ts +26 -0
  1124. package/src/json.d.ts +7 -0
  1125. package/src/persistence/memoryRepository.ts +23 -0
  1126. package/src/persistence/saveBackups.ts +162 -0
  1127. package/src/persistence/saveFile.ts +68 -0
  1128. package/src/persistence/saveRepository.ts +11 -0
  1129. package/src/persistence/saveShape.ts +668 -0
  1130. package/src/progression/leveling.ts +89 -0
  1131. package/src/progression/rest.ts +1434 -0
  1132. package/src/progression/training.ts +226 -0
  1133. package/src/progression/xpGain.ts +369 -0
  1134. package/src/quests/quests.ts +1580 -0
  1135. package/src/world/aoePull.ts +198 -0
  1136. package/src/world/areaTableDbc.ts +39 -0
  1137. package/src/world/areaTableMapIdPairs.ts +141 -0
  1138. package/src/world/bakeSlug.ts +43 -0
  1139. package/src/world/continuousDungeon.ts +1250 -0
  1140. package/src/world/dungeonBakeProjection.ts +190 -0
  1141. package/src/world/dungeonMapDensity.ts +342 -0
  1142. package/src/world/dungeonMapProjection.ts +135 -0
  1143. package/src/world/dungeonNav.ts +904 -0
  1144. package/src/world/dungeonNpcSim.ts +147 -0
  1145. package/src/world/dungeonObjectives.ts +234 -0
  1146. package/src/world/dungeonPreset.ts +35 -0
  1147. package/src/world/dungeonRoute.ts +311 -0
  1148. package/src/world/dungeonRouteGeometry.ts +732 -0
  1149. package/src/world/dungeonRouteOrder.ts +1037 -0
  1150. package/src/world/dungeonWingRooms.ts +426 -0
  1151. package/src/world/escort.ts +296 -0
  1152. package/src/world/goPoolRoll.ts +75 -0
  1153. package/src/world/instanceObjects.ts +785 -0
  1154. package/src/world/instances.ts +1572 -0
  1155. package/src/world/meetingStones.ts +56 -0
  1156. package/src/world/navmeshFloors.ts +145 -0
  1157. package/src/world/nearGrid.ts +167 -0
  1158. package/src/world/packBudget.ts +613 -0
  1159. package/src/world/rareRoll.ts +335 -0
  1160. package/src/world/routeAuthoring.ts +132 -0
  1161. package/src/world/routeEdit.ts +209 -0
  1162. package/src/world/world.ts +812 -0
  1163. package/src/world/zoneHazards.ts +47 -0
@@ -0,0 +1,1076 @@
1
+ // Scholomance (map 289) — InstanceDef graph. Authority: docs/dungeons/survey/18-scholomance.md.
2
+ // Six engine/bake residuals are named there; none is a deferred C++ port.
3
+
4
+ import type { EncounterDef, EncounterEvent, InstanceDef } from '../schema.ts';
5
+ import {
6
+ entranceForInstance,
7
+ buildClusterEncounters,
8
+ clusterMemberByGuid,
9
+ loadPoolGuidCandidates,
10
+ repackFromGuids,
11
+ } from './pack-from-clusters.ts';
12
+
13
+ // ---- Census static counts (map 289; survey creature census static column) ----
14
+ // Bosses, Dawn's Gambit students, seasonal rows and every summon-only entry are excluded.
15
+
16
+ const STATIC = {
17
+ risenGuard: 12, // 10489 Risen Guard
18
+ acolyte: 14, // 10471 Scholomance Acolyte
19
+ necrolyte: 10, // 10476 Scholomance Necrolyte
20
+ neophyte: 17, // 10470 Scholomance Neophyte
21
+ diseasedGhoul: 29, // 10495 Diseased Ghoul (pool)
22
+ necrofiend: 3, // 11551 Necrofiend
23
+ bonewarder: 4, // 10491 Risen Bonewarder
24
+ construct: 12, // 10488 Risen Construct
25
+ protector: 4, // 10487 Risen Protector
26
+ adept: 17, // 10469 Scholomance Adept
27
+ darkSummoner: 6, // 11582 Scholomance Dark Summoner
28
+ necromancer: 15, // 10477 Scholomance Necromancer
29
+ occultist: 5, // 10472 Scholomance Occultist
30
+ researcher: 7, // 10499 Spectral Researcher
31
+ teacher: 3, // 10500 Spectral Teacher
32
+ tutor: 7, // 10498 Spectral Tutor
33
+ warrior: 2, // 10486 Risen Warrior
34
+ handler: 5, // 11257 Scholomance Handler
35
+ splinteredSkeleton: 5, // 10478 Splintered Skeleton
36
+ bloodSteward: 1, // 14861 Blood Steward of Kirtonos
37
+ hatchling: 22, // 10678 Plagued Hatchling
38
+ aberration: 46, // 10485 Risen Aberration
39
+ reanimatedCorpse: 24, // 10481 Reanimated Corpse (pool)
40
+ unstableCorpse: 21, // 10480 Unstable Corpse
41
+ } as const;
42
+
43
+ const ENTRY = {
44
+ risenGuard: 10489,
45
+ acolyte: 10471,
46
+ necrolyte: 10476,
47
+ neophyte: 10470,
48
+ diseasedGhoul: 10495,
49
+ necrofiend: 11551,
50
+ bonewarder: 10491,
51
+ construct: 10488,
52
+ protector: 10487,
53
+ adept: 10469,
54
+ darkSummoner: 11582,
55
+ necromancer: 10477,
56
+ occultist: 10472,
57
+ researcher: 10499,
58
+ teacher: 10500,
59
+ tutor: 10498,
60
+ warrior: 10486,
61
+ handler: 11257,
62
+ splinteredSkeleton: 10478,
63
+ bloodSteward: 14861,
64
+ hatchling: 10678,
65
+ aberration: 10485,
66
+ reanimatedCorpse: 10481,
67
+ unstableCorpse: 10480,
68
+ // Bosses (canonical survey order)
69
+ kirtonos: 10506, // summon-only - Blood of Innocents on Brazier
70
+ jandice: 10503,
71
+ rattlegore: 11622,
72
+ marduk: 10433, // viewing room (with Vectus)
73
+ vectus: 10432,
74
+ ras: 10508,
75
+ malicia: 10505, // six mini-bosses (stable author order)
76
+ krastinov: 11261,
77
+ polkelt: 10901,
78
+ ravenian: 10507,
79
+ lordAlexei: 10504,
80
+ ladyIllucia: 10502,
81
+ gandling: 1853, // summon-only - after all 6 mini-bosses
82
+ // Event summon-only
83
+ risenGuardian: 11598, // Gandling Shadow Portal room adds
84
+ /** Dawn's Gambit — friendly statics until item arm; combat pack after gate. */
85
+ student: 10475, // Scholomance Student (survey static ×32)
86
+ } as const;
87
+
88
+ /** Flags from survey event choreography / instance_scholomance.cpp. */
89
+ export const SCHOLOMANCE_FLAGS = {
90
+ /** Brazier of the Herald used with Blood of Innocents - unlocks Kirtonos. */
91
+ kirtonosBrazier: 'scholo-kirtonos-brazier',
92
+ /** Rattlegore death drops Viewing Room Key 13873 - opens Viewing Room Door 175167. */
93
+ viewingRoomKey: 'scholo-viewing-room-key',
94
+ // Dawn's Gambit used at Viewing Room Spell Focus. Cite: instance_scholomance.cpp:440-469
95
+ // HandleDawnGambitEvent; scholomance.h:66 EVENT_ID=5140.
96
+ dawnGambit: 'scholo-dawn-gambit',
97
+ /** Jandice death → journal GO reveal path. Cite: 289_scholomance.sql dbscripts_on_creature_death 10503. */
98
+ jandiceDone: 'scholo-jandice-done',
99
+ /** Six mini-boss DONE flags - all required before Gandling. */
100
+ maliciaDone: 'scholo-malicia-done',
101
+ krastinovDone: 'scholo-krastinov-done',
102
+ polkeltDone: 'scholo-polkelt-done',
103
+ ravenianDone: 'scholo-ravenian-done',
104
+ lordAlexeiDone: 'scholo-lord-alexei-done',
105
+ ladyIlluciaDone: 'scholo-lady-illucia-done',
106
+ } as const;
107
+
108
+ // Kirtonos the Herald — Brazier plus porch gate lock-in: Gate 175570 auto-reopens after 600s and
109
+ // 10506 spawns at 309.65,93.47. Cite: 289_scholomance.sql dbscripts_on_go_use @OGUID+9.
110
+ export const SCHOLO_KIRTONOS = {
111
+ encId: 'kirtonos-the-herald',
112
+ goEntry: 175564, // Brazier of the Herald
113
+ requiredItem: 13523, // Blood of Innocents (quest 5384)
114
+ porchGateGo: 175570, // Gate of Kirtonos
115
+ /** dbscripts_on_go_use cmd 12 datalong2 = 600 (seconds). */
116
+ porchGateLockMs: 600_000,
117
+ /** dbscripts_on_go_use delay 5000 → SUMMON_CREATURE 10506. */
118
+ firstWaveAtMs: 5_000,
119
+ /** dbscripts datalong2 on summon = 900000 (15 min). */
120
+ despawnMs: 900_000,
121
+ /** dbscripts_on_go_use cmd 10 x,y,z. */
122
+ spawn: { x: 309.65, y: 93.47, z: 101.66 },
123
+ } as const;
124
+
125
+ /** Viewing Room Door: GO 175167, lock 1199 → LOCK_KEY_ITEM 13873 off Rattlegore (lootId 11622). */
126
+ export const SCHOLO_VIEWING_ROOM = {
127
+ goEntry: 175167,
128
+ requiredItem: 13873,
129
+ } as const;
130
+
131
+ /** Alias kept for older probe/import sites. */
132
+ export const SCHOLOMANCE_KIRTONOS_BRAZIER = {
133
+ goEntry: SCHOLO_KIRTONOS.goEntry,
134
+ requiredItem: SCHOLO_KIRTONOS.requiredItem,
135
+ } as const;
136
+
137
+ // Gandling Shadow Portal room table (baked dbScripts.event 5618–5623): eventId, classroom gate GO,
138
+ // guardian count, room tag. Polkelt takes ×4 guardians, the others ×3. Cite: scholomance.h:59-64.
139
+ export const SCHOLOMANCE_GANDLING_PORTALS = [
140
+ { room: 'polkelt', eventId: 5618, gateGo: 177376, count: 4 },
141
+ { room: 'theolen', eventId: 5619, gateGo: 177377, count: 3 },
142
+ { room: 'malicia', eventId: 5620, gateGo: 177375, count: 3 },
143
+ { room: 'illucia', eventId: 5621, gateGo: 177371, count: 3 },
144
+ { room: 'barov', eventId: 5622, gateGo: 177373, count: 3 },
145
+ { room: 'ravenian', eventId: 5623, gateGo: 177372, count: 3 },
146
+ ] as const;
147
+
148
+ // Darkmaster Gandling encounter plus the Shadow Portal schedule. Cite: boss_darkmaster_gandling.cpp
149
+ // :57 Teleport=16000, :94 HP>3%, :106 urand(20000,35000); dbScripts.event 5618 delay 2000.
150
+ export const SCHOLO_GANDLING = {
151
+ encId: 'darkmaster-gandling',
152
+ spellShadowPortal: 17950,
153
+ /** Reset m_uiTeleportTimer. Cite: boss_darkmaster_gandling.cpp:57 */
154
+ firstPortalCastMs: 16_000,
155
+ /** dbscripts_on_event 5618–5623 delay before SUMMON_CREATURE. */
156
+ portalSummonDelayMs: 2_000,
157
+ /** First guardian wave absolute from combat start (cast + DB delay). */
158
+ firstPortalGuardiansAtMs: 18_000,
159
+ /** CAST_OK re-arm min. Cite: boss_darkmaster_gandling.cpp:106 */
160
+ portalRepeatMinMs: 20_000,
161
+ /** CAST_OK re-arm max. Cite: boss_darkmaster_gandling.cpp:106 */
162
+ portalRepeatMaxMs: 35_000,
163
+ /** Portal only while GetHealthPercent() > 3. Cite: cpp:94 */
164
+ portalHpMinPct: 3,
165
+ /** dbscripts datalong2 despawn. */
166
+ guardianDespawnMs: 300_000,
167
+ /** aGandlingSpawnLocs[0]. Cite: scholomance.h:82-85 */
168
+ spawn: { x: 180.771, y: -5.4286, z: 75.5702 },
169
+ gateGo: 177374, // GO_GATE_GANDLING
170
+ } as const;
171
+
172
+ // Portal rooms then the Gandling finale, with `lastHas` carrying the floor credit guid. Residual:
173
+ // player teleport and per-room gate close/reopen have no floor-isolation kind.
174
+ export const SCHOLO_GANDLING_WAVES = [
175
+ ...SCHOLOMANCE_GANDLING_PORTALS.map((p) => ({
176
+ pack: [{ creatureEntry: ENTRY.risenGuardian, count: p.count }],
177
+ })),
178
+ { pack: [{ creatureEntry: ENTRY.gandling, count: 1 }] },
179
+ ] as const;
180
+
181
+ // Jandice Barov — illusions from ScriptDev (17773 → 15× 11439), journal from
182
+ // dbscripts_on_creature_death 10503 spell 26096 → GO 180794, which the bake still lacks.
183
+ export const SCHOLO_JANDICE = {
184
+ encId: 'jandice-barov',
185
+ spellSummonIllusions: 17773,
186
+ illusionEntry: 11439,
187
+ illusionCount: 15, // 17773 EffectBasePoints1=14 + dieSides1=1
188
+ hideDurationMs: 8_000, // Spread Jandice 17774 DurationIndex 31
189
+ journalGo: 180794, // Cite: 289_scholomance.sql dbscripts_on_creature_death 10503 → 26096
190
+ journalSpell: 26096,
191
+ } as const;
192
+
193
+ // Dawn's Gambit — Viewing Room student ambush, gated at Spell Focus 176111 with item 12368 and a
194
+ // 32× 10475 pack standing in for the transform. Cite: instance_scholomance.cpp:440-509.
195
+ export const SCHOLO_DAWN_GAMBIT = {
196
+ encId: 'dawn-gambit',
197
+ /** dungeonGameObjects map 289 — Scholomance Viewing Room Spell Focus (DND). */
198
+ goEntry: 176111,
199
+ requiredItem: 12368, // Dawn's Gambit (quest 4771); item-data useSpell 17045
200
+ spellDawnGambit: 17045,
201
+ trapGo: 176110, // summoned by 17045 (not static on map)
202
+ eventId: 5140, // scholomance.h:66 EVENT_ID_DAWN_GAMBIT
203
+ /** Cite: instance_scholomance.cpp:444 m_uiGambitTransformTimer = 12 * IN_MILLISECONDS */
204
+ transformMs: 12_000,
205
+ studentEntry: 10475,
206
+ /** Survey static census ×32 Viewing Room students. */
207
+ studentCount: 32,
208
+ /** FACTION_SCOURGE after flip. Cite: scholomance.h:68 FACTION_SCOURGE=233 */
209
+ scourgeFaction: 233,
210
+ /** SPELL_STUDENT_TRANSFORM — missing from spell bake; product combat pack stand-in. */
211
+ spellStudentTransform: 18115,
212
+ } as const;
213
+
214
+ // Soulbound Keepsake — Ras Frostwhisper mortality (quest 5461/5466), item 13752 useSpell 17179.
215
+ // Residual: the mid-fight item-target state machine and spell 17186 are absent from the bake.
216
+ export const SCHOLO_RAS_KEEPSAKE = {
217
+ encId: 'ras-frostwhisper',
218
+ requiredItem: 13752, // Soulbound Keepsake
219
+ spellBoonOfLife: 17179,
220
+ spellVisualDummy: 17190, // EventAI 1050803 trigger
221
+ spellBecomesBoy: 17186, // missing from spell bake
222
+ /** Relay 1050801: +2s cast boy form. Cite: survey 18-scholomance.md Ras mortality row. */
223
+ becomesBoyDelayMs: 2_000,
224
+ /** Relay: +8s faction 233 + attackable again. */
225
+ reHostileDelayMs: 8_000,
226
+ humanHeadItem: 13626, // quest 5466 drop (no DB condition on human form)
227
+ boyDisplayId: 5736,
228
+ } as const;
229
+
230
+ /** Summon-only creature entries that must never appear in pure static trash packs. */
231
+ export const SCHOLOMANCE_SUMMON_ONLY_ENTRIES = new Set<number>([
232
+ ENTRY.kirtonos, // 10506
233
+ ENTRY.gandling, // 1853
234
+ ENTRY.risenGuardian, // 11598
235
+ 11439, // Illusion of Jandice Barov (ScriptDev mid-fight inject)
236
+ 16118, // Kormok (survey; not modeled)
237
+ ]);
238
+
239
+ /** Scourge Invasion / technical - excluded from static combat graph. */
240
+ export const SCHOLOMANCE_EXCLUDED_ENTRIES = new Set<number>([
241
+ 14695, // Lord Blackwood - Scourge Invasion (D-10)
242
+ // 10475 students: event-only via SCHOLO_DAWN_GAMBIT (not pure static trash)
243
+ 16047, // Kormok Trigger - technical
244
+ ]);
245
+
246
+ /** Split a static spawn count into pack sizes in [2, 5] (prefer 4). Remainder 1 folded into prior pack. */
247
+ export function splitPackSizes(total: number, prefer = 4): number[] {
248
+ if (total <= 0) return [];
249
+ if (total === 1) return [1];
250
+ const packs: number[] = [];
251
+ let left = total;
252
+ while (left > 0) {
253
+ if (left <= 5) {
254
+ packs.push(left);
255
+ break;
256
+ }
257
+ let n = prefer;
258
+ const rem = left - n;
259
+ if (rem === 1) n = prefer - 1; // leave 2+
260
+ packs.push(n);
261
+ left -= n;
262
+ }
263
+ return packs;
264
+ }
265
+
266
+ function trashPull(
267
+ id: string,
268
+ name: string,
269
+ creatureEntry: number,
270
+ count: number,
271
+ events?: EncounterEvent[],
272
+ ): EncounterDef {
273
+ const enc: EncounterDef = {
274
+ id,
275
+ name,
276
+ kind: 'trash',
277
+ creatureEntry,
278
+ };
279
+ if (count > 1) enc.pack = [{ creatureEntry, count: count - 1 }];
280
+ if (events && events.length) enc.events = events;
281
+ return enc;
282
+ }
283
+
284
+ /** Expand one census entry into ordered trash pulls (ids `${prefix}-0` …). */
285
+ function trashFromCensus(
286
+ _prefix: string,
287
+ _displayName: string,
288
+ _creatureEntry: number,
289
+ _total: number,
290
+ ): EncounterDef[] {
291
+ // DP1: cluster packs supply trash; hand spine keeps bosses/events only.
292
+ return [];
293
+ }
294
+
295
+ // Boss spells: creature.spells from bake (game-data) - no invented ids.
296
+ const BOSS_SPELLS = {
297
+ kirtonos: [18116, 20741, 18144, 6016, 12882, 8379, 16467, 17228, 12889, 14515],
298
+ // SESSION 10 ScriptDev schedule owns Jandice / Gandling kits (cpp spell enums).
299
+ jandice: [16098, 8994, 17773, 17774, 17772],
300
+ rattlegore: [10101, 16727, 18116, 18368],
301
+ marduk: [17228, 12040, 15284, 17695],
302
+ vectus: [18399, 16046],
303
+ ras: [18099, 8398, 12096, 18763, 18100, 11130],
304
+ malicia: [11672, 12020, 18116, 17831, 18376, 8362, 13747, 17843, 15586],
305
+ krastinov: [16509, 18103, 8269],
306
+ polkelt: [16359, 3584, 18116, 18151, 18149, 8245],
307
+ ravenian: [17963, 15550, 18670, 15584],
308
+ lordAlexei: [11668, 11700, 18116, 17467, 17820],
309
+ ladyIllucia: [18116, 19460, 6215, 15487, 12528, 17289, 18671, 12542, 14515],
310
+ gandling: [15790, 12040, 18702, 17950],
311
+ } as const;
312
+
313
+ function boss(
314
+ id: string,
315
+ name: string,
316
+ creatureEntry: number,
317
+ bossSpells: readonly number[],
318
+ events?: EncounterEvent[],
319
+ intro?: string,
320
+ ): EncounterDef {
321
+ const enc: EncounterDef = {
322
+ id,
323
+ name,
324
+ kind: 'boss',
325
+ creatureEntry,
326
+ };
327
+ if (bossSpells.length) enc.bossSpells = [...bossSpells];
328
+ if (intro) enc.intro = intro;
329
+ if (events && events.length) enc.events = events;
330
+ return enc;
331
+ }
332
+
333
+ // Linear encounter graph: entrance porch → Kirtonos → Jandice → Rattlegore → Viewing Room →
334
+ // Ras → six mini-boss rooms in a stable author order → Darkmaster Gandling.
335
+ function buildHandSpine(): EncounterDef[] {
336
+ // Entrance / porch band
337
+ const acolytes = trashFromCensus('acolyte', 'Scholomance Acolyte', ENTRY.acolyte, STATIC.acolyte);
338
+ const necrolytes = trashFromCensus(
339
+ 'necrolyte',
340
+ 'Scholomance Necrolyte',
341
+ ENTRY.necrolyte,
342
+ STATIC.necrolyte,
343
+ );
344
+ const neophytes = trashFromCensus(
345
+ 'neophyte',
346
+ 'Scholomance Neophyte',
347
+ ENTRY.neophyte,
348
+ STATIC.neophyte,
349
+ );
350
+ const risenGuards = trashFromCensus(
351
+ 'risen-guard',
352
+ 'Risen Guard',
353
+ ENTRY.risenGuard,
354
+ STATIC.risenGuard,
355
+ );
356
+ const bloodStewards = trashFromCensus(
357
+ 'blood-steward',
358
+ 'Blood Steward of Kirtonos',
359
+ ENTRY.bloodSteward,
360
+ STATIC.bloodSteward,
361
+ );
362
+
363
+ // Reliquary / Jandice wing
364
+ const adepts = trashFromCensus('adept', 'Scholomance Adept', ENTRY.adept, STATIC.adept);
365
+ const necromancers = trashFromCensus(
366
+ 'necromancer',
367
+ 'Scholomance Necromancer',
368
+ ENTRY.necromancer,
369
+ STATIC.necromancer,
370
+ );
371
+ const occultists = trashFromCensus(
372
+ 'occultist',
373
+ 'Scholomance Occultist',
374
+ ENTRY.occultist,
375
+ STATIC.occultist,
376
+ );
377
+ const darkSummoners = trashFromCensus(
378
+ 'dark-summoner',
379
+ 'Scholomance Dark Summoner',
380
+ ENTRY.darkSummoner,
381
+ STATIC.darkSummoner,
382
+ );
383
+
384
+ // Bone / Rattlegore / undead dens
385
+ const aberrations = trashFromCensus(
386
+ 'aberration',
387
+ 'Risen Aberration',
388
+ ENTRY.aberration,
389
+ STATIC.aberration,
390
+ );
391
+ const reanimated = trashFromCensus(
392
+ 'reanimated-corpse',
393
+ 'Reanimated Corpse',
394
+ ENTRY.reanimatedCorpse,
395
+ STATIC.reanimatedCorpse,
396
+ );
397
+ const unstable = trashFromCensus(
398
+ 'unstable-corpse',
399
+ 'Unstable Corpse',
400
+ ENTRY.unstableCorpse,
401
+ STATIC.unstableCorpse,
402
+ );
403
+ const diseasedGhouls = trashFromCensus(
404
+ 'diseased-ghoul',
405
+ 'Diseased Ghoul',
406
+ ENTRY.diseasedGhoul,
407
+ STATIC.diseasedGhoul,
408
+ );
409
+ const constructs = trashFromCensus(
410
+ 'construct',
411
+ 'Risen Construct',
412
+ ENTRY.construct,
413
+ STATIC.construct,
414
+ );
415
+ const bonewarders = trashFromCensus(
416
+ 'bonewarder',
417
+ 'Risen Bonewarder',
418
+ ENTRY.bonewarder,
419
+ STATIC.bonewarder,
420
+ );
421
+ const protectors = trashFromCensus(
422
+ 'protector',
423
+ 'Risen Protector',
424
+ ENTRY.protector,
425
+ STATIC.protector,
426
+ );
427
+ const warriors = trashFromCensus('risen-warrior', 'Risen Warrior', ENTRY.warrior, STATIC.warrior);
428
+ const splintered = trashFromCensus(
429
+ 'splintered-skeleton',
430
+ 'Splintered Skeleton',
431
+ ENTRY.splinteredSkeleton,
432
+ STATIC.splinteredSkeleton,
433
+ );
434
+ const necrofiends = trashFromCensus(
435
+ 'necrofiend',
436
+ 'Necrofiend',
437
+ ENTRY.necrofiend,
438
+ STATIC.necrofiend,
439
+ );
440
+
441
+ // Spectral / viewing / hatchling band
442
+ const researchers = trashFromCensus(
443
+ 'spectral-researcher',
444
+ 'Spectral Researcher',
445
+ ENTRY.researcher,
446
+ STATIC.researcher,
447
+ );
448
+ const teachers = trashFromCensus(
449
+ 'spectral-teacher',
450
+ 'Spectral Teacher',
451
+ ENTRY.teacher,
452
+ STATIC.teacher,
453
+ );
454
+ const tutors = trashFromCensus('spectral-tutor', 'Spectral Tutor', ENTRY.tutor, STATIC.tutor);
455
+ const hatchlings = trashFromCensus(
456
+ 'plagued-hatchling',
457
+ 'Plagued Hatchling',
458
+ ENTRY.hatchling,
459
+ STATIC.hatchling,
460
+ );
461
+ const handlers = trashFromCensus(
462
+ 'handler',
463
+ 'Scholomance Handler',
464
+ ENTRY.handler,
465
+ STATIC.handler,
466
+ );
467
+
468
+ const out: EncounterDef[] = [];
469
+
470
+ // --- Entrance porch → Kirtonos (summon via Brazier + Blood of Innocents) ---
471
+ out.push(
472
+ ...acolytes.slice(0, Math.ceil(acolytes.length / 2)),
473
+ ...neophytes.slice(0, Math.ceil(neophytes.length / 3)),
474
+ ...risenGuards.slice(0, Math.ceil(risenGuards.length / 2)),
475
+ ...bloodStewards,
476
+ );
477
+
478
+ // Brazier + Blood → porch gate locks 600s → +5s Kirtonos. Cite: dbscripts_on_go_use @OGUID+9.
479
+ out.push({
480
+ ...boss(
481
+ SCHOLO_KIRTONOS.encId,
482
+ 'Kirtonos the Herald',
483
+ ENTRY.kirtonos,
484
+ BOSS_SPELLS.kirtonos,
485
+ [
486
+ {
487
+ kind: 'objectGate',
488
+ goEntry: SCHOLO_KIRTONOS.goEntry,
489
+ requiredItem: SCHOLO_KIRTONOS.requiredItem,
490
+ setsFlag: SCHOLOMANCE_FLAGS.kirtonosBrazier,
491
+ once: true,
492
+ },
493
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.kirtonosBrazier },
494
+ {
495
+ kind: 'waves',
496
+ waves: [{ pack: [{ creatureEntry: ENTRY.kirtonos, count: 1 }] }],
497
+ },
498
+ ],
499
+ 'The Brazier of the Herald accepts the Blood of Innocents - the porch Gate seals for 10 minutes and Kirtonos descends after 5 seconds.',
500
+ ),
501
+ origin: {
502
+ x: SCHOLO_KIRTONOS.spawn.x,
503
+ y: SCHOLO_KIRTONOS.spawn.y,
504
+ z: SCHOLO_KIRTONOS.spawn.z,
505
+ },
506
+ });
507
+
508
+ // --- → Jandice Barov ---
509
+ out.push(
510
+ ...necrolytes.slice(0, Math.ceil(necrolytes.length / 2)),
511
+ ...adepts.slice(0, Math.ceil(adepts.length / 3)),
512
+ ...occultists.slice(0, Math.ceil(occultists.length / 2)),
513
+ ...neophytes.slice(Math.ceil(neophytes.length / 3), Math.ceil((2 * neophytes.length) / 3)),
514
+ );
515
+
516
+ out.push(
517
+ boss(
518
+ SCHOLO_JANDICE.encId,
519
+ 'Jandice Barov',
520
+ ENTRY.jandice,
521
+ BOSS_SPELLS.jandice,
522
+ [
523
+ // Cite: boss_jandice_barov.cpp:85-95 Summon Illusions 17773 (ScriptDev mid-fight).
524
+ // Journal: 289_scholomance.sql dbscripts_on_creature_death 10503 → spell 26096 → GO 180794.
525
+ { kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.jandiceDone },
526
+ ],
527
+ 'Jandice Barov scatters into illusions mid-fight (Summon Illusions 17773). Her journal falls on death.',
528
+ ),
529
+ );
530
+
531
+ // --- → Rattlegore (bone dens) ---
532
+ out.push(
533
+ ...aberrations.slice(0, Math.ceil(aberrations.length / 3)),
534
+ ...reanimated.slice(0, Math.ceil(reanimated.length / 3)),
535
+ ...diseasedGhouls.slice(0, Math.ceil(diseasedGhouls.length / 3)),
536
+ ...constructs.slice(0, Math.ceil(constructs.length / 2)),
537
+ ...splintered.slice(0, Math.ceil(splintered.length / 2)),
538
+ ...bonewarders,
539
+ );
540
+
541
+ out.push(
542
+ boss(
543
+ 'rattlegore',
544
+ 'Rattlegore',
545
+ ENTRY.rattlegore,
546
+ BOSS_SPELLS.rattlegore,
547
+ // No setsFlag: the key is a real drop (13873, 100% on lootId 11622) and the door it opens is
548
+ // the objectGate on marduk-blackpool. A flag would open the Viewing Room without the key.
549
+ [],
550
+ 'Rattlegore, bone construct of the school, drops the Viewing Room Key.',
551
+ ),
552
+ );
553
+
554
+ // --- Viewing Room → Dawn's Gambit students → Marduk + Vectus ---
555
+ out.push(
556
+ ...unstable.slice(0, Math.ceil(unstable.length / 2)),
557
+ ...researchers.slice(0, Math.ceil(researchers.length / 2)),
558
+ ...tutors.slice(0, Math.ceil(tutors.length / 2)),
559
+ ...necrofiends,
560
+ ...protectors,
561
+ );
562
+
563
+ // Dawn's Gambit: item 12368 at Spell Focus 176111 → 32× student combat pack.
564
+ // Cite: instance_scholomance.cpp:440-469; survey 18-scholomance.md Dawn's Gambit row.
565
+ {
566
+ const n = SCHOLO_DAWN_GAMBIT.studentCount;
567
+ const dawn: EncounterDef = {
568
+ id: SCHOLO_DAWN_GAMBIT.encId,
569
+ name: "Dawn's Gambit",
570
+ kind: 'trash',
571
+ creatureEntry: ENTRY.student,
572
+ origin: { x: 133.69, y: 91.67, z: 101.73 }, // Cite: 289_scholomance.sql @OGUID+70 GO 176111
573
+ intro:
574
+ "Dawn's Gambit at the Viewing Room Spell Focus transforms the students - 32 Scholomance Students turn hostile.",
575
+ // Summon (quest 4771 item gate); isComplete ignores optional.
576
+ optional: true,
577
+ events: [
578
+ {
579
+ kind: 'objectGate',
580
+ goEntry: SCHOLO_DAWN_GAMBIT.goEntry,
581
+ requiredItem: SCHOLO_DAWN_GAMBIT.requiredItem,
582
+ setsFlag: SCHOLOMANCE_FLAGS.dawnGambit,
583
+ once: true,
584
+ },
585
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.viewingRoomKey },
586
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.dawnGambit },
587
+ ],
588
+ };
589
+ if (n > 1) dawn.pack = [{ creatureEntry: ENTRY.student, count: n - 1 }];
590
+ out.push(dawn);
591
+ }
592
+
593
+ out.push(
594
+ boss(
595
+ 'marduk-blackpool',
596
+ 'Marduk Blackpool',
597
+ ENTRY.marduk,
598
+ BOSS_SPELLS.marduk,
599
+ [
600
+ // The Viewing Room Door is a real lock: GO 175167, lock 1199, LOCK_KEY_ITEM 13873 off
601
+ // Rattlegore. Hosting the gate here puts the key in a bag and spends it on the door.
602
+ {
603
+ kind: 'objectGate',
604
+ goEntry: SCHOLO_VIEWING_ROOM.goEntry,
605
+ requiredItem: SCHOLO_VIEWING_ROOM.requiredItem,
606
+ setsFlag: SCHOLOMANCE_FLAGS.viewingRoomKey,
607
+ once: true,
608
+ },
609
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.viewingRoomKey },
610
+ ],
611
+ 'Marduk Blackpool waits in the Viewing Room beside Vectus.',
612
+ ),
613
+ );
614
+
615
+ out.push(
616
+ boss(
617
+ 'vectus',
618
+ 'Vectus',
619
+ ENTRY.vectus,
620
+ BOSS_SPELLS.vectus,
621
+ [{ kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.viewingRoomKey }],
622
+ // Cite: instance_scholomance.cpp:462-468 Vectus/Marduk flip + YELL_VECTUS_GAMBIT on gambit.
623
+ 'Vectus, plague dragon instructor - Dawn\'s Gambit (quest 4771) arms the student ambush first.',
624
+ ),
625
+ );
626
+
627
+ // --- → Ras Frostwhisper ---
628
+ out.push(
629
+ ...hatchlings.slice(0, Math.ceil(hatchlings.length / 2)),
630
+ ...handlers.slice(0, Math.ceil(handlers.length / 2)),
631
+ ...teachers,
632
+ ...constructs.slice(Math.ceil(constructs.length / 2)),
633
+ ...warriors,
634
+ );
635
+
636
+ out.push(
637
+ boss(
638
+ SCHOLO_RAS_KEEPSAKE.encId,
639
+ 'Ras Frostwhisper',
640
+ ENTRY.ras,
641
+ BOSS_SPELLS.ras,
642
+ undefined,
643
+ // Cite: survey 18-scholomance.md; ACID 1050803; SCHOLO_RAS_KEEPSAKE residual mortality flip.
644
+ 'Ras Frostwhisper, the lich of Scholomance. Soulbound Keepsake (13752) forces his mortal form for the head quest.',
645
+ ),
646
+ );
647
+
648
+ // --- Six mini-boss rooms (classic any-order; stable author order) --- Survey: Malicia, Theolen
649
+ // Krastinov, Polkelt, Ravenian, Lord Alexei, Lady Illucia. Each setsFlag; Gandling requires all six.
650
+
651
+ out.push(
652
+ ...adepts.slice(Math.ceil(adepts.length / 3), Math.ceil((2 * adepts.length) / 3)),
653
+ ...necromancers.slice(0, Math.ceil(necromancers.length / 3)),
654
+ ...acolytes.slice(Math.ceil(acolytes.length / 2)),
655
+ );
656
+
657
+ out.push(
658
+ boss(
659
+ 'instructor-malicia',
660
+ 'Instructor Malicia',
661
+ ENTRY.malicia,
662
+ BOSS_SPELLS.malicia,
663
+ [{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.maliciaDone }],
664
+ 'Instructor Malicia teaches dark arts in her classroom.',
665
+ ),
666
+ );
667
+
668
+ out.push(
669
+ ...diseasedGhouls.slice(
670
+ Math.ceil(diseasedGhouls.length / 3),
671
+ Math.ceil((2 * diseasedGhouls.length) / 3),
672
+ ),
673
+ ...aberrations.slice(
674
+ Math.ceil(aberrations.length / 3),
675
+ Math.ceil((2 * aberrations.length) / 3),
676
+ ),
677
+ ...risenGuards.slice(Math.ceil(risenGuards.length / 2)),
678
+ );
679
+
680
+ out.push(
681
+ boss(
682
+ 'doctor-theolen-krastinov',
683
+ 'Doctor Theolen Krastinov',
684
+ ENTRY.krastinov,
685
+ BOSS_SPELLS.krastinov,
686
+ [{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.krastinovDone }],
687
+ 'Doctor Theolen Krastinov, the Butcher, haunts the surgery.',
688
+ ),
689
+ );
690
+
691
+ out.push(
692
+ ...neophytes.slice(Math.ceil((2 * neophytes.length) / 3)),
693
+ ...darkSummoners.slice(0, Math.ceil(darkSummoners.length / 2)),
694
+ ...occultists.slice(Math.ceil(occultists.length / 2)),
695
+ );
696
+
697
+ out.push(
698
+ boss(
699
+ 'lorekeeper-polkelt',
700
+ 'Lorekeeper Polkelt',
701
+ ENTRY.polkelt,
702
+ BOSS_SPELLS.polkelt,
703
+ [{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.polkeltDone }],
704
+ 'Lorekeeper Polkelt guards forbidden tomes in the library wing.',
705
+ ),
706
+ );
707
+
708
+ out.push(
709
+ ...reanimated.slice(
710
+ Math.ceil(reanimated.length / 3),
711
+ Math.ceil((2 * reanimated.length) / 3),
712
+ ),
713
+ ...unstable.slice(Math.ceil(unstable.length / 2)),
714
+ ...splintered.slice(Math.ceil(splintered.length / 2)),
715
+ );
716
+
717
+ out.push(
718
+ boss(
719
+ 'the-ravenian',
720
+ 'The Ravenian',
721
+ ENTRY.ravenian,
722
+ BOSS_SPELLS.ravenian,
723
+ [{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.ravenianDone }],
724
+ // Wave V: EventAI overlay boss-eventai.ts (1050701 AGGRO SET_PHASE→1, phase-masked casts).
725
+ 'The Ravenian, a massive undead brute, holds one of the six classrooms.',
726
+ ),
727
+ );
728
+
729
+ out.push(
730
+ ...necromancers.slice(
731
+ Math.ceil(necromancers.length / 3),
732
+ Math.ceil((2 * necromancers.length) / 3),
733
+ ),
734
+ ...handlers.slice(Math.ceil(handlers.length / 2)),
735
+ ...necrolytes.slice(Math.ceil(necrolytes.length / 2)),
736
+ );
737
+
738
+ out.push(
739
+ boss(
740
+ 'lord-alexei-barov',
741
+ 'Lord Alexei Barov',
742
+ ENTRY.lordAlexei,
743
+ BOSS_SPELLS.lordAlexei,
744
+ [{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.lordAlexeiDone }],
745
+ 'Lord Alexei Barov, spectral patriarch, bars the family vault.',
746
+ ),
747
+ );
748
+
749
+ out.push(
750
+ ...researchers.slice(Math.ceil(researchers.length / 2)),
751
+ ...tutors.slice(Math.ceil(tutors.length / 2)),
752
+ ...hatchlings.slice(Math.ceil(hatchlings.length / 2)),
753
+ ...darkSummoners.slice(Math.ceil(darkSummoners.length / 2)),
754
+ );
755
+
756
+ out.push(
757
+ boss(
758
+ 'lady-illucia-barov',
759
+ 'Lady Illucia Barov',
760
+ ENTRY.ladyIllucia,
761
+ BOSS_SPELLS.ladyIllucia,
762
+ [{ kind: 'setsFlag', flag: SCHOLOMANCE_FLAGS.ladyIlluciaDone }],
763
+ 'Lady Illucia Barov completes the six classroom guardians.',
764
+ ),
765
+ );
766
+
767
+ // Residual trash before Gandling
768
+ out.push(
769
+ ...adepts.slice(Math.ceil((2 * adepts.length) / 3)),
770
+ ...necromancers.slice(Math.ceil((2 * necromancers.length) / 3)),
771
+ ...aberrations.slice(Math.ceil((2 * aberrations.length) / 3)),
772
+ ...reanimated.slice(Math.ceil((2 * reanimated.length) / 3)),
773
+ ...diseasedGhouls.slice(Math.ceil((2 * diseasedGhouls.length) / 3)),
774
+ );
775
+
776
+ // --- Darkmaster Gandling (summon-only after all 6 mini-bosses) ---
777
+ // Timed portal rooms (first @18s, then 20s min) then the finale. Residual: teleport + gates.
778
+ out.push({
779
+ id: SCHOLO_GANDLING.encId,
780
+ name: 'Darkmaster Gandling',
781
+ kind: 'boss',
782
+ creatureEntry: ENTRY.gandling,
783
+ bossSpells: [...BOSS_SPELLS.gandling],
784
+ intro:
785
+ 'With the six classroom masters slain, Shadow Portal rooms open on Gandling\'s 16s/20–35s schedule - then Darkmaster Gandling himself.',
786
+ events: [
787
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.maliciaDone },
788
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.krastinovDone },
789
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.polkeltDone },
790
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.ravenianDone },
791
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.lordAlexeiDone },
792
+ { kind: 'requiresFlag', flag: SCHOLOMANCE_FLAGS.ladyIlluciaDone },
793
+ {
794
+ kind: 'waves',
795
+ waves: SCHOLO_GANDLING_WAVES.map((w) => ({
796
+ pack: w.pack.map((p) => ({ creatureEntry: p.creatureEntry, count: p.count })),
797
+ })),
798
+ },
799
+ ],
800
+ });
801
+
802
+ return out;
803
+ }
804
+
805
+ // The entrance room as the SOURCE defines it, box copied literally from scholomance.h:127
806
+ // `aEntranceRoom = { 174.13, 63.84, 104.0, 54, 44 }` — no lower x/y bound there, none here.
807
+ const SCHOLO_ENTRANCE_ROOM = {
808
+ cornerX: 174.13,
809
+ cornerY: 63.84,
810
+ centerZ: 104.0,
811
+ length: 54,
812
+ width: 44,
813
+ entries: [ENTRY.reanimatedCorpse, ENTRY.diseasedGhoul, ENTRY.aberration] as readonly number[],
814
+ // The room's patrolling necrofiend: cpp:117 keeps it out of m_sEntranceRoomGuids and cpp:151-154
815
+ // respawns one regardless, so it is in the room but not the stored set. Taken by guid.
816
+ necrofiend: 2890390,
817
+ } as const;
818
+
819
+ /** probe-pack-zspread.mjs:22 grades a pull as straddling above this many yards of z. */
820
+ const PACK_STRADDLE_YD = 10;
821
+
822
+ // Split entrance-room members off the pulls that straddle a floor to reach them: the clusterer is
823
+ // planar and 31 of 49 packs straddle, worst 43.1 yd. Only real straddlers move; no body is lost.
824
+ function stampEntranceRoomExtract(encs: EncounterDef[]): EncounterDef[] {
825
+ const members = clusterMemberByGuid(289);
826
+ const pools = loadPoolGuidCandidates(289);
827
+ const R = SCHOLO_ENTRANCE_ROOM;
828
+ const roomEntries = new Set(R.entries);
829
+ // A CSE slot carries entry 0 until it rolls. It belongs to the room only when EVERY entry it
830
+ // can roll does — guids 2890215/216/221/222 roll 10481 or 10495, both room entries.
831
+ const isRoomEntry = (guid: number, entry: number): boolean => {
832
+ if (guid === R.necrofiend) return true;
833
+ if (entry !== 0) return roomEntries.has(entry);
834
+ const cands = pools.get(guid) ?? [];
835
+ return cands.length > 0 && cands.every((e) => roomEntries.has(e));
836
+ };
837
+ const inRoom = (guid: number): boolean => {
838
+ const m = members.get(guid);
839
+ return !!m
840
+ && isRoomEntry(guid, m.entry)
841
+ && (m.z ?? -Infinity) > R.centerZ
842
+ && m.x - R.cornerX < R.length
843
+ && m.y - R.cornerY < R.width;
844
+ };
845
+ const zSpread = (guids: readonly number[]): number => {
846
+ const zs = guids
847
+ .map((g) => members.get(g)?.z)
848
+ .filter((z): z is number => z != null && Number.isFinite(z));
849
+ return zs.length ? Math.max(...zs) - Math.min(...zs) : 0;
850
+ };
851
+
852
+ const out: EncounterDef[] = [];
853
+ let n = 0;
854
+ for (const e of encs) {
855
+ const guids = e.spawnGuids ?? [];
856
+ if (e.kind !== 'trash' || guids.length < 2 || zSpread(guids) <= PACK_STRADDLE_YD) {
857
+ out.push(e);
858
+ continue;
859
+ }
860
+ const room = guids.filter(inRoom);
861
+ const rest = guids.filter((g) => !inRoom(g));
862
+ if (!room.length || !rest.length) {
863
+ out.push(e);
864
+ continue;
865
+ }
866
+ out.push(repackFromGuids(e, room, members, {
867
+ id: `scholo-entrance-room-${n}`,
868
+ name: 'Entrance room',
869
+ pools,
870
+ }));
871
+ n += 1;
872
+ // The remainder keeps the clusterer's pack identity, and its events with it.
873
+ out.push(repackFromGuids(e, rest, members, {
874
+ events: e.events ? [...e.events] : undefined,
875
+ pools,
876
+ }));
877
+ }
878
+ return out;
879
+ }
880
+
881
+ // The two Risen Guards `creature_linking` binds to Lord Alexei Barov with flag 7 — they aggro when
882
+ // he does and he when they do, so they are his encounter, not trash. Cite: 289_scholomance.sql:252.
883
+ const SCHOLO_BAROV_GUARDS = {
884
+ bossId: 'lord-alexei-barov',
885
+ guids: [2890289, 2890290] as readonly number[],
886
+ } as const;
887
+
888
+ // Move Barov's linked guards out of trash and onto his encounter: the clusterer put each in a pull
889
+ // whose origin sits a floor above them. Both pulls drop to a 9.8 yd spread; no body is lost.
890
+ function stampBarovGuards(encs: EncounterDef[]): EncounterDef[] {
891
+ const members = clusterMemberByGuid(289);
892
+ const pools = loadPoolGuidCandidates(289);
893
+ const want = new Set(SCHOLO_BAROV_GUARDS.guids);
894
+ const moved: number[] = [];
895
+ const out: EncounterDef[] = [];
896
+ for (const e of encs) {
897
+ const guids = e.spawnGuids ?? [];
898
+ if (e.kind !== 'trash' || !guids.some((g) => want.has(g))) {
899
+ out.push(e);
900
+ continue;
901
+ }
902
+ moved.push(...guids.filter((g) => want.has(g)));
903
+ const keep = guids.filter((g) => !want.has(g));
904
+ if (keep.length) {
905
+ out.push(repackFromGuids(e, keep, members, {
906
+ events: e.events ? [...e.events] : undefined,
907
+ pools,
908
+ }));
909
+ }
910
+ }
911
+ if (!moved.length) return encs;
912
+ return out.map((e) => {
913
+ if (e.id !== SCHOLO_BAROV_GUARDS.bossId) return e;
914
+ const pack = (e.pack ?? []).map((p) => ({ ...p }));
915
+ for (const g of moved) {
916
+ const entry = members.get(g)?.entry;
917
+ if (!entry) continue;
918
+ const row = pack.find((p) => p.creatureEntry === entry && !p.poolCandidates);
919
+ if (row) row.count += 1;
920
+ else pack.push({ creatureEntry: entry, count: 1 });
921
+ }
922
+ return { ...e, spawnGuids: [...(e.spawnGuids ?? []), ...moved], pack };
923
+ });
924
+ }
925
+
926
+ function buildEncounters(): EncounterDef[] {
927
+ // Hand spine = bosses + event-gated packs (mono trashFromCensus is empty).
928
+ const spine = buildHandSpine();
929
+ const encs = buildClusterEncounters({
930
+ mapId: 289,
931
+ spine,
932
+ entrance: entranceForInstance('scholomance'),
933
+ extraStrip: [
934
+ ...SCHOLOMANCE_EXCLUDED_ENTRIES,
935
+ ...SCHOLOMANCE_SUMMON_ONLY_ENTRIES,
936
+ ENTRY.student, // event-only via dawn-gambit pack
937
+ ],
938
+ });
939
+ return stampBarovGuards(stampEntranceRoomExtract(encs));
940
+ }
941
+
942
+
943
+ // Survey quests completable inside map 289. No Lord Blackwood / Scourge Invasion quests in the survey list.
944
+ export const SCHOLOMANCE_QUESTS = [
945
+ 5067, // Leggings of Arcana
946
+ 8414, // Dispelling Evil
947
+ 5402, // Minion's Scourgestones
948
+ 5403, // Invader's Scourgestones
949
+ 5404, // Corruptor's Scourgestones
950
+ 5406, // Corruptor's Scourgestones
951
+ 5407, // Invader's Scourgestones
952
+ 5408, // Minion's Scourgestones
953
+ 5508, // Corruptor's Scourgestones
954
+ 5509, // Invader's Scourgestones
955
+ 5510, // Minion's Scourgestones
956
+ 5529, // Plagued Hatchlings
957
+ 5582, // Healthy Dragon Scale
958
+ 4771, // Dawn's Gambit
959
+ 5068, // Breastplate of Bloodthirst
960
+ 5167, // Legplates of the Chromatic Defier
961
+ 5341, // Barov Family Fortune (H)
962
+ 5343, // Barov Family Fortune (A)
963
+ 5382, // Doctor Theolen Krastinov, the Butcher
964
+ 5466, // The Lich, Ras Frostwhisper
965
+ 5515, // Krastinov's Bag of Horrors
966
+ 7484, // Libram of Focus
967
+ 7644, // Blessed Arcanite Barding
968
+ 7647, // Judgment and Redemption
969
+ 8829, // The Ultimate Deception
970
+ 8932, // Just Compensation (A Magister's)
971
+ 8936, // Just Compensation (A Dreadmist)
972
+ 8939, // Just Compensation (H Magister's)
973
+ 8943, // Just Compensation (H Dreadmist)
974
+ 8950, // The Instigator's Enchantment
975
+ 8956, // Anthion's Parting Words (A Shadowcraft)
976
+ 8958, // Anthion's Parting Words (A Dreadmist)
977
+ 9020, // Anthion's Parting Words (H Shadowcraft)
978
+ 9021, // Anthion's Parting Words (H Dreadmist)
979
+ 9319, // A Light in Dark Places (A)
980
+ 9386, // A Light in Dark Places (H)
981
+ ] as const;
982
+
983
+ /** Export static census constants for tests (entry → count). */
984
+ export const SCHOLOMANCE_STATIC: Readonly<Record<number, number>> = {
985
+ [ENTRY.risenGuard]: STATIC.risenGuard,
986
+ [ENTRY.acolyte]: STATIC.acolyte,
987
+ [ENTRY.necrolyte]: STATIC.necrolyte,
988
+ [ENTRY.neophyte]: STATIC.neophyte,
989
+ [ENTRY.diseasedGhoul]: STATIC.diseasedGhoul,
990
+ [ENTRY.necrofiend]: STATIC.necrofiend,
991
+ [ENTRY.bonewarder]: STATIC.bonewarder,
992
+ [ENTRY.construct]: STATIC.construct,
993
+ [ENTRY.protector]: STATIC.protector,
994
+ [ENTRY.adept]: STATIC.adept,
995
+ [ENTRY.darkSummoner]: STATIC.darkSummoner,
996
+ [ENTRY.necromancer]: STATIC.necromancer,
997
+ [ENTRY.occultist]: STATIC.occultist,
998
+ [ENTRY.researcher]: STATIC.researcher,
999
+ [ENTRY.teacher]: STATIC.teacher,
1000
+ [ENTRY.tutor]: STATIC.tutor,
1001
+ [ENTRY.warrior]: STATIC.warrior,
1002
+ [ENTRY.handler]: STATIC.handler,
1003
+ [ENTRY.splinteredSkeleton]: STATIC.splinteredSkeleton,
1004
+ [ENTRY.bloodSteward]: STATIC.bloodSteward,
1005
+ [ENTRY.hatchling]: STATIC.hatchling,
1006
+ [ENTRY.aberration]: STATIC.aberration,
1007
+ [ENTRY.reanimatedCorpse]: STATIC.reanimatedCorpse,
1008
+ [ENTRY.unstableCorpse]: STATIC.unstableCorpse,
1009
+ };
1010
+
1011
+ export const SCHOLOMANCE: InstanceDef = {
1012
+ id: 'scholomance',
1013
+ mapId: 289,
1014
+ name: 'Scholomance',
1015
+ portalZone: 'westernplaguelands',
1016
+ minLevel: 45, // entrance trigger 2567 requiredLevel
1017
+ levelRange: [57, 61], // survey trash band
1018
+ lockoutMs: 0,
1019
+ description: '',
1020
+ quests: [...SCHOLOMANCE_QUESTS],
1021
+ encounters: buildEncounters(),
1022
+ lootObjects: [
1023
+ // Journal of Jandice Barov — death-spawn via 26096. Residual: no map-289 dungeon GO row.
1024
+ // Cite: 289_scholomance.sql dbscripts_on_creature_death 10503; gameobject-data 180794.
1025
+ { goEntry: SCHOLO_JANDICE.journalGo, revealedByFlag: SCHOLOMANCE_FLAGS.jandiceDone },
1026
+ ],
1027
+ };
1028
+
1029
+ // Counts only pure static trash packs (no bosses, no flag-gated viewing-room packs). Used to assert census
1030
+ // match and summon-only / excluded entry absence.
1031
+ export function scholomancePureStaticTrashCounts(): Map<number, number> {
1032
+ const map = new Map<number, number>();
1033
+ const add = (entry: number, n: number) => map.set(entry, (map.get(entry) ?? 0) + n);
1034
+ for (const enc of SCHOLOMANCE.encounters) {
1035
+ if (enc.kind !== 'trash') continue;
1036
+ const req = (enc.events ?? []).some(
1037
+ (e) => e.kind === 'requiresFlag' || e.kind === 'objectGate' || e.kind === 'waves',
1038
+ );
1039
+ if (req) continue;
1040
+ add(enc.creatureEntry, 1);
1041
+ for (const p of enc.pack ?? []) add(p.creatureEntry, p.count);
1042
+ }
1043
+ return map;
1044
+ }
1045
+
1046
+ /** Sum of authored kill counts per creature entry (trash + bosses + wave/threshold packs). */
1047
+ export function scholomanceKillSupply(): Map<number, number> {
1048
+ const map = new Map<number, number>();
1049
+ const add = (entry: number, n: number) => map.set(entry, (map.get(entry) ?? 0) + n);
1050
+ for (const enc of SCHOLOMANCE.encounters) {
1051
+ add(enc.creatureEntry, 1);
1052
+ for (const p of enc.pack ?? []) add(p.creatureEntry, p.count);
1053
+ for (const ev of enc.events ?? []) {
1054
+ if (ev.kind === 'onDeathSummon') add(ev.creatureEntry, 1);
1055
+ if (ev.kind === 'waves') {
1056
+ for (const w of ev.waves) {
1057
+ for (const row of w.pack) add(row.creatureEntry, row.count);
1058
+ }
1059
+ }
1060
+ if (ev.kind === 'hpThreshold' && ev.spawn) {
1061
+ for (const row of ev.spawn) add(row.creatureEntry, row.count);
1062
+ }
1063
+ }
1064
+ }
1065
+ // Subtract wave rows that re-count the primary (Gandling final wave).
1066
+ for (const enc of SCHOLOMANCE.encounters) {
1067
+ const waves = (enc.events ?? []).find((e) => e.kind === 'waves');
1068
+ if (!waves || waves.kind !== 'waves') continue;
1069
+ for (const w of waves.waves) {
1070
+ for (const row of w.pack) {
1071
+ if (row.creatureEntry === enc.creatureEntry) add(row.creatureEntry, -row.count);
1072
+ }
1073
+ }
1074
+ }
1075
+ return map;
1076
+ }