warscript 0.0.1-dev.91da42b → 0.0.1-dev.9381e62

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 (301) hide show
  1. package/core/dummy.lua +4 -2
  2. package/core/types/effect.d.ts +11 -1
  3. package/core/types/effect.lua +43 -77
  4. package/core/types/frame.d.ts +1 -0
  5. package/core/types/frame.lua +112 -37
  6. package/core/types/handle.lua +9 -9
  7. package/core/types/item.d.ts +1 -0
  8. package/core/types/item.lua +1 -0
  9. package/core/types/player.d.ts +2 -1
  10. package/core/types/player.lua +18 -13
  11. package/core/types/playerColor.lua +4 -3
  12. package/core/types/sound.d.ts +1 -1
  13. package/core/types/sound.lua +14 -9
  14. package/core/types/unit.d.ts +5 -0
  15. package/core/types/unit.lua +5 -0
  16. package/core/util.d.ts +3 -1
  17. package/core/util.lua +109 -3
  18. package/decl/native.d.ts +705 -7
  19. package/engine/behaviour/ability/apply-unit-behavior.lua +5 -0
  20. package/engine/behaviour/ability/damage.d.ts +4 -0
  21. package/engine/behaviour/ability/damage.lua +19 -15
  22. package/engine/behaviour/ability/emulate-impact.lua +5 -4
  23. package/engine/behaviour/ability/on-command-impact.d.ts +1 -0
  24. package/engine/behaviour/ability/on-command-impact.lua +1 -0
  25. package/engine/behaviour/ability.d.ts +11 -5
  26. package/engine/behaviour/ability.lua +54 -0
  27. package/engine/behaviour/unit/stun-immunity.d.ts +1 -1
  28. package/engine/behaviour/unit/stun-immunity.lua +5 -4
  29. package/engine/behaviour/unit.d.ts +1 -0
  30. package/engine/behaviour/unit.lua +14 -3
  31. package/engine/buff.d.ts +61 -25
  32. package/engine/buff.lua +330 -156
  33. package/engine/index.d.ts +2 -1
  34. package/engine/internal/ability.d.ts +4 -0
  35. package/engine/internal/ability.lua +56 -36
  36. package/engine/internal/item/fields.d.ts +12 -0
  37. package/engine/internal/item/fields.lua +33 -0
  38. package/engine/internal/item/owner-cache.d.ts +5 -0
  39. package/engine/internal/item/owner-cache.lua +4 -0
  40. package/engine/internal/item+owner.d.ts +2 -0
  41. package/engine/internal/item+owner.lua +27 -4
  42. package/engine/internal/item.d.ts +20 -5
  43. package/engine/internal/item.lua +146 -57
  44. package/engine/internal/mechanics/cast-ability.lua +6 -3
  45. package/engine/internal/misc/unit-ability-level-natives.lua +12 -0
  46. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  47. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  48. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  49. package/engine/internal/object-data/health-bonus.lua +16 -0
  50. package/engine/internal/object-data/health-regeneration-rate-increase.d.ts +2 -0
  51. package/engine/internal/object-data/health-regeneration-rate-increase.lua +48 -0
  52. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  53. package/engine/internal/object-data/mana-bonus.lua +16 -0
  54. package/engine/internal/unit/ability.lua +15 -3
  55. package/engine/internal/unit/add-item-to-slot-init.lua +3 -14
  56. package/engine/internal/unit/add-item-to-slot.lua +53 -12
  57. package/engine/internal/unit/appearance.d.ts +15 -0
  58. package/engine/internal/unit/appearance.lua +85 -0
  59. package/engine/internal/unit/bonus.d.ts +12 -0
  60. package/engine/internal/unit/bonus.lua +92 -8
  61. package/engine/internal/unit/buff.d.ts +2 -2
  62. package/engine/internal/unit/buff.lua +34 -19
  63. package/engine/internal/unit/equipment-inventory.d.ts +44 -0
  64. package/engine/internal/unit/equipment-inventory.lua +233 -0
  65. package/engine/internal/unit/expiration-timer.lua +1 -1
  66. package/engine/internal/unit/extended-inventory.d.ts +25 -0
  67. package/engine/internal/unit/extended-inventory.lua +99 -0
  68. package/engine/internal/unit/ignore-events-items.lua +10 -1
  69. package/engine/internal/unit/{item.d.ts → inventory.d.ts} +7 -3
  70. package/engine/internal/unit/inventory.lua +87 -0
  71. package/engine/internal/unit/item-container.d.ts +25 -0
  72. package/engine/internal/unit/item-container.lua +11 -0
  73. package/engine/internal/unit/item-order-events.d.ts +17 -0
  74. package/engine/internal/unit/item-order-events.lua +67 -0
  75. package/engine/internal/unit/item-slot.d.ts +27 -0
  76. package/engine/internal/unit/item-slot.lua +92 -0
  77. package/engine/internal/unit/order.d.ts +3 -3
  78. package/engine/internal/unit/order.lua +10 -10
  79. package/engine/internal/unit/pseudo-passive-abilities.d.ts +2 -0
  80. package/engine/internal/unit/pseudo-passive-abilities.lua +11 -0
  81. package/engine/internal/unit/range-event.d.ts +12 -0
  82. package/engine/internal/unit/range-event.lua +90 -0
  83. package/engine/internal/unit+ability.d.ts +2 -1
  84. package/engine/internal/unit+ability.lua +63 -2
  85. package/engine/internal/unit+bonus.lua +3 -3
  86. package/engine/internal/unit+damage.d.ts +9 -0
  87. package/engine/internal/unit+damage.lua +33 -0
  88. package/engine/internal/unit+rally.lua +9 -31
  89. package/engine/internal/unit-missile-data.lua +58 -32
  90. package/engine/internal/unit-missile-launch.lua +13 -13
  91. package/engine/internal/unit.d.ts +2 -10
  92. package/engine/internal/unit.lua +92 -133
  93. package/engine/local-client.d.ts +26 -0
  94. package/engine/local-client.lua +294 -54
  95. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -0
  96. package/engine/object-data/auxiliary/attachment-preset.lua +7 -0
  97. package/engine/object-data/auxiliary/equipment-slot.d.ts +12 -0
  98. package/engine/object-data/auxiliary/equipment-slot.lua +2 -0
  99. package/engine/object-data/auxiliary/equipment-type.d.ts +12 -0
  100. package/engine/object-data/auxiliary/equipment-type.lua +26 -0
  101. package/engine/object-data/auxiliary/item-class.d.ts +11 -0
  102. package/engine/object-data/auxiliary/item-class.lua +2 -0
  103. package/engine/object-data/auxiliary/item-tag.d.ts +12 -0
  104. package/engine/object-data/auxiliary/item-tag.lua +2 -0
  105. package/engine/object-data/auxiliary/order-type.d.ts +939 -0
  106. package/engine/object-data/auxiliary/order-type.lua +2 -0
  107. package/engine/object-data/auxiliary/sound-set-name.d.ts +14 -3
  108. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  109. package/engine/object-data/entry/ability-type/apprehend.d.ts +22 -0
  110. package/engine/object-data/entry/ability-type/apprehend.lua +66 -0
  111. package/engine/object-data/entry/ability-type/armor-bonus.d.ts +8 -0
  112. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  113. package/engine/object-data/entry/ability-type/aura-of-blight.d.ts +13 -0
  114. package/engine/object-data/entry/ability-type/aura-of-blight.lua +39 -0
  115. package/engine/object-data/entry/ability-type/banshee.d.ts +8 -0
  116. package/engine/object-data/entry/ability-type/banshee.lua +13 -0
  117. package/engine/object-data/entry/ability-type/banshees-wail-damage-amp.d.ts +12 -0
  118. package/engine/object-data/entry/ability-type/banshees-wail-damage-amp.lua +27 -0
  119. package/engine/object-data/entry/ability-type/banshees-wail.d.ts +31 -0
  120. package/engine/object-data/entry/ability-type/banshees-wail.lua +117 -0
  121. package/engine/object-data/entry/ability-type/battering-ram.d.ts +33 -0
  122. package/engine/object-data/entry/ability-type/battering-ram.lua +130 -0
  123. package/engine/object-data/entry/ability-type/blank-configurable.d.ts +3 -0
  124. package/engine/object-data/entry/ability-type/blank-configurable.lua +30 -0
  125. package/engine/object-data/entry/ability-type/breath-of-fire.d.ts +11 -0
  126. package/engine/object-data/entry/ability-type/breath-of-fire.lua +27 -0
  127. package/engine/object-data/entry/ability-type/cleansing-fire.d.ts +27 -0
  128. package/engine/object-data/entry/ability-type/cleansing-fire.lua +104 -0
  129. package/engine/object-data/entry/ability-type/consecration.d.ts +15 -0
  130. package/engine/object-data/entry/ability-type/consecration.lua +52 -0
  131. package/engine/object-data/entry/ability-type/cooldown-reduction.d.ts +12 -0
  132. package/engine/object-data/entry/ability-type/cooldown-reduction.lua +39 -0
  133. package/engine/object-data/entry/ability-type/critical-strike-system.d.ts +18 -0
  134. package/engine/object-data/entry/ability-type/critical-strike-system.lua +65 -0
  135. package/engine/object-data/entry/ability-type/deathseeker-arrows.d.ts +21 -0
  136. package/engine/object-data/entry/ability-type/deathseeker-arrows.lua +78 -0
  137. package/engine/object-data/entry/ability-type/equipment-inventory-interface.d.ts +8 -0
  138. package/engine/object-data/entry/ability-type/equipment-inventory-interface.lua +13 -0
  139. package/engine/object-data/entry/ability-type/equipment-inventory.d.ts +13 -0
  140. package/engine/object-data/entry/ability-type/equipment-inventory.lua +27 -0
  141. package/engine/object-data/entry/ability-type/equipment.d.ts +13 -0
  142. package/engine/object-data/entry/ability-type/equipment.lua +27 -0
  143. package/engine/object-data/entry/ability-type/firebolt.d.ts +7 -0
  144. package/engine/object-data/entry/ability-type/firebolt.lua +13 -0
  145. package/engine/object-data/entry/ability-type/flame-strike.d.ts +25 -0
  146. package/engine/object-data/entry/ability-type/flame-strike.lua +92 -0
  147. package/engine/object-data/entry/ability-type/grant-talent-point.d.ts +8 -0
  148. package/engine/object-data/entry/ability-type/grant-talent-point.lua +13 -0
  149. package/engine/object-data/entry/ability-type/grim-conviction.d.ts +36 -0
  150. package/engine/object-data/entry/ability-type/grim-conviction.lua +131 -0
  151. package/engine/object-data/entry/ability-type/grit.d.ts +18 -0
  152. package/engine/object-data/entry/ability-type/grit.lua +65 -0
  153. package/engine/object-data/entry/ability-type/guiding-hand.d.ts +27 -0
  154. package/engine/object-data/entry/ability-type/guiding-hand.lua +104 -0
  155. package/engine/object-data/entry/ability-type/headsplitter.d.ts +27 -0
  156. package/engine/object-data/entry/ability-type/headsplitter.lua +104 -0
  157. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → healing-modifier.d.ts} +4 -3
  158. package/engine/object-data/entry/ability-type/healing-modifier.lua +26 -0
  159. package/engine/object-data/entry/ability-type/healing-ward-aura.d.ts +13 -0
  160. package/engine/object-data/entry/ability-type/healing-ward-aura.lua +39 -0
  161. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  162. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  163. package/engine/object-data/entry/ability-type/heroic-slash.d.ts +18 -0
  164. package/engine/object-data/entry/ability-type/heroic-slash.lua +65 -0
  165. package/engine/object-data/entry/ability-type/holy-wrath.d.ts +30 -0
  166. package/engine/object-data/entry/ability-type/holy-wrath.lua +117 -0
  167. package/engine/object-data/entry/ability-type/inspire-courage.d.ts +18 -0
  168. package/engine/object-data/entry/ability-type/inspire-courage.lua +65 -0
  169. package/engine/object-data/entry/ability-type/item-life-regeneration.d.ts +10 -0
  170. package/engine/object-data/entry/ability-type/item-life-regeneration.lua +26 -0
  171. package/engine/object-data/entry/ability-type/life-drain.d.ts +37 -0
  172. package/engine/object-data/entry/ability-type/life-drain.lua +144 -0
  173. package/engine/object-data/entry/ability-type/lights-mercy.d.ts +27 -0
  174. package/engine/object-data/entry/ability-type/lights-mercy.lua +104 -0
  175. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  176. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  177. package/engine/object-data/entry/ability-type/mana-efficiency.d.ts +12 -0
  178. package/engine/object-data/entry/ability-type/mana-efficiency.lua +39 -0
  179. package/engine/object-data/entry/ability-type/mind-control.d.ts +21 -0
  180. package/engine/object-data/entry/ability-type/mind-control.lua +78 -0
  181. package/engine/object-data/entry/ability-type/on-attack-cast-spell.d.ts +21 -0
  182. package/engine/object-data/entry/ability-type/on-attack-cast-spell.lua +52 -0
  183. package/engine/object-data/entry/ability-type/on-basic-attack-cast-spell.d.ts +19 -0
  184. package/engine/object-data/entry/ability-type/on-basic-attack-cast-spell.lua +65 -0
  185. package/engine/object-data/entry/ability-type/on-hit-cast-spell.d.ts +15 -0
  186. package/engine/object-data/entry/ability-type/on-hit-cast-spell.lua +26 -0
  187. package/engine/object-data/entry/ability-type/on-magic-attack-cast-spell.d.ts +6 -0
  188. package/engine/object-data/entry/ability-type/on-magic-attack-cast-spell.lua +12 -0
  189. package/engine/object-data/entry/ability-type/provoke.d.ts +21 -0
  190. package/engine/object-data/entry/ability-type/provoke.lua +66 -0
  191. package/engine/object-data/entry/ability-type/rain-of-fire.d.ts +7 -0
  192. package/engine/object-data/entry/ability-type/rain-of-fire.lua +13 -0
  193. package/engine/object-data/entry/ability-type/raise-the-banner.d.ts +9 -0
  194. package/engine/object-data/entry/ability-type/raise-the-banner.lua +26 -0
  195. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  196. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  197. package/engine/object-data/entry/ability-type/resolve.d.ts +12 -0
  198. package/engine/object-data/entry/ability-type/resolve.lua +39 -0
  199. package/engine/object-data/entry/ability-type/righteous-fury.d.ts +33 -0
  200. package/engine/object-data/entry/ability-type/righteous-fury.lua +130 -0
  201. package/engine/object-data/entry/ability-type/sacred-aura.d.ts +27 -0
  202. package/engine/object-data/entry/ability-type/sacred-aura.lua +104 -0
  203. package/engine/object-data/entry/ability-type/soul-burn.d.ts +22 -0
  204. package/engine/object-data/entry/ability-type/soul-burn.lua +79 -0
  205. package/engine/object-data/entry/ability-type/soul-lantern.d.ts +30 -0
  206. package/engine/object-data/entry/ability-type/soul-lantern.lua +117 -0
  207. package/engine/object-data/entry/ability-type/spell-amp.d.ts +15 -0
  208. package/engine/object-data/entry/ability-type/spell-amp.lua +52 -0
  209. package/engine/object-data/entry/ability-type/spell-critical-strike.d.ts +12 -0
  210. package/engine/object-data/entry/ability-type/spell-critical-strike.lua +39 -0
  211. package/engine/object-data/entry/ability-type/spell-vamp.d.ts +12 -0
  212. package/engine/object-data/entry/ability-type/spell-vamp.lua +39 -0
  213. package/engine/object-data/entry/ability-type/stackable-evasion.d.ts +9 -0
  214. package/engine/object-data/entry/ability-type/stackable-evasion.lua +13 -0
  215. package/engine/object-data/entry/ability-type/stackable-hardened-skin.d.ts +21 -0
  216. package/engine/object-data/entry/ability-type/stackable-hardened-skin.lua +78 -0
  217. package/engine/object-data/entry/ability-type/stackable-life-steal.d.ts +9 -0
  218. package/engine/object-data/entry/ability-type/stackable-life-steal.lua +26 -0
  219. package/engine/object-data/entry/ability-type/stackable-spell-damage-reduction.d.ts +9 -0
  220. package/engine/object-data/entry/ability-type/stackable-spell-damage-reduction.lua +13 -0
  221. package/engine/object-data/entry/ability-type/stackable-thorn-shield.d.ts +9 -0
  222. package/engine/object-data/entry/ability-type/stackable-thorn-shield.lua +13 -0
  223. package/engine/object-data/entry/ability-type/stat-details.d.ts +12 -0
  224. package/engine/object-data/entry/ability-type/stat-details.lua +27 -0
  225. package/engine/object-data/entry/ability-type/surge-of-light.d.ts +33 -0
  226. package/engine/object-data/entry/ability-type/surge-of-light.lua +130 -0
  227. package/engine/object-data/entry/ability-type/sweeping-strike.d.ts +57 -0
  228. package/engine/object-data/entry/ability-type/sweeping-strike.lua +234 -0
  229. package/engine/object-data/entry/ability-type/talents.d.ts +12 -0
  230. package/engine/object-data/entry/ability-type/talents.lua +27 -0
  231. package/engine/object-data/entry/ability-type/unyielding-guard.d.ts +30 -0
  232. package/engine/object-data/entry/ability-type/unyielding-guard.lua +117 -0
  233. package/engine/object-data/entry/ability-type/valiant-charge.d.ts +27 -0
  234. package/engine/object-data/entry/ability-type/valiant-charge.lua +104 -0
  235. package/engine/object-data/entry/ability-type/warcry.d.ts +9 -0
  236. package/engine/object-data/entry/ability-type/warcry.lua +26 -0
  237. package/engine/object-data/entry/ability-type/withering-fire.d.ts +21 -0
  238. package/engine/object-data/entry/ability-type/withering-fire.lua +78 -0
  239. package/engine/object-data/entry/ability-type.d.ts +25 -6
  240. package/engine/object-data/entry/ability-type.lua +244 -8
  241. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  242. package/engine/object-data/entry/buff-type.d.ts +6 -2
  243. package/engine/object-data/entry/buff-type.lua +26 -0
  244. package/engine/object-data/entry/destructible-type.d.ts +6 -2
  245. package/engine/object-data/entry/destructible-type.lua +26 -0
  246. package/engine/object-data/entry/item-type.d.ts +18 -3
  247. package/engine/object-data/entry/item-type.lua +84 -0
  248. package/engine/object-data/entry/lightning-type.d.ts +6 -8
  249. package/engine/object-data/entry/lightning-type.lua +1 -1
  250. package/engine/object-data/entry/sound-preset.d.ts +2 -2
  251. package/engine/object-data/entry/unit-type.d.ts +47 -2
  252. package/engine/object-data/entry/unit-type.lua +383 -49
  253. package/engine/object-data/entry/upgrade.d.ts +2 -2
  254. package/engine/object-data/entry.d.ts +6 -1
  255. package/engine/object-data/entry.lua +8 -0
  256. package/engine/object-field/ability.lua +2 -2
  257. package/engine/object-field/item.d.ts +22 -0
  258. package/engine/object-field/item.lua +118 -0
  259. package/engine/object-field.d.ts +1 -1
  260. package/engine/object-field.lua +9 -7
  261. package/engine/random.d.ts +1 -0
  262. package/engine/random.lua +8 -0
  263. package/engine/standard/entries/ability-type.d.ts +3102 -7
  264. package/engine/standard/entries/ability-type.lua +0 -6
  265. package/engine/standard/entries/buff-type.d.ts +45 -0
  266. package/engine/standard/entries/buff-type.lua +43 -0
  267. package/engine/standard/entries/item-type.d.ts +1299 -0
  268. package/engine/standard/entries/item-type.lua +2 -0
  269. package/engine/standard/entries/lightning-type.d.ts +42 -15
  270. package/engine/standard/entries/lightning-type.lua +0 -14
  271. package/engine/standard/entries/unit-type.d.ts +5 -0
  272. package/engine/standard/entries/unit-type.lua +5 -0
  273. package/engine/standard/fields/item.d.ts +4 -0
  274. package/engine/standard/fields/item.lua +6 -0
  275. package/engine/unit.d.ts +6 -1
  276. package/engine/unit.lua +6 -1
  277. package/event.d.ts +1 -1
  278. package/lualib_bundle.lua +1 -1
  279. package/math.d.ts +2 -0
  280. package/math.lua +14 -0
  281. package/network.lua +25 -1
  282. package/objutil/buff.lua +10 -8
  283. package/objutil/object.lua +1 -1
  284. package/operation.d.ts +8 -1
  285. package/operation.lua +38 -18
  286. package/package.json +3 -23
  287. package/patch-lua.lua +15 -0
  288. package/utility/linked-map.d.ts +35 -0
  289. package/utility/linked-map.lua +107 -0
  290. package/utility/linked-set.d.ts +3 -1
  291. package/utility/linked-set.lua +27 -0
  292. package/utility/random.d.ts +102 -0
  293. package/utility/random.lua +273 -0
  294. package/utility/records.lua +20 -1
  295. package/utility/unordered-map.d.ts +27 -0
  296. package/utility/unordered-map.lua +99 -0
  297. package/engine/internal/unit/item.lua +0 -78
  298. /package/engine/internal/{object-data/armor-increase.d.ts → misc/unit-ability-level-natives.d.ts} +0 -0
  299. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  300. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  301. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
