azeroth-shell 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1163) hide show
  1. package/README.md +138 -2
  2. package/bin/azsh.mjs +19 -0
  3. package/docs/aifid/eventai-texts.json +4414 -0
  4. package/docs/dungeons/atlas/atlas-rows-dungeons.json +8989 -0
  5. package/docs/dungeons/survey/pack-id-migration.json +2418 -0
  6. package/package.json +26 -4
  7. package/src/autopilot/bossSkip.ts +26 -0
  8. package/src/autopilot/combatRotation.ts +824 -0
  9. package/src/autopilot/config.ts +533 -0
  10. package/src/autopilot/consumables.ts +58 -0
  11. package/src/autopilot/encounterStand.ts +121 -0
  12. package/src/autopilot/objectGatePlan.ts +53 -0
  13. package/src/autopilot/pathEngage.ts +229 -0
  14. package/src/autopilot/plan.ts +1643 -0
  15. package/src/autopilot/questPolicy.ts +274 -0
  16. package/src/autopilot/routeStep.ts +69 -0
  17. package/src/autopilot/sessionReport.ts +88 -0
  18. package/src/autopilot/topOffPower.ts +26 -0
  19. package/src/autopilot/view.ts +476 -0
  20. package/src/cli/bootCheck.mjs +34 -0
  21. package/src/cli/bootData.mjs +57 -0
  22. package/src/cli/combatLogFilter.ts +153 -0
  23. package/src/cli/combatLogFormat.ts +613 -0
  24. package/src/cli/fileRepository.mjs +105 -0
  25. package/src/cli/gzLoader.mjs +31 -0
  26. package/src/cli/liveGauntletEscort.ts +978 -0
  27. package/src/cli/liveStratUndead.ts +305 -0
  28. package/src/cli/macroHostCombat.ts +545 -0
  29. package/src/cli/macroHostWorld.ts +330 -0
  30. package/src/cli/prefs.mjs +31 -0
  31. package/src/cli/register.mjs +4 -0
  32. package/src/cli/repl.mjs +693 -0
  33. package/src/cli/rotationText.mjs +226 -0
  34. package/src/cli/squad.mjs +105 -0
  35. package/src/cli/term.mjs +126 -0
  36. package/src/cli/text.mjs +122 -0
  37. package/src/cli/tui.mjs +626 -0
  38. package/src/cli/tuiArena.mjs +109 -0
  39. package/src/cli/tuiAutopilotSettings.mjs +93 -0
  40. package/src/cli/tuiBags.mjs +180 -0
  41. package/src/cli/tuiBars.mjs +133 -0
  42. package/src/cli/tuiBg.mjs +243 -0
  43. package/src/cli/tuiBulk.mjs +162 -0
  44. package/src/cli/tuiCheck.mjs +1882 -0
  45. package/src/cli/tuiCity.mjs +396 -0
  46. package/src/cli/tuiCompanionKit.mjs +300 -0
  47. package/src/cli/tuiCompanions.mjs +471 -0
  48. package/src/cli/tuiDev.mjs +62 -0
  49. package/src/cli/tuiDungeon.mjs +606 -0
  50. package/src/cli/tuiEnchantTarget.mjs +120 -0
  51. package/src/cli/tuiFight.mjs +577 -0
  52. package/src/cli/tuiFightPanes.mjs +228 -0
  53. package/src/cli/tuiFloor.mjs +506 -0
  54. package/src/cli/tuiGear.mjs +158 -0
  55. package/src/cli/tuiHonor.mjs +74 -0
  56. package/src/cli/tuiLoot.mjs +97 -0
  57. package/src/cli/tuiMacros.mjs +144 -0
  58. package/src/cli/tuiOutfitter.mjs +115 -0
  59. package/src/cli/tuiPet.mjs +116 -0
  60. package/src/cli/tuiProfessions.mjs +800 -0
  61. package/src/cli/tuiRaid.mjs +127 -0
  62. package/src/cli/tuiRep.mjs +65 -0
  63. package/src/cli/tuiSaves.mjs +69 -0
  64. package/src/cli/tuiSearch.mjs +363 -0
  65. package/src/cli/tuiSettings.mjs +151 -0
  66. package/src/cli/tuiSimLab.mjs +80 -0
  67. package/src/cli/tuiTalents.mjs +60 -0
  68. package/src/cli/tuiViews.mjs +1178 -0
  69. package/src/cli/tuiWiki.mjs +181 -0
  70. package/src/cli/tuiWorld.mjs +361 -0
  71. package/src/cli/wikiIndex.ts +259 -0
  72. package/src/cli/wikiSources.ts +355 -0
  73. package/src/data/alteracValley.ts +176 -0
  74. package/src/data/appearanceOptions.ts +534 -0
  75. package/src/data/applyLootChanceSanity.ts +21 -0
  76. package/src/data/createFlavor.ts +96 -0
  77. package/src/data/customItems.ts +33 -0
  78. package/src/data/dataStore.ts +1904 -0
  79. package/src/data/dungeonGameObjects.ts +84 -0
  80. package/src/data/dungeonPlateCover.ts +66 -0
  81. package/src/data/dungeonSpawns.ts +294 -0
  82. package/src/data/dungeons/alterac-valley.ts +135 -0
  83. package/src/data/dungeons/apply-dungeon-rooms.ts +29 -0
  84. package/src/data/dungeons/apply-encounter-outdoors.ts +72 -0
  85. package/src/data/dungeons/apply-instance-geometry.ts +65 -0
  86. package/src/data/dungeons/apply-spawn-placement.ts +171 -0
  87. package/src/data/dungeons/blackfathom-deeps.ts +539 -0
  88. package/src/data/dungeons/blackrock-depths.ts +1410 -0
  89. package/src/data/dungeons/blackwing-lair.ts +129 -0
  90. package/src/data/dungeons/boss-eventai.ts +8 -0
  91. package/src/data/dungeons/deadmines.ts +410 -0
  92. package/src/data/dungeons/dire-maul-east.ts +980 -0
  93. package/src/data/dungeons/dire-maul-north.ts +661 -0
  94. package/src/data/dungeons/dire-maul-west.ts +785 -0
  95. package/src/data/dungeons/dungeon-rooms.json +5479 -0
  96. package/src/data/dungeons/encounter-outdoors.json +359 -0
  97. package/src/data/dungeons/eventai/blackfathom-deeps.ts +308 -0
  98. package/src/data/dungeons/eventai/blackrock-depths.ts +1257 -0
  99. package/src/data/dungeons/eventai/deadmines.ts +264 -0
  100. package/src/data/dungeons/eventai/dire-maul-east.ts +320 -0
  101. package/src/data/dungeons/eventai/gnomeregan.ts +213 -0
  102. package/src/data/dungeons/eventai/helpers.ts +79 -0
  103. package/src/data/dungeons/eventai/index.ts +133 -0
  104. package/src/data/dungeons/eventai/lbrs.ts +372 -0
  105. package/src/data/dungeons/eventai/maraudon.ts +323 -0
  106. package/src/data/dungeons/eventai/ragefire-chasm.ts +108 -0
  107. package/src/data/dungeons/eventai/razorfen-downs.ts +207 -0
  108. package/src/data/dungeons/eventai/razorfen-kraul.ts +326 -0
  109. package/src/data/dungeons/eventai/scholomance.ts +680 -0
  110. package/src/data/dungeons/eventai/shadowfang-keep.ts +230 -0
  111. package/src/data/dungeons/eventai/sm-cathedral.ts +75 -0
  112. package/src/data/dungeons/eventai/sm-graveyard.ts +150 -0
  113. package/src/data/dungeons/eventai/sm-library.ts +55 -0
  114. package/src/data/dungeons/eventai/stratholme-undead.ts +127 -0
  115. package/src/data/dungeons/eventai/sunken-temple.ts +582 -0
  116. package/src/data/dungeons/eventai/the-stockade.ts +228 -0
  117. package/src/data/dungeons/eventai/ubrs.ts +225 -0
  118. package/src/data/dungeons/eventai/uldaman.ts +355 -0
  119. package/src/data/dungeons/eventai/wailing-caverns.ts +396 -0
  120. package/src/data/dungeons/eventai/zul-farrak.ts +591 -0
  121. package/src/data/dungeons/gnomeregan.ts +909 -0
  122. package/src/data/dungeons/index.ts +126 -0
  123. package/src/data/dungeons/instance-geometry.json +5233 -0
  124. package/src/data/dungeons/key-sources.json +169 -0
  125. package/src/data/dungeons/lbrs.ts +996 -0
  126. package/src/data/dungeons/maraudon.ts +786 -0
  127. package/src/data/dungeons/molten-core.ts +194 -0
  128. package/src/data/dungeons/naxxramas.ts +173 -0
  129. package/src/data/dungeons/onyxias-lair.ts +71 -0
  130. package/src/data/dungeons/pack-from-clusters.ts +1256 -0
  131. package/src/data/dungeons/ragefire-chasm.ts +238 -0
  132. package/src/data/dungeons/razorfen-downs.ts +698 -0
  133. package/src/data/dungeons/razorfen-kraul.ts +766 -0
  134. package/src/data/dungeons/ruins-of-ahnqiraj.ts +121 -0
  135. package/src/data/dungeons/scholomance.ts +1076 -0
  136. package/src/data/dungeons/shadowfang-keep.ts +740 -0
  137. package/src/data/dungeons/sm-armory.ts +266 -0
  138. package/src/data/dungeons/sm-cathedral.ts +430 -0
  139. package/src/data/dungeons/sm-graveyard.ts +482 -0
  140. package/src/data/dungeons/sm-library.ts +337 -0
  141. package/src/data/dungeons/stratholme-live.ts +808 -0
  142. package/src/data/dungeons/stratholme-undead.ts +1164 -0
  143. package/src/data/dungeons/sunken-temple.ts +931 -0
  144. package/src/data/dungeons/temple-of-ahnqiraj.ts +119 -0
  145. package/src/data/dungeons/the-stockade.ts +282 -0
  146. package/src/data/dungeons/ubrs.ts +1286 -0
  147. package/src/data/dungeons/uldaman.ts +685 -0
  148. package/src/data/dungeons/wailing-caverns.ts +356 -0
  149. package/src/data/dungeons/zul-farrak.ts +686 -0
  150. package/src/data/dungeons/zul-gurub.ts +142 -0
  151. package/src/data/dungeons.ts +42 -0
  152. package/src/data/fixtures.ts +446 -0
  153. package/src/data/gameobject-data.json.gz +0 -0
  154. package/src/data/item-data.json.gz +0 -0
  155. package/src/data/loot-data.json.gz +0 -0
  156. package/src/data/maps/atlas-approach-maps.json +1425 -0
  157. package/src/data/maps/atlas-landmarks.json +1711 -0
  158. package/src/data/maps/dungeon-viewports.json +392 -0
  159. package/src/data/materializeModDamagePercentTaken.ts +70 -0
  160. package/src/data/materializeModHealthRegen.ts +89 -0
  161. package/src/data/materializeSpellReputation.ts +26 -0
  162. package/src/data/pageTexts.ts +19 -0
  163. package/src/data/profession-data.json.gz +0 -0
  164. package/src/data/raid-plans/blackfathom-deeps.json +86 -0
  165. package/src/data/raid-plans/blackrock-depths.json +419 -0
  166. package/src/data/raid-plans/blackwing-lair.json +328 -0
  167. package/src/data/raid-plans/deadmines.json +55 -0
  168. package/src/data/raid-plans/dire-maul-east.json +94 -0
  169. package/src/data/raid-plans/dire-maul-north.json +70 -0
  170. package/src/data/raid-plans/dire-maul-west.json +75 -0
  171. package/src/data/raid-plans/gnomeregan.json +131 -0
  172. package/src/data/raid-plans/lbrs.json +176 -0
  173. package/src/data/raid-plans/maraudon.json +102 -0
  174. package/src/data/raid-plans/molten-core.json +169 -0
  175. package/src/data/raid-plans/naxxramas.json +354 -0
  176. package/src/data/raid-plans/onyxias-lair.json +18 -0
  177. package/src/data/raid-plans/ragefire-chasm.json +30 -0
  178. package/src/data/raid-plans/razorfen-downs.json +75 -0
  179. package/src/data/raid-plans/razorfen-kraul.json +53 -0
  180. package/src/data/raid-plans/ruins-of-ahnqiraj.json +110 -0
  181. package/src/data/raid-plans/scholomance.json +170 -0
  182. package/src/data/raid-plans/shadowfang-keep.json +87 -0
  183. package/src/data/raid-plans/sm-armory.json +53 -0
  184. package/src/data/raid-plans/sm-cathedral.json +72 -0
  185. package/src/data/raid-plans/sm-graveyard.json +63 -0
  186. package/src/data/raid-plans/sm-library.json +23 -0
  187. package/src/data/raid-plans/stratholme-live.json +129 -0
  188. package/src/data/raid-plans/stratholme-undead.json +73 -0
  189. package/src/data/raid-plans/sunken-temple.json +159 -0
  190. package/src/data/raid-plans/temple-of-ahnqiraj.json +163 -0
  191. package/src/data/raid-plans/the-stockade.json +42 -0
  192. package/src/data/raid-plans/ubrs.json +53 -0
  193. package/src/data/raid-plans/uldaman.json +131 -0
  194. package/src/data/raid-plans/wailing-caverns.json +90 -0
  195. package/src/data/raid-plans/zul-farrak.json +156 -0
  196. package/src/data/raid-plans/zul-gurub.json +307 -0
  197. package/src/data/raidInstanceCreatures.mjs +473 -0
  198. package/src/data/rotations/index.ts +152 -0
  199. package/src/data/rotations/layout.mjs +72 -0
  200. package/src/data/rotations/pve/druid/balance.json +754 -0
  201. package/src/data/rotations/pve/druid/feral-tank.json +2448 -0
  202. package/src/data/rotations/pve/druid/feral.json +2660 -0
  203. package/src/data/rotations/pve/druid/restoration.json +424 -0
  204. package/src/data/rotations/pve/hunter/beast-mastery.json +1288 -0
  205. package/src/data/rotations/pve/hunter/marksmanship.json +1260 -0
  206. package/src/data/rotations/pve/hunter/survival.json +1373 -0
  207. package/src/data/rotations/pve/mage/arcane-leveling.json +1798 -0
  208. package/src/data/rotations/pve/mage/fire-leveling.json +2003 -0
  209. package/src/data/rotations/pve/mage/frost-leveling.json +1912 -0
  210. package/src/data/rotations/pve/paladin/holy.json +755 -0
  211. package/src/data/rotations/pve/paladin/protection.json +962 -0
  212. package/src/data/rotations/pve/paladin/retribution.json +924 -0
  213. package/src/data/rotations/pve/priest/discipline.json +772 -0
  214. package/src/data/rotations/pve/priest/holy.json +707 -0
  215. package/src/data/rotations/pve/priest/shadow.json +787 -0
  216. package/src/data/rotations/pve/rogue/assassination.json +2477 -0
  217. package/src/data/rotations/pve/rogue/combat.json +2483 -0
  218. package/src/data/rotations/pve/rogue/subtlety.json +2523 -0
  219. package/src/data/rotations/pve/shaman/elemental.json +1157 -0
  220. package/src/data/rotations/pve/shaman/enhancement.json +1085 -0
  221. package/src/data/rotations/pve/shaman/restoration.json +592 -0
  222. package/src/data/rotations/pve/warlock/affliction.json +1185 -0
  223. package/src/data/rotations/pve/warlock/demonology.json +1165 -0
  224. package/src/data/rotations/pve/warlock/destruction.json +1177 -0
  225. package/src/data/rotations/pve/warrior/arms.json +3020 -0
  226. package/src/data/rotations/pve/warrior/fury.json +2996 -0
  227. package/src/data/rotations/pve/warrior/protection.json +2509 -0
  228. package/src/data/rotations/pvp/druid/balance.json +593 -0
  229. package/src/data/rotations/pvp/druid/feral.json +3276 -0
  230. package/src/data/rotations/pvp/druid/restoration.json +662 -0
  231. package/src/data/rotations/pvp/hunter/beast-mastery.json +665 -0
  232. package/src/data/rotations/pvp/hunter/marksmanship.json +2406 -0
  233. package/src/data/rotations/pvp/hunter/survival.json +635 -0
  234. package/src/data/rotations/pvp/mage/arcane.json +574 -0
  235. package/src/data/rotations/pvp/mage/fire.json +570 -0
  236. package/src/data/rotations/pvp/mage/frost.json +4048 -0
  237. package/src/data/rotations/pvp/paladin/holy.json +1498 -0
  238. package/src/data/rotations/pvp/paladin/protection.json +567 -0
  239. package/src/data/rotations/pvp/paladin/retribution.json +1110 -0
  240. package/src/data/rotations/pvp/priest/discipline.json +1848 -0
  241. package/src/data/rotations/pvp/priest/holy.json +6340 -0
  242. package/src/data/rotations/pvp/priest/shadow.json +2329 -0
  243. package/src/data/rotations/pvp/rogue/assassination.json +1322 -0
  244. package/src/data/rotations/pvp/rogue/combat.json +5258 -0
  245. package/src/data/rotations/pvp/rogue/subtlety.json +586 -0
  246. package/src/data/rotations/pvp/shaman/elemental.json +1404 -0
  247. package/src/data/rotations/pvp/shaman/enhancement.json +1277 -0
  248. package/src/data/rotations/pvp/shaman/restoration.json +2490 -0
  249. package/src/data/rotations/pvp/warlock/affliction.json +1017 -0
  250. package/src/data/rotations/pvp/warlock/demonology.json +1503 -0
  251. package/src/data/rotations/pvp/warlock/destruction.json +638 -0
  252. package/src/data/rotations/pvp/warrior/arms.json +5665 -0
  253. package/src/data/rotations/pvp/warrior/fury.json +850 -0
  254. package/src/data/rotations/pvp/warrior/protection.json +777 -0
  255. package/src/data/schema/bundle.ts +511 -0
  256. package/src/data/schema/constants.ts +49 -0
  257. package/src/data/schema/creature.ts +454 -0
  258. package/src/data/schema/encounter.ts +155 -0
  259. package/src/data/schema/faction.ts +48 -0
  260. package/src/data/schema/item.ts +297 -0
  261. package/src/data/schema/itemEnchant.ts +105 -0
  262. package/src/data/schema/npc.ts +44 -0
  263. package/src/data/schema/primitives.ts +295 -0
  264. package/src/data/schema/profession.ts +226 -0
  265. package/src/data/schema/quest.ts +154 -0
  266. package/src/data/schema/spell.ts +1149 -0
  267. package/src/data/schema/talent.ts +74 -0
  268. package/src/data/schema/world.ts +124 -0
  269. package/src/data/schema.ts +19 -0
  270. package/src/data/skinNodeGapFill.ts +68 -0
  271. package/src/data/spell-data.json.gz +0 -0
  272. package/src/data/spell-script-targets.json +1 -0
  273. package/src/data/tables/ahItemValues.json.gz +0 -0
  274. package/src/data/tables/alteracValley.json.gz +0 -0
  275. package/src/data/tables/areatriggerTeleports.json.gz +0 -0
  276. package/src/data/tables/botNames.json.gz +0 -0
  277. package/src/data/tables/botPopulation.json.gz +0 -0
  278. package/src/data/tables/botSpecs.json.gz +0 -0
  279. package/src/data/tables/classLevelStats.json.gz +0 -0
  280. package/src/data/tables/combatConditions.json.gz +0 -0
  281. package/src/data/tables/combatSkillMeta.json.gz +0 -0
  282. package/src/data/tables/conditions.json.gz +0 -0
  283. package/src/data/tables/createInfo.json.gz +0 -0
  284. package/src/data/tables/creatureAggroGroups.json.gz +0 -0
  285. package/src/data/tables/creatureClassLevelStats.json.gz +0 -0
  286. package/src/data/tables/creaturePatrolPacks.json.gz +0 -0
  287. package/src/data/tables/creatureWeapons.json.gz +0 -0
  288. package/src/data/tables/creatures.json.gz +0 -0
  289. package/src/data/tables/dbScripts.json.gz +0 -0
  290. package/src/data/tables/dungeonAuthoredRoutes.json.gz +0 -0
  291. package/src/data/tables/dungeonCensus.json.gz +0 -0
  292. package/src/data/tables/dungeonGameObjects.json.gz +0 -0
  293. package/src/data/tables/dungeonPacks.json.gz +0 -0
  294. package/src/data/tables/dungeonPlateCover.json.gz +0 -0
  295. package/src/data/tables/dungeonSpawns.json.gz +0 -0
  296. package/src/data/tables/dungeonSurvey.json.gz +0 -0
  297. package/src/data/tables/durabilityCosts.json.gz +0 -0
  298. package/src/data/tables/durabilityQuality.json.gz +0 -0
  299. package/src/data/tables/enchantApplicators.json.gz +0 -0
  300. package/src/data/tables/entranceYards.json.gz +0 -0
  301. package/src/data/tables/explorationBasexp.json.gz +0 -0
  302. package/src/data/tables/factionTemplates.json.gz +0 -0
  303. package/src/data/tables/factions.json.gz +0 -0
  304. package/src/data/tables/gameEvents.json.gz +0 -0
  305. package/src/data/tables/gameObjects.json.gz +0 -0
  306. package/src/data/tables/gossipMenus.json.gz +0 -0
  307. package/src/data/tables/graveyards.json.gz +0 -0
  308. package/src/data/tables/instanceMaps.json.gz +0 -0
  309. package/src/data/tables/itemEnchantmentTemplates.json.gz +0 -0
  310. package/src/data/tables/itemEnchants.json.gz +0 -0
  311. package/src/data/tables/itemRandomProperties.json.gz +0 -0
  312. package/src/data/tables/itemSets.json.gz +0 -0
  313. package/src/data/tables/items.json.gz +0 -0
  314. package/src/data/tables/levelStats.json.gz +0 -0
  315. package/src/data/tables/locks.json.gz +0 -0
  316. package/src/data/tables/map-pin-overrides.json.gz +0 -0
  317. package/src/data/tables/nonCombatTrash.json.gz +0 -0
  318. package/src/data/tables/npcTexts.json.gz +0 -0
  319. package/src/data/tables/pageTexts.json.gz +0 -0
  320. package/src/data/tables/petAbilityTP.json.gz +0 -0
  321. package/src/data/tables/petGenericSpells.json.gz +0 -0
  322. package/src/data/tables/petLevelStats.json.gz +0 -0
  323. package/src/data/tables/playerbot-weightscales.json.gz +0 -0
  324. package/src/data/tables/pools.json.gz +0 -0
  325. package/src/data/tables/quests.json.gz +0 -0
  326. package/src/data/tables/races.json.gz +0 -0
  327. package/src/data/tables/reputationRanks.json.gz +0 -0
  328. package/src/data/tables/reputationRates.json.gz +0 -0
  329. package/src/data/tables/reputationSpillover.json.gz +0 -0
  330. package/src/data/tables/ridingSpells.json.gz +0 -0
  331. package/src/data/tables/scriptTexts.json.gz +0 -0
  332. package/src/data/tables/soundClipVolume.json.gz +0 -0
  333. package/src/data/tables/spellChain.json.gz +0 -0
  334. package/src/data/tables/spellTeleports.json.gz +0 -0
  335. package/src/data/tables/spells.json.gz +0 -0
  336. package/src/data/tables/talents.json.gz +0 -0
  337. package/src/data/tables/tavernTriggers.json.gz +0 -0
  338. package/src/data/tables/taxiNodes.json.gz +0 -0
  339. package/src/data/tables/taxiRoutes.json.gz +0 -0
  340. package/src/data/tables/trainers.json.gz +0 -0
  341. package/src/data/tables/transports.json.gz +0 -0
  342. package/src/data/tables/travelAnchors.json.gz +0 -0
  343. package/src/data/tables/travelEdges.json.gz +0 -0
  344. package/src/data/tables/unitConditions.json.gz +0 -0
  345. package/src/data/tables/vendors.json.gz +0 -0
  346. package/src/data/tables/weaponEnchantProcs.json.gz +0 -0
  347. package/src/data/tables/xp.json.gz +0 -0
  348. package/src/data/tables/zoneWeather.json.gz +0 -0
  349. package/src/data/tables/zones.json.gz +0 -0
  350. package/src/data/world-data.ts +56 -0
  351. package/src/data/zone-music-sets.json +2751 -0
  352. package/src/dev/etl/lib/loot-chance-sanity.mjs +180 -0
  353. package/src/domain/audioQuality.mjs +145 -0
  354. package/src/domain/bg/ab.ts +433 -0
  355. package/src/domain/bg/arenaComps.ts +644 -0
  356. package/src/domain/bg/arenaLab.ts +695 -0
  357. package/src/domain/bg/arenaPace.ts +31 -0
  358. package/src/domain/bg/arenaRating.ts +110 -0
  359. package/src/domain/bg/av.ts +758 -0
  360. package/src/domain/bg/avEnemyPush.ts +219 -0
  361. package/src/domain/bg/avField.ts +283 -0
  362. package/src/domain/bg/avInstanceNodes.ts +197 -0
  363. package/src/domain/bg/avInstanceScore.ts +123 -0
  364. package/src/domain/bg/avQuestItems.ts +55 -0
  365. package/src/domain/bg/avQuests.ts +210 -0
  366. package/src/domain/bg/avSession.ts +196 -0
  367. package/src/domain/bg/bgConsumes.ts +269 -0
  368. package/src/domain/bg/bgPrebuff.ts +153 -0
  369. package/src/domain/bg/bgRest.ts +91 -0
  370. package/src/domain/bg/bgRoster.ts +305 -0
  371. package/src/domain/bg/bgTier.ts +61 -0
  372. package/src/domain/bg/bgWorld.ts +862 -0
  373. package/src/domain/bg/match.ts +215 -0
  374. package/src/domain/bg/strategies.ts +552 -0
  375. package/src/domain/bg/types.ts +291 -0
  376. package/src/domain/bg/wsg.ts +264 -0
  377. package/src/domain/bots/actionProviderSpec.ts +38 -0
  378. package/src/domain/bots/autoConsumables.ts +285 -0
  379. package/src/domain/bots/betweenPullRest.ts +239 -0
  380. package/src/domain/bots/botGear.ts +248 -0
  381. package/src/domain/bots/botInventory.ts +486 -0
  382. package/src/domain/bots/botPet.ts +535 -0
  383. package/src/domain/bots/botPool.ts +291 -0
  384. package/src/domain/bots/botProfessions.ts +334 -0
  385. package/src/domain/bots/companionActionBar.ts +209 -0
  386. package/src/domain/bots/companionHireCost.ts +236 -0
  387. package/src/domain/bots/companionMissions.ts +582 -0
  388. package/src/domain/bots/companionPrep.ts +254 -0
  389. package/src/domain/bots/companionQuests.ts +270 -0
  390. package/src/domain/bots/companionRep.ts +75 -0
  391. package/src/domain/bots/companionRotation.ts +708 -0
  392. package/src/domain/bots/companionXp.ts +66 -0
  393. package/src/domain/bots/consumableShare.ts +811 -0
  394. package/src/domain/bots/dpsMate.ts +1072 -0
  395. package/src/domain/bots/groupCompReport.ts +132 -0
  396. package/src/domain/bots/healthstoneSupply.ts +198 -0
  397. package/src/domain/bots/outfitter.ts +1056 -0
  398. package/src/domain/bots/paladinPrePull.ts +231 -0
  399. package/src/domain/bots/partyRole.ts +40 -0
  400. package/src/domain/bots/playerbotEquipCache.ts +412 -0
  401. package/src/domain/bots/playerbotItemEligibility.ts +60 -0
  402. package/src/domain/bots/playerbotStatWeight.ts +853 -0
  403. package/src/domain/bots/playerbotUnavailableItems.ts +147 -0
  404. package/src/domain/bots/prePullBuffs.ts +219 -0
  405. package/src/domain/bots/prePullStealth.ts +82 -0
  406. package/src/domain/bots/runSupply.ts +251 -0
  407. package/src/domain/bots/runSupplyPrefs.ts +28 -0
  408. package/src/domain/bots/sendTradeGoods.ts +394 -0
  409. package/src/domain/bots/soulShardCap.ts +35 -0
  410. package/src/domain/bots/squad.ts +842 -0
  411. package/src/domain/bots/squadRun.ts +81 -0
  412. package/src/domain/character/actionbar.ts +346 -0
  413. package/src/domain/character/appearance.ts +165 -0
  414. package/src/domain/character/buildCombatant.ts +1726 -0
  415. package/src/domain/character/character.ts +356 -0
  416. package/src/domain/character/characterName.ts +43 -0
  417. package/src/domain/character/characterRatings.ts +424 -0
  418. package/src/domain/character/characterSpells.ts +282 -0
  419. package/src/domain/character/characterStats.ts +1559 -0
  420. package/src/domain/character/characterTalents.ts +398 -0
  421. package/src/domain/character/combatSkills.ts +994 -0
  422. package/src/domain/character/displayForm.ts +72 -0
  423. package/src/domain/character/formTalentAuras.ts +171 -0
  424. package/src/domain/character/forms.ts +499 -0
  425. package/src/domain/character/races.ts +40 -0
  426. package/src/domain/character/resurrectionSickness.ts +49 -0
  427. package/src/domain/character/spellbook.ts +169 -0
  428. package/src/domain/character/stanceBar.ts +354 -0
  429. package/src/domain/character/stancePrereq.ts +70 -0
  430. package/src/domain/character/talentBuilds.ts +63 -0
  431. package/src/domain/character/talentImport.ts +130 -0
  432. package/src/domain/character/talentLink.ts +123 -0
  433. package/src/domain/character/talents.ts +201 -0
  434. package/src/domain/core/conditionSnapshot.ts +92 -0
  435. package/src/domain/core/hover.ts +14 -0
  436. package/src/domain/core/ids.ts +58 -0
  437. package/src/domain/core/internalNameTags.ts +5 -0
  438. package/src/domain/core/runtimeDataPatches.ts +357 -0
  439. package/src/domain/creature/aiTargeting.ts +588 -0
  440. package/src/domain/creature/combatCondition.ts +157 -0
  441. package/src/domain/creature/creatureAggro.ts +804 -0
  442. package/src/domain/creature/creatureAi.ts +206 -0
  443. package/src/domain/creature/creatureAiConstants.ts +661 -0
  444. package/src/domain/creature/creatureCastList.ts +1007 -0
  445. package/src/domain/creature/creatureEventAi.ts +1409 -0
  446. package/src/domain/creature/creatureGroups.ts +144 -0
  447. package/src/domain/creature/creatureLinking.ts +333 -0
  448. package/src/domain/creature/creatureScaling.ts +320 -0
  449. package/src/domain/creature/creatureTrigger.ts +53 -0
  450. package/src/domain/creature/creatureWander.ts +74 -0
  451. package/src/domain/creature/eventAiTexts.ts +145 -0
  452. package/src/domain/creature/faction.ts +287 -0
  453. package/src/domain/creature/forcedReaction.ts +48 -0
  454. package/src/domain/creature/outdoorHuntable.ts +74 -0
  455. package/src/domain/creature/patrolPacks.ts +210 -0
  456. package/src/domain/creature/reputation.ts +967 -0
  457. package/src/domain/creature/unitFlags.ts +74 -0
  458. package/src/domain/creature/worldBosses.ts +393 -0
  459. package/src/domain/dungeonMusic.mjs +48 -0
  460. package/src/domain/economy/auction.ts +282 -0
  461. package/src/domain/economy/auctionBot.ts +1060 -0
  462. package/src/domain/economy/honorPrice.ts +100 -0
  463. package/src/domain/economy/mail.ts +958 -0
  464. package/src/domain/economy/money.ts +42 -0
  465. package/src/domain/economy/syntheticClassTrainers.ts +62 -0
  466. package/src/domain/economy/trading.ts +296 -0
  467. package/src/domain/economy/vendorSellAll.ts +252 -0
  468. package/src/domain/economy/vendorStock.ts +146 -0
  469. package/src/domain/items/ammo.ts +817 -0
  470. package/src/domain/items/bank.ts +162 -0
  471. package/src/domain/items/consumableFamily.ts +205 -0
  472. package/src/domain/items/craftUpgrades.ts +83 -0
  473. package/src/domain/items/createItem.ts +93 -0
  474. package/src/domain/items/durability.ts +581 -0
  475. package/src/domain/items/equipment.ts +441 -0
  476. package/src/domain/items/equipmentHelper.ts +767 -0
  477. package/src/domain/items/inventory.ts +561 -0
  478. package/src/domain/items/itemBonding.ts +93 -0
  479. package/src/domain/items/itemContainer.ts +245 -0
  480. package/src/domain/items/itemDisplayName.ts +33 -0
  481. package/src/domain/items/itemInstance.ts +181 -0
  482. package/src/domain/items/itemRandomEnchantOutcomes.ts +315 -0
  483. package/src/domain/items/itemRandomProps.ts +77 -0
  484. package/src/domain/items/itemRestrictions.ts +329 -0
  485. package/src/domain/items/itemTeaches.ts +82 -0
  486. package/src/domain/items/itemUseCooldown.ts +52 -0
  487. package/src/domain/items/itemUseTarget.ts +90 -0
  488. package/src/domain/items/junkCategories.ts +174 -0
  489. package/src/domain/items/junkFilter.ts +368 -0
  490. package/src/domain/items/keyring.ts +131 -0
  491. package/src/domain/items/loot.ts +221 -0
  492. package/src/domain/items/mounts.ts +190 -0
  493. package/src/domain/items/onUsePayload.ts +102 -0
  494. package/src/domain/items/pendingLoot.ts +107 -0
  495. package/src/domain/items/relic.ts +105 -0
  496. package/src/domain/items/rocketBoots.ts +36 -0
  497. package/src/domain/items/sortContainer.ts +139 -0
  498. package/src/domain/items/spareContainers.ts +71 -0
  499. package/src/domain/items/spellReagentIndex.ts +131 -0
  500. package/src/domain/items/staleConsumables.ts +66 -0
  501. package/src/domain/items/weaponSpender.ts +110 -0
  502. package/src/domain/listDungeonIds.mjs +28 -0
  503. package/src/domain/macro/compose.ts +239 -0
  504. package/src/domain/macro/conditions.ts +260 -0
  505. package/src/domain/macro/creatureTypes.ts +40 -0
  506. package/src/domain/macro/describe.ts +169 -0
  507. package/src/domain/macro/icon.ts +60 -0
  508. package/src/domain/macro/index.ts +20 -0
  509. package/src/domain/macro/normalize.ts +112 -0
  510. package/src/domain/macro/parse.ts +316 -0
  511. package/src/domain/macro/plan.ts +288 -0
  512. package/src/domain/macro/rotation.ts +590 -0
  513. package/src/domain/macro/rotationEnv.ts +173 -0
  514. package/src/domain/macro/slots.ts +101 -0
  515. package/src/domain/macro/snapshot.ts +114 -0
  516. package/src/domain/macro/templates.ts +446 -0
  517. package/src/domain/macro/types.ts +70 -0
  518. package/src/domain/macro/units.ts +93 -0
  519. package/src/domain/macro/weaponTypes.ts +83 -0
  520. package/src/domain/nav/cityTeleports.ts +10 -0
  521. package/src/domain/nav/mounting.ts +113 -0
  522. package/src/domain/nav/nav.ts +43 -0
  523. package/src/domain/nav/navCollision.ts +606 -0
  524. package/src/domain/nav/navOutdoors.ts +91 -0
  525. package/src/domain/nav/navRegistry.ts +179 -0
  526. package/src/domain/nav/navRoomGraph.ts +302 -0
  527. package/src/domain/nav/navTypes.ts +43 -0
  528. package/src/domain/nav/navmesh.ts +1715 -0
  529. package/src/domain/nav/speed.ts +200 -0
  530. package/src/domain/nav/storey.ts +10 -0
  531. package/src/domain/nav/travel.ts +725 -0
  532. package/src/domain/nav/travelTypes.ts +75 -0
  533. package/src/domain/pet/pet.ts +1150 -0
  534. package/src/domain/pet/petActionBar.ts +180 -0
  535. package/src/domain/pet/petSpellbook.ts +39 -0
  536. package/src/domain/pet/petStable.ts +81 -0
  537. package/src/domain/professions/autoDisenchant.ts +236 -0
  538. package/src/domain/professions/characterEnchants.ts +176 -0
  539. package/src/domain/professions/craftCooldown.ts +52 -0
  540. package/src/domain/professions/enchantApply.ts +62 -0
  541. package/src/domain/professions/enchantTargets.ts +114 -0
  542. package/src/domain/professions/enchanting.ts +236 -0
  543. package/src/domain/professions/gatherFilter.ts +149 -0
  544. package/src/domain/professions/gearEnchant.ts +137 -0
  545. package/src/domain/professions/heldTools.ts +29 -0
  546. package/src/domain/professions/learnAllRecipes.ts +146 -0
  547. package/src/domain/professions/miningHarvest.ts +69 -0
  548. package/src/domain/professions/partyDisenchant.ts +294 -0
  549. package/src/domain/professions/partyWork.ts +83 -0
  550. package/src/domain/professions/pickpocket.ts +172 -0
  551. package/src/domain/professions/poisons.ts +240 -0
  552. package/src/domain/professions/professions.ts +677 -0
  553. package/src/domain/professions/rareNodes.ts +45 -0
  554. package/src/domain/professions/skinLoot.ts +27 -0
  555. package/src/domain/professions/vendorReagents.ts +152 -0
  556. package/src/domain/professions/weaponImbueHand.ts +171 -0
  557. package/src/domain/questFarmFilter.mjs +42 -0
  558. package/src/domain/quests/doQuest.ts +1204 -0
  559. package/src/domain/quests/gossip.ts +308 -0
  560. package/src/domain/quests/gossipTalk.ts +298 -0
  561. package/src/domain/quests/interpreter/canComplete.ts +150 -0
  562. package/src/domain/quests/interpreter/claim.ts +137 -0
  563. package/src/domain/quests/interpreter/dbscript/handlers.ts +1371 -0
  564. package/src/domain/quests/interpreter/dbscript/handlersBatch.ts +1251 -0
  565. package/src/domain/quests/interpreter/dbscript/hooks.ts +331 -0
  566. package/src/domain/quests/interpreter/dbscript/index.ts +212 -0
  567. package/src/domain/quests/interpreter/dbscript/opcodes.ts +257 -0
  568. package/src/domain/quests/interpreter/dbscript/registry.ts +1194 -0
  569. package/src/domain/quests/interpreter/dbscript/registryAreatriggerScripts.ts +539 -0
  570. package/src/domain/quests/interpreter/dbscript/registryAshenvale.ts +553 -0
  571. package/src/domain/quests/interpreter/dbscript/registryAzshara.ts +272 -0
  572. package/src/domain/quests/interpreter/dbscript/registryDarkshore.ts +637 -0
  573. package/src/domain/quests/interpreter/dbscript/registryDesolace.ts +501 -0
  574. package/src/domain/quests/interpreter/dbscript/registryDustwallowMarsh.ts +735 -0
  575. package/src/domain/quests/interpreter/dbscript/registryFelwood.ts +493 -0
  576. package/src/domain/quests/interpreter/dbscript/registryFeralas.ts +485 -0
  577. package/src/domain/quests/interpreter/dbscript/registryGoScripts.ts +203 -0
  578. package/src/domain/quests/interpreter/dbscript/registryMoonglade.ts +288 -0
  579. package/src/domain/quests/interpreter/dbscript/registryNpcProfessions.ts +230 -0
  580. package/src/domain/quests/interpreter/dbscript/registryNpcsSpecial.ts +545 -0
  581. package/src/domain/quests/interpreter/dbscript/registryRazorfenDowns.ts +293 -0
  582. package/src/domain/quests/interpreter/dbscript/registryRazorfenKraul.ts +221 -0
  583. package/src/domain/quests/interpreter/dbscript/registryRedridge.ts +112 -0
  584. package/src/domain/quests/interpreter/dbscript/registrySearingGorge.ts +125 -0
  585. package/src/domain/quests/interpreter/dbscript/registrySiblings.ts +51 -0
  586. package/src/domain/quests/interpreter/dbscript/registrySilverpineForest.ts +172 -0
  587. package/src/domain/quests/interpreter/dbscript/registryStonetalonMountains.ts +180 -0
  588. package/src/domain/quests/interpreter/dbscript/registryStormwindCity.ts +369 -0
  589. package/src/domain/quests/interpreter/dbscript/registryStranglethornVale.ts +115 -0
  590. package/src/domain/quests/interpreter/dbscript/registryStratholme.ts +146 -0
  591. package/src/domain/quests/interpreter/dbscript/registrySunkenTemple.ts +149 -0
  592. package/src/domain/quests/interpreter/dbscript/registrySwampOfSorrows.ts +163 -0
  593. package/src/domain/quests/interpreter/dbscript/registryTanaris.ts +318 -0
  594. package/src/domain/quests/interpreter/dbscript/registryTeldrassil.ts +120 -0
  595. package/src/domain/quests/interpreter/dbscript/registryTheBarrens.ts +603 -0
  596. package/src/domain/quests/interpreter/dbscript/registryThousandNeedles.ts +499 -0
  597. package/src/domain/quests/interpreter/dbscript/registryTirisfalGlades.ts +222 -0
  598. package/src/domain/quests/interpreter/dbscript/registryUngoroCrater.ts +291 -0
  599. package/src/domain/quests/interpreter/dbscript/registryWarEffort.ts +773 -0
  600. package/src/domain/quests/interpreter/dbscript/registryWesternPlaguelands.ts +206 -0
  601. package/src/domain/quests/interpreter/dbscript/registryWestfall.ts +190 -0
  602. package/src/domain/quests/interpreter/dbscript/registryWetlands.ts +186 -0
  603. package/src/domain/quests/interpreter/dbscript/registryWinterspring.ts +235 -0
  604. package/src/domain/quests/interpreter/dbscript/types.ts +817 -0
  605. package/src/domain/quests/interpreter/dbscript/vm.ts +171 -0
  606. package/src/domain/quests/interpreter/diff.ts +349 -0
  607. package/src/domain/quests/interpreter/fixtures/oracle-questlog-qi2.json +2417 -0
  608. package/src/domain/quests/interpreter/flags.ts +101 -0
  609. package/src/domain/quests/interpreter/index.ts +113 -0
  610. package/src/domain/quests/interpreter/live.ts +178 -0
  611. package/src/domain/quests/interpreter/types.ts +81 -0
  612. package/src/domain/quests/interpreter/updaters.ts +412 -0
  613. package/src/domain/quests/questCorpseUse.ts +155 -0
  614. package/src/domain/quests/questDialog.ts +43 -0
  615. package/src/domain/quests/questFight.ts +34 -0
  616. package/src/domain/quests/questObjectiveLabel.ts +39 -0
  617. package/src/domain/quests/questRewardChoice.ts +85 -0
  618. package/src/domain/quests/questScriptCredit.ts +26 -0
  619. package/src/domain/quests/questScriptItemUse.ts +74 -0
  620. package/src/domain/quests/questTameRods.ts +79 -0
  621. package/src/domain/quests/questlog.ts +1545 -0
  622. package/src/domain/quests/talkDeliver.ts +170 -0
  623. package/src/domain/raid/globalActionBar.ts +195 -0
  624. package/src/domain/raid/instanceRoster.ts +194 -0
  625. package/src/domain/raid/partySummon.ts +198 -0
  626. package/src/domain/raid/partyVault.ts +320 -0
  627. package/src/domain/raid/raidBossAbilities.ts +268 -0
  628. package/src/domain/raid/raidComp.ts +335 -0
  629. package/src/domain/raid/raidCustomRows.ts +453 -0
  630. package/src/domain/raid/raidEncounterGear.ts +298 -0
  631. package/src/domain/raid/raidEncounterTactics.ts +412 -0
  632. package/src/domain/raid/raidPlan.ts +509 -0
  633. package/src/domain/raid/raidPlanEdits.ts +98 -0
  634. package/src/domain/raid/raidPlanPacks.ts +480 -0
  635. package/src/domain/raid/raidRecovery.ts +183 -0
  636. package/src/domain/raid/raidRosterTemplate.ts +138 -0
  637. package/src/domain/rotation/auraSide.ts +68 -0
  638. package/src/domain/rotation/build.ts +3031 -0
  639. package/src/domain/rotation/classes/druid.ts +58 -0
  640. package/src/domain/rotation/classes/hooks.ts +59 -0
  641. package/src/domain/rotation/classes/hunter.ts +156 -0
  642. package/src/domain/rotation/classes/index.ts +104 -0
  643. package/src/domain/rotation/classes/mage.ts +99 -0
  644. package/src/domain/rotation/classes/paladin.ts +296 -0
  645. package/src/domain/rotation/classes/priest.ts +94 -0
  646. package/src/domain/rotation/classes/pullOpener.ts +92 -0
  647. package/src/domain/rotation/classes/rogue.ts +69 -0
  648. package/src/domain/rotation/classes/shaman.ts +29 -0
  649. package/src/domain/rotation/classes/supportSpec.ts +94 -0
  650. package/src/domain/rotation/classes/warlock.ts +81 -0
  651. package/src/domain/rotation/classes/warrior.ts +402 -0
  652. package/src/domain/rotation/classify.ts +1381 -0
  653. package/src/domain/rotation/condMetricPicker.ts +379 -0
  654. package/src/domain/rotation/consumables.ts +242 -0
  655. package/src/domain/rotation/evaluate.ts +1115 -0
  656. package/src/domain/rotation/finisherLadder.ts +145 -0
  657. package/src/domain/rotation/invent.ts +938 -0
  658. package/src/domain/rotation/killOrder.ts +30 -0
  659. package/src/domain/rotation/openerForm.ts +22 -0
  660. package/src/domain/rotation/paladinBuffs.ts +568 -0
  661. package/src/domain/rotation/prebuff.ts +283 -0
  662. package/src/domain/rotation/raidRowTuning.ts +34 -0
  663. package/src/domain/rotation/rotation.ts +11 -0
  664. package/src/domain/rotation/rotationProfiles.ts +180 -0
  665. package/src/domain/rotation/rotationSuggestions.ts +851 -0
  666. package/src/domain/rotation/ruleAfterChain.ts +49 -0
  667. package/src/domain/rotation/spec.ts +70 -0
  668. package/src/domain/rotation/spellPicker.ts +140 -0
  669. package/src/domain/rotation/stand.ts +143 -0
  670. package/src/domain/rotation/types.ts +718 -0
  671. package/src/domain/run/battlegroundRun.ts +111 -0
  672. package/src/domain/run/canEnterContext.ts +32 -0
  673. package/src/domain/run/death.ts +561 -0
  674. package/src/domain/run/deathRecovery.ts +289 -0
  675. package/src/domain/run/duel.ts +141 -0
  676. package/src/domain/run/dungeonRun.ts +344 -0
  677. package/src/domain/run/floorRest.ts +159 -0
  678. package/src/domain/run/honor.ts +557 -0
  679. package/src/domain/run/honorWeek.ts +180 -0
  680. package/src/domain/run/whenMap.ts +977 -0
  681. package/src/domain/scriptdev/arathiHighlands.ts +445 -0
  682. package/src/domain/scriptdev/ashenvale.ts +635 -0
  683. package/src/domain/scriptdev/ashenvaleHelpers.ts +1215 -0
  684. package/src/domain/scriptdev/azshara.ts +892 -0
  685. package/src/domain/scriptdev/blackfathomDeeps.ts +212 -0
  686. package/src/domain/scriptdev/blackrockDepths.ts +1434 -0
  687. package/src/domain/scriptdev/blackrockSpire.ts +730 -0
  688. package/src/domain/scriptdev/blackwingLair.ts +521 -0
  689. package/src/domain/scriptdev/burningSteppes.ts +62 -0
  690. package/src/domain/scriptdev/classFilter.ts +43 -0
  691. package/src/domain/scriptdev/darkshore.ts +817 -0
  692. package/src/domain/scriptdev/darkshoreHelpers.ts +853 -0
  693. package/src/domain/scriptdev/deadmines.ts +331 -0
  694. package/src/domain/scriptdev/desolace.ts +1239 -0
  695. package/src/domain/scriptdev/direMaul.ts +859 -0
  696. package/src/domain/scriptdev/durotar.ts +532 -0
  697. package/src/domain/scriptdev/dustwallowMarsh.ts +758 -0
  698. package/src/domain/scriptdev/dustwallowMarshHelpers.ts +994 -0
  699. package/src/domain/scriptdev/easternPlaguelands.ts +21 -0
  700. package/src/domain/scriptdev/felwood.ts +1055 -0
  701. package/src/domain/scriptdev/feralas.ts +571 -0
  702. package/src/domain/scriptdev/feralasHelpers.ts +838 -0
  703. package/src/domain/scriptdev/gnomeregan.ts +466 -0
  704. package/src/domain/scriptdev/guards.ts +616 -0
  705. package/src/domain/scriptdev/hinterlands.ts +693 -0
  706. package/src/domain/scriptdev/host.ts +1134 -0
  707. package/src/domain/scriptdev/index.ts +123 -0
  708. package/src/domain/scriptdev/instanceRaids.ts +136 -0
  709. package/src/domain/scriptdev/itemScripts.ts +37 -0
  710. package/src/domain/scriptdev/lochModan.ts +283 -0
  711. package/src/domain/scriptdev/maraudon.ts +232 -0
  712. package/src/domain/scriptdev/moltenCore.ts +831 -0
  713. package/src/domain/scriptdev/moonglade.ts +659 -0
  714. package/src/domain/scriptdev/moongladeHelpers.ts +933 -0
  715. package/src/domain/scriptdev/naxxramas.ts +577 -0
  716. package/src/domain/scriptdev/naxxramasConstruct.ts +364 -0
  717. package/src/domain/scriptdev/naxxramasFrostwyrm.ts +378 -0
  718. package/src/domain/scriptdev/naxxramasMilitary.ts +276 -0
  719. package/src/domain/scriptdev/npcProfessions.ts +1025 -0
  720. package/src/domain/scriptdev/npcsSpecial.ts +1379 -0
  721. package/src/domain/scriptdev/onyxiasLair.ts +313 -0
  722. package/src/domain/scriptdev/orgrimmar.ts +147 -0
  723. package/src/domain/scriptdev/professionSpecConsumer.ts +481 -0
  724. package/src/domain/scriptdev/razorfenDowns.ts +468 -0
  725. package/src/domain/scriptdev/razorfenKraul.ts +410 -0
  726. package/src/domain/scriptdev/redridgeMountains.ts +163 -0
  727. package/src/domain/scriptdev/registry.ts +945 -0
  728. package/src/domain/scriptdev/ruinsOfAhnqiraj.ts +356 -0
  729. package/src/domain/scriptdev/scarletMonastery.ts +713 -0
  730. package/src/domain/scriptdev/scholomance.ts +682 -0
  731. package/src/domain/scriptdev/searingGorge.ts +295 -0
  732. package/src/domain/scriptdev/shadowfangKeep.ts +181 -0
  733. package/src/domain/scriptdev/silithus.ts +71 -0
  734. package/src/domain/scriptdev/silverpineForest.ts +662 -0
  735. package/src/domain/scriptdev/stonetalonMountains.ts +493 -0
  736. package/src/domain/scriptdev/stormwindCity.ts +1192 -0
  737. package/src/domain/scriptdev/stranglethornVale.ts +402 -0
  738. package/src/domain/scriptdev/stratholme.ts +650 -0
  739. package/src/domain/scriptdev/stratholmeScripts.ts +505 -0
  740. package/src/domain/scriptdev/sunkenTemple.ts +736 -0
  741. package/src/domain/scriptdev/swampOfSorrows.ts +22 -0
  742. package/src/domain/scriptdev/tanaris.ts +391 -0
  743. package/src/domain/scriptdev/tanarisHelpers.ts +661 -0
  744. package/src/domain/scriptdev/teldrassil.ts +143 -0
  745. package/src/domain/scriptdev/templeOfAhnqiraj.ts +1013 -0
  746. package/src/domain/scriptdev/theBarrens.ts +709 -0
  747. package/src/domain/scriptdev/theBarrensHelpers.ts +1026 -0
  748. package/src/domain/scriptdev/thousandNeedles.ts +426 -0
  749. package/src/domain/scriptdev/thousandNeedlesHelpers.ts +566 -0
  750. package/src/domain/scriptdev/tirisfalGlades.ts +533 -0
  751. package/src/domain/scriptdev/types.ts +1026 -0
  752. package/src/domain/scriptdev/uldaman.ts +437 -0
  753. package/src/domain/scriptdev/ungoroCrater.ts +549 -0
  754. package/src/domain/scriptdev/ungoroCraterHelpers.ts +1006 -0
  755. package/src/domain/scriptdev/wailingCaverns.ts +700 -0
  756. package/src/domain/scriptdev/warEffort.ts +371 -0
  757. package/src/domain/scriptdev/westernPlaguelands.ts +952 -0
  758. package/src/domain/scriptdev/westfall.ts +767 -0
  759. package/src/domain/scriptdev/wetlands.ts +660 -0
  760. package/src/domain/scriptdev/winterspring.ts +482 -0
  761. package/src/domain/scriptdev/winterspringHelpers.ts +801 -0
  762. package/src/domain/scriptdev/worldBosses.ts +605 -0
  763. package/src/domain/scriptdev/zulfarrak.ts +478 -0
  764. package/src/domain/scriptdev/zulgurub.ts +1152 -0
  765. package/src/domain/sim/dummySim.ts +408 -0
  766. package/src/domain/sim/targetDummy.ts +29 -0
  767. package/src/domain/social/guild.ts +148 -0
  768. package/src/domain/spells/areaAuraMembership.ts +93 -0
  769. package/src/domain/spells/breakableStunCc.ts +166 -0
  770. package/src/domain/spells/cancelAura.ts +80 -0
  771. package/src/domain/spells/diminishing.ts +167 -0
  772. package/src/domain/spells/dispel.ts +149 -0
  773. package/src/domain/spells/dispelMechanic.ts +105 -0
  774. package/src/domain/spells/equipSpells.ts +247 -0
  775. package/src/domain/spells/learnOnTargets.ts +260 -0
  776. package/src/domain/spells/mergeSchoolImmunityFromRaw.ts +66 -0
  777. package/src/domain/spells/resurrectSpell.ts +124 -0
  778. package/src/domain/spells/spellPushback.ts +39 -0
  779. package/src/domain/spells/spellReflect.ts +43 -0
  780. package/src/domain/spells/stealth.ts +183 -0
  781. package/src/domain/spells/totem.ts +394 -0
  782. package/src/domain/spells/worldCast.ts +187 -0
  783. package/src/domain/world/areaTriggerLocks.ts +177 -0
  784. package/src/domain/world/dungeonMusic.ts +108 -0
  785. package/src/domain/world/gameEvents.ts +119 -0
  786. package/src/domain/world/gameObjects.ts +1030 -0
  787. package/src/domain/world/goEventFire.ts +234 -0
  788. package/src/domain/world/goMoTransport.ts +74 -0
  789. package/src/domain/world/goTransport.ts +81 -0
  790. package/src/domain/world/hazards.ts +459 -0
  791. package/src/domain/world/openLock.ts +398 -0
  792. package/src/domain/world/pools.ts +470 -0
  793. package/src/domain/world/restArea.ts +37 -0
  794. package/src/domain/world/weather.ts +201 -0
  795. package/src/domain/zoneAmbience.mjs +87 -0
  796. package/src/domain/zoneMusic.mjs +62 -0
  797. package/src/domain/zoneMusicQueue.mjs +7 -0
  798. package/src/engine/combat/activeSeal.ts +39 -0
  799. package/src/engine/combat/aiTargetResolve.ts +64 -0
  800. package/src/engine/combat/aoeCast.ts +289 -0
  801. package/src/engine/combat/applyConsumeAura.ts +74 -0
  802. package/src/engine/combat/applyDemonicSacrifice.ts +70 -0
  803. package/src/engine/combat/applyDispelMechanic.ts +30 -0
  804. package/src/engine/combat/applyHealEffect.ts +301 -0
  805. package/src/engine/combat/applySchoolAbsorb.ts +114 -0
  806. package/src/engine/combat/applySpell.ts +3169 -0
  807. package/src/engine/combat/applySpellLate.ts +2026 -0
  808. package/src/engine/combat/applySpellLateBag.ts +144 -0
  809. package/src/engine/combat/areaAura.ts +283 -0
  810. package/src/engine/combat/attackTable.ts +508 -0
  811. package/src/engine/combat/battleRez.ts +87 -0
  812. package/src/engine/combat/castAction.ts +36 -0
  813. package/src/engine/combat/castTargetGates.ts +75 -0
  814. package/src/engine/combat/castableKit.ts +68 -0
  815. package/src/engine/combat/ccMirrorUpgrade.ts +39 -0
  816. package/src/engine/combat/chainFan.ts +210 -0
  817. package/src/engine/combat/channel.ts +423 -0
  818. package/src/engine/combat/chaseCloseness.ts +95 -0
  819. package/src/engine/combat/cmangosCastGates.ts +129 -0
  820. package/src/engine/combat/combatFlag.ts +77 -0
  821. package/src/engine/combat/combatGeometry.ts +1329 -0
  822. package/src/engine/combat/combustion.ts +68 -0
  823. package/src/engine/combat/context.ts +730 -0
  824. package/src/engine/combat/createSession.ts +1165 -0
  825. package/src/engine/combat/creatureLeash.ts +38 -0
  826. package/src/engine/combat/crowdControl.ts +1259 -0
  827. package/src/engine/combat/dispelDuty.ts +54 -0
  828. package/src/engine/combat/dispelReflect.ts +609 -0
  829. package/src/engine/combat/displaceFloor.ts +113 -0
  830. package/src/engine/combat/duelBounds.ts +47 -0
  831. package/src/engine/combat/equippedItemGate.ts +297 -0
  832. package/src/engine/combat/evadeLifecycle.ts +63 -0
  833. package/src/engine/combat/eventAi.ts +2220 -0
  834. package/src/engine/combat/facing.ts +74 -0
  835. package/src/engine/combat/fearFlee.ts +137 -0
  836. package/src/engine/combat/fighterFactory.ts +1144 -0
  837. package/src/engine/combat/forceDespawnAction.ts +51 -0
  838. package/src/engine/combat/formulas.ts +807 -0
  839. package/src/engine/combat/friendlyFan.ts +55 -0
  840. package/src/engine/combat/groundPoolTick.ts +210 -0
  841. package/src/engine/combat/hazards.ts +114 -0
  842. package/src/engine/combat/healTargets.ts +226 -0
  843. package/src/engine/combat/heartbeatResist.ts +49 -0
  844. package/src/engine/combat/hostileItemUse.ts +75 -0
  845. package/src/engine/combat/interruptAuras.ts +66 -0
  846. package/src/engine/combat/itemRescue.ts +49 -0
  847. package/src/engine/combat/itemUse.ts +260 -0
  848. package/src/engine/combat/kitById.ts +23 -0
  849. package/src/engine/combat/knockBack.ts +201 -0
  850. package/src/engine/combat/leap.ts +89 -0
  851. package/src/engine/combat/mitigation.ts +587 -0
  852. package/src/engine/combat/modTaunt.ts +43 -0
  853. package/src/engine/combat/motionClaim.ts +268 -0
  854. package/src/engine/combat/motionGate.ts +150 -0
  855. package/src/engine/combat/motionGenerator.ts +27 -0
  856. package/src/engine/combat/navSight.ts +138 -0
  857. package/src/engine/combat/perfSink.ts +28 -0
  858. package/src/engine/combat/periodicDue.ts +55 -0
  859. package/src/engine/combat/petAuras.ts +86 -0
  860. package/src/engine/combat/pickAction.ts +3449 -0
  861. package/src/engine/combat/powerForm.ts +735 -0
  862. package/src/engine/combat/powerPools.ts +49 -0
  863. package/src/engine/combat/predicates.ts +538 -0
  864. package/src/engine/combat/procsDamage.ts +1823 -0
  865. package/src/engine/combat/reactiveGates.ts +135 -0
  866. package/src/engine/combat/roles.ts +389 -0
  867. package/src/engine/combat/rotationSubject.ts +78 -0
  868. package/src/engine/combat/ruleAfter.ts +106 -0
  869. package/src/engine/combat/seedDisplayAuras.ts +203 -0
  870. package/src/engine/combat/seedOocEffects.ts +317 -0
  871. package/src/engine/combat/seedSchoolImmunities.ts +45 -0
  872. package/src/engine/combat/session-types.ts +458 -0
  873. package/src/engine/combat/sessionApi.ts +1785 -0
  874. package/src/engine/combat/sessionCharge.ts +124 -0
  875. package/src/engine/combat/sessionChase.ts +869 -0
  876. package/src/engine/combat/sessionDeaths.ts +469 -0
  877. package/src/engine/combat/sessionFocus.ts +506 -0
  878. package/src/engine/combat/sessionFollow.ts +167 -0
  879. package/src/engine/combat/sessionGeometry.ts +188 -0
  880. package/src/engine/combat/sessionHome.ts +75 -0
  881. package/src/engine/combat/sessionInject.ts +719 -0
  882. package/src/engine/combat/sessionMechanicMove.ts +555 -0
  883. package/src/engine/combat/sessionMotion.ts +1553 -0
  884. package/src/engine/combat/sessionMotionKit.ts +247 -0
  885. package/src/engine/combat/sessionMoveIntent.ts +49 -0
  886. package/src/engine/combat/sessionMoveOrder.ts +200 -0
  887. package/src/engine/combat/sessionPathTo.ts +657 -0
  888. package/src/engine/combat/sessionPools.ts +688 -0
  889. package/src/engine/combat/sessionSteer.ts +144 -0
  890. package/src/engine/combat/sessionStepBack.ts +151 -0
  891. package/src/engine/combat/sessionStepWrap.ts +116 -0
  892. package/src/engine/combat/sessionView.ts +442 -0
  893. package/src/engine/combat/simEffects.ts +32 -0
  894. package/src/engine/combat/simFacade.ts +620 -0
  895. package/src/engine/combat/simPump.ts +264 -0
  896. package/src/engine/combat/simSnapshot.ts +165 -0
  897. package/src/engine/combat/simThreadPool.ts +35 -0
  898. package/src/engine/combat/skeramImages.ts +57 -0
  899. package/src/engine/combat/slowUpdate.ts +178 -0
  900. package/src/engine/combat/snapToFloor.ts +42 -0
  901. package/src/engine/combat/speedAura.ts +29 -0
  902. package/src/engine/combat/spellReagents.ts +71 -0
  903. package/src/engine/combat/stealthDetect.ts +93 -0
  904. package/src/engine/combat/stepBackMotion.ts +171 -0
  905. package/src/engine/combat/stepSession.ts +3102 -0
  906. package/src/engine/combat/summonCast.ts +243 -0
  907. package/src/engine/combat/thaddiusPolarity.ts +97 -0
  908. package/src/engine/combat/threat.ts +388 -0
  909. package/src/engine/combat/threatOps.ts +272 -0
  910. package/src/engine/combat/tickWorkerBody.ts +211 -0
  911. package/src/engine/combat/totemAuras.ts +122 -0
  912. package/src/engine/combat/triggerPayload.ts +42 -0
  913. package/src/engine/combat/triggeredCompanion.ts +63 -0
  914. package/src/engine/combat/types.ts +1897 -0
  915. package/src/engine/combat/useObjectTrap.ts +140 -0
  916. package/src/engine/combat/walkSurface.ts +54 -0
  917. package/src/engine/combat/weapon.ts +1248 -0
  918. package/src/engine/combat/worldFrame.ts +43 -0
  919. package/src/engine/combat.solo-golden.json +2242 -0
  920. package/src/engine/combat.ts +84 -0
  921. package/src/engine/core/detMath.ts +289 -0
  922. package/src/engine/core/events.ts +357 -0
  923. package/src/engine/core/rng.ts +36 -0
  924. package/src/engine/game/actionBars.ts +124 -0
  925. package/src/engine/game/activateObjectFromSpell.ts +320 -0
  926. package/src/engine/game/applyActiveObjectFromDbScript.ts +98 -0
  927. package/src/engine/game/applyDeathAndSpellScripts.ts +268 -0
  928. package/src/engine/game/applyDoorFromDbScript.ts +388 -0
  929. package/src/engine/game/applyEscortFromDbScript.ts +290 -0
  930. package/src/engine/game/applyGoSpellcasterCast.ts +40 -0
  931. package/src/engine/game/applyHoverFromDbScript.ts +110 -0
  932. package/src/engine/game/applyOocResurrect.ts +71 -0
  933. package/src/engine/game/applySpellDurability.ts +115 -0
  934. package/src/engine/game/applyTailFromDbScript.ts +478 -0
  935. package/src/engine/game/applyTerminateFromDbScript.ts +95 -0
  936. package/src/engine/game/auctionMail.ts +269 -0
  937. package/src/engine/game/bagOverflow.ts +130 -0
  938. package/src/engine/game/bank.ts +110 -0
  939. package/src/engine/game/barAutofill.ts +26 -0
  940. package/src/engine/game/battleground.ts +369 -0
  941. package/src/engine/game/combatEnemySpec.ts +216 -0
  942. package/src/engine/game/combatObjectTraps.ts +167 -0
  943. package/src/engine/game/combatSeed.ts +320 -0
  944. package/src/engine/game/combatSession.ts +3241 -0
  945. package/src/engine/game/combatSessionClock.ts +62 -0
  946. package/src/engine/game/companionQuestActions.ts +242 -0
  947. package/src/engine/game/companionTraining.ts +40 -0
  948. package/src/engine/game/consumables.ts +624 -0
  949. package/src/engine/game/context.ts +53 -0
  950. package/src/engine/game/createHealthstone.ts +45 -0
  951. package/src/engine/game/deathFlow.ts +127 -0
  952. package/src/engine/game/devGrant.ts +117 -0
  953. package/src/engine/game/dynamicObject.ts +365 -0
  954. package/src/engine/game/enchantItem.ts +177 -0
  955. package/src/engine/game/equipmentHelper.ts +806 -0
  956. package/src/engine/game/factionState.ts +108 -0
  957. package/src/engine/game/garmentsOoc.ts +69 -0
  958. package/src/engine/game/globalActionBar.ts +179 -0
  959. package/src/engine/game/goInteractQuestCredit.ts +51 -0
  960. package/src/engine/game/goMoTransportUse.ts +61 -0
  961. package/src/engine/game/goTransportUse.ts +60 -0
  962. package/src/engine/game/healthstoneUpkeep.ts +59 -0
  963. package/src/engine/game/killSkin.ts +124 -0
  964. package/src/engine/game/learnFromItem.ts +118 -0
  965. package/src/engine/game/loadReconcile.ts +551 -0
  966. package/src/engine/game/loot.ts +294 -0
  967. package/src/engine/game/macros.ts +125 -0
  968. package/src/engine/game/mail.ts +293 -0
  969. package/src/engine/game/meetingStoneQueue.ts +75 -0
  970. package/src/engine/game/meetingStoneUse.ts +54 -0
  971. package/src/engine/game/newGameState.ts +363 -0
  972. package/src/engine/game/oocAuraInterrupt.ts +92 -0
  973. package/src/engine/game/oocCast.ts +241 -0
  974. package/src/engine/game/oocCastEffects.ts +803 -0
  975. package/src/engine/game/oocCastMethods.ts +1077 -0
  976. package/src/engine/game/openLockFromSpell.ts +174 -0
  977. package/src/engine/game/outdoorPvp.ts +187 -0
  978. package/src/engine/game/outfitter.ts +644 -0
  979. package/src/engine/game/paladinBoard.ts +393 -0
  980. package/src/engine/game/partyAuras.ts +121 -0
  981. package/src/engine/game/persistCombatAuras.ts +91 -0
  982. package/src/engine/game/pets.ts +459 -0
  983. package/src/engine/game/prePullHealthstones.ts +154 -0
  984. package/src/engine/game/professions.ts +2227 -0
  985. package/src/engine/game/pruneStaleRuntime.ts +39 -0
  986. package/src/engine/game/questFightCredit.ts +36 -0
  987. package/src/engine/game/questItemOnCorpse.ts +166 -0
  988. package/src/engine/game/questItemOnCreature.ts +103 -0
  989. package/src/engine/game/questLog.ts +879 -0
  990. package/src/engine/game/questSpellComplete.ts +21 -0
  991. package/src/engine/game/questTurnIn.ts +598 -0
  992. package/src/engine/game/raidParty.ts +32 -0
  993. package/src/engine/game/reagentBuyIn.ts +39 -0
  994. package/src/engine/game/regenRest.ts +186 -0
  995. package/src/engine/game/rotation.ts +425 -0
  996. package/src/engine/game/runFullDungeon.ts +611 -0
  997. package/src/engine/game/runSupply.ts +80 -0
  998. package/src/engine/game/sanitizeDriftedItems.ts +135 -0
  999. package/src/engine/game/scriptDevGoUse.ts +397 -0
  1000. package/src/engine/game/scriptDevInnkeeper.ts +150 -0
  1001. package/src/engine/game/scriptDevProfessionSpec.ts +99 -0
  1002. package/src/engine/game/sendEventFromSpell.ts +87 -0
  1003. package/src/engine/game/sortContainers.ts +85 -0
  1004. package/src/engine/game/spellReputation.ts +69 -0
  1005. package/src/engine/game/squad/squadDungeonSeating.ts +197 -0
  1006. package/src/engine/game/squadDungeon.ts +4222 -0
  1007. package/src/engine/game/squadQuestShare.ts +260 -0
  1008. package/src/engine/game/summonObjectSlot.ts +69 -0
  1009. package/src/engine/game/summonObjectWild.ts +73 -0
  1010. package/src/engine/game/summoningRitualUse.ts +141 -0
  1011. package/src/engine/game/talents.ts +356 -0
  1012. package/src/engine/game/tamingRodUse.ts +66 -0
  1013. package/src/engine/game/tempSpawnCreature.ts +136 -0
  1014. package/src/engine/game/tickDungeonPatrolScripts.ts +205 -0
  1015. package/src/engine/game/tickTimedQuests.ts +28 -0
  1016. package/src/engine/game/trade.ts +586 -0
  1017. package/src/engine/game/travel.ts +1155 -0
  1018. package/src/engine/game/types.ts +1855 -0
  1019. package/src/engine/game/vendorOffers.ts +244 -0
  1020. package/src/engine/game/weaponImbueItem.ts +281 -0
  1021. package/src/engine/game/worldSession.ts +183 -0
  1022. package/src/engine/game/worldState.ts +166 -0
  1023. package/src/engine/game.ts +968 -0
  1024. package/src/engine/spells/GAP.md +67 -0
  1025. package/src/engine/spells/absorbs.ts +376 -0
  1026. package/src/engine/spells/addTargetTrigger.ts +53 -0
  1027. package/src/engine/spells/auraPerSecondCost.ts +50 -0
  1028. package/src/engine/spells/auraStacking.ts +497 -0
  1029. package/src/engine/spells/cmangos-special-cases-combustion.ts +13 -0
  1030. package/src/engine/spells/cmangos-special-cases-s18.ts +445 -0
  1031. package/src/engine/spells/cmangos-special-cases-s19.ts +324 -0
  1032. package/src/engine/spells/cmangos-special-cases-s20.ts +385 -0
  1033. package/src/engine/spells/cmangos-special-cases-s21.ts +116 -0
  1034. package/src/engine/spells/cmangos-special-cases-s22.ts +24 -0
  1035. package/src/engine/spells/cmangos-special-cases-s23.ts +52 -0
  1036. package/src/engine/spells/cmangos-special-cases.ts +1570 -0
  1037. package/src/engine/spells/conditions.ts +718 -0
  1038. package/src/engine/spells/effects.ts +203 -0
  1039. package/src/engine/spells/fixtures/oracle-effects-lock9a.json +1 -0
  1040. package/src/engine/spells/immunity.ts +942 -0
  1041. package/src/engine/spells/intentEffects.ts +351 -0
  1042. package/src/engine/spells/interpreter/GAPS.md +21 -0
  1043. package/src/engine/spells/interpreter/amount.ts +109 -0
  1044. package/src/engine/spells/interpreter/class-scripts-kit.ts +478 -0
  1045. package/src/engine/spells/interpreter/diff.ts +246 -0
  1046. package/src/engine/spells/interpreter/duration.ts +90 -0
  1047. package/src/engine/spells/interpreter/form-attrs.json +1 -0
  1048. package/src/engine/spells/interpreter/form-attrs.ts +95 -0
  1049. package/src/engine/spells/interpreter/handlers/aura-remove.ts +113 -0
  1050. package/src/engine/spells/interpreter/handlers/auras-control.ts +1547 -0
  1051. package/src/engine/spells/interpreter/handlers/auras-core.ts +1583 -0
  1052. package/src/engine/spells/interpreter/handlers/auras-misc.ts +1774 -0
  1053. package/src/engine/spells/interpreter/handlers/effect-disenchant.ts +17 -0
  1054. package/src/engine/spells/interpreter/handlers/effect-skinning.ts +20 -0
  1055. package/src/engine/spells/interpreter/handlers/effects-action-utility.ts +1455 -0
  1056. package/src/engine/spells/interpreter/handlers/effects-core.ts +432 -0
  1057. package/src/engine/spells/interpreter/handlers/effects-remainder.ts +105 -0
  1058. package/src/engine/spells/interpreter/handlers/effects-summon-item.ts +687 -0
  1059. package/src/engine/spells/interpreter/handlers/mod-increase-energy-percent.ts +36 -0
  1060. package/src/engine/spells/interpreter/handlers/mod-increase-energy.ts +36 -0
  1061. package/src/engine/spells/interpreter/handlers/periodic-trigger-zero.ts +327 -0
  1062. package/src/engine/spells/interpreter/handlers/procs.ts +131 -0
  1063. package/src/engine/spells/interpreter/handlers/registry.ts +975 -0
  1064. package/src/engine/spells/interpreter/handlers/shared.ts +667 -0
  1065. package/src/engine/spells/interpreter/handlers.ts +9 -0
  1066. package/src/engine/spells/interpreter/hunter-kit.ts +202 -0
  1067. package/src/engine/spells/interpreter/index.ts +525 -0
  1068. package/src/engine/spells/interpreter/item-triggers.ts +1121 -0
  1069. package/src/engine/spells/interpreter/lift-consume-energy.ts +37 -0
  1070. package/src/engine/spells/interpreter/mage-portals.ts +37 -0
  1071. package/src/engine/spells/interpreter/materialize-charm.ts +88 -0
  1072. package/src/engine/spells/interpreter/materialize-dispel-mechanic.ts +25 -0
  1073. package/src/engine/spells/interpreter/materialize-rating-buffs.ts +81 -0
  1074. package/src/engine/spells/interpreter/materialize-speed.ts +109 -0
  1075. package/src/engine/spells/interpreter/materialize-spell-magnet.ts +22 -0
  1076. package/src/engine/spells/interpreter/opcodes.ts +789 -0
  1077. package/src/engine/spells/interpreter/paladin-kit.ts +95 -0
  1078. package/src/engine/spells/interpreter/paladin-seals.ts +499 -0
  1079. package/src/engine/spells/interpreter/priest-warlock-kit.ts +135 -0
  1080. package/src/engine/spells/interpreter/proc.ts +443 -0
  1081. package/src/engine/spells/interpreter/registry/helpers.ts +16 -0
  1082. package/src/engine/spells/interpreter/registry/index.ts +216 -0
  1083. package/src/engine/spells/interpreter/registry/packs/class-abilities.ts +304 -0
  1084. package/src/engine/spells/interpreter/registry/packs/dire-maul.ts +44 -0
  1085. package/src/engine/spells/interpreter/registry/packs/dummy-script-tail.ts +1065 -0
  1086. package/src/engine/spells/interpreter/registry/packs/ex-wave-m.ts +70 -0
  1087. package/src/engine/spells/interpreter/registry/packs/life-tap.ts +107 -0
  1088. package/src/engine/spells/interpreter/registry/packs/paladin.ts +246 -0
  1089. package/src/engine/spells/interpreter/registry/packs/raid-script-summons.ts +26 -0
  1090. package/src/engine/spells/interpreter/registry/packs/raid-threat-wipe.ts +22 -0
  1091. package/src/engine/spells/interpreter/registry/packs/shaman.ts +214 -0
  1092. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-a.ts +269 -0
  1093. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-b.ts +370 -0
  1094. package/src/engine/spells/interpreter/registry/packs/si4-dummy-generic-c.ts +172 -0
  1095. package/src/engine/spells/interpreter/registry/packs/si4-dummy-hunter.ts +60 -0
  1096. package/src/engine/spells/interpreter/registry/packs/si4-dummy-warrior.ts +31 -0
  1097. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-a.ts +114 -0
  1098. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-b.ts +249 -0
  1099. package/src/engine/spells/interpreter/registry/packs/si4-script-generic-c.ts +233 -0
  1100. package/src/engine/spells/interpreter/registry/types.ts +48 -0
  1101. package/src/engine/spells/interpreter/talent-scripted.ts +329 -0
  1102. package/src/engine/spells/interpreter/targeting.ts +90 -0
  1103. package/src/engine/spells/interpreter/types-intent.ts +1501 -0
  1104. package/src/engine/spells/interpreter/types.ts +419 -0
  1105. package/src/engine/spells/interpreter/warrior-druid-kit.ts +314 -0
  1106. package/src/engine/spells/interpreter/weapon-imbue-kit.ts +384 -0
  1107. package/src/engine/spells/interrupt.ts +217 -0
  1108. package/src/engine/spells/meleeAttackReset.ts +60 -0
  1109. package/src/engine/spells/oocTriggerSpell.ts +49 -0
  1110. package/src/engine/spells/overrideClassScripts.ts +319 -0
  1111. package/src/engine/spells/parryHaste.ts +20 -0
  1112. package/src/engine/spells/procs.ts +300 -0
  1113. package/src/engine/spells/recovery.ts +203 -0
  1114. package/src/engine/spells/scriptTargetDest.ts +76 -0
  1115. package/src/engine/spells/scriptTargets.ts +85 -0
  1116. package/src/engine/spells/singleTargetAura.ts +82 -0
  1117. package/src/engine/spells/specialCasePayloads.ts +57 -0
  1118. package/src/engine/spells/spellAttributes.ts +249 -0
  1119. package/src/engine/spells/spellBonus.ts +143 -0
  1120. package/src/engine/spells/spellModIntents.ts +419 -0
  1121. package/src/engine/spells/spellMods.ts +283 -0
  1122. package/src/engine/spells/spellRadius.ts +15 -0
  1123. package/src/engine/spells/trapObjects.ts +26 -0
  1124. package/src/json.d.ts +7 -0
  1125. package/src/persistence/memoryRepository.ts +23 -0
  1126. package/src/persistence/saveBackups.ts +162 -0
  1127. package/src/persistence/saveFile.ts +68 -0
  1128. package/src/persistence/saveRepository.ts +11 -0
  1129. package/src/persistence/saveShape.ts +668 -0
  1130. package/src/progression/leveling.ts +89 -0
  1131. package/src/progression/rest.ts +1434 -0
  1132. package/src/progression/training.ts +226 -0
  1133. package/src/progression/xpGain.ts +369 -0
  1134. package/src/quests/quests.ts +1580 -0
  1135. package/src/world/aoePull.ts +198 -0
  1136. package/src/world/areaTableDbc.ts +39 -0
  1137. package/src/world/areaTableMapIdPairs.ts +141 -0
  1138. package/src/world/bakeSlug.ts +43 -0
  1139. package/src/world/continuousDungeon.ts +1250 -0
  1140. package/src/world/dungeonBakeProjection.ts +190 -0
  1141. package/src/world/dungeonMapDensity.ts +342 -0
  1142. package/src/world/dungeonMapProjection.ts +135 -0
  1143. package/src/world/dungeonNav.ts +904 -0
  1144. package/src/world/dungeonNpcSim.ts +147 -0
  1145. package/src/world/dungeonObjectives.ts +234 -0
  1146. package/src/world/dungeonPreset.ts +35 -0
  1147. package/src/world/dungeonRoute.ts +311 -0
  1148. package/src/world/dungeonRouteGeometry.ts +732 -0
  1149. package/src/world/dungeonRouteOrder.ts +1037 -0
  1150. package/src/world/dungeonWingRooms.ts +426 -0
  1151. package/src/world/escort.ts +296 -0
  1152. package/src/world/goPoolRoll.ts +75 -0
  1153. package/src/world/instanceObjects.ts +785 -0
  1154. package/src/world/instances.ts +1572 -0
  1155. package/src/world/meetingStones.ts +56 -0
  1156. package/src/world/navmeshFloors.ts +145 -0
  1157. package/src/world/nearGrid.ts +167 -0
  1158. package/src/world/packBudget.ts +613 -0
  1159. package/src/world/rareRoll.ts +335 -0
  1160. package/src/world/routeAuthoring.ts +132 -0
  1161. package/src/world/routeEdit.ts +209 -0
  1162. package/src/world/world.ts +812 -0
  1163. package/src/world/zoneHazards.ts +47 -0
