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,942 @@
1
+ // Aura-granted immunities: pure predicates plus apply and purge helpers, composing template masks with
2
+ // aura masks. Creature-template masks themselves stay in domain/creature/creatureAi.ts.
3
+
4
+ import type { Mechanic, School } from '../../data/schema.ts';
5
+ import { CREATURE_TYPE } from '../../data/schema.ts';
6
+ import {
7
+ isMechanicImmune as isTemplateMechanicImmune,
8
+ isSchoolImmune as isTemplateSchoolImmune,
9
+ MECHANIC_ID,
10
+ SCHOOL_INDEX,
11
+ } from '../../domain/creature/creatureAi.ts';
12
+ import { SCHOOL_MASK } from './procs.ts';
13
+
14
+ // AuraType ids (SpellAuraDefines.h) — immunity family
15
+
16
+ export const AURA_TYPE = {
17
+ EFFECT_IMMUNITY: 37,
18
+ STATE_IMMUNITY: 38,
19
+ SCHOOL_IMMUNITY: 39,
20
+ DAMAGE_IMMUNITY: 40,
21
+ DISPEL_IMMUNITY: 41,
22
+ MECHANIC_IMMUNITY: 77,
23
+ MOD_UNATTACKABLE: 93,
24
+ MECHANIC_IMMUNITY_MASK: 147,
25
+ } as const;
26
+
27
+ // SharedDefines Mechanics — ids used beyond Phonecraft's MECHANIC_ID map
28
+
29
+ /** SharedDefines.h Mechanics (1-based). */
30
+ /** SharedDefines.h Mechanics — full 1..30 set used by bake + immunity. Cite: :351–384. */
31
+ export const MECHANIC = {
32
+ CHARM: 1,
33
+ DISORIENTED: 2,
34
+ DISARM: 3,
35
+ DISTRACT: 4,
36
+ FEAR: 5,
37
+ FUMBLE: 6,
38
+ ROOT: 7,
39
+ PACIFY: 8,
40
+ SILENCE: 9,
41
+ SLEEP: 10,
42
+ SNARE: 11,
43
+ STUN: 12,
44
+ FREEZE: 13,
45
+ KNOCKOUT: 14,
46
+ /** Stoneform (20594 → boost 20612 aura 77 misc 15) purges bleeds. Cite: SharedDefines.h MECHANIC_BLEED = 15. */
47
+ BLEED: 15,
48
+ BANDAGE: 16,
49
+ POLYMORPH: 17,
50
+ BANISH: 18,
51
+ SHIELD: 19,
52
+ SHACKLE: 20,
53
+ MOUNT: 21,
54
+ PERSUADE: 22,
55
+ TURN: 23,
56
+ HORROR: 24,
57
+ INVULNERABILITY: 25,
58
+ INTERRUPT: 26,
59
+ DAZE: 27,
60
+ DISCOVERY: 28,
61
+ IMMUNE_SHIELD: 29, // Divine Shield / Ice Block class — SpellMgr.h CanPierceImmuneAura
62
+ SAPPED: 30,
63
+ } as const;
64
+
65
+ /** Classic Bestial Wrath spell id. Cite: SpellAuras.cpp ~5599 case 19574. */
66
+ export const BESTIAL_WRATH_SPELL_ID = 19574;
67
+
68
+ /** SpellSchoolMask ALL = NORMAL | MAGIC = 0x7F. Cite: SharedDefines.h SPELL_SCHOOL_MASK_ALL ~196. */
69
+ export const SPELL_SCHOOL_MASK_ALL =
70
+ SCHOOL_MASK.NORMAL |
71
+ SCHOOL_MASK.HOLY |
72
+ SCHOOL_MASK.FIRE |
73
+ SCHOOL_MASK.NATURE |
74
+ SCHOOL_MASK.FROST |
75
+ SCHOOL_MASK.SHADOW |
76
+ SCHOOL_MASK.ARCANE;
77
+
78
+ // Classic Banish's target creature types, demon and elemental, as the bitfield CheckTargetCreatureType
79
+ // reads. Cite: SharedDefines CREATURE_TYPE_DEMON = 3, ELEMENTAL = 4.
80
+ export const BANISH_TARGET_CREATURE_TYPE_MASK =
81
+ (1 << (CREATURE_TYPE.DEMON - 1)) | (1 << (CREATURE_TYPE.ELEMENTAL - 1));
82
+
83
+ // Free Action–class root+stun mask (SharedDefines IMMUNE_TO_ROOT_AND_STUN_MASK). Free Action Potion also
84
+ // covers snare via separate mechanic immunities.
85
+ export const IMMUNE_TO_ROOT_AND_STUN_MASK =
86
+ (1 << (MECHANIC.ROOT - 1)) | (1 << (MECHANIC.STUN - 1));
87
+
88
+ export const IMMUNE_TO_ROOT_AND_SNARE_MASK =
89
+ (1 << (MECHANIC.ROOT - 1)) | (1 << (MECHANIC.SNARE - 1));
90
+
91
+ // Active aura model
92
+
93
+ // One live immunity-granting aura, its fields mapping to the C++ modifier and spell attributes.
94
+ // Duration is the caller's job — the fields exist so a pure test can assert one without timers.
95
+ export interface ImmunityAura {
96
+ spellId: number;
97
+ /** AuraType: 37–41, 77, 93, 147. */
98
+ auraType: number;
99
+ // School mask for SCHOOL_IMMUNITY (39) / DAMAGE_IMMUNITY (40). Divine Shield / Ice Block / Banish
100
+ // typically use SPELL_SCHOOL_MASK_ALL.
101
+ schoolMask?: number;
102
+ /** Single mechanic id (1-based) for MECHANIC_IMMUNITY (77). Cite: HandleModMechanicImmunity miscvalue. */
103
+ mechanic?: number;
104
+ // Mechanic bit mask for MECHANIC_IMMUNITY_MASK (147), or derived from single-mechanic as (1 << (mechanic
105
+ // - 1)).
106
+ mechanicMask?: number;
107
+ /** DispelType for DISPEL_IMMUNITY (41). */
108
+ dispelType?: number;
109
+ /** SpellEffects id for EFFECT_IMMUNITY (37). */
110
+ effectId?: number;
111
+ /** AuraType id for STATE_IMMUNITY (38). */
112
+ stateAuraType?: number;
113
+ // The immunity SPELL's own mechanic, not the purged auras': banish isolates the unit, while the
114
+ // shield and invulnerability mechanics mark the Divine Shield pierce rules.
115
+ spellMechanic?: number;
116
+ // Positive immunity (Divine Shield) vs debuff immunity (Banish). School purge only runs for positive
117
+ // immunities (HandleAuraModSchoolImmunity + IsPositiveSpell).
118
+ positive?: boolean;
119
+ // SPELL_ATTR_EX_IMMUNITY_PURGES_EFFECT (0x8000). When true, applying this aura removes matching existing
120
+ // auras.
121
+ immunityPurgesEffect?: boolean;
122
+ /** Duration snapshot (ms) — expiry is the caller's job. */
123
+ durationMs?: number;
124
+ /** Absolute expiry timestamp (ms). */
125
+ expiresAt?: number;
126
+ /** SpellEntry.procCharges when this immunity is a charged ward (Fear Ward). */
127
+ charges?: number;
128
+ }
129
+
130
+ /** Removable live aura used only for the apply-time purge pass. */
131
+ export interface RemovableAura {
132
+ spellId: number;
133
+ /** GetSpellSchoolMask — bitfield. */
134
+ schoolMask: number;
135
+ // Spell + effect mechanic bits: HasMechanicMask uses (1 << (mech - 1)). Cite: Unit.cpp
136
+ // RemoveAurasAtMechanicImmunity.
137
+ mechanicMask?: number;
138
+ /** SpellEntry.Dispel. */
139
+ dispelType?: number;
140
+ /** IsPositive on the holder. */
141
+ positive?: boolean;
142
+ /** SPELL_ATTR_NO_IMMUNITIES — skip purge. */
143
+ noImmunities?: boolean;
144
+ /** SPELL_ATTR_EX2_NO_SCHOOL_IMMUNITIES — skip purge by school immunity. */
145
+ noSchoolImmunities?: boolean;
146
+ /** EffectApplyAuraName values present (state-immunity purge). */
147
+ auraTypes?: number[];
148
+ }
149
+
150
+ // Aggregated immunity state on a unit. Template masks are passed separately to compose helpers so
151
+ // creature_template path stays owned by creatureAi.ts.
152
+ export interface ImmunityState {
153
+ auras: ImmunityAura[];
154
+ /** OR of school-immunity (39) masks. */
155
+ schoolImmuneMask: number;
156
+ /** OR of damage-immunity (40) masks. */
157
+ damageImmuneMask: number;
158
+ /** OR of mechanic bits (1 << (id - 1)) from auras 77/147. */
159
+ mechanicImmuneMask: number;
160
+ /** OR of (1 << dispelType) from aura 41. */
161
+ dispelImmuneMask: number;
162
+ /** Effect ids from aura 37 (set membership via bit if id < 32, else list). */
163
+ effectImmuneIds: number[];
164
+ /** AuraType ids from aura 38. */
165
+ stateImmuneIds: number[];
166
+ // UNIT_STAT_ISOLATED — set when a live school-immunity aura has spellMechanic === MECHANIC.BANISH
167
+ // (HandleAuraModSchoolImmunity ~3025–3030).
168
+ isolated: boolean;
169
+ /** UNIT_FLAG_UNTARGETABLE — MOD_UNATTACKABLE (93) live count > 0 (HandleModUnattackable ~4454). */
170
+ untargetable: boolean;
171
+ }
172
+
173
+ export function emptyImmunityState(): ImmunityState {
174
+ return {
175
+ auras: [],
176
+ schoolImmuneMask: 0,
177
+ damageImmuneMask: 0,
178
+ mechanicImmuneMask: 0,
179
+ dispelImmuneMask: 0,
180
+ effectImmuneIds: [],
181
+ stateImmuneIds: [],
182
+ isolated: false,
183
+ untargetable: false,
184
+ };
185
+ }
186
+
187
+ // Mask helpers
188
+
189
+ /** (1 << (mechanicId - 1)) for 1-based Mechanics ids. */
190
+ export function mechanicBit(mechanicId: number): number {
191
+ if (mechanicId <= 0) return 0;
192
+ return 1 << (mechanicId - 1);
193
+ }
194
+
195
+ // The Bestial Wrath CC-immunity mechanic mask, sourced as the union of the parent's stun immunity and
196
+ // its four scripted boosts. Mechanic bits only — not a school mask. Cite: SpellAuras.cpp:5598-5605.
197
+ export const BESTIAL_WRATH_CC_MECHANIC_MASK =
198
+ mechanicBit(MECHANIC.CHARM) |
199
+ mechanicBit(MECHANIC.DISORIENTED) |
200
+ mechanicBit(MECHANIC.FEAR) |
201
+ mechanicBit(MECHANIC.ROOT) |
202
+ mechanicBit(MECHANIC.SLEEP) |
203
+ mechanicBit(MECHANIC.SNARE) |
204
+ mechanicBit(MECHANIC.STUN) |
205
+ mechanicBit(MECHANIC.FREEZE) |
206
+ mechanicBit(MECHANIC.KNOCKOUT) |
207
+ mechanicBit(MECHANIC.POLYMORPH) |
208
+ mechanicBit(MECHANIC.HORROR);
209
+
210
+ // Build a MECHANIC_IMMUNITY_MASK (147) aura for a CC-immunity buff rider. Default mask is Bestial Wrath's
211
+ // sourced set; callers may pass a narrower mask (e.g. Free Action root+stun) for fixtures.
212
+ export function makeCcImmunityAura(
213
+ spellId: number,
214
+ opts: {
215
+ mechanicMask?: number;
216
+ durationMs?: number;
217
+ expiresAt?: number;
218
+ positive?: boolean;
219
+ immunityPurgesEffect?: boolean;
220
+ } = {},
221
+ ): ImmunityAura {
222
+ return {
223
+ spellId,
224
+ auraType: AURA_TYPE.MECHANIC_IMMUNITY_MASK,
225
+ mechanicMask: opts.mechanicMask ?? BESTIAL_WRATH_CC_MECHANIC_MASK,
226
+ positive: opts.positive !== false,
227
+ immunityPurgesEffect: opts.immunityPurgesEffect !== false,
228
+ durationMs: opts.durationMs,
229
+ expiresAt: opts.expiresAt,
230
+ };
231
+ }
232
+
233
+ // CC-immunity rider mask for a spell id, when the bake omits scripted boost immunities. Bestial Wrath
234
+ // (19574) is the only current host; returns 0 for unknown ids.
235
+ export function ccImmunityRiderMaskForSpell(spellId: number): number {
236
+ if (spellId === BESTIAL_WRATH_SPELL_ID) return BESTIAL_WRATH_CC_MECHANIC_MASK;
237
+ return 0;
238
+ }
239
+
240
+ /** Dwarf Stoneform. Cite: SpellAuras.cpp:5577 `case 20594: boostSpells.push_back(20612)`. */
241
+ export const STONEFORM_SPELL_ID = 20594;
242
+ /** Stoneform's boost spell — carries the bleed + disease halves of the racial. */
243
+ export const STONEFORM_BOOST_SPELL_ID = 20612;
244
+
245
+ // Immunity auras a spell's scripted BOOST spells grant, which the bake cannot supply because the boost
246
+ // id is in no spell list. Stoneform's disease and bleed immunities are only reachable here.
247
+ export function immunityBoostAurasForSpell(spellId: number, durationMs: number): ImmunityAura[] {
248
+ if (spellId !== STONEFORM_SPELL_ID) return [];
249
+ return [
250
+ {
251
+ spellId: STONEFORM_BOOST_SPELL_ID,
252
+ auraType: AURA_TYPE.MECHANIC_IMMUNITY,
253
+ mechanic: MECHANIC.BLEED,
254
+ positive: true,
255
+ immunityPurgesEffect: true,
256
+ durationMs,
257
+ },
258
+ {
259
+ spellId: STONEFORM_BOOST_SPELL_ID,
260
+ auraType: AURA_TYPE.DISPEL_IMMUNITY,
261
+ dispelType: DISPEL_TYPE_DISEASE,
262
+ positive: true,
263
+ immunityPurgesEffect: true,
264
+ durationMs,
265
+ },
266
+ ];
267
+ }
268
+
269
+ /** SharedDefines.h DispelType DISPEL_DISEASE = 3. */
270
+ const DISPEL_TYPE_DISEASE = 3;
271
+
272
+ /** Resolve Phonecraft Mechanic name → 1-based id via MECHANIC_ID / MECHANIC. */
273
+ export function mechanicIdFromName(mechanic: Mechanic | string | undefined | null): number {
274
+ if (!mechanic || mechanic === 'none') return 0;
275
+ const fromMap = MECHANIC_ID[mechanic as Mechanic];
276
+ if (fromMap != null && fromMap > 0) return fromMap;
277
+ // Accept numeric strings / legacy aliases.
278
+ if (mechanic === 'sapped') return MECHANIC.SAPPED;
279
+ if (mechanic === 'banish') return MECHANIC.BANISH;
280
+ const asNum = Number(mechanic);
281
+ if (Number.isFinite(asNum) && asNum > 0) return asNum | 0;
282
+ return 0;
283
+ }
284
+
285
+ /** School name → SpellSchoolMask bit (SharedDefines). */
286
+ export function schoolMaskFromSchoolName(school: School | string | undefined | null): number {
287
+ if (!school) return 0;
288
+ const idx = SCHOOL_INDEX[school as School];
289
+ if (idx == null) return 0;
290
+ return 1 << idx;
291
+ }
292
+
293
+ function rebuildAggregates(auras: readonly ImmunityAura[]): Omit<ImmunityState, 'auras'> {
294
+ let schoolImmuneMask = 0;
295
+ let damageImmuneMask = 0;
296
+ let mechanicImmuneMask = 0;
297
+ let dispelImmuneMask = 0;
298
+ const effectImmuneIds: number[] = [];
299
+ const stateImmuneIds: number[] = [];
300
+ let isolated = false;
301
+ let untargetable = false;
302
+
303
+ for (const a of auras) {
304
+ switch (a.auraType) {
305
+ case AURA_TYPE.SCHOOL_IMMUNITY:
306
+ schoolImmuneMask |= a.schoolMask ?? 0;
307
+ if (a.spellMechanic === MECHANIC.BANISH) isolated = true;
308
+ break;
309
+ case AURA_TYPE.DAMAGE_IMMUNITY:
310
+ damageImmuneMask |= a.schoolMask ?? 0;
311
+ break;
312
+ case AURA_TYPE.MECHANIC_IMMUNITY: {
313
+ const bit = a.mechanicMask ?? mechanicBit(a.mechanic ?? 0);
314
+ mechanicImmuneMask |= bit;
315
+ break;
316
+ }
317
+ case AURA_TYPE.MECHANIC_IMMUNITY_MASK:
318
+ mechanicImmuneMask |= a.mechanicMask ?? 0;
319
+ break;
320
+ case AURA_TYPE.DISPEL_IMMUNITY:
321
+ if (a.dispelType != null && a.dispelType > 0) {
322
+ dispelImmuneMask |= 1 << a.dispelType;
323
+ }
324
+ break;
325
+ case AURA_TYPE.EFFECT_IMMUNITY:
326
+ if (a.effectId != null) effectImmuneIds.push(a.effectId);
327
+ break;
328
+ case AURA_TYPE.STATE_IMMUNITY:
329
+ if (a.stateAuraType != null) stateImmuneIds.push(a.stateAuraType);
330
+ break;
331
+ case AURA_TYPE.MOD_UNATTACKABLE:
332
+ untargetable = true;
333
+ break;
334
+ default:
335
+ break;
336
+ }
337
+ }
338
+
339
+ return {
340
+ schoolImmuneMask,
341
+ damageImmuneMask,
342
+ mechanicImmuneMask,
343
+ dispelImmuneMask,
344
+ effectImmuneIds,
345
+ stateImmuneIds,
346
+ isolated,
347
+ untargetable,
348
+ };
349
+ }
350
+
351
+ // Apply-time purge (SPELL_ATTR_EX_IMMUNITY_PURGES_EFFECT)
352
+
353
+ // Which existing auras a newly applied immunity removes: a school immunity purges matching negative
354
+ // auras, a mechanic one its mask, a dispel one its type, and a state one that aura type.
355
+ export function aurasRemovedByImmunityApply(
356
+ incoming: ImmunityAura,
357
+ existing: readonly RemovableAura[],
358
+ ): RemovableAura[] {
359
+ if (!incoming.immunityPurgesEffect) return [];
360
+
361
+ const out: RemovableAura[] = [];
362
+ const seen = new Set<number>(); // spellId once (RemoveAurasDueToSpell)
363
+
364
+ const take = (a: RemovableAura): void => {
365
+ if (a.spellId === incoming.spellId) return;
366
+ if (a.noImmunities) return;
367
+ if (seen.has(a.spellId)) return;
368
+ seen.add(a.spellId);
369
+ out.push(a);
370
+ };
371
+
372
+ switch (incoming.auraType) {
373
+ case AURA_TYPE.SCHOOL_IMMUNITY: {
374
+ // Only positive school immunities purge (Divine Shield class, not Banish).
375
+ if (!incoming.positive) break;
376
+ const mask = incoming.schoolMask ?? 0;
377
+ if (!mask) break;
378
+ for (const a of existing) {
379
+ if (a.positive) continue; // Don't remove positive spells
380
+ if (a.noSchoolImmunities) continue; // NO_SCHOOL_IMMUNITIES skips purge by school immunity
381
+ if ((a.schoolMask & mask) !== 0) take(a);
382
+ }
383
+ break;
384
+ }
385
+ case AURA_TYPE.MECHANIC_IMMUNITY:
386
+ case AURA_TYPE.MECHANIC_IMMUNITY_MASK: {
387
+ const mechMask =
388
+ incoming.mechanicMask ??
389
+ mechanicBit(incoming.mechanic ?? 0);
390
+ if (!mechMask) break;
391
+ for (const a of existing) {
392
+ if (((a.mechanicMask ?? 0) & mechMask) !== 0) take(a);
393
+ }
394
+ break;
395
+ }
396
+ case AURA_TYPE.DISPEL_IMMUNITY: {
397
+ const dt = incoming.dispelType;
398
+ if (dt == null || dt <= 0) break;
399
+ for (const a of existing) {
400
+ if (a.dispelType === dt) take(a);
401
+ }
402
+ break;
403
+ }
404
+ case AURA_TYPE.STATE_IMMUNITY: {
405
+ const st = incoming.stateAuraType;
406
+ if (st == null) break;
407
+ for (const a of existing) {
408
+ if (a.auraTypes?.includes(st)) take(a);
409
+ }
410
+ break;
411
+ }
412
+ default:
413
+ break;
414
+ }
415
+
416
+ return out;
417
+ }
418
+
419
+ export interface ApplyImmunityResult {
420
+ state: ImmunityState;
421
+ /** Auras purged by SPELL_ATTR_EX_IMMUNITY_PURGES_EFFECT (spellId list). */
422
+ removedSpellIds: number[];
423
+ }
424
+
425
+ // True when two entries are the same effect-holder, a refresh of one multi-effect slot: Divine
426
+ // Protection applies two school-immunity holders under one id, and replacing by id drops the first.
427
+ function isSameImmunityEffect(a: ImmunityAura, b: ImmunityAura): boolean {
428
+ if (a.spellId !== b.spellId || a.auraType !== b.auraType) return false;
429
+ switch (a.auraType) {
430
+ case AURA_TYPE.SCHOOL_IMMUNITY:
431
+ case AURA_TYPE.DAMAGE_IMMUNITY:
432
+ return (a.schoolMask ?? 0) === (b.schoolMask ?? 0);
433
+ case AURA_TYPE.MECHANIC_IMMUNITY:
434
+ return (a.mechanic ?? 0) === (b.mechanic ?? 0)
435
+ && (a.mechanicMask ?? 0) === (b.mechanicMask ?? 0);
436
+ case AURA_TYPE.MECHANIC_IMMUNITY_MASK:
437
+ return (a.mechanicMask ?? 0) === (b.mechanicMask ?? 0);
438
+ case AURA_TYPE.DISPEL_IMMUNITY:
439
+ return (a.dispelType ?? 0) === (b.dispelType ?? 0);
440
+ case AURA_TYPE.EFFECT_IMMUNITY:
441
+ return (a.effectId ?? 0) === (b.effectId ?? 0);
442
+ case AURA_TYPE.STATE_IMMUNITY:
443
+ return (a.stateAuraType ?? 0) === (b.stateAuraType ?? 0);
444
+ default:
445
+ return true;
446
+ }
447
+ }
448
+
449
+ // Apply an immunity aura, folding it into the state and returning the purged spell ids for the caller
450
+ // to delete. Multi-effect auras under one id stay separate holders and are OR'd in the aggregate.
451
+ export function applyImmunityAura(
452
+ state: ImmunityState,
453
+ aura: ImmunityAura,
454
+ existingAuras: readonly RemovableAura[] = [],
455
+ ): ApplyImmunityResult {
456
+ const removed = aurasRemovedByImmunityApply(aura, existingAuras);
457
+ const removedSpellIds = removed.map((a) => a.spellId);
458
+
459
+ // Refresh only the matching effect holder; keep sibling multi-effect auras.
460
+ const auras = state.auras.filter((a) => !isSameImmunityEffect(a, aura));
461
+ auras.push(aura);
462
+
463
+ const next: ImmunityState = {
464
+ auras,
465
+ ...rebuildAggregates(auras),
466
+ };
467
+ return { state: next, removedSpellIds };
468
+ }
469
+
470
+ /** Remove one immunity aura by spellId (aura expires / cancelled). */
471
+ export function removeImmunityAura(state: ImmunityState, spellId: number): ImmunityState {
472
+ const auras = state.auras.filter((a) => a.spellId !== spellId);
473
+ return { auras, ...rebuildAggregates(auras) };
474
+ }
475
+
476
+ // Compose: template mask OR aura mask
477
+
478
+ export interface TemplateImmuneMasks {
479
+ schoolImmuneMask?: number | null;
480
+ mechanicImmuneMask?: number | null;
481
+ /** CMaNGOS CreatureType. Totems (11) immune to negative auras. Cite: Totem.cpp:282–287. */
482
+ creatureType?: number | null;
483
+ // The creature's own immunity set, applied at spawn. The C++ pushes these into the same lists the
484
+ // auras use, so every test below ORs the two halves. Cite: Creature.cpp:613, :2412-2431.
485
+ immunities?: CreatureImmunitySet | null;
486
+ }
487
+
488
+ /** The baked half of m_spellImmune — see schema CreatureImmunities. */
489
+ export interface CreatureImmunitySet {
490
+ /** IMMUNITY_EFFECT (0) — SpellEffect ids. */
491
+ effects?: readonly number[];
492
+ /** IMMUNITY_STATE (1) — AuraType ids. */
493
+ states?: readonly number[];
494
+ /** IMMUNITY_DISPEL (4) — OR of `1 << DispelType`. */
495
+ dispelMask?: number;
496
+ }
497
+
498
+ /** SharedDefines.h CREATURE_TYPE_TOTEM = 11. Cite: domain/spells/totem.ts creatureType. */
499
+ export const CREATURE_TYPE_TOTEM = 11;
500
+
501
+ export function isTotemCreatureType(creatureType: number | undefined | null): boolean {
502
+ return ((creatureType ?? 0) | 0) === CREATURE_TYPE_TOTEM;
503
+ }
504
+
505
+ // Totem.cpp:282-287: a non-positive `IsAuraApplyEffect` index is immune; other effects still apply. Callers
506
+ // OR `isTotemSide` (this file does not import Side).
507
+ export function totemRefusesNegativeAuraApply(
508
+ creatureType: number | undefined | null,
509
+ hostileAura: boolean,
510
+ ): boolean {
511
+ return hostileAura && isTotemCreatureType(creatureType);
512
+ }
513
+
514
+ /** SPELL_EFFECT_APPLY_AURA. Cite: SpellEffectDefines.h 6. */
515
+ const SPELL_EFFECT_APPLY_AURA = 6;
516
+
517
+ // Hostile aura payload (snare / root / CC / DoT / APPLY_AURA). Totems eat these; school damage and weapon
518
+ // hits still land. Cite: Totem.cpp:282–287 IsAuraApplyEffect.
519
+ export function spellAppliesHostileAura(spell: {
520
+ effects?: ReadonlyArray<{ kind: string; hostile?: boolean; pct?: number }>;
521
+ rawEffects?: ReadonlyArray<{ effect?: number }>;
522
+ }): boolean {
523
+ for (const e of spell.effects ?? []) {
524
+ if (e.kind === 'cc' || e.kind === 'root' || e.kind === 'dot') return true;
525
+ if (e.kind === 'speed' && (e.hostile === true || (e.hostile !== false && (e.pct ?? 0) < 0))) {
526
+ return true;
527
+ }
528
+ }
529
+ for (const r of spell.rawEffects ?? []) {
530
+ if (((r.effect ?? 0) | 0) === SPELL_EFFECT_APPLY_AURA) return true;
531
+ }
532
+ return false;
533
+ }
534
+
535
+ /** SPELL_EFFECT_SCHOOL_DAMAGE / WEAPON_PERCENT / WEAPON_DAMAGE / NORMALIZED. */
536
+ function spellHasDirectHit(spell: {
537
+ effects?: ReadonlyArray<{ kind: string }>;
538
+ rawEffects?: ReadonlyArray<{ effect?: number }>;
539
+ }): boolean {
540
+ for (const e of spell.effects ?? []) {
541
+ if (e.kind === 'direct_damage' || e.kind === 'weapon_percent_damage') return true;
542
+ }
543
+ for (const r of spell.rawEffects ?? []) {
544
+ const ef = (r.effect ?? 0) | 0;
545
+ if (ef === 2 || ef === 17 || ef === 58 || ef === 121) return true;
546
+ }
547
+ return false;
548
+ }
549
+
550
+ // An aura-only hostile (Concussive Shot, Fear, Serpent Sting) with no weapon or school hit. Kept
551
+ // module-internal on purpose: the public answer is `isAbilityIneffectiveOnTarget`.
552
+ function spellIsHostileAuraOnly(spell: {
553
+ effects?: ReadonlyArray<{ kind: string; hostile?: boolean; pct?: number }>;
554
+ rawEffects?: ReadonlyArray<{ effect?: number }>;
555
+ strikeBonus?: unknown;
556
+ onNextSwing?: boolean;
557
+ role?: string | null;
558
+ }): boolean {
559
+ if (spell.strikeBonus || spell.onNextSwing) return false;
560
+ if (spellHasDirectHit(spell)) return false;
561
+ return spellAppliesHostileAura(spell);
562
+ }
563
+
564
+ // School immunity: creature_template schoolImmuneMask OR aura SCHOOL_IMMUNITY. Re-uses isSchoolImmune for
565
+ // the template half (creature-mask path untouched).
566
+ export function isImmuneToSchool(
567
+ state: ImmunityState,
568
+ school: School | string,
569
+ template?: TemplateImmuneMasks | null,
570
+ ): boolean {
571
+ if (isTemplateSchoolImmune(template?.schoolImmuneMask, school as School)) return true;
572
+ const bit = schoolMaskFromSchoolName(school);
573
+ if (!bit) return false;
574
+ return (state.schoolImmuneMask & bit) !== 0;
575
+ }
576
+
577
+ // Mechanic immunity: template mechanicImmuneMask OR aura 77/147. Re-uses isMechanicImmune for the template
578
+ // half.
579
+ export function isImmuneToMechanic(
580
+ state: ImmunityState,
581
+ mechanic: Mechanic | string | undefined | null,
582
+ template?: TemplateImmuneMasks | null,
583
+ ): boolean {
584
+ if (isTemplateMechanicImmune(template?.mechanicImmuneMask, mechanic as Mechanic)) {
585
+ return true;
586
+ }
587
+ const id = mechanicIdFromName(mechanic);
588
+ if (id <= 0) return false;
589
+ return (state.mechanicImmuneMask & mechanicBit(id)) !== 0;
590
+ }
591
+
592
+ // The same test by 1-based mechanic id, for effects whose baked shape carries no mechanic name and
593
+ // must read it off the DBC row. Cite: Creature.cpp:1997-2001 IsImmuneToSpellEffect.
594
+ export function isImmuneToMechanicId(
595
+ state: ImmunityState,
596
+ mechanicId: number,
597
+ template?: TemplateImmuneMasks | null,
598
+ ): boolean {
599
+ const id = mechanicId | 0;
600
+ if (id <= 0) return false;
601
+ const bit = mechanicBit(id);
602
+ if (((template?.mechanicImmuneMask ?? 0) & bit) !== 0) return true;
603
+ return (state.mechanicImmuneMask & bit) !== 0;
604
+ }
605
+
606
+ // Damage immunity: school-immunity OR damage-immunity masks (Unit::IsImmuneToDamage). Template school mask
607
+ // also blocks damage of that school (existing combat path).
608
+ export function isImmuneToDamage(
609
+ state: ImmunityState,
610
+ school: School | string,
611
+ template?: TemplateImmuneMasks | null,
612
+ noSchoolImmunities?: boolean,
613
+ ): boolean {
614
+ const bit = schoolMaskFromSchoolName(school);
615
+ if (isImmuneToDamageMask(state, bit || 0, template, noSchoolImmunities)) return true;
616
+ return false;
617
+ }
618
+
619
+ /** Bit-mask form of isImmuneToDamage (for multi-school queries). */
620
+ function isImmuneToDamageMask(
621
+ state: ImmunityState,
622
+ schoolMask: number,
623
+ template?: TemplateImmuneMasks | null,
624
+ noSchoolImmunities?: boolean,
625
+ ): boolean {
626
+ if (!schoolMask) return false;
627
+
628
+ // DAMAGE_IMMUNITY blocks regardless of NO_SCHOOL_IMMUNITIES.
629
+ if ((state.damageImmuneMask & schoolMask) !== 0) return true;
630
+
631
+ // Template school immunity blocks regardless of NO_SCHOOL_IMMUNITIES (spellInfo is null).
632
+ if (template?.schoolImmuneMask && (template.schoolImmuneMask & schoolMask) !== 0) {
633
+ return true;
634
+ }
635
+
636
+ // Any overlapping school bit that is immune → immune to that damage packet.
637
+ // Matches C++: itr.type & schoolMask.
638
+ if ((state.schoolImmuneMask & schoolMask) !== 0) {
639
+ if (noSchoolImmunities) {
640
+ const unpierceable = state.auras.some(
641
+ (a) =>
642
+ a.auraType === AURA_TYPE.SCHOOL_IMMUNITY &&
643
+ ((a.schoolMask ?? 0) & schoolMask) !== 0 &&
644
+ (a.spellMechanic === MECHANIC.IMMUNE_SHIELD ||
645
+ a.spellMechanic === MECHANIC.INVULNERABILITY ||
646
+ a.spellMechanic === MECHANIC.BANISH),
647
+ );
648
+ if (!unpierceable) return false;
649
+ }
650
+ return true;
651
+ }
652
+
653
+ return false;
654
+ }
655
+
656
+ /** Dispel-type immunity: aura 41 OR creature_immunities Type 4. */
657
+ export function isImmuneToDispel(
658
+ state: ImmunityState,
659
+ dispelType: number,
660
+ template?: TemplateImmuneMasks | null,
661
+ ): boolean {
662
+ if (dispelType <= 0) return false;
663
+ const bit = 1 << dispelType;
664
+ if (((template?.immunities?.dispelMask ?? 0) & bit) !== 0) return true;
665
+ return (state.dispelImmuneMask & bit) !== 0;
666
+ }
667
+
668
+ /** Effect-id immunity: aura 37 OR creature_immunities Type 0. */
669
+ export function isImmuneToEffect(
670
+ state: ImmunityState,
671
+ effectId: number,
672
+ template?: TemplateImmuneMasks | null,
673
+ ): boolean {
674
+ if (effectId <= 0) return false;
675
+ if (template?.immunities?.effects?.includes(effectId)) return true;
676
+ return state.effectImmuneIds.includes(effectId);
677
+ }
678
+
679
+ /** State/aura-type immunity: aura 38 OR creature_immunities Type 1. */
680
+ export function isImmuneToState(
681
+ state: ImmunityState,
682
+ auraType: number,
683
+ template?: TemplateImmuneMasks | null,
684
+ ): boolean {
685
+ if (auraType <= 0) return false;
686
+ if (template?.immunities?.states?.includes(auraType)) return true;
687
+ return state.stateImmuneIds.includes(auraType);
688
+ }
689
+
690
+ // IsImmuneToSpellEffect for ONE effect slot: the effect id, then its mechanic, then its aura name.
691
+ // Per-slot, so a mixed spell still lands the half that is not immune. Cite: Unit.cpp:7371-7404.
692
+ export function isImmuneToSpellEffectSlot(
693
+ state: ImmunityState,
694
+ slot: { effect?: number | null; auraName?: number | null; mechanic?: number | null },
695
+ template?: TemplateImmuneMasks | null,
696
+ noImmunities?: boolean,
697
+ ): boolean {
698
+ if (noImmunities) return false;
699
+ if (isImmuneToEffect(state, slot.effect ?? 0, template)) return true;
700
+ const mech = slot.mechanic ?? 0;
701
+ if (mech > 0 && isImmuneToMechanicId(state, mech, template)) return true;
702
+ return isImmuneToState(state, slot.auraName ?? 0, template);
703
+ }
704
+
705
+ // Every populated slot immune means the cast lands nothing and is logged Immune. One immune slot out
706
+ // of two still runs: Mocking Blow keeps its damage and drops only the taunt.
707
+ export function isEveryEffectSlotImmune(
708
+ state: ImmunityState,
709
+ rawEffects: ReadonlyArray<{ effect?: number | null; auraName?: number | null; mechanic?: number | null }>
710
+ | undefined | null,
711
+ template?: TemplateImmuneMasks | null,
712
+ noImmunities?: boolean,
713
+ noPartialImmunity?: boolean,
714
+ ): boolean {
715
+ if (noImmunities || !rawEffects?.length) return false;
716
+ let populated = 0;
717
+ for (const slot of rawEffects) {
718
+ if (!(slot.effect ?? 0)) continue;
719
+ populated++;
720
+ const slotImmune = isImmuneToSpellEffectSlot(state, slot, template);
721
+ if (noPartialImmunity && slotImmune) return true;
722
+ if (!noPartialImmunity && !slotImmune) return false;
723
+ }
724
+ return noPartialImmunity ? false : populated > 0;
725
+ }
726
+
727
+ // Whole-spell immunity for a HOSTILE cast: template masks, or a school-immunity aura, or a dispel
728
+ // immunity against the spell's dispel type. A self-buff must not be framed as hostile here.
729
+ function isImmuneToHostileSpell(
730
+ state: ImmunityState,
731
+ spell: { school: School | string; mechanic?: Mechanic | string | null; dispel?: number | null },
732
+ template?: TemplateImmuneMasks | null,
733
+ noSchoolImmunities?: boolean,
734
+ ): boolean {
735
+ // IMMUNITY_DISPEL vs incoming SpellEntry.Dispel — first check in IsImmuneToSpell.
736
+ // Cite: Unit.cpp:7337–7340 (pin de8f729).
737
+ if (isImmuneToDispel(state, spell.dispel ?? 0, template)) return true;
738
+ if (!noSchoolImmunities && isTemplateSchoolImmune(template?.schoolImmuneMask, spell.school as School)) return true;
739
+ // Live aura mechanic (Free Action snare/root/stun) OR the creature template mask. Template-only
740
+ // left Piercing Howl / Concussive Shot firing every GCD into a FAP. Cite: Unit.cpp IsImmuneToSpell.
741
+ if (isImmuneToMechanic(state, spell.mechanic, template)) {
742
+ return true;
743
+ }
744
+ const schoolMask = schoolMaskFromSchoolName(spell.school);
745
+ if (!schoolMask) return false;
746
+ return isImmuneToHarmfulAura(state, { schoolMask, positive: false, noSchoolImmunities }, template);
747
+ }
748
+
749
+ function abilityDealsSchoolDamage(spell: {
750
+ effects?: ReadonlyArray<{ kind: string }>;
751
+ strikeBonus?: unknown;
752
+ onNextSwing?: boolean;
753
+ role?: string | null;
754
+ }): boolean {
755
+ if (spell.strikeBonus || spell.onNextSwing) return true;
756
+ const r = spell.role;
757
+ if (r === 'strike' || r === 'nuke' || r === 'instant_nuke' || r === 'shoot' || r === 'dot') {
758
+ return true;
759
+ }
760
+ const fx = spell.effects;
761
+ if (!fx) return false;
762
+ return fx.some(
763
+ (e) =>
764
+ e.kind === 'direct_damage'
765
+ || e.kind === 'dot'
766
+ || e.kind === 'weapon_percent_damage'
767
+ || e.kind === 'persistent_area',
768
+ );
769
+ }
770
+
771
+ // CheckCast immunity: the spell test plus the damage test for a damaging ability, which covers weapon
772
+ // strikes whose empty effect list makes them invisible to a hostile-effect walk.
773
+ export function isAbilityIneffectiveOnTarget(
774
+ state: ImmunityState,
775
+ spell: {
776
+ school: School | string;
777
+ mechanic?: Mechanic | string | null;
778
+ dispel?: number | null;
779
+ effects?: ReadonlyArray<{ kind: string; hostile?: boolean; pct?: number }>;
780
+ rawEffects?: ReadonlyArray<{ effect?: number }>;
781
+ strikeBonus?: unknown;
782
+ onNextSwing?: boolean;
783
+ role?: string | null;
784
+ },
785
+ template?: TemplateImmuneMasks | null,
786
+ noSchoolImmunities?: boolean,
787
+ ): boolean {
788
+ if (isImmuneToHostileSpell(state, spell, template, noSchoolImmunities)) return true;
789
+ if (abilityDealsSchoolDamage(spell) && isImmuneToDamage(state, spell.school, template, noSchoolImmunities)) {
790
+ return true;
791
+ }
792
+ // Totem.cpp:282–287 — negative auras never land. Mixed damage+aura (Wing Clip) still
793
+ // deals its hit; aura-only (Concussive, Fear, Serpent Sting) is a wasted GCD.
794
+ if (isTotemCreatureType(template?.creatureType) && spellIsHostileAuraOnly(spell)) return true;
795
+ return false;
796
+ }
797
+
798
+ // Harmful aura apply blocked by school immunity (IsImmuneToSpell school path). Positive auras are not
799
+ // blocked by a positive school immunity (Unit.cpp IsImmuneToSpell ~7344–7347).
800
+ export function isImmuneToHarmfulAura(
801
+ state: ImmunityState,
802
+ opts: {
803
+ schoolMask: number;
804
+ /** Incoming aura is positive. */
805
+ positive?: boolean;
806
+ /** SPELL_ATTR_NO_IMMUNITIES on the spell. */
807
+ noImmunities?: boolean;
808
+ /** SPELL_ATTR_EX2_NO_SCHOOL_IMMUNITIES on the spell. */
809
+ noSchoolImmunities?: boolean;
810
+ },
811
+ template?: TemplateImmuneMasks | null,
812
+ ): boolean {
813
+ if (opts.noImmunities) return false;
814
+ if (!opts.schoolMask) return false;
815
+
816
+ // Template school mask has no positive/positive exception in creature path.
817
+ if (template?.schoolImmuneMask && (template.schoolImmuneMask & opts.schoolMask) !== 0) {
818
+ return true; // Unpierceable since it's a template immunity.
819
+ }
820
+
821
+ if ((state.schoolImmuneMask & opts.schoolMask) === 0) return false;
822
+
823
+ if (opts.noSchoolImmunities) {
824
+ const unpierceable = state.auras.some(
825
+ (a) =>
826
+ a.auraType === AURA_TYPE.SCHOOL_IMMUNITY &&
827
+ ((a.schoolMask ?? 0) & opts.schoolMask) !== 0 &&
828
+ (a.spellMechanic === MECHANIC.IMMUNE_SHIELD ||
829
+ a.spellMechanic === MECHANIC.INVULNERABILITY ||
830
+ a.spellMechanic === MECHANIC.BANISH),
831
+ );
832
+ if (!unpierceable) return false;
833
+ }
834
+
835
+ // Positive school immunity does not block other positive auras.
836
+ if (opts.positive) {
837
+ const hasNegativeSchoolImmune = state.auras.some(
838
+ (a) =>
839
+ a.auraType === AURA_TYPE.SCHOOL_IMMUNITY &&
840
+ ((a.schoolMask ?? 0) & opts.schoolMask) !== 0 &&
841
+ !a.positive,
842
+ );
843
+ // If only positive immunities cover this school, allow positive auras.
844
+ if (!hasNegativeSchoolImmune) {
845
+ const hasPositiveCover = state.auras.some(
846
+ (a) =>
847
+ a.auraType === AURA_TYPE.SCHOOL_IMMUNITY &&
848
+ ((a.schoolMask ?? 0) & opts.schoolMask) !== 0 &&
849
+ a.positive,
850
+ );
851
+ if (hasPositiveCover) return false;
852
+ }
853
+ }
854
+ return true;
855
+ }
856
+
857
+ // Divine Shield–class: all-school immunity (damage + harmful auras). True when schoolImmuneMask covers
858
+ // SPELL_SCHOOL_MASK_ALL, or spellMechanic is IMMUNE_SHIELD / INVULNERABILITY (SpellMgr.h pierce list).
859
+ function isDivineShieldClass(state: ImmunityState): boolean {
860
+ if ((state.schoolImmuneMask & SPELL_SCHOOL_MASK_ALL) === SPELL_SCHOOL_MASK_ALL) {
861
+ return state.auras.some(
862
+ (a) =>
863
+ a.auraType === AURA_TYPE.SCHOOL_IMMUNITY &&
864
+ a.positive &&
865
+ ((a.schoolMask ?? 0) & SPELL_SCHOOL_MASK_ALL) === SPELL_SCHOOL_MASK_ALL,
866
+ );
867
+ }
868
+ return state.auras.some(
869
+ (a) =>
870
+ a.spellMechanic === MECHANIC.IMMUNE_SHIELD ||
871
+ a.spellMechanic === MECHANIC.INVULNERABILITY,
872
+ );
873
+ }
874
+
875
+ /** Blocks all damage for Divine Shield–class (predicate; duration is caller's job). */
876
+ function blocksAllDamage(state: ImmunityState): boolean {
877
+ return (state.schoolImmuneMask & SPELL_SCHOOL_MASK_ALL) === SPELL_SCHOOL_MASK_ALL
878
+ || (state.damageImmuneMask & SPELL_SCHOOL_MASK_ALL) === SPELL_SCHOOL_MASK_ALL;
879
+ }
880
+
881
+ /** Blocks harmful aura application under full school immunity. */
882
+ function blocksAllHarmfulAuras(state: ImmunityState): boolean {
883
+ return (state.schoolImmuneMask & SPELL_SCHOOL_MASK_ALL) === SPELL_SCHOOL_MASK_ALL;
884
+ }
885
+
886
+ // Banish-class or unattackable: the isolated state a banish school immunity sets, or the unattackable
887
+ // aura. Cite: HandleAuraModSchoolImmunity ~3025-3030; HandleModUnattackable ~4454.
888
+ export function isUnattackable(state: ImmunityState): boolean {
889
+ return state.isolated || state.untargetable;
890
+ }
891
+
892
+ // Banished units are treated as undispellable for combat wiring (isolated / untargetable — dispel requires
893
+ // a valid target). Predicate only.
894
+ function isUndispellable(state: ImmunityState): boolean {
895
+ return state.isolated;
896
+ }
897
+
898
+ /** True when any live aura is Banish-class (school immune + MECHANIC.BANISH). */
899
+ function isBanishClass(state: ImmunityState): boolean {
900
+ return state.auras.some(
901
+ (a) =>
902
+ a.auraType === AURA_TYPE.SCHOOL_IMMUNITY && a.spellMechanic === MECHANIC.BANISH,
903
+ );
904
+ }
905
+
906
+ // The per-spell target creature type gate, as a bitfield: Scare Beast takes beasts, Banish demons and
907
+ // elementals. An absent mask is unrestricted, and an unknown creature type is allowed.
908
+ export function passesTargetCreatureType(
909
+ targetCreatureTypeMask: number | undefined | null,
910
+ creatureType: number,
911
+ ): boolean {
912
+ if (!targetCreatureTypeMask) return true;
913
+ if (!creatureType) return true; // !TargetCreatureType early-allow
914
+ const bit = 1 << (creatureType - 1);
915
+ return (targetCreatureTypeMask & bit) !== 0;
916
+ }
917
+
918
+ /** Banish-specific wrapper (kept for existing call sites/tests): demon / elemental only. */
919
+ function isValidBanishTarget(
920
+ creatureType: number,
921
+ targetCreatureTypeMask: number = BANISH_TARGET_CREATURE_TYPE_MASK,
922
+ ): boolean {
923
+ return passesTargetCreatureType(targetCreatureTypeMask, creatureType);
924
+ }
925
+
926
+ // Convenience: Divine Shield–class duration field on the live aura (caller stores it). Returns max
927
+ // durationMs among Divine Shield–class auras, or 0.
928
+ function divineShieldDurationMs(state: ImmunityState): number {
929
+ let max = 0;
930
+ for (const a of state.auras) {
931
+ if (
932
+ a.auraType === AURA_TYPE.SCHOOL_IMMUNITY &&
933
+ a.positive &&
934
+ ((a.schoolMask ?? 0) & SPELL_SCHOOL_MASK_ALL) === SPELL_SCHOOL_MASK_ALL &&
935
+ a.durationMs != null &&
936
+ a.durationMs > max
937
+ ) {
938
+ max = a.durationMs;
939
+ }
940
+ }
941
+ return max;
942
+ }