@@ -1,6 +1,6 @@
1
1
  local ____exports = {}
2
- local ____attribute_2Dincrease = require("engine.object-data.entry.ability-type.attribute-increase")
3
- local AttributeBonusAbilityType = ____attribute_2Dincrease.AttributeBonusAbilityType
2
+ local ____attribute_2Dbonus = require("engine.object-data.entry.ability-type.attribute-bonus")
3
+ local AttributeBonusAbilityType = ____attribute_2Dbonus.AttributeBonusAbilityType
4
4
  ---
5
5
  -- @internal For use by internal systems.
6
6
  ____exports.ATTRIBUTE_BONUS_DUMMY_ABILITY_TYPE_ID = compiletime(function()
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export {};
@@ -0,0 +1,16 @@
1
+ local ____exports = {}
2
+ local ____health_2Dbonus = require("engine.object-data.entry.ability-type.health-bonus")
3
+ local HealthBonusAbilityType = ____health_2Dbonus.HealthBonusAbilityType
4
+ ---
5
+ -- @internal For use by internal systems only.
6
+ ____exports.HEALTH_BONUS_DUMMY_ABILITY_TYPE_ID = compiletime(function()
7
+ local abilityType = HealthBonusAbilityType:create()
8
+ abilityType.isInternal = true
9
+ abilityType.isButtonVisible = false
10
+ abilityType.healthBonus = 0
11
+ return abilityType.id
12
+ end)
13
+ ---
14
+ -- @internal For use by internal systems only.
15
+ ____exports.HEALTH_BONUS_DUMMY_ABILITY_FIELD = ABILITY_ILF_MAX_LIFE_GAINED
16
+ return ____exports
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export {};
@@ -0,0 +1,48 @@
1
+ local ____exports = {}
2
+ local ____healing_2Dward_2Daura = require("engine.object-data.entry.ability-type.healing-ward-aura")
3
+ local HealingWardAuraAbilityType = ____healing_2Dward_2Daura.HealingWardAuraAbilityType
4
+ local ____item_2Dlife_2Dregeneration = require("engine.object-data.entry.ability-type.item-life-regeneration")
5
+ local ItemLifeRegenerationAbilityType = ____item_2Dlife_2Dregeneration.ItemLifeRegenerationAbilityType
6
+ local ____combat_2Dclassification = require("engine.object-data.auxiliary.combat-classification")
7
+ local combatClassificationsOf = ____combat_2Dclassification.combatClassificationsOf
8
+ local function createHealthRegenerationDummyAbilityType(healthRegeneration)
9
+ local abilityType = ItemLifeRegenerationAbilityType:create()
10
+ abilityType.isInternal = true
11
+ abilityType.isButtonVisible = false
12
+ abilityType.healthRegeneration = healthRegeneration
13
+ return abilityType.id
14
+ end
15
+ ---
16
+ -- @internal For use by internal systems. The ability at index `i` regenerates `2^i` hit
17
+ -- points per second; together they compose any value from 0 to 1023.
18
+ ____exports.HEALTH_REGENERATION_RATE_INCREASE_DUMMY_ABILITY_TYPE_IDS = compiletime(function()
19
+ local abilityTypeIds = {}
20
+ for i = 0, 9 do
21
+ abilityTypeIds[i + 1] = createHealthRegenerationDummyAbilityType(1 << i)
22
+ end
23
+ return abilityTypeIds
24
+ end)
25
+ ---
26
+ -- @internal For use by internal systems.
27
+ ____exports.HEALTH_REGENERATION_RATE_DECREASE_DUMMY_VALUE = -1024
28
+ ---
29
+ -- @internal For use by internal systems. Shifts negative values into the positive range.
30
+ ____exports.HEALTH_REGENERATION_RATE_DECREASE_DUMMY_ABILITY_TYPE_ID = compiletime(function() return createHealthRegenerationDummyAbilityType(____exports.HEALTH_REGENERATION_RATE_DECREASE_DUMMY_VALUE) end)
31
+ ---
32
+ -- @internal For use by internal systems. Holds the fractional remainder; being an aura,
33
+ -- it accepts field writes but applies with the usual aura delay.
34
+ ____exports.FRACTIONAL_HEALTH_REGENERATION_RATE_INCREASE_DUMMY_ABILITY_TYPE_ID = compiletime(function()
35
+ local abilityType = HealingWardAuraAbilityType:create()
36
+ abilityType.isInternal = true
37
+ abilityType.isButtonVisible = false
38
+ abilityType.healthRegeneration = 0
39
+ abilityType.isHealthRegenerationPercentage = false
40
+ abilityType.allowedTargetCombatClassifications = combatClassificationsOf(4096)
41
+ abilityType.buffTypeIds = {}
42
+ abilityType.targetEffectPresets = {}
43
+ return abilityType.id
44
+ end)
45
+ ---
46
+ -- @internal For use by internal systems.
47
+ ____exports.FRACTIONAL_HEALTH_REGENERATION_RATE_INCREASE_ABILITY_FIELD = ABILITY_RLF_AMOUNT_OF_HIT_POINTS_REGENERATED
48
+ return ____exports
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export {};
@@ -0,0 +1,16 @@
1
+ local ____exports = {}
2
+ local ____mana_2Dbonus = require("engine.object-data.entry.ability-type.mana-bonus")
3
+ local ManaBonusAbilityType = ____mana_2Dbonus.ManaBonusAbilityType
4
+ ---
5
+ -- @internal For use by internal systems only.
6
+ ____exports.MANA_BONUS_DUMMY_ABILITY_TYPE_ID = compiletime(function()
7
+ local abilityType = ManaBonusAbilityType:create()
8
+ abilityType.isInternal = true
9
+ abilityType.isButtonVisible = false
10
+ abilityType.manaBonus = 0
11
+ return abilityType.id
12
+ end)
13
+ ---
14
+ -- @internal For use by internal systems only.
15
+ ____exports.MANA_BONUS_DUMMY_ABILITY_FIELD = ABILITY_ILF_MAX_MANA_GAINED
16
+ return ____exports
@@ -28,6 +28,9 @@ local ____lua_2Dsets = require("utility.lua-sets")
28
28
  local luaSetOf = ____lua_2Dsets.luaSetOf
29
29
  local ____attributes = require("attributes")
30
30
  local attribute = ____attributes.attribute
31
+ local ____pseudo_2Dpassive_2Dabilities = require("engine.internal.unit.pseudo-passive-abilities")
32
+ local pseudoPassiveAbilityOrderTypeStringId = ____pseudo_2Dpassive_2Dabilities.pseudoPassiveAbilityOrderTypeStringId
33
+ local pseudoPassiveAbilityTypeIds = ____pseudo_2Dpassive_2Dabilities.pseudoPassiveAbilityTypeIds
31
34
  local eventInvoke = Event.invoke
32
35
  local condition = Condition
33
36
  local createTrigger = CreateTrigger
@@ -90,7 +93,7 @@ local function createCommonEvent(underlyingEvent)
90
93
  underlyingEvent,
91
94
  3,
92
95
  function(caster, ability)
93
- return true, caster, ability
96
+ return not (pseudoPassiveAbilityTypeIds[ability.typeId] ~= nil), caster, ability
94
97
  end
95
98
  )
