warscript 0.0.1-dev.70ae346 → 0.0.1-dev.70c1215

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 (177) hide show
  1. package/attributes.d.ts +6 -0
  2. package/attributes.lua +17 -1
  3. package/core/types/effect.d.ts +1 -3
  4. package/core/types/effect.lua +26 -29
  5. package/core/types/frame.lua +24 -21
  6. package/core/types/player.d.ts +16 -0
  7. package/core/types/player.lua +60 -15
  8. package/core/types/playerCamera.d.ts +2 -0
  9. package/core/types/playerCamera.lua +123 -5
  10. package/core/types/sound.d.ts +17 -25
  11. package/core/types/sound.lua +91 -46
  12. package/core/types/tileCell.d.ts +11 -1
  13. package/core/types/tileCell.lua +97 -0
  14. package/core/types/timer.d.ts +9 -8
  15. package/core/types/timer.lua +45 -23
  16. package/core/util.lua +6 -1
  17. package/decl/native.d.ts +846 -790
  18. package/destroyable.d.ts +1 -0
  19. package/destroyable.lua +9 -0
  20. package/engine/behavior.d.ts +14 -1
  21. package/engine/behavior.lua +230 -70
  22. package/engine/behaviour/ability/apply-buff.lua +5 -5
  23. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  24. package/engine/behaviour/ability/damage.d.ts +9 -3
  25. package/engine/behaviour/ability/damage.lua +26 -38
  26. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  27. package/engine/behaviour/ability/emulate-impact.lua +18 -3
  28. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  29. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  30. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  31. package/engine/behaviour/ability/restore-mana.lua +6 -6
  32. package/engine/behaviour/ability.d.ts +11 -2
  33. package/engine/behaviour/ability.lua +56 -21
  34. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  35. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  36. package/engine/behaviour/unit.d.ts +40 -2
  37. package/engine/behaviour/unit.lua +269 -6
  38. package/engine/buff.d.ts +40 -18
  39. package/engine/buff.lua +269 -155
  40. package/engine/internal/ability.d.ts +7 -1
  41. package/engine/internal/ability.lua +49 -9
  42. package/engine/internal/item/ability.lua +63 -11
  43. package/engine/internal/item+owner.lua +12 -6
  44. package/engine/internal/item.d.ts +18 -17
  45. package/engine/internal/item.lua +135 -49
  46. package/engine/internal/mechanics/ability-duration.lua +1 -1
  47. package/engine/internal/mechanics/cast-ability.lua +6 -3
  48. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  49. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  50. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  51. package/engine/internal/misc/frame-coordinates.lua +21 -0
  52. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  53. package/engine/internal/misc/get-terrain-z.lua +11 -0
  54. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  55. package/engine/internal/misc/player-local-handle.lua +5 -0
  56. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  57. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  58. package/engine/internal/unit/ability.d.ts +35 -0
  59. package/engine/internal/unit/ability.lua +98 -9
  60. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  61. package/engine/internal/unit/allowed-targets.lua +9 -1
  62. package/engine/internal/unit/attributes.d.ts +17 -0
  63. package/engine/internal/unit/attributes.lua +46 -0
  64. package/engine/internal/unit/bonus.d.ts +2 -0
  65. package/engine/internal/unit/bonus.lua +10 -0
  66. package/engine/internal/unit/fly-height.d.ts +7 -0
  67. package/engine/internal/unit/fly-height.lua +20 -0
  68. package/engine/internal/unit/interrupts.d.ts +12 -0
  69. package/engine/internal/unit/interrupts.lua +28 -0
  70. package/engine/internal/unit/main-selected.lua +12 -27
  71. package/engine/internal/unit/order.d.ts +20 -0
  72. package/engine/internal/unit/order.lua +136 -0
  73. package/engine/internal/unit/range-event.d.ts +12 -0
  74. package/engine/internal/unit/range-event.lua +90 -0
  75. package/engine/internal/unit/scale.d.ts +7 -0
  76. package/engine/internal/unit/scale.lua +20 -0
  77. package/engine/internal/unit+ability.lua +10 -1
  78. package/engine/internal/unit+damage.d.ts +2 -11
  79. package/engine/internal/unit+damage.lua +10 -14
  80. package/engine/internal/unit+spellSteal.lua +1 -2
  81. package/engine/internal/unit-missile-launch.lua +52 -14
  82. package/engine/internal/unit.d.ts +43 -25
  83. package/engine/internal/unit.lua +384 -260
  84. package/engine/local-client.d.ts +2 -0
  85. package/engine/local-client.lua +30 -0
  86. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  87. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  88. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  89. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  90. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  91. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  92. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  93. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  94. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  95. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  96. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  97. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  98. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  99. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  100. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  101. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  102. package/engine/object-data/entry/ability-type/blank-configurable.lua +0 -9
  103. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  104. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  105. package/engine/object-data/entry/ability-type/curse.lua +2 -2
  106. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  107. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  108. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  109. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  110. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  111. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  112. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  113. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  114. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  115. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  116. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  117. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  118. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  119. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  120. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  121. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  122. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  123. package/engine/object-data/entry/ability-type/web.lua +52 -0
  124. package/engine/object-data/entry/ability-type.d.ts +15 -11
  125. package/engine/object-data/entry/ability-type.lua +153 -13
  126. package/engine/object-data/entry/buff-type/applicable.lua +5 -0
  127. package/engine/object-data/entry/buff-type.d.ts +5 -11
  128. package/engine/object-data/entry/buff-type.lua +11 -27
  129. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  130. package/engine/object-data/entry/destructible-type.lua +155 -0
  131. package/engine/object-data/entry/sound-preset.d.ts +17 -0
  132. package/engine/object-data/entry/sound-preset.lua +104 -0
  133. package/engine/object-data/entry/unit-type.d.ts +17 -4
  134. package/engine/object-data/entry/unit-type.lua +197 -85
  135. package/engine/object-field/ability.d.ts +4 -4
  136. package/engine/object-field/ability.lua +7 -6
  137. package/engine/object-field/unit.d.ts +72 -3
  138. package/engine/object-field/unit.lua +268 -7
  139. package/engine/object-field.d.ts +25 -6
  140. package/engine/object-field.lua +357 -118
  141. package/engine/random.d.ts +10 -0
  142. package/engine/random.lua +21 -0
  143. package/engine/standard/entries/buff-type.d.ts +3 -0
  144. package/engine/standard/entries/buff-type.lua +3 -0
  145. package/engine/standard/fields/ability.d.ts +2 -2
  146. package/engine/standard/fields/ability.lua +2 -2
  147. package/engine/standard/fields/unit.d.ts +12 -0
  148. package/engine/standard/fields/unit.lua +20 -0
  149. package/engine/synchronization.d.ts +11 -0
  150. package/engine/synchronization.lua +77 -0
  151. package/engine/text-tag.d.ts +36 -2
  152. package/engine/text-tag.lua +250 -10
  153. package/engine/unit.d.ts +6 -0
  154. package/engine/unit.lua +6 -0
  155. package/net/socket.lua +1 -1
  156. package/objutil/buff.lua +11 -10
  157. package/package.json +2 -2
  158. package/patch-lua.lua +15 -0
  159. package/patch-lualib.lua +1 -1
  160. package/utility/arrays.d.ts +2 -0
  161. package/utility/arrays.lua +11 -0
  162. package/utility/callback-array.d.ts +17 -0
  163. package/utility/callback-array.lua +61 -0
  164. package/utility/functions.d.ts +8 -0
  165. package/utility/functions.lua +13 -0
  166. package/utility/linked-map.d.ts +34 -0
  167. package/utility/linked-map.lua +101 -0
  168. package/utility/linked-set.d.ts +4 -1
  169. package/utility/linked-set.lua +43 -1
  170. package/utility/lua-maps.d.ts +15 -2
  171. package/utility/lua-maps.lua +53 -2
  172. package/utility/lua-sets.d.ts +2 -0
  173. package/utility/lua-sets.lua +7 -0
  174. package/utility/records.lua +20 -1
  175. package/utility/types.d.ts +3 -0
  176. package/core/types/order.d.ts +0 -25
  177. package/core/types/order.lua +0 -55
