warscript 0.0.1-dev.91a4dce → 0.0.1-dev.91da42b

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 (54) hide show
  1. package/core/types/player.d.ts +2 -1
  2. package/core/types/player.lua +24 -12
  3. package/core/types/tileCell.d.ts +2 -1
  4. package/core/types/tileCell.lua +5 -0
  5. package/destroyable.d.ts +1 -0
  6. package/destroyable.lua +9 -0
  7. package/engine/behavior.d.ts +10 -2
  8. package/engine/behavior.lua +157 -76
  9. package/engine/behaviour/ability/apply-buff.lua +4 -4
  10. package/engine/behaviour/ability.d.ts +2 -1
  11. package/engine/behaviour/ability.lua +2 -1
  12. package/engine/behaviour/unit/stun-immunity.d.ts +6 -4
  13. package/engine/behaviour/unit/stun-immunity.lua +1 -1
  14. package/engine/behaviour/unit.d.ts +7 -3
  15. package/engine/behaviour/unit.lua +89 -22
  16. package/engine/buff.d.ts +15 -2
  17. package/engine/buff.lua +95 -17
  18. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  19. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  20. package/engine/internal/unit/attributes.d.ts +17 -0
  21. package/engine/internal/unit/attributes.lua +46 -0
  22. package/engine/internal/unit/bonus.d.ts +2 -0
  23. package/engine/internal/unit/bonus.lua +10 -0
  24. package/engine/internal/unit/fly-height.d.ts +7 -0
  25. package/engine/internal/unit/fly-height.lua +20 -0
  26. package/engine/internal/unit/interrupts.d.ts +12 -0
  27. package/engine/internal/unit/interrupts.lua +28 -0
  28. package/engine/internal/unit/scale.d.ts +7 -0
  29. package/engine/internal/unit/scale.lua +20 -0
  30. package/engine/internal/unit-missile-launch.lua +16 -6
  31. package/engine/internal/unit.d.ts +12 -18
  32. package/engine/internal/unit.lua +68 -116
  33. package/engine/local-client.d.ts +2 -0
  34. package/engine/local-client.lua +30 -0
  35. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  36. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  37. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  38. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  39. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  40. package/engine/object-data/entry/destructible-type.lua +155 -0
  41. package/engine/object-data/entry/unit-type.d.ts +4 -0
  42. package/engine/object-data/entry/unit-type.lua +76 -32
  43. package/engine/object-field/unit.d.ts +20 -5
  44. package/engine/object-field/unit.lua +61 -0
  45. package/engine/object-field.d.ts +9 -1
  46. package/engine/object-field.lua +265 -122
  47. package/engine/standard/fields/ability.d.ts +2 -2
  48. package/engine/standard/fields/ability.lua +2 -2
  49. package/engine/standard/fields/unit.d.ts +11 -3
  50. package/engine/standard/fields/unit.lua +15 -2
  51. package/engine/text-tag.lua +2 -1
  52. package/engine/unit.d.ts +4 -0
  53. package/engine/unit.lua +4 -0
  54. package/package.json +2 -2
@@ -1,11 +1,11 @@
1
1
  /** @noSelfInFile */
2
- import { Behavior } from "../behavior";
2
+ import { Behavior, BehaviorPriority } from "../behavior";
3
3
  import { Ability } from "../internal/ability";
4
4
  import { DamageEvent, DamagingEvent, Unit } from "../internal/unit";
5
5
  import "../internal/unit+ability";
6
6
  import "../internal/unit-missile-launch";
7
7
  import { Item } from "../internal/item";
8
- import type { AbilityBehavior } from "./ability";
8
+ import { AbilityBehavior } from "./ability";
9
9
  import { Event } from "../../event";
10
10
  import { Destructor } from "../../destroyable";
11
11
  import type { Widget } from "../../core/types/widget";
@@ -13,15 +13,17 @@ import { Destructable } from "../../core/types/destructable";
13
13
  import type { Buff } from "../buff";
14
14
  import { UnitBonusType } from "../internal/unit/bonus";
15
15
  import { Player } from "../../core/types/player";
16
+ import { UnitTypeId } from "../object-data/entry/unit-type";
16
17
  export type UnitBehaviorConstructor<Args extends any[]> = new (unit: Unit, ...args: Args) => UnitBehavior;
