warscript 0.0.1-dev.db137e7 → 0.0.1-dev.dc37dce

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 (111) hide show
  1. package/attributes.d.ts +1 -0
  2. package/attributes.lua +9 -0
  3. package/binarywriter.lua +0 -12
  4. package/core/types/player.d.ts +16 -0
  5. package/core/types/player.lua +57 -14
  6. package/core/types/sound.lua +1 -1
  7. package/core/types/tileCell.d.ts +2 -1
  8. package/core/types/tileCell.lua +5 -0
  9. package/core/types/timer.d.ts +3 -2
  10. package/core/types/timer.lua +8 -2
  11. package/destroyable.d.ts +1 -0
  12. package/destroyable.lua +9 -0
  13. package/engine/behavior.d.ts +10 -2
  14. package/engine/behavior.lua +157 -76
  15. package/engine/behaviour/ability/apply-buff.lua +4 -4
  16. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  17. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  18. package/engine/behaviour/ability.d.ts +11 -6
  19. package/engine/behaviour/ability.lua +31 -1
  20. package/engine/behaviour/unit/stun-immunity.d.ts +7 -5
  21. package/engine/behaviour/unit/stun-immunity.lua +6 -5
  22. package/engine/behaviour/unit.d.ts +9 -3
  23. package/engine/behaviour/unit.lua +106 -24
  24. package/engine/buff.d.ts +64 -18
  25. package/engine/buff.lua +354 -151
  26. package/engine/internal/item.d.ts +12 -12
  27. package/engine/internal/item.lua +41 -26
  28. package/engine/internal/mechanics/cast-ability.lua +6 -3
  29. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  30. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  31. package/engine/internal/object-data/health-bonus.lua +16 -0
  32. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  33. package/engine/internal/object-data/mana-bonus.lua +16 -0
  34. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  35. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  36. package/engine/internal/unit/ability.d.ts +14 -14
  37. package/engine/internal/unit/ability.lua +72 -45
  38. package/engine/internal/unit/attributes.d.ts +17 -0
  39. package/engine/internal/unit/attributes.lua +46 -0
  40. package/engine/internal/unit/bonus.d.ts +6 -0
  41. package/engine/internal/unit/bonus.lua +33 -3
  42. package/engine/internal/unit/fly-height.d.ts +7 -0
  43. package/engine/internal/unit/fly-height.lua +20 -0
  44. package/engine/internal/unit/interrupts.d.ts +12 -0
  45. package/engine/internal/unit/interrupts.lua +28 -0
  46. package/engine/internal/unit/item.lua +1 -1
  47. package/engine/internal/unit/main-selected.lua +12 -27
  48. package/engine/internal/unit/range-event.d.ts +12 -0
  49. package/engine/internal/unit/range-event.lua +90 -0
  50. package/engine/internal/unit/scale.d.ts +7 -0
  51. package/engine/internal/unit/scale.lua +20 -0
  52. package/engine/internal/unit+bonus.lua +3 -3
  53. package/engine/internal/unit-missile-launch.lua +51 -20
  54. package/engine/internal/unit.d.ts +15 -19
  55. package/engine/internal/unit.lua +160 -183
  56. package/engine/local-client.d.ts +2 -0
  57. package/engine/local-client.lua +30 -0
  58. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  59. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  60. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  61. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  62. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  63. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  64. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  65. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  66. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  67. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  68. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  69. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  70. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  71. package/engine/object-data/entry/ability-type.d.ts +2 -0
  72. package/engine/object-data/entry/ability-type.lua +88 -5
  73. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  74. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  75. package/engine/object-data/entry/destructible-type.lua +155 -0
  76. package/engine/object-data/entry/unit-type.d.ts +4 -0
  77. package/engine/object-data/entry/unit-type.lua +76 -32
  78. package/engine/object-field/unit.d.ts +20 -5
  79. package/engine/object-field/unit.lua +61 -0
  80. package/engine/object-field.d.ts +9 -1
  81. package/engine/object-field.lua +265 -122
  82. package/engine/random.d.ts +1 -0
  83. package/engine/random.lua +8 -0
  84. package/engine/standard/fields/ability.d.ts +2 -2
  85. package/engine/standard/fields/ability.lua +2 -2
  86. package/engine/standard/fields/unit.d.ts +11 -3
  87. package/engine/standard/fields/unit.lua +15 -2
  88. package/engine/synchronization.d.ts +11 -0
  89. package/engine/synchronization.lua +77 -0
  90. package/engine/text-tag.lua +3 -2
  91. package/engine/unit.d.ts +5 -0
  92. package/engine/unit.lua +5 -0
  93. package/lualib_bundle.lua +118 -47
  94. package/net/socket.lua +1 -1
  95. package/objutil/buff.lua +10 -8
  96. package/objutil/object.lua +1 -1
  97. package/operation.lua +23 -17
  98. package/package.json +5 -5
  99. package/patch-lua.lua +15 -0
  100. package/utility/callback-array.d.ts +5 -1
  101. package/utility/callback-array.lua +16 -1
  102. package/utility/linked-map.d.ts +34 -0
  103. package/utility/linked-map.lua +101 -0
  104. package/utility/linked-set.d.ts +3 -1
  105. package/utility/linked-set.lua +40 -1
  106. package/utility/records.lua +20 -1
  107. package/utility/types.d.ts +3 -0
  108. /package/engine/internal/object-data/{armor-increase.d.ts → armor-bonus.d.ts} +0 -0
  109. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  110. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  111. /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,7 +397,7 @@ 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