package/engine/buff.lua CHANGED
@@ -16,6 +16,7 @@ local internalApplyBuff = ____applicable.internalApplyBuff
16
16
  local removeBuff = ____applicable.removeBuff
17
17
  local ____ability = require("engine.internal.ability")
18
18
  local Ability = ____ability.Ability
19
+ local UnitAbility = ____ability.UnitAbility
19
20
  local ____ability = require("engine.object-field.ability")
20
21
  local AbilityBooleanField = ____ability.AbilityBooleanField
21
22
  local AbilityNumberField = ____ability.AbilityNumberField
@@ -28,9 +29,6 @@ local ____math = require("math")
28
29
  local max = ____math.max
29
30
  local min = ____math.min
30
31
  local ____bonus = require("engine.internal.unit.bonus")
31
- local addOrUpdateOrRemoveUnitBonus = ____bonus.addOrUpdateOrRemoveUnitBonus
32
- local getUnitBonus = ____bonus.getUnitBonus
33
- local removeUnitBonus = ____bonus.removeUnitBonus
34
32
  local UnitBonusType = ____bonus.UnitBonusType
35
33
  local ____area_2Ddamage = require("engine.internal.mechanics.area-damage")
36
34
  local damageArea = ____area_2Ddamage.damageArea
@@ -44,6 +42,7 @@ local BuffType = ____buff_2Dtype.BuffType
44
42
  local ____unit = require("engine.behaviour.unit")
45
43
  local UnitBehavior = ____unit.UnitBehavior
46
44
  local ____arrays = require("utility.arrays")
45
+ local emptyArray = ____arrays.emptyArray
47
46
  local forEach = ____arrays.forEach
48
47
  local ____event = require("event")