96
99
  end
@@ -170,7 +173,7 @@ local function createNoTargetEvent(underlyingEvent)
170
173
  underlyingEvent,
171
174
  1,
172
175
  function(caster, ability, targetUnit, targetItem, targetDestructible, x, y)
173
- if x == 0 and y == 0 and targetUnit == nil and targetItem == nil and targetDestructible == nil then
176
+ if x == 0 and y == 0 and targetUnit == nil and targetItem == nil and targetDestructible == nil and not (pseudoPassiveAbilityTypeIds[ability.typeId] ~= nil) then
174
177
  return true, caster, ability
175
178
  else
176
179
  return false
@@ -381,7 +384,11 @@ rawset(
381
384
  if unit ~= nil then
382
385
  local ability = unit:getAbility(abilityTypeId)
383
386
  if ability ~= nil then
384
- eventInvoke(event, unit, ability, orderTypeStringId)
387
+ if pseudoPassiveAbilityTypeIds[ability.typeId] ~= nil then
388
+ ability:interruptCast()
389
+ else
390
+ eventInvoke(event, unit, ability, orderTypeStringId)
391
+ end
385
392
  end
386
393
  end
387
394
  end)
@@ -477,4 +484,9 @@ internalAbilityChannelingStartEvent:addListener(
477
484
  end
478
485
  end
479
486
  )
