warscript 0.0.1-dev.1bb9c4e → 0.0.1-dev.1c7aecc

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 (141) hide show
  1. package/attributes.d.ts +6 -0
  2. package/attributes.lua +17 -1
  3. package/core/types/frame.lua +24 -21
  4. package/core/types/player.d.ts +16 -0
  5. package/core/types/player.lua +60 -15
  6. package/core/types/playerCamera.d.ts +2 -0
  7. package/core/types/playerCamera.lua +123 -5
  8. package/core/types/tileCell.d.ts +11 -1
  9. package/core/types/tileCell.lua +97 -0
  10. package/core/types/timer.d.ts +3 -1
  11. package/core/types/timer.lua +27 -2
  12. package/decl/native.d.ts +846 -790
  13. package/destroyable.d.ts +1 -0
  14. package/destroyable.lua +9 -0
  15. package/engine/behavior.d.ts +14 -1
  16. package/engine/behavior.lua +230 -70
  17. package/engine/behaviour/ability/apply-buff.lua +5 -5
  18. package/engine/behaviour/ability/damage.d.ts +6 -3
  19. package/engine/behaviour/ability/damage.lua +24 -36
  20. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  21. package/engine/behaviour/ability/emulate-impact.lua +11 -3
  22. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  23. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  24. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  25. package/engine/behaviour/ability/restore-mana.lua +6 -6
  26. package/engine/behaviour/ability.d.ts +6 -1
  27. package/engine/behaviour/ability.lua +38 -17
  28. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  29. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  30. package/engine/behaviour/unit.d.ts +39 -3
  31. package/engine/behaviour/unit.lua +269 -6
  32. package/engine/buff.d.ts +54 -19
  33. package/engine/buff.lua +331 -165
  34. package/engine/internal/ability.d.ts +7 -1
  35. package/engine/internal/ability.lua +49 -9
  36. package/engine/internal/item/ability.lua +63 -11
  37. package/engine/internal/item+owner.lua +12 -6
  38. package/engine/internal/item.d.ts +18 -17
  39. package/engine/internal/item.lua +135 -49
  40. package/engine/internal/mechanics/cast-ability.lua +6 -3
  41. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  42. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  43. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  44. package/engine/internal/misc/frame-coordinates.lua +21 -0
  45. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  46. package/engine/internal/misc/get-terrain-z.lua +11 -0
  47. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  48. package/engine/internal/misc/player-local-handle.lua +5 -0
  49. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  50. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  51. package/engine/internal/unit/ability.d.ts +35 -0
  52. package/engine/internal/unit/ability.lua +98 -9
  53. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  54. package/engine/internal/unit/allowed-targets.lua +9 -1
  55. package/engine/internal/unit/attributes.d.ts +17 -0
  56. package/engine/internal/unit/attributes.lua +46 -0
  57. package/engine/internal/unit/bonus.d.ts +2 -0
  58. package/engine/internal/unit/bonus.lua +10 -0
  59. package/engine/internal/unit/fly-height.d.ts +7 -0
  60. package/engine/internal/unit/fly-height.lua +20 -0
  61. package/engine/internal/unit/interrupts.d.ts +12 -0
  62. package/engine/internal/unit/interrupts.lua +28 -0
  63. package/engine/internal/unit/main-selected.lua +12 -27
  64. package/engine/internal/unit/order.d.ts +20 -0
  65. package/engine/internal/unit/order.lua +136 -0
  66. package/engine/internal/unit/range-event.d.ts +12 -0
  67. package/engine/internal/unit/range-event.lua +90 -0
  68. package/engine/internal/unit/scale.d.ts +7 -0
  69. package/engine/internal/unit/scale.lua +20 -0
  70. package/engine/internal/unit+ability.lua +10 -1
  71. package/engine/internal/unit+damage.d.ts +2 -11
  72. package/engine/internal/unit+damage.lua +10 -14
  73. package/engine/internal/unit+spellSteal.lua +1 -2
  74. package/engine/internal/unit-missile-launch.lua +52 -14
  75. package/engine/internal/unit.d.ts +40 -27
  76. package/engine/internal/unit.lua +382 -264
  77. package/engine/local-client.d.ts +2 -0
  78. package/engine/local-client.lua +30 -0
  79. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  80. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  81. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  82. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  83. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  84. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  85. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  86. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  87. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  88. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  89. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  90. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  91. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  92. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  93. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  94. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  95. package/engine/object-data/entry/ability-type.d.ts +2 -0
  96. package/engine/object-data/entry/ability-type.lua +89 -8
  97. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  98. package/engine/object-data/entry/destructible-type.lua +155 -0
  99. package/engine/object-data/entry/unit-type.d.ts +17 -4
  100. package/engine/object-data/entry/unit-type.lua +197 -85
  101. package/engine/object-field/ability.d.ts +4 -4
  102. package/engine/object-field/ability.lua +7 -6
  103. package/engine/object-field/unit.d.ts +72 -3
  104. package/engine/object-field/unit.lua +268 -7
  105. package/engine/object-field.d.ts +25 -6
  106. package/engine/object-field.lua +357 -118
  107. package/engine/random.d.ts +10 -0
  108. package/engine/random.lua +21 -0
  109. package/engine/standard/fields/ability.d.ts +2 -2
  110. package/engine/standard/fields/ability.lua +2 -2
  111. package/engine/standard/fields/unit.d.ts +12 -0
  112. package/engine/standard/fields/unit.lua +20 -0
  113. package/engine/synchronization.d.ts +11 -0
  114. package/engine/synchronization.lua +77 -0
  115. package/engine/text-tag.d.ts +36 -2
  116. package/engine/text-tag.lua +250 -10
  117. package/engine/unit.d.ts +6 -0
  118. package/engine/unit.lua +6 -0
  119. package/net/socket.lua +1 -1
  120. package/objutil/buff.lua +11 -10
  121. package/package.json +2 -2
  122. package/patch-lua.lua +15 -0
  123. package/patch-lualib.lua +1 -1
  124. package/utility/arrays.d.ts +2 -0
  125. package/utility/arrays.lua +11 -0
  126. package/utility/callback-array.d.ts +17 -0
  127. package/utility/callback-array.lua +61 -0
  128. package/utility/functions.d.ts +8 -0
  129. package/utility/functions.lua +13 -0
  130. package/utility/linked-map.d.ts +34 -0
  131. package/utility/linked-map.lua +101 -0
  132. package/utility/linked-set.d.ts +4 -1
  133. package/utility/linked-set.lua +43 -1
  134. package/utility/lua-maps.d.ts +15 -2
  135. package/utility/lua-maps.lua +53 -2
  136. package/utility/lua-sets.d.ts +2 -0
  137. package/utility/lua-sets.lua +7 -0
  138. package/utility/records.lua +20 -1
  139. package/utility/types.d.ts +3 -0
  140. package/core/types/order.d.ts +0 -25
  141. 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,