17
18
  export declare abstract class UnitBehavior<PeriodicActionParameters extends any[] = any[]> extends Behavior<Unit, PeriodicActionParameters> {
18
19
  readonly sourceAbilityBehavior?: AbilityBehavior;
19
20
  private _bonusIdByBonusType?;
20
- constructor(unit: Unit);
21
+ constructor(unit: Unit, priority?: BehaviorPriority);
21
22
  protected onDestroy(): Destructor;
22
23
  get unit(): Unit;
23
24
  protected getUnitBonus(bonusType: UnitBonusType): number;
24
25
  protected addOrUpdateOrRemoveUnitBonus(bonusType: UnitBonusType, value: number): void;
26
+ protected registerOwningPlayerEvent<T extends string, Args extends any[]>(this: UnitBehavior<PeriodicActionParameters> & Record<T, (this: this, ...args: Args) => unknown>, event: Event<[...Args]>, extractPlayer: (...args: Args) => Player | undefined, listener: T): void;
25
27
  protected registerInRangeUnitEvent<T extends string, Args extends any[]>(this: UnitBehavior<PeriodicActionParameters> & Record<T, (this: this, ...args: Args) => unknown>, event: Event<[...Args]>, extractUnit: (...args: Args) => Unit | undefined, range: number, listener: T): void;
26
28
  onImmediateOrder(orderId: number): void;
27
29
  onTargetOrder(orderId: number, target: Widget): void;
@@ -49,6 +51,7 @@ export declare abstract class UnitBehavior<PeriodicActionParameters extends any[
49
51
  onTargetingAbilityChannelingStart(ability: Ability, source: Unit): void;
50
52
  onTargetingAbilityImpact(ability: Ability, source: Unit): void;
51
53
  onBuffGained(buff: Buff): void;
54
+ onBuffLost(buff: Buff): void;
52
55
  onItemDropped(item: Item): void;
53
56
  onItemPickedUp(item: Item): void;
54
57
  onItemUsed(item: Item): void;
@@ -57,4 +60,5 @@ export declare abstract class UnitBehavior<PeriodicActionParameters extends any[
57
60
  onKill(target: Unit): void;
58
61
  onDeath(source: Unit | undefined): void;
59
62
  onOwnerChange(previousOwner: Player): void;
63
+ static bindUnitType<Args extends any[]>(this: UnitBehaviorConstructor<Args>, unitTypeId: UnitTypeId, ...args: Args): void;
60
64
  }
@@ -22,35 +22,53 @@ local addOrUpdateOrRemoveUnitBonus = ____bonus.addOrUpdateOrRemoveUnitBonus
22
22
  local getUnitBonus = ____bonus.getUnitBonus
23
23
  local removeUnitBonus = ____bonus.removeUnitBonus
24
24
  local safeCall = warpack.safeCall
25
- local behaviorsByEvent = {}
26
- local rangeByBehaviorByEvent = {}
27
- local listenerByBehaviorByEvent = {}
28
- local eventsByBehavior = {}
25
+ local createBehaviorFunctionsByUnitTypeId = {}
26
+ local behaviorsByOwningPlayerEvent = {}
27
+ local listenerByBehaviorByOwningPlayerEvent = {}
28
+ local owningPlayerEventsByBehavior = {}
29
+ local behaviorsByInRangeUnitEvent = {}
30
+ local rangeByBehaviorByInRangeUnitEvent = {}
31
+ local listenerByBehaviorByInRangeUnitEvent = {}
32
+ local inRangeUnitEventsByBehavior = {}
29
33
  ____exports.UnitBehavior = __TS__Class()
30
34
  local UnitBehavior = ____exports.UnitBehavior
31
35
  UnitBehavior.name = "UnitBehavior"
32
36
  __TS__ClassExtends(UnitBehavior, Behavior)
33
- function UnitBehavior.prototype.____constructor(self, unit)
34
- Behavior.prototype.____constructor(self, unit)
37
+ function UnitBehavior.prototype.____constructor(self, unit, priority)
38
+ Behavior.prototype.____constructor(self, unit, priority)
35
39
  end
36
40
  function UnitBehavior.prototype.onDestroy(self)
37
- local events = eventsByBehavior[self]
38
- if events ~= nil then
39
- for event in pairs(events) do
40
- local ____opt_0 = behaviorsByEvent[event]
41
+ local owningPlayerEvents = owningPlayerEventsByBehavior[self]
42
+ if owningPlayerEvents ~= nil then
43
+ for event in pairs(owningPlayerEvents) do
44
+ local ____opt_0 = behaviorsByOwningPlayerEvent[event]
41
45
  if ____opt_0 ~= nil then
42
46
  ____opt_0:remove(self)
43
47
  end
44
- local ____opt_2 = rangeByBehaviorByEvent[event]
48
+ local ____opt_2 = listenerByBehaviorByOwningPlayerEvent[event]
45
49
  if ____opt_2 ~= nil then
46
50
  ____opt_2[self] = nil
47
51
  end
48
- local ____opt_4 = listenerByBehaviorByEvent[event]
52
+ end
53
+ owningPlayerEventsByBehavior[self] = nil
54
+ end
55
+ local inRangeUnitEvents = inRangeUnitEventsByBehavior[self]
56
+ if inRangeUnitEvents ~= nil then
57
+ for event in pairs(inRangeUnitEvents) do
58
+ local ____opt_4 = behaviorsByInRangeUnitEvent[event]
49
59
  if ____opt_4 ~= nil then
50
- ____opt_4[self] = nil
60
+ ____opt_4:remove(self)
61
+ end
62
+ local ____opt_6 = rangeByBehaviorByInRangeUnitEvent[event]
63
+ if ____opt_6 ~= nil then
64
+ ____opt_6[self] = nil
65
+ end
66
+ local ____opt_8 = listenerByBehaviorByInRangeUnitEvent[event]
67
+ if ____opt_8 ~= nil then
68
+ ____opt_8[self] = nil
51
69
  end
52
70
  end
53
- eventsByBehavior[self] = nil
71
+ inRangeUnitEventsByBehavior[self] = nil
54
72
  end
55
73
  if self._bonusIdByBonusType ~= nil then
56
74
  for bonusType, bonusId in pairs(self._bonusIdByBonusType) do
@@ -60,8 +78,8 @@ function UnitBehavior.prototype.onDestroy(self)
60
78
  return Behavior.prototype.onDestroy(self)
61
79
  end
62
80
  function UnitBehavior.prototype.getUnitBonus(self, bonusType)
63
- local ____opt_6 = self._bonusIdByBonusType
64
- local bonusId = ____opt_6 and ____opt_6[bonusType]
81
+ local ____opt_10 = self._bonusIdByBonusType
82
+ local bonusId = ____opt_10 and ____opt_10[bonusType]
65
83
  return bonusId == nil and 0 or getUnitBonus(self.object, bonusType, bonusId)
66
84
  end
67
85
  function UnitBehavior.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, value)
@@ -72,16 +90,40 @@ function UnitBehavior.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, va
72
90
  end
73
91
  bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self.object, bonusType, bonusIdByBonusType[bonusType], value)