49
48
  local Event = ____event.Event
@@ -53,6 +52,12 @@ local ____item = require("engine.internal.item")
53
52
  local Item = ____item.Item
54
53
  local ____destructable = require("core.types.destructable")
55
54
  local Destructable = ____destructable.Destructable
55
+ local ____ability = require("engine.standard.fields.ability")
56
+ local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
57
+ local ____ability = require("engine.behaviour.ability")
58
+ local AbilityBehavior = ____ability.AbilityBehavior
59
+ local ____records = require("utility.records")
60
+ local sortedKeysUnnested = ____records.sortedKeysUnnested
56
61
  local getUnitAbility = BlzGetUnitAbility
57
62
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
58
63
  local stringValueByBuffTypeIdByFieldId = {}
@@ -101,6 +106,7 @@ local buffParametersKeys = {
101
106
  armorIncreaseFactor = true,
102
107
  attackSpeedIncreaseFactor = true,
103
108
  movementSpeedIncreaseFactor = true,
109
+ manaRegenerationRateIncreaseFactor = true,
104
110
  evasionProbability = true,
105
111
  missProbability = true,
106
112
  damageFactor = true,
@@ -109,6 +115,7 @@ local buffParametersKeys = {
109
115
  durationIncreaseOnAutoAttack = true,
110
116
  maximumDuration = true,
111
117
  maximumRemainingDuration = true,
118
+ turnsIntoGhost = true,
112
119
  stuns = true,
113
120
  ignoresStunImmunity = true,
114
121
  providesStunImmunity = true,
@@ -123,7 +130,8 @@ local buffParametersKeys = {
123
130
  damageOnExpiration = true,
124
131
  healingOnExpiration = true,
125
132
  killsOnExpiration = true,
126
- explodesOnExpiration = true
133
+ explodesOnExpiration = true,
134
+ abilityCooldownFactor = true
127
135
  }
128
136
  local function resolveEnumValue(ability, level, value)
129
137
  if value == nil or type(value) == "number" then
@@ -174,6 +182,7 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
174
182
  end
175
183
  end
176
184
  local buffBooleanParameters = {
185
+ "turnsIntoGhost",
177
186
  "stuns",
178
187
  "ignoresStunImmunity",
179
188
  "disablesAutoAttack",
@@ -185,6 +194,7 @@ local buffNumberParameters = {
185
194
  "durationIncreaseOnAutoAttack",
186
195
  "attackSpeedIncreaseFactor",
187
196
  "movementSpeedIncreaseFactor",
197
+ "manaRegenerationRateIncreaseFactor",
188
198
  "evasionProbability",
189
199
  "armorIncrease",
190
200
  "damageFactor",
@@ -199,7 +209,8 @@ local buffNumberParameters = {
199
209
  "healingPerInterval",
200
210
  "healingOverDuration",
201
211
  "damageOnExpiration",
202
- "healingOnExpiration"
212
+ "healingOnExpiration",
213
+ "abilityCooldownFactor"
203
214
  }
204
215
  local unsuccessfulApplicationMarker = {}
205
216
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -302,7 +313,8 @@ buffHealingIntervalTimerCallback = function(buff)
302
313
  source:healTarget(buff[101], healingPerInterval)
303
314
  end
304
315
  end
305
- local buffDestroyEvent = __TS__New(Event)
316
+ local buffCreatedEvent = __TS__New(Event)
317
+ local buffBeingDestroyedEvent = __TS__New(Event)
306
318
  ____exports.Buff = __TS__Class()
307
319
  local Buff = ____exports.Buff
308
320
  Buff.name = "Buff"
@@ -317,33 +329,38 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
317
329
  local polarity
318
330
  local resistanceType
319
331
  local ability
332
+ local abilityBehavior
320
333
  if type(typeIdOrTypeIds) ~= "number" then
321
334
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
322
335
  polarity = resistanceTypeOrPolarity
323
336
  resistanceType = abilityOrParametersOrResistanceType
324
- if __TS__InstanceOf(parametersOrAbility, Ability) then
337
+ if __TS__InstanceOf(parametersOrAbility, AbilityBehavior) then
338
+ abilityBehavior = parametersOrAbility
339
+ ability = abilityBehavior.ability
340
+ elseif __TS__InstanceOf(parametersOrAbility, Ability) then
325
341
  ability = parametersOrAbility
326
- else
327
- ability = nil
342
+ elseif parametersOrAbility ~= nil then
328
343
  parameters = parametersOrAbility
329
344
  end
330
345
  else
331
346
  typeId = typeIdOrTypeIds
332
347
  polarity = polarityOrTypeIdSelectionPolicy
333
348
  resistanceType = resistanceTypeOrPolarity
334
- if __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
349
+ if __TS__InstanceOf(abilityOrParametersOrResistanceType, AbilityBehavior) then
350
+ abilityBehavior = abilityOrParametersOrResistanceType
351
+ ability = abilityBehavior.ability
352
+ parameters = parametersOrAbility
353
+ elseif __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
335
354
  ability = abilityOrParametersOrResistanceType
336
355
  parameters = parametersOrAbility
337
- else
338
- ability = nil
356
+ elseif abilityOrParametersOrResistanceType ~= nil then
339
357
  parameters = abilityOrParametersOrResistanceType
358
+ else
359
+ parameters = parametersOrAbility
340
360
  end
341
361
  end
362
+ self.sourceAbilityBehavior = abilityBehavior
342
363
  self.typeId = typeId
343
- if not __TS__InstanceOf(ability, Ability) then
344
- parameters = ability
345
- ability = nil
346
- end
347
364
  local defaultParameters = self.constructor.defaultParameters
348
365
  local level = parameters and parameters.level or defaultParameters.level
349
366
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -371,7 +388,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
371
388
  local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
372
389
  if missProbability ~= nil then
373
390
  missProbability = resolveNumberValue(ability, level, missProbability)
374
- self[141] = missProbability
391
+ self[142] = missProbability
375
392
  end
376
393
  local buffByTypeId = buffByTypeIdByUnit[_unit]
377
394
  if buffByTypeId == nil then
@@ -454,24 +471,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
454
471
  abilityTypeIds = {}
455
472
  self._abilityTypeIds = abilityTypeIds
456
473
  end
457
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
474
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
475
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
458
476
  local addedAbility = _unit:addAbility(abilityTypeId)
459
477
  if addedAbility ~= nil then
460
478
  _unit:makeAbilityPermanent(abilityTypeId, true)
461
479
  _unit:setAbilityLevel(abilityTypeId, 1 + (abilityParameters.level or ability and ability.level or 0))
462
- for abilityParameterKey, abilityParameterValue in pairs(abilityParameters) do
463
- if abilityParameterKey == "isButtonVisible" then
464
- if not resolveBooleanValue(ability, level, abilityParameterValue) then
465
- _unit:hideAbility(abilityTypeId, true)
466
- end
467
- elseif abilityParameterKey ~= "level" then
468
- abilityParameterKey:setValue(
469
- addedAbility,
470
- resolveNumberValue(ability, level, abilityParameterValue)
471
- )
472
- end
480
+ if abilityParameters.isButtonVisible == false then
481
+ _unit:hideAbility(abilityTypeId, true)
482
+ end
483
+ for ____, field in ipairs(abilityParameters.fields or emptyArray()) do
484
+ field[1]:setValue(
485
+ addedAbility,
486
+ resolveNumberValue(ability, level, field[2])
487
+ )
473
488
  end
474
- abilityTypeIds[abilityTypeId] = true
489
+ abilityTypeIds[#abilityTypeIds + 1] = abilityTypeId
475
490
  end
476
491
  end
477
492
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -483,18 +498,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
483
498
  self._behaviors = behaviors
484
499
  end
485
500
  end
486
- local additionalParameters = {}
487
- for key, value in pairs(parameters) do
488
- if not buffParametersKeys[key] then
489
- if ability then
490
- additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, value)
491
- else
492
- additionalParameters[key] = value
501
+ if parameters ~= nil then
502
+ local additionalParameters = {}
503
+ for ____, key in ipairs(sortedKeysUnnested(parameters)) do
504
+ if not buffParametersKeys[key] then
505
+ if ability then
506
+ additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, parameters[key])
507
+ else
508
+ additionalParameters[key] = parameters[key]
509
+ end
493
510
  end
494
511
  end
495
- end
496
- if (next(additionalParameters)) ~= nil then
497
- self.parameters = additionalParameters
512
+ if (next(additionalParameters)) ~= nil then
513
+ self.parameters = additionalParameters
514
+ end
498
515
  end
499
516
  end
500
517
  if duration ~= nil and duration > 0 then
@@ -504,66 +521,73 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
504
521
  end
505
522
  self:onCreate()
506
523
  self[100] = 1
524
+ Event.invoke(buffCreatedEvent, self)
507
525
  end
508
- function Buff.prototype.getUnitBonus(self, bonusType)
509
- local ____opt_38 = self._bonusIdByBonusType
510
- local bonusId = ____opt_38 and ____opt_38[bonusType]
511
- return bonusId == nil and 0 or getUnitBonus(self._unit, bonusType, bonusId)
526
+ function Buff.prototype.onAbilityGained(self, ability)
527
+ if __TS__InstanceOf(ability, UnitAbility) then
528
+ local abilityCooldownModifier = self[144]
529
+ if abilityCooldownModifier then
530
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
531
+ end
532
+ end
512
533
  end
513
- function Buff.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, value)
514
- local bonusIdByBonusType = self._bonusIdByBonusType
515
- if bonusIdByBonusType == nil then
516
- bonusIdByBonusType = {}
517
- self._bonusIdByBonusType = bonusIdByBonusType
534
+ function Buff.prototype.onAbilityLost(self, ability)
535
+ if __TS__InstanceOf(ability, UnitAbility) then
536
+ local abilityCooldownModifier = self[144]
537
+ if abilityCooldownModifier then
538
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
539
+ end
518
540
  end
519
- bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self._unit, bonusType, bonusIdByBonusType[bonusType], value)
520
541
  end
521
542
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
522
543
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
523
544
  Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
524
545
  else
525
546
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
526
- local ____Effect_42 = Effect
527
- local ____Effect_flash_43 = Effect.flash
528
- local ____array_41 = __TS__SparseArrayNew(
547
+ local ____Effect_40 = Effect
548
+ local ____Effect_flash_41 = Effect.flash
549
+ local ____array_39 = __TS__SparseArrayNew(
529
550
  self[105],
530
551
  isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
531
552
  stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
532
553
  )
533
- local ____isWidgetProvided_40
554
+ local ____isWidgetProvided_38
534
555
  if isWidgetProvided then
535
- ____isWidgetProvided_40 = yOrParametersOrDuration
556
+ ____isWidgetProvided_38 = yOrParametersOrDuration
536
557
  else
537
- ____isWidgetProvided_40 = widgetOrXOrParametersOrDuration
558
+ ____isWidgetProvided_38 = widgetOrXOrParametersOrDuration
538
559
  end
539
- __TS__SparseArrayPush(____array_41, ____isWidgetProvided_40)
540
- ____Effect_flash_43(
541
- ____Effect_42,
542
- __TS__SparseArraySpread(____array_41)
560
+ __TS__SparseArrayPush(____array_39, ____isWidgetProvided_38)
561
+ ____Effect_flash_41(
562
+ ____Effect_40,
563
+ __TS__SparseArraySpread(____array_39)
543
564
  )
544
565
  end
545
566
  end
546
567
  function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
547
568
  local isWidgetProvided = type(widgetOrDuration) == "table"
548
- local ____Effect_46 = Effect
549
- local ____Effect_flash_47 = Effect.flash
550
- local ____array_45 = __TS__SparseArrayNew(
569
+ local ____Effect_44 = Effect
570
+ local ____Effect_flash_45 = Effect.flash
571
+ local ____array_43 = __TS__SparseArrayNew(
551
572
  self[106],
552
573
  isWidgetProvided and widgetOrDuration or self._unit,
553
574
  stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
554
575
  )
555
- local ____isWidgetProvided_44
576
+ local ____isWidgetProvided_42
556
577
  if isWidgetProvided then
557
- ____isWidgetProvided_44 = duration
578
+ ____isWidgetProvided_42 = duration
558
579
  else
559
- ____isWidgetProvided_44 = widgetOrDuration
580
+ ____isWidgetProvided_42 = widgetOrDuration
560
581
  end
561
- __TS__SparseArrayPush(____array_45, ____isWidgetProvided_44)
562
- ____Effect_flash_47(
563
- ____Effect_46,
564
- __TS__SparseArraySpread(____array_45)
582
+ __TS__SparseArrayPush(____array_43, ____isWidgetProvided_42)
583
+ ____Effect_flash_45(
584
+ ____Effect_44,
585
+ __TS__SparseArraySpread(____array_43)
565
586
  )
566
587
  end
588
+ function Buff.prototype.expire(self)
589
+ expireBuff(self)
590
+ end
567
591
  function Buff.prototype.onCreate(self)
568
592
  end
569
593
  function Buff.prototype.onDestroy(self)
@@ -592,26 +616,33 @@ function Buff.prototype.onDestroy(self)
592
616
  behavior:destroy()
593
617
  end
594
618
  end
595
- if self[137] then
619
+ local previousAbilityCooldownModifier = self[144]
620
+ if previousAbilityCooldownModifier then
621
+ for ____, ability in ipairs(self._unit.abilities) do
622
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
623
+ end
624
+ end
625
+ if self[139] then
626
+ unit:decrementInvulnerabilityCounter()
627
+ end
628
+ if self[138] then
596
629
  unit:decrementDisableAutoAttackCounter()
597
630
  end
598
- if self[135] then
599
- if self[136] then
600
- unit:decrementStunCounter()
631
+ if self[136] then
632
+ if self[137] then
633
+ unit:decrementForceStunCounter()
601
634
  end
602
635
  unit:decrementStunCounter()
603
636
  end
637
+ if self[135] then
638
+ unit:decrementGhostCounter()
639
+ end
604
640
  if self._abilityTypeIds ~= nil then
605
- for abilityTypeId in pairs(self._abilityTypeIds) do
641
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
606
642
  unit:removeAbility(abilityTypeId)
607
643
  end
608
644
  end
609
- if self._bonusIdByBonusType ~= nil then
610
- for bonusType, bonusId in pairs(self._bonusIdByBonusType) do
611
- removeUnitBonus(unit, bonusType, bonusId)
612
- end
613
- end
614
- Event.invoke(buffDestroyEvent, self)
645
+ Event.invoke(buffBeingDestroyedEvent, self)
615
646
  self[100] = 3
616
647
  return UnitBehavior.prototype.onDestroy(self)
617
648
  end
@@ -640,8 +671,8 @@ function Buff.apply(self, ...)
640
671
  end
641
672
  end
642
673
  function Buff.getByTypeId(self, unit, typeId)
643
- local ____opt_48 = buffByTypeIdByUnit[unit]
644
- local buff = ____opt_48 and ____opt_48[typeId]
674
+ local ____opt_46 = buffByTypeIdByUnit[unit]
675
+ local buff = ____opt_46 and ____opt_46[typeId]
645
676
  if __TS__InstanceOf(buff, self) then
646
677
  return buff
647
678
  end
@@ -655,9 +686,9 @@ function Buff.prototype.onExpiration(self)
655
686
  if self[121] ~= nil then
656
687
  (self[102] or unit):healTarget(unit, self[120] or 0)
657
688
  end
658
- if self[140] then
689
+ if self[141] then
659
690
  unit:explode()
660
- elseif self[139] then
691
+ elseif self[140] then
661
692
  unit:kill()
662
693
  end
663
694
  end
@@ -799,8 +830,8 @@ __TS__SetDescriptor(
799
830
  return
800
831
  end
801
832
  self[112] = damageInterval
802
- local ____opt_50 = self._timer
803
- local elapsed = ____opt_50 and ____opt_50.elapsed or 0
833
+ local ____opt_48 = self._timer
834
+ local elapsed = ____opt_48 and ____opt_48.elapsed or 0
804
835
  local timer = self[114]
805
836
  if timer == nil then
806
837
  timer = Timer:create()
@@ -879,8 +910,8 @@ __TS__SetDescriptor(
879
910
  return
880
911
  end
881
912
  self[117] = healingInterval
882
- local ____opt_52 = self._timer
883
- local elapsed = ____opt_52 and ____opt_52.elapsed or 0
913
+ local ____opt_50 = self._timer
914
+ local elapsed = ____opt_50 and ____opt_50.elapsed or 0
884
915
  local timer = self[119]
885
916
  if timer == nil then
886
917
  timer = Timer:create()
@@ -961,30 +992,53 @@ __TS__SetDescriptor(
961
992
  },
962
993
  true
963
994
  )
995
+ __TS__SetDescriptor(
996
+ Buff.prototype,
997
+ "turnsIntoGhost",
998
+ {
999
+ get = function(self)
1000
+ local ____self__135_52 = self[135]
1001
+ if ____self__135_52 == nil then
1002
+ ____self__135_52 = false
1003
+ end
1004
+ return ____self__135_52
1005
+ end,
1006
+ set = function(self, turnsIntoGhost)
1007
+ if not turnsIntoGhost and self[135] then
1008
+ self.object:decrementGhostCounter()
1009
+ self[135] = nil
1010
+ elseif turnsIntoGhost and not self[135] then
1011
+ self.object:incrementGhostCounter()
1012
+ self[135] = true
1013
+ end
1014
+ end
1015
+ },
1016
+ true
1017
+ )
964
1018
  __TS__SetDescriptor(
965
1019
  Buff.prototype,
966
1020
  "stuns",
967
1021
  {
968
1022
  get = function(self)
969
- local ____self__135_54 = self[135]
970
- if ____self__135_54 == nil then
971
- ____self__135_54 = false
1023
+ local ____self__136_53 = self[136]
1024
+ if ____self__136_53 == nil then
1025
+ ____self__136_53 = false
972
1026
  end
973
- return ____self__135_54
1027
+ return ____self__136_53
974
1028
  end,
975
1029
  set = function(self, stuns)
976
- if not stuns and self[135] then
977
- if self[136] then
978
- self.object:decrementStunCounter()
1030
+ if not stuns and self[136] then
1031
+ if self[137] then
1032
+ self.object:decrementForceStunCounter()
979
1033
  end
980
1034
  self.object:decrementStunCounter()
981
- self[135] = nil
982
- elseif stuns and not self[135] then
983
- if self[136] then
984
- self.object:incrementStunCounter()
1035
+ self[136] = nil
1036
+ elseif stuns and not self[136] then
1037
+ if self[137] then
1038
+ self.object:incrementForceStunCounter()
985
1039
  end
986
1040
  self.object:incrementStunCounter()
987
- self[135] = true
1041
+ self[136] = true
988
1042
  end
989
1043
  end
990
1044
  },
@@ -995,23 +1049,23 @@ __TS__SetDescriptor(
995
1049
  "ignoresStunImmunity",
996
1050
  {
997
1051
  get = function(self)
998
- local ____self__136_55 = self[136]
999
- if ____self__136_55 == nil then
1000
- ____self__136_55 = false
1052
+ local ____self__137_54 = self[137]
1053
+ if ____self__137_54 == nil then
1054
+ ____self__137_54 = false
1001
1055
  end
1002
- return ____self__136_55
1056
+ return ____self__137_54
1003
1057
  end,
1004
1058
  set = function(self, ignoresStunImmunity)
1005
- if not ignoresStunImmunity and self[136] then
1006
- if self[135] then
1007
- self.object:decrementStunCounter()
1059
+ if not ignoresStunImmunity and self[137] then
1060
+ if self[136] then
1061
+ self.object:decrementForceStunCounter()
1008
1062
  end
1009
- self[136] = nil
1010
- elseif ignoresStunImmunity and not self[136] then
1011
- if self[135] then
1012
- self.object:incrementStunCounter()
1063
+ self[137] = nil
1064
+ elseif ignoresStunImmunity and not self[137] then
1065
+ if self[136] then
1066
+ self.object:incrementForceStunCounter()
1013
1067
  end
1014
- self[136] = true
1068
+ self[137] = true
1015
1069
  end
1016
1070
  end
1017
1071
  },
@@ -1022,19 +1076,19 @@ __TS__SetDescriptor(
1022
1076
  "disablesAutoAttack",
1023
1077
  {
1024
1078
  get = function(self)
1025
- local ____self__137_56 = self[137]
1026
- if ____self__137_56 == nil then
1027
- ____self__137_56 = false
1079
+ local ____self__138_55 = self[138]
1080
+ if ____self__138_55 == nil then
1081
+ ____self__138_55 = false
1028
1082
  end
1029
- return ____self__137_56
1083
+ return ____self__138_55
1030
1084
  end,
1031
1085
  set = function(self, disablesAutoAttack)
1032
- if not disablesAutoAttack and self[137] then
1086
+ if not disablesAutoAttack and self[138] then
1033
1087
  self.object:decrementDisableAutoAttackCounter()
1034
- self[137] = nil
1035
- elseif disablesAutoAttack and not self[137] then
1088
+ self[138] = nil
1089
+ elseif disablesAutoAttack and not self[138] then
1036
1090
  self.object:incrementDisableAutoAttackCounter()
1037
- self[137] = true
1091
+ self[138] = true
1038
1092
  end
1039
1093
  end
1040
1094
  },
@@ -1045,19 +1099,19 @@ __TS__SetDescriptor(
1045
1099
  "providesInvulnerability",
1046
1100
  {
1047
1101
  get = function(self)
1048
- local ____self__138_57 = self[138]
1049
- if ____self__138_57 == nil then
1050
- ____self__138_57 = false
1102
+ local ____self__139_56 = self[139]
1103
+ if ____self__139_56 == nil then
1104
+ ____self__139_56 = false
1051
1105
  end
1052
- return ____self__138_57
1106
+ return ____self__139_56
1053
1107
  end,
1054
1108
  set = function(self, providesInvulnerability)
1055
- if not providesInvulnerability and self[138] then
1109
+ if not providesInvulnerability and self[139] then
1056
1110
  self.object:decrementInvulnerabilityCounter()
1057
- self[138] = nil
1058
- elseif providesInvulnerability and not self[138] then
1111
+ self[139] = nil
1112
+ elseif providesInvulnerability and not self[139] then
1059
1113
  self.object:incrementInvulnerabilityCounter()
1060
- self[138] = true
1114
+ self[139] = true
1061
1115
  end
1062
1116
  end
1063
1117
  },
@@ -1068,17 +1122,17 @@ __TS__SetDescriptor(
1068
1122
  "killsOnExpiration",
1069
1123
  {
1070
1124
  get = function(self)
1071
- local ____self__139_58 = self[139]
1072
- if ____self__139_58 == nil then
1073
- ____self__139_58 = false
1125
+ local ____self__140_57 = self[140]
1126
+ if ____self__140_57 == nil then
1127
+ ____self__140_57 = false
1074
1128
  end
1075
- return ____self__139_58
1129
+ return ____self__140_57
1076
1130
  end,
1077
1131
  set = function(self, killsOnExpiration)
1078
- if not killsOnExpiration and self[139] then
1079
- self[139] = nil
1080
- elseif killsOnExpiration and not self[139] then
1081
- self[139] = true
1132
+ if not killsOnExpiration and self[140] then
1133
+ self[140] = nil
1134
+ elseif killsOnExpiration and not self[140] then
1135
+ self[140] = true
1082
1136
  end
1083
1137
  end
1084
1138
  },
@@ -1089,17 +1143,17 @@ __TS__SetDescriptor(
1089
1143
  "explodesOnExpiration",
1090
1144
  {
1091
1145
  get = function(self)
1092
- local ____self__140_59 = self[140]
1093
- if ____self__140_59 == nil then
1094
- ____self__140_59 = false
1146
+ local ____self__141_58 = self[141]
1147
+ if ____self__141_58 == nil then
1148
+ ____self__141_58 = false
1095
1149
  end
1096
- return ____self__140_59
1150
+ return ____self__141_58
1097
1151
  end,
1098
1152
  set = function(self, killsOnExpiration)
1099
- if not killsOnExpiration and self[140] then
1100
- self[140] = nil
1101
- elseif killsOnExpiration and not self[140] then
1102
- self[140] = true
1153
+ if not killsOnExpiration and self[141] then
1154
+ self[141] = nil
1155
+ elseif killsOnExpiration and not self[141] then
1156
+ self[141] = true
1103
1157
  end
1104
1158
  end
1105
1159
  },
@@ -1208,12 +1262,39 @@ __TS__SetDescriptor(
1208
1262
  },
1209
1263
  true
1210
1264
  )
1265
+ __TS__SetDescriptor(
1266
+ Buff.prototype,
1267
+ "manaRegenerationRateIncreaseFactor",
1268
+ {
1269
+ get = function(self)
1270
+ return self:getUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR)
1271
+ end,
1272
+ set = function(self, manaRegenerationRateIncreaseFactor)
1273
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR, manaRegenerationRateIncreaseFactor)
1274
+ end
1275
+ },
1276
+ true
1277
+ )
1211
1278
  __TS__SetDescriptor(
1212
1279
  Buff.prototype,
1213
1280
  "duration",
1214
- {get = function(self)
1215
- return self[103]
1216
- end},
1281
+ {
1282
+ get = function(self)
1283
+ return self[103]
1284
+ end,
1285
+ set = function(self, duration)
1286
+ if duration <= 0 then
1287
+ local timer = self._timer
1288
+ if timer ~= nil then
1289
+ timer:destroy()
1290
+ self._timer = nil
1291
+ end
1292
+ self[103] = 0
1293
+ else
1294
+ self.remainingDuration = self.remainingDuration + (duration - self[103])
1295
+ end
1296
+ end
1297
+ },
1217
1298
  true
1218
1299
  )
1219
1300
  __TS__SetDescriptor(
@@ -1221,13 +1302,13 @@ __TS__SetDescriptor(
1221
1302
  "remainingDuration",
1222
1303
  {
1223
1304
  get = function(self)
1224
- local ____opt_60 = self._timer
1225
- return ____opt_60 and ____opt_60.remaining or 0
1305
+ local ____opt_59 = self._timer
1306
+ return ____opt_59 and ____opt_59.remaining or 0
1226
1307
  end,
1227
1308
  set = function(self, remainingDuration)
1228
- local ____remainingDuration_64 = remainingDuration
1229
- local ____opt_62 = self._timer
1230
- local remainingDurationDelta = ____remainingDuration_64 - (____opt_62 and ____opt_62.remaining or 0)
1309
+ local ____remainingDuration_63 = remainingDuration
1310
+ local ____opt_61 = self._timer
1311
+ local remainingDurationDelta = ____remainingDuration_63 - (____opt_61 and ____opt_61.remaining or 0)
1231
1312
  if remainingDurationDelta ~= 0 then
1232
1313
  self[103] = self[103] + remainingDurationDelta
1233
1314
  if remainingDuration <= 0 then
@@ -1242,7 +1323,7 @@ __TS__SetDescriptor(
1242
1323
  remainingDuration,
1243
1324
  self._spellStealPriority,
1244
1325
  self._learnLevelMinimum,
1245
- self[141]
1326
+ self[142]
1246
1327
  ) then
1247
1328
  local timer = self._timer
1248
1329
  if timer == nil then
@@ -1257,7 +1338,34 @@ __TS__SetDescriptor(
1257
1338
  },
1258
1339
  true
1259
1340
  )
1260
- Buff.destroyEvent = buffDestroyEvent;
1341
+ __TS__SetDescriptor(
1342
+ Buff.prototype,
1343
+ "abilityCooldownFactor",
1344
+ {
1345
+ get = function(self)
1346
+ return self[143] or 1
1347
+ end,
1348
+ set = function(self, abilityCooldownFactor)
1349
+ local previousAbilityCooldownModifier = self[144]
1350
+ if previousAbilityCooldownModifier then
1351
+ for ____, ability in ipairs(self._unit.abilities) do
1352
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
1353
+ end
1354
+ end
1355
+ local function modifier(ability, level, cooldown)
1356
+ return cooldown * abilityCooldownFactor
1357
+ end
1358
+ for ____, ability in ipairs(self._unit.abilities) do
1359
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1360
+ end
1361
+ self[144] = modifier
1362
+ self[143] = abilityCooldownFactor
1363
+ end
1364
+ },
1365
+ true
1366
+ )
1367
+ Buff.createdEvent = buffCreatedEvent
1368
+ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1261
1369
  (function(self)
1262
1370
  local function destroyBuffIfNeeded(buff)
1263
1371
  if getUnitAbility(buff[101].handle, buff.typeId) ~= buff.handle and buff[100] == 1 then
@@ -1311,5 +1419,11 @@ Buff.destroyEvent = buffDestroyEvent;
1311
1419
  ____exports.checkBuffs(target)
1312
1420
  end
1313
1421
  )
1422
+ buffCreatedEvent:addListener(function(buff)
1423
+ UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1424
+ end)
1425
+ buffBeingDestroyedEvent:addListener(function(buff)
1426
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1427
+ end)
1314
1428
  end)(Buff)
1315
1429
  return ____exports