warscript 0.0.1-dev.f0a9ffe → 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 (132) hide show
  1. package/attributes.d.ts +1 -0
  2. package/attributes.lua +9 -0
  3. package/core/types/frame.lua +24 -21
  4. package/core/types/player.d.ts +16 -0
  5. package/core/types/player.lua +60 -15
  6. package/core/types/playerCamera.d.ts +2 -0
  7. package/core/types/playerCamera.lua +123 -5
  8. package/core/types/sound.lua +1 -1
  9. package/core/types/tileCell.d.ts +11 -1
  10. package/core/types/tileCell.lua +97 -0
  11. package/core/types/timer.d.ts +3 -2
  12. package/core/types/timer.lua +22 -2
  13. package/decl/native.d.ts +2 -2
  14. package/destroyable.d.ts +1 -0
  15. package/destroyable.lua +9 -0
  16. package/engine/behavior.d.ts +12 -1
  17. package/engine/behavior.lua +199 -65
  18. package/engine/behaviour/ability/apply-buff.lua +4 -4
  19. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  20. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  21. package/engine/behaviour/ability.d.ts +11 -6
  22. package/engine/behaviour/ability.lua +31 -1
  23. package/engine/behaviour/unit/stun-immunity.d.ts +9 -5
  24. package/engine/behaviour/unit/stun-immunity.lua +17 -7
  25. package/engine/behaviour/unit.d.ts +15 -5
  26. package/engine/behaviour/unit.lua +126 -22
  27. package/engine/buff.d.ts +64 -21
  28. package/engine/buff.lua +360 -178
  29. package/engine/internal/ability.d.ts +3 -1
  30. package/engine/internal/ability.lua +26 -9
  31. package/engine/internal/item+owner.lua +12 -6
  32. package/engine/internal/item.d.ts +13 -15
  33. package/engine/internal/item.lua +63 -49
  34. package/engine/internal/mechanics/cast-ability.lua +6 -3
  35. package/engine/internal/misc/frame-coordinates.lua +21 -0
  36. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  37. package/engine/internal/misc/get-terrain-z.lua +11 -0
  38. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  39. package/engine/internal/misc/player-local-handle.lua +5 -0
  40. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  41. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  42. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  43. package/engine/internal/object-data/health-bonus.lua +16 -0
  44. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  45. package/engine/internal/object-data/mana-bonus.lua +16 -0
  46. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  47. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  48. package/engine/internal/unit/ability.d.ts +14 -14
  49. package/engine/internal/unit/ability.lua +72 -45
  50. package/engine/internal/unit/attributes.d.ts +17 -0
  51. package/engine/internal/unit/attributes.lua +46 -0
  52. package/engine/internal/unit/bonus.d.ts +6 -0
  53. package/engine/internal/unit/bonus.lua +33 -3
  54. package/engine/internal/unit/fly-height.d.ts +7 -0
  55. package/engine/internal/unit/fly-height.lua +20 -0
  56. package/engine/internal/unit/interrupts.d.ts +12 -0
  57. package/engine/internal/unit/interrupts.lua +28 -0
  58. package/engine/internal/unit/item.lua +1 -1
  59. package/engine/internal/unit/main-selected.lua +12 -27
  60. package/engine/internal/unit/range-event.d.ts +12 -0
  61. package/engine/internal/unit/range-event.lua +90 -0
  62. package/engine/internal/unit/scale.d.ts +7 -0
  63. package/engine/internal/unit/scale.lua +20 -0
  64. package/engine/internal/unit+ability.lua +10 -1
  65. package/engine/internal/unit+bonus.lua +3 -3
  66. package/engine/internal/unit-missile-launch.lua +51 -20
  67. package/engine/internal/unit.d.ts +18 -22
  68. package/engine/internal/unit.lua +179 -200
  69. package/engine/local-client.d.ts +2 -0
  70. package/engine/local-client.lua +30 -0
  71. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  72. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  73. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  74. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  75. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  76. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  77. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  78. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  79. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  80. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  81. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  82. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  83. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  84. package/engine/object-data/entry/ability-type.d.ts +2 -0
  85. package/engine/object-data/entry/ability-type.lua +88 -5
  86. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  87. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  88. package/engine/object-data/entry/destructible-type.lua +155 -0
  89. package/engine/object-data/entry/unit-type.d.ts +4 -0
  90. package/engine/object-data/entry/unit-type.lua +76 -32
  91. package/engine/object-field/ability.d.ts +3 -3
  92. package/engine/object-field/ability.lua +9 -8
  93. package/engine/object-field/unit.d.ts +20 -5
  94. package/engine/object-field/unit.lua +61 -0
  95. package/engine/object-field.d.ts +12 -4
  96. package/engine/object-field.lua +273 -126
  97. package/engine/random.d.ts +10 -0
  98. package/engine/random.lua +21 -0
  99. package/engine/standard/fields/ability.d.ts +2 -2
  100. package/engine/standard/fields/ability.lua +2 -2
  101. package/engine/standard/fields/unit.d.ts +11 -3
  102. package/engine/standard/fields/unit.lua +15 -2
  103. package/engine/synchronization.d.ts +11 -0
  104. package/engine/synchronization.lua +77 -0
  105. package/engine/text-tag.d.ts +1 -1
  106. package/engine/text-tag.lua +92 -17
  107. package/engine/unit.d.ts +5 -0
  108. package/engine/unit.lua +5 -0
  109. package/lualib_bundle.lua +118 -47
  110. package/net/socket.lua +1 -1
  111. package/objutil/buff.lua +10 -8
  112. package/objutil/object.lua +1 -1
  113. package/operation.lua +23 -17
  114. package/package.json +5 -5
  115. package/patch-lua.lua +15 -0
  116. package/patch-lualib.lua +1 -1
  117. package/utility/arrays.d.ts +1 -0
  118. package/utility/arrays.lua +8 -0
  119. package/utility/callback-array.d.ts +17 -0
  120. package/utility/callback-array.lua +61 -0
  121. package/utility/linked-map.d.ts +34 -0
  122. package/utility/linked-map.lua +101 -0
  123. package/utility/linked-set.d.ts +3 -1
  124. package/utility/linked-set.lua +40 -1
  125. package/utility/lua-maps.d.ts +11 -2
  126. package/utility/lua-maps.lua +33 -2
  127. package/utility/records.lua +20 -1
  128. package/utility/types.d.ts +3 -0
  129. /package/engine/internal/{object-data/armor-increase.d.ts → misc/frame-coordinates.d.ts} +0 -0
  130. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  131. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  132. /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