@@ -0,0 +1,1379 @@
1
+ // World npcs_special ScriptDev IR ports. Source: scripts/world/npcs_special.cpp — the chicken,
2
+ // triage, garments, guardian, innkeeper, redemption, cleaner, void zone and target dummy.
3
+
4
+ import type { ScriptDevIR, ScriptDevAction, ScriptDevUnusedBinding } from './types.ts';
5
+ import { CAST_FLAG } from '../creature/creatureAiConstants.ts';
6
+
7
+ // Constants — chicken_cluck
8
+
9
+ /** Cite: npcs_special.cpp:52–53 EMOTE_CLUCK_TEXT1/2 */
10
+ export const EMOTE_CLUCK_TEXT1 = -1000204;
11
+ export const EMOTE_CLUCK_TEXT2 = -1000205;
12
+ /** Cite: npcs_special.cpp:55 QUEST_CLUCK = 3861 */
13
+ export const QUEST_CLUCK = 3861;
14
+ /** Cite: npcs_special.cpp:56–57 FACTION_FRIENDLY=35, FACTION_CHICKEN=31 */
15
+ export const FACTION_FRIENDLY_CLUCK = 35;
16
+ export const FACTION_CHICKEN = 31;
17
+ /** Cite: SharedDefines.h TEXTEMOTE_CHEER=21, TEXTEMOTE_CHICKEN=22 */
18
+ export const TEXTEMOTE_CHEER = 21;
19
+ export const TEXTEMOTE_CHICKEN = 22;
20
+ /** Cite: npcs_special.cpp:68 m_uiResetFlagTimer = 20000 */
21
+ export const CHICKEN_RESET_FLAG_TIMER_MS = 20_000;
22
+ /** Cite: npcs_special.cpp:76 urand(0, 49) — 1/50 chance on /chicken */
23
+ export const CHICKEN_EMOTE_CHANCE_DENOM = 50;
24
+ /** Cite: corpus boundCreatures entry 620 Chicken */
25
+ export const NPC_CHICKEN = 620;
26
+ /** Cite: Unit.h UNIT_NPC_FLAG_QUESTGIVER = 0x2 */
27
+ export const UNIT_NPC_FLAG_QUESTGIVER = 0x00000002;
28
+
29
+ // Constants — triage (doctor + injured patient)
30
+
31
+ /** Cite: npcs_special.cpp:117–119 SAY_DOC1/2/3 */
32
+ export const SAY_DOC1 = -1000201;
33
+ export const SAY_DOC2 = -1000202;
34
+ export const SAY_DOC3 = -1000203;
35
+ /** Cite: npcs_special.cpp:121–122 QUEST_TRIAGE_H=6622, QUEST_TRIAGE_A=6624 */
36
+ export const QUEST_TRIAGE_H = 6622;
37
+ export const QUEST_TRIAGE_A = 6624;
38
+ /** Cite: npcs_special.cpp:124–125 DOCTOR_ALLIANCE=12939, DOCTOR_HORDE=12920 */
39
+ export const DOCTOR_ALLIANCE = 12939;
40
+ export const DOCTOR_HORDE = 12920;
41
+ /** Cite: npcs_special.cpp:126–127 ALLIANCE_COORDS=7, HORDE_COORDS=6 */
42
+ export const ALLIANCE_COORDS_COUNT = 7;
43
+ export const HORDE_COORDS_COUNT = 6;
44
+ /** Cite: npcs_special.cpp:166–178 AllianceSoldierId / HordeSoldierId */
45
+ export const ALLIANCE_SOLDIER_IDS = [12938, 12936, 12937] as const;
46
+ export const HORDE_SOLDIER_IDS = [12923, 12924, 12925] as const;
47
+ /** Cite: npcs_special.cpp:205 / 359 m_uiSummonPatientTimer = 10000 */
48
+ export const SUMMON_PATIENT_TIMER_MS = 10_000;
49
+ /** Cite: npcs_special.cpp:442 m_uiSummonPatientCount >= 21 */
50
+ export const MAX_PATIENT_SUMMONS = 21;
51
+ /** Cite: npcs_special.cpp:414 m_uiPatientSavedCount == 15 */
52
+ export const PATIENTS_SAVED_SUCCESS = 15;
53
+ /** Cite: npcs_special.cpp:388 m_uiPatientDiedCount > 5 (6 deaths fail) */
54
+ export const PATIENTS_DIED_FAIL = 6;
55
+ /** Cite: npcs_special.cpp:464 TEMPSPAWN despawn 5000 */
56
+ export const PATIENT_DESPAWN_MS = 5000;
57
+ /** Cite: npcs_special.cpp:273 SpellHit pSpell->Id == 20804 (Triage Bandage) */
58
+ export const SPELL_TRIAGE_BANDAGE = 20804;
59
+ /** Cite: npcs_special.cpp:147–149 / 162–164 run-to coords */
60
+ export const A_RUNTOX = -3742.96;
61
+ export const A_RUNTOY = -4531.52;
62
+ export const A_RUNTOZ = 11.91;
63
+ export const H_RUNTOX = -1016.44;
64
+ export const H_RUNTOY = -3508.48;
65
+ export const H_RUNTOZ = 62.96;
66
+ /** Cite: npcs_special.cpp:258 / 262 / 266 health fractions */
67
+ export const PATIENT_HP_INJURED = 0.75;
68
+ export const PATIENT_HP_BADLY = 0.5;
69
+ export const PATIENT_HP_CRITICAL = 0.25;
70
+ /** Cite: npcs_special.cpp:324 uiHPLose = 0.05f * uiDiff (per ms) */
71
+ export const PATIENT_HP_LOSE_PER_MS = 0.05;
72
+ /** Cite: npcs_special.cpp:135–159 AllianceCoords×7 / HordeCoords×6 bunk points */
73
+
74
+ // Constants — garments_of_quests
75
+
76
+ /** Cite: npcs_special.cpp:508–509 SPELL_LESSER_HEAL_R2 / SPELL_FORTITUDE_R1 */
77
+ export const SPELL_LESSER_HEAL_R2 = 2052;
78
+ export const SPELL_FORTITUDE_R1 = 1243;
79
+ /** Cite: npcs_special.cpp:511–515 quests */
80
+ export const QUEST_MOON = 5621;
81
+ export const QUEST_LIGHT_1 = 5624;
82
+ export const QUEST_LIGHT_2 = 5625;
83
+ export const QUEST_SPIRIT = 5648;
84
+ export const QUEST_DARKNESS = 5650;
85
+ /** Cite: npcs_special.cpp:517–521 ENTRY_* */
86
+ export const ENTRY_SHAYA = 12429;
87
+ export const ENTRY_ROBERTS = 12423;
88
+ export const ENTRY_DOLF = 12427;
89
+ export const ENTRY_KORJA = 12430;
90
+ export const ENTRY_DG_KEL = 12428;
91
+ /** Cite: npcs_special.cpp:523–533 SAY_* */
92
+ export const SAY_COMMON_HEALED = -1000231;
93
+ export const SAY_DG_KEL_THANKS = -1000232;
94
+ export const SAY_DG_KEL_GOODBYE = -1000233;
95
+ export const SAY_ROBERTS_THANKS = -1000256;
96
+ export const SAY_ROBERTS_GOODBYE = -1000257;
97
+ export const SAY_KORJA_THANKS = -1000258;
98
+ export const SAY_KORJA_GOODBYE = -1000259;
99
+ export const SAY_DOLF_THANKS = -1000260;
100
+ export const SAY_DOLF_GOODBYE = -1000261;
101
+ export const SAY_SHAYA_THANKS = -1000262;
102
+ export const SAY_SHAYA_GOODBYE = -1000263;
103
+ /** Cite: npcs_special.cpp:554 m_uiRunAwayTimer = 5000; :697 re-arm 30000 */
104
+ export const GARMENTS_RUN_AWAY_TIMER_MS = 5000;
105
+ export const GARMENTS_RUN_AWAY_REARM_MS = 30_000;
106
+ /** Cite: npcs_special.cpp:560 SetHealth(max * 0.7) */
107
+ export const GARMENTS_HP_FRACTION = 0.7;
108
+
109
+ export const GARMENTS_BOUND = [
110
+ ENTRY_ROBERTS,
111
+ ENTRY_DOLF,
112
+ ENTRY_DG_KEL,
113
+ ENTRY_SHAYA,
114
+ ENTRY_KORJA,
115
+ ] as const;
116
+
117
+ export const GARMENTS_ENTRY_QUEST: Readonly<Record<number, number>> = {
118
+ [ENTRY_SHAYA]: QUEST_MOON,
119
+ [ENTRY_ROBERTS]: QUEST_LIGHT_1,
120
+ [ENTRY_DOLF]: QUEST_LIGHT_2,
121
+ [ENTRY_KORJA]: QUEST_SPIRIT,
122
+ [ENTRY_DG_KEL]: QUEST_DARKNESS,
123
+ };
124
+
125
+ export const GARMENTS_ENTRY_THANKS: Readonly<Record<number, number>> = {
126
+ [ENTRY_SHAYA]: SAY_SHAYA_THANKS,
127
+ [ENTRY_ROBERTS]: SAY_ROBERTS_THANKS,
128
+ [ENTRY_DOLF]: SAY_DOLF_THANKS,
129
+ [ENTRY_KORJA]: SAY_KORJA_THANKS,
130
+ [ENTRY_DG_KEL]: SAY_DG_KEL_THANKS,
131
+ };
132
+
133
+ export const GARMENTS_ENTRY_GOODBYE: Readonly<Record<number, number>> = {
134
+ [ENTRY_SHAYA]: SAY_SHAYA_GOODBYE,
135
+ [ENTRY_ROBERTS]: SAY_ROBERTS_GOODBYE,
136
+ [ENTRY_DOLF]: SAY_DOLF_GOODBYE,
137
+ [ENTRY_KORJA]: SAY_KORJA_GOODBYE,
138
+ [ENTRY_DG_KEL]: SAY_DG_KEL_GOODBYE,
139
+ };
140
+
141
+ // Constants — guardian
142
+
143
+ /** Cite: npcs_special.cpp:721 SPELL_DEATHTOUCH = 5 */
144
+ export const SPELL_DEATHTOUCH = 5;
145
+ /** Cite: npcs_special.cpp:722 SAY_AGGRO = 2077 (broadcast_text) */
146
+ export const SAY_GUARDIAN_AGGRO = 2077;
147
+ /** Cite: corpus boundCreatures 5764 Guardian of Blizzard */
148
+ export const NPC_GUARDIAN_OF_BLIZZARD = 5764;
149
+
150
+ // Constants — innkeeper
151
+
152
+ /** Cite: npcs_special.cpp:762 TEXT_ID_WHAT_TO_DO = 1853 */
153
+ export const TEXT_ID_WHAT_TO_DO = 1853;
154
+ /** Cite: npcs_special.cpp:764–765 SPELL_TRICK_OR_TREAT / TREATED */
155
+ export const SPELL_TRICK_OR_TREAT = 24751;
156
+ export const SPELL_TRICK_OR_TREATED = 24755;
157
+ /** Cite: sc_gossip.h GOSSIP_ACTION_INFO_DEF = 1000; :775–783 actions +1/+2 */
158
+ export const GOSSIP_ACTION_INFO_DEF = 1000;
159
+ export const INN_ACTION_WHAT_TO_DO = GOSSIP_ACTION_INFO_DEF + 1;
160
+ export const INN_ACTION_TRICK_OR_TREAT = GOSSIP_ACTION_INFO_DEF + 2;
161
+ /** Cite: SharedDefines HOLIDAY_HALLOWS_END (IsHolidayActive gate) */
162
+ export const HOLIDAY_HALLOWS_END = 'hallows_end';
163
+
164
+ // Constants — redemption_target
165
+
166
+ /** Cite: npcs_special.cpp:820–826 spells + texts */
167
+ export const SAY_HEAL = -1000187;
168
+ export const SAY_HEAL_HENZE_NARM_FAULK = 2283;
169
+ export const SPELL_SYMBOL_OF_LIFE = 8593;
170
+ export const SPELL_QUEST_SELF_HEALING = 25155;
171
+ /** TBC-only residual (cpp "Not used until TBC"); dispositioned orphans. */
172
+ export const SPELL_SHIMMERING_VESSEL = 31225;
173
+ export const SPELL_REVIVE_SELF = 32343;
174
+ /** Cite: npcs_special.cpp:828–831 NPC_* */
175
+ export const NPC_HENZE_FAULK = 6172;
176
+ export const NPC_NARM_FAULK = 6177;
177
+ export const NPC_FURBOLG_SHAMAN = 17542;
178
+ export const NPC_BLOOD_KNIGHT = 17768;
179
+ /** Cite: npcs_special.cpp:867 m_uiEvadeTimer = 2 * MINUTE * IN_MILLISECONDS */
180
+ export const REDEMPTION_EVADE_TIMER_MS = 2 * 60 * 1000;
181
+ /** Cite: npcs_special.cpp:869–871 orientation/text/emote timers */
182
+ export const REDEMPTION_ORIENTATION_MS = 3000;
183
+ export const REDEMPTION_TEXT_MS = 4000;
184
+ export const REDEMPTION_EMOTE_MS = 7000;
185
+ /** Cite: SharedDefines EMOTE_ONESHOT_KNEEL */
186
+ export const EMOTE_ONESHOT_KNEEL = 16;
187
+
188
+ // Constants — the_cleaner
189
+
190
+ /** Cite: npcs_special.cpp:966 SPELL_IMMUNITY = 29230 */
191
+ export const SPELL_IMMUNITY = 29230;
192
+ /** Cite: npcs_special.cpp:967 SAY_CLEANER_AGGRO = -1001253 */
193
+ export const SAY_CLEANER_AGGRO = -1001253;
194
+ /** Cite: npcs_special.cpp:979 m_uiDespawnTimer = 3000 */
195
+ export const CLEANER_DESPAWN_TIMER_MS = 3000;
196
+ /** Cite: corpus 14503 The Cleaner */
197
+ export const NPC_THE_CLEANER = 14503;
198
+
199
+ // Constants — aoe_damage_trigger (Void Zone)
200
+
201
+ /** Cite: npcs_special.cpp:1023 NPC_VOID_ZONE = 16697 */
202
+ export const NPC_VOID_ZONE = 16697;
203
+ /** Cite: npcs_special.cpp:1026 SPELL_CONSUMPTION_NPC_16697 = 28874 */
204
+ export const SPELL_CONSUMPTION_NPC_16697 = 28874;
205
+ /** Cite: npcs_special.cpp:1041 GetTimer() return 2500 */
206
+ export const VOID_ZONE_CONSUMPTION_TIMER_MS = 2500;
207
+
208
+ // Constants — advanced_target_dummy
209
+
210
+ /** Cite: npcs_special.cpp:1079 SUICIDE = 7 */
211
+ export const SPELL_SUICIDE = 7;
212
+ /** Cite: npcs_special.cpp:1080 TARGET_DUMMY_SPAWN_EFFECT = 4507 (not corpus spellIds) */
213
+ export const TARGET_DUMMY_SPAWN_EFFECT = 4507;
214
+ /** Cite: npcs_special.cpp:1085 m_dieTimer(15000) */
215
+ export const TARGET_DUMMY_DIE_TIMER_MS = 15_000;
216
+ /** Cite: corpus 2674 Advanced Target Dummy */
217
+ export const NPC_ADVANCED_TARGET_DUMMY = 2674;
218
+
219
+ // Product bake presence (tables/creatures) — live-bake fight targets
220
+
221
+ /** Entries present in loadRealBundle() creatures for createSession. */
222
+ export const NPCS_SPECIAL_IN_BAKE = new Set([
223
+ ENTRY_ROBERTS,
224
+ ENTRY_DOLF,
225
+ ENTRY_DG_KEL,
226
+ ENTRY_SHAYA,
227
+ ENTRY_KORJA,
228
+ NPC_HENZE_FAULK,
229
+ NPC_NARM_FAULK,
230
+ NPC_ADVANCED_TARGET_DUMMY,
231
+ // First-aid triage doctors (also profession trainers) — baked for faction gate (KI-433/440).
232
+ DOCTOR_HORDE,
233
+ DOCTOR_ALLIANCE,
234
+ ]);
235
+
236
+ // Pure helpers — chicken_cluck
237
+
238
+ export type ChickenEmoteResult =
239
+ | {
240
+ handled: true;
241
+ setFriendly: true;
242
+ setQuestGiver: true;
243
+ textId: number;
244
+ resetFlagTimerMs: number;
245
+ cite: string;
246
+ }
247
+ | { handled: false; cite: string };
248
+
249
+ /** Cite: npcs_special.cpp:74–88; chickenRoll 0 = 1/50 success; cheer needs COMPLETE. */
250
+ export function chickenReceiveEmote(
251
+ textEmote: number,
252
+ chickenRoll: number,
253
+ questComplete: boolean,
254
+ ): ChickenEmoteResult {
255
+ if ((textEmote | 0) === TEXTEMOTE_CHICKEN) {
256
+ // Cite: npcs_special.cpp:76 !urand(0, 49) → roll 0 of 0..49
257
+ if ((chickenRoll | 0) !== 0) {
258
+ return {
259
+ handled: false,
260
+ cite: 'npcs_special.cpp:76 urand(0,49) failed - no questgiver',
261
+ };
262
+ }
263
+ return {
264
+ handled: true,
265
+ setFriendly: true,
266
+ setQuestGiver: true,
267
+ textId: EMOTE_CLUCK_TEXT1,
268
+ resetFlagTimerMs: CHICKEN_RESET_FLAG_TIMER_MS,
269
+ cite: 'npcs_special.cpp:76-80 TEXTEMOTE_CHICKEN success → friendly + QUESTGIVER + EMOTE_CLUCK_TEXT1',
270
+ };
271
+ }
272
+ if ((textEmote | 0) === TEXTEMOTE_CHEER) {
273
+ if (!questComplete) {
274
+ return {
275
+ handled: false,
276
+ cite: 'npcs_special.cpp:82 QUEST_CLUCK must be COMPLETE for cheer',
277
+ };
278
+ }
279
+ return {
280
+ handled: true,
281
+ setFriendly: true,
282
+ setQuestGiver: true,
283
+ textId: EMOTE_CLUCK_TEXT2,
284
+ resetFlagTimerMs: CHICKEN_RESET_FLAG_TIMER_MS,
285
+ cite: 'npcs_special.cpp:82-87 TEXTEMOTE_CHEER + COMPLETE → friendly + QUESTGIVER + EMOTE_CLUCK_TEXT2',
286
+ };
287
+ }
288
+ return { handled: false, cite: 'npcs_special.cpp:74-88 unknown emote' };
289
+ }
290
+
291
+ /** Cite: npcs_special.cpp:90–99 expire → EnterEvadeMode. */
292
+ export function chickenResetFlagTick(
293
+ hasQuestGiver: boolean,
294
+ resetFlagTimerMs: number,
295
+ diffMs: number,
296
+ ): { resetFlagTimerMs: number; enterEvade: boolean; cite: string } {
297
+ if (!hasQuestGiver) {
298
+ return {
299
+ resetFlagTimerMs: CHICKEN_RESET_FLAG_TIMER_MS,
300
+ enterEvade: false,
301
+ cite: 'npcs_special.cpp:93 no QUESTGIVER - timer idle',
302
+ };
303
+ }
304
+ if (resetFlagTimerMs < (diffMs | 0)) {
305
+ return {
306
+ resetFlagTimerMs: 0,
307
+ enterEvade: true,
308
+ cite: 'npcs_special.cpp:95-96 timer expired → EnterEvadeMode (Reset faction/flags)',
309
+ };
310
+ }
311
+ return {
312
+ resetFlagTimerMs: resetFlagTimerMs - (diffMs | 0),
313
+ enterEvade: false,
314
+ cite: 'npcs_special.cpp:98 timer -= diff',
315
+ };
316
+ }
317
+
318
+ // Pure helpers — triage doctor / patient
319
+
320
+ export interface TriageEventState {
321
+ inProgress: boolean;
322
+ summonPatientTimerMs: number;
323
+ summonPatientCount: number;
324
+ patientDiedCount: number;
325
+ patientSavedCount: number;
326
+ coordPoolSize: number;
327
+ }
328
+
329
+ /** Cite: npcs_special.cpp:355–378 BeginEvent. */
330
+ export function triageBeginEvent(doctorEntry: number): TriageEventState {
331
+ const coords =
332
+ (doctorEntry | 0) === DOCTOR_HORDE
333
+ ? HORDE_COORDS_COUNT
334
+ : (doctorEntry | 0) === DOCTOR_ALLIANCE
335
+ ? ALLIANCE_COORDS_COUNT
336
+ : 0;
337
+ return {
338
+ inProgress: true,
339
+ summonPatientTimerMs: SUMMON_PATIENT_TIMER_MS,
340
+ summonPatientCount: 0,
341
+ patientDiedCount: 0,
342
+ patientSavedCount: 0,
343
+ coordPoolSize: coords,
344
+ };
345
+ }
346
+
347
+ /** Cite: npcs_special.cpp:407–437 PatientSaved; success at 15. */
348
+ export function triagePatientSaved(
349
+ state: TriageEventState,
350
+ ): { state: TriageEventState; success: boolean; cite: string } {
351
+ const next = {
352
+ ...state,
353
+ patientSavedCount: state.patientSavedCount + 1,
354
+ coordPoolSize: state.coordPoolSize + 1,
355
+ };
356
+ if (next.patientSavedCount === PATIENTS_SAVED_SUCCESS) {
357
+ return {
358
+ state: {
359
+ inProgress: false,
360
+ summonPatientTimerMs: SUMMON_PATIENT_TIMER_MS,
361
+ summonPatientCount: 0,
362
+ patientDiedCount: 0,
363
+ patientSavedCount: PATIENTS_SAVED_SUCCESS,
364
+ coordPoolSize: 0,
365
+ },
366
+ success: true,
367
+ cite: 'npcs_special.cpp:414-431 PatientSaved==15 → RewardPlayerAndGroupAtEventExplored + Reset',
368
+ };
369
+ }
370
+ return {
371
+ state: next,
372
+ success: false,
373
+ cite: 'npcs_special.cpp:412-435 PatientSaved++ + push coord back',
374
+ };
375
+ }
376
+
377
+ /** Cite: npcs_special.cpp:380–404 PatientDied; fail when deaths > 5. */
378
+ export function triagePatientDied(
379
+ state: TriageEventState,
380
+ ): { state: TriageEventState; fail: boolean; cite: string } {
381
+ const died = state.patientDiedCount + 1;
382
+ if (died > 5) {
383
+ return {
384
+ state: {
385
+ inProgress: false,
386
+ summonPatientTimerMs: SUMMON_PATIENT_TIMER_MS,
387
+ summonPatientCount: 0,
388
+ patientDiedCount: died,
389
+ patientSavedCount: 0,
390
+ coordPoolSize: 0,
391
+ },
392
+ fail: true,
393
+ cite: 'npcs_special.cpp:388-396 PatientDied>5 → FailQuest + Reset',
394
+ };
395
+ }
396
+ return {
397
+ state: {
398
+ ...state,
399
+ patientDiedCount: died,
400
+ coordPoolSize: state.coordPoolSize + 1,
401
+ },
402
+ fail: false,
403
+ cite: 'npcs_special.cpp:386-399 PatientDied++ + return coord to pool',
404
+ };
405
+ }
406
+
407
+ /** Cite: npcs_special.cpp:440–483 summon timer; soldierRoll 0..2. */
408
+ export function triageSummonTick(
409
+ state: TriageEventState,
410
+ doctorEntry: number,
411
+ soldierRoll: number,
412
+ diffMs: number,
413
+ ): {
414
+ state: TriageEventState;
415
+ summonedEntry: number | null;
416
+ resetCap: boolean;
417
+ cite: string;
418
+ } {
419
+ if (!state.inProgress) {
420
+ return {
421
+ state,
422
+ summonedEntry: null,
423
+ resetCap: false,
424
+ cite: 'npcs_special.cpp:448 event not in progress',
425
+ };
426
+ }
427
+ if (state.summonPatientCount >= MAX_PATIENT_SUMMONS) {
428
+ return {
429
+ state: {
430
+ inProgress: false,
431
+ summonPatientTimerMs: SUMMON_PATIENT_TIMER_MS,
432
+ summonPatientCount: state.summonPatientCount,
433
+ patientDiedCount: 0,
434
+ patientSavedCount: 0,
435
+ coordPoolSize: 0,
436
+ },
437
+ summonedEntry: null,
438
+ resetCap: true,
439
+ cite: 'npcs_special.cpp:442-445 summon count>=21 worst case → Reset',
440
+ };
441
+ }
442
+ if (state.coordPoolSize <= 0) {
443
+ return {
444
+ state,
445
+ summonedEntry: null,
446
+ resetCap: false,
447
+ cite: 'npcs_special.cpp:448 empty coord pool - wait',
448
+ };
449
+ }
450
+ if (state.summonPatientTimerMs >= (diffMs | 0)) {
451
+ return {
452
+ state: {
453
+ ...state,
454
+ summonPatientTimerMs: state.summonPatientTimerMs - (diffMs | 0),
455
+ },
456
+ summonedEntry: null,
457
+ resetCap: false,
458
+ cite: 'npcs_special.cpp:482 timer -= diff',
459
+ };
460
+ }
461
+ const ids =
462
+ (doctorEntry | 0) === DOCTOR_HORDE
463
+ ? HORDE_SOLDIER_IDS
464
+ : (doctorEntry | 0) === DOCTOR_ALLIANCE
465
+ ? ALLIANCE_SOLDIER_IDS
466
+ : null;
467
+ if (!ids) {
468
+ return {
469
+ state,
470
+ summonedEntry: null,
471
+ resetCap: false,
472
+ cite: 'npcs_special.cpp:459-461 invalid doctor entry',
473
+ };
474
+ }
475
+ const idx = Math.max(0, Math.min(2, soldierRoll | 0));
476
+ return {
477
+ state: {
478
+ ...state,
479
+ summonPatientTimerMs: SUMMON_PATIENT_TIMER_MS,
480
+ summonPatientCount: state.summonPatientCount + 1,
481
+ coordPoolSize: state.coordPoolSize - 1,
482
+ },
483
+ summonedEntry: ids[idx]!,
484
+ resetCap: false,
485
+ cite: 'npcs_special.cpp:450-479 SummonCreature patient + re-arm 10000',
486
+ };
487
+ }
488
+
489
+ /** Cite: npcs_special.cpp:253–268 patient HP fraction by entry. */
490
+ export function patientHpFraction(entry: number): number {
491
+ switch (entry | 0) {
492
+ case 12923:
493
+ case 12938:
494
+ return PATIENT_HP_INJURED;
495
+ case 12924:
496
+ case 12936:
497
+ return PATIENT_HP_BADLY;
498
+ case 12925:
499
+ case 12937:
500
+ return PATIENT_HP_CRITICAL;
501
+ default:
502
+ return 1;
503
+ }
504
+ }
505
+
506
+ /** Cite: npcs_special.cpp:291–296 SAY_DOC urand(0,2). */
507
+ export function patientDocSay(roll: number): number {
508
+ const r = Math.max(0, Math.min(2, roll | 0));
509
+ if (r === 0) return SAY_DOC1;
510
+ if (r === 1) return SAY_DOC2;
511
+ return SAY_DOC3;
512
+ }
513
+
514
+ /** Cite: npcs_special.cpp:323–328 uiHPLose = 0.05f * uiDiff. */
515
+ export function patientHpLose(diffMs: number): number {
516
+ return Math.floor(PATIENT_HP_LOSE_PER_MS * (diffMs | 0));
517
+ }
518
+
519
+ // Pure helpers — garments_of_quests
520
+
521
+ export interface GarmentsState {
522
+ isHealed: boolean;
523
+ canRun: boolean;
524
+ runAwayTimerMs: number;
525
+ }
526
+
527
+ export function garmentsReset(): GarmentsState {
528
+ return {
529
+ isHealed: false,
530
+ canRun: false,
531
+ runAwayTimerMs: GARMENTS_RUN_AWAY_TIMER_MS,
532
+ };
533
+ }
534
+
535
+ export type GarmentsSpellHitResult =
536
+ | {
537
+ handled: true;
538
+ phase: 'healed' | 'fortitude_credit';
539
+ textId: number;
540
+ questCreditEntry: number | null;
541
+ state: GarmentsState;
542
+ cite: string;
543
+ }
544
+ | { handled: false; cite: string };
545
+
546
+ /** Cite: npcs_special.cpp:563–670 Lesser Heal → Fortitude machine. */
547
+ export function garmentsSpellHit(opts: {
548
+ entry: number;
549
+ spellId: number;
550
+ questIncomplete: boolean;
551
+ inCombat: boolean;
552
+ state: GarmentsState;
553
+ }): GarmentsSpellHitResult {
554
+ const { entry, spellId, questIncomplete, inCombat, state } = opts;
555
+ if ((spellId | 0) !== SPELL_LESSER_HEAL_R2 && (spellId | 0) !== SPELL_FORTITUDE_R1) {
556
+ return { handled: false, cite: 'npcs_special.cpp:565 spell id gate 2052/1243' };
557
+ }
558
+ if (inCombat) {
559
+ return { handled: false, cite: 'npcs_special.cpp:568-569 IsInCombat gate' };
560
+ }
561
+ if (state.isHealed && state.canRun) {
562
+ return { handled: false, cite: 'npcs_special.cpp:572-573 already healed+canRun' };
563
+ }
564
+ if (!questIncomplete) {
565
+ return { handled: false, cite: 'npcs_special.cpp:577+ quest incomplete gate' };
566
+ }
567
+ const quest = GARMENTS_ENTRY_QUEST[entry | 0];
568
+ if (quest === undefined) {
569
+ return { handled: false, cite: 'npcs_special.cpp:577 unknown garments entry' };
570
+ }
571
+
572
+ if ((spellId | 0) === SPELL_LESSER_HEAL_R2) {
573
+ if (state.isHealed) {
574
+ return { handled: false, cite: 'npcs_special.cpp:587+ already healed - need Fortitude' };
575
+ }
576
+ return {
577
+ handled: true,
578
+ phase: 'healed',
579
+ textId: SAY_COMMON_HEALED,
580
+ questCreditEntry: null,
581
+ state: { ...state, isHealed: true },
582
+ cite: 'npcs_special.cpp:587-592 Lesser Heal → stand + SAY_COMMON_HEALED + m_bIsHealed',
583
+ };
584
+ }
585
+
586
+ // Fortitude
587
+ if (!state.isHealed || state.canRun) {
588
+ return {
589
+ handled: false,
590
+ cite: 'npcs_special.cpp:582 needs isHealed && !canRun for Fortitude',
591
+ };
592
+ }
593
+ const thanks = GARMENTS_ENTRY_THANKS[entry | 0]!;
594
+ return {
595
+ handled: true,
596
+ phase: 'fortitude_credit',
597
+ textId: thanks,
598
+ questCreditEntry: entry | 0,
599
+ state: { ...state, canRun: true },
600
+ cite: 'npcs_special.cpp:582-586 Fortitude → thanks + m_bCanRun + TalkedToCreature',
601
+ };
602
+ }
603
+
604
+ /** Cite: npcs_special.cpp:675–701 run-away after Fortitude. */
605
+ export function garmentsRunAwayTick(
606
+ state: GarmentsState,
607
+ inCombat: boolean,
608
+ diffMs: number,
609
+ entry: number,
610
+ ): {
611
+ state: GarmentsState;
612
+ goodbyeTextId: number | null;
613
+ startEscort: boolean;
614
+ cite: string;
615
+ } {
616
+ if (!state.canRun || inCombat) {
617
+ return {
618
+ state,
619
+ goodbyeTextId: null,
620
+ startEscort: false,
621
+ cite: 'npcs_special.cpp:677 canRun && !IsInCombat gate',
622
+ };
623
+ }
624
+ if (state.runAwayTimerMs > (diffMs | 0)) {
625
+ return {
626
+ state: { ...state, runAwayTimerMs: state.runAwayTimerMs - (diffMs | 0) },
627
+ goodbyeTextId: null,
628
+ startEscort: false,
629
+ cite: 'npcs_special.cpp:700 timer -= diff',
630
+ };
631
+ }
632
+ return {
633
+ state: { ...state, runAwayTimerMs: GARMENTS_RUN_AWAY_REARM_MS },
634
+ goodbyeTextId: GARMENTS_ENTRY_GOODBYE[entry | 0] ?? null,
635
+ startEscort: true,
636
+ cite: 'npcs_special.cpp:679-697 goodbye + Start(true) + re-arm 30000',
637
+ };
638
+ }
639
+
640
+ // Pure helpers — innkeeper gossip
641
+
642
+ export type InnkeeperGossipItem =
643
+ | { kind: 'trick_or_treat'; action: number; cite: string }
644
+ | { kind: 'what_to_do'; action: number; cite: string };
645
+
646
+ /** Cite: npcs_special.cpp:771–788 GossipHello_npc_innkeeper. */
647
+ export function innkeeperGossipHello(opts: {
648
+ holidayHallowsEnd: boolean;
649
+ hasTrickOrTreatedAura: boolean;
650
+ }): { items: InnkeeperGossipItem[]; cite: string } {
651
+ const items: InnkeeperGossipItem[] = [];
652
+ if (opts.holidayHallowsEnd && !opts.hasTrickOrTreatedAura) {
653
+ items.push({
654
+ kind: 'trick_or_treat',
655
+ action: INN_ACTION_TRICK_OR_TREAT,
656
+ cite: 'npcs_special.cpp:775-776 HOLIDAY_HALLOWS_END && !HasAura(24755)',
657
+ });
658
+ }
659
+ // Cite: npcs_special.cpp:779-783 — always offered when area lookup succeeds
660
+ // (AREA_FLAG_LOWLEVEL gate commented out in Classic).
661
+ items.push({
662
+ kind: 'what_to_do',
663
+ action: INN_ACTION_WHAT_TO_DO,
664
+ cite: 'npcs_special.cpp:779-783 ADD_GOSSIP_ITEM What can I do at an Inn?',
665
+ });
666
+ return { items, cite: 'npcs_special.cpp:771-788 GossipHello_npc_innkeeper' };
667
+ }
668
+
669
+ export type InnkeeperSelectResult =
670
+ | {
671
+ handled: true;
672
+ phase: 'what_to_do' | 'trick_or_treat' | 'vendor' | 'bind';
673
+ textId: number | null;
674
+ castSpellId: number | null;
675
+ closeMenu: boolean;
676
+ cite: string;
677
+ }
678
+ | { handled: false; cite: string };
679
+
680
+ /** Cite: npcs_special.cpp:791–811 GossipSelect_npc_innkeeper. */
681
+ export function innkeeperGossipSelect(action: number): InnkeeperSelectResult {
682
+ if ((action | 0) === INN_ACTION_WHAT_TO_DO) {
683
+ return {
684
+ handled: true,
685
+ phase: 'what_to_do',
686
+ textId: TEXT_ID_WHAT_TO_DO,
687
+ castSpellId: null,
688
+ closeMenu: false,
689
+ cite: 'npcs_special.cpp:795-796 SEND_GOSSIP_MENU TEXT_ID_WHAT_TO_DO=1853',
690
+ };
691
+ }
692
+ if ((action | 0) === INN_ACTION_TRICK_OR_TREAT) {
693
+ return {
694
+ handled: true,
695
+ phase: 'trick_or_treat',
696
+ textId: null,
697
+ castSpellId: SPELL_TRICK_OR_TREAT,
698
+ closeMenu: true,
699
+ cite: 'npcs_special.cpp:798-800 CLOSE + CastSpell SPELL_TRICK_OR_TREAT 24751',
700
+ };
701
+ }
702
+ // GOSSIP_OPTION_VENDOR / INNKEEPER are absolute option ids (not INFO_DEF+n).
703
+ // Cite: npcs_special.cpp:802-808
704
+ if ((action | 0) === 1 /* GOSSIP_OPTION_VENDOR typical */) {
705
+ return {
706
+ handled: true,
707
+ phase: 'vendor',
708
+ textId: null,
709
+ castSpellId: null,
710
+ closeMenu: false,
711
+ cite: 'npcs_special.cpp:802-803 GOSSIP_OPTION_VENDOR SEND_VENDORLIST',
712
+ };
713
+ }
714
+ if ((action | 0) === 2 /* GOSSIP_OPTION_INNKEEPER typical */) {
715
+ return {
716
+ handled: true,
717
+ phase: 'bind',
718
+ textId: null,
719
+ castSpellId: null,
720
+ closeMenu: true,
721
+ cite: 'npcs_special.cpp:805-808 GOSSIP_OPTION_INNKEEPER SetBindPoint',
722
+ };
723
+ }
724
+ return { handled: false, cite: 'npcs_special.cpp:791-811 unknown action' };
725
+ }
726
+
727
+ // Pure helpers — redemption_target
728
+
729
+ export interface RedemptionState {
730
+ evadeTimerMs: number;
731
+ orientationTimerMs: number;
732
+ textTimerMs: number;
733
+ emoteTimerMs: number;
734
+ revived: boolean;
735
+ }
736
+
737
+ export function redemptionReset(): RedemptionState {
738
+ return {
739
+ evadeTimerMs: 0,
740
+ orientationTimerMs: 0,
741
+ textTimerMs: 0,
742
+ emoteTimerMs: 0,
743
+ revived: false,
744
+ };
745
+ }
746
+
747
+ /** Cite: npcs_special.cpp:858–872 DoReviveSelf after Symbol of Life. */
748
+ export function redemptionDoReviveSelf(
749
+ state: RedemptionState,
750
+ ): { state: RedemptionState; castSelfHeal: boolean; cite: string } {
751
+ if (state.evadeTimerMs) {
752
+ return {
753
+ state,
754
+ castSelfHeal: false,
755
+ cite: 'npcs_special.cpp:861-862 Wait until he resets (evade timer active)',
756
+ };
757
+ }
758
+ return {
759
+ state: {
760
+ evadeTimerMs: REDEMPTION_EVADE_TIMER_MS,
761
+ orientationTimerMs: REDEMPTION_ORIENTATION_MS,
762
+ textTimerMs: REDEMPTION_TEXT_MS,
763
+ emoteTimerMs: REDEMPTION_EMOTE_MS,
764
+ revived: true,
765
+ },
766
+ castSelfHeal: true,
767
+ cite: 'npcs_special.cpp:864-871 SPELL_QUEST_SELF_HEALING + stand + 2min evade + timers',
768
+ };
769
+ }
770
+
771
+ export type RedemptionTextResult = {
772
+ textId: number;
773
+ setQuestGiver: boolean;
774
+ killCredit: boolean;
775
+ cite: string;
776
+ };
777
+
778
+ /** Cite: npcs_special.cpp:890–913 text timer by entry. */
779
+ export function redemptionTextOnFire(entry: number): RedemptionTextResult {
780
+ if ((entry | 0) === NPC_HENZE_FAULK || (entry | 0) === NPC_NARM_FAULK) {
781
+ return {
782
+ textId: SAY_HEAL_HENZE_NARM_FAULK,
783
+ setQuestGiver: true,
784
+ killCredit: false,
785
+ cite: 'npcs_special.cpp:898-900 Henze/Narm SetFlag QUESTGIVER + DoBroadcastText 2283',
786
+ };
787
+ }
788
+ if ((entry | 0) === NPC_FURBOLG_SHAMAN || (entry | 0) === NPC_BLOOD_KNIGHT) {
789
+ return {
790
+ textId: SAY_HEAL,
791
+ setQuestGiver: false,
792
+ killCredit: true,
793
+ cite: 'npcs_special.cpp:903-906 Furbolg/Blood Knight SAY_HEAL + KilledMonsterCredit',
794
+ };
795
+ }
796
+ return {
797
+ textId: 0,
798
+ setQuestGiver: false,
799
+ killCredit: false,
800
+ cite: 'npcs_special.cpp:890-913 unknown redemption entry',
801
+ };
802
+ }
803
+
804
+ /** Cite: npcs_special.cpp:920–924 Henze/Narm kneel. */
805
+ export function redemptionKneelsOnEmote(entry: number): boolean {
806
+ return (entry | 0) === NPC_HENZE_FAULK || (entry | 0) === NPC_NARM_FAULK;
807
+ }
808
+
809
+ // Pure helpers — cleaner / void zone / target dummy
810
+
811
+ /** Cite: npcs_special.cpp:994–1002 empty-threat ForcedDespawn. */
812
+ export function cleanerDespawnTick(
813
+ despawnTimerMs: number,
814
+ threatEmpty: boolean,
815
+ diffMs: number,
816
+ ): { despawnTimerMs: number; forceDespawn: boolean; cite: string } {
817
+ if (despawnTimerMs < (diffMs | 0)) {
818
+ if (threatEmpty) {
819
+ return {
820
+ despawnTimerMs: 0,
821
+ forceDespawn: true,
822
+ cite: 'npcs_special.cpp:996-999 empty threat → ForcedDespawn',
823
+ };
824
+ }
825
+ return {
826
+ despawnTimerMs: 0,
827
+ forceDespawn: false,
828
+ cite: 'npcs_special.cpp:996-999 timer expired but threat present',
829
+ };
830
+ }
831
+ return {
832
+ despawnTimerMs: despawnTimerMs - (diffMs | 0),
833
+ forceDespawn: false,
834
+ cite: 'npcs_special.cpp:1002 timer -= diff',
835
+ };
836
+ }
837
+
838
+ /** Cite: npcs_special.cpp:1096–1106 m_dieTimer → SUICIDE. */
839
+ export function targetDummyDieTick(
840
+ dieTimerMs: number,
841
+ diffMs: number,
842
+ ): { dieTimerMs: number; castSuicide: boolean; cite: string } {
843
+ if (!dieTimerMs) {
844
+ return { dieTimerMs: 0, castSuicide: false, cite: 'npcs_special.cpp:1098 timer idle' };
845
+ }
846
+ if (dieTimerMs <= (diffMs | 0)) {
847
+ return {
848
+ dieTimerMs: 0,
849
+ castSuicide: true,
850
+ cite: 'npcs_special.cpp:1100-1102 DoCastSpellIfCan SUICIDE 7',
851
+ };
852
+ }
853
+ return {
854
+ dieTimerMs: dieTimerMs - (diffMs | 0),
855
+ castSuicide: false,
856
+ cite: 'npcs_special.cpp:1105 timer -= diff',
857
+ };
858
+ }
859
+
860
+ // Unused-binding helper
861
+
862
+ function absentCreature(
863
+ entry: number,
864
+ name: string,
865
+ script: string,
866
+ detail: string,
867
+ ): ScriptDevUnusedBinding {
868
+ return {
869
+ entry,
870
+ kind: 'creature',
871
+ reason: `NPC ${entry} ${name} bound to ${script} (${detail}) but absent from product creatures bake`,
872
+ cite: `npcs_special.cpp ${script}; corpus boundCreatures; loadRealBundle missing ${entry}`,
873
+ };
874
+ }
875
+
876
+ // ScriptDev IR — npc_chicken_cluck
877
+
878
+ // Cite: npcs_special.cpp:60–109 ReceiveEmote + 20s reset. Binding: 620 Chicken — ABSENT bake →
879
+ // unused-binding. QI4 residual: registryNpcsSpecial (quest 3861 chrome).
880
+ export const NPC_CHICKEN_CLUCK: ScriptDevIR = {
881
+ name: 'npc_chicken_cluck',
882
+ boundCreatures: [NPC_CHICKEN],
883
+ sourceFile: 'world/npcs_special.cpp',
884
+ spellIds: [],
885
+ timers: [],
886
+ receiveEmotes: [
887
+ {
888
+ emote: TEXTEMOTE_CHICKEN,
889
+ actions: [
890
+ {
891
+ kind: 'yell',
892
+ textId: EMOTE_CLUCK_TEXT1,
893
+ cite: 'npcs_special.cpp:80 DoScriptText EMOTE_CLUCK_TEXT1 (1/50 gate via chickenReceiveEmote)',
894
+ },
895
+ {
896
+ kind: 'flavor',
897
+ text: `setFaction(35) + SetFlag QUESTGIVER; m_uiResetFlagTimer=${CHICKEN_RESET_FLAG_TIMER_MS}`,
898
+ cite: 'npcs_special.cpp:78-79',
899
+ },
900
+ ],
901
+ cite: 'npcs_special.cpp:76-80 TEXTEMOTE_CHICKEN + urand(0,49)',
902
+ },
903
+ {
904
+ emote: TEXTEMOTE_CHEER,
905
+ actions: [
906
+ {
907
+ kind: 'yell',
908
+ textId: EMOTE_CLUCK_TEXT2,
909
+ cite: 'npcs_special.cpp:86 DoScriptText EMOTE_CLUCK_TEXT2 when QUEST_CLUCK COMPLETE',
910
+ },
911
+ {
912
+ kind: 'flavor',
913
+ text: `setFaction(35) + SetFlag QUESTGIVER; m_uiResetFlagTimer=${CHICKEN_RESET_FLAG_TIMER_MS}`,
914
+ cite: 'npcs_special.cpp:84-85',
915
+ },
916
+ ],
917
+ cite: 'npcs_special.cpp:82-87 TEXTEMOTE_CHEER + QUEST_STATUS_COMPLETE',
918
+ },
919
+ ],
920
+ lifecycle: {
921
+ onReset: [
922
+ {
923
+ kind: 'flavor',
924
+ text: `m_uiResetFlagTimer=${CHICKEN_RESET_FLAG_TIMER_MS}; setFaction(FACTION_CHICKEN=31); RemoveFlag QUESTGIVER`,
925
+ cite: 'npcs_special.cpp:66-72 Reset',
926
+ },
927
+ ],
928
+ onEvade: [
929
+ {
930
+ kind: 'flavor',
931
+ text: 'EnterEvadeMode after QUESTGIVER flag timer expires → Reset flags',
932
+ cite: 'npcs_special.cpp:95-96',
933
+ },
934
+ ],
935
+ },
936
+ unusedBindings: [
937
+ absentCreature(NPC_CHICKEN, 'Chicken', 'npc_chicken_cluck', 'quest 3861 Cluck! emote machine'),
938
+ ],
939
+ cites: [
940
+ 'npcs_special.cpp:50-58 enums EMOTE/QUEST/FACTION',
941
+ 'npcs_special.cpp:60-104 npc_chicken_cluckAI',
942
+ 'npcs_special.cpp:68 m_uiResetFlagTimer=20000',
943
+ 'npcs_special.cpp:74-88 ReceiveEmote',
944
+ 'npcs_special.cpp:90-99 UpdateAI flag reset',
945
+ 'npcs_special.cpp:1114-1117 RegisterSelf',
946
+ 'QI4 residual: registryNpcsSpecial.ts quest 3861',
947
+ ],
948
+ };
949
+
950
+ // ScriptDev IR — npc_injured_patient
951
+
952
+ // Cite: npcs_special.cpp:227–349 patient HP decay + SpellHit 20804. All six patient entries ABSENT bake →
953
+ // unused-bindings.
954
+ export const NPC_INJURED_PATIENT: ScriptDevIR = {
955
+ name: 'npc_injured_patient',
956
+ boundCreatures: [...ALLIANCE_SOLDIER_IDS, ...HORDE_SOLDIER_IDS],
957
+ sourceFile: 'world/npcs_special.cpp',
958
+ spellIds: [SPELL_TRIAGE_BANDAGE],
959
+ timers: [],
960
+ spellHits: [
961
+ {
962
+ spellId: SPELL_TRIAGE_BANDAGE,
963
+ playerCaster: true,
964
+ actions: [
965
+ {
966
+ kind: 'flavor',
967
+ text: 'PatientSaved → doctor; UNINTERACTIBLE; remove IN_COMBAT; STAND; SAY_DOC1/2/3; MovePoint runto',
968
+ cite: 'npcs_special.cpp:271-314 SpellHit 20804',
969
+ },
970
+ {
971
+ kind: 'yell',
972
+ textId: SAY_DOC1,
973
+ cite: 'npcs_special.cpp:291-296 urand(0,2) SAY_DOC1/2/3 (patientDocSay pure helper)',
974
+ },
975
+ ],
976
+ cite: 'npcs_special.cpp:271-314 SpellHit SPELL_TRIAGE_BANDAGE 20804',
977
+ },
978
+ ],
979
+ lifecycle: {
980
+ onReset: [
981
+ {
982
+ kind: 'flavor',
983
+ text: `STAND_DEAD; UNIT_FLAG_IN_COMBAT; HP×${PATIENT_HP_INJURED}/${PATIENT_HP_BADLY}/${PATIENT_HP_CRITICAL} by entry`,
984
+ cite: 'npcs_special.cpp:241-268 Reset',
985
+ },
986
+ ],
987
+ },
988
+ unusedBindings: [
989
+ absentCreature(12923, 'Injured Soldier', 'npc_injured_patient', 'triage patient'),
990
+ absentCreature(12924, 'Badly Injured Soldier', 'npc_injured_patient', 'triage patient'),
991
+ absentCreature(12925, 'Critically Injured Soldier', 'npc_injured_patient', 'triage patient'),
992
+ absentCreature(12936, 'Badly Injured Alliance Soldier', 'npc_injured_patient', 'triage patient'),
993
+ absentCreature(12937, 'Critically Injured Alliance Soldier', 'npc_injured_patient', 'triage patient'),
994
+ absentCreature(12938, 'Injured Alliance Soldier', 'npc_injured_patient', 'triage patient'),
995
+ ],
996
+ cites: [
997
+ 'npcs_special.cpp:227-349 npc_injured_patientAI',
998
+ 'npcs_special.cpp:258/262/266 HP fractions 0.75/0.50/0.25',
999
+ 'npcs_special.cpp:273 SpellHit 20804 Triage Bandage',
1000
+ 'npcs_special.cpp:323-324 HP lose 0.05f*diff',
1001
+ 'npcs_special.cpp:1119-1122 RegisterSelf',
1002
+ 'QI4 residual: registryNpcsSpecial.ts triage bandage/save chain',
1003
+ ],
1004
+ };
1005
+
1006
+ // ScriptDev IR — npc_doctor
1007
+
1008
+ // npc_doctor BeginEvent plus the summon and save/fail paths. Doctors 12920/12939 are in bake as
1009
+ // first-aid trainers. Cite: npcs_special.cpp:184–500.
1010
+ export const NPC_DOCTOR: ScriptDevIR = {
1011
+ name: 'npc_doctor',
1012
+ boundCreatures: [DOCTOR_HORDE, DOCTOR_ALLIANCE],
1013
+ sourceFile: 'world/npcs_special.cpp',
1014
+ spellIds: [],
1015
+ timers: [],
1016
+ lifecycle: {
1017
+ onReset: [
1018
+ {
1019
+ kind: 'flavor',
1020
+ text: `summonTimer=${SUMMON_PATIENT_TIMER_MS}; counters 0; event off; RemoveFlag UNINTERACTIBLE`,
1021
+ cite: 'npcs_special.cpp:200-215 Reset',
1022
+ },
1023
+ ],
1024
+ },
1025
+ // Both doctors now resolve in creatures.json (service-NPC faction bake).
1026
+ unusedBindings: [],
1027
+ cites: [
1028
+ 'npcs_special.cpp:184-221 npc_doctorAI',
1029
+ 'npcs_special.cpp:355-378 BeginEvent',
1030
+ 'npcs_special.cpp:380-404 PatientDied >5 FailQuest',
1031
+ 'npcs_special.cpp:407-437 PatientSaved ==15 explore credit',
1032
+ 'npcs_special.cpp:440-483 UpdateAI summon every 10000',
1033
+ 'npcs_special.cpp:486-494 QuestAccept_npc_doctor',
1034
+ 'npcs_special.cpp:1124-1128 RegisterSelf pQuestAcceptNPC',
1035
+ 'QI4 residual: registryNpcsSpecial.ts accept/frame explore credit',
1036
+ ],
1037
+ };
1038
+
1039
+ // ScriptDev IR — npc_garments_of_quests
1040
+
1041
+ const GARMENTS_SPELL_HIT_ACTIONS: ScriptDevAction[] = [
1042
+ {
1043
+ kind: 'flavor',
1044
+ text: 'two-step: 2052 → stand+healed; 1243 → thanks + TalkedToCreature (garmentsSpellHit pure helper)',
1045
+ cite: 'npcs_special.cpp:563-670',
1046
+ },
1047
+ ];
1048
+
1049
+ // Cite: npcs_special.cpp:536–713 garments SpellHit + 5s run-away. Bindings 12423/12427/12428/12429/12430
1050
+ // PRESENT in bake.
1051
+ export const NPC_GARMENTS_OF_QUESTS: ScriptDevIR = {
1052
+ name: 'npc_garments_of_quests',
1053
+ boundCreatures: [...GARMENTS_BOUND],
1054
+ sourceFile: 'world/npcs_special.cpp',
1055
+ spellIds: [SPELL_LESSER_HEAL_R2, SPELL_FORTITUDE_R1],
1056
+ timers: [],
1057
+ spellHits: [
1058
+ {
1059
+ spellId: SPELL_LESSER_HEAL_R2,
1060
+ playerCaster: true,
1061
+ actions: [
1062
+ ...GARMENTS_SPELL_HIT_ACTIONS,
1063
+ {
1064
+ kind: 'yell',
1065
+ textId: SAY_COMMON_HEALED,
1066
+ cite: 'npcs_special.cpp:591 DoScriptText SAY_COMMON_HEALED on Lesser Heal',
1067
+ },
1068
+ ],
1069
+ cite: 'npcs_special.cpp:565-593 SPELL_LESSER_HEAL_R2 2052',
1070
+ },
1071
+ {
1072
+ spellId: SPELL_FORTITUDE_R1,
1073
+ playerCaster: true,
1074
+ actions: [
1075
+ ...GARMENTS_SPELL_HIT_ACTIONS,
1076
+ {
1077
+ kind: 'quest_credit',
1078
+ entry: ENTRY_SHAYA,
1079
+ credit: 'talkedTo',
1080
+ cite: 'npcs_special.cpp:667-668 TalkedToCreature(entry) after Fortitude (per-entry via garmentsSpellHit)',
1081
+ },
1082
+ ],
1083
+ cite: 'npcs_special.cpp:565-668 SPELL_FORTITUDE_R1 1243',
1084
+ },
1085
+ ],
1086
+ lifecycle: {
1087
+ onReset: [
1088
+ {
1089
+ kind: 'flavor',
1090
+ text: `kneel; UNIT_FLAG_PVP; SetHealth(max*${GARMENTS_HP_FRACTION}); runAwayTimer=${GARMENTS_RUN_AWAY_TIMER_MS}`,
1091
+ cite: 'npcs_special.cpp:547-560 Reset',
1092
+ },
1093
+ ],
1094
+ },
1095
+ cites: [
1096
+ 'npcs_special.cpp:506-534 enums spells/quests/entries/SAYs',
1097
+ 'npcs_special.cpp:536-707 npc_garments_of_questsAI',
1098
+ 'npcs_special.cpp:554 m_uiRunAwayTimer=5000; :697 re-arm 30000',
1099
+ 'npcs_special.cpp:560 SetHealth 0.7',
1100
+ 'npcs_special.cpp:563-670 SpellHit 2052/1243',
1101
+ 'npcs_special.cpp:675-701 UpdateEscortAI run-away',
1102
+ 'npcs_special.cpp:1130-1133 RegisterSelf',
1103
+ 'QI4 residual: registryNpcsSpecial.ts garments frame kill credit',
1104
+ ],
1105
+ };
1106
+
1107
+ // ScriptDev IR — npc_guardian
1108
+
1109
+ // npc_guardian Death Touch on attack-ready; binding 5764 is absent from bake. The cast is
1110
+ // weapon-paced, not a fixed timer, so empty timers are correct. Cite: npcs_special.cpp:725–749.
1111
+ export const NPC_GUARDIAN: ScriptDevIR = {
1112
+ name: 'npc_guardian',
1113
+ boundCreatures: [NPC_GUARDIAN_OF_BLIZZARD],
1114
+ sourceFile: 'world/npcs_special.cpp',
1115
+ spellIds: [SPELL_DEATHTOUCH],
1116
+ timers: [],
1117
+ lifecycle: {
1118
+ onAggro: [
1119
+ {
1120
+ kind: 'yell',
1121
+ textId: SAY_GUARDIAN_AGGRO,
1122
+ cite: 'npcs_special.cpp:729-731 Aggro DoBroadcastText 2077',
1123
+ },
1124
+ ],
1125
+ onReset: [
1126
+ {
1127
+ kind: 'flavor',
1128
+ text: 'ScriptedAI Reset; combat: isAttackReady → CastSpell Death Touch 5 TRIGGERED + resetAttackTimer',
1129
+ cite: 'npcs_special.cpp:734-743 UpdateAI',
1130
+ },
1131
+ ],
1132
+ },
1133
+ unusedBindings: [
1134
+ absentCreature(
1135
+ NPC_GUARDIAN_OF_BLIZZARD,
1136
+ 'Guardian of Blizzard',
1137
+ 'npc_guardian',
1138
+ 'Death Touch off-limits guard',
1139
+ ),
1140
+ ],
1141
+ cites: [
1142
+ 'npcs_special.cpp:719-723 GuardianOfB SPELL_DEATHTOUCH=5 SAY_AGGRO=2077',
1143
+ 'npcs_special.cpp:725-749 npc_guardianAI',
1144
+ 'npcs_special.cpp:739-742 CastSpell Death Touch TRIGGERED on attack ready',
1145
+ 'npcs_special.cpp:1135-1138 RegisterSelf',
1146
+ 'ContentData: guardianAI not in use by SD2 (still registered)',
1147
+ ],
1148
+ };
1149
+
1150
+ // ScriptDev IR — npc_innkeeper
1151
+
1152
+ // Cite: npcs_special.cpp:771–811 gossip only; RegisterSelf(false). No corpus creature binding — gossip pure
1153
+ // helpers are the product surface.
1154
+ export const NPC_INNKEEPER: ScriptDevIR = {
1155
+ name: 'npc_innkeeper',
1156
+ boundCreatures: [],
1157
+ sourceFile: 'world/npcs_special.cpp',
1158
+ spellIds: [SPELL_TRICK_OR_TREAT, SPELL_TRICK_OR_TREATED],
1159
+ timers: [],
1160
+ gossipHello: {
1161
+ defaultTextId: TEXT_ID_WHAT_TO_DO,
1162
+ cite: 'npcs_special.cpp:771-788 GossipHello; TEXT_ID_WHAT_TO_DO=1853 on select +1',
1163
+ },
1164
+ lifecycle: {
1165
+ onReset: [
1166
+ {
1167
+ kind: 'flavor',
1168
+ text: 'gossip-only innkeeper (innkeeperGossipHello/Select); Hallow\'s End 24751 gated by !HasAura(24755)',
1169
+ cite: 'npcs_special.cpp:771-811',
1170
+ },
1171
+ ],
1172
+ },
1173
+ cites: [
1174
+ 'npcs_special.cpp:760-766 enums TEXT_ID / SPELL_TRICK_OR_TREAT 24751 / TREATED 24755',
1175
+ 'npcs_special.cpp:771-788 GossipHello_npc_innkeeper',
1176
+ 'npcs_special.cpp:791-811 GossipSelect_npc_innkeeper',
1177
+ 'npcs_special.cpp:1140-1144 RegisterSelf(false) - disabled by default',
1178
+ ],
1179
+ };
1180
+
1181
+ // ScriptDev IR — npc_redemption_target
1182
+
1183
+ // Cite: npcs_special.cpp:834–959 Symbol of Life revive chain. Bindings: 6172 Henze Faulk, 6177 Narm Faulk
1184
+ // PRESENT; TBC furbolg/blood knight not corpus-bound. Spells 31225/32343 dispositioned orphans (TBC-only).
1185
+ export const NPC_REDEMPTION_TARGET: ScriptDevIR = {
1186
+ name: 'npc_redemption_target',
1187
+ boundCreatures: [NPC_HENZE_FAULK, NPC_NARM_FAULK],
1188
+ sourceFile: 'world/npcs_special.cpp',
1189
+ spellIds: [
1190
+ SPELL_SYMBOL_OF_LIFE,
1191
+ SPELL_QUEST_SELF_HEALING,
1192
+ // Documented TBC residual ids (dispositioned; not combat-fired in Classic)
1193
+ SPELL_SHIMMERING_VESSEL,
1194
+ SPELL_REVIVE_SELF,
1195
+ ],
1196
+ timers: [],
1197
+ spellHits: [
1198
+ {
1199
+ spellId: SPELL_SYMBOL_OF_LIFE,
1200
+ playerCaster: true,
1201
+ actions: [
1202
+ {
1203
+ kind: 'cast_self',
1204
+ spellId: SPELL_QUEST_SELF_HEALING,
1205
+ castFlags: CAST_FLAG.TRIGGERED,
1206
+ cite: 'npcs_special.cpp:864 DoCastSpellIfCan SPELL_QUEST_SELF_HEALING 25155',
1207
+ },
1208
+ {
1209
+ kind: 'flavor',
1210
+ text: `stand; remove DYNFLAG_DEAD; evadeTimer=${REDEMPTION_EVADE_TIMER_MS}; orient=${REDEMPTION_ORIENTATION_MS}; text=${REDEMPTION_TEXT_MS}; emote=${REDEMPTION_EMOTE_MS}`,
1211
+ cite: 'npcs_special.cpp:858-872 DoReviveSelf',
1212
+ },
1213
+ ],
1214
+ cite: 'npcs_special.cpp:948-958 PaladinQuestReviveSelf OnEffectExecute spell 8593',
1215
+ },
1216
+ ],
1217
+ lifecycle: {
1218
+ onReset: [
1219
+ {
1220
+ kind: 'flavor',
1221
+ text: 'timers 0; RemoveFlag QUESTGIVER; DYNFLAG_DEAD; STAND_DEAD',
1222
+ cite: 'npcs_special.cpp:845-856 Reset',
1223
+ },
1224
+ ],
1225
+ onEvade: [
1226
+ {
1227
+ kind: 'flavor',
1228
+ text: '2min evade timer expires → EnterEvadeMode → Reset dead pose',
1229
+ cite: 'npcs_special.cpp:930-938',
1230
+ },
1231
+ ],
1232
+ },
1233
+ cites: [
1234
+ 'npcs_special.cpp:818-832 enums Symbol of Life / self heal / TBC vessels',
1235
+ 'npcs_special.cpp:834-941 npc_redemption_targetAI',
1236
+ 'npcs_special.cpp:858-872 DoReviveSelf',
1237
+ 'npcs_special.cpp:867 2*MINUTE*IN_MILLISECONDS evade',
1238
+ 'npcs_special.cpp:869-871 3000/4000/7000 orientation/text/emote',
1239
+ 'npcs_special.cpp:898-906 Henze/Narm QUESTGIVER text 2283; TBC kill credit',
1240
+ 'npcs_special.cpp:948-958 spell_paladin_quest_revive_self',
1241
+ 'npcs_special.cpp:1146-1149 RegisterSelf',
1242
+ 'spell-refs-orphans 31225/32343 dispositioned (TBC-only, not in spell_template)',
1243
+ ],
1244
+ };
1245
+
1246
+ // ScriptDev IR — npc_the_cleaner
1247
+
1248
+ // Cite: npcs_special.cpp:970–1014 Immunity + 3s empty-threat despawn. Binding 14503 ABSENT →
1249
+ // unused-binding.
1250
+ export const NPC_THE_CLEANER_SCRIPT: ScriptDevIR = {
1251
+ name: 'npc_the_cleaner',
1252
+ boundCreatures: [NPC_THE_CLEANER],
1253
+ sourceFile: 'world/npcs_special.cpp',
1254
+ spellIds: [SPELL_IMMUNITY],
1255
+ timers: [],
1256
+ lifecycle: {
1257
+ onReset: [
1258
+ {
1259
+ kind: 'cast_self',
1260
+ spellId: SPELL_IMMUNITY,
1261
+ castFlags: CAST_FLAG.TRIGGERED,
1262
+ cite: 'npcs_special.cpp:978 DoCastSpellIfCan SPELL_IMMUNITY 29230 CAST_TRIGGERED',
1263
+ },
1264
+ {
1265
+ kind: 'flavor',
1266
+ text: `m_uiDespawnTimer=${CLEANER_DESPAWN_TIMER_MS}`,
1267
+ cite: 'npcs_special.cpp:979',
1268
+ },
1269
+ ],
1270
+ onAggro: [
1271
+ {
1272
+ kind: 'yell',
1273
+ textId: SAY_CLEANER_AGGRO,
1274
+ cite: 'npcs_special.cpp:982-984 Aggro DoScriptText SAY_CLEANER_AGGRO',
1275
+ },
1276
+ ],
1277
+ onEvade: [
1278
+ {
1279
+ kind: 'force_despawn',
1280
+ delayMs: 0,
1281
+ cite: 'npcs_special.cpp:987-991 EnterEvadeMode → ForcedDespawn',
1282
+ },
1283
+ ],
1284
+ },
1285
+ unusedBindings: [
1286
+ absentCreature(NPC_THE_CLEANER, 'The Cleaner', 'npc_the_cleaner', 'immunity despawn helper'),
1287
+ ],
1288
+ cites: [
1289
+ 'npcs_special.cpp:964-968 SPELL_IMMUNITY=29230 SAY_CLEANER_AGGRO',
1290
+ 'npcs_special.cpp:970-1008 npc_the_cleanerAI',
1291
+ 'npcs_special.cpp:978-979 Reset immunity + despawn timer 3000',
1292
+ 'npcs_special.cpp:994-1002 empty threat ForcedDespawn',
1293
+ 'npcs_special.cpp:1151-1154 RegisterSelf',
1294
+ ],
1295
+ };
1296
+
1297
+ // ScriptDev IR — npc_aoe_damage_trigger
1298
+
1299
+ // Cite: npcs_special.cpp:1029–1061 Void Zone Consumption every 2500ms. Binding 16697 ABSENT →
1300
+ // unused-binding.
1301
+ export const NPC_AOE_DAMAGE_TRIGGER: ScriptDevIR = {
1302
+ name: 'npc_aoe_damage_trigger',
1303
+ boundCreatures: [NPC_VOID_ZONE],
1304
+ sourceFile: 'world/npcs_special.cpp',
1305
+ spellIds: [SPELL_CONSUMPTION_NPC_16697],
1306
+ timers: [
1307
+ {
1308
+ id: 'consumption',
1309
+ spellId: SPELL_CONSUMPTION_NPC_16697,
1310
+ initialMinMs: VOID_ZONE_CONSUMPTION_TIMER_MS,
1311
+ initialMaxMs: VOID_ZONE_CONSUMPTION_TIMER_MS,
1312
+ repeatMinMs: VOID_ZONE_CONSUMPTION_TIMER_MS,
1313
+ repeatMaxMs: VOID_ZONE_CONSUMPTION_TIMER_MS,
1314
+ target: 'self',
1315
+ castFlags: CAST_FLAG.TRIGGERED | CAST_FLAG.AURA_NOT_PRESENT,
1316
+ creatureEntry: NPC_VOID_ZONE,
1317
+ cite: 'npcs_special.cpp:1033 AddCustomAction(1, 2500); :1055-1057 CAST_TRIGGERED|AURA_NOT_PRESENT 28874',
1318
+ },
1319
+ ],
1320
+ lifecycle: {
1321
+ onReset: [
1322
+ {
1323
+ kind: 'flavor',
1324
+ text: 'REACT_PASSIVE; aura passive set from entry (Void Zone → 28874)',
1325
+ cite: 'npcs_special.cpp:1031-1034,1044-1052',
1326
+ },
1327
+ ],
1328
+ },
1329
+ unusedBindings: [
1330
+ absentCreature(NPC_VOID_ZONE, 'Void Zone', 'npc_aoe_damage_trigger', 'Consumption aura zone'),
1331
+ ],
1332
+ cites: [
1333
+ 'npcs_special.cpp:1020-1027 NPC_VOID_ZONE=16697 SPELL_CONSUMPTION=28874',
1334
+ 'npcs_special.cpp:1029-1061 npc_aoe_damage_triggerAI',
1335
+ 'npcs_special.cpp:1039-1041 GetTimer 2500',
1336
+ 'npcs_special.cpp:1055-1057 CastConsumption',
1337
+ 'npcs_special.cpp:1156-1159 RegisterSelf',
1338
+ ],
1339
+ };
1340
+
1341
+ // ScriptDev IR — npc_advanced_target_dummy
1342
+
1343
+ // Cite: npcs_special.cpp:1083–1107 15s → Suicide 7. Binding 2674 PRESENT — createSession END STATE =
1344
+ // killable / suicide timer. Spawn effect 4507 not in corpus spellIds and missing bake — residual only.
1345
+ export const NPC_ADVANCED_TARGET_DUMMY_SCRIPT: ScriptDevIR = {
1346
+ name: 'npc_advanced_target_dummy',
1347
+ boundCreatures: [NPC_ADVANCED_TARGET_DUMMY],
1348
+ sourceFile: 'world/npcs_special.cpp',
1349
+ spellIds: [SPELL_SUICIDE],
1350
+ timers: [
1351
+ {
1352
+ id: 'suicide',
1353
+ spellId: SPELL_SUICIDE,
1354
+ initialMinMs: TARGET_DUMMY_DIE_TIMER_MS,
1355
+ initialMaxMs: TARGET_DUMMY_DIE_TIMER_MS,
1356
+ // One-shot die; re-arm value unused after unit dies
1357
+ repeatMinMs: TARGET_DUMMY_DIE_TIMER_MS,
1358
+ repeatMaxMs: TARGET_DUMMY_DIE_TIMER_MS,
1359
+ target: 'self',
1360
+ cite: 'npcs_special.cpp:1085 m_dieTimer(15000); :1100-1102 DoCastSpellIfCan SUICIDE 7',
1361
+ },
1362
+ ],
1363
+ lifecycle: {
1364
+ onReset: [
1365
+ {
1366
+ kind: 'flavor',
1367
+ text: `REACT_PASSIVE; ctor DoCast TARGET_DUMMY_SPAWN_EFFECT ${TARGET_DUMMY_SPAWN_EFFECT} (not corpus spellIds / missing bake - residual); m_dieTimer=${TARGET_DUMMY_DIE_TIMER_MS}`,
1368
+ cite: 'npcs_special.cpp:1085-1089',
1369
+ },
1370
+ ],
1371
+ },
1372
+ cites: [
1373
+ 'npcs_special.cpp:1077-1081 SUICIDE=7 TARGET_DUMMY_SPAWN_EFFECT=4507',
1374
+ 'npcs_special.cpp:1083-1107 npc_advanced_target_dummyAI',
1375
+ 'npcs_special.cpp:1085 m_dieTimer 15000',
1376
+ 'npcs_special.cpp:1100-1102 cast Suicide',
1377
+ 'npcs_special.cpp:1161-1164 RegisterSelf',
1378
+ ],
1379
+ };