487
+ local function doNothing()
488
+ end
489
+ for pseudoPassiveAbilityTypeId in pairs(pseudoPassiveAbilityTypeIds) do
490
+ Unit.abilityCommandEvent[pseudoPassiveAbilityTypeId][pseudoPassiveAbilityOrderTypeStringId]:addListener(999999, doNothing)
491
+ end
480
492
  return ____exports
@@ -2,22 +2,11 @@ local ____exports = {}
2
2
  local ____unit = require("engine.internal.unit")
3
3
  local Unit = ____unit.Unit
4
4
  local ____add_2Ditem_2Dto_2Dslot = require("engine.internal.unit.add-item-to-slot")
5
- local fillerItems = ____add_2Ditem_2Dto_2Dslot.fillerItems
6
- local unitsWithFillerItems = ____add_2Ditem_2Dto_2Dslot.unitsWithFillerItems
7
- local setItemVisible = SetItemVisible
8
- local unitRemoveItem = UnitRemoveItem
5
+ local unitRemoveFillerItems = ____add_2Ditem_2Dto_2Dslot.unitRemoveFillerItems
9
6
  Unit.itemPickedUpEvent:addListener(
10
- 4,
7
+ 999999,
11
8
  function(unit)
12
- local handle = unit.handle
13
- if unitsWithFillerItems[handle] ~= nil then
14
- for previousSlot = 1, 6 do
15
- local fillerItem = fillerItems[previousSlot]
16
- unitRemoveItem(handle, fillerItem)
17
- setItemVisible(fillerItem, false)
18
- end
19
- unitsWithFillerItems[handle] = nil
20
- end
9
+ unitRemoveFillerItems(unit.handle)
21
10
  end
22
11
  )
