warscript 0.0.1-dev.d7e0522 → 0.0.1-dev.da5fb2e

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 (70) hide show
  1. package/core/types/frame.lua +10 -12
  2. package/core/types/player.lua +3 -1
  3. package/core/types/playerCamera.d.ts +2 -0
  4. package/core/types/playerCamera.lua +79 -5
  5. package/core/types/timer.d.ts +2 -1
  6. package/core/types/timer.lua +21 -2
  7. package/decl/native.d.ts +4 -2
  8. package/engine/behavior.d.ts +5 -0
  9. package/engine/behavior.lua +106 -27
  10. package/engine/behaviour/ability/apply-buff.lua +1 -1
  11. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  12. package/engine/behaviour/ability/emulate-impact.lua +11 -3
  13. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  14. package/engine/behaviour/ability/restore-mana.lua +6 -6
  15. package/engine/behaviour/ability.lua +8 -17
  16. package/engine/behaviour/unit/stun-immunity.d.ts +5 -3
  17. package/engine/behaviour/unit/stun-immunity.lua +43 -27
  18. package/engine/behaviour/unit.d.ts +19 -2
  19. package/engine/behaviour/unit.lua +88 -7
  20. package/engine/buff.d.ts +2 -4
  21. package/engine/buff.lua +68 -83
  22. package/engine/internal/ability.d.ts +5 -1
  23. package/engine/internal/ability.lua +43 -11
  24. package/engine/internal/item/ability.lua +51 -1
  25. package/engine/internal/item+owner.lua +12 -6
  26. package/engine/internal/item.d.ts +1 -0
  27. package/engine/internal/item.lua +20 -11
  28. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  29. package/engine/internal/misc/frame-coordinates.lua +21 -0
  30. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  31. package/engine/internal/misc/get-terrain-z.lua +11 -0
  32. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  33. package/engine/internal/misc/player-local-handle.lua +5 -0
  34. package/engine/internal/unit/ability.d.ts +35 -0
  35. package/engine/internal/unit/ability.lua +62 -0
  36. package/engine/internal/unit/order.d.ts +20 -0
  37. package/engine/internal/unit/order.lua +136 -0
  38. package/engine/internal/unit+ability.lua +10 -1
  39. package/engine/internal/unit-missile-launch.lua +8 -1
  40. package/engine/internal/unit.d.ts +4 -4
  41. package/engine/internal/unit.lua +84 -70
  42. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  43. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  44. package/engine/object-data/entry/ability-type.lua +1 -3
  45. package/engine/object-data/entry/unit-type.d.ts +11 -2
  46. package/engine/object-data/entry/unit-type.lua +59 -1
  47. package/engine/object-field/ability.d.ts +3 -3
  48. package/engine/object-field/ability.lua +7 -6
  49. package/engine/object-field/unit.d.ts +11 -0
  50. package/engine/object-field/unit.lua +34 -0
  51. package/engine/object-field.d.ts +8 -5
  52. package/engine/object-field.lua +90 -76
  53. package/engine/standard/fields/unit.d.ts +4 -0
  54. package/engine/standard/fields/unit.lua +7 -0
  55. package/engine/text-tag.d.ts +36 -2
  56. package/engine/text-tag.lua +249 -10
  57. package/engine/unit.d.ts +1 -0
  58. package/engine/unit.lua +1 -0
  59. package/package.json +2 -2
  60. package/patch-lualib.lua +1 -1
  61. package/utility/callback-array.d.ts +13 -0
  62. package/utility/callback-array.lua +46 -0
  63. package/utility/functions.d.ts +7 -0
  64. package/utility/functions.lua +12 -0
  65. package/utility/lua-maps.d.ts +1 -0
  66. package/utility/lua-maps.lua +4 -0
  67. package/utility/lua-sets.d.ts +1 -0
  68. package/utility/lua-sets.lua +4 -0
  69. package/core/types/order.d.ts +0 -26
  70. package/core/types/order.lua +0 -65
@@ -15,6 +15,10 @@ local Event = ____event.Event
15
15
  local TriggerEvent = ____event.TriggerEvent
16
16
  local ____timer = require("core.types.timer")
17
17
  local Timer = ____timer.Timer
18
+ local ____frame_2Dcoordinates = require("engine.internal.misc.frame-coordinates")
19
+ local FRAME_MAX_Y = ____frame_2Dcoordinates.FRAME_MAX_Y
20
+ local FRAME_MIN_Y = ____frame_2Dcoordinates.FRAME_MIN_Y
21
+ local getFrameMinXMaxX = ____frame_2Dcoordinates.getFrameMinXMaxX
18
22
  local frameClick = BlzFrameClick
19
23
  local frameGetEnable = BlzFrameGetEnable
20
24
  local frameIsVisible = BlzFrameIsVisible
@@ -344,27 +348,21 @@ __TS__ObjectDefineProperty(
344
348
  Frame,
345
349
  "minX",
346
350
  {get = function(self)
347
- local w = BlzGetLocalClientWidth()
348
- local h = BlzGetLocalClientHeight()
349
- local width4by3 = (w - h / 600 * 800) / 2
350
- local pxtodpi = 0.6 / h
351
- return -width4by3 * pxtodpi
351
+ local minX = getFrameMinXMaxX()
352
+ return minX
352
353
  end}
353
354
  )