@@ -454,24 +480,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
454
480
  abilityTypeIds = {}
455
481
  self._abilityTypeIds = abilityTypeIds
456
482
  end
457
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
483
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
484
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
458
485
  local addedAbility = _unit:addAbility(abilityTypeId)
459
486
  if addedAbility ~= nil then
460
487
  _unit:makeAbilityPermanent(abilityTypeId, true)
461
488
  _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
489
+ if abilityParameters.isButtonVisible == false then
490
+ _unit:hideAbility(abilityTypeId, true)
473
491
  end
474
- abilityTypeIds[abilityTypeId] = true
492
+ for ____, field in ipairs(abilityParameters.fields or emptyArray()) do
493
+ field[1]:setValue(
494
+ addedAbility,
495
+ resolveNumberValue(ability, level, field[2])
496
+ )
497
+ end
498
+ abilityTypeIds[#abilityTypeIds + 1] = abilityTypeId
475
499
  end
476
500
  end
477
501
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -483,18 +507,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
483
507
  self._behaviors = behaviors
484
508
  end
485
509
  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
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
493
519
  end
494
520
  end
495
- end
496
- if (next(additionalParameters)) ~= nil then
497
- self.parameters = additionalParameters
521
+ if (next(additionalParameters)) ~= nil then
522
+ self.parameters = additionalParameters
523
+ end
498
524
  end
499
525
  end
500
526
  if duration ~= nil and duration > 0 then
@@ -506,18 +532,48 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
506
532
  self[100] = 1
507
533
  Event.invoke(buffCreatedEvent, self)
508
534
  end
535
+ function Buff.prototype.onAbilityGained(self, ability)
536
+ if __TS__InstanceOf(ability, UnitAbility) then
537
+ local abilityCooldownModifier = self[148]
538
+ if abilityCooldownModifier then
539
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
540
+ end
541
+ end
542
+ end
543
+ function Buff.prototype.onAbilityLost(self, ability)
544
+ if __TS__InstanceOf(ability, UnitAbility) then
545
+ local abilityCooldownModifier = self[148]
546
+ if abilityCooldownModifier then
547
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
548
+ end
549
+ end
550
+ end
509
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)
510
570
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
511
- Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
571
+ Effect:flash(modelPath, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
512
572
  else
513
573
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
514
574
  local ____Effect_40 = Effect
515
575
  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
- )
576
+ local ____array_39 = __TS__SparseArrayNew(modelPath, isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit, attachmentPoint)
521
577
  local ____isWidgetProvided_38