23
12
  return ____exports
@@ -4,9 +4,14 @@ local BlankItemType = ____blank.BlankItemType
4
4
  local ____arrays = require("utility.arrays")
5
5
  local array = ____arrays.array
6
6
  local ____ignore_2Devents_2Ditems = require("engine.internal.unit.ignore-events-items")
7
- local ignoreEventsItems = ____ignore_2Devents_2Ditems.ignoreEventsItems
7
+ local ignoreEventsItemTypeIds = ____ignore_2Devents_2Ditems.ignoreEventsItemTypeIds
8
+ local ____item_2Dcontainer = require("engine.internal.unit.item-container")
9
+ local UNIT_EXTENDED_INVENTORY_SLOT_COUNT = ____item_2Dcontainer.UNIT_EXTENDED_INVENTORY_SLOT_COUNT
10
+ local UNIT_INVENTORY_SLOT_COUNT = ____item_2Dcontainer.UNIT_INVENTORY_SLOT_COUNT
8
11
  local setItemVisible = SetItemVisible
9
12
  local unitAddItem = UnitAddItem
13
+ local unitInventorySize = UnitInventorySize
14
+ local unitItemInBagSlot = UnitItemInBagSlot
10
15
  local unitItemInSlot = UnitItemInSlot
11
16
  local unitRemoveItem = UnitRemoveItem
12
17
  ---
@@ -16,14 +21,15 @@ ____exports.SLOT_FILLER_ITEM_TYPE_ID = compiletime(function()
16
21
  itemType.name = "[Warscript/Dummy] Slot Filler"
17
22
  return itemType.id
18
23
  end)
19
- ---
24
+ ignoreEventsItemTypeIds[____exports.SLOT_FILLER_ITEM_TYPE_ID] = true
25
+ --- Enough fillers to occupy every regular and extended inventory slot that precedes the last extended one.
26
+ --
20
27
  -- @internal For use by internal systems only.
21
28
  ____exports.fillerItems = array(
22
- 6,
29
+ UNIT_INVENTORY_SLOT_COUNT + UNIT_EXTENDED_INVENTORY_SLOT_COUNT,
23
30
  function()
24
31
  local item = CreateItem(____exports.SLOT_FILLER_ITEM_TYPE_ID, 0, 0)
25
32
  setItemVisible(item, false)
26
- ignoreEventsItems[item] = true
27
33
  return item
28
34
  end
29
35
  )