@@ -120,11 +126,15 @@ local buffParametersKeys = {
120
126
  maximumAutoAttackCount = true,
121
127
  maximumDamageDealtEventCount = true,
122
128
  maximumDamageReceivedEventCount = true,
129
+ absorbedDamageFactor = true,
130
+ maximumDamageAbsorbed = true,
131
+ destroysOnMaximumDamageAbsorbed = true,
123
132
  uniqueGroup = true,
124
133
  damageOnExpiration = true,
125
134
  healingOnExpiration = true,
126
135
  killsOnExpiration = true,
127
- explodesOnExpiration = true
136
+ explodesOnExpiration = true,
137
+ abilityCooldownFactor = true
128
138
  }
129
139
  local function resolveEnumValue(ability, level, value)
130
140
  if value == nil or type(value) == "number" then
@@ -175,6 +185,7 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
175
185
  end
176
186
  end
177
187
  local buffBooleanParameters = {
188
+ "destroysOnMaximumDamageAbsorbed",
178
189
  "turnsIntoGhost",
179
190
  "stuns",
180
191
  "ignoresStunImmunity",
@@ -187,6 +198,7 @@ local buffNumberParameters = {
187
198
  "durationIncreaseOnAutoAttack",
188
199
  "attackSpeedIncreaseFactor",
189
200
  "movementSpeedIncreaseFactor",
201
+ "manaRegenerationRateIncreaseFactor",
190
202
  "evasionProbability",
191
203
  "armorIncrease",
192
204
  "damageFactor",
@@ -201,7 +213,10 @@ local buffNumberParameters = {
201
213
  "healingPerInterval",
202
214
  "healingOverDuration",
203
215
  "damageOnExpiration",
204
- "healingOnExpiration"
216
+ "healingOnExpiration",
217
+ "absorbedDamageFactor",
218
+ "maximumDamageAbsorbed",
219
+ "abilityCooldownFactor"
205
220
  }
206
221
  local unsuccessfulApplicationMarker = {}
207
222
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -304,7 +319,8 @@ buffHealingIntervalTimerCallback = function(buff)
304
319
  source:healTarget(buff[101], healingPerInterval)
305
320
  end
306
321
  end
307
- local buffDestroyEvent = __TS__New(Event)
322
+ local buffCreatedEvent = __TS__New(Event)
323
+ local buffBeingDestroyedEvent = __TS__New(Event)
308
324
  ____exports.Buff = __TS__Class()
309
325
  local Buff = ____exports.Buff
310
326
  Buff.name = "Buff"
@@ -319,33 +335,38 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
319
335
  local polarity
320
336
  local resistanceType
321
337
  local ability
338
+ local abilityBehavior
322
339
  if type(typeIdOrTypeIds) ~= "number" then
323
340
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
324
341
  polarity = resistanceTypeOrPolarity
325
342
  resistanceType = abilityOrParametersOrResistanceType
326
- if __TS__InstanceOf(parametersOrAbility, Ability) or parametersOrAbility == nil then
343
+ if __TS__InstanceOf(parametersOrAbility, AbilityBehavior) then
344
+ abilityBehavior = parametersOrAbility
345
+ ability = abilityBehavior.ability
346
+ elseif __TS__InstanceOf(parametersOrAbility, Ability) then
327
347
  ability = parametersOrAbility
328
- else
329
- ability = nil
348
+ elseif parametersOrAbility ~= nil then
330
349
  parameters = parametersOrAbility
331
350
  end
332
351
  else
333
352
  typeId = typeIdOrTypeIds
334
353
  polarity = polarityOrTypeIdSelectionPolicy
335
354
  resistanceType = resistanceTypeOrPolarity
336
- if __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) or abilityOrParametersOrResistanceType == nil 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
337
360
  ability = abilityOrParametersOrResistanceType
338
361
  parameters = parametersOrAbility
339
- else
340
- ability = nil
362
+ elseif abilityOrParametersOrResistanceType ~= nil then
341
363
  parameters = abilityOrParametersOrResistanceType
364
+ else
365
+ parameters = parametersOrAbility
342
366
  end
343
367
  end
368
+ self.sourceAbilityBehavior = abilityBehavior
344
369
  self.typeId = typeId
345
- if not (__TS__InstanceOf(ability, Ability) or ability == nil) then
346
- parameters = ability
347
- ability = nil
348
- end
349
370
  local defaultParameters = self.constructor.defaultParameters
350
371
  local level = parameters and parameters.level or defaultParameters.level
351
372
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -373,7 +394,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
373
394
  local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
374
395
  if missProbability ~= nil then
375
396
  missProbability = resolveNumberValue(ability, level, missProbability)
376
- self[142] = missProbability
397
+ self[146] = missProbability
377
398
  end
378
399
  local buffByTypeId = buffByTypeIdByUnit[_unit]
379
400
  if buffByTypeId == nil then
@@ -456,24 +477,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
456
477
  abilityTypeIds = {}
457
478
  self._abilityTypeIds = abilityTypeIds
458
479
  end
459
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
480
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
481
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
460
482
  local addedAbility = _unit:addAbility(abilityTypeId)
461
483
  if addedAbility ~= nil then
462
484
  _unit:makeAbilityPermanent(abilityTypeId, true)
463
485
  _unit:setAbilityLevel(abilityTypeId, 1 + (abilityParameters.level or ability and ability.level or 0))
464
- for abilityParameterKey, abilityParameterValue in pairs(abilityParameters) do
465
- if abilityParameterKey == "isButtonVisible" then
466
- if not resolveBooleanValue(ability, level, abilityParameterValue) then
467
- _unit:hideAbility(abilityTypeId, true)
468
- end
469
- elseif abilityParameterKey ~= "level" then
470
- abilityParameterKey:setValue(
471
- addedAbility,
472
- resolveNumberValue(ability, level, abilityParameterValue)
473
- )
474
- end
486
+ if abilityParameters.isButtonVisible == false then
487
+ _unit:hideAbility(abilityTypeId, true)
475
488
  end
476
- 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
477
496
  end
478
497
  end
479
498
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -485,18 +504,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
485
504
  self._behaviors = behaviors
486
505
  end
487
506
  end
488
- local additionalParameters = {}
489
- for key, value in pairs(parameters) do
490
- if not buffParametersKeys[key] then
491
- if ability then
492
- additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, value)
493
- else
494
- 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
495
516
  end
