warscript 0.0.1-dev.aefeacb → 0.0.1-dev.b23de5c

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 (175) 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 +85 -44
  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/decl/native.d.ts +846 -790
  17. package/destroyable.d.ts +1 -0
  18. package/destroyable.lua +9 -0
  19. package/engine/behavior.d.ts +14 -1
  20. package/engine/behavior.lua +230 -70
  21. package/engine/behaviour/ability/apply-buff.lua +5 -5
  22. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  23. package/engine/behaviour/ability/damage.d.ts +9 -3
  24. package/engine/behaviour/ability/damage.lua +26 -38
  25. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  26. package/engine/behaviour/ability/emulate-impact.lua +18 -3
  27. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  28. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  29. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  30. package/engine/behaviour/ability/restore-mana.lua +6 -6
  31. package/engine/behaviour/ability.d.ts +15 -6
  32. package/engine/behaviour/ability.lua +56 -21
  33. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  34. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  35. package/engine/behaviour/unit.d.ts +40 -2
  36. package/engine/behaviour/unit.lua +269 -6
  37. package/engine/buff.d.ts +58 -18
  38. package/engine/buff.lua +347 -150
  39. package/engine/internal/ability.d.ts +7 -1
  40. package/engine/internal/ability.lua +49 -9
  41. package/engine/internal/item/ability.lua +63 -11
  42. package/engine/internal/item+owner.lua +12 -6
  43. package/engine/internal/item.d.ts +18 -17
  44. package/engine/internal/item.lua +135 -49
  45. package/engine/internal/mechanics/ability-duration.lua +1 -1
  46. package/engine/internal/mechanics/cast-ability.lua +6 -3
  47. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  48. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  49. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  50. package/engine/internal/misc/frame-coordinates.lua +21 -0
  51. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  52. package/engine/internal/misc/get-terrain-z.lua +11 -0
  53. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  54. package/engine/internal/misc/player-local-handle.lua +5 -0
  55. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  56. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  57. package/engine/internal/unit/ability.d.ts +35 -0
  58. package/engine/internal/unit/ability.lua +98 -9
  59. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  60. package/engine/internal/unit/allowed-targets.lua +9 -1
  61. package/engine/internal/unit/attributes.d.ts +17 -0
  62. package/engine/internal/unit/attributes.lua +46 -0
  63. package/engine/internal/unit/bonus.d.ts +2 -0
  64. package/engine/internal/unit/bonus.lua +10 -0
  65. package/engine/internal/unit/fly-height.d.ts +7 -0
  66. package/engine/internal/unit/fly-height.lua +20 -0
  67. package/engine/internal/unit/interrupts.d.ts +12 -0
  68. package/engine/internal/unit/interrupts.lua +28 -0
  69. package/engine/internal/unit/main-selected.lua +12 -27
  70. package/engine/internal/unit/order.d.ts +20 -0
  71. package/engine/internal/unit/order.lua +136 -0
  72. package/engine/internal/unit/range-event.d.ts +12 -0
  73. package/engine/internal/unit/range-event.lua +90 -0
  74. package/engine/internal/unit/scale.d.ts +7 -0
  75. package/engine/internal/unit/scale.lua +20 -0
  76. package/engine/internal/unit+ability.lua +10 -1
  77. package/engine/internal/unit+damage.d.ts +2 -11
  78. package/engine/internal/unit+damage.lua +10 -14
  79. package/engine/internal/unit+spellSteal.lua +1 -2
  80. package/engine/internal/unit-missile-launch.lua +52 -14
  81. package/engine/internal/unit.d.ts +43 -25
  82. package/engine/internal/unit.lua +384 -260
  83. package/engine/local-client.d.ts +2 -0
  84. package/engine/local-client.lua +30 -0
  85. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  86. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  87. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  88. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  89. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  90. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  91. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  92. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  93. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  94. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  95. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  96. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  97. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  98. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  99. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  100. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  101. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  102. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  103. package/engine/object-data/entry/ability-type/curse.lua +2 -2
  104. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  105. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  106. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  107. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  108. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  109. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  110. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  111. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  112. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  113. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  114. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  115. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  116. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  117. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  118. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  119. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  120. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  121. package/engine/object-data/entry/ability-type/web.lua +52 -0
  122. package/engine/object-data/entry/ability-type.d.ts +13 -11
  123. package/engine/object-data/entry/ability-type.lua +119 -17
  124. package/engine/object-data/entry/buff-type/applicable.lua +5 -0
  125. package/engine/object-data/entry/buff-type.d.ts +5 -11
  126. package/engine/object-data/entry/buff-type.lua +11 -27
  127. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  128. package/engine/object-data/entry/destructible-type.lua +155 -0
  129. package/engine/object-data/entry/sound-preset.d.ts +17 -0
  130. package/engine/object-data/entry/sound-preset.lua +104 -0
  131. package/engine/object-data/entry/unit-type.d.ts +17 -4
  132. package/engine/object-data/entry/unit-type.lua +197 -85
  133. package/engine/object-field/ability.d.ts +4 -4
  134. package/engine/object-field/ability.lua +7 -6
  135. package/engine/object-field/unit.d.ts +72 -3
  136. package/engine/object-field/unit.lua +268 -7
  137. package/engine/object-field.d.ts +25 -6
  138. package/engine/object-field.lua +357 -118
  139. package/engine/random.d.ts +10 -0
  140. package/engine/random.lua +21 -0
  141. package/engine/standard/entries/buff-type.d.ts +3 -0
  142. package/engine/standard/entries/buff-type.lua +3 -0
  143. package/engine/standard/fields/ability.d.ts +2 -2
  144. package/engine/standard/fields/ability.lua +2 -2
  145. package/engine/standard/fields/unit.d.ts +12 -0
  146. package/engine/standard/fields/unit.lua +20 -0
  147. package/engine/synchronization.d.ts +11 -0
  148. package/engine/synchronization.lua +77 -0
  149. package/engine/text-tag.d.ts +36 -2
  150. package/engine/text-tag.lua +250 -10
  151. package/engine/unit.d.ts +6 -0
  152. package/engine/unit.lua +6 -0
  153. package/net/socket.lua +1 -1
  154. package/objutil/buff.lua +11 -10
  155. package/package.json +2 -2
  156. package/patch-lua.lua +15 -0
  157. package/patch-lualib.lua +1 -1
  158. package/utility/arrays.d.ts +2 -0
  159. package/utility/arrays.lua +11 -0
  160. package/utility/callback-array.d.ts +17 -0
  161. package/utility/callback-array.lua +61 -0
  162. package/utility/functions.d.ts +8 -0
  163. package/utility/functions.lua +13 -0
  164. package/utility/linked-map.d.ts +34 -0
  165. package/utility/linked-map.lua +101 -0
  166. package/utility/linked-set.d.ts +4 -1
  167. package/utility/linked-set.lua +43 -1
  168. package/utility/lua-maps.d.ts +15 -2
  169. package/utility/lua-maps.lua +53 -2
  170. package/utility/lua-sets.d.ts +2 -0
  171. package/utility/lua-sets.lua +7 -0
  172. package/utility/records.lua +20 -1
  173. package/utility/types.d.ts +3 -0
  174. package/core/types/order.d.ts +0 -25
  175. 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,