@@ -28,9 +29,6 @@ local ____math = require("math")
28
29
  local max = ____math.max
29
30
  local min = ____math.min
30
31
  local ____bonus = require("engine.internal.unit.bonus")
31
- local addOrUpdateOrRemoveUnitBonus = ____bonus.addOrUpdateOrRemoveUnitBonus
32
- local getUnitBonus = ____bonus.getUnitBonus
33
- local removeUnitBonus = ____bonus.removeUnitBonus
34
32
  local UnitBonusType = ____bonus.UnitBonusType
35
33
  local ____area_2Ddamage = require("engine.internal.mechanics.area-damage")
36
34
  local damageArea = ____area_2Ddamage.damageArea
@@ -44,6 +42,7 @@ local BuffType = ____buff_2Dtype.BuffType
44
42
  local ____unit = require("engine.behaviour.unit")
45
43
  local UnitBehavior = ____unit.UnitBehavior
46
44
  local ____arrays = require("utility.arrays")
45
+ local emptyArray = ____arrays.emptyArray
47
46
  local forEach = ____arrays.forEach
48
47
  local ____event = require("event")
49
48
  local Event = ____event.Event
@@ -53,6 +52,12 @@ local ____item = require("engine.internal.item")
53
52
  local Item = ____item.Item
54
53
  local ____destructable = require("core.types.destructable")
55
54
  local Destructable = ____destructable.Destructable
