warscript 0.0.1-dev.989e1a3 → 0.0.1-dev.9979c8f

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 (69) hide show
  1. package/core/types/frame.lua +47 -1
  2. package/core/types/sound.lua +1 -1
  3. package/engine/behaviour/ability/damage.d.ts +3 -0
  4. package/engine/behaviour/ability/damage.lua +8 -2
  5. package/engine/behaviour/ability.d.ts +9 -5
  6. package/engine/behaviour/ability.lua +29 -0
  7. package/engine/behaviour/unit/stun-immunity.d.ts +1 -1
  8. package/engine/behaviour/unit/stun-immunity.lua +5 -4
  9. package/engine/behaviour/unit.lua +13 -3
  10. package/engine/buff.d.ts +53 -19
  11. package/engine/buff.lua +268 -142
  12. package/engine/internal/mechanics/cast-ability.lua +6 -3
  13. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  14. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  15. package/engine/internal/object-data/health-bonus.lua +16 -0
  16. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  17. package/engine/internal/object-data/mana-bonus.lua +16 -0
  18. package/engine/internal/unit/attributes.d.ts +17 -0
  19. package/engine/internal/unit/attributes.lua +46 -0
  20. package/engine/internal/unit/bonus.d.ts +4 -0
  21. package/engine/internal/unit/bonus.lua +23 -3
  22. package/engine/internal/unit/fly-height.lua +3 -3
  23. package/engine/internal/unit/interrupts.d.ts +12 -0
  24. package/engine/internal/unit/interrupts.lua +28 -0
  25. package/engine/internal/unit/range-event.d.ts +12 -0
  26. package/engine/internal/unit/range-event.lua +90 -0
  27. package/engine/internal/unit/scale.lua +3 -3
  28. package/engine/internal/unit+bonus.lua +3 -3
  29. package/engine/internal/unit-missile-launch.lua +12 -5
  30. package/engine/internal/unit.d.ts +2 -9
  31. package/engine/internal/unit.lua +79 -121
  32. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  33. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  34. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  35. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  36. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  37. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  38. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  39. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  40. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  41. package/engine/object-data/entry/ability-type.d.ts +2 -0
  42. package/engine/object-data/entry/ability-type.lua +84 -4
  43. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  44. package/engine/object-field/ability.lua +2 -2
  45. package/engine/object-field.d.ts +3 -1
  46. package/engine/object-field.lua +42 -18
  47. package/engine/random.d.ts +1 -0
  48. package/engine/random.lua +8 -0
  49. package/engine/standard/fields/unit.d.ts +11 -6
  50. package/engine/standard/fields/unit.lua +12 -5
  51. package/engine/unit.d.ts +3 -0
  52. package/engine/unit.lua +3 -0
  53. package/lualib_bundle.lua +1 -1
  54. package/math.d.ts +2 -0
  55. package/math.lua +14 -0
  56. package/objutil/buff.lua +9 -7
  57. package/objutil/object.lua +1 -1
  58. package/operation.lua +1 -4
  59. package/package.json +5 -5
  60. package/patch-lua.lua +15 -0
  61. package/utility/linked-map.d.ts +34 -0
  62. package/utility/linked-map.lua +101 -0
  63. package/utility/linked-set.d.ts +2 -1
  64. package/utility/linked-set.lua +21 -0
  65. package/utility/records.lua +20 -1
  66. /package/engine/internal/object-data/{armor-increase.d.ts → armor-bonus.d.ts} +0 -0
  67. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  68. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  69. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
package/engine/buff.lua CHANGED
@@ -42,6 +42,7 @@ local BuffType = ____buff_2Dtype.BuffType
42
42
  local ____unit = require("engine.behaviour.unit")
43
43
  local UnitBehavior = ____unit.UnitBehavior
44
44
  local ____arrays = require("utility.arrays")
45
+ local emptyArray = ____arrays.emptyArray
45
46
  local forEach = ____arrays.forEach
46
47
  local ____event = require("event")
47
48
  local Event = ____event.Event
@@ -55,6 +56,8 @@ local ____ability = require("engine.standard.fields.ability")
55
56
  local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