@@ -32,21 +38,56 @@ ____exports.fillerItems = array(
32
38
  ____exports.unitsWithFillerItems = {}
33
39
  ---
34
40
  -- @internal For use by internal systems only.
35
- ____exports.unitAddItemToSlot = function(unit, item, slot)
36
- for previousSlot = 0, slot - 1 do
37
- if unitItemInSlot(unit, previousSlot) == nil then
38
- unitAddItem(unit, ____exports.fillerItems[previousSlot + 1])
39
- ____exports.unitsWithFillerItems[unit] = true
41
+ ____exports.unitRemoveFillerItems = function(unit)
42
+ if ____exports.unitsWithFillerItems[unit] ~= nil then
43
+ for ____, fillerItem in ipairs(____exports.fillerItems) do
44
+ unitRemoveItem(unit, fillerItem)
45
+ setItemVisible(fillerItem, false)
46
+ end
47
+ ____exports.unitsWithFillerItems[unit] = nil
48
+ end
49
+ end
50
+ --- Adds an item to a unit so that it lands in a specific slot of its regular or extended inventory.
51
+ --
52
+ -- The engine fills slots in order (the regular inventory first, then the extended one), so every empty slot
53
+ -- preceding the target is temporarily occupied by a filler item. Unlike `moveslot` orders, this works
54
+ -- regardless of whether the unit can currently act.
55
+ --
56
+ -- @internal For use by internal systems only.
57
+ ____exports.unitAddItemToSlot = function(unit, item, slot, containerType)
58
+ if containerType == nil then
59
+ containerType = 0
60
+ end
61
+ local fillerCount = 0
62
+ local function fillEmptySlots(slotCount, itemInSlot)
63
+ for precedingSlot = 0, slotCount - 1 do
64
+ if itemInSlot(unit, precedingSlot) == nil then
65
+ unitAddItem(unit, ____exports.fillerItems[fillerCount + 1])
66
+ fillerCount = fillerCount + 1
67
+ end
40
68
  end
41
69
  end
42
- unitAddItem(unit, item)
70
+ if containerType == 0 then
71
+ fillEmptySlots(slot, unitItemInSlot)
72
+ else
73
+ fillEmptySlots(
74
+ unitInventorySize(unit),
75
+ unitItemInSlot
76
+ )
77
+ fillEmptySlots(slot, unitItemInBagSlot)
78
+ end
79
+ if fillerCount > 0 then
80
+ ____exports.unitsWithFillerItems[unit] = true
81
+ end
82
+ local result = unitAddItem(unit, item)
43
83
  if ____exports.unitsWithFillerItems[unit] ~= nil then
44
- for previousSlot = 0, slot - 1 do
45
- local fillerItem = ____exports.fillerItems[previousSlot + 1]
84
+ for fillerIndex = 0, fillerCount - 1 do
85
+ local fillerItem = ____exports.fillerItems[fillerIndex + 1]
46
86
  unitRemoveItem(unit, fillerItem)
47
87
  setItemVisible(fillerItem, false)
48
88
  end
49
89
  ____exports.unitsWithFillerItems[unit] = nil
50
90
  end
91
+ return result
51
92
  end
52
93
  return ____exports
@@ -0,0 +1,15 @@
1
+ /** @noSelfInFile */
2
+ declare module "../unit" {
3
+ interface Unit {
4
+ getAnimationDuration(this: Unit, animation: string | number): number;
5
+ setAurasEnabled(this: Unit, enabled: boolean, affectsUI?: boolean): void;
6
+ isHeroGlowAllowed: boolean;
7
+ maximumFlyHeight: number;
8
+ showsAirToGroundIndicator: boolean;
9
+ alwaysDisplaysHealth: boolean;
10
+ }
11
+ interface UnitWeapon {
12
+ resetAttack(this: UnitWeapon): void;
13
+ }
14
+ }
15
+ export {};
@@ -0,0 +1,85 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
3
+ local ____exports = {}
4
+ local ____unit = require("engine.internal.unit")
5
+ local Unit = ____unit.Unit
6
+ local UnitWeapon = ____unit.UnitWeapon
7
+ local allowHeroGlowOnUnit = AllowHeroGlowOnUnit
8
+ local disallowHeroGlowOnUnit = DisallowHeroGlowOnUnit
9
+ local getUnitAnimationDuration = BlzGetUnitAnimationDuration
10
+ local getUnitAnimationDurationByIndex = BlzGetUnitAnimationDurationByIndex
11
+ local getUnitBooleanField = BlzGetUnitBooleanField
12
+ local getUnitRealField = BlzGetUnitRealField
13
+ local heroGlowIsAllowedOnUnit = HeroGlowIsAllowedOnUnit
14
+ local resetUnitAttack = BlzResetUnitAttack
15
+ local setUnitBooleanField = BlzSetUnitBooleanField
16
+ local setUnitRealField = BlzSetUnitRealField
17
+ local unitEnableAuras = BlzUnitEnableAuras
18
+ Unit.prototype.getAnimationDuration = function(self, animation)
19
+ if type(animation) == "number" then
20
+ return getUnitAnimationDurationByIndex(self.handle, animation)
21
+ end
22
+ return getUnitAnimationDuration(self.handle, animation)
23
+ end
24
+ Unit.prototype.setAurasEnabled = function(self, enabled, affectsUI)
25
+ if affectsUI == nil then
26
+ affectsUI = true
27
+ end
28
+ unitEnableAuras(self.handle, enabled, affectsUI)
29
+ end
30
+ __TS__ObjectDefineProperty(
31
+ Unit.prototype,
32
+ "isHeroGlowAllowed",
33
+ {
34
+ get = function(self)
35
+ return heroGlowIsAllowedOnUnit(self.handle)
36
+ end,
37
+ set = function(self, allowed)
38
+ if allowed then
39
+ allowHeroGlowOnUnit(self.handle)
40
+ else
41
+ disallowHeroGlowOnUnit(self.handle)
42
+ end
43
+ end
44
+ }
45
+ )
46
+ __TS__ObjectDefineProperty(
47
+ Unit.prototype,
48
+ "maximumFlyHeight",
49
+ {
50
+ get = function(self)
51
+ return getUnitRealField(self.handle, UNIT_RF_FLY_MAX_HEIGHT)
52
+ end,
53
+ set = function(self, height)
54
+ setUnitRealField(self.handle, UNIT_RF_FLY_MAX_HEIGHT, height)
55
+ end
56
+ }
57
+ )
58
+ __TS__ObjectDefineProperty(
59
+ Unit.prototype,
60
+ "showsAirToGroundIndicator",
61
+ {
62
+ get = function(self)
63
+ return getUnitBooleanField(self.handle, UNIT_BF_SHOW_AIR_TO_GROUND)
64
+ end,
65
+ set = function(self, show)
66
+ setUnitBooleanField(self.handle, UNIT_BF_SHOW_AIR_TO_GROUND, show)
67
+ end
68
+ }
69
+ )
70
+ __TS__ObjectDefineProperty(
71
+ Unit.prototype,
72
+ "alwaysDisplaysHealth",
73
+ {
74
+ get = function(self)
75
+ return getUnitBooleanField(self.handle, UNIT_BF_FORCE_DISPLAY_HP)
76
+ end,
77
+ set = function(self, show)
78
+ setUnitBooleanField(self.handle, UNIT_BF_FORCE_DISPLAY_HP, show)
79
+ end
80
+ }
81
+ )
82
+ UnitWeapon.prototype.resetAttack = function(self)
83
+ resetUnitAttack(self.unit.handle, self.index)
84
+ end
85
+ return ____exports
@@ -5,6 +5,8 @@ export type UnitBonusId<Brand extends string = any> = number & {
5
5
  readonly __unitBonusId: unique symbol;
6
6
  readonly __unitBonusIdBrand: Brand;
7
7
  };
8
+ export type UnitMaxHealthBonusId = UnitBonusId<"maxHealth">;
9
+ export type UnitMaxManaBonusId = UnitBonusId<"maxMana">;
8
10
  export type UnitArmorBonusId = UnitBonusId<"armor">;
9
11
  export type UnitAttackSpeedFactorBonusId = UnitBonusId<"attackSpeedFactor">;
10
12
  export type UnitMovementSpeedFactorBonusId = UnitBonusId<"movementSpeedFactor">;
@@ -13,6 +15,7 @@ export type UnitDamageFactorBonusId = UnitBonusId<"damageFactor">;
13
15
  export type UnitReceivedDamageFactorBonusId = UnitBonusId<"receivedDamageFactor">;
14
16
  export type UnitEvasionProbabilityBonusId = UnitBonusId<"evasionProbability">;
15
17
  export type UnitManaRegenerationRateFactorBonusId = UnitBonusId<"manaRegenerationRateFactor">;
18
+ export type UnitHealthRegenerationRateBonusId = UnitBonusId<"healthRegenerationRate">;
16
19
  export type UnitBonusType<Id extends UnitBonusId = UnitBonusId> = ({
17
20
  abilityTypeId: AbilityTypeId;
18
21
  field: jabilityintegerlevelfield;
@@ -24,12 +27,19 @@ export type UnitBonusType<Id extends UnitBonusId = UnitBonusId> = ({
24
27
  } | {
25
28
  abilityTypeId?: undefined;
26
29
  valueByUnit: LuaMap<Unit, number>;
30
+ apply?: undefined;
31
+ } | {
32
+ abilityTypeId?: undefined;
33
+ valueByUnit?: undefined;
34
+ apply: (this: void, unitHandle: junit, value: number) => void;
27
35
  }) & {
28
36
  reduce: (this: void, array: number[]) => number;
29
37
  initialValue: number;
30
38
  readonly __unitBonusTypeId?: Id;
31
39
  };
32
40
  export declare namespace UnitBonusType {
41
+ const HEALTH: UnitBonusType<UnitMaxHealthBonusId>;
42
+ const MANA: UnitBonusType<UnitMaxManaBonusId>;
33
43
  const ARMOR: UnitBonusType<UnitArmorBonusId>;
34
44
  const ATTACK_SPEED_FACTOR: UnitBonusType<UnitAttackSpeedFactorBonusId>;
35
45
  const MOVEMENT_SPEED_FACTOR: UnitBonusType<UnitAttackSpeedFactorBonusId>;
@@ -38,6 +48,8 @@ export declare namespace UnitBonusType {
38
48
  const RECEIVED_DAMAGE_FACTOR: UnitBonusType<UnitReceivedDamageFactorBonusId>;
39
49
  const EVASION_PROBABILITY: UnitBonusType<UnitEvasionProbabilityBonusId>;
40
50
  const MANA_REGENERATION_RATE_FACTOR: UnitBonusType<UnitManaRegenerationRateFactorBonusId>;
51
+ /** Supported range: -1000 to 1000; the total is clamped to it. */
52
+ const HEALTH_REGENERATION_RATE: UnitBonusType<UnitHealthRegenerationRateBonusId>;
41
53
  }
42
54
  export declare const addUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, value: number) => Id;
43
55
  export declare const removeUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id) => boolean;
@@ -1,11 +1,14 @@
1
1
  local ____exports = {}
2
+ local applyAbilityBonus, applyHealthRegenerationRateBonus
2
3
  local ____unit = require("engine.internal.unit")
3
4
  local Unit = ____unit.Unit
4
- local ____armor_2Dincrease = require("engine.internal.object-data.armor-increase")
5
- local ARMOR_BONUS_DUMMY_ABILITY_FIELD = ____armor_2Dincrease.ARMOR_BONUS_DUMMY_ABILITY_FIELD
6
- local ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID = ____armor_2Dincrease.ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID
5
+ local ____armor_2Dbonus = require("engine.internal.object-data.armor-bonus")
6
+ local ARMOR_BONUS_DUMMY_ABILITY_FIELD = ____armor_2Dbonus.ARMOR_BONUS_DUMMY_ABILITY_FIELD
7
+ local ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID = ____armor_2Dbonus.ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID
7
8
  local ____utility = require("engine.internal.utility")
8
9
  local addInternalAbility = ____utility.addInternalAbility
10
+ local ____unit_2Dability_2Dlevel_2Dnatives = require("engine.internal.misc.unit-ability-level-natives")
11
+ local rawSetUnitAbilityLevel = ____unit_2Dability_2Dlevel_2Dnatives.rawSetUnitAbilityLevel
9
12
  local ____arrays = require("utility.arrays")
10
13
  local product = ____arrays.product
11
14
  local sum = ____arrays.sum
@@ -24,9 +27,21 @@ local MOVEMENT_SPEED_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID = ____movement_2Dspee
24
27
  local ____evasion_2Dprobability = require("engine.internal.object-data.evasion-probability")
25
28
  local EVASION_PROBABILITY_ABILITY_FIELD = ____evasion_2Dprobability.EVASION_PROBABILITY_ABILITY_FIELD
26
29
  local EVASION_PROBABILITY_DUMMY_ABILITY_TYPE_ID = ____evasion_2Dprobability.EVASION_PROBABILITY_DUMMY_ABILITY_TYPE_ID
30
+ local ____health_2Dbonus = require("engine.internal.object-data.health-bonus")
31
+ local HEALTH_BONUS_DUMMY_ABILITY_FIELD = ____health_2Dbonus.HEALTH_BONUS_DUMMY_ABILITY_FIELD
32
+ local HEALTH_BONUS_DUMMY_ABILITY_TYPE_ID = ____health_2Dbonus.HEALTH_BONUS_DUMMY_ABILITY_TYPE_ID
33
+ local ____mana_2Dbonus = require("engine.internal.object-data.mana-bonus")
34
+ local MANA_BONUS_DUMMY_ABILITY_FIELD = ____mana_2Dbonus.MANA_BONUS_DUMMY_ABILITY_FIELD
35
+ local MANA_BONUS_DUMMY_ABILITY_TYPE_ID = ____mana_2Dbonus.MANA_BONUS_DUMMY_ABILITY_TYPE_ID
27
36
  local ____mana_2Dregeneration_2Drate_2Dincrease_2Dfactor = require("engine.internal.object-data.mana-regeneration-rate-increase-factor")
28
37
  local MANA_REGENERATION_RATE_INCREASE_FACTOR_ABILITY_FIELD = ____mana_2Dregeneration_2Drate_2Dincrease_2Dfactor.MANA_REGENERATION_RATE_INCREASE_FACTOR_ABILITY_FIELD
29
38
  local MANA_REGENERATION_RATE_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID = ____mana_2Dregeneration_2Drate_2Dincrease_2Dfactor.MANA_REGENERATION_RATE_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID
39
+ local ____health_2Dregeneration_2Drate_2Dincrease = require("engine.internal.object-data.health-regeneration-rate-increase")
40
+ local FRACTIONAL_HEALTH_REGENERATION_RATE_INCREASE_ABILITY_FIELD = ____health_2Dregeneration_2Drate_2Dincrease.FRACTIONAL_HEALTH_REGENERATION_RATE_INCREASE_ABILITY_FIELD
41
+ local FRACTIONAL_HEALTH_REGENERATION_RATE_INCREASE_DUMMY_ABILITY_TYPE_ID = ____health_2Dregeneration_2Drate_2Dincrease.FRACTIONAL_HEALTH_REGENERATION_RATE_INCREASE_DUMMY_ABILITY_TYPE_ID
42
+ local HEALTH_REGENERATION_RATE_DECREASE_DUMMY_ABILITY_TYPE_ID = ____health_2Dregeneration_2Drate_2Dincrease.HEALTH_REGENERATION_RATE_DECREASE_DUMMY_ABILITY_TYPE_ID
43
+ local HEALTH_REGENERATION_RATE_DECREASE_DUMMY_VALUE = ____health_2Dregeneration_2Drate_2Dincrease.HEALTH_REGENERATION_RATE_DECREASE_DUMMY_VALUE
44
+ local HEALTH_REGENERATION_RATE_INCREASE_DUMMY_ABILITY_TYPE_IDS = ____health_2Dregeneration_2Drate_2Dincrease.HEALTH_REGENERATION_RATE_INCREASE_DUMMY_ABILITY_TYPE_IDS
30
45
  local damageFactorByUnit = {}
31
46
  local receivedDamageFactorByUnit = {}
32
47
  local function atLeastOnceProbability(array)
@@ -39,6 +54,20 @@ end
39
54
  ____exports.UnitBonusType = {}
40
55
  local UnitBonusType = ____exports.UnitBonusType
41
56
  do
57
+ UnitBonusType.HEALTH = {
58
+ abilityTypeId = HEALTH_BONUS_DUMMY_ABILITY_TYPE_ID,
59
+ field = HEALTH_BONUS_DUMMY_ABILITY_FIELD,
60
+ integer = true,
61
+ reduce = sum,
62
+ initialValue = 0
63
+ }
64
+ UnitBonusType.MANA = {
65
+ abilityTypeId = MANA_BONUS_DUMMY_ABILITY_TYPE_ID,
66
+ field = MANA_BONUS_DUMMY_ABILITY_FIELD,
67
+ integer = true,
68
+ reduce = sum,
69
+ initialValue = 0
70
+ }
42
71
  UnitBonusType.ARMOR = {
43
72
  abilityTypeId = ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID,
44
73
  field = ARMOR_BONUS_DUMMY_ABILITY_FIELD,
@@ -83,33 +112,88 @@ do
83
112
  reduce = sum,
84
113
  initialValue = 0
85
114
  }
115
+ --- Supported range: -1000 to 1000; the total is clamped to it.
116
+ UnitBonusType.HEALTH_REGENERATION_RATE = {
117
+ apply = function(unitHandle, value) return applyHealthRegenerationRateBonus(unitHandle, value) end,
118
+ reduce = sum,
119
+ initialValue = 0
120
+ }
86
121
  end
87
122
  local bonusesByUnitByBonusType = {}
88
123
  local nextId = 1
124
+ local ceil = math.ceil
125
+ local floor = math.floor
126
+ local max = math.max
127
+ local min = math.min
89
128
  local function processUnitBonus(unit, bonusType, bonusesArray)
90
129
  local unitHandle = unit.handle
91
130
  local totalValue = bonusType.reduce(bonusesArray)
92
131
  local abilityTypeId = bonusType.abilityTypeId
93
132
  if abilityTypeId == nil then
94
133
  local valueByUnit = bonusType.valueByUnit
95
- if totalValue == bonusType.initialValue then
134
+ if valueByUnit == nil then
135
+ bonusType.apply(unitHandle, totalValue)
136
+ elseif totalValue == bonusType.initialValue then
96
137
  valueByUnit[unit] = nil
97
138
  else
98
139
  valueByUnit[unit] = totalValue
99
140
  end
100
141
  return
101
142
  end
102
- if totalValue == bonusType.initialValue then
143
+ applyAbilityBonus(
144
+ unitHandle,
145
+ abilityTypeId,
146
+ bonusType.field,
147
+ bonusType.integer,
148
+ totalValue,
149
+ bonusType.initialValue
150
+ )
151
+ end
152
+ applyAbilityBonus = function(unitHandle, abilityTypeId, field, integer, value, initialValue)
153
+ if value == initialValue then
103
154
  UnitRemoveAbility(unitHandle, abilityTypeId)
104
155
  return
105
156
  end
106
157
  local abilityHandle = checkNotNull(addInternalAbility(unitHandle, abilityTypeId))
107
- check((bonusType.integer and BlzSetAbilityIntegerLevelField or BlzSetAbilityRealLevelField)(abilityHandle, bonusType.field, 0, totalValue))
158
+ check((integer and BlzSetAbilityIntegerLevelField or BlzSetAbilityRealLevelField)(abilityHandle, field, 0, value))
108
159
  BlzSetAbilityIntegerField(abilityHandle, ABILITY_IF_LEVELS, 2)
109
- SetUnitAbilityLevel(unitHandle, abilityTypeId, 2)
110
- SetUnitAbilityLevel(unitHandle, abilityTypeId, 1)
160
+ rawSetUnitAbilityLevel(unitHandle, abilityTypeId, 2)
161
+ rawSetUnitAbilityLevel(unitHandle, abilityTypeId, 1)
111
162
  BlzSetAbilityIntegerField(abilityHandle, ABILITY_IF_LEVELS, 1)
112
163
  end
164
+ local function setInternalAbilityPresence(unitHandle, abilityTypeId, present)
165
+ if present then
166
+ addInternalAbility(unitHandle, abilityTypeId)
167
+ else
168
+ UnitRemoveAbility(unitHandle, abilityTypeId)
169
+ end
170
+ end
171
+ local MINIMUM_HEALTH_REGENERATION_RATE_BONUS = -1000
172
+ local MAXIMUM_HEALTH_REGENERATION_RATE_BONUS = 1000
173
+ applyHealthRegenerationRateBonus = function(unitHandle, value)
174
+ value = max(
175
+ MINIMUM_HEALTH_REGENERATION_RATE_BONUS,
176
+ min(value, MAXIMUM_HEALTH_REGENERATION_RATE_BONUS)
177
+ )
178
+ local integerValue = value < 0 and ceil(value) or floor(value)
179
+ local remainder = integerValue
180
+ setInternalAbilityPresence(unitHandle, HEALTH_REGENERATION_RATE_DECREASE_DUMMY_ABILITY_TYPE_ID, remainder < 0)
181
+ if remainder < 0 then
182
+ remainder = remainder - HEALTH_REGENERATION_RATE_DECREASE_DUMMY_VALUE
183
+ end
184
+ for ____, abilityTypeId in ipairs(HEALTH_REGENERATION_RATE_INCREASE_DUMMY_ABILITY_TYPE_IDS) do
185
+ setInternalAbilityPresence(unitHandle, abilityTypeId, remainder % 2 == 1)
186
+ remainder = floor(remainder / 2)
187
+ end
188
+ applyAbilityBonus(
189
+ unitHandle,
190
+ FRACTIONAL_HEALTH_REGENERATION_RATE_INCREASE_DUMMY_ABILITY_TYPE_ID,
191
+ FRACTIONAL_HEALTH_REGENERATION_RATE_INCREASE_ABILITY_FIELD,
192
+ false,
193
+ value - integerValue,
194
+ 0
195
+ )
196
+ end
113
197
  ____exports.addUnitBonus = function(unit, bonusType, value)
114
198
  local bonusesByUnit = bonusesByUnitByBonusType[bonusType]
115
199
  if bonusesByUnit == nil then
@@ -32,7 +32,7 @@ declare module "../unit" {
32
32
  * @param includeAuras Whether to remove aura buffs. Default `true`.
33
33
  * @param autoDispel Unknown. Default `false`.
34
34
  */
35
- removeBuffs(polarity?: BuffPolarity, resistanceType?: BuffResistanceType, includeExpirationTimers?: boolean, includeAuras?: boolean, autoDispel?: boolean): void;
36
- removeBuffs(buffTypeIds: number[]): void;
35
+ removeBuffs(polarity?: BuffPolarity, resistanceType?: BuffResistanceType, includeExpirationTimers?: boolean, includeAuras?: boolean, autoDispel?: boolean): number;
36
+ removeBuffs(buffTypeIds: number[]): number;
37
37
  }
38
38
  }