522
578
  if isWidgetProvided then
523
579
  ____isWidgetProvided_38 = yOrParametersOrDuration
@@ -531,26 +587,8 @@ function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrPa
531
587
  )
532
588
  end
533
589
  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
- )
590
+ function Buff.prototype.expire(self)
591
+ expireBuff(self)
554
592
  end
555
593
  function Buff.prototype.onCreate(self)
556
594
  end
@@ -580,23 +618,29 @@ function Buff.prototype.onDestroy(self)
580
618
  behavior:destroy()
581
619
  end
582
620
  end
583
- if self[139] then
621
+ local previousAbilityCooldownModifier = self[148]
622
+ if previousAbilityCooldownModifier then
623
+ for ____, ability in ipairs(self._unit.abilities) do
624
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
625
+ end
626
+ end
627
+ if self[143] then
584
628
  unit:decrementInvulnerabilityCounter()
585
629
  end
586
- if self[138] then
630
+ if self[142] then
587
631
  unit:decrementDisableAutoAttackCounter()
588
632
  end
589
- if self[136] then
590
- if self[137] then
591
- unit:decrementStunCounter()
633
+ if self[140] then
634
+ if self[141] then
635
+ unit:decrementForceStunCounter()
592
636
  end
593
637
  unit:decrementStunCounter()
594
638
  end
595
- if self[135] then
639
+ if self[139] then
596
640
  unit:decrementGhostCounter()
597
641
  end
598
642
  if self._abilityTypeIds ~= nil then
599
- for abilityTypeId in pairs(self._abilityTypeIds) do
643
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
600
644
  unit:removeAbility(abilityTypeId)
601
645
  end
602
646
  end
@@ -629,8 +673,8 @@ function Buff.apply(self, ...)
629
673
  end
630
674
  end
631
675
  function Buff.getByTypeId(self, unit, typeId)
632
- local ____opt_46 = buffByTypeIdByUnit[unit]
633
- local buff = ____opt_46 and ____opt_46[typeId]
676
+ local ____opt_42 = buffByTypeIdByUnit[unit]
677
+ local buff = ____opt_42 and ____opt_42[typeId]
634
678
  if __TS__InstanceOf(buff, self) then
635
679
  return buff
636
680
  end
@@ -644,9 +688,9 @@ function Buff.prototype.onExpiration(self)
644
688
  if self[121] ~= nil then
645
689
  (self[102] or unit):healTarget(unit, self[120] or 0)
646
690
  end
647
- if self[141] then
691
+ if self[145] then
648
692
  unit:explode()
649
- elseif self[140] then
693
+ elseif self[144] then
650
694
  unit:kill()
651
695
  end
652
696
  end
@@ -701,6 +745,18 @@ function Buff.prototype.onDamageDealt(self, target, event)
701
745
  end
702
746
  function Buff.prototype.onDamageReceived(self, source, event)
703
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
704
760
  local damageReceivedEventCount = (self[133] or 0) + 1
705
761
  self[133] = damageReceivedEventCount
706
762
  if damageReceivedEventCount == self[134] then
