warscript 0.0.1-dev.5abc199 → 0.0.1-dev.5c35450

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 (57) hide show
  1. package/core/types/frame.lua +47 -1
  2. package/core/types/item.d.ts +1 -0
  3. package/core/types/item.lua +1 -0
  4. package/core/types/sound.lua +1 -1
  5. package/engine/behaviour/ability/damage.d.ts +3 -0
  6. package/engine/behaviour/ability/damage.lua +8 -2
  7. package/engine/behaviour/ability/emulate-impact.lua +5 -4
  8. package/engine/behaviour/ability.d.ts +5 -5
  9. package/engine/buff.d.ts +41 -13
  10. package/engine/buff.lua +222 -116
  11. package/engine/internal/ability.lua +25 -15
  12. package/engine/internal/item/fields.d.ts +12 -0
  13. package/engine/internal/item/fields.lua +33 -0
  14. package/engine/internal/item.d.ts +0 -4
  15. package/engine/internal/item.lua +0 -37
  16. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  17. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  18. package/engine/internal/object-data/health-bonus.lua +16 -0
  19. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  20. package/engine/internal/object-data/mana-bonus.lua +16 -0
  21. package/engine/internal/unit/bonus.d.ts +4 -0
  22. package/engine/internal/unit/bonus.lua +23 -3
  23. package/engine/internal/unit+bonus.lua +3 -3
  24. package/engine/local-client.d.ts +5 -0
  25. package/engine/local-client.lua +56 -1
  26. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  27. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  28. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  29. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  30. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  31. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  32. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  33. package/engine/object-data/entry/ability-type.lua +4 -0
  34. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  35. package/engine/object-field/ability.lua +2 -2
  36. package/engine/object-field/item.d.ts +22 -0
  37. package/engine/object-field/item.lua +118 -0
  38. package/engine/object-field.d.ts +1 -1
  39. package/engine/object-field.lua +9 -7
  40. package/engine/standard/fields/item.d.ts +4 -0
  41. package/engine/standard/fields/item.lua +6 -0
  42. package/lualib_bundle.lua +1 -1
  43. package/math.d.ts +2 -0
  44. package/math.lua +14 -0
  45. package/objutil/object.lua +1 -1
  46. package/operation.lua +1 -4
  47. package/package.json +4 -4
  48. package/utility/linked-map.d.ts +2 -1
  49. package/utility/linked-map.lua +6 -0
  50. package/utility/linked-set.d.ts +1 -0
  51. package/utility/linked-set.lua +6 -0
  52. package/utility/unordered-map.d.ts +27 -0
  53. package/utility/unordered-map.lua +99 -0
  54. /package/engine/internal/object-data/{armor-increase.d.ts → armor-bonus.d.ts} +0 -0
  55. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  56. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  57. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
@@ -24,11 +24,23 @@ local frameCoordinatesToWorld = ____playerCamera.frameCoordinatesToWorld
24
24
  local worldCoordinatesToFrame = ____playerCamera.worldCoordinatesToFrame
25
25
  local ____get_2Dterrain_2Dz = require("engine.internal.misc.get-terrain-z")
26
26
  local getTerrainZ = ____get_2Dterrain_2Dz.getTerrainZ
27
+ local ____lua_2Dsets = require("utility.lua-sets")
28
+ local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
29
+ local ____socket = require("net.socket")
30
+ local Socket = ____socket.Socket
31
+ local ____lua_2Dmaps = require("utility.lua-maps")
32
+ local getOrPut = ____lua_2Dmaps.getOrPut
33
+ local luaMapInvert = ____lua_2Dmaps.luaMapInvert
34
+ local luaMapOf = ____lua_2Dmaps.luaMapOf
35
+ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
27
36
  local frameClick = BlzFrameClick
28
37
  local frameGetEnable = BlzFrameGetEnable
29
38
  local frameIsVisible = BlzFrameIsVisible
30
39
  local frameSetEnable = BlzFrameSetEnable
31
40
  local frameSetScale = BlzFrameSetScale
41
+ local getHandleId = GetHandleId
42
+ local getOriginFrame = BlzGetOriginFrame
43
+ local location = Location
32
44
  local ____rawget = _G.rawget
33
45
  local rawset = _G.rawset
34
46
  local invoke = Event.invoke