@@ -119,11 +126,15 @@ local buffParametersKeys = {
119
126
  maximumAutoAttackCount = true,
120
127
  maximumDamageDealtEventCount = true,
121
128
  maximumDamageReceivedEventCount = true,
129
+ absorbedDamageFactor = true,
130
+ maximumDamageAbsorbed = true,
131
+ destroysOnMaximumDamageAbsorbed = true,
122
132
  uniqueGroup = true,
123
133
  damageOnExpiration = true,
124
134
  healingOnExpiration = true,
125
135
  killsOnExpiration = true,
126
- explodesOnExpiration = true
136
+ explodesOnExpiration = true,
137
+ abilityCooldownFactor = true
127
138
  }
128
139
  local function resolveEnumValue(ability, level, value)
129
140
  if value == nil or type(value) == "number" then
@@ -174,6 +185,8 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
174
185
  end
175
186
  end
176
187
  local buffBooleanParameters = {
188
+ "destroysOnMaximumDamageAbsorbed",
189
+ "turnsIntoGhost",
177
190
  "stuns",
178
191
  "ignoresStunImmunity",
179
192
  "disablesAutoAttack",
@@ -185,6 +198,7 @@ local buffNumberParameters = {
185
198
  "durationIncreaseOnAutoAttack",
186
199
  "attackSpeedIncreaseFactor",
187
200
  "movementSpeedIncreaseFactor",
201
+ "manaRegenerationRateIncreaseFactor",
188
202
  "evasionProbability",
189
203
  "armorIncrease",
190
204
  "damageFactor",
@@ -199,7 +213,10 @@ local buffNumberParameters = {
199
213
  "healingPerInterval",
200
214
  "healingOverDuration",
201
215
  "damageOnExpiration",
202
- "healingOnExpiration"
216
+ "healingOnExpiration",
217
+ "absorbedDamageFactor",
218
+ "maximumDamageAbsorbed",
219
+ "abilityCooldownFactor"
203
220
  }
204
221
  local unsuccessfulApplicationMarker = {}
205
222
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -302,7 +319,8 @@ buffHealingIntervalTimerCallback = function(buff)
302
319
  source:healTarget(buff[101], healingPerInterval)
303
320
  end
304
321
  end
305
- local buffDestroyEvent = __TS__New(Event)
322
+ local buffCreatedEvent = __TS__New(Event)
323
+ local buffBeingDestroyedEvent = __TS__New(Event)
306
324
  ____exports.Buff = __TS__Class()
307
325
  local Buff = ____exports.Buff
308
326
  Buff.name = "Buff"
@@ -317,33 +335,38 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
317
335
  local polarity
318
336
  local resistanceType
319
337
  local ability
338
+ local abilityBehavior
320
339
  if type(typeIdOrTypeIds) ~= "number" then
321
340
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
322
341
  polarity = resistanceTypeOrPolarity
323
342
  resistanceType = abilityOrParametersOrResistanceType
324
- if __TS__InstanceOf(parametersOrAbility, Ability) then
343
+ if __TS__InstanceOf(parametersOrAbility, AbilityBehavior) then
344
+ abilityBehavior = parametersOrAbility
345
+ ability = abilityBehavior.ability
346
+ elseif __TS__InstanceOf(parametersOrAbility, Ability) then
325
347
  ability = parametersOrAbility
326
- else
327
- ability = nil
348
+ elseif parametersOrAbility ~= nil then
328
349
  parameters = parametersOrAbility
329
350
  end
330
351
  else
331
352
  typeId = typeIdOrTypeIds
332
353
  polarity = polarityOrTypeIdSelectionPolicy
333
354
  resistanceType = resistanceTypeOrPolarity
334
- if __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
355
+ if __TS__InstanceOf(abilityOrParametersOrResistanceType, AbilityBehavior) then
356
+ abilityBehavior = abilityOrParametersOrResistanceType
357
+ ability = abilityBehavior.ability
358
+ parameters = parametersOrAbility
359
+ elseif __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
335
360
  ability = abilityOrParametersOrResistanceType
336
361
  parameters = parametersOrAbility
337
- else
338
- ability = nil
362
+ elseif abilityOrParametersOrResistanceType ~= nil then
339
363
  parameters = abilityOrParametersOrResistanceType
364
+ else
365
+ parameters = parametersOrAbility
340
366
  end
341
367
  end
368
+ self.sourceAbilityBehavior = abilityBehavior
342
369
  self.typeId = typeId
343
- if not __TS__InstanceOf(ability, Ability) then
344
- parameters = ability
345
- ability = nil
346
- end
347
370
  local defaultParameters = self.constructor.defaultParameters
348
371
  local level = parameters and parameters.level or defaultParameters.level
349
372
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -371,7 +394,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
371
394
  local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
372
395
  if missProbability ~= nil then
373
396
  missProbability = resolveNumberValue(ability, level, missProbability)
374
- self[141] = missProbability
397
+ self[146] = missProbability
375
398
  end
376
399
  local buffByTypeId = buffByTypeIdByUnit[_unit]
377
400
  if buffByTypeId == nil then
@@ -454,24 +477,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
454
477
  abilityTypeIds = {}
455
478
  self._abilityTypeIds = abilityTypeIds
456
479
  end
457
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
480
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
481
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
458
482
  local addedAbility = _unit:addAbility(abilityTypeId)
459
483
  if addedAbility ~= nil then
460
484
  _unit:makeAbilityPermanent(abilityTypeId, true)
461
485
  _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
486
+ if abilityParameters.isButtonVisible == false then
487
+ _unit:hideAbility(abilityTypeId, true)
473
488
  end
474
- abilityTypeIds[abilityTypeId] = true
489
+ for ____, field in ipairs(abilityParameters.fields or emptyArray()) do
490
+ field[1]:setValue(
491
+ addedAbility,
492
+ resolveNumberValue(ability, level, field[2])
493
+ )
494
+ end
495
+ abilityTypeIds[#abilityTypeIds + 1] = abilityTypeId
475
496
  end
476
497
  end
477
498
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -483,18 +504,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
483
504
  self._behaviors = behaviors
484
505
  end
485
506
  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
507
+ if parameters ~= nil then
508
+ local additionalParameters = {}
509
+ for ____, key in ipairs(sortedKeysUnnested(parameters)) do
510
+ if not buffParametersKeys[key] then
511
+ if ability then
512
+ additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, parameters[key])
513
+ else
514
+ additionalParameters[key] = parameters[key]
515
+ end
493
516
  end
494
517
  end
495
- end
496
- if (next(additionalParameters)) ~= nil then
497
- self.parameters = additionalParameters
518
+ if (next(additionalParameters)) ~= nil then
519
+ self.parameters = additionalParameters
520
+ end
498
521
  end
499
522
  end
500
523
  if duration ~= nil and duration > 0 then
@@ -504,66 +527,73 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
504
527
  end
505
528
  self:onCreate()
506
529
  self[100] = 1
530
+ Event.invoke(buffCreatedEvent, self)
507
531
  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)
532
+ function Buff.prototype.onAbilityGained(self, ability)
533
+ if __TS__InstanceOf(ability, UnitAbility) then
534
+ local abilityCooldownModifier = self[148]
535
+ if abilityCooldownModifier then
536
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
537
+ end
538
+ end
512
539
  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
540
+ function Buff.prototype.onAbilityLost(self, ability)
541
+ if __TS__InstanceOf(ability, UnitAbility) then
542
+ local abilityCooldownModifier = self[148]
543
+ if abilityCooldownModifier then
544
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
545
+ end
518
546
  end
519
- bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self._unit, bonusType, bonusIdByBonusType[bonusType], value)
520
547
  end