56
57
  local ____ability = require("engine.behaviour.ability")
57
58
  local AbilityBehavior = ____ability.AbilityBehavior
59
+ local ____records = require("utility.records")
60
+ local sortedKeysUnnested = ____records.sortedKeysUnnested
58
61
  local getUnitAbility = BlzGetUnitAbility
59
62
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
60
63
  local stringValueByBuffTypeIdByFieldId = {}
@@ -100,7 +103,8 @@ local buffParametersKeys = {
100
103
  damageIncrease = true,
101
104
  damageIncreaseFactor = true,
102
105
  armorIncrease = true,
103
- armorIncreaseFactor = true,
106
+ maxHealthIncrease = true,
107
+ maxManaIncrease = true,
104
108
  attackSpeedIncreaseFactor = true,
105
109
  movementSpeedIncreaseFactor = true,
106
110
  manaRegenerationRateIncreaseFactor = true,
@@ -123,6 +127,9 @@ local buffParametersKeys = {
123
127
  maximumAutoAttackCount = true,
124
128
  maximumDamageDealtEventCount = true,
125
129
  maximumDamageReceivedEventCount = true,
130
+ absorbedDamageFactor = true,
131
+ maximumDamageAbsorbed = true,
132
+ destroysOnMaximumDamageAbsorbed = true,
126
133
  uniqueGroup = true,
127
134
  damageOnExpiration = true,
128
135
  healingOnExpiration = true,
@@ -179,6 +186,7 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
179
186
  end
180
187
  end
181
188
  local buffBooleanParameters = {
189
+ "destroysOnMaximumDamageAbsorbed",
182
190
  "turnsIntoGhost",
183
191
  "stuns",
184
192
  "ignoresStunImmunity",
@@ -194,6 +202,8 @@ local buffNumberParameters = {
194
202
  "manaRegenerationRateIncreaseFactor",
195
203
  "evasionProbability",
196
204
  "armorIncrease",
205
+ "maxHealthIncrease",
206
+ "maxManaIncrease",
197
207
  "damageFactor",
198
208
  "receivedDamageFactor",
199
209
  "maximumAutoAttackCount",
@@ -207,6 +217,8 @@ local buffNumberParameters = {
207
217
  "healingOverDuration",
208
218
  "damageOnExpiration",
209
219
  "healingOnExpiration",
220
+ "absorbedDamageFactor",
221
+ "maximumDamageAbsorbed",
210
222
  "abilityCooldownFactor"
211
223
  }
212
224
  local unsuccessfulApplicationMarker = {}
@@ -385,14 +397,15 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
385
397
  local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
386
398
  if missProbability ~= nil then
387
399
  missProbability = resolveNumberValue(ability, level, missProbability)
388
- self[142] = missProbability
400
+ self[146] = missProbability
389
401
  end
390
402
  local buffByTypeId = buffByTypeIdByUnit[_unit]
391
403
  if buffByTypeId == nil then
392
404
  buffByTypeId = {}
393
405
  buffByTypeIdByUnit[_unit] = buffByTypeId
394
406
  end
395
- local ____opt_15 = buffByTypeId[typeId]
407
+ self.previousBuff = buffByTypeId[typeId]
408
+ local ____opt_15 = self.previousBuff
396
409
  if ____opt_15 ~= nil then
397
410
  ____opt_15:destroy()
398
411
  end
@@ -468,24 +481,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
468
481
  abilityTypeIds = {}
469
482
  self._abilityTypeIds = abilityTypeIds
470
483
  end
471
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
484
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
485
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
472
486
  local addedAbility = _unit:addAbility(abilityTypeId)
473
487
  if addedAbility ~= nil then
474
488
  _unit:makeAbilityPermanent(abilityTypeId, true)
475
489
  _unit:setAbilityLevel(abilityTypeId, 1 + (abilityParameters.level or ability and ability.level or 0))
476
- for abilityParameterKey, abilityParameterValue in pairs(abilityParameters) do
477
- if abilityParameterKey == "isButtonVisible" then
478
- if not resolveBooleanValue(ability, level, abilityParameterValue) then
479
- _unit:hideAbility(abilityTypeId, true)
480
- end
481
- elseif abilityParameterKey ~= "level" then
482
- abilityParameterKey:setValue(
483
- addedAbility,
484
- resolveNumberValue(ability, level, abilityParameterValue)
485
- )
486
- end
490
+ if abilityParameters.isButtonVisible == false then
491
+ _unit:hideAbility(abilityTypeId, true)
492
+ end
493
+ for ____, field in ipairs(abilityParameters.fields or emptyArray()) do
494
+ field[1]:setValue(
495
+ addedAbility,
496
+ resolveNumberValue(ability, level, field[2])
497
+ )
487
498
  end
488
- abilityTypeIds[abilityTypeId] = true
499
+ abilityTypeIds[#abilityTypeIds + 1] = abilityTypeId
489
500
  end
490
501
  end
491
502
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -497,18 +508,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
497
508
  self._behaviors = behaviors
498
509
  end
499
510
  end
500
- local additionalParameters = {}
501
- for key, value in pairs(parameters) do
502
- if not buffParametersKeys[key] then
503
- if ability then
504
- additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, value)
505
- else
506
- additionalParameters[key] = value
511
+ if parameters ~= nil then
512
+ local additionalParameters = {}
513
+ for ____, key in ipairs(sortedKeysUnnested(parameters)) do
514
+ if not buffParametersKeys[key] then
515
+ if ability then
516
+ additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, parameters[key])
517
+ else
518
+ additionalParameters[key] = parameters[key]
519
+ end
507
520
  end
508
521
  end
509
- end
510
- if (next(additionalParameters)) ~= nil then
511
- self.parameters = additionalParameters
522
+ if (next(additionalParameters)) ~= nil then
523
+ self.parameters = additionalParameters
524
+ end
512
525
  end
513
526
  end
514
527
  if duration ~= nil and duration > 0 then
@@ -522,7 +535,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
522
535
  end
523
536
  function Buff.prototype.onAbilityGained(self, ability)
524
537
  if __TS__InstanceOf(ability, UnitAbility) then
525
- local abilityCooldownModifier = self[144]
538
+ local abilityCooldownModifier = self[148]
526
539
  if abilityCooldownModifier then
527
540
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
528
541
  end
@@ -530,24 +543,38 @@ function Buff.prototype.onAbilityGained(self, ability)
530
543
  end
531
544
  function Buff.prototype.onAbilityLost(self, ability)
532
545
  if __TS__InstanceOf(ability, UnitAbility) then
533
- local abilityCooldownModifier = self[144]
546
+ local abilityCooldownModifier = self[148]
534
547
  if abilityCooldownModifier then
535
548
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
536
549
  end
537
550
  end
538
551
  end
539
552
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
553
+ self:flash(
554
+ self[105],
555
+ stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin",
556
+ widgetOrXOrParametersOrDuration,
557
+ yOrParametersOrDuration,
558
+ parametersOrDuration
559
+ )
560
+ end
561
+ function Buff.prototype.flashSpecialEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
562
+ self:flash(
563
+ self[106],
564
+ stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin",
565
+ widgetOrXOrParametersOrDuration,
566
+ yOrParametersOrDuration,
567
+ parametersOrDuration
568
+ )
569
+ end
570
+ function Buff.prototype.flash(self, modelPath, attachmentPoint, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
540
571
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
541
- Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
572
+ Effect:flash(modelPath, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
542
573
  else
543
574
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
544
575
  local ____Effect_40 = Effect
545
576
  local ____Effect_flash_41 = Effect.flash
546
- local ____array_39 = __TS__SparseArrayNew(
547
- self[105],
548
- isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
549
- stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
550
- )
577
+ local ____array_39 = __TS__SparseArrayNew(modelPath, isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit, attachmentPoint)
551
578
  local ____isWidgetProvided_38
552
579
  if isWidgetProvided then
553
580
  ____isWidgetProvided_38 = yOrParametersOrDuration
@@ -561,26 +588,8 @@ function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrPa
561
588
  )
562
589
  end
563
590
  end
564
- function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
565
- local isWidgetProvided = type(widgetOrDuration) == "table"
566
- local ____Effect_44 = Effect
567
- local ____Effect_flash_45 = Effect.flash
568
- local ____array_43 = __TS__SparseArrayNew(
569
- self[106],
570
- isWidgetProvided and widgetOrDuration or self._unit,
571
- stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
572
- )
573
- local ____isWidgetProvided_42
574
- if isWidgetProvided then
575
- ____isWidgetProvided_42 = duration
576
- else
577
- ____isWidgetProvided_42 = widgetOrDuration
578
- end
579
- __TS__SparseArrayPush(____array_43, ____isWidgetProvided_42)
580
- ____Effect_flash_45(
581
- ____Effect_44,
582
- __TS__SparseArraySpread(____array_43)
583
- )
591
+ function Buff.prototype.expire(self)
592
+ expireBuff(self)
584
593
  end
585
594
  function Buff.prototype.onCreate(self)
586
595
  end
@@ -610,29 +619,29 @@ function Buff.prototype.onDestroy(self)
610
619
  behavior:destroy()
611
620
  end
612
621
  end
613
- local previousAbilityCooldownModifier = self[144]
622
+ local previousAbilityCooldownModifier = self[148]
614
623
  if previousAbilityCooldownModifier then
615
624
  for ____, ability in ipairs(self._unit.abilities) do
616
625
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
617
626
  end
618
627
  end
619
- if self[139] then
628
+ if self[143] then
620
629
  unit:decrementInvulnerabilityCounter()
621
630
  end
622
- if self[138] then
631
+ if self[142] then
623
632
  unit:decrementDisableAutoAttackCounter()
624
633
  end
625
- if self[136] then
626
- if self[137] then
634
+ if self[140] then
635
+ if self[141] then
627
636
  unit:decrementForceStunCounter()
628
637
  end
629
638
  unit:decrementStunCounter()
630
639
  end
631
- if self[135] then
640
+ if self[139] then
632
641
  unit:decrementGhostCounter()
633
642
  end
634
643
  if self._abilityTypeIds ~= nil then
635
- for abilityTypeId in pairs(self._abilityTypeIds) do
644
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
636
645
  unit:removeAbility(abilityTypeId)
637
646
  end
638
647
  end
@@ -665,8 +674,8 @@ function Buff.apply(self, ...)
665
674
  end
666
675
  end
667
676
  function Buff.getByTypeId(self, unit, typeId)
668
- local ____opt_46 = buffByTypeIdByUnit[unit]
669
- local buff = ____opt_46 and ____opt_46[typeId]
677
+ local ____opt_42 = buffByTypeIdByUnit[unit]
678
+ local buff = ____opt_42 and ____opt_42[typeId]
670
679
  if __TS__InstanceOf(buff, self) then
671
680
  return buff
672
681
  end
@@ -680,9 +689,9 @@ function Buff.prototype.onExpiration(self)
680
689
  if self[121] ~= nil then
681
690
  (self[102] or unit):healTarget(unit, self[120] or 0)
682
691
  end
683
- if self[141] then
692
+ if self[145] then
684
693
  unit:explode()
685
- elseif self[140] then
694
+ elseif self[144] then
686
695
  unit:kill()
687
696
  end
688
697
  end
@@ -737,6 +746,18 @@ function Buff.prototype.onDamageDealt(self, target, event)
737
746
  end
738
747
  function Buff.prototype.onDamageReceived(self, source, event)
739
748
  if event.originalAmount ~= 0 then
749
+ local absorbedDamage = min(event.amount * (self[135] or 1), (self[136] or 0) - (self[137] or 0))
750
+ if absorbedDamage > 0 then
751
+ event.amount = event.amount - absorbedDamage
752
+ self[137] = (self[137] or 0) + absorbedDamage
753
+ local ____self__138_44 = self[138]
754
+ if ____self__138_44 == nil then
755
+ ____self__138_44 = true
756
+ end
757
+ if ____self__138_44 and self[137] >= (self[136] or 0) then
758
+ self:destroy()
759
+ end
760
+ end
740
761
  local damageReceivedEventCount = (self[133] or 0) + 1
741
762
  self[133] = damageReceivedEventCount
742
763
  if damageReceivedEventCount == self[134] then
@@ -824,8 +845,8 @@ __TS__SetDescriptor(
824
845
  return
825
846
  end
826
847
  self[112] = damageInterval
827
- local ____opt_48 = self._timer
828
- local elapsed = ____opt_48 and ____opt_48.elapsed or 0
848
+ local ____opt_45 = self._timer
849
+ local elapsed = ____opt_45 and ____opt_45.elapsed or 0
829
850
  local timer = self[114]
830
851
  if timer == nil then
831
852
  timer = Timer:create()
@@ -904,8 +925,8 @@ __TS__SetDescriptor(
904
925
  return
905
926
  end
906
927
  self[117] = healingInterval
907
- local ____opt_50 = self._timer
908
- local elapsed = ____opt_50 and ____opt_50.elapsed or 0
928
+ local ____opt_47 = self._timer
929
+ local elapsed = ____opt_47 and ____opt_47.elapsed or 0
909
930
  local timer = self[119]
910
931
  if timer == nil then
911
932
  timer = Timer:create()
@@ -986,24 +1007,50 @@ __TS__SetDescriptor(
986
1007
  },
987
1008
  true
988
1009
  )
1010
+ __TS__SetDescriptor(
1011
+ Buff.prototype,
1012
+ "maxHealthIncrease",
1013
+ {
1014
+ get = function(self)
1015
+ return self:getUnitBonus(UnitBonusType.HEALTH)
1016
+ end,
1017
+ set = function(self, maxHealthIncrease)
1018
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.HEALTH, maxHealthIncrease)
1019
+ end
1020
+ },
1021
+ true
1022
+ )
1023
+ __TS__SetDescriptor(
1024
+ Buff.prototype,
1025
+ "maxManaIncrease",
1026
+ {
1027
+ get = function(self)
1028
+ return self:getUnitBonus(UnitBonusType.MANA)
1029
+ end,
1030
+ set = function(self, maxManaIncrease)
1031
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA, maxManaIncrease)
1032
+ end
1033
+ },
1034
+ true
1035
+ )
989
1036
  __TS__SetDescriptor(
990
1037
  Buff.prototype,
991
1038
  "turnsIntoGhost",
992
1039
  {
993
1040
  get = function(self)
994
- local ____self__135_52 = self[135]
995
- if ____self__135_52 == nil then
996
- ____self__135_52 = false
1041
+ local ____self__139_49 = self[139]
1042
+ if ____self__139_49 == nil then
1043
+ ____self__139_49 = false
997
1044
  end
998
- return ____self__135_52
1045
+ return ____self__139_49
999
1046
  end,
1000
1047
  set = function(self, turnsIntoGhost)
1001
- if not turnsIntoGhost and self[135] then
1048
+ if not turnsIntoGhost and self[139] then
1002
1049
  self.object:decrementGhostCounter()
1003
- self[135] = nil
1004
- elseif turnsIntoGhost and not self[135] then
1050
+ self[139] = nil
1051
+ elseif turnsIntoGhost and not self[139] then
1005
1052
  self.object:incrementGhostCounter()
1006
- self[135] = true
1053
+ self[139] = true
1007
1054
  end
1008
1055
  end
1009
1056
  },
@@ -1014,25 +1061,25 @@ __TS__SetDescriptor(
1014
1061
  "stuns",
1015
1062
  {
1016
1063
  get = function(self)
1017
- local ____self__136_53 = self[136]
1018
- if ____self__136_53 == nil then
1019
- ____self__136_53 = false
1064
+ local ____self__140_50 = self[140]
1065
+ if ____self__140_50 == nil then
1066
+ ____self__140_50 = false
1020
1067
  end
1021
- return ____self__136_53
1068
+ return ____self__140_50
1022
1069
  end,
1023
1070
  set = function(self, stuns)
1024
- if not stuns and self[136] then
1025
- if self[137] then
1071
+ if not stuns and self[140] then
1072
+ if self[141] then
1026
1073
  self.object:decrementForceStunCounter()
1027
1074
  end
1028
1075
  self.object:decrementStunCounter()
1029
- self[136] = nil
1030
- elseif stuns and not self[136] then
1031
- if self[137] then
1076
+ self[140] = nil
1077
+ elseif stuns and not self[140] then
1078
+ if self[141] then
1032
1079
  self.object:incrementForceStunCounter()
1033
1080
  end
1034
1081
  self.object:incrementStunCounter()
1035
- self[136] = true
1082
+ self[140] = true
1036
1083
  end
1037
1084
  end
1038
1085
  },
@@ -1043,23 +1090,23 @@ __TS__SetDescriptor(
1043
1090
  "ignoresStunImmunity",
1044
1091
  {
1045
1092
  get = function(self)
1046
- local ____self__137_54 = self[137]
1047
- if ____self__137_54 == nil then
1048
- ____self__137_54 = false
1093
+ local ____self__141_51 = self[141]
1094
+ if ____self__141_51 == nil then
1095
+ ____self__141_51 = false
1049
1096
  end
1050
- return ____self__137_54
1097
+ return ____self__141_51
1051
1098
  end,
1052
1099
  set = function(self, ignoresStunImmunity)
1053
- if not ignoresStunImmunity and self[137] then
1054
- if self[136] then
1100
+ if not ignoresStunImmunity and self[141] then
1101
+ if self[140] then
1055
1102
  self.object:decrementForceStunCounter()
1056
1103
  end
1057
- self[137] = nil
1058
- elseif ignoresStunImmunity and not self[137] then
1059
- if self[136] then
1104
+ self[141] = nil
1105
+ elseif ignoresStunImmunity and not self[141] then
1106
+ if self[140] then
1060
1107
  self.object:incrementForceStunCounter()
1061
1108
  end
1062
- self[137] = true
1109
+ self[141] = true
1063
1110
  end
1064
1111
  end
1065
1112
  },
@@ -1070,19 +1117,19 @@ __TS__SetDescriptor(
1070
1117
  "disablesAutoAttack",
1071
1118
  {
1072
1119
  get = function(self)
1073
- local ____self__138_55 = self[138]
1074
- if ____self__138_55 == nil then
1075
- ____self__138_55 = false
1120
+ local ____self__142_52 = self[142]
1121
+ if ____self__142_52 == nil then
1122
+ ____self__142_52 = false
1076
1123
  end
1077
- return ____self__138_55
1124
+ return ____self__142_52
1078
1125
  end,
1079
1126
  set = function(self, disablesAutoAttack)
1080
- if not disablesAutoAttack and self[138] then
1127
+ if not disablesAutoAttack and self[142] then
1081
1128
  self.object:decrementDisableAutoAttackCounter()
1082
- self[138] = nil
1083
- elseif disablesAutoAttack and not self[138] then
1129
+ self[142] = nil
1130
+ elseif disablesAutoAttack and not self[142] then
1084
1131
  self.object:incrementDisableAutoAttackCounter()
1085
- self[138] = true
1132
+ self[142] = true
1086
1133
  end
1087
1134
  end
1088
1135
  },
@@ -1093,19 +1140,19 @@ __TS__SetDescriptor(
1093
1140
  "providesInvulnerability",
1094
1141
  {
1095
1142
  get = function(self)
1096
- local ____self__139_56 = self[139]
1097
- if ____self__139_56 == nil then
1098
- ____self__139_56 = false
1143
+ local ____self__143_53 = self[143]
1144
+ if ____self__143_53 == nil then
1145
+ ____self__143_53 = false
1099
1146
  end
1100
- return ____self__139_56
1147
+ return ____self__143_53
1101
1148
  end,
1102
1149
  set = function(self, providesInvulnerability)
1103
- if not providesInvulnerability and self[139] then
1150
+ if not providesInvulnerability and self[143] then
1104
1151
  self.object:decrementInvulnerabilityCounter()
1105
- self[139] = nil
1106
- elseif providesInvulnerability and not self[139] then
1152
+ self[143] = nil
1153
+ elseif providesInvulnerability and not self[143] then
1107
1154
  self.object:incrementInvulnerabilityCounter()
1108
- self[139] = true
1155
+ self[143] = true
1109
1156
  end
1110
1157
  end
1111
1158
  },
@@ -1116,17 +1163,17 @@ __TS__SetDescriptor(
1116
1163
  "killsOnExpiration",
1117
1164
  {
1118
1165
  get = function(self)
1119
- local ____self__140_57 = self[140]
1120
- if ____self__140_57 == nil then
1121
- ____self__140_57 = false
1166
+ local ____self__144_54 = self[144]
1167
+ if ____self__144_54 == nil then
1168
+ ____self__144_54 = false
1122
1169
  end
1123
- return ____self__140_57
1170
+ return ____self__144_54
1124
1171
  end,
1125
1172
  set = function(self, killsOnExpiration)
1126
- if not killsOnExpiration and self[140] then
1127
- self[140] = nil
1128
- elseif killsOnExpiration and not self[140] then
1129
- self[140] = true
1173
+ if not killsOnExpiration and self[144] then
1174
+ self[144] = nil
1175
+ elseif killsOnExpiration and not self[144] then
1176
+ self[144] = true
1130
1177
  end
1131
1178
  end
1132
1179
  },
@@ -1137,17 +1184,17 @@ __TS__SetDescriptor(
1137
1184
  "explodesOnExpiration",
1138
1185
  {
1139
1186
  get = function(self)
1140
- local ____self__141_58 = self[141]
1141
- if ____self__141_58 == nil then
1142
- ____self__141_58 = false
1187
+ local ____self__145_55 = self[145]
1188
+ if ____self__145_55 == nil then
1189
+ ____self__145_55 = false
1143
1190
  end
1144
- return ____self__141_58
1191
+ return ____self__145_55
1145
1192
  end,
1146
1193
  set = function(self, killsOnExpiration)
1147
- if not killsOnExpiration and self[141] then
1148
- self[141] = nil
1149
- elseif killsOnExpiration and not self[141] then
1150
- self[141] = true
1194
+ if not killsOnExpiration and self[145] then
1195
+ self[145] = nil
1196
+ elseif killsOnExpiration and not self[145] then
1197
+ self[145] = true
1151
1198
  end
1152
1199
  end
1153
1200
  },
@@ -1272,9 +1319,23 @@ __TS__SetDescriptor(
1272
1319
  __TS__SetDescriptor(
1273
1320
  Buff.prototype,
1274
1321
  "duration",
1275
- {get = function(self)
1276
- return self[103]
1277
- end},
1322
+ {
1323
+ get = function(self)
1324
+ return self[103]
1325
+ end,
1326
+ set = function(self, duration)
1327
+ if duration <= 0 then
1328
+ local timer = self._timer
1329
+ if timer ~= nil then
1330
+ timer:destroy()
1331
+ self._timer = nil
1332
+ end
1333
+ self[103] = 0
1334
+ else
1335
+ self.remainingDuration = self.remainingDuration + (duration - self[103])
1336
+ end
1337
+ end
1338
+ },
1278
1339
  true
1279
1340
  )
1280
1341
  __TS__SetDescriptor(
@@ -1282,13 +1343,13 @@ __TS__SetDescriptor(
1282
1343
  "remainingDuration",
1283
1344
  {
1284
1345
  get = function(self)
1285
- local ____opt_59 = self._timer
1286
- return ____opt_59 and ____opt_59.remaining or 0
1346
+ local ____opt_56 = self._timer
1347
+ return ____opt_56 and ____opt_56.remaining or 0
1287
1348
  end,
1288
1349
  set = function(self, remainingDuration)
1289
- local ____remainingDuration_63 = remainingDuration
1290
- local ____opt_61 = self._timer
1291
- local remainingDurationDelta = ____remainingDuration_63 - (____opt_61 and ____opt_61.remaining or 0)
1350
+ local ____remainingDuration_60 = remainingDuration
1351
+ local ____opt_58 = self._timer
1352
+ local remainingDurationDelta = ____remainingDuration_60 - (____opt_58 and ____opt_58.remaining or 0)
1292
1353
  if remainingDurationDelta ~= 0 then
1293
1354
  self[103] = self[103] + remainingDurationDelta
1294
1355
  if remainingDuration <= 0 then
@@ -1303,7 +1364,7 @@ __TS__SetDescriptor(
1303
1364
  remainingDuration,
1304
1365
  self._spellStealPriority,
1305
1366
  self._learnLevelMinimum,
1306
- self[142]
1367
+ self[146]
1307
1368
  ) then
1308
1369
  local timer = self._timer
1309
1370
  if timer == nil then
@@ -1318,15 +1379,80 @@ __TS__SetDescriptor(
1318
1379
  },
1319
1380
  true
1320
1381
  )
1382
+ __TS__SetDescriptor(
1383
+ Buff.prototype,
1384
+ "absorbedDamageFactor",
1385
+ {
1386
+ get = function(self)
1387
+ return self[135] or 1
1388
+ end,
1389
+ set = function(self, absorbedDamageFactor)
1390
+ if absorbedDamageFactor == 1 then
1391
+ self[135] = nil
1392
+ else
1393
+ self[135] = absorbedDamageFactor
1394
+ end
1395
+ end
1396
+ },
1397
+ true
1398
+ )
1399
+ __TS__SetDescriptor(
1400
+ Buff.prototype,
1401
+ "maximumDamageAbsorbed",
1402
+ {
1403
+ get = function(self)
1404
+ return self[136] or 0
1405
+ end,
1406
+ set = function(self, maximumDamageAbsorbed)
1407
+ if maximumDamageAbsorbed == 0 then
1408
+ self[136] = nil
1409
+ else
1410
+ self[136] = maximumDamageAbsorbed
1411
+ end
1412
+ end
1413
+ },
1414
+ true
1415
+ )
1416
+ __TS__SetDescriptor(
1417
+ Buff.prototype,
1418
+ "damageAbsorbed",
1419
+ {get = function(self)
1420
+ return self[137] or 0
1421
+ end},
1422
+ true
1423
+ )
1424
+ __TS__SetDescriptor(
1425
+ Buff.prototype,
1426
+ "destroysOnMaximumDamageAbsorbed",
1427
+ {
1428
+ get = function(self)
1429
+ local ____self__138_61 = self[138]
1430
+ if ____self__138_61 == nil then
1431
+ ____self__138_61 = true
1432
+ end
1433
+ return ____self__138_61
1434
+ end,
1435
+ set = function(self, destroysOnMaximumDamageAbsorbed)
1436
+ local ____destroysOnMaximumDamageAbsorbed_62
1437
+ if destroysOnMaximumDamageAbsorbed then
1438
+ ____destroysOnMaximumDamageAbsorbed_62 = nil
1439
+ else
1440
+ ____destroysOnMaximumDamageAbsorbed_62 = false
1441
+ end
1442
+ self[138] = ____destroysOnMaximumDamageAbsorbed_62
1443
+ end
1444
+ },
1445
+ true
1446
+ )
1321
1447
  __TS__SetDescriptor(
1322
1448
  Buff.prototype,
1323
1449
  "abilityCooldownFactor",
1324
1450
  {
1325
1451
  get = function(self)
1326
- return self[143] or 1
1452
+ return self[147] or 1
1327
1453
  end,
1328
1454
  set = function(self, abilityCooldownFactor)
1329
- local previousAbilityCooldownModifier = self[144]
1455
+ local previousAbilityCooldownModifier = self[148]
1330
1456
  if previousAbilityCooldownModifier then
1331
1457
  for ____, ability in ipairs(self._unit.abilities) do
1332
1458
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
@@ -1338,8 +1464,8 @@ __TS__SetDescriptor(
1338
1464
  for ____, ability in ipairs(self._unit.abilities) do
1339
1465
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1340
1466
  end
1341
- self[144] = modifier
1342
- self[143] = abilityCooldownFactor
1467
+ self[148] = modifier
1468
+ self[147] = abilityCooldownFactor
1343
1469
  end
1344
1470
  },
1345
1471
  true