warscript 0.0.1-dev.eda504c → 0.0.1-dev.edf7fad

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 (104) hide show
  1. package/core/types/frame.lua +47 -1
  2. package/core/types/player.d.ts +16 -0
  3. package/core/types/player.lua +57 -14
  4. package/core/types/sound.lua +1 -1
  5. package/core/types/tileCell.d.ts +2 -1
  6. package/core/types/tileCell.lua +5 -0
  7. package/destroyable.d.ts +1 -0
  8. package/destroyable.lua +9 -0
  9. package/engine/behavior.d.ts +10 -2
  10. package/engine/behavior.lua +157 -76
  11. package/engine/behaviour/ability/apply-buff.lua +4 -4
  12. package/engine/behaviour/ability/damage.d.ts +3 -0
  13. package/engine/behaviour/ability/damage.lua +8 -2
  14. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  15. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  16. package/engine/behaviour/ability.d.ts +11 -6
  17. package/engine/behaviour/ability.lua +31 -1
  18. package/engine/behaviour/unit/stun-immunity.d.ts +7 -5
  19. package/engine/behaviour/unit/stun-immunity.lua +6 -5
  20. package/engine/behaviour/unit.d.ts +7 -3
  21. package/engine/behaviour/unit.lua +101 -24
  22. package/engine/buff.d.ts +65 -18
  23. package/engine/buff.lua +356 -152
  24. package/engine/internal/mechanics/cast-ability.lua +6 -3
  25. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  26. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  27. package/engine/internal/object-data/health-bonus.lua +16 -0
  28. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  29. package/engine/internal/object-data/mana-bonus.lua +16 -0
  30. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  31. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  32. package/engine/internal/unit/attributes.d.ts +17 -0
  33. package/engine/internal/unit/attributes.lua +46 -0
  34. package/engine/internal/unit/bonus.d.ts +6 -0
  35. package/engine/internal/unit/bonus.lua +33 -3
  36. package/engine/internal/unit/fly-height.d.ts +7 -0
  37. package/engine/internal/unit/fly-height.lua +20 -0
  38. package/engine/internal/unit/interrupts.d.ts +12 -0
  39. package/engine/internal/unit/interrupts.lua +28 -0
  40. package/engine/internal/unit/main-selected.lua +12 -27
  41. package/engine/internal/unit/range-event.d.ts +12 -0
  42. package/engine/internal/unit/range-event.lua +90 -0
  43. package/engine/internal/unit/scale.d.ts +7 -0
  44. package/engine/internal/unit/scale.lua +20 -0
  45. package/engine/internal/unit+bonus.lua +3 -3
  46. package/engine/internal/unit-missile-launch.lua +16 -6
  47. package/engine/internal/unit.d.ts +13 -19
  48. package/engine/internal/unit.lua +140 -173
  49. package/engine/local-client.d.ts +7 -0
  50. package/engine/local-client.lua +79 -1
  51. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  52. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  53. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  54. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  55. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  56. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  57. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  58. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  59. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  60. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  61. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  62. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  63. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  64. package/engine/object-data/entry/ability-type.d.ts +2 -0
  65. package/engine/object-data/entry/ability-type.lua +84 -4
  66. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  67. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  68. package/engine/object-data/entry/destructible-type.lua +155 -0
  69. package/engine/object-data/entry/unit-type.d.ts +4 -0
  70. package/engine/object-data/entry/unit-type.lua +76 -32
  71. package/engine/object-field/ability.lua +2 -2
  72. package/engine/object-field/unit.d.ts +20 -5
  73. package/engine/object-field/unit.lua +61 -0
  74. package/engine/object-field.d.ts +10 -2
  75. package/engine/object-field.lua +268 -123
  76. package/engine/random.d.ts +1 -0
  77. package/engine/random.lua +8 -0
  78. package/engine/standard/fields/ability.d.ts +2 -2
  79. package/engine/standard/fields/ability.lua +2 -2
  80. package/engine/standard/fields/unit.d.ts +11 -3
  81. package/engine/standard/fields/unit.lua +15 -2
  82. package/engine/synchronization.d.ts +11 -0
  83. package/engine/synchronization.lua +77 -0
  84. package/engine/text-tag.lua +2 -1
  85. package/engine/unit.d.ts +5 -0
  86. package/engine/unit.lua +5 -0
  87. package/lualib_bundle.lua +1 -1
  88. package/math.d.ts +2 -0
  89. package/math.lua +14 -0
  90. package/net/socket.lua +1 -1
  91. package/objutil/buff.lua +9 -7
  92. package/objutil/object.lua +1 -1
  93. package/operation.lua +1 -4
  94. package/package.json +5 -5
  95. package/patch-lua.lua +15 -0
  96. package/utility/linked-map.d.ts +34 -0
  97. package/utility/linked-map.lua +101 -0
  98. package/utility/linked-set.d.ts +3 -1
  99. package/utility/linked-set.lua +38 -0
  100. package/utility/records.lua +20 -1
  101. /package/engine/internal/object-data/{armor-increase.d.ts → armor-bonus.d.ts} +0 -0
  102. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  103. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  104. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
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
@@ -41,6 +42,7 @@ local BuffType = ____buff_2Dtype.BuffType
41
42
  local ____unit = require("engine.behaviour.unit")