521
548
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
522
549
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
523
550
  Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
524
551
  else
525
552
  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(
553
+ local ____Effect_40 = Effect
554
+ local ____Effect_flash_41 = Effect.flash
555
+ local ____array_39 = __TS__SparseArrayNew(
529
556
  self[105],
530
557
  isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
531
558
  stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
532
559
  )
533
- local ____isWidgetProvided_40
560
+ local ____isWidgetProvided_38
534
561
  if isWidgetProvided then
535
- ____isWidgetProvided_40 = yOrParametersOrDuration
562
+ ____isWidgetProvided_38 = yOrParametersOrDuration
536
563
  else
537
- ____isWidgetProvided_40 = widgetOrXOrParametersOrDuration
564
+ ____isWidgetProvided_38 = widgetOrXOrParametersOrDuration
538
565
  end
539
- __TS__SparseArrayPush(____array_41, ____isWidgetProvided_40)
540
- ____Effect_flash_43(
541
- ____Effect_42,
542
- __TS__SparseArraySpread(____array_41)
566
+ __TS__SparseArrayPush(____array_39, ____isWidgetProvided_38)
567
+ ____Effect_flash_41(
568
+ ____Effect_40,
569
+ __TS__SparseArraySpread(____array_39)
543
570
  )
544
571
  end
545
572
  end
546
573
  function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
547
574
  local isWidgetProvided = type(widgetOrDuration) == "table"
548
- local ____Effect_46 = Effect
549
- local ____Effect_flash_47 = Effect.flash
550
- local ____array_45 = __TS__SparseArrayNew(
575
+ local ____Effect_44 = Effect
576
+ local ____Effect_flash_45 = Effect.flash
577
+ local ____array_43 = __TS__SparseArrayNew(
551
578
  self[106],
552
579
  isWidgetProvided and widgetOrDuration or self._unit,
553
580
  stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
554
581
  )
555
- local ____isWidgetProvided_44
582
+ local ____isWidgetProvided_42
556
583
  if isWidgetProvided then
557
- ____isWidgetProvided_44 = duration
584
+ ____isWidgetProvided_42 = duration
558
585
  else
559
- ____isWidgetProvided_44 = widgetOrDuration
586
+ ____isWidgetProvided_42 = widgetOrDuration
560
587
  end
561
- __TS__SparseArrayPush(____array_45, ____isWidgetProvided_44)
562
- ____Effect_flash_47(
563
- ____Effect_46,
564
- __TS__SparseArraySpread(____array_45)
588
+ __TS__SparseArrayPush(____array_43, ____isWidgetProvided_42)
589
+ ____Effect_flash_45(
590
+ ____Effect_44,
591
+ __TS__SparseArraySpread(____array_43)
565
592
  )
566
593
  end
594
+ function Buff.prototype.expire(self)
595
+ expireBuff(self)
596
+ end
567
597
  function Buff.prototype.onCreate(self)
568
598
  end
569
599
  function Buff.prototype.onDestroy(self)
@@ -592,26 +622,33 @@ function Buff.prototype.onDestroy(self)
592
622
  behavior:destroy()
593
623
  end
594
624
  end
595
- if self[137] then
625
+ local previousAbilityCooldownModifier = self[148]
626
+ if previousAbilityCooldownModifier then
627
+ for ____, ability in ipairs(self._unit.abilities) do
628
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
629
+ end
630
+ end
631
+ if self[143] then
632
+ unit:decrementInvulnerabilityCounter()
633
+ end
634
+ if self[142] then
596
635
  unit:decrementDisableAutoAttackCounter()
597
636
  end
598
- if self[135] then
599
- if self[136] then
600
- unit:decrementStunCounter()
637
+ if self[140] then
638
+ if self[141] then
639
+ unit:decrementForceStunCounter()
601
640
  end
602
641
  unit:decrementStunCounter()
603
642
  end
643
+ if self[139] then
644
+ unit:decrementGhostCounter()
645
+ end
604
646
  if self._abilityTypeIds ~= nil then
605
- for abilityTypeId in pairs(self._abilityTypeIds) do
647
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
606
648
  unit:removeAbility(abilityTypeId)
607
649
  end
608
650
  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)
651
+ Event.invoke(buffBeingDestroyedEvent, self)
615
652
  self[100] = 3
616
653
  return UnitBehavior.prototype.onDestroy(self)
617
654
  end
@@ -640,8 +677,8 @@ function Buff.apply(self, ...)
640
677
  end
641
678
  end
642
679
  function Buff.getByTypeId(self, unit, typeId)
643
- local ____opt_48 = buffByTypeIdByUnit[unit]
644
- local buff = ____opt_48 and ____opt_48[typeId]
680
+ local ____opt_46 = buffByTypeIdByUnit[unit]
681
+ local buff = ____opt_46 and ____opt_46[typeId]
645
682
  if __TS__InstanceOf(buff, self) then
646
683
  return buff
647
684
  end
@@ -655,9 +692,9 @@ function Buff.prototype.onExpiration(self)
655
692
  if self[121] ~= nil then
656
693
  (self[102] or unit):healTarget(unit, self[120] or 0)
657
694
  end
658
- if self[140] then
695
+ if self[145] then
659
696
  unit:explode()
660
- elseif self[139] then
697
+ elseif self[144] then
661
698
  unit:kill()
662
699
  end
663
700
  end
@@ -712,6 +749,18 @@ function Buff.prototype.onDamageDealt(self, target, event)
712
749
  end
713
750
  function Buff.prototype.onDamageReceived(self, source, event)
714
751
  if event.originalAmount ~= 0 then
752
+ local absorbedDamage = min(event.amount * (self[135] or 1), (self[136] or 0) - (self[137] or 0))
753
+ if absorbedDamage > 0 then
754
+ event.amount = event.amount - absorbedDamage
755
+ self[137] = (self[137] or 0) + absorbedDamage
756
+ local ____self__138_48 = self[138]
757
+ if ____self__138_48 == nil then
758
+ ____self__138_48 = true
759
+ end
760
+ if ____self__138_48 and self[137] >= (self[136] or 0) then
761
+ self:destroy()
762
+ end
763
+ end
715
764
  local damageReceivedEventCount = (self[133] or 0) + 1
716
765
  self[133] = damageReceivedEventCount
717
766
  if damageReceivedEventCount == self[134] then
@@ -799,8 +848,8 @@ __TS__SetDescriptor(
799
848
  return
800
849
  end
801
850
  self[112] = damageInterval
802
- local ____opt_50 = self._timer
803
- local elapsed = ____opt_50 and ____opt_50.elapsed or 0
851
+ local ____opt_49 = self._timer
852
+ local elapsed = ____opt_49 and ____opt_49.elapsed or 0
804
853
  local timer = self[114]
805
854
  if timer == nil then
806
855
  timer = Timer:create()
@@ -879,8 +928,8 @@ __TS__SetDescriptor(
879
928
  return
880
929
  end
881
930
  self[117] = healingInterval
882
- local ____opt_52 = self._timer
883
- local elapsed = ____opt_52 and ____opt_52.elapsed or 0
931
+ local ____opt_51 = self._timer
932
+ local elapsed = ____opt_51 and ____opt_51.elapsed or 0
884
933
  local timer = self[119]
885
934
  if timer == nil then
886
935
  timer = Timer:create()
@@ -961,30 +1010,53 @@ __TS__SetDescriptor(
961
1010
  },
962
1011
  true
963
1012
  )
1013
+ __TS__SetDescriptor(
1014
+ Buff.prototype,
1015
+ "turnsIntoGhost",
1016
+ {
1017
+ get = function(self)
1018
+ local ____self__139_53 = self[139]
1019
+ if ____self__139_53 == nil then
1020
+ ____self__139_53 = false
1021
+ end
1022
+ return ____self__139_53
1023
+ end,
1024
+ set = function(self, turnsIntoGhost)
1025
+ if not turnsIntoGhost and self[139] then
1026
+ self.object:decrementGhostCounter()
1027
+ self[139] = nil
1028
+ elseif turnsIntoGhost and not self[139] then
1029
+ self.object:incrementGhostCounter()
1030
+ self[139] = true
1031
+ end
1032
+ end
1033
+ },
1034
+ true
1035
+ )
964
1036
  __TS__SetDescriptor(
965
1037
  Buff.prototype,
966
1038
  "stuns",
967
1039
  {
968
1040
  get = function(self)
969
- local ____self__135_54 = self[135]
970
- if ____self__135_54 == nil then
971
- ____self__135_54 = false
1041
+ local ____self__140_54 = self[140]
1042
+ if ____self__140_54 == nil then
1043
+ ____self__140_54 = false
972
1044
  end
973
- return ____self__135_54
1045
+ return ____self__140_54
974
1046
  end,
975
1047
  set = function(self, stuns)
976
- if not stuns and self[135] then
977
- if self[136] then
978
- self.object:decrementStunCounter()
1048
+ if not stuns and self[140] then
1049
+ if self[141] then
1050
+ self.object:decrementForceStunCounter()
979
1051
  end
980
1052
  self.object:decrementStunCounter()
981
- self[135] = nil
982
- elseif stuns and not self[135] then
983
- if self[136] then
984
- self.object:incrementStunCounter()
1053
+ self[140] = nil
1054
+ elseif stuns and not self[140] then
1055
+ if self[141] then
1056
+ self.object:incrementForceStunCounter()
985
1057
  end
986
1058
  self.object:incrementStunCounter()
987
- self[135] = true
1059
+ self[140] = true
988
1060
  end
989
1061
  end
990
1062
  },
@@ -995,23 +1067,23 @@ __TS__SetDescriptor(
995
1067
  "ignoresStunImmunity",
996
1068
  {
997
1069
  get = function(self)
998
- local ____self__136_55 = self[136]
999
- if ____self__136_55 == nil then
1000
- ____self__136_55 = false
1070
+ local ____self__141_55 = self[141]
1071
+ if ____self__141_55 == nil then
1072
+ ____self__141_55 = false
1001
1073
  end
1002
- return ____self__136_55
1074
+ return ____self__141_55
1003
1075
  end,
1004
1076
  set = function(self, ignoresStunImmunity)
1005
- if not ignoresStunImmunity and self[136] then
1006
- if self[135] then
1007
- self.object:decrementStunCounter()
1077
+ if not ignoresStunImmunity and self[141] then
1078
+ if self[140] then
1079
+ self.object:decrementForceStunCounter()
1008
1080
  end
1009
- self[136] = nil
1010
- elseif ignoresStunImmunity and not self[136] then
1011
- if self[135] then
1012
- self.object:incrementStunCounter()
1081
+ self[141] = nil
1082
+ elseif ignoresStunImmunity and not self[141] then
1083
+ if self[140] then
1084
+ self.object:incrementForceStunCounter()
1013
1085
  end
1014
- self[136] = true
1086
+ self[141] = true
1015
1087
  end
1016
1088
  end
1017
1089
  },
@@ -1022,19 +1094,19 @@ __TS__SetDescriptor(
1022
1094
  "disablesAutoAttack",
1023
1095
  {
1024
1096
  get = function(self)
1025
- local ____self__137_56 = self[137]
1026
- if ____self__137_56 == nil then
1027
- ____self__137_56 = false
1097
+ local ____self__142_56 = self[142]
1098
+ if ____self__142_56 == nil then
1099
+ ____self__142_56 = false
1028
1100
  end
1029
- return ____self__137_56
1101
+ return ____self__142_56
1030
1102
  end,
1031
1103
  set = function(self, disablesAutoAttack)
1032
- if not disablesAutoAttack and self[137] then
1104
+ if not disablesAutoAttack and self[142] then
1033
1105
  self.object:decrementDisableAutoAttackCounter()
1034
- self[137] = nil
1035
- elseif disablesAutoAttack and not self[137] then
1106
+ self[142] = nil
1107
+ elseif disablesAutoAttack and not self[142] then
1036
1108
  self.object:incrementDisableAutoAttackCounter()
1037
- self[137] = true
1109
+ self[142] = true
1038
1110
  end
1039
1111
  end
1040
1112
  },
@@ -1045,19 +1117,19 @@ __TS__SetDescriptor(
1045
1117
  "providesInvulnerability",
1046
1118
  {
1047
1119
  get = function(self)
1048
- local ____self__138_57 = self[138]
1049
- if ____self__138_57 == nil then
1050
- ____self__138_57 = false
1120
+ local ____self__143_57 = self[143]
1121
+ if ____self__143_57 == nil then
1122
+ ____self__143_57 = false
1051
1123
  end
1052
- return ____self__138_57
1124
+ return ____self__143_57
1053
1125
  end,
1054
1126
  set = function(self, providesInvulnerability)
1055
- if not providesInvulnerability and self[138] then
1127
+ if not providesInvulnerability and self[143] then
1056
1128
  self.object:decrementInvulnerabilityCounter()
1057
- self[138] = nil
1058
- elseif providesInvulnerability and not self[138] then
1129
+ self[143] = nil
1130
+ elseif providesInvulnerability and not self[143] then
1059
1131
  self.object:incrementInvulnerabilityCounter()
1060
- self[138] = true
1132
+ self[143] = true
1061
1133
  end
1062
1134
  end
1063
1135
  },
@@ -1068,17 +1140,17 @@ __TS__SetDescriptor(
1068
1140
  "killsOnExpiration",
1069
1141
  {
1070
1142
  get = function(self)
1071
- local ____self__139_58 = self[139]
1072
- if ____self__139_58 == nil then
1073
- ____self__139_58 = false
1143
+ local ____self__144_58 = self[144]
1144
+ if ____self__144_58 == nil then
1145
+ ____self__144_58 = false
1074
1146
  end
1075
- return ____self__139_58
1147
+ return ____self__144_58
1076
1148
  end,
1077
1149
  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
1150
+ if not killsOnExpiration and self[144] then
1151
+ self[144] = nil
1152
+ elseif killsOnExpiration and not self[144] then
1153
+ self[144] = true
1082
1154
  end
1083
1155
  end
1084
1156
  },
@@ -1089,17 +1161,17 @@ __TS__SetDescriptor(
1089
1161
  "explodesOnExpiration",
1090
1162
  {
1091
1163
  get = function(self)
1092
- local ____self__140_59 = self[140]
1093
- if ____self__140_59 == nil then
1094
- ____self__140_59 = false
1164
+ local ____self__145_59 = self[145]
1165
+ if ____self__145_59 == nil then
1166
+ ____self__145_59 = false
1095
1167
  end
1096
- return ____self__140_59
1168
+ return ____self__145_59
1097
1169
  end,
1098
1170
  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
1171
+ if not killsOnExpiration and self[145] then
1172
+ self[145] = nil
1173
+ elseif killsOnExpiration and not self[145] then
1174
+ self[145] = true
1103
1175
  end
1104
1176
  end
1105
1177
  },
@@ -1208,12 +1280,39 @@ __TS__SetDescriptor(
1208
1280
  },
1209
1281
  true
1210
1282
  )
1283
+ __TS__SetDescriptor(
1284
+ Buff.prototype,
1285
+ "manaRegenerationRateIncreaseFactor",
1286
+ {
1287
+ get = function(self)
1288
+ return self:getUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR)
1289
+ end,
1290
+ set = function(self, manaRegenerationRateIncreaseFactor)
1291
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR, manaRegenerationRateIncreaseFactor)
1292
+ end
1293
+ },
1294
+ true
1295
+ )
1211
1296
  __TS__SetDescriptor(
1212
1297
  Buff.prototype,
1213
1298
  "duration",
1214
- {get = function(self)
1215
- return self[103]
1216
- end},
1299
+ {
1300
+ get = function(self)
1301
+ return self[103]
1302
+ end,
1303
+ set = function(self, duration)
1304
+ if duration <= 0 then
1305
+ local timer = self._timer
1306
+ if timer ~= nil then
1307
+ timer:destroy()
1308
+ self._timer = nil
1309
+ end
1310
+ self[103] = 0
1311
+ else
1312
+ self.remainingDuration = self.remainingDuration + (duration - self[103])
1313
+ end
1314
+ end
1315
+ },
1217
1316
  true
1218
1317
  )
1219
1318
  __TS__SetDescriptor(
@@ -1242,7 +1341,7 @@ __TS__SetDescriptor(
1242
1341
  remainingDuration,
1243
1342
  self._spellStealPriority,
1244
1343
  self._learnLevelMinimum,
1245
- self[141]
1344
+ self[146]
1246
1345
  ) then
1247
1346
  local timer = self._timer
1248
1347
  if timer == nil then
@@ -1257,7 +1356,99 @@ __TS__SetDescriptor(
1257
1356
  },
1258
1357
  true
1259
1358
  )
1260
- Buff.destroyEvent = buffDestroyEvent;
1359
+ __TS__SetDescriptor(
1360
+ Buff.prototype,
1361
+ "absorbedDamageFactor",
1362
+ {
1363
+ get = function(self)
1364
+ return self[135] or 1
1365
+ end,
1366
+ set = function(self, absorbedDamageFactor)
1367
+ if absorbedDamageFactor == 1 then
1368
+ self[135] = nil
1369
+ else
1370
+ self[135] = absorbedDamageFactor
1371
+ end
1372
+ end
1373
+ },
1374
+ true
1375
+ )
1376
+ __TS__SetDescriptor(
1377
+ Buff.prototype,
1378
+ "maximumDamageAbsorbed",
1379
+ {
1380
+ get = function(self)
1381
+ return self[136] or 0
1382
+ end,
1383
+ set = function(self, maximumDamageAbsorbed)
1384
+ if maximumDamageAbsorbed == 0 then
1385
+ self[136] = nil
1386
+ else
1387
+ self[136] = maximumDamageAbsorbed
1388
+ end
1389
+ end
1390
+ },
1391
+ true
1392
+ )
1393
+ __TS__SetDescriptor(
1394
+ Buff.prototype,
1395
+ "damageAbsorbed",
1396
+ {get = function(self)
1397
+ return self[137] or 0
1398
+ end},
1399
+ true
1400
+ )
1401
+ __TS__SetDescriptor(
1402
+ Buff.prototype,
1403
+ "destroysOnMaximumDamageAbsorbed",
1404
+ {
1405
+ get = function(self)
1406
+ local ____self__138_65 = self[138]
1407
+ if ____self__138_65 == nil then
1408
+ ____self__138_65 = true
1409
+ end
1410
+ return ____self__138_65
1411
+ end,
1412
+ set = function(self, destroysOnMaximumDamageAbsorbed)
1413
+ local ____destroysOnMaximumDamageAbsorbed_66
1414
+ if destroysOnMaximumDamageAbsorbed then
1415
+ ____destroysOnMaximumDamageAbsorbed_66 = nil
1416
+ else
1417
+ ____destroysOnMaximumDamageAbsorbed_66 = false
1418
+ end
1419
+ self[138] = ____destroysOnMaximumDamageAbsorbed_66
1420
+ end
1421
+ },
1422
+ true
1423
+ )
1424
+ __TS__SetDescriptor(
1425
+ Buff.prototype,
1426
+ "abilityCooldownFactor",
1427
+ {
1428
+ get = function(self)
1429
+ return self[147] or 1
1430
+ end,
1431
+ set = function(self, abilityCooldownFactor)
1432
+ local previousAbilityCooldownModifier = self[148]
1433
+ if previousAbilityCooldownModifier then
1434
+ for ____, ability in ipairs(self._unit.abilities) do
1435
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
1436
+ end
1437
+ end
1438
+ local function modifier(ability, level, cooldown)
1439
+ return cooldown * abilityCooldownFactor
1440
+ end
1441
+ for ____, ability in ipairs(self._unit.abilities) do
1442
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1443
+ end
1444
+ self[148] = modifier
1445
+ self[147] = abilityCooldownFactor
1446
+ end
1447
+ },
1448
+ true
1449
+ )
1450
+ Buff.createdEvent = buffCreatedEvent
1451
+ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1261
1452
  (function(self)
1262
1453
  local function destroyBuffIfNeeded(buff)
1263
1454
  if getUnitAbility(buff[101].handle, buff.typeId) ~= buff.handle and buff[100] == 1 then
@@ -1311,5 +1502,11 @@ Buff.destroyEvent = buffDestroyEvent;
1311
1502
  ____exports.checkBuffs(target)
1312
1503
  end
1313
1504
  )
1505
+ buffCreatedEvent:addListener(function(buff)
1506
+ UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1507
+ end)
1508
+ buffBeingDestroyedEvent:addListener(function(buff)
1509
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1510
+ end)
1314
1511
  end)(Buff)
1315
1512
  return ____exports