warscript 0.0.1-dev.f074376 → 0.0.1-dev.f0daa48

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