74
92
  end
93
+ function UnitBehavior.prototype.registerOwningPlayerEvent(self, event, extractPlayer, listener)
94
+ local listenerByBehavior = getOrPut(listenerByBehaviorByOwningPlayerEvent, event, mutableLuaMap)
95
+ listenerByBehavior[self] = listener
96
+ getOrPut(inRangeUnitEventsByBehavior, self, mutableLuaSet)[event] = true
97
+ local behaviors = behaviorsByOwningPlayerEvent[event]
98
+ if behaviors == nil then
99
+ event:addListener(function(...)
100
+ local behaviors = behaviorsByOwningPlayerEvent[event]
101
+ if behaviors ~= nil then
102
+ local player = extractPlayer(...)
103
+ if player ~= nil then
104
+ for behavior in pairs(behaviors) do
105
+ if behavior.unit.owner == player then
106
+ safeCall(behavior[listenerByBehavior[behavior]], behavior, ...)
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end)
112
+ behaviors = __TS__New(LinkedSet)
113
+ behaviorsByOwningPlayerEvent[event] = behaviors
114
+ end
115
+ behaviors:add(self)
116
+ end
75
117
  function UnitBehavior.prototype.registerInRangeUnitEvent(self, event, extractUnit, range, listener)
76
- local rangeByBehavior = getOrPut(rangeByBehaviorByEvent, event, mutableLuaMap)
118
+ local rangeByBehavior = getOrPut(rangeByBehaviorByInRangeUnitEvent, event, mutableLuaMap)
77
119
  rangeByBehavior[self] = range
78
- local listenerByBehavior = getOrPut(listenerByBehaviorByEvent, event, mutableLuaMap)
120
+ local listenerByBehavior = getOrPut(listenerByBehaviorByInRangeUnitEvent, event, mutableLuaMap)
79
121
  listenerByBehavior[self] = listener
80
- getOrPut(eventsByBehavior, self, mutableLuaSet)[event] = true
81
- local behaviors = behaviorsByEvent[event]
122
+ getOrPut(inRangeUnitEventsByBehavior, self, mutableLuaSet)[event] = true
123
+ local behaviors = behaviorsByInRangeUnitEvent[event]
82
124
  if behaviors == nil then