496
517
  end
497
- end
498
- if (next(additionalParameters)) ~= nil then
499
- self.parameters = additionalParameters
518
+ if (next(additionalParameters)) ~= nil then
519
+ self.parameters = additionalParameters
520
+ end
500
521
  end
501
522
  end
502
523
  if duration ~= nil and duration > 0 then
@@ -506,66 +527,73 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
506
527
  end
507
528
  self:onCreate()
508
529
  self[100] = 1
530
+ Event.invoke(buffCreatedEvent, self)
509
531
  end
510
- function Buff.prototype.getUnitBonus(self, bonusType)
511
- local ____opt_38 = self._bonusIdByBonusType
512
- local bonusId = ____opt_38 and ____opt_38[bonusType]
513
- 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
514
539
  end
515
- function Buff.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, value)
516
- local bonusIdByBonusType = self._bonusIdByBonusType
517
- if bonusIdByBonusType == nil then
518
- bonusIdByBonusType = {}
519
- 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
520
546
  end
521
- bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self._unit, bonusType, bonusIdByBonusType[bonusType], value)
522
547
  end
523
548
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
524
549
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
525
550
  Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
526
551
  else
527
552
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
528
- local ____Effect_42 = Effect
529
- local ____Effect_flash_43 = Effect.flash
530
- local ____array_41 = __TS__SparseArrayNew(
553
+ local ____Effect_40 = Effect
554
+ local ____Effect_flash_41 = Effect.flash
555
+ local ____array_39 = __TS__SparseArrayNew(
531
556
  self[105],
532
557
  isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
533
558
  stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
534
559
  )
535
- local ____isWidgetProvided_40
560
+ local ____isWidgetProvided_38
536
561
  if isWidgetProvided then
537
- ____isWidgetProvided_40 = yOrParametersOrDuration
562
+ ____isWidgetProvided_38 = yOrParametersOrDuration
538
563
  else
539
- ____isWidgetProvided_40 = widgetOrXOrParametersOrDuration
564
+ ____isWidgetProvided_38 = widgetOrXOrParametersOrDuration
540
565
  end
541
- __TS__SparseArrayPush(____array_41, ____isWidgetProvided_40)
542
- ____Effect_flash_43(
543
- ____Effect_42,
544
- __TS__SparseArraySpread(____array_41)
566
+ __TS__SparseArrayPush(____array_39, ____isWidgetProvided_38)
567
+ ____Effect_flash_41(
568
+ ____Effect_40,
569
+ __TS__SparseArraySpread(____array_39)
545
570
  )
546
571
  end
547
572
  end
548
573
  function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
549
574
  local isWidgetProvided = type(widgetOrDuration) == "table"
550
- local ____Effect_46 = Effect
551
- local ____Effect_flash_47 = Effect.flash
552
- local ____array_45 = __TS__SparseArrayNew(
575
+ local ____Effect_44 = Effect
576
+ local ____Effect_flash_45 = Effect.flash
577
+ local ____array_43 = __TS__SparseArrayNew(
553
578
  self[106],
554
579
  isWidgetProvided and widgetOrDuration or self._unit,
555
580
  stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
556
581
  )
557
- local ____isWidgetProvided_44
582
+ local ____isWidgetProvided_42
558
583
  if isWidgetProvided then
559
- ____isWidgetProvided_44 = duration
584
+ ____isWidgetProvided_42 = duration
560
585
  else
561
- ____isWidgetProvided_44 = widgetOrDuration
586
+ ____isWidgetProvided_42 = widgetOrDuration
562
587
  end
563
- __TS__SparseArrayPush(____array_45, ____isWidgetProvided_44)
564
- ____Effect_flash_47(
565
- ____Effect_46,
566
- __TS__SparseArraySpread(____array_45)
588
+ __TS__SparseArrayPush(____array_43, ____isWidgetProvided_42)
589
+ ____Effect_flash_45(
590
+ ____Effect_44,
591
+ __TS__SparseArraySpread(____array_43)
567
592
  )
568
593
  end
594
+ function Buff.prototype.expire(self)
595
+ expireBuff(self)
596
+ end
569
597
  function Buff.prototype.onCreate(self)
570
598
  end
571
599
  function Buff.prototype.onDestroy(self)
@@ -594,32 +622,33 @@ function Buff.prototype.onDestroy(self)
594
622
  behavior:destroy()
595
623
  end
596
624
  end
597
- if self[139] 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
598
632
  unit:decrementInvulnerabilityCounter()
599
633
  end
600
- if self[138] then
634
+ if self[142] then
601
635
  unit:decrementDisableAutoAttackCounter()
602
636
  end
603
- if self[136] then
604
- if self[137] then
605
- unit:decrementStunCounter()
637
+ if self[140] then
638
+ if self[141] then
639
+ unit:decrementForceStunCounter()
606
640
  end
607
641
  unit:decrementStunCounter()
608
642
  end
609
- if self[135] then
643
+ if self[139] then
610
644
  unit:decrementGhostCounter()
611
645
  end
612
646
  if self._abilityTypeIds ~= nil then
613
- for abilityTypeId in pairs(self._abilityTypeIds) do
647
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
614
648
  unit:removeAbility(abilityTypeId)
615
649
  end
616
650
  end
617
- if self._bonusIdByBonusType ~= nil then
618
- for bonusType, bonusId in pairs(self._bonusIdByBonusType) do
619
- removeUnitBonus(unit, bonusType, bonusId)
620
- end
621
- end
622
- Event.invoke(buffDestroyEvent, self)
651
+ Event.invoke(buffBeingDestroyedEvent, self)
623
652
  self[100] = 3
624
653
  return UnitBehavior.prototype.onDestroy(self)
625
654
  end
@@ -648,8 +677,8 @@ function Buff.apply(self, ...)
648
677
  end
649
678
  end
650
679
  function Buff.getByTypeId(self, unit, typeId)
651
- local ____opt_48 = buffByTypeIdByUnit[unit]
652
- local buff = ____opt_48 and ____opt_48[typeId]
680
+ local ____opt_46 = buffByTypeIdByUnit[unit]
681
+ local buff = ____opt_46 and ____opt_46[typeId]
653
682
  if __TS__InstanceOf(buff, self) then
654
683
  return buff
655
684
  end
@@ -663,9 +692,9 @@ function Buff.prototype.onExpiration(self)
663
692
  if self[121] ~= nil then
664
693
  (self[102] or unit):healTarget(unit, self[120] or 0)
665
694
  end
666
- if self[141] then
695
+ if self[145] then
667
696
  unit:explode()
668
- elseif self[140] then
697
+ elseif self[144] then
669
698
  unit:kill()
670
699
  end
671
700
  end
@@ -720,6 +749,18 @@ function Buff.prototype.onDamageDealt(self, target, event)
720
749
  end
721
750
  function Buff.prototype.onDamageReceived(self, source, event)
722
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
723
764
  local damageReceivedEventCount = (self[133] or 0) + 1
724
765
  self[133] = damageReceivedEventCount
725
766
  if damageReceivedEventCount == self[134] then
@@ -807,8 +848,8 @@ __TS__SetDescriptor(
807
848
  return
808
849
  end
809
850
  self[112] = damageInterval
810
- local ____opt_50 = self._timer
811
- 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
812
853
  local timer = self[114]
813
854
  if timer == nil then
814
855
  timer = Timer:create()
@@ -887,8 +928,8 @@ __TS__SetDescriptor(
887
928
  return
888
929
  end
889
930
  self[117] = healingInterval
890
- local ____opt_52 = self._timer
891
- 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
892
933
  local timer = self[119]
893
934
  if timer == nil then
894
935
  timer = Timer:create()
@@ -974,19 +1015,19 @@ __TS__SetDescriptor(
974
1015
  "turnsIntoGhost",
975
1016
  {
976
1017
  get = function(self)
977
- local ____self__135_54 = self[135]
978
- if ____self__135_54 == nil then
979
- ____self__135_54 = false
1018
+ local ____self__139_53 = self[139]
1019
+ if ____self__139_53 == nil then
1020
+ ____self__139_53 = false
980
1021
  end
981
- return ____self__135_54
1022
+ return ____self__139_53
982
1023
  end,
983
1024
  set = function(self, turnsIntoGhost)
984
- if not turnsIntoGhost and self[135] then
1025
+ if not turnsIntoGhost and self[139] then
985
1026
  self.object:decrementGhostCounter()
986
- self[135] = nil
987
- elseif turnsIntoGhost and not self[135] then
1027
+ self[139] = nil
1028
+ elseif turnsIntoGhost and not self[139] then
988
1029
  self.object:incrementGhostCounter()
989
- self[135] = true
1030
+ self[139] = true
990
1031
  end
991
1032
  end
992
1033
  },
@@ -997,25 +1038,25 @@ __TS__SetDescriptor(
997
1038
  "stuns",
998
1039
  {
999
1040
  get = function(self)
1000
- local ____self__136_55 = self[136]
1001
- if ____self__136_55 == nil then
1002
- ____self__136_55 = false
1041
+ local ____self__140_54 = self[140]
1042
+ if ____self__140_54 == nil then
1043
+ ____self__140_54 = false
1003
1044
  end
1004
- return ____self__136_55
1045
+ return ____self__140_54
1005
1046
  end,
1006
1047
  set = function(self, stuns)
1007
- if not stuns and self[136] then
1008
- if self[137] then
1009
- self.object:decrementStunCounter()
1048
+ if not stuns and self[140] then
1049
+ if self[141] then
1050
+ self.object:decrementForceStunCounter()
1010
1051
  end
1011
1052
  self.object:decrementStunCounter()
1012
- self[136] = nil
1013
- elseif stuns and not self[136] then
1014
- if self[137] then
1015
- self.object:incrementStunCounter()
1053
+ self[140] = nil
1054
+ elseif stuns and not self[140] then
1055
+ if self[141] then
1056
+ self.object:incrementForceStunCounter()
1016
1057
  end
1017
1058
  self.object:incrementStunCounter()
1018
- self[136] = true
1059
+ self[140] = true
1019
1060
  end
1020
1061
  end
1021
1062
  },
@@ -1026,23 +1067,23 @@ __TS__SetDescriptor(
1026
1067
  "ignoresStunImmunity",
1027
1068
  {
1028
1069
  get = function(self)
1029
- local ____self__137_56 = self[137]
1030
- if ____self__137_56 == nil then
1031
- ____self__137_56 = false
1070
+ local ____self__141_55 = self[141]
1071
+ if ____self__141_55 == nil then
1072
+ ____self__141_55 = false
1032
1073
  end
1033
- return ____self__137_56
1074
+ return ____self__141_55
1034
1075
  end,
1035
1076
  set = function(self, ignoresStunImmunity)
1036
- if not ignoresStunImmunity and self[137] then
1037
- if self[136] then
1038
- self.object:decrementStunCounter()
1077
+ if not ignoresStunImmunity and self[141] then
1078
+ if self[140] then
1079
+ self.object:decrementForceStunCounter()
1039
1080
  end
1040
- self[137] = nil
1041
- elseif ignoresStunImmunity and not self[137] then
1042
- if self[136] then
1043
- self.object:incrementStunCounter()
1081
+ self[141] = nil
1082
+ elseif ignoresStunImmunity and not self[141] then
1083
+ if self[140] then
1084
+ self.object:incrementForceStunCounter()
1044
1085
  end
1045
- self[137] = true
1086
+ self[141] = true
1046
1087
  end
1047
1088
  end
1048
1089
  },
@@ -1053,19 +1094,19 @@ __TS__SetDescriptor(
1053
1094
  "disablesAutoAttack",
1054
1095
  {
1055
1096
  get = function(self)
1056
- local ____self__138_57 = self[138]
1057
- if ____self__138_57 == nil then
1058
- ____self__138_57 = false
1097
+ local ____self__142_56 = self[142]
1098
+ if ____self__142_56 == nil then
1099
+ ____self__142_56 = false
1059
1100
  end
1060
- return ____self__138_57
1101
+ return ____self__142_56
1061
1102
  end,
1062
1103
  set = function(self, disablesAutoAttack)
1063
- if not disablesAutoAttack and self[138] then
1104
+ if not disablesAutoAttack and self[142] then
1064
1105
  self.object:decrementDisableAutoAttackCounter()
1065
- self[138] = nil
1066
- elseif disablesAutoAttack and not self[138] then
1106
+ self[142] = nil
1107
+ elseif disablesAutoAttack and not self[142] then
1067
1108
  self.object:incrementDisableAutoAttackCounter()
1068
- self[138] = true
1109
+ self[142] = true
1069
1110
  end
1070
1111
  end
1071
1112
  },
@@ -1076,19 +1117,19 @@ __TS__SetDescriptor(
1076
1117
  "providesInvulnerability",
1077
1118
  {
1078
1119
  get = function(self)
1079
- local ____self__139_58 = self[139]
1080
- if ____self__139_58 == nil then
1081
- ____self__139_58 = false
1120
+ local ____self__143_57 = self[143]
1121
+ if ____self__143_57 == nil then
1122
+ ____self__143_57 = false
1082
1123
  end
1083
- return ____self__139_58
1124
+ return ____self__143_57
1084
1125
  end,
1085
1126
  set = function(self, providesInvulnerability)
1086
- if not providesInvulnerability and self[139] then
1127
+ if not providesInvulnerability and self[143] then
1087
1128
  self.object:decrementInvulnerabilityCounter()
1088
- self[139] = nil
1089
- elseif providesInvulnerability and not self[139] then
1129
+ self[143] = nil
1130
+ elseif providesInvulnerability and not self[143] then
1090
1131
  self.object:incrementInvulnerabilityCounter()
1091
- self[139] = true
1132
+ self[143] = true
1092
1133
  end
1093
1134
  end
1094
1135
  },
@@ -1099,17 +1140,17 @@ __TS__SetDescriptor(
1099
1140
  "killsOnExpiration",
1100
1141
  {
1101
1142
  get = function(self)
1102
- local ____self__140_59 = self[140]
1103
- if ____self__140_59 == nil then
1104
- ____self__140_59 = false
1143
+ local ____self__144_58 = self[144]
1144
+ if ____self__144_58 == nil then
1145
+ ____self__144_58 = false
1105
1146
  end
1106
- return ____self__140_59
1147
+ return ____self__144_58
1107
1148
  end,
1108
1149
  set = function(self, killsOnExpiration)
1109
- if not killsOnExpiration and self[140] then
1110
- self[140] = nil
1111
- elseif killsOnExpiration and not self[140] then
1112
- self[140] = 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
1113
1154
  end
1114
1155
  end
1115
1156
  },
@@ -1120,17 +1161,17 @@ __TS__SetDescriptor(
1120
1161
  "explodesOnExpiration",
1121
1162
  {
1122
1163
  get = function(self)
1123
- local ____self__141_60 = self[141]
1124
- if ____self__141_60 == nil then
1125
- ____self__141_60 = false
1164
+ local ____self__145_59 = self[145]
1165
+ if ____self__145_59 == nil then
1166
+ ____self__145_59 = false
1126
1167
  end
1127
- return ____self__141_60
1168
+ return ____self__145_59
1128
1169
  end,
1129
1170
  set = function(self, killsOnExpiration)
1130
- if not killsOnExpiration and self[141] then
1131
- self[141] = nil
1132
- elseif killsOnExpiration and not self[141] then
1133
- self[141] = 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
1134
1175
  end
1135
1176
  end
1136
1177
  },
@@ -1239,12 +1280,39 @@ __TS__SetDescriptor(
1239
1280
  },
1240
1281
  true
1241
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
+ )
1242
1296
  __TS__SetDescriptor(
1243
1297
  Buff.prototype,
1244
1298
  "duration",
1245
- {get = function(self)
1246
- return self[103]
1247
- 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
+ },
1248
1316
  true
1249
1317
  )
1250
1318
  __TS__SetDescriptor(
@@ -1252,13 +1320,13 @@ __TS__SetDescriptor(
1252
1320
  "remainingDuration",
1253
1321
  {
1254
1322
  get = function(self)
1255
- local ____opt_61 = self._timer
1256
- return ____opt_61 and ____opt_61.remaining or 0
1323
+ local ____opt_60 = self._timer
1324
+ return ____opt_60 and ____opt_60.remaining or 0
1257
1325
  end,
1258
1326
  set = function(self, remainingDuration)
1259
- local ____remainingDuration_65 = remainingDuration
1260
- local ____opt_63 = self._timer
1261
- local remainingDurationDelta = ____remainingDuration_65 - (____opt_63 and ____opt_63.remaining or 0)
1327
+ local ____remainingDuration_64 = remainingDuration
1328
+ local ____opt_62 = self._timer
1329
+ local remainingDurationDelta = ____remainingDuration_64 - (____opt_62 and ____opt_62.remaining or 0)
1262
1330
  if remainingDurationDelta ~= 0 then
1263
1331
  self[103] = self[103] + remainingDurationDelta
1264
1332
  if remainingDuration <= 0 then
@@ -1273,7 +1341,7 @@ __TS__SetDescriptor(
1273
1341
  remainingDuration,
1274
1342
  self._spellStealPriority,
1275
1343
  self._learnLevelMinimum,
1276
- self[142]
1344
+ self[146]
1277
1345
  ) then
1278
1346
  local timer = self._timer
1279
1347
  if timer == nil then
@@ -1288,7 +1356,99 @@ __TS__SetDescriptor(
1288
1356
  },
1289
1357
  true
1290
1358
  )
1291
- 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;
1292
1452
  (function(self)
1293
1453
  local function destroyBuffIfNeeded(buff)
1294
1454
  if getUnitAbility(buff[101].handle, buff.typeId) ~= buff.handle and buff[100] == 1 then
@@ -1342,5 +1502,11 @@ Buff.destroyEvent = buffDestroyEvent;
1342
1502
  ____exports.checkBuffs(target)
1343
1503
  end
1344
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)
1345
1511
  end)(Buff)
1346
1512
  return ____exports