354
355
  __TS__ObjectDefineProperty(
355
356
  Frame,
356
357
  "maxX",
357
358
  {get = function(self)
358
- local w = BlzGetLocalClientWidth()
359
- local h = BlzGetLocalClientHeight()
360
- local width4by3 = (w - h / 600 * 800) / 2
361
- local pxtodpi = 0.6 / h
362
- return (-width4by3 + w) * pxtodpi
359
+ local ____, maxX = getFrameMinXMaxX()
360
+ return maxX
363
361
  end}
364
362
  )
365
363
  Frame.centerX = 0.4
366
- Frame.minY = 0
367
- Frame.maxY = 0.6
364
+ Frame.minY = FRAME_MIN_Y
365
+ Frame.maxY = FRAME_MAX_Y
368
366
  Frame.centerY = 0.3
369
367
  __TS__SetDescriptor(
370
368
  Frame.prototype,
@@ -21,6 +21,8 @@ local ____exception = require("exception")
21
21
  local IllegalStateException = ____exception.IllegalStateException
22
22
  local ____math = require("math")
23
23
  local MAXIMUM_INTEGER = ____math.MAXIMUM_INTEGER
24
+ local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
25
+ local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
24
26
  local getPlayerColor = GetPlayerColor
25
27
  local getPlayerName = GetPlayerName
26
28
  local getPlayerTechCount = GetPlayerTechCount
@@ -249,7 +251,7 @@ Player.all = (function()
249
251
  end
250
252
  return all
251
253
  end)()
252
- Player["local"] = ____exports.Player:of(GetLocalPlayer())
254
+ Player["local"] = ____exports.Player:of(PLAYER_LOCAL_HANDLE)
253
255
  Player.neutralPassive = ____exports.Player.all[PLAYER_NEUTRAL_PASSIVE + 1]
254
256
  Player.neutralAggressive = ____exports.Player.all[PLAYER_NEUTRAL_AGGRESSIVE + 1]
255
257
  Player.neutralVictim = ____exports.Player.all[bj_PLAYER_NEUTRAL_VICTIM + 1]
@@ -1,4 +1,5 @@
1
1
  /** @noSelfInFile */
2
+ import type { Unit } from "../../engine/internal/unit";
2
3
  export declare class PlayerCamera {
3
4
  private readonly player;
4
5
  private readonly isLocal;
@@ -28,5 +29,6 @@ export declare class PlayerCamera {
28
29
  get roll(): number;
29
30
  set roll(v: number);
30
31
  reset(): void;
32
+ static isUnitInView(unit: Unit): boolean;
31
33
  static of(player: jplayer): PlayerCamera;
32
34
  }
@@ -3,33 +3,49 @@ local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__New = ____lualib.__TS__New
4
4
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
5
  local ____exports = {}
6
+ local ____timer = require("core.types.timer")
7
+ local Timer = ____timer.Timer
8
+ local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
9
+ local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
10
+ local ____preconditions = require("utility.preconditions")
11
+ local check = ____preconditions.check
12
+ local ____frame_2Dcoordinates = require("engine.internal.misc.frame-coordinates")
13
+ local FRAME_MAX_Y = ____frame_2Dcoordinates.FRAME_MAX_Y
14
+ local FRAME_MIN_Y = ____frame_2Dcoordinates.FRAME_MIN_Y
15
+ local getFrameMinXMaxX = ____frame_2Dcoordinates.getFrameMinXMaxX
6
16
  local getHandleId = GetHandleId
7
17
  local setCameraField = SetCameraField
8
18
  local getCameraField = GetCameraField
9
19
  local setCameraPosition = SetCameraPosition
20
+ local getCameraEyePositionX = GetCameraEyePositionX
21
+ local getCameraEyePositionY = GetCameraEyePositionY
22
+ local getCameraEyePositionZ = GetCameraEyePositionZ
10
23
  local getCameraTargetPositionX = GetCameraTargetPositionX
11
24
  local getCameraTargetPositionY = GetCameraTargetPositionY
12
25
  local resetToGameCamera = ResetToGameCamera
26
+ local cos = math.cos
13
27
  local deg = math.deg
14
- local localPlayer = GetLocalPlayer()
28
+ local sin = math.sin
15
29
  local memoized = {}
16
30
  ____exports.PlayerCamera = __TS__Class()
17
31
  local PlayerCamera = ____exports.PlayerCamera
18
32
  PlayerCamera.name = "PlayerCamera"
19
33
  function PlayerCamera.prototype.____constructor(self, player)
20
34
  local id = getHandleId(player)
21
- if memoized[id] then
22
- error("Double-constructor run player camera!")
23
- end
35
+ check(memoized[id] == nil)
24
36
  memoized[id] = self
25
37
  self.player = player
26
- self.isLocal = player == localPlayer
38
+ self.isLocal = player == PLAYER_LOCAL_HANDLE
27
39
  end
28
40
  function PlayerCamera.prototype.reset(self)
29
41
  if self.isLocal then
30
42
  resetToGameCamera(0)
31
43
  end
32
44
  end
45
+ function PlayerCamera.isUnitInView(self, unit)
46
+ local ____, ____, isInView = ____exports.worldCoordinatesToFrame(unit.x, unit.y, unit.z)
47
+ return isInView
48
+ end
33
49
  function PlayerCamera.of(self, player)
34
50
  return memoized[getHandleId(player)] or __TS__New(____exports.PlayerCamera, player)
35
51
  end
@@ -159,4 +175,62 @@ __TS__SetDescriptor(
159
175
  },
160
176
  true
161
177
  )
178
+ local cameraEyeX = 0
179
+ local cameraEyeY = 0
180
+ local cameraEyeZ = 0
181
+ local cameraAngleOfAttack = 0
182
+ local cameraAngleOfAttackCos = 0
183
+ local cameraAngleOfAttackSin = 0
184
+ local cameraRotation = 0
185
+ local cameraRotationCos = 0
186
+ local cameraRotationSin = 0
187
+ local cameraAngleOfAttackCosRotationCos = 0
188
+ local cameraAngleOfAttackCosRotationSin = 0
189
+ local cameraAngleOfAttackSinRotationCos = 0
190
+ local cameraAngleOfAttackSinRotationSin = 0
191
+ local yCenterScreenShift = 0
192
+ local scaleFactor = 0
193
+ local frameMinX = 0
194
+ local frameMaxX = 0
195
+ local isCameraViewPrecalculated = false
196
+ local function precalculateCameraView()
197
+ cameraEyeX = getCameraEyePositionX()
198
+ cameraEyeY = getCameraEyePositionY()
199
+ cameraEyeZ = getCameraEyePositionZ()
200
+ cameraAngleOfAttack = getCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK)
201
+ cameraAngleOfAttackCos = cos(cameraAngleOfAttack)
202
+ cameraAngleOfAttackSin = sin(cameraAngleOfAttack)
203
+ cameraRotation = getCameraField(CAMERA_FIELD_ROTATION)
204
+ cameraRotationCos = cos(cameraRotation)
205
+ cameraRotationSin = sin(cameraRotation)
206
+ cameraAngleOfAttackCosRotationCos = cameraAngleOfAttackCos * cameraRotationCos
207
+ cameraAngleOfAttackCosRotationSin = cameraAngleOfAttackCos * cameraRotationSin
208
+ cameraAngleOfAttackSinRotationCos = cameraAngleOfAttackSin * cameraRotationCos
209
+ cameraAngleOfAttackSinRotationSin = cameraAngleOfAttackSin * cameraRotationSin
210
+ yCenterScreenShift = 0.1284 * cameraAngleOfAttackCos
211
+ local cameraFieldOfView = getCameraField(CAMERA_FIELD_FIELD_OF_VIEW)
212
+ scaleFactor = 0.0524 * cameraFieldOfView ^ 3 - 0.0283 * cameraFieldOfView ^ 2 + 1.061 * cameraFieldOfView
213
+ frameMinX, frameMaxX = getFrameMinXMaxX()
214
+ isCameraViewPrecalculated = true
215
+ end
216
+ Timer.onPeriod[1 / 64]:addListener(
217
+ 4,
218
+ function()
219
+ isCameraViewPrecalculated = false
220
+ end
221
+ )
222
+ ---
223
+ -- @internal For use by internal systems only.
224
+ ____exports.worldCoordinatesToFrame = function(x, y, z)
225
+ if not isCameraViewPrecalculated then
226
+ precalculateCameraView()
227
+ end
228
+ local dx = x - cameraEyeX
229
+ local dy = y - cameraEyeY
230
+ local dz = z - cameraEyeZ
231
+ local xPrime = scaleFactor * (-cameraAngleOfAttackCosRotationCos * dx - cameraAngleOfAttackCosRotationSin * dy - cameraAngleOfAttackSin * dz)
232
+ local frameX = 0.4 + (cameraRotationCos * dy - cameraRotationSin * dx) / xPrime
233
+ local frameY = 0.42625 - yCenterScreenShift + (cameraAngleOfAttackSinRotationCos * dx + cameraAngleOfAttackSinRotationSin * dy - cameraAngleOfAttackCos * dz) / xPrime
234
+ return frameX, frameY, xPrime < 0 and frameX >= frameMinX and frameX <= frameMaxX and frameY >= FRAME_MIN_Y and frameY <= FRAME_MAX_Y
235
+ end
162
236
  return ____exports