@@ -788,8 +844,8 @@ __TS__SetDescriptor(
788
844
  return
789
845
  end
790
846
  self[112] = damageInterval
791
- local ____opt_48 = self._timer
792
- 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
793
849
  local timer = self[114]
794
850
  if timer == nil then
795
851
  timer = Timer:create()
@@ -868,8 +924,8 @@ __TS__SetDescriptor(
868
924
  return
869
925
  end
870
926
  self[117] = healingInterval
871
- local ____opt_50 = self._timer
872
- 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
873
929
  local timer = self[119]
874
930
  if timer == nil then
875
931
  timer = Timer:create()
@@ -950,24 +1006,50 @@ __TS__SetDescriptor(
950
1006
  },
951
1007
  true
952
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
+ )
953
1035
  __TS__SetDescriptor(
954
1036
  Buff.prototype,
955
1037
  "turnsIntoGhost",
956
1038
  {
957
1039
  get = function(self)
958
- local ____self__135_52 = self[135]
959
- if ____self__135_52 == nil then
960
- ____self__135_52 = false
1040
+ local ____self__139_49 = self[139]
1041
+ if ____self__139_49 == nil then
1042
+ ____self__139_49 = false
961
1043
  end
962
- return ____self__135_52
1044
+ return ____self__139_49
963
1045
  end,
964
1046
  set = function(self, turnsIntoGhost)
965
- if not turnsIntoGhost and self[135] then
1047
+ if not turnsIntoGhost and self[139] then
966
1048
  self.object:decrementGhostCounter()
967
- self[135] = nil
968
- elseif turnsIntoGhost and not self[135] then
1049
+ self[139] = nil
1050
+ elseif turnsIntoGhost and not self[139] then
969
1051
  self.object:incrementGhostCounter()
970
- self[135] = true
1052
+ self[139] = true
971
1053
  end
972
1054
  end
973
1055
  },
@@ -978,25 +1060,25 @@ __TS__SetDescriptor(
978
1060
  "stuns",
979
1061
  {
980
1062
  get = function(self)
981
- local ____self__136_53 = self[136]
982
- if ____self__136_53 == nil then
983
- ____self__136_53 = false
1063
+ local ____self__140_50 = self[140]
1064
+ if ____self__140_50 == nil then
1065
+ ____self__140_50 = false
984
1066
  end
985
- return ____self__136_53
1067
+ return ____self__140_50
986
1068
  end,
987
1069
  set = function(self, stuns)
988
- if not stuns and self[136] then
989
- if self[137] then
990
- self.object:decrementStunCounter()
1070
+ if not stuns and self[140] then
1071
+ if self[141] then
1072
+ self.object:decrementForceStunCounter()
991
1073
  end
992
1074
  self.object:decrementStunCounter()
993
- self[136] = nil
994
- elseif stuns and not self[136] then
995
- if self[137] then
996
- self.object:incrementStunCounter()
1075
+ self[140] = nil
1076
+ elseif stuns and not self[140] then
1077
+ if self[141] then
1078
+ self.object:incrementForceStunCounter()
997
1079
  end
998
1080
  self.object:incrementStunCounter()
999
- self[136] = true
1081
+ self[140] = true
1000
1082
  end
1001
1083
  end
1002
1084
  },
@@ -1007,23 +1089,23 @@ __TS__SetDescriptor(
1007
1089
  "ignoresStunImmunity",
1008
1090
  {
1009
1091
  get = function(self)
1010
- local ____self__137_54 = self[137]
1011
- if ____self__137_54 == nil then
1012
- ____self__137_54 = false
1092
+ local ____self__141_51 = self[141]
1093
+ if ____self__141_51 == nil then
1094
+ ____self__141_51 = false
1013
1095
  end
1014
- return ____self__137_54
1096
+ return ____self__141_51
1015
1097
  end,
1016
1098
  set = function(self, ignoresStunImmunity)
1017
- if not ignoresStunImmunity and self[137] then
1018
- if self[136] then
1019
- self.object:decrementStunCounter()
1099
+ if not ignoresStunImmunity and self[141] then
1100
+ if self[140] then
1101
+ self.object:decrementForceStunCounter()
1020
1102
  end
1021
- self[137] = nil
1022
- elseif ignoresStunImmunity and not self[137] then
1023
- if self[136] then
1024
- self.object:incrementStunCounter()
1103
+ self[141] = nil
1104
+ elseif ignoresStunImmunity and not self[141] then
1105
+ if self[140] then
1106
+ self.object:incrementForceStunCounter()
1025
1107
  end
1026
- self[137] = true
1108
+ self[141] = true
1027
1109
  end
1028
1110
  end
1029
1111
  },
@@ -1034,19 +1116,19 @@ __TS__SetDescriptor(
1034
1116
  "disablesAutoAttack",
1035
1117
  {
1036
1118
  get = function(self)
1037
- local ____self__138_55 = self[138]
1038
- if ____self__138_55 == nil then
1039
- ____self__138_55 = false
1119
+ local ____self__142_52 = self[142]
1120
+ if ____self__142_52 == nil then
1121
+ ____self__142_52 = false
1040
1122
  end
1041
- return ____self__138_55
1123
+ return ____self__142_52
1042
1124
  end,
1043
1125
  set = function(self, disablesAutoAttack)
1044
- if not disablesAutoAttack and self[138] then
1126
+ if not disablesAutoAttack and self[142] then
1045
1127
  self.object:decrementDisableAutoAttackCounter()
1046
- self[138] = nil
1047
- elseif disablesAutoAttack and not self[138] then
1128
+ self[142] = nil
1129
+ elseif disablesAutoAttack and not self[142] then
1048
1130
  self.object:incrementDisableAutoAttackCounter()
1049
- self[138] = true
1131
+ self[142] = true
1050
1132
  end
1051
1133
  end
1052
1134
  },
@@ -1057,19 +1139,19 @@ __TS__SetDescriptor(
1057
1139
  "providesInvulnerability",
1058
1140
  {
1059
1141
  get = function(self)
1060
- local ____self__139_56 = self[139]
1061
- if ____self__139_56 == nil then
1062
- ____self__139_56 = false
1142
+ local ____self__143_53 = self[143]
1143
+ if ____self__143_53 == nil then
1144
+ ____self__143_53 = false
1063
1145
  end
1064
- return ____self__139_56
1146
+ return ____self__143_53
1065
1147
  end,
1066
1148
  set = function(self, providesInvulnerability)
1067
- if not providesInvulnerability and self[139] then
1149
+ if not providesInvulnerability and self[143] then
1068
1150
  self.object:decrementInvulnerabilityCounter()
1069
- self[139] = nil
1070
- elseif providesInvulnerability and not self[139] then
1151
+ self[143] = nil
1152
+ elseif providesInvulnerability and not self[143] then
1071
1153
  self.object:incrementInvulnerabilityCounter()
1072
- self[139] = true
1154
+ self[143] = true
1073
1155
  end
1074
1156
  end
1075
1157
  },
@@ -1080,17 +1162,17 @@ __TS__SetDescriptor(
1080
1162
  "killsOnExpiration",
1081
1163
  {
1082
1164
  get = function(self)
1083
- local ____self__140_57 = self[140]
1084
- if ____self__140_57 == nil then
1085
- ____self__140_57 = false
1165
+ local ____self__144_54 = self[144]
1166
+ if ____self__144_54 == nil then
1167
+ ____self__144_54 = false
1086
1168
  end
1087
- return ____self__140_57
1169
+ return ____self__144_54
1088
1170
  end,
1089
1171
  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
1172
+ if not killsOnExpiration and self[144] then
1173
+ self[144] = nil
1174
+ elseif killsOnExpiration and not self[144] then
1175
+ self[144] = true
1094
1176
  end
1095
1177
  end
1096
1178
  },
@@ -1101,17 +1183,17 @@ __TS__SetDescriptor(
1101
1183
  "explodesOnExpiration",
1102
1184
  {
1103
1185
  get = function(self)
1104
- local ____self__141_58 = self[141]
1105
- if ____self__141_58 == nil then
1106
- ____self__141_58 = false
1186
+ local ____self__145_55 = self[145]
1187
+ if ____self__145_55 == nil then
1188
+ ____self__145_55 = false
1107
1189
  end
1108
- return ____self__141_58
1190
+ return ____self__145_55
1109
1191
  end,
1110
1192
  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
1193
+ if not killsOnExpiration and self[145] then
1194
+ self[145] = nil
1195
+ elseif killsOnExpiration and not self[145] then
1196
+ self[145] = true
1115
1197
  end
1116
1198
  end
1117
1199
  },
@@ -1220,12 +1302,39 @@ __TS__SetDescriptor(
1220
1302
  },
1221
1303
  true
1222
1304
  )
1305
+ __TS__SetDescriptor(
1306
+ Buff.prototype,
1307
+ "manaRegenerationRateIncreaseFactor",
1308
+ {
1309
+ get = function(self)
1310
+ return self:getUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR)
1311
+ end,
1312
+ set = function(self, manaRegenerationRateIncreaseFactor)
1313
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR, manaRegenerationRateIncreaseFactor)
1314
+ end
1315
+ },
1316
+ true
1317
+ )
1223
1318
  __TS__SetDescriptor(
1224
1319
  Buff.prototype,
1225
1320
  "duration",
1226
- {get = function(self)
1227
- return self[103]
1228
- 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
+ },
1229
1338
  true
1230
1339
  )
1231
1340
  __TS__SetDescriptor(
@@ -1233,13 +1342,13 @@ __TS__SetDescriptor(
1233
1342
  "remainingDuration",
1234
1343
  {
1235
1344
  get = function(self)
1236
- local ____opt_59 = self._timer
1237
- 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
1238
1347
  end,
1239
1348
  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)
1349
+ local ____remainingDuration_60 = remainingDuration
1350
+ local ____opt_58 = self._timer
1351
+ local remainingDurationDelta = ____remainingDuration_60 - (____opt_58 and ____opt_58.remaining or 0)
1243
1352
  if remainingDurationDelta ~= 0 then
1244
1353
  self[103] = self[103] + remainingDurationDelta
1245
1354
  if remainingDuration <= 0 then
@@ -1254,7 +1363,7 @@ __TS__SetDescriptor(
1254
1363
  remainingDuration,
1255
1364
  self._spellStealPriority,
1256
1365
  self._learnLevelMinimum,
1257
- self[142]
1366
+ self[146]
1258
1367
  ) then
1259
1368
  local timer = self._timer
1260
1369
  if timer == nil then
@@ -1269,6 +1378,97 @@ __TS__SetDescriptor(
1269
1378
  },
1270
1379
  true
1271
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
+ )
1446
+ __TS__SetDescriptor(
1447
+ Buff.prototype,
1448
+ "abilityCooldownFactor",
1449
+ {
1450
+ get = function(self)
1451
+ return self[147] or 1
1452
+ end,
1453
+ set = function(self, abilityCooldownFactor)
1454
+ local previousAbilityCooldownModifier = self[148]
1455
+ if previousAbilityCooldownModifier then
1456
+ for ____, ability in ipairs(self._unit.abilities) do
1457
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
1458
+ end
1459
+ end
1460
+ local function modifier(ability, level, cooldown)
1461
+ return cooldown * abilityCooldownFactor
1462
+ end
1463
+ for ____, ability in ipairs(self._unit.abilities) do
1464
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1465
+ end
1466
+ self[148] = modifier
1467
+ self[147] = abilityCooldownFactor
1468
+ end
1469
+ },
1470
+ true
1471
+ )
1272
1472
  Buff.createdEvent = buffCreatedEvent
1273
1473
  Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1274
1474
  (function(self)
@@ -1327,5 +1527,8 @@ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1327
1527
  buffCreatedEvent:addListener(function(buff)
1328
1528
  UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1329
1529
  end)
1530
+ buffBeingDestroyedEvent:addListener(function(buff)
1531
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1532
+ end)
1330
1533
  end)(Buff)
1331
1534
  return ____exports