@@ -130,6 +142,30 @@ do
130
142
  FramePoint.BOTTOM_RIGHT = FRAMEPOINT_BOTTOMRIGHT
131
143
  end
132
144
  local tooltipByFrame = setmetatable({}, {__mode = "k"})
145
+ local keyByAsyncInitOriginFrameType = luaMapOf(ORIGIN_FRAME_PORTRAIT_HP_TEXT, "hp", ORIGIN_FRAME_PORTRAIT_MANA_TEXT, "mana")
146
+ local asyncInitOriginFrameTypeByKey = luaMapInvert(keyByAsyncInitOriginFrameType)
147
+ local seenAsyncInitOriginFrameTypes = mutableLuaSet()
148
+ local seenAsyncInitOriginFrameTypesSocket = __TS__New(Socket)
149
+ local seenPlayersByAsyncInitOriginFrameType = mutableLuaMap()
150
+ seenAsyncInitOriginFrameTypesSocket.onMessage:addListener(function(player, key)
151
+ local asyncInitOriginFrameType = asyncInitOriginFrameTypeByKey[key]
152
+ if asyncInitOriginFrameType ~= nil then
153
+ getOrPut(seenPlayersByAsyncInitOriginFrameType, asyncInitOriginFrameType, mutableLuaSet)[player] = true
154
+ end
155
+ end)
156
+ local function haveAllPlayersSeenAsyncInitOriginFrameType(frame)
157
+ local players = seenPlayersByAsyncInitOriginFrameType[frame]
158
+ if players == nil then
159
+ return false
160
+ end
161
+ for ____, player in ipairs(Player.all) do
162
+ if player.isUser and player.isPlaying and not (players[player] ~= nil) then
163
+ return false
164
+ end
165
+ end
166
+ keyByAsyncInitOriginFrameType[frame] = nil
167
+ return true
168
+ end
133
169
  ____exports.Frame = __TS__Class()
134
170
  local Frame = ____exports.Frame
135
171
  Frame.name = "Frame"
@@ -308,7 +344,17 @@ function Frame.byOrigin(self, frameType, index)
308
344
  if index == nil then
309
345
  index = 0
310
346
  end
311
- return self:of(BlzGetOriginFrame(frameType, index))
347
+ local frame = getOriginFrame(frameType, index)
348
+ local asyncInitOriginFrameTypeKey = keyByAsyncInitOriginFrameType[frameType]
349
+ if index == 0 and asyncInitOriginFrameTypeKey ~= nil and not haveAllPlayersSeenAsyncInitOriginFrameType(frameType) then
350
+ if getHandleId(frame) == 0 or seenAsyncInitOriginFrameTypes[frameType] ~= nil then
351
+ location(0, 0)
352
+ else
353
+ seenAsyncInitOriginFrameTypes[frameType] = true
354
+ seenAsyncInitOriginFrameTypesSocket:send(asyncInitOriginFrameTypeKey)
355
+ end
356
+ end
357
+ return self:of(frame)
312
358
  end
313
359
  Frame.GAME_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_GAME_UI)
314
360
  Frame.CONSOLE_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_SIMPLE_UI_PARENT)
@@ -1,4 +1,5 @@
1
1
  /** @noSelfInFile */
2
2
  import { Item } from "../../engine/internal/item";
3
3
  import "../../engine/internal/item+owner";
4
+ import "../../engine/internal/item/fields";
4
5
  export { Item };
@@ -2,5 +2,6 @@ local ____exports = {}
2
2
  local ____item = require("engine.internal.item")
3
3
  local Item = ____item.Item
4
4
  require("engine.internal.item+owner")
5
+ require("engine.internal.item.fields")
5
6
  ____exports.Item = Item
6
7
  return ____exports
@@ -22,7 +22,7 @@ local setSoundPlayPosition = SetSoundPlayPosition
22
22
  local stopSound = StopSound
23
23
  local attachSoundToUnit = AttachSoundToUnit
24
24
  local killSoundWhenDone = KillSoundWhenDone
25
- ____exports.SoundChannel = SoundChannel or ({})
25
+ ____exports.SoundChannel = ____exports.SoundChannel or ({})
26
26
  ____exports.SoundChannel.General = 0
27
27
  ____exports.SoundChannel[____exports.SoundChannel.General] = "General"
28
28
  ____exports.SoundChannel.UnitSelection = 1
@@ -25,8 +25,11 @@ export declare abstract class DamageAbilityBehavior<T extends DamageAbilityBehav
25
25
  protected readonly damage: AbilityDependentValue<number>;
26
26
  protected readonly parameters?: T | undefined;
27
27
  protected constructor(ability: Ability, damage: AbilityDependentValue<number>, parameters?: T | undefined);
28
+ protected precalculatedDamage?: number;
28
29
  protected calculateDamage(caster: Unit): number;
29
30
  protected damageTarget(caster: Unit, target: Widget, damage?: number): void;
31
+ onChannelingStart(caster: Unit): void;
32
+ onStop(): void;
30
33
  }
31
34
  export declare class DamageSelfAbilityBehavior extends DamageAbilityBehavior {
32
35
  constructor(ability: Ability, damage: AbilityDependentValue<number>, parameters?: DamageAbilityBehaviorParameters);
@@ -39,7 +39,7 @@ function DamageAbilityBehavior.prototype.damageTarget(self, caster, target, dama
39
39
  local parameters = self.parameters
40
40
  caster:damageTarget(
41
41
  target,
42
- damage or self:calculateDamage(caster),
42
+ damage or self.precalculatedDamage or self:calculateDamage(caster),
43
43
  nil,
44
44
  nil,
45
45
  self:resolveCurrentAbilityDependentValue(parameters and parameters.attackType),
@@ -48,6 +48,12 @@ function DamageAbilityBehavior.prototype.damageTarget(self, caster, target, dama
48
48
  self:resolveCurrentAbilityDependentValue(parameters and parameters.metadata)
49
49
  )
50
50
  end
51
+ function DamageAbilityBehavior.prototype.onChannelingStart(self, caster)
52
+ self.precalculatedDamage = self:calculateDamage(caster)
53
+ end
54
+ function DamageAbilityBehavior.prototype.onStop(self)
55
+ self.precalculatedDamage = nil
56
+ end
51
57
  ____exports.DamageSelfAbilityBehavior = __TS__Class()
52
58
  local DamageSelfAbilityBehavior = ____exports.DamageSelfAbilityBehavior
53
59
  DamageSelfAbilityBehavior.name = "DamageSelfAbilityBehavior"
@@ -83,7 +89,7 @@ function DamageAreaAbilityBehavior.prototype.damageArea(self, caster, x, y)
83
89
  y,
84
90
  self:resolveCurrentAbilityDependentValue(parameters and parameters.areaOfEffect or AREA_OF_EFFECT_ABILITY_FLOAT_LEVEL_FIELD)
85
91
  )
86
- local damage = self:calculateDamage(caster)
92
+ local damage = self.precalculatedDamage or self:calculateDamage(caster)
87
93
  local maximumDamage = self:resolveCurrentAbilityDependentValue(parameters and parameters.maximumDamage or 0)
88
94
  if maximumDamage ~= 0 and damage > maximumDamage then
89
95
  damage = maximumDamage / #targets
@@ -10,9 +10,6 @@ local Unit = ____unit.Unit
10
10
  local ____ability = require("engine.standard.fields.ability")
11
11
  local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
12
12
  local MANA_COST_ABILITY_INTEGER_LEVEL_FIELD = ____ability.MANA_COST_ABILITY_INTEGER_LEVEL_FIELD
13
- local ____math = require("math")
14
- local max = ____math.max
15
- local MINIMUM_POSITIVE_NORMALIZED_FLOAT = ____math.MINIMUM_POSITIVE_NORMALIZED_FLOAT
16
13
  local ____sound = require("core.types.sound")
17
14
  local Sound3D = ____sound.Sound3D
18
15
  local SoundSettings = ____sound.SoundSettings
@@ -31,7 +28,11 @@ function EmulateImpactAbilityBehavior.prototype.emulateImpact(self, caster)
31
28
  return false
32
29
  end
33
30
  caster.mana = caster.mana - manaCost
34
- self.ability.cooldownRemaining = max(cooldown, MINIMUM_POSITIVE_NORMALIZED_FLOAT)
31
+ if cooldown == 0 then
32
+ self.ability:interruptCast()
33
+ else
34
+ self.ability.cooldownRemaining = cooldown
35
+ end
35
36
  self:flashCasterEffect(caster)
36
37
  local soundPresetId = self.ability:getField(ABILITY_SF_EFFECT_SOUND)
37
38
  if soundPresetId ~= "" then
@@ -26,11 +26,11 @@ export declare abstract class AbilityBehavior<Parameters extends {
26
26
  get unit(): Unit | undefined;
27
27
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value: AbilityDependentValue<T>): T;
28
28
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value?: AbilityDependentValue<T>): T | undefined;
29
- protected flashCasterEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
30
- protected flashTargetEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
31
- protected flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
32
- protected flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
33
- protected flashSpecialEffect(...args: [
29
+ flashCasterEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
30
+ flashTargetEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
31
+ flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
32
+ flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
33
+ flashSpecialEffect(...args: [
34
34
  ...pointOrWidget: [x: number, y: number] | [widget: Widget],
35
35
  ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]
36
36
  ]): void;
package/engine/buff.d.ts CHANGED
@@ -56,7 +56,8 @@ export type BuffParameters<T extends Buff<any> = Buff> = Buff extends T ? {
56
56
  damageIncrease?: NumberParameterValueType;
57
57
  damageIncreaseFactor?: NumberParameterValueType;
58
58
  armorIncrease?: NumberParameterValueType;
59
- armorIncreaseFactor?: NumberParameterValueType;
59
+ maxHealthIncrease?: NumberParameterValueType;
60
+ maxManaIncrease?: NumberParameterValueType;
60
61
  attackSpeedIncreaseFactor?: NumberParameterValueType;
61
62
  movementSpeedIncreaseFactor?: NumberParameterValueType;
62
63
  manaRegenerationRateIncreaseFactor?: NumberParameterValueType;
@@ -79,6 +80,9 @@ export type BuffParameters<T extends Buff<any> = Buff> = Buff extends T ? {
79
80
  maximumAutoAttackCount?: IntegerParameterValueType;
80
81
  maximumDamageDealtEventCount?: IntegerParameterValueType;
81
82
  maximumDamageReceivedEventCount?: IntegerParameterValueType;
83
+ absorbedDamageFactor?: NumberParameterValueType;
84
+ maximumDamageAbsorbed?: NumberParameterValueType;
85
+ destroysOnMaximumDamageAbsorbed?: BooleanParameterValueType;
82
86
  damageOnExpiration?: NumberParameterValueType;
83
87
  healingOnExpiration?: NumberParameterValueType;
84
88
  killsOnExpiration?: BooleanParameterValueType;
@@ -122,16 +126,20 @@ declare const enum BuffPropertyKey {
122
126
  MAXIMUM_DAMAGE_DEALT_EVENT_COUNT = 132,
123
127
  DAMAGE_RECEIVED_EVENT_COUNT = 133,
124
128
  MAXIMUM_DAMAGE_RECEIVED_EVENT_COUNT = 134,
125
- TURNS_INTO_GHOST = 135,
126
- STUNS = 136,
127
- IGNORES_STUN_IMMUNITY = 137,
128
- DISABLES_AUTO_ATTACK = 138,
129
- PROVIDES_INVULNERABILITY = 139,
130
- KILLS_ON_EXPIRATION = 140,
131
- EXPLODES_ON_EXPIRATION = 141,
132
- MISS_PROBABILITY = 142,
133
- ABILITY_COOLDOWN_FACTOR = 143,
134
- ABILITY_COOLDOWN_MODIFIER = 144
129
+ ABSORBED_DAMAGE_FACTOR = 135,
130
+ MAXIMUM_DAMAGE_ABSORBED = 136,
131
+ DAMAGE_ABSORBED = 137,
132
+ DESTROYS_ON_MAXIMUM_DAMAGE_ABSORBED = 138,
133
+ TURNS_INTO_GHOST = 139,
134
+ STUNS = 140,
135
+ IGNORES_STUN_IMMUNITY = 141,
136
+ DISABLES_AUTO_ATTACK = 142,
137
+ PROVIDES_INVULNERABILITY = 143,
138
+ KILLS_ON_EXPIRATION = 144,
139
+ EXPLODES_ON_EXPIRATION = 145,
140
+ MISS_PROBABILITY = 146,
141
+ ABILITY_COOLDOWN_FACTOR = 147,
142
+ ABILITY_COOLDOWN_MODIFIER = 148
135
143
  }
136
144
  export declare const enum BuffTypeIdSelectionPolicy {
137
145
  LEAST_DURATION = 0
@@ -189,6 +197,10 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
189
197
  private [BuffPropertyKey.DAMAGE_DEALT_EVENT_COUNT]?;
190
198
  private [BuffPropertyKey.MAXIMUM_DAMAGE_RECEIVED_EVENT_COUNT]?;
191
199
  private [BuffPropertyKey.DAMAGE_RECEIVED_EVENT_COUNT]?;
200
+ private [BuffPropertyKey.ABSORBED_DAMAGE_FACTOR]?;
201
+ private [BuffPropertyKey.MAXIMUM_DAMAGE_ABSORBED]?;
202
+ private [BuffPropertyKey.DAMAGE_ABSORBED]?;
203
+ private [BuffPropertyKey.DESTROYS_ON_MAXIMUM_DAMAGE_ABSORBED]?;
192
204
  private [BuffPropertyKey.TURNS_INTO_GHOST]?;
193
205
  private [BuffPropertyKey.STUNS]?;
194
206
  private [BuffPropertyKey.IGNORES_STUN_IMMUNITY]?;
@@ -203,10 +215,11 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
203
215
  readonly typeId: ApplicableBuffTypeId;
204
216
  readonly polarity: BuffPolarity;
205
217
  readonly resistanceType: BuffResistanceType;
206
- readonly parameters: IsExactlyAny<AdditionalParameters> extends true ? any : keyof AdditionalParameters extends never ? undefined : {
218
+ readonly parameters: IsExactlyAny<AdditionalParameters> extends true ? any : AdditionalParameters extends Record<PropertyKey, never> ? undefined : {
207
219
  [K in keyof Omit<AdditionalParameters, keyof BuffParameters>]: AdditionalParameters[K] extends AbilityDependentValue<infer T> ? T : AdditionalParameters[K];
208
220
  };
209
221
  private readonly handle;
222
+ readonly previousBuff?: Buff;
210
223
  private _timer?;
211
224
  private readonly _level?;
212
225
  private readonly _spellStealPriority?;
@@ -242,6 +255,10 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
242
255
  set receivedDamageFactor(receivedDamageFactor: number);
243
256
  get armorIncrease(): number;
244
257
  set armorIncrease(armorIncrease: number);
258
+ get maxHealthIncrease(): number;
259
+ set maxHealthIncrease(maxHealthIncrease: number);
260
+ get maxManaIncrease(): number;
261
+ set maxManaIncrease(maxManaIncrease: number);
245
262
  get turnsIntoGhost(): boolean;
246
263
  set turnsIntoGhost(turnsIntoGhost: boolean);
247
264
  get stuns(): boolean;
@@ -276,6 +293,13 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
276
293
  set duration(duration: number);
277
294
  get remainingDuration(): number;
278
295
  set remainingDuration(remainingDuration: number);
296
+ get absorbedDamageFactor(): number;
297
+ set absorbedDamageFactor(absorbedDamageFactor: number);
298
+ get maximumDamageAbsorbed(): number;
299
+ set maximumDamageAbsorbed(maximumDamageAbsorbed: number);
300
+ get damageAbsorbed(): number;
301
+ get destroysOnMaximumDamageAbsorbed(): boolean;
302
+ set destroysOnMaximumDamageAbsorbed(destroysOnMaximumDamageAbsorbed: boolean);
279
303
  get abilityCooldownFactor(): number;
280
304
  set abilityCooldownFactor(abilityCooldownFactor: number);
281
305
  onAbilityGained(ability: Ability): void;
@@ -284,7 +308,11 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
284
308
  ...widgetOrXY: [] | [Widget] | [x: number, x: number],
285
309
  ...parametersOrDuration: [] | [EffectParameters] | [number]
286
310
  ]): void;
287
- flashSpecialEffect(...parameters: [...widget: [] | [Widget], ...duration: [] | [number]]): void;
311
+ flashSpecialEffect(...parameters: [
312
+ ...widgetOrXY: [] | [Widget] | [x: number, x: number],
313
+ ...parametersOrDuration: [] | [EffectParameters] | [number]
314
+ ]): void;
315
+ private flash;
288
316
  expire(): void;
289
317
  protected onCreate(): void;
290
318
  protected onDestroy(): Destructor;