@@ -22,7 +22,8 @@ export declare class Timer extends AbstractDestroyable {
22
22
  pause(): void;
23
23
  resume(): void;
24
24
  static create(): Timer;
25
- static run<Args extends any[]>(callback: (...args: Args) => void, ...args: Args): void;
25
+ static run<T, K extends KeysOfType<T, (this: T, ...args: any) => any>>(object: T, key: K, ...parameters: T[K] extends (this: T, ...args: any) => any ? Parameters<T[K]> : never): void;
26
+ static run<Args extends any[]>(callback: (this: void, ...args: Args) => void, ...args: Args): void;
26
27
  static simple<Args extends any[]>(timeout: number, callback: (...args: Args) => void, ...args: Args): Timer;
27
28
  static periodic<Args extends any[]>(period: number, callback: (this: void, timer: Timer, ...args: Args) => void, ...args: Args): Timer;
28
29
  static counted(period: number, count: number, callback: (this: void, timer: Timer) => void): Timer;
@@ -12,6 +12,10 @@ local ____objectPool = require("util.objectPool")
12
12
  local ObjectPool = ____objectPool.ObjectPool
13
13
  local ____destroyable = require("destroyable")
14
14
  local AbstractDestroyable = ____destroyable.AbstractDestroyable
15
+ local ____callback_2Darray = require("utility.callback-array")
16
+ local addCallback = ____callback_2Darray.addCallback
17
+ local callbackArray = ____callback_2Darray.callbackArray
18
+ local consumeCallbacks = ____callback_2Darray.consumeCallbacks
15
19
  local createTimer = CreateTimer
16
20
  local timerStart = TimerStart
17
21
  local pauseTimer = PauseTimer
@@ -24,6 +28,7 @@ local getHandleId = GetHandleId
24
28
  local ____pcall = _G.pcall
25
29
  local ____print = _G.print
26
30
  local select = _G.select
31
+ local ____type = _G.type
27
32
  local safeCall = warpack.safeCall
28
33
  local corunning = coroutine.running
29
34
  local coresume = coroutine.resume
@@ -48,6 +53,12 @@ local function timerSafeCall()
48
53
  end
49
54
  end
50
55
  end
56
+ local zeroTimerScheduled = false
57
+ local zeroTimerCallbacks = callbackArray()
58
+ local function invokeZeroTimerCallbacks()
59
+ zeroTimerScheduled = false
60
+ consumeCallbacks(zeroTimerCallbacks)
61
+ end
51
62
  ____exports.Timer = __TS__Class()
52
63
  local Timer = ____exports.Timer
53
64
  Timer.name = "Timer"
@@ -81,8 +92,16 @@ end
81
92
  function Timer.create(self)
82
93
  return __TS__New(____exports.Timer)
83
94
  end
84
- function Timer.run(self, callback, ...)
85
- ____exports.Timer:simple(0, callback, ...)
95
+ function Timer.run(self, objectOrCallback, keyOrFirstArg, ...)
96
+ if not zeroTimerScheduled then
97
+ zeroTimerScheduled = true
98
+ ____exports.Timer:simple(0, invokeZeroTimerCallbacks)
99
+ end
100
+ if ____type(objectOrCallback) == "function" then
101
+ addCallback(zeroTimerCallbacks, objectOrCallback, keyOrFirstArg, ...)
102
+ else
103
+ addCallback(zeroTimerCallbacks, objectOrCallback[keyOrFirstArg], objectOrCallback, ...)
104
+ end
86
105
  end
87
106
  function Timer.simple(self, timeout, callback, ...)
88
107
  local timer = __TS__New(____exports.Timer)
package/decl/native.d.ts CHANGED
@@ -388,13 +388,15 @@ declare interface jmovetype extends jhandle {
388
388
  declare interface jtargetflag extends jhandle {
389
389
  __jtargetflag: never
390
390
  }
391
- declare interface jarmortype extends jhandle {
391
+ declare type jarmortype = symbol &
392
+ jhandle & {
392
393
  __jarmortype: never
393
394
  }
394
395
  declare interface jheroattribute extends jhandle {
395
396
  __jheroattribute: never
396
397
  }
397
- declare interface jdefensetype extends jhandle {
398
+ declare type jdefensetype = symbol &
399
+ jhandle & {
398
400
  __jdefensetype: never
399
401
  }
400
402
  declare interface jregentype extends jhandle {
@@ -1,5 +1,6 @@
1
1
  /** @noSelfInFile */
2
2
  import { AbstractDestroyable, Destructor } from "../destroyable";
3
+ import { Event } from "../event";
3
4
  export type BehaviorConstructor<T extends Behavior<AnyNotNil>, Parameters extends any[] = any[]> = OmitConstructor<typeof Behavior<any>> & (abstract new (...parameters: Parameters) => T);
4
5
  declare const enum BehaviorPropertyKey {
5
6
  PREVIOUS_BEHAVIOR = 0,
@@ -13,6 +14,8 @@ export declare abstract class Behavior<T extends AnyNotNil, PeriodicActionParame
13
14
  private [BehaviorPropertyKey.TIMER]?;
14
15
  protected constructor(object: T);
15
16
  protected onDestroy(): Destructor;
17
+ protected registerEvent<K extends string, Args extends any[]>(this: Behavior<any, PeriodicActionParameters> & Record<K, (this: this, ...args: Args) => unknown>, event: Event<[...Args]>, listener: K): void;
18
+ protected deregisterEvent(event: Event<any>): boolean;
16
19
  protected onPeriod(...parameters: PeriodicActionParameters): void;
17
20
  protected startPeriodicAction(interval: number, ...parameters: PeriodicActionParameters): void;
18
21
  protected stopPeriodicAction(): void;
@@ -24,5 +27,7 @@ export declare abstract class Behavior<T extends AnyNotNil, PeriodicActionParame
24
27
  static forFirst<T extends Behavior<AnyNotNil>, ConstructorParameters extends any[], K extends KeysOfType<T, (this: T, ...args: any) => any>>(this: BehaviorConstructor<T, ConstructorParameters>, object: T extends Behavior<infer Object> ? Object : never, count: number, key: K, ...parameters: T[K] extends (this: T, ...args: any) => any ? Parameters<T[K]> : never): number;
25
28
  static forAll<T extends Behavior<AnyNotNil>, ConstructorParameters extends any[], ConsumerParameters extends any[]>(this: BehaviorConstructor<T, ConstructorParameters>, object: T extends Behavior<infer Object> ? Object : never, consumer: (this: void, behavior: T, ...parameters: ConsumerParameters) => unknown, ...parameters: ConsumerParameters): number;
26
29
  static forAll<T extends Behavior<AnyNotNil>, ConstructorParameters extends any[], K extends KeysOfType<T, (this: T, ...args: any) => any>>(this: BehaviorConstructor<T, ConstructorParameters>, object: T extends Behavior<infer Object> ? Object : never, key: K, ...parameters: T[K] extends (this: T, ...args: any) => any ? Parameters<T[K]> : never): number;
30
+ static reduce<T extends Behavior<AnyNotNil>, ConstructorParameters extends any[], ConsumerParameters extends any[], Accumulator, R>(this: BehaviorConstructor<T, ConstructorParameters>, object: T extends Behavior<infer Object> ? Object : never, operation: (this: void, accumulator: Accumulator, value: R) => Accumulator, initial: Accumulator, consumer: (this: void, behavior: T, ...parameters: ConsumerParameters) => R, ...parameters: ConsumerParameters): Accumulator;
31
+ static reduce<T extends Behavior<AnyNotNil>, ConstructorParameters extends any[], Accumulator, R, K extends KeysOfType<T, (this: T, ...args: any) => R>>(this: BehaviorConstructor<T, ConstructorParameters>, object: T extends Behavior<infer Object> ? Object : never, operation: (this: void, accumulator: Accumulator, value: R) => Accumulator, initial: Accumulator, key: K, ...parameters: T[K] extends (this: T, ...args: any) => R ? Parameters<T[K]> : never): Accumulator;
27
32
  }
28
33
  export {};
@@ -1,18 +1,63 @@
1
1
  local ____lualib = require("lualib_bundle")
2
+ local __TS__InstanceOf = ____lualib.__TS__InstanceOf
2
3
  local __TS__Class = ____lualib.__TS__Class
3
4
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
- local __TS__InstanceOf = ____lualib.__TS__InstanceOf
5
+ local __TS__New = ____lualib.__TS__New
5
6
  local ____exports = {}
6
7
  local ____destroyable = require("destroyable")
7
8
  local AbstractDestroyable = ____destroyable.AbstractDestroyable
8
9
  local ____timer = require("core.types.timer")
9
10
  local Timer = ____timer.Timer
11
+ local ____functions = require("utility.functions")
12
+ local increment = ____functions.increment
13
+ local ____linked_2Dset = require("utility.linked-set")
14
+ local LinkedSet = ____linked_2Dset.LinkedSet
15
+ local ____lua_2Dmaps = require("utility.lua-maps")
16
+ local getOrPut = ____lua_2Dmaps.getOrPut
17
+ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
18
+ local ____lua_2Dsets = require("utility.lua-sets")
19
+ local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
10
20
  local safeCall = warpack.safeCall
11
21
  local firstBehaviorByObject = {}
12
22
  local lastBehaviorByObject = {}
13
23
  local function invokeBehaviorOnPeriod(behavior, ...)
14
24
  behavior.onPeriod(behavior, ...)
15
25
  end
26
+ local function reduceBehaviors(behaviorConstructor, object, operation, initial, consumerOrKey, ...)
27
+ local accumulator = initial
28
+ local behavior = firstBehaviorByObject[object]
29
+ if behavior ~= nil then
30
+ if type(consumerOrKey) == "function" then
31
+ repeat
32
+ do
33
+ if __TS__InstanceOf(behavior, behaviorConstructor) then
34
+ local isSuccessful, result = safeCall(consumerOrKey, behavior, ...)
35
+ if isSuccessful then
36
+ accumulator = operation(accumulator, result)
37
+ end
38
+ end
39
+ behavior = behavior[1]
40
+ end
41
+ until not (behavior ~= nil)
42
+ else
43
+ repeat
44
+ do
45
+ if __TS__InstanceOf(behavior, behaviorConstructor) then
46
+ local isSuccessful, result = safeCall(behavior[consumerOrKey], behavior, ...)
47
+ if isSuccessful then
48
+ accumulator = operation(accumulator, result)
49
+ end
50
+ end
51
+ behavior = behavior[1]
52
+ end
53
+ until not (behavior ~= nil)
54
+ end
55
+ end
56
+ return accumulator
57
+ end
58
+ local behaviorsByEvent = {}
59
+ local listenerByBehaviorByEvent = {}
60
+ local eventsByBehavior = {}
16
61
  ____exports.Behavior = __TS__Class()
17
62
  local Behavior = ____exports.Behavior
18
63
  Behavior.name = "Behavior"
@@ -35,6 +80,20 @@ function Behavior.prototype.onDestroy(self)
35
80
  if ____opt_0 ~= nil then
36
81
  ____opt_0:destroy()
37
82
  end
83
+ local events = eventsByBehavior[self]
84
+ if events ~= nil then
85
+ for event in pairs(events) do
86
+ local ____opt_2 = behaviorsByEvent[event]
87
+ if ____opt_2 ~= nil then
88
+ ____opt_2:remove(self)
89
+ end
90
+ local ____opt_4 = listenerByBehaviorByEvent[event]
91
+ if ____opt_4 ~= nil then
92
+ ____opt_4[self] = nil
93
+ end
94
+ end
95
+ eventsByBehavior[self] = nil
96
+ end
38
97
  local previousBehavior = self[0]
39
98
  local nextBehavior = self[1]
40
99
  if previousBehavior ~= nil then
@@ -49,6 +108,34 @@ function Behavior.prototype.onDestroy(self)
49
108
  end
50
109
  return AbstractDestroyable.prototype.onDestroy(self)
51
110
  end
111
+ function Behavior.prototype.registerEvent(self, event, listener)
112
+ local listenerByBehavior = getOrPut(listenerByBehaviorByEvent, event, mutableLuaMap)
113
+ listenerByBehavior[self] = listener
114
+ getOrPut(eventsByBehavior, self, mutableLuaSet)[event] = true
115
+ local behaviors = behaviorsByEvent[event]
116
+ if behaviors == nil then
117
+ event:addListener(function(...)
118
+ local behaviors = behaviorsByEvent[event]
119
+ if behaviors ~= nil then
120
+ for behavior in pairs(behaviors) do
121
+ safeCall(behavior[listenerByBehavior[behavior]], behavior, ...)
122
+ end
123
+ end
124
+ end)
125
+ behaviors = __TS__New(LinkedSet)
126
+ behaviorsByEvent[event] = behaviors
127
+ end
128
+ behaviors:add(self)
129
+ end
130
+ function Behavior.prototype.deregisterEvent(self, event)
131
+ local behaviors = behaviorsByEvent[event]
132
+ if behaviors ~= nil and behaviors:remove(self) then
133
+ eventsByBehavior[self][event] = nil
134
+ listenerByBehaviorByEvent[event][self] = nil
135
+ return true
136
+ end
137
+ return false
138
+ end
52
139
  function Behavior.prototype.onPeriod(self, ...)
53
140
  end
54
141
  function Behavior.prototype.startPeriodicAction(self, interval, ...)
@@ -151,31 +238,23 @@ function Behavior.forFirst(self, object, count, consumerOrKey, ...)
151
238
  return behaviorsCount
152
239
  end
153
240
  function Behavior.forAll(self, object, consumerOrKey, ...)
154
- local behaviorsCount = 0
155
- local behavior = firstBehaviorByObject[object]
156
- if behavior ~= nil then
157
- if type(consumerOrKey) == "function" then
158
- repeat
159
- do
160
- if __TS__InstanceOf(behavior, self) then
161
- safeCall(consumerOrKey, behavior, ...)
162
- behaviorsCount = behaviorsCount + 1
163
- end
164
- behavior = behavior[1]
165
- end
166
- until not (behavior ~= nil)
167
- else
168
- repeat
169
- do
170
- if __TS__InstanceOf(behavior, self) then
171
- safeCall(behavior[consumerOrKey], behavior, ...)
172
- behaviorsCount = behaviorsCount + 1
173
- end
174
- behavior = behavior[1]
175
- end
176
- until not (behavior ~= nil)
177
- end
178
- end
179
- return behaviorsCount
241
+ return reduceBehaviors(
242
+ self,
243
+ object,
244
+ increment,
245
+ 0,
246
+ consumerOrKey,
247
+ ...
248
+ )
249
+ end
250
+ function Behavior.reduce(self, object, operation, initial, consumerOrKey, ...)
251
+ return reduceBehaviors(
252
+ self,
253
+ object,
254
+ operation,
255
+ initial,
256
+ consumerOrKey,
257
+ ...
258
+ )
180
259
  end
181
260
  return ____exports
@@ -148,7 +148,7 @@ function ApplyBuffChannelingTargetAbilityBehavior.prototype.onStop(self)
148
148
  self.buff = nil
149
149
  end
150
150
  end
151
- Buff.destroyEvent:addListener(function(buff)
151
+ Buff.beingDestroyedEvent:addListener(function(buff)
152
152
  local behavior = behaviorByBuff[buff]
153
153
  if behavior ~= nil then
154
154
  behaviorByBuff[buff] = nil
@@ -2,5 +2,5 @@
2
2
  import { AbilityBehavior } from "../ability";
3
3
  import { Unit } from "../../internal/unit";
4
4
  export declare abstract class EmulateImpactAbilityBehavior extends AbilityBehavior {
5
- protected emulateImpact(caster: Unit): void;
5
+ protected emulateImpact(caster: Unit): boolean;
6
6
  }
@@ -1,9 +1,12 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
+ local __TS__InstanceOf = ____lualib.__TS__InstanceOf
4
5
  local ____exports = {}
5
6
  local ____ability = require("engine.behaviour.ability")
6
7
  local AbilityBehavior = ____ability.AbilityBehavior
8
+ local ____unit = require("engine.internal.unit")
9
+ local Unit = ____unit.Unit
7
10
  local ____ability = require("engine.standard.fields.ability")
8
11
  local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
9
12
  local MANA_COST_ABILITY_INTEGER_LEVEL_FIELD = ____ability.MANA_COST_ABILITY_INTEGER_LEVEL_FIELD
@@ -13,6 +16,10 @@ local MINIMUM_POSITIVE_NORMALIZED_FLOAT = ____math.MINIMUM_POSITIVE_NORMALIZED_F
13
16
  local ____sound = require("core.types.sound")
14
17
  local Sound3D = ____sound.Sound3D
15
18
  local SoundSettings = ____sound.SoundSettings
19
+ local ____ability = require("engine.internal.ability")
20
+ local UnitAbility = ____ability.UnitAbility
21
+ local ____event = require("event")
22
+ local Event = ____event.Event
16
23
  ____exports.EmulateImpactAbilityBehavior = __TS__Class()
17
24
  local EmulateImpactAbilityBehavior = ____exports.EmulateImpactAbilityBehavior
18
25
  EmulateImpactAbilityBehavior.name = "EmulateImpactAbilityBehavior"
@@ -20,8 +27,8 @@ __TS__ClassExtends(EmulateImpactAbilityBehavior, AbilityBehavior)
20
27
  function EmulateImpactAbilityBehavior.prototype.emulateImpact(self, caster)
21
28
  local manaCost = self:resolveCurrentAbilityDependentValue(MANA_COST_ABILITY_INTEGER_LEVEL_FIELD)
22
29
  local cooldown = self:resolveCurrentAbilityDependentValue(COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD)
23
- if self.ability.cooldownRemaining ~= 0 or caster.mana < manaCost then
24
- return
30
+ if self.ability.cooldownRemaining ~= 0 or caster.mana < manaCost or __TS__InstanceOf(self.ability, UnitAbility) and self.ability.isDisabled then
31
+ return false
25
32
  end
26
33
  caster.mana = caster.mana - manaCost
27
34
  self.ability.cooldownRemaining = max(cooldown, MINIMUM_POSITIVE_NORMALIZED_FLOAT)
@@ -30,6 +37,7 @@ function EmulateImpactAbilityBehavior.prototype.emulateImpact(self, caster)
30
37
  if soundPresetId ~= "" then
31
38
  Sound3D:playFromLabel(soundPresetId, SoundSettings.Ability, caster)
32
39
  end
33
- AbilityBehavior:forAll(self.ability, "onImpact", caster)
40
+ Event.invoke(Unit.abilityImpactEvent, caster, self.ability)
41
+ return true
34
42
  end
35
43
  return ____exports
@@ -8,7 +8,7 @@ export declare class RestoreManaSelfAbilityBehavior extends AbilityBehavior {
8
8
  constructor(ability: Ability, mana: AbilityDependentValue<number>);
9
9
  onImpact(caster: Unit): void;
10
10
  }
11
- export declare class RestoreManaAbilityBehavior extends AbilityBehavior {
11
+ export declare class RestoreManaTargetAbilityBehavior extends AbilityBehavior {
12
12
  private readonly mana;
13
13
  constructor(ability: Ability, mana: AbilityDependentValue<number>);
14
14
  onUnitTargetImpact(caster: Unit, target: Unit): void;
@@ -15,15 +15,15 @@ end
15
15
  function RestoreManaSelfAbilityBehavior.prototype.onImpact(self, caster)
16
16
  caster.mana = caster.mana + self:resolveCurrentAbilityDependentValue(self.mana)
17
17
  end
18
- ____exports.RestoreManaAbilityBehavior = __TS__Class()
19
- local RestoreManaAbilityBehavior = ____exports.RestoreManaAbilityBehavior
20
- RestoreManaAbilityBehavior.name = "RestoreManaAbilityBehavior"
21
- __TS__ClassExtends(RestoreManaAbilityBehavior, AbilityBehavior)
22
- function RestoreManaAbilityBehavior.prototype.____constructor(self, ability, mana)
18
+ ____exports.RestoreManaTargetAbilityBehavior = __TS__Class()
19
+ local RestoreManaTargetAbilityBehavior = ____exports.RestoreManaTargetAbilityBehavior
20
+ RestoreManaTargetAbilityBehavior.name = "RestoreManaTargetAbilityBehavior"
21
+ __TS__ClassExtends(RestoreManaTargetAbilityBehavior, AbilityBehavior)
22
+ function RestoreManaTargetAbilityBehavior.prototype.____constructor(self, ability, mana)
23
23
  AbilityBehavior.prototype.____constructor(self, ability)
24
24
  self.mana = mana
25
25
  end
26
- function RestoreManaAbilityBehavior.prototype.onUnitTargetImpact(self, caster, target)
26
+ function RestoreManaTargetAbilityBehavior.prototype.onUnitTargetImpact(self, caster, target)
27
27
  target.mana = target.mana + self:resolveCurrentAbilityDependentValue(self.mana)
28
28
  end
29
29
  return ____exports
@@ -5,7 +5,6 @@ local __TS__InstanceOf = ____lualib.__TS__InstanceOf
5
5
  local __TS__New = ____lualib.__TS__New
6
6
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
7
7
  local ____exports = {}
8
- local createUnitEventListener
9
8
  local ____behavior = require("engine.behavior")
10
9
  local Behavior = ____behavior.Behavior
11
10
  local ____unit = require("engine.unit")
@@ -30,17 +29,9 @@ local ____ability = require("engine.object-field.ability")
30
29
  local AbilityField = ____ability.AbilityField
31
30
  local AbilityLevelField = ____ability.AbilityLevelField
32
31
  local resolveCurrentAbilityDependentValue = ____ability.resolveCurrentAbilityDependentValue
33
- local ____timer = require("core.types.timer")
34
- local Timer = ____timer.Timer
35
32
  local createBehaviorFunctionsByAbilityTypeId = {}
36
33
  local exclusiveOnImpactHandlerAbilityBehaviorByAbility = setmetatable({}, {__mode = "k"})
37
- local function createZeroTimerUnitEventListener(key)
38
- local unitEventListener = createUnitEventListener(key)
39
- return function(unit, ability, ...)
40
- Timer:run(unitEventListener, unit, ability, ...)
41
- end
42
- end
43
- createUnitEventListener = function(key)
34
+ local function createUnitEventListener(key)
44
35
  return function(unit, ability, ...)
45
36
  ____exports.AbilityBehavior:forAll(ability, key, unit, ...)
46
37
  end
@@ -274,13 +265,13 @@ __TS__SetDescriptor(
274
265
  Unit.abilityDestructibleTargetChannelingStartEvent:addListener(createUnitEventListener("onDestructibleTargetChannelingStart"))
275
266
  Unit.abilityPointTargetChannelingStartEvent:addListener(createUnitEventListener("onPointTargetChannelingStart"))
276
267
  Unit.abilityNoTargetChannelingStartEvent:addListener(createUnitEventListener("onNoTargetChannelingStart"))
277
- Unit.abilityChannelingStartEvent:addListener(createZeroTimerUnitEventListener("onImpact"))
278
- Unit.abilityWidgetTargetChannelingStartEvent:addListener(createZeroTimerUnitEventListener("onWidgetTargetImpact"))
279
- Unit.abilityUnitTargetChannelingStartEvent:addListener(createZeroTimerUnitEventListener("onUnitTargetImpact"))
280
- Unit.abilityItemTargetChannelingStartEvent:addListener(createZeroTimerUnitEventListener("onItemTargetImpact"))
281
- Unit.abilityDestructibleTargetChannelingStartEvent:addListener(createZeroTimerUnitEventListener("onDestructibleTargetImpact"))
282
- Unit.abilityPointTargetChannelingStartEvent:addListener(createZeroTimerUnitEventListener("onPointTargetImpact"))
283
- Unit.abilityNoTargetChannelingStartEvent:addListener(createZeroTimerUnitEventListener("onNoTargetImpact"))
268
+ Unit.abilityImpactEvent:addListener(createUnitEventListener("onImpact"))
269
+ Unit.abilityWidgetTargetImpactEvent:addListener(createUnitEventListener("onWidgetTargetImpact"))
270
+ Unit.abilityUnitTargetImpactEvent:addListener(createUnitEventListener("onUnitTargetImpact"))
271
+ Unit.abilityItemTargetImpactEvent:addListener(createUnitEventListener("onItemTargetImpact"))
272
+ Unit.abilityDestructibleTargetImpactEvent:addListener(createUnitEventListener("onDestructibleTargetImpact"))
273
+ Unit.abilityPointTargetImpactEvent:addListener(createUnitEventListener("onPointTargetImpact"))
274
+ Unit.abilityNoTargetImpactEvent:addListener(createUnitEventListener("onNoTargetImpact"))
284
275
  Unit.abilityChannelingFinishEvent:addListener(createUnitEventListener("onChannelingFinish"))
285
276
  Unit.abilityStopEvent:addListener(createUnitEventListener("onStop"))
286
277
  end)(AbilityBehavior)
@@ -10,9 +10,11 @@ export type StunImmunityUnitBehaviourParameters = {
10
10
  textTagText?: string;
11
11
  };
12
12
  export declare class StunImmunityUnitBehavior extends UnitBehavior {
13
- private readonly parameters;
13
+ readonly parameters: Readonly<StunImmunityUnitBehaviourParameters>;
14
14
  static defaultParameters: StunImmunityUnitBehaviourParameters;
15
- constructor(unit: Unit, parameters?: StunImmunityUnitBehaviourParameters);
15
+ constructor(unit: Unit, parameters?: Readonly<StunImmunityUnitBehaviourParameters>);
16
16
  protected onDestroy(): Destructor;
17
- private onBuffsCheck;
17
+ onDamageReceived(): void;
18
+ onTargetingAbilityChannelingStart(): void;
19
+ onTargetingAbilityImpact(): void;
18
20
  }