55
+ local ____ability = require("engine.standard.fields.ability")
56
+ local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
57
+ local ____ability = require("engine.behaviour.ability")
58
+ local AbilityBehavior = ____ability.AbilityBehavior
59
+ local ____records = require("utility.records")
60
+ local sortedKeysUnnested = ____records.sortedKeysUnnested
56
61
  local getUnitAbility = BlzGetUnitAbility
57
62
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
58
63
  local stringValueByBuffTypeIdByFieldId = {}
@@ -98,9 +103,11 @@ local buffParametersKeys = {
98
103
  damageIncrease = true,
99
104
  damageIncreaseFactor = true,
100
105
  armorIncrease = true,
101
- armorIncreaseFactor = true,
106
+ maxHealthIncrease = true,
107
+ maxManaIncrease = true,
102
108
  attackSpeedIncreaseFactor = true,
103
109
  movementSpeedIncreaseFactor = true,
110
+ manaRegenerationRateIncreaseFactor = true,
104
111
  evasionProbability = true,
105
112
  missProbability = true,
106
113
  damageFactor = true,
@@ -120,11 +127,15 @@ local buffParametersKeys = {
120
127
  maximumAutoAttackCount = true,
121
128
  maximumDamageDealtEventCount = true,
122
129
  maximumDamageReceivedEventCount = true,
130
+ absorbedDamageFactor = true,
131
+ maximumDamageAbsorbed = true,
132
+ destroysOnMaximumDamageAbsorbed = true,
123
133
  uniqueGroup = true,
124
134
  damageOnExpiration = true,
125
135
  healingOnExpiration = true,
126
136
  killsOnExpiration = true,
127
- explodesOnExpiration = true
137
+ explodesOnExpiration = true,
138
+ abilityCooldownFactor = true
128
139
  }
129
140
  local function resolveEnumValue(ability, level, value)
130
141
  if value == nil or type(value) == "number" then
@@ -175,6 +186,7 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
175
186
  end
176
187
  end
177
188
  local buffBooleanParameters = {
189
+ "destroysOnMaximumDamageAbsorbed",
178
190
  "turnsIntoGhost",
179
191
  "stuns",
180
192
  "ignoresStunImmunity",
@@ -187,8 +199,11 @@ local buffNumberParameters = {
187
199
  "durationIncreaseOnAutoAttack",
188
200
  "attackSpeedIncreaseFactor",
189
201
  "movementSpeedIncreaseFactor",
202
+ "manaRegenerationRateIncreaseFactor",
190
203
  "evasionProbability",
191
204
  "armorIncrease",
205
+ "maxHealthIncrease",
206
+ "maxManaIncrease",
192
207
  "damageFactor",
193
208
  "receivedDamageFactor",
194
209
  "maximumAutoAttackCount",
@@ -201,7 +216,10 @@ local buffNumberParameters = {
201
216
  "healingPerInterval",
202
217
  "healingOverDuration",
203
218
  "damageOnExpiration",
204
- "healingOnExpiration"
219
+ "healingOnExpiration",
220
+ "absorbedDamageFactor",
221
+ "maximumDamageAbsorbed",
222
+ "abilityCooldownFactor"
205
223
  }
206
224
  local unsuccessfulApplicationMarker = {}
207
225
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -320,33 +338,38 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
320
338
  local polarity
321
339
  local resistanceType
322
340
  local ability
341
+ local abilityBehavior
323
342
  if type(typeIdOrTypeIds) ~= "number" then
324
343
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
325
344
  polarity = resistanceTypeOrPolarity
326
345
  resistanceType = abilityOrParametersOrResistanceType
327
- 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
328
350
  ability = parametersOrAbility
329
- else
330
- ability = nil
351
+ elseif parametersOrAbility ~= nil then
331
352
  parameters = parametersOrAbility
332
353
  end
333
354
  else
334
355
  typeId = typeIdOrTypeIds
335
356
  polarity = polarityOrTypeIdSelectionPolicy
336
357
  resistanceType = resistanceTypeOrPolarity
337
- 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
338
363
  ability = abilityOrParametersOrResistanceType
339
364
  parameters = parametersOrAbility
340
- else
341
- ability = nil
365
+ elseif abilityOrParametersOrResistanceType ~= nil then
342
366
  parameters = abilityOrParametersOrResistanceType
367
+ else
368
+ parameters = parametersOrAbility
343
369
  end
344
370
  end
371
+ self.sourceAbilityBehavior = abilityBehavior
345
372
  self.typeId = typeId
346
- if not (__TS__InstanceOf(ability, Ability) or ability == nil) then
347
- parameters = ability
348
- ability = nil
349
- end
350
373
  local defaultParameters = self.constructor.defaultParameters
351
374
  local level = parameters and parameters.level or defaultParameters.level
352
375
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -374,7 +397,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
374
397
  local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
375
398
  if missProbability ~= nil then
376
399
  missProbability = resolveNumberValue(ability, level, missProbability)
377
- self[142] = missProbability
400
+ self[146] = missProbability
378
401
  end
379
402
  local buffByTypeId = buffByTypeIdByUnit[_unit]
380
403
  if buffByTypeId == nil then
@@ -457,24 +480,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
457
480
  abilityTypeIds = {}
458
481
  self._abilityTypeIds = abilityTypeIds
459
482
  end
460
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
483
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
484
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
461
485
  local addedAbility = _unit:addAbility(abilityTypeId)
462
486
  if addedAbility ~= nil then
463
487
  _unit:makeAbilityPermanent(abilityTypeId, true)
464
488
  _unit:setAbilityLevel(abilityTypeId, 1 + (abilityParameters.level or ability and ability.level or 0))
465
- for abilityParameterKey, abilityParameterValue in pairs(abilityParameters) do
466
- if abilityParameterKey == "isButtonVisible" then
467
- if not resolveBooleanValue(ability, level, abilityParameterValue) then
468
- _unit:hideAbility(abilityTypeId, true)
469
- end
470
- elseif abilityParameterKey ~= "level" then
471
- abilityParameterKey:setValue(
472
- addedAbility,
473
- resolveNumberValue(ability, level, abilityParameterValue)
474
- )
475
- end
489
+ if abilityParameters.isButtonVisible == false then
490
+ _unit:hideAbility(abilityTypeId, true)
476
491
  end
477
- 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
478
499
  end
479
500
  end
480
501
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -486,18 +507,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
486
507
  self._behaviors = behaviors
487
508
  end
488
509
  end
489
- local additionalParameters = {}
490
- for key, value in pairs(parameters) do
491
- if not buffParametersKeys[key] then
492
- if ability then
493
- additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, value)
494
- else
495
- 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
496
519
  end
497
520
  end
498
- end
499
- if (next(additionalParameters)) ~= nil then
500
- self.parameters = additionalParameters
521
+ if (next(additionalParameters)) ~= nil then
522
+ self.parameters = additionalParameters
523
+ end
501
524
  end
502
525
  end
503
526
  if duration ~= nil and duration > 0 then
@@ -509,64 +532,63 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
509
532
  self[100] = 1
510
533
  Event.invoke(buffCreatedEvent, self)
511
534
  end
512
- function Buff.prototype.getUnitBonus(self, bonusType)
513
- local ____opt_38 = self._bonusIdByBonusType
514
- local bonusId = ____opt_38 and ____opt_38[bonusType]
515
- return bonusId == nil and 0 or getUnitBonus(self._unit, bonusType, bonusId)
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
516
542
  end
517
- function Buff.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, value)
518
- local bonusIdByBonusType = self._bonusIdByBonusType
519
- if bonusIdByBonusType == nil then
520
- bonusIdByBonusType = {}
521
- self._bonusIdByBonusType = bonusIdByBonusType
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
522
549
  end
523
- bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self._unit, bonusType, bonusIdByBonusType[bonusType], value)
524
550
  end
525
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)
526
570
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
527
- Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
571
+ Effect:flash(modelPath, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
528
572
  else
529
573
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
530
- local ____Effect_42 = Effect
531
- local ____Effect_flash_43 = Effect.flash
532
- local ____array_41 = __TS__SparseArrayNew(
533
- self[105],
534
- isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
535
- stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
536
- )
537
- local ____isWidgetProvided_40
574
+ local ____Effect_40 = Effect
575
+ local ____Effect_flash_41 = Effect.flash
576
+ local ____array_39 = __TS__SparseArrayNew(modelPath, isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit, attachmentPoint)
577
+ local ____isWidgetProvided_38
538
578
  if isWidgetProvided then
539
- ____isWidgetProvided_40 = yOrParametersOrDuration
579
+ ____isWidgetProvided_38 = yOrParametersOrDuration
540
580
  else
541
- ____isWidgetProvided_40 = widgetOrXOrParametersOrDuration
581
+ ____isWidgetProvided_38 = widgetOrXOrParametersOrDuration
542
582
  end
543
- __TS__SparseArrayPush(____array_41, ____isWidgetProvided_40)
544
- ____Effect_flash_43(
545
- ____Effect_42,
546
- __TS__SparseArraySpread(____array_41)
583
+ __TS__SparseArrayPush(____array_39, ____isWidgetProvided_38)
584
+ ____Effect_flash_41(
585
+ ____Effect_40,
586
+ __TS__SparseArraySpread(____array_39)
547
587
  )
548
588
  end
549
589
  end
550
- function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
551
- local isWidgetProvided = type(widgetOrDuration) == "table"
552
- local ____Effect_46 = Effect
553
- local ____Effect_flash_47 = Effect.flash
554
- local ____array_45 = __TS__SparseArrayNew(
555
- self[106],
556
- isWidgetProvided and widgetOrDuration or self._unit,
557
- stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
558
- )
559
- local ____isWidgetProvided_44
560
- if isWidgetProvided then
561
- ____isWidgetProvided_44 = duration
562
- else
563
- ____isWidgetProvided_44 = widgetOrDuration
564
- end
565
- __TS__SparseArrayPush(____array_45, ____isWidgetProvided_44)
566
- ____Effect_flash_47(
567
- ____Effect_46,
568
- __TS__SparseArraySpread(____array_45)
569
- )
590
+ function Buff.prototype.expire(self)
591
+ expireBuff(self)
570
592
  end
571
593
  function Buff.prototype.onCreate(self)
572
594
  end
@@ -596,31 +618,32 @@ function Buff.prototype.onDestroy(self)
596
618
  behavior:destroy()
597
619
  end
598
620
  end
599
- 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
600
628
  unit:decrementInvulnerabilityCounter()
601
629
  end
602
- if self[138] then
630
+ if self[142] then
603
631
  unit:decrementDisableAutoAttackCounter()
604
632
  end
605
- if self[136] then
606
- if self[137] then
607
- unit:decrementStunCounter()
633
+ if self[140] then
634
+ if self[141] then
635
+ unit:decrementForceStunCounter()
608
636
  end
609
637
  unit:decrementStunCounter()
610
638
  end
611
- if self[135] then
639
+ if self[139] then
612
640
  unit:decrementGhostCounter()
613
641
  end
614
642
  if self._abilityTypeIds ~= nil then
615
- for abilityTypeId in pairs(self._abilityTypeIds) do
643
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
616
644
  unit:removeAbility(abilityTypeId)
617
645
  end
618
646
  end
619
- if self._bonusIdByBonusType ~= nil then
620
- for bonusType, bonusId in pairs(self._bonusIdByBonusType) do
621
- removeUnitBonus(unit, bonusType, bonusId)
622
- end
623
- end
624
647
  Event.invoke(buffBeingDestroyedEvent, self)
625
648
  self[100] = 3
626
649
  return UnitBehavior.prototype.onDestroy(self)
@@ -650,8 +673,8 @@ function Buff.apply(self, ...)
650
673
  end
651
674
  end
652
675
  function Buff.getByTypeId(self, unit, typeId)
653
- local ____opt_48 = buffByTypeIdByUnit[unit]
654
- local buff = ____opt_48 and ____opt_48[typeId]
676
+ local ____opt_42 = buffByTypeIdByUnit[unit]
677
+ local buff = ____opt_42 and ____opt_42[typeId]
655
678
  if __TS__InstanceOf(buff, self) then
656
679
  return buff
657
680
  end
@@ -665,9 +688,9 @@ function Buff.prototype.onExpiration(self)
665
688
  if self[121] ~= nil then
666
689
  (self[102] or unit):healTarget(unit, self[120] or 0)
667
690
  end
668
- if self[141] then
691
+ if self[145] then
669
692
  unit:explode()
670
- elseif self[140] then
693
+ elseif self[144] then
671
694
  unit:kill()
672
695
  end
673
696
  end
@@ -722,6 +745,18 @@ function Buff.prototype.onDamageDealt(self, target, event)
722
745
  end
723
746
  function Buff.prototype.onDamageReceived(self, source, event)
724
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
725
760
  local damageReceivedEventCount = (self[133] or 0) + 1
726
761
  self[133] = damageReceivedEventCount
727
762
  if damageReceivedEventCount == self[134] then
@@ -809,8 +844,8 @@ __TS__SetDescriptor(
809
844
  return
810
845
  end
811
846
  self[112] = damageInterval
812
- local ____opt_50 = self._timer
813
- local elapsed = ____opt_50 and ____opt_50.elapsed or 0
847
+ local ____opt_45 = self._timer
848
+ local elapsed = ____opt_45 and ____opt_45.elapsed or 0
814
849
  local timer = self[114]
815
850
  if timer == nil then
816
851
  timer = Timer:create()
@@ -889,8 +924,8 @@ __TS__SetDescriptor(
889
924
  return
890
925
  end
891
926
  self[117] = healingInterval
892
- local ____opt_52 = self._timer
893
- local elapsed = ____opt_52 and ____opt_52.elapsed or 0
927
+ local ____opt_47 = self._timer
928
+ local elapsed = ____opt_47 and ____opt_47.elapsed or 0
894
929
  local timer = self[119]
895
930
  if timer == nil then
896
931
  timer = Timer:create()
@@ -971,24 +1006,50 @@ __TS__SetDescriptor(
971
1006
  },
972
1007
  true
973
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
+ )
974
1035
  __TS__SetDescriptor(
975
1036
  Buff.prototype,
976
1037
  "turnsIntoGhost",
977
1038
  {
978
1039
  get = function(self)
979
- local ____self__135_54 = self[135]
980
- if ____self__135_54 == nil then
981
- ____self__135_54 = false
1040
+ local ____self__139_49 = self[139]
1041
+ if ____self__139_49 == nil then
1042
+ ____self__139_49 = false
982
1043
  end
983
- return ____self__135_54
1044
+ return ____self__139_49
984
1045
  end,
985
1046
  set = function(self, turnsIntoGhost)
986
- if not turnsIntoGhost and self[135] then
1047
+ if not turnsIntoGhost and self[139] then
987
1048
  self.object:decrementGhostCounter()
988
- self[135] = nil
989
- elseif turnsIntoGhost and not self[135] then
1049
+ self[139] = nil
1050
+ elseif turnsIntoGhost and not self[139] then
990
1051
  self.object:incrementGhostCounter()
991
- self[135] = true
1052
+ self[139] = true
992
1053
  end
993
1054
  end
994
1055
  },
@@ -999,25 +1060,25 @@ __TS__SetDescriptor(
999
1060
  "stuns",
1000
1061
  {
1001
1062
  get = function(self)
1002
- local ____self__136_55 = self[136]
1003
- if ____self__136_55 == nil then
1004
- ____self__136_55 = false
1063
+ local ____self__140_50 = self[140]
1064
+ if ____self__140_50 == nil then
1065
+ ____self__140_50 = false
1005
1066
  end
1006
- return ____self__136_55
1067
+ return ____self__140_50
1007
1068
  end,
1008
1069
  set = function(self, stuns)
1009
- if not stuns and self[136] then
1010
- if self[137] then
1011
- self.object:decrementStunCounter()
1070
+ if not stuns and self[140] then
1071
+ if self[141] then
1072
+ self.object:decrementForceStunCounter()
1012
1073
  end
1013
1074
  self.object:decrementStunCounter()
1014
- self[136] = nil
1015
- elseif stuns and not self[136] then
1016
- if self[137] then
1017
- self.object:incrementStunCounter()
1075
+ self[140] = nil
1076
+ elseif stuns and not self[140] then
1077
+ if self[141] then
1078
+ self.object:incrementForceStunCounter()
1018
1079
  end
1019
1080
  self.object:incrementStunCounter()
1020
- self[136] = true
1081
+ self[140] = true
1021
1082
  end
1022
1083
  end
1023
1084
  },
@@ -1028,23 +1089,23 @@ __TS__SetDescriptor(
1028
1089
  "ignoresStunImmunity",
1029
1090
  {
1030
1091
  get = function(self)
1031
- local ____self__137_56 = self[137]
1032
- if ____self__137_56 == nil then
1033
- ____self__137_56 = false
1092
+ local ____self__141_51 = self[141]
1093
+ if ____self__141_51 == nil then
1094
+ ____self__141_51 = false
1034
1095
  end
1035
- return ____self__137_56
1096
+ return ____self__141_51
1036
1097
  end,
1037
1098
  set = function(self, ignoresStunImmunity)
1038
- if not ignoresStunImmunity and self[137] then
1039
- if self[136] then
1040
- self.object:decrementStunCounter()
1099
+ if not ignoresStunImmunity and self[141] then
1100
+ if self[140] then
1101
+ self.object:decrementForceStunCounter()
1041
1102
  end
1042
- self[137] = nil
1043
- elseif ignoresStunImmunity and not self[137] then
1044
- if self[136] then
1045
- self.object:incrementStunCounter()
1103
+ self[141] = nil
1104
+ elseif ignoresStunImmunity and not self[141] then
1105
+ if self[140] then
1106
+ self.object:incrementForceStunCounter()
1046
1107
  end
1047
- self[137] = true
1108
+ self[141] = true
1048
1109
  end
1049
1110
  end
1050
1111
  },
@@ -1055,19 +1116,19 @@ __TS__SetDescriptor(
1055
1116
  "disablesAutoAttack",
1056
1117
  {
1057
1118
  get = function(self)
1058
- local ____self__138_57 = self[138]
1059
- if ____self__138_57 == nil then
1060
- ____self__138_57 = false
1119
+ local ____self__142_52 = self[142]
1120
+ if ____self__142_52 == nil then
1121
+ ____self__142_52 = false
1061
1122
  end
1062
- return ____self__138_57
1123
+ return ____self__142_52
1063
1124
  end,
1064
1125
  set = function(self, disablesAutoAttack)
1065
- if not disablesAutoAttack and self[138] then
1126
+ if not disablesAutoAttack and self[142] then
1066
1127
  self.object:decrementDisableAutoAttackCounter()
1067
- self[138] = nil
1068
- elseif disablesAutoAttack and not self[138] then
1128
+ self[142] = nil
1129
+ elseif disablesAutoAttack and not self[142] then
1069
1130
  self.object:incrementDisableAutoAttackCounter()
1070
- self[138] = true
1131
+ self[142] = true
1071
1132
  end
1072
1133
  end
1073
1134
  },
@@ -1078,19 +1139,19 @@ __TS__SetDescriptor(
1078
1139
  "providesInvulnerability",
1079
1140
  {
1080
1141
  get = function(self)
1081
- local ____self__139_58 = self[139]
1082
- if ____self__139_58 == nil then
1083
- ____self__139_58 = false
1142
+ local ____self__143_53 = self[143]
1143
+ if ____self__143_53 == nil then
1144
+ ____self__143_53 = false
1084
1145
  end
1085
- return ____self__139_58
1146
+ return ____self__143_53
1086
1147
  end,
1087
1148
  set = function(self, providesInvulnerability)
1088
- if not providesInvulnerability and self[139] then
1149
+ if not providesInvulnerability and self[143] then
1089
1150
  self.object:decrementInvulnerabilityCounter()
1090
- self[139] = nil
1091
- elseif providesInvulnerability and not self[139] then
1151
+ self[143] = nil
1152
+ elseif providesInvulnerability and not self[143] then
1092
1153
  self.object:incrementInvulnerabilityCounter()
1093
- self[139] = true
1154
+ self[143] = true
1094
1155
  end
1095
1156
  end
1096
1157
  },
@@ -1101,17 +1162,17 @@ __TS__SetDescriptor(
1101
1162
  "killsOnExpiration",
1102
1163
  {
1103
1164
  get = function(self)
1104
- local ____self__140_59 = self[140]
1105
- if ____self__140_59 == nil then
1106
- ____self__140_59 = false
1165
+ local ____self__144_54 = self[144]
1166
+ if ____self__144_54 == nil then
1167
+ ____self__144_54 = false
1107
1168
  end
1108
- return ____self__140_59
1169
+ return ____self__144_54
1109
1170
  end,
1110
1171
  set = function(self, killsOnExpiration)
1111
- if not killsOnExpiration and self[140] then
1112
- self[140] = nil
1113
- elseif killsOnExpiration and not self[140] then
1114
- 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
1115
1176
  end
1116
1177
  end
1117
1178
  },
@@ -1122,17 +1183,17 @@ __TS__SetDescriptor(
1122
1183
  "explodesOnExpiration",
1123
1184
  {
1124
1185
  get = function(self)
1125
- local ____self__141_60 = self[141]
1126
- if ____self__141_60 == nil then
1127
- ____self__141_60 = false
1186
+ local ____self__145_55 = self[145]
1187
+ if ____self__145_55 == nil then
1188
+ ____self__145_55 = false
1128
1189
  end
1129
- return ____self__141_60
1190
+ return ____self__145_55
1130
1191
  end,
1131
1192
  set = function(self, killsOnExpiration)
1132
- if not killsOnExpiration and self[141] then
1133
- self[141] = nil
1134
- elseif killsOnExpiration and not self[141] then
1135
- 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
1136
1197
  end
1137
1198
  end
1138
1199
  },
@@ -1241,12 +1302,39 @@ __TS__SetDescriptor(
1241
1302
  },
1242
1303
  true
1243
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
+ )
1244
1318
  __TS__SetDescriptor(
1245
1319
  Buff.prototype,
1246
1320
  "duration",
1247
- {get = function(self)
1248
- return self[103]
1249
- 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
+ },
1250
1338
  true
1251
1339
  )
1252
1340
  __TS__SetDescriptor(
@@ -1254,13 +1342,13 @@ __TS__SetDescriptor(
1254
1342
  "remainingDuration",
1255
1343
  {
1256
1344
  get = function(self)
1257
- local ____opt_61 = self._timer
1258
- return ____opt_61 and ____opt_61.remaining or 0
1345
+ local ____opt_56 = self._timer
1346
+ return ____opt_56 and ____opt_56.remaining or 0
1259
1347
  end,
1260
1348
  set = function(self, remainingDuration)
1261
- local ____remainingDuration_65 = remainingDuration
1262
- local ____opt_63 = self._timer
1263
- local remainingDurationDelta = ____remainingDuration_65 - (____opt_63 and ____opt_63.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)
1264
1352
  if remainingDurationDelta ~= 0 then
1265
1353
  self[103] = self[103] + remainingDurationDelta
1266
1354
  if remainingDuration <= 0 then
@@ -1275,7 +1363,7 @@ __TS__SetDescriptor(
1275
1363
  remainingDuration,
1276
1364
  self._spellStealPriority,
1277
1365
  self._learnLevelMinimum,
1278
- self[142]
1366
+ self[146]
1279
1367
  ) then
1280
1368
  local timer = self._timer
1281
1369
  if timer == nil then
@@ -1290,6 +1378,97 @@ __TS__SetDescriptor(
1290
1378
  },
1291
1379
  true
1292
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
+ )
1293
1472
  Buff.createdEvent = buffCreatedEvent
1294
1473
  Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1295
1474
  (function(self)
@@ -1348,5 +1527,8 @@ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1348
1527
  buffCreatedEvent:addListener(function(buff)
1349
1528
  UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1350
1529
  end)
1530
+ buffBeingDestroyedEvent:addListener(function(buff)
1531
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1532
+ end)
1351
1533
  end)(Buff)
1352
1534
  return ____exports