83
125
  event:addListener(function(...)
84
- local behaviors = behaviorsByEvent[event]
126
+ local behaviors = behaviorsByInRangeUnitEvent[event]
85
127
  if behaviors ~= nil then
86
128
  local unit = extractUnit(...)
87
129
  if unit ~= nil then
@@ -95,7 +137,7 @@ function UnitBehavior.prototype.registerInRangeUnitEvent(self, event, extractUni
95
137
  end
96
138
  end)
97
139
  behaviors = __TS__New(LinkedSet)
98
- behaviorsByEvent[event] = behaviors
140
+ behaviorsByInRangeUnitEvent[event] = behaviors
99
141
  end
100
142
  behaviors:add(self)
101
143
  end
@@ -151,6 +193,8 @@ function UnitBehavior.prototype.onTargetingAbilityImpact(self, ability, source)
151
193
  end
152
194
  function UnitBehavior.prototype.onBuffGained(self, buff)
153
195
  end
196
+ function UnitBehavior.prototype.onBuffLost(self, buff)
197
+ end
154
198
  function UnitBehavior.prototype.onItemDropped(self, item)
155
199
  end
156
200
  function UnitBehavior.prototype.onItemPickedUp(self, item)
@@ -167,6 +211,21 @@ function UnitBehavior.prototype.onDeath(self, source)
167
211
  end
168
212
  function UnitBehavior.prototype.onOwnerChange(self, previousOwner)
169
213
  end
214
+ function UnitBehavior.bindUnitType(self, unitTypeId, ...)
215
+ local args = {...}
216
+ local createBehaviorFunctions = createBehaviorFunctionsByUnitTypeId[unitTypeId]
217
+ if createBehaviorFunctions == nil then
218
+ createBehaviorFunctions = {}
219
+ createBehaviorFunctionsByUnitTypeId[unitTypeId] = createBehaviorFunctions
220
+ end
221
+ createBehaviorFunctions[#createBehaviorFunctions + 1] = function(unit)
222
+ return __TS__New(
223
+ self,
224
+ unit,
225
+ table.unpack(args)
226
+ )
227
+ end
228
+ end
170
229
  __TS__SetDescriptor(
171
230
  UnitBehavior.prototype,
172
231
  "unit",
@@ -282,6 +341,14 @@ __TS__SetDescriptor(
282
341
  ____exports.UnitBehavior:forAll(unit, "onOwnerChange", previousOwner)
283
342
  end)
284
343
  end)(UnitBehavior)
344
+ Unit.onCreate:addListener(function(unit)
345
+ local createBehaviorFunctions = createBehaviorFunctionsByUnitTypeId[unit.typeId]
346
+ if createBehaviorFunctions ~= nil then
347
+ for ____, createBehavior in ipairs(createBehaviorFunctions) do
348
+ createBehavior(unit)
349
+ end
350
+ end
351
+ end)
285
352
  Unit.destroyEvent:addListener(function(unit)
286
353
  ____exports.UnitBehavior:forAll(unit, "destroy")
287
354
  end)
package/engine/buff.d.ts CHANGED
@@ -13,6 +13,7 @@ import { UnitBehavior } from "./behaviour/unit";
13
13
  import type { Widget } from "../core/types/widget";
14
14
  import { Destructor } from "../destroyable";
15
15
  import { Event } from "../event";
16
+ import { AbilityBehavior } from "./behaviour/ability";
16
17
  export type BuffConstructor<T extends Buff<any> = Buff<any>, Args extends any[] = any> = OmitConstructor<typeof Buff<any>> & (new (...args: Args) => T);
17
18
  type EnumParameterValueType<T extends number> = T | AbilityEnumLevelField<T>;
18
19
  type NumberParameterValueType = number | AbilityNumberField | AbilityNumberLevelField;
@@ -56,6 +57,7 @@ export type BuffParameters<T extends Buff<any> = Buff> = Buff extends T ? {
56
57
  armorIncreaseFactor?: NumberParameterValueType;
57
58
  attackSpeedIncreaseFactor?: NumberParameterValueType;
58
59
  movementSpeedIncreaseFactor?: NumberParameterValueType;
60
+ manaRegenerationRateIncreaseFactor?: NumberParameterValueType;
59
61
  evasionProbability?: NumberParameterValueType;
60
62
  missProbability?: NumberParameterValueType;
61
63
  damageFactor?: NumberParameterValueType;
@@ -79,6 +81,7 @@ export type BuffParameters<T extends Buff<any> = Buff> = Buff extends T ? {
79
81
  healingOnExpiration?: NumberParameterValueType;
80
82
  killsOnExpiration?: BooleanParameterValueType;
81
83
  explodesOnExpiration?: BooleanParameterValueType;
84
+ abilityCooldownFactor?: NumberParameterValueType;
82
85
  uniqueGroup?: BuffUniqueGroup;
83
86
  } : BuffParameters & (T extends Buff<infer AdditionalParameters> ? AdditionalParameters : object);
84
87
  declare const enum BuffPropertyKey {
@@ -124,7 +127,9 @@ declare const enum BuffPropertyKey {
124
127
  PROVIDES_INVULNERABILITY = 139,
125
128
  KILLS_ON_EXPIRATION = 140,
126
129
  EXPLODES_ON_EXPIRATION = 141,
127
- MISS_PROBABILITY = 142
130
+ MISS_PROBABILITY = 142,
131
+ ABILITY_COOLDOWN_FACTOR = 143,
132
+ ABILITY_COOLDOWN_MODIFIER = 144
128
133
  }
129
134
  export declare const enum BuffTypeIdSelectionPolicy {
130
135
  LEAST_DURATION = 0
@@ -138,7 +143,7 @@ export type BuffConstructorParameters<AdditionalParameters extends BuffAdditiona
138
143
  polarity: BuffPolarityParameterType,
139
144
  resistanceType: BuffResistanceTypeParameterType,
140
145
  ...abilityOrParameters: [
141
- ability?: Ability,
146
+ ability?: Ability | AbilityBehavior,
142
147
  parameters?: BuffParameters & Omit<AdditionalParameters, keyof BuffParameters>
143
148
  ] | [parameters?: BuffParameters & Omit<AdditionalParameters, keyof BuffParameters>]
144
149
  ];
@@ -187,6 +192,8 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
187
192
  private [BuffPropertyKey.PROVIDES_INVULNERABILITY]?;
188
193
  private [BuffPropertyKey.KILLS_ON_EXPIRATION]?;
189
194
  private [BuffPropertyKey.EXPLODES_ON_EXPIRATION]?;
195
+ private [BuffPropertyKey.ABILITY_COOLDOWN_FACTOR]?;
196
+ private [BuffPropertyKey.ABILITY_COOLDOWN_MODIFIER]?;
190
197
  protected static readonly defaultParameters: BuffParameters;
191
198
  get source(): Unit;
192
199
  readonly typeId: ApplicableBuffTypeId;
@@ -259,9 +266,15 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
259
266
  set movementSpeedIncreaseFactor(movementSpeedIncreaseFactor: number);
260
267
  get evasionProbability(): number;
261
268
  set evasionProbability(evasionProbability: number);
269
+ get manaRegenerationRateIncreaseFactor(): number;
270
+ set manaRegenerationRateIncreaseFactor(manaRegenerationRateIncreaseFactor: number);
262
271
  get duration(): number;
263
272
  get remainingDuration(): number;
264
273
  set remainingDuration(remainingDuration: number);
274
+ get abilityCooldownFactor(): number;
275
+ set abilityCooldownFactor(abilityCooldownFactor: number);
276
+ onAbilityGained(ability: Ability): void;
277
+ onAbilityLost(ability: Ability): void;
265
278
  flashEffect(...parameters: [
266
279
  ...widgetOrXY: [] | [Widget] | [x: number, x: number],
267
280
  ...parametersOrDuration: [] | [EffectParameters] | [number]
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
@@ -50,6 +51,10 @@ local ____item = require("engine.internal.item")
50
51
  local Item = ____item.Item
51
52
  local ____destructable = require("core.types.destructable")
52
53
  local Destructable = ____destructable.Destructable
54
+ local ____ability = require("engine.standard.fields.ability")
55
+ local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
56
+ local ____ability = require("engine.behaviour.ability")
57
+ local AbilityBehavior = ____ability.AbilityBehavior
53
58
  local getUnitAbility = BlzGetUnitAbility
54
59
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
55
60
  local stringValueByBuffTypeIdByFieldId = {}
@@ -98,6 +103,7 @@ local buffParametersKeys = {
98
103
  armorIncreaseFactor = true,
99
104
  attackSpeedIncreaseFactor = true,
100
105
  movementSpeedIncreaseFactor = true,
106
+ manaRegenerationRateIncreaseFactor = true,
101
107
  evasionProbability = true,
102
108
  missProbability = true,
103
109
  damageFactor = true,
@@ -121,7 +127,8 @@ local buffParametersKeys = {
121
127
  damageOnExpiration = true,
122
128
  healingOnExpiration = true,
123
129
  killsOnExpiration = true,
124
- explodesOnExpiration = true
130
+ explodesOnExpiration = true,
131
+ abilityCooldownFactor = true
125
132
  }
126
133
  local function resolveEnumValue(ability, level, value)
127
134
  if value == nil or type(value) == "number" then
@@ -184,6 +191,7 @@ local buffNumberParameters = {
184
191
  "durationIncreaseOnAutoAttack",
185
192
  "attackSpeedIncreaseFactor",
186
193
  "movementSpeedIncreaseFactor",
194
+ "manaRegenerationRateIncreaseFactor",
187
195
  "evasionProbability",
188
196
  "armorIncrease",
189
197
  "damageFactor",
@@ -198,7 +206,8 @@ local buffNumberParameters = {
198
206
  "healingPerInterval",
199
207
  "healingOverDuration",
200
208
  "damageOnExpiration",
201
- "healingOnExpiration"
209
+ "healingOnExpiration",
210
+ "abilityCooldownFactor"
202
211
  }
203
212
  local unsuccessfulApplicationMarker = {}
204
213
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -317,33 +326,38 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
317
326
  local polarity
318
327
  local resistanceType
319
328
  local ability
329
+ local abilityBehavior
320
330
  if type(typeIdOrTypeIds) ~= "number" then
321
331
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
322
332
  polarity = resistanceTypeOrPolarity
323
333
  resistanceType = abilityOrParametersOrResistanceType
324
- if __TS__InstanceOf(parametersOrAbility, Ability) or parametersOrAbility == nil then
334
+ if __TS__InstanceOf(parametersOrAbility, AbilityBehavior) then
335
+ abilityBehavior = parametersOrAbility
336
+ ability = abilityBehavior.ability
337
+ elseif __TS__InstanceOf(parametersOrAbility, Ability) then
325
338
  ability = parametersOrAbility
326
- else
327
- ability = nil
339
+ elseif parametersOrAbility ~= nil then
328
340
  parameters = parametersOrAbility
329
341
  end
330
342
  else
331
343
  typeId = typeIdOrTypeIds
332
344
  polarity = polarityOrTypeIdSelectionPolicy
333
345
  resistanceType = resistanceTypeOrPolarity
334
- if __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) or abilityOrParametersOrResistanceType == nil then
346
+ if __TS__InstanceOf(abilityOrParametersOrResistanceType, AbilityBehavior) then
347
+ abilityBehavior = abilityOrParametersOrResistanceType
348
+ ability = abilityBehavior.ability
349
+ parameters = parametersOrAbility
350
+ elseif __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
335
351
  ability = abilityOrParametersOrResistanceType
336
352
  parameters = parametersOrAbility
337
- else
338
- ability = nil
353
+ elseif abilityOrParametersOrResistanceType ~= nil then
339
354
  parameters = abilityOrParametersOrResistanceType
355
+ else
356
+ parameters = parametersOrAbility
340
357
  end
341
358
  end
359
+ self.sourceAbilityBehavior = abilityBehavior
342
360
  self.typeId = typeId
343
- if not (__TS__InstanceOf(ability, Ability) or ability == nil) then
344
- parameters = ability
345
- ability = nil
346
- end
347
361
  local defaultParameters = self.constructor.defaultParameters
348
362
  local level = parameters and parameters.level or defaultParameters.level
349
363
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -506,6 +520,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
506
520
  self[100] = 1
507
521
  Event.invoke(buffCreatedEvent, self)
508
522
  end
523
+ function Buff.prototype.onAbilityGained(self, ability)
524
+ if __TS__InstanceOf(ability, UnitAbility) then
525
+ local abilityCooldownModifier = self[144]
526
+ if abilityCooldownModifier then
527
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
528
+ end
529
+ end
530
+ end
531
+ function Buff.prototype.onAbilityLost(self, ability)
532
+ if __TS__InstanceOf(ability, UnitAbility) then
533
+ local abilityCooldownModifier = self[144]
534
+ if abilityCooldownModifier then
535
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
536
+ end
537
+ end
538
+ end
509
539
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
510
540
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
511
541
  Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
@@ -580,6 +610,12 @@ function Buff.prototype.onDestroy(self)
580
610
  behavior:destroy()
581
611
  end
582
612
  end
613
+ local previousAbilityCooldownModifier = self[144]
614
+ if previousAbilityCooldownModifier then
615
+ for ____, ability in ipairs(self._unit.abilities) do
616
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
617
+ end
618
+ end
583
619
  if self[139] then
584
620
  unit:decrementInvulnerabilityCounter()
585
621
  end
@@ -588,7 +624,7 @@ function Buff.prototype.onDestroy(self)
588
624
  end
589
625
  if self[136] then
590
626
  if self[137] then
591
- unit:decrementStunCounter()
627
+ unit:decrementForceStunCounter()
592
628
  end
593
629
  unit:decrementStunCounter()
594
630
  end
@@ -987,13 +1023,13 @@ __TS__SetDescriptor(
987
1023
  set = function(self, stuns)
988
1024
  if not stuns and self[136] then
989
1025
  if self[137] then
990
- self.object:decrementStunCounter()
1026
+ self.object:decrementForceStunCounter()
991
1027
  end
992
1028
  self.object:decrementStunCounter()
993
1029
  self[136] = nil
994
1030
  elseif stuns and not self[136] then
995
1031
  if self[137] then
996
- self.object:incrementStunCounter()
1032
+ self.object:incrementForceStunCounter()
997
1033
  end
998
1034
  self.object:incrementStunCounter()
999
1035
  self[136] = true
@@ -1016,12 +1052,12 @@ __TS__SetDescriptor(
1016
1052
  set = function(self, ignoresStunImmunity)
1017
1053
  if not ignoresStunImmunity and self[137] then
1018
1054
  if self[136] then
1019
- self.object:decrementStunCounter()
1055
+ self.object:decrementForceStunCounter()
1020
1056
  end
1021
1057
  self[137] = nil
1022
1058
  elseif ignoresStunImmunity and not self[137] then
1023
1059
  if self[136] then
1024
- self.object:incrementStunCounter()
1060
+ self.object:incrementForceStunCounter()
1025
1061
  end
1026
1062
  self[137] = true
1027
1063
  end
@@ -1220,6 +1256,19 @@ __TS__SetDescriptor(
1220
1256
  },
1221
1257
  true
1222
1258
  )
1259
+ __TS__SetDescriptor(
1260
+ Buff.prototype,
1261
+ "manaRegenerationRateIncreaseFactor",
1262
+ {
1263
+ get = function(self)
1264
+ return self:getUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR)
1265
+ end,
1266
+ set = function(self, manaRegenerationRateIncreaseFactor)
1267
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR, manaRegenerationRateIncreaseFactor)
1268
+ end
1269
+ },
1270
+ true
1271
+ )
1223
1272
  __TS__SetDescriptor(
1224
1273
  Buff.prototype,
1225
1274
  "duration",
@@ -1269,6 +1318,32 @@ __TS__SetDescriptor(
1269
1318
  },
1270
1319
  true
1271
1320
  )
1321
+ __TS__SetDescriptor(
1322
+ Buff.prototype,
1323
+ "abilityCooldownFactor",
1324
+ {
1325
+ get = function(self)
1326
+ return self[143] or 1
1327
+ end,
1328
+ set = function(self, abilityCooldownFactor)
1329
+ local previousAbilityCooldownModifier = self[144]
1330
+ if previousAbilityCooldownModifier then
1331
+ for ____, ability in ipairs(self._unit.abilities) do
1332
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
1333
+ end
1334
+ end
1335
+ local function modifier(ability, level, cooldown)
1336
+ return cooldown * abilityCooldownFactor
1337
+ end
1338
+ for ____, ability in ipairs(self._unit.abilities) do
1339
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1340
+ end
1341
+ self[144] = modifier
1342
+ self[143] = abilityCooldownFactor
1343
+ end
1344
+ },
1345
+ true
1346
+ )
1272
1347
  Buff.createdEvent = buffCreatedEvent
1273
1348
  Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1274
1349
  (function(self)
@@ -1327,5 +1402,8 @@ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1327
1402
  buffCreatedEvent:addListener(function(buff)
1328
1403
  UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1329
1404
  end)
1405
+ buffBeingDestroyedEvent:addListener(function(buff)
1406
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1407
+ end)
1330
1408
  end)(Buff)
1331
1409
  return ____exports
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export {};
@@ -0,0 +1,16 @@
1
+ local ____exports = {}
2
+ local ____mana_2Dregeneration = require("engine.object-data.entry.ability-type.mana-regeneration")
3
+ local ManaRegenerationAbilityType = ____mana_2Dregeneration.ManaRegenerationAbilityType
4
+ ---
5
+ -- @internal For use by internal systems.
6
+ ____exports.MANA_REGENERATION_RATE_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID = compiletime(function()
7
+ local abilityType = ManaRegenerationAbilityType:create()
8
+ abilityType.isInternal = true
9
+ abilityType.isButtonVisible = false
10
+ abilityType.manaRegenerationRateIncreaseFactor = 4
11
+ return abilityType.id
12
+ end)
13
+ ---
14
+ -- @internal For use by internal systems.
15
+ ____exports.MANA_REGENERATION_RATE_INCREASE_FACTOR_ABILITY_FIELD = ABILITY_RLF_MANA_REGENERATION_BONUS_AS_FRACTION_OF_NORMAL
16
+ return ____exports
@@ -0,0 +1,17 @@
1
+ /** @noSelfInFile */
2
+ declare module "../unit" {
3
+ interface Unit {
4
+ strengthBase: number;
5
+ }
6
+ }
7
+ declare module "../unit" {
8
+ interface Unit {
9
+ agilityBase: number;
10
+ }
11
+ }
12
+ declare module "../unit" {
13
+ interface Unit {
14
+ intelligenceBase: number;
15
+ }
16
+ }
17
+ export {};
@@ -0,0 +1,46 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
3
+ local ____exports = {}
4
+ local ____unit = require("engine.internal.unit")
5
+ local Unit = ____unit.Unit
6
+ local ____unit = require("engine.standard.fields.unit")
7
+ local AGILITY_UNIT_FIELD = ____unit.AGILITY_UNIT_FIELD
8
+ local INTELLIGENCE_UNIT_FIELD = ____unit.INTELLIGENCE_UNIT_FIELD
9
+ local STRENGTH_UNIT_FIELD = ____unit.STRENGTH_UNIT_FIELD
10
+ __TS__ObjectDefineProperty(
11
+ Unit.prototype,
12
+ "strengthBase",
13
+ {
14
+ get = function(self)
15
+ return STRENGTH_UNIT_FIELD:getValue(self)
16
+ end,
17
+ set = function(self, value)
18
+ STRENGTH_UNIT_FIELD:setValue(self, value)
19
+ end
20
+ }
21
+ )
22
+ __TS__ObjectDefineProperty(
23
+ Unit.prototype,
24
+ "agilityBase",
25
+ {
26
+ get = function(self)
27
+ return AGILITY_UNIT_FIELD:getValue(self)
28
+ end,
29
+ set = function(self, value)
30
+ AGILITY_UNIT_FIELD:setValue(self, value)
31
+ end
32
+ }
33
+ )
34
+ __TS__ObjectDefineProperty(
35
+ Unit.prototype,
36
+ "intelligenceBase",
37
+ {
38
+ get = function(self)
39
+ return INTELLIGENCE_UNIT_FIELD:getValue(self)
40
+ end,
41
+ set = function(self, value)
42
+ INTELLIGENCE_UNIT_FIELD:setValue(self, value)
43
+ end
44
+ }
45
+ )
46
+ return ____exports
@@ -12,6 +12,7 @@ export type UnitAutoAttackDamageBonusId = UnitBonusId<"autoAttackDamage">;
12
12
  export type UnitDamageFactorBonusId = UnitBonusId<"damageFactor">;
13
13
  export type UnitReceivedDamageFactorBonusId = UnitBonusId<"receivedDamageFactor">;
14
14
  export type UnitEvasionProbabilityBonusId = UnitBonusId<"evasionProbability">;
15
+ export type UnitManaRegenerationRateFactorBonusId = UnitBonusId<"manaRegenerationRateFactor">;
15
16
  export type UnitBonusType<Id extends UnitBonusId = UnitBonusId> = ({
16
17
  abilityTypeId: AbilityTypeId;
17
18
  field: jabilityintegerlevelfield;
@@ -36,6 +37,7 @@ export declare namespace UnitBonusType {
36
37
  const DAMAGE_FACTOR: UnitBonusType<UnitReceivedDamageFactorBonusId>;
37
38
  const RECEIVED_DAMAGE_FACTOR: UnitBonusType<UnitReceivedDamageFactorBonusId>;
38
39
  const EVASION_PROBABILITY: UnitBonusType<UnitEvasionProbabilityBonusId>;
40
+ const MANA_REGENERATION_RATE_FACTOR: UnitBonusType<UnitManaRegenerationRateFactorBonusId>;
39
41
  }
40
42
  export declare const addUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, value: number) => Id;
41
43
  export declare const removeUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id) => boolean;
@@ -24,6 +24,9 @@ local MOVEMENT_SPEED_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID = ____movement_2Dspee
24
24
  local ____evasion_2Dprobability = require("engine.internal.object-data.evasion-probability")
25
25
  local EVASION_PROBABILITY_ABILITY_FIELD = ____evasion_2Dprobability.EVASION_PROBABILITY_ABILITY_FIELD
26
26
  local EVASION_PROBABILITY_DUMMY_ABILITY_TYPE_ID = ____evasion_2Dprobability.EVASION_PROBABILITY_DUMMY_ABILITY_TYPE_ID
27
+ local ____mana_2Dregeneration_2Drate_2Dincrease_2Dfactor = require("engine.internal.object-data.mana-regeneration-rate-increase-factor")
28
+ local MANA_REGENERATION_RATE_INCREASE_FACTOR_ABILITY_FIELD = ____mana_2Dregeneration_2Drate_2Dincrease_2Dfactor.MANA_REGENERATION_RATE_INCREASE_FACTOR_ABILITY_FIELD
29
+ local MANA_REGENERATION_RATE_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID = ____mana_2Dregeneration_2Drate_2Dincrease_2Dfactor.MANA_REGENERATION_RATE_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID
27
30
  local damageFactorByUnit = {}
28
31
  local receivedDamageFactorByUnit = {}
29
32
  local function atLeastOnceProbability(array)
@@ -73,6 +76,13 @@ do
73
76
  reduce = atLeastOnceProbability,
74
77
  initialValue = 0
75
78
  }
79
+ UnitBonusType.MANA_REGENERATION_RATE_FACTOR = {
80
+ abilityTypeId = MANA_REGENERATION_RATE_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID,
81
+ field = MANA_REGENERATION_RATE_INCREASE_FACTOR_ABILITY_FIELD,
82
+ integer = false,
83
+ reduce = sum,
84
+ initialValue = 0
85
+ }
76
86
  end
77
87
  local bonusesByUnitByBonusType = {}
78
88
  local nextId = 1
@@ -0,0 +1,7 @@
1
+ /** @noSelfInFile */
2
+ declare module "../unit" {
3
+ interface Unit {
4
+ flyHeight: number;
5
+ }
6
+ }
7
+ export {};