42
43
  local UnitBehavior = ____unit.UnitBehavior
43
44
  local ____arrays = require("utility.arrays")
45
+ local emptyArray = ____arrays.emptyArray
44
46
  local forEach = ____arrays.forEach
45
47
  local ____event = require("event")
46
48
  local Event = ____event.Event
@@ -50,6 +52,12 @@ local ____item = require("engine.internal.item")
50
52
  local Item = ____item.Item
51
53
  local ____destructable = require("core.types.destructable")
52
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
53
61
  local getUnitAbility = BlzGetUnitAbility
54
62
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
55
63
  local stringValueByBuffTypeIdByFieldId = {}
@@ -95,9 +103,11 @@ local buffParametersKeys = {
95
103
  damageIncrease = true,
96
104
  damageIncreaseFactor = true,
97
105
  armorIncrease = true,
98
- armorIncreaseFactor = true,
106
+ maxHealthIncrease = true,
107
+ maxManaIncrease = true,
99
108
  attackSpeedIncreaseFactor = true,
100
109
  movementSpeedIncreaseFactor = true,
110
+ manaRegenerationRateIncreaseFactor = true,
101
111
  evasionProbability = true,
102
112
  missProbability = true,
103
113
  damageFactor = true,
@@ -117,11 +127,15 @@ local buffParametersKeys = {
117
127
  maximumAutoAttackCount = true,
118
128
  maximumDamageDealtEventCount = true,
119
129
  maximumDamageReceivedEventCount = true,
130
+ absorbedDamageFactor = true,
131
+ maximumDamageAbsorbed = true,
132
+ destroysOnMaximumDamageAbsorbed = true,
120
133
  uniqueGroup = true,
121
134
  damageOnExpiration = true,
122
135
  healingOnExpiration = true,
123
136
  killsOnExpiration = true,
124
- explodesOnExpiration = true
137
+ explodesOnExpiration = true,
138
+ abilityCooldownFactor = true
125
139
  }
126
140
  local function resolveEnumValue(ability, level, value)
127
141
  if value == nil or type(value) == "number" then
@@ -172,6 +186,7 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
172
186
  end
173
187
  end
174
188
  local buffBooleanParameters = {
189
+ "destroysOnMaximumDamageAbsorbed",
175
190
  "turnsIntoGhost",
176
191
  "stuns",
177
192
  "ignoresStunImmunity",
@@ -184,8 +199,11 @@ local buffNumberParameters = {
184
199
  "durationIncreaseOnAutoAttack",
185
200
  "attackSpeedIncreaseFactor",
186
201
  "movementSpeedIncreaseFactor",
202
+ "manaRegenerationRateIncreaseFactor",
187
203
  "evasionProbability",
188
204
  "armorIncrease",
205
+ "maxHealthIncrease",
206
+ "maxManaIncrease",
189
207
  "damageFactor",
190
208
  "receivedDamageFactor",
191
209
  "maximumAutoAttackCount",
@@ -198,7 +216,10 @@ local buffNumberParameters = {
198
216
  "healingPerInterval",
199
217
  "healingOverDuration",
200
218
  "damageOnExpiration",
201
- "healingOnExpiration"
219
+ "healingOnExpiration",
220
+ "absorbedDamageFactor",
221
+ "maximumDamageAbsorbed",
222
+ "abilityCooldownFactor"
202
223
  }
203
224
  local unsuccessfulApplicationMarker = {}
204
225
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -317,33 +338,38 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
317
338
  local polarity
318
339
  local resistanceType
319
340
  local ability
341
+ local abilityBehavior
320
342
  if type(typeIdOrTypeIds) ~= "number" then
321
343
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
322
344
  polarity = resistanceTypeOrPolarity
323
345
  resistanceType = abilityOrParametersOrResistanceType
324
- if __TS__InstanceOf(parametersOrAbility, Ability) or parametersOrAbility == nil then
346
+ if __TS__InstanceOf(parametersOrAbility, AbilityBehavior) then
347
+ abilityBehavior = parametersOrAbility
348
+ ability = abilityBehavior.ability
349
+ elseif __TS__InstanceOf(parametersOrAbility, Ability) then
325
350
  ability = parametersOrAbility
326
- else
327
- ability = nil
351
+ elseif parametersOrAbility ~= nil then
328
352
  parameters = parametersOrAbility
329
353
  end
330
354
  else
331
355
  typeId = typeIdOrTypeIds
332
356
  polarity = polarityOrTypeIdSelectionPolicy
333
357
  resistanceType = resistanceTypeOrPolarity
334
- if __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) or abilityOrParametersOrResistanceType == nil then
358
+ if __TS__InstanceOf(abilityOrParametersOrResistanceType, AbilityBehavior) then
359
+ abilityBehavior = abilityOrParametersOrResistanceType
360
+ ability = abilityBehavior.ability
361
+ parameters = parametersOrAbility
362
+ elseif __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
335
363
  ability = abilityOrParametersOrResistanceType
336
364
  parameters = parametersOrAbility
337
- else
338
- ability = nil
365
+ elseif abilityOrParametersOrResistanceType ~= nil then
339
366
  parameters = abilityOrParametersOrResistanceType
367
+ else
368
+ parameters = parametersOrAbility
340
369
  end
341
370
  end
371
+ self.sourceAbilityBehavior = abilityBehavior
342
372
  self.typeId = typeId
343
- if not (__TS__InstanceOf(ability, Ability) or ability == nil) then
344
- parameters = ability
345
- ability = nil
346
- end
347
373
  local defaultParameters = self.constructor.defaultParameters
348
374
  local level = parameters and parameters.level or defaultParameters.level
349
375
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -371,14 +397,15 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
371
397
  local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
372
398
  if missProbability ~= nil then
373
399
  missProbability = resolveNumberValue(ability, level, missProbability)
374
- self[142] = missProbability
400
+ self[146] = missProbability
375
401
  end
376
402
  local buffByTypeId = buffByTypeIdByUnit[_unit]
377
403
  if buffByTypeId == nil then
378
404
  buffByTypeId = {}
379
405
  buffByTypeIdByUnit[_unit] = buffByTypeId
380
406
  end
381
- local ____opt_15 = buffByTypeId[typeId]
407
+ self.previousBuff = buffByTypeId[typeId]
408
+ local ____opt_15 = self.previousBuff
382
409
  if ____opt_15 ~= nil then
383
410
  ____opt_15:destroy()
384
411
  end
@@ -454,24 +481,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
454
481
  abilityTypeIds = {}
455
482
  self._abilityTypeIds = abilityTypeIds
456
483
  end
457
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
484
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
485
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
458
486
  local addedAbility = _unit:addAbility(abilityTypeId)
459
487
  if addedAbility ~= nil then
460
488
  _unit:makeAbilityPermanent(abilityTypeId, true)
461
489
  _unit:setAbilityLevel(abilityTypeId, 1 + (abilityParameters.level or ability and ability.level or 0))
462
- for abilityParameterKey, abilityParameterValue in pairs(abilityParameters) do
463
- if abilityParameterKey == "isButtonVisible" then
464
- if not resolveBooleanValue(ability, level, abilityParameterValue) then
465
- _unit:hideAbility(abilityTypeId, true)
466
- end
467
- elseif abilityParameterKey ~= "level" then
468
- abilityParameterKey:setValue(
469
- addedAbility,
470
- resolveNumberValue(ability, level, abilityParameterValue)
471
- )
472
- end
490
+ if abilityParameters.isButtonVisible == false then
491
+ _unit:hideAbility(abilityTypeId, true)
473
492
  end
474
- abilityTypeIds[abilityTypeId] = true
493
+ for ____, field in ipairs(abilityParameters.fields or emptyArray()) do
494
+ field[1]:setValue(
495
+ addedAbility,
496
+ resolveNumberValue(ability, level, field[2])
497
+ )
498
+ end
499
+ abilityTypeIds[#abilityTypeIds + 1] = abilityTypeId
475
500
  end
476
501
  end
477
502
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -483,18 +508,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
483
508
  self._behaviors = behaviors
484
509
  end
485
510
  end
486
- local additionalParameters = {}
487
- for key, value in pairs(parameters) do
488
- if not buffParametersKeys[key] then
489
- if ability then
490
- additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, value)
491
- else
492
- additionalParameters[key] = value
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
493
520
  end
494
521
  end
495
- end
496
- if (next(additionalParameters)) ~= nil then
497
- self.parameters = additionalParameters
522
+ if (next(additionalParameters)) ~= nil then
523
+ self.parameters = additionalParameters
524
+ end
498
525
  end
499
526
  end
500
527
  if duration ~= nil and duration > 0 then
@@ -506,18 +533,48 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
506
533
  self[100] = 1
507
534
  Event.invoke(buffCreatedEvent, self)
508
535
  end
536
+ function Buff.prototype.onAbilityGained(self, ability)
537
+ if __TS__InstanceOf(ability, UnitAbility) then
538
+ local abilityCooldownModifier = self[148]
539
+ if abilityCooldownModifier then
540
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
541
+ end
542
+ end
543
+ end
544
+ function Buff.prototype.onAbilityLost(self, ability)
545
+ if __TS__InstanceOf(ability, UnitAbility) then
546
+ local abilityCooldownModifier = self[148]
547
+ if abilityCooldownModifier then
548
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
549
+ end
550
+ end
551
+ end
509
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)
510
571
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
511
- Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
572
+ Effect:flash(modelPath, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
512
573
  else
513
574
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
514
575
  local ____Effect_40 = Effect
515
576
  local ____Effect_flash_41 = Effect.flash
516
- local ____array_39 = __TS__SparseArrayNew(
517
- self[105],
518
- isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
519
- stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
520
- )
577
+ local ____array_39 = __TS__SparseArrayNew(modelPath, isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit, attachmentPoint)
521
578
  local ____isWidgetProvided_38
522
579
  if isWidgetProvided then
523
580
  ____isWidgetProvided_38 = yOrParametersOrDuration
@@ -531,26 +588,8 @@ function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrPa
531
588
  )
532
589
  end
533
590
  end
534
- function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
535
- local isWidgetProvided = type(widgetOrDuration) == "table"
536
- local ____Effect_44 = Effect
537
- local ____Effect_flash_45 = Effect.flash
538
- local ____array_43 = __TS__SparseArrayNew(
539
- self[106],
540
- isWidgetProvided and widgetOrDuration or self._unit,
541
- stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
542
- )
543
- local ____isWidgetProvided_42
544
- if isWidgetProvided then
545
- ____isWidgetProvided_42 = duration
546
- else
547
- ____isWidgetProvided_42 = widgetOrDuration
548
- end
549
- __TS__SparseArrayPush(____array_43, ____isWidgetProvided_42)
550
- ____Effect_flash_45(
551
- ____Effect_44,
552
- __TS__SparseArraySpread(____array_43)
553
- )
591
+ function Buff.prototype.expire(self)
592
+ expireBuff(self)
554
593
  end
555
594
  function Buff.prototype.onCreate(self)
556
595
  end
@@ -580,23 +619,29 @@ function Buff.prototype.onDestroy(self)
580
619
  behavior:destroy()
581
620
  end
582
621
  end
583
- if self[139] then
622
+ local previousAbilityCooldownModifier = self[148]
623
+ if previousAbilityCooldownModifier then
624
+ for ____, ability in ipairs(self._unit.abilities) do
625
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
626
+ end
627
+ end
628
+ if self[143] then
584
629
  unit:decrementInvulnerabilityCounter()
585
630
  end
586
- if self[138] then
631
+ if self[142] then
587
632
  unit:decrementDisableAutoAttackCounter()
588
633
  end
589
- if self[136] then
590
- if self[137] then
591
- unit:decrementStunCounter()
634
+ if self[140] then
635
+ if self[141] then
636
+ unit:decrementForceStunCounter()
592
637
  end
593
638
  unit:decrementStunCounter()
594
639
  end
595
- if self[135] then
640
+ if self[139] then
596
641
  unit:decrementGhostCounter()
597
642
  end
598
643
  if self._abilityTypeIds ~= nil then
599
- for abilityTypeId in pairs(self._abilityTypeIds) do
644
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
600
645
  unit:removeAbility(abilityTypeId)
601
646
  end
602
647
  end
@@ -629,8 +674,8 @@ function Buff.apply(self, ...)
629
674
  end
630
675
  end
631
676
  function Buff.getByTypeId(self, unit, typeId)
632
- local ____opt_46 = buffByTypeIdByUnit[unit]
633
- local buff = ____opt_46 and ____opt_46[typeId]
677
+ local ____opt_42 = buffByTypeIdByUnit[unit]
678
+ local buff = ____opt_42 and ____opt_42[typeId]
634
679
  if __TS__InstanceOf(buff, self) then
635
680
  return buff
636
681
  end
@@ -644,9 +689,9 @@ function Buff.prototype.onExpiration(self)
644
689
  if self[121] ~= nil then
645
690
  (self[102] or unit):healTarget(unit, self[120] or 0)
646
691
  end
647
- if self[141] then
692
+ if self[145] then
648
693
  unit:explode()
649
- elseif self[140] then
694
+ elseif self[144] then
650
695
  unit:kill()
651
696
  end
652
697
  end
@@ -701,6 +746,18 @@ function Buff.prototype.onDamageDealt(self, target, event)
701
746
  end
702
747
  function Buff.prototype.onDamageReceived(self, source, event)
703
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
704
761
  local damageReceivedEventCount = (self[133] or 0) + 1
705
762
  self[133] = damageReceivedEventCount
706
763
  if damageReceivedEventCount == self[134] then
@@ -788,8 +845,8 @@ __TS__SetDescriptor(
788
845
  return
789
846
  end
790
847
  self[112] = damageInterval
791
- local ____opt_48 = self._timer
792
- 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
793
850
  local timer = self[114]
794
851
  if timer == nil then
795
852
  timer = Timer:create()
@@ -868,8 +925,8 @@ __TS__SetDescriptor(
868
925
  return
869
926
  end
870
927
  self[117] = healingInterval
871
- local ____opt_50 = self._timer
872
- 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
873
930
  local timer = self[119]
874
931
  if timer == nil then
875
932
  timer = Timer:create()
@@ -950,24 +1007,50 @@ __TS__SetDescriptor(
950
1007
  },
951
1008
  true
952
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
+ )
953
1036
  __TS__SetDescriptor(
954
1037
  Buff.prototype,
955
1038
  "turnsIntoGhost",
956
1039
  {
957
1040
  get = function(self)
958
- local ____self__135_52 = self[135]
959
- if ____self__135_52 == nil then
960
- ____self__135_52 = false
1041
+ local ____self__139_49 = self[139]
1042
+ if ____self__139_49 == nil then
1043
+ ____self__139_49 = false
961
1044
  end
962
- return ____self__135_52
1045
+ return ____self__139_49
963
1046
  end,
964
1047
  set = function(self, turnsIntoGhost)
965
- if not turnsIntoGhost and self[135] then
1048
+ if not turnsIntoGhost and self[139] then
966
1049
  self.object:decrementGhostCounter()
967
- self[135] = nil
968
- elseif turnsIntoGhost and not self[135] then
1050
+ self[139] = nil
1051
+ elseif turnsIntoGhost and not self[139] then
969
1052
  self.object:incrementGhostCounter()
970
- self[135] = true
1053
+ self[139] = true
971
1054
  end
972
1055
  end
973
1056
  },
@@ -978,25 +1061,25 @@ __TS__SetDescriptor(
978
1061
  "stuns",
979
1062
  {
980
1063
  get = function(self)
981
- local ____self__136_53 = self[136]
982
- if ____self__136_53 == nil then
983
- ____self__136_53 = false
1064
+ local ____self__140_50 = self[140]
1065
+ if ____self__140_50 == nil then
1066
+ ____self__140_50 = false
984
1067
  end
985
- return ____self__136_53
1068
+ return ____self__140_50
986
1069
  end,
987
1070
  set = function(self, stuns)
988
- if not stuns and self[136] then
989
- if self[137] then
990
- self.object:decrementStunCounter()
1071
+ if not stuns and self[140] then
1072
+ if self[141] then
1073
+ self.object:decrementForceStunCounter()
991
1074
  end
992
1075
  self.object:decrementStunCounter()
993
- self[136] = nil
994
- elseif stuns and not self[136] then
995
- if self[137] then
996
- self.object:incrementStunCounter()
1076
+ self[140] = nil
1077
+ elseif stuns and not self[140] then
1078
+ if self[141] then
1079
+ self.object:incrementForceStunCounter()
997
1080
  end
998
1081
  self.object:incrementStunCounter()
999
- self[136] = true
1082
+ self[140] = true
1000
1083
  end
1001
1084
  end
1002
1085
  },
@@ -1007,23 +1090,23 @@ __TS__SetDescriptor(
1007
1090
  "ignoresStunImmunity",
1008
1091
  {
1009
1092
  get = function(self)
1010
- local ____self__137_54 = self[137]
1011
- if ____self__137_54 == nil then
1012
- ____self__137_54 = false
1093
+ local ____self__141_51 = self[141]
1094
+ if ____self__141_51 == nil then
1095
+ ____self__141_51 = false
1013
1096
  end
1014
- return ____self__137_54
1097
+ return ____self__141_51
1015
1098
  end,
1016
1099
  set = function(self, ignoresStunImmunity)
1017
- if not ignoresStunImmunity and self[137] then
1018
- if self[136] then
1019
- self.object:decrementStunCounter()
1100
+ if not ignoresStunImmunity and self[141] then
1101
+ if self[140] then
1102
+ self.object:decrementForceStunCounter()
1020
1103
  end
1021
- self[137] = nil
1022
- elseif ignoresStunImmunity and not self[137] then
1023
- if self[136] then
1024
- self.object:incrementStunCounter()
1104
+ self[141] = nil
1105
+ elseif ignoresStunImmunity and not self[141] then
1106
+ if self[140] then
1107
+ self.object:incrementForceStunCounter()
1025
1108
  end
1026
- self[137] = true
1109
+ self[141] = true
1027
1110
  end
1028
1111
  end
1029
1112
  },
@@ -1034,19 +1117,19 @@ __TS__SetDescriptor(
1034
1117
  "disablesAutoAttack",
1035
1118
  {
1036
1119
  get = function(self)
1037
- local ____self__138_55 = self[138]
1038
- if ____self__138_55 == nil then
1039
- ____self__138_55 = false
1120
+ local ____self__142_52 = self[142]
1121
+ if ____self__142_52 == nil then
1122
+ ____self__142_52 = false
1040
1123
  end
1041
- return ____self__138_55
1124
+ return ____self__142_52
1042
1125
  end,
1043
1126
  set = function(self, disablesAutoAttack)
1044
- if not disablesAutoAttack and self[138] then
1127
+ if not disablesAutoAttack and self[142] then
1045
1128
  self.object:decrementDisableAutoAttackCounter()
1046
- self[138] = nil
1047
- elseif disablesAutoAttack and not self[138] then
1129
+ self[142] = nil
1130
+ elseif disablesAutoAttack and not self[142] then
1048
1131
  self.object:incrementDisableAutoAttackCounter()
1049
- self[138] = true
1132
+ self[142] = true
1050
1133
  end
1051
1134
  end
1052
1135
  },
@@ -1057,19 +1140,19 @@ __TS__SetDescriptor(
1057
1140
  "providesInvulnerability",
1058
1141
  {
1059
1142
  get = function(self)
1060
- local ____self__139_56 = self[139]
1061
- if ____self__139_56 == nil then
1062
- ____self__139_56 = false
1143
+ local ____self__143_53 = self[143]
1144
+ if ____self__143_53 == nil then
1145
+ ____self__143_53 = false
1063
1146
  end
1064
- return ____self__139_56
1147
+ return ____self__143_53
1065
1148
  end,
1066
1149
  set = function(self, providesInvulnerability)
1067
- if not providesInvulnerability and self[139] then
1150
+ if not providesInvulnerability and self[143] then
1068
1151
  self.object:decrementInvulnerabilityCounter()
1069
- self[139] = nil
1070
- elseif providesInvulnerability and not self[139] then
1152
+ self[143] = nil
1153
+ elseif providesInvulnerability and not self[143] then
1071
1154
  self.object:incrementInvulnerabilityCounter()
1072
- self[139] = true
1155
+ self[143] = true
1073
1156
  end
1074
1157
  end
1075
1158
  },
@@ -1080,17 +1163,17 @@ __TS__SetDescriptor(
1080
1163
  "killsOnExpiration",
1081
1164
  {
1082
1165
  get = function(self)
1083
- local ____self__140_57 = self[140]
1084
- if ____self__140_57 == nil then
1085
- ____self__140_57 = false
1166
+ local ____self__144_54 = self[144]
1167
+ if ____self__144_54 == nil then
1168
+ ____self__144_54 = false
1086
1169
  end
1087
- return ____self__140_57
1170
+ return ____self__144_54
1088
1171
  end,
1089
1172
  set = function(self, killsOnExpiration)
1090
- if not killsOnExpiration and self[140] then
1091
- self[140] = nil
1092
- elseif killsOnExpiration and not self[140] then
1093
- 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
1094
1177
  end
1095
1178
  end
1096
1179
  },
@@ -1101,17 +1184,17 @@ __TS__SetDescriptor(
1101
1184
  "explodesOnExpiration",
1102
1185
  {
1103
1186
  get = function(self)
1104
- local ____self__141_58 = self[141]
1105
- if ____self__141_58 == nil then
1106
- ____self__141_58 = false
1187
+ local ____self__145_55 = self[145]
1188
+ if ____self__145_55 == nil then
1189
+ ____self__145_55 = false
1107
1190
  end
1108
- return ____self__141_58
1191
+ return ____self__145_55
1109
1192
  end,
1110
1193
  set = function(self, killsOnExpiration)
1111
- if not killsOnExpiration and self[141] then
1112
- self[141] = nil
1113
- elseif killsOnExpiration and not self[141] then
1114
- 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
1115
1198
  end
1116
1199
  end
1117
1200
  },
@@ -1220,12 +1303,39 @@ __TS__SetDescriptor(
1220
1303
  },
1221
1304
  true
1222
1305
  )
1306
+ __TS__SetDescriptor(
1307
+ Buff.prototype,
1308
+ "manaRegenerationRateIncreaseFactor",
1309
+ {
1310
+ get = function(self)
1311
+ return self:getUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR)
1312
+ end,
1313
+ set = function(self, manaRegenerationRateIncreaseFactor)
1314
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR, manaRegenerationRateIncreaseFactor)
1315
+ end
1316
+ },
1317
+ true
1318
+ )
1223
1319
  __TS__SetDescriptor(
1224
1320
  Buff.prototype,
1225
1321
  "duration",
1226
- {get = function(self)
1227
- return self[103]
1228
- 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
+ },
1229
1339
  true
1230
1340
  )
1231
1341
  __TS__SetDescriptor(
@@ -1233,13 +1343,13 @@ __TS__SetDescriptor(
1233
1343
  "remainingDuration",
1234
1344
  {
1235
1345
  get = function(self)
1236
- local ____opt_59 = self._timer
1237
- 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
1238
1348
  end,
1239
1349
  set = function(self, remainingDuration)
1240
- local ____remainingDuration_63 = remainingDuration
1241
- local ____opt_61 = self._timer
1242
- 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)
1243
1353
  if remainingDurationDelta ~= 0 then
1244
1354
  self[103] = self[103] + remainingDurationDelta
1245
1355
  if remainingDuration <= 0 then
@@ -1254,7 +1364,7 @@ __TS__SetDescriptor(
1254
1364
  remainingDuration,
1255
1365
  self._spellStealPriority,
1256
1366
  self._learnLevelMinimum,
1257
- self[142]
1367
+ self[146]
1258
1368
  ) then
1259
1369
  local timer = self._timer
1260
1370
  if timer == nil then
@@ -1269,6 +1379,97 @@ __TS__SetDescriptor(
1269
1379
  },
1270
1380
  true
1271
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
+ )
1447
+ __TS__SetDescriptor(
1448
+ Buff.prototype,
1449
+ "abilityCooldownFactor",
1450
+ {
1451
+ get = function(self)
1452
+ return self[147] or 1
1453
+ end,
1454
+ set = function(self, abilityCooldownFactor)
1455
+ local previousAbilityCooldownModifier = self[148]
1456
+ if previousAbilityCooldownModifier then
1457
+ for ____, ability in ipairs(self._unit.abilities) do
1458
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
1459
+ end
1460
+ end
1461
+ local function modifier(ability, level, cooldown)
1462
+ return cooldown * abilityCooldownFactor
1463
+ end
1464
+ for ____, ability in ipairs(self._unit.abilities) do
1465
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1466
+ end
1467
+ self[148] = modifier
1468
+ self[147] = abilityCooldownFactor
1469
+ end
1470
+ },
1471
+ true
1472
+ )
1272
1473
  Buff.createdEvent = buffCreatedEvent
1273
1474
  Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1274
1475
  (function(self)
@@ -1327,5 +1528,8 @@ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1327
1528
  buffCreatedEvent:addListener(function(buff)
1328
1529
  UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1329
1530
  end)
1531
+ buffBeingDestroyedEvent:addListener(function(buff)
1532
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1533
+ end)
1330
1534
  end)(Buff)
1331
1535
  return ____exports