warscript 0.0.1-dev.eda504c → 0.0.1-dev.ee6e396

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/player.d.ts +16 -0
  2. package/core/types/player.lua +57 -14
  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/remove-buffs.d.ts +9 -0
  11. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  12. package/engine/behaviour/ability.d.ts +6 -1
  13. package/engine/behaviour/ability.lua +31 -1
  14. package/engine/behaviour/unit/stun-immunity.d.ts +7 -5
  15. package/engine/behaviour/unit/stun-immunity.lua +6 -5
  16. package/engine/behaviour/unit.d.ts +7 -3
  17. package/engine/behaviour/unit.lua +101 -24
  18. package/engine/buff.d.ts +19 -4
  19. package/engine/buff.lua +122 -41
  20. package/engine/internal/mechanics/cast-ability.lua +6 -3
  21. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  22. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  23. package/engine/internal/unit/attributes.d.ts +17 -0
  24. package/engine/internal/unit/attributes.lua +46 -0
  25. package/engine/internal/unit/bonus.d.ts +2 -0
  26. package/engine/internal/unit/bonus.lua +10 -0
  27. package/engine/internal/unit/fly-height.d.ts +7 -0
  28. package/engine/internal/unit/fly-height.lua +20 -0
  29. package/engine/internal/unit/interrupts.d.ts +12 -0
  30. package/engine/internal/unit/interrupts.lua +28 -0
  31. package/engine/internal/unit/main-selected.lua +12 -27
  32. package/engine/internal/unit/range-event.d.ts +12 -0
  33. package/engine/internal/unit/range-event.lua +90 -0
  34. package/engine/internal/unit/scale.d.ts +7 -0
  35. package/engine/internal/unit/scale.lua +20 -0
  36. package/engine/internal/unit-missile-launch.lua +16 -6
  37. package/engine/internal/unit.d.ts +13 -19
  38. package/engine/internal/unit.lua +140 -173
  39. package/engine/local-client.d.ts +2 -0
  40. package/engine/local-client.lua +30 -0
  41. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  42. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  43. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  44. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  45. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  46. package/engine/object-data/entry/destructible-type.lua +155 -0
  47. package/engine/object-data/entry/unit-type.d.ts +4 -0
  48. package/engine/object-data/entry/unit-type.lua +76 -32
  49. package/engine/object-field/unit.d.ts +20 -5
  50. package/engine/object-field/unit.lua +61 -0
  51. package/engine/object-field.d.ts +9 -1
  52. package/engine/object-field.lua +265 -122
  53. package/engine/standard/fields/ability.d.ts +2 -2
  54. package/engine/standard/fields/ability.lua +2 -2
  55. package/engine/standard/fields/unit.d.ts +11 -3
  56. package/engine/standard/fields/unit.lua +15 -2
  57. package/engine/synchronization.d.ts +11 -0
  58. package/engine/synchronization.lua +77 -0
  59. package/engine/text-tag.lua +2 -1
  60. package/engine/unit.d.ts +5 -0
  61. package/engine/unit.lua +5 -0
  62. package/net/socket.lua +1 -1
  63. package/objutil/buff.lua +9 -7
  64. package/package.json +2 -2
  65. package/patch-lua.lua +15 -0
  66. package/utility/linked-map.d.ts +34 -0
  67. package/utility/linked-map.lua +101 -0
  68. package/utility/linked-set.d.ts +3 -1
  69. package/utility/linked-set.lua +38 -0
  70. package/utility/records.lua +20 -1
@@ -7,6 +7,18 @@ import { UpgradeId } from "../../engine/object-data/entry/upgrade";
7
7
  interface Unit {
8
8
  handle: junit;
9
9
  }
10
+ export declare const enum PlayerAllianceType {
11
+ PASSIVE = 0,
12
+ RESCUABLE = 1,
13
+ HELP_REQUEST = 2,
14
+ HELP_RESPONSE = 3,
15
+ SHARED_XP = 4,
16
+ SHARED_SPELLS = 5,
17
+ SHARED_VISION = 6,
18
+ SHARED_VISION_FORCED = 7,
19
+ SHARED_CONTROL = 8,
20
+ SHARED_ADVANCED_CONTROL = 9
21
+ }
10
22
  export declare class Player extends Handle<jplayer> {
11
23
  static readonly all: Player[];
12
24
  static readonly local: Player;
@@ -42,6 +54,8 @@ export declare class Player extends Handle<jplayer> {
42
54
  forceUICancel(): void;
43
55
  isAllyOf(other: Player): boolean;
44
56
  isEnemyOf(other: Player): boolean;
57
+ setAlliance(other: Player, type: PlayerAllianceType, value: boolean): void;
58
+ getAlliance(other: Player, type: PlayerAllianceType): boolean;
45
59
  setAbilityAvailable(abilityId: number, available: boolean): void;
46
60
  getMaximumUpgradeLevel(upgradeId: UpgradeId): number;
47
61
  setMaximumUpgradeLevel(upgradeId: UpgradeId, maximumLevel: number): void;
@@ -50,6 +64,7 @@ export declare class Player extends Handle<jplayer> {
50
64
  setUpgradeLevel(upgradeId: UpgradeId, level: number): void;
51
65
  private static getEvent;
52
66
  private static getMouseEvent;
67
+ static get allianceChangedEvent(): Readonly<Record<PlayerAllianceType, Event<[Player]>>>;
53
68
  static get onLeave(): Event<[Player]>;
54
69
  static get onMouseDown(): Event<[Player, jmousebuttontype]>;
55
70
  static get onMouseUp(): Event<[Player, jmousebuttontype]>;
@@ -66,6 +81,7 @@ export declare class Player extends Handle<jplayer> {
66
81
  };
67
82
  };
68
83
  static get onChat(): Event<[player: Player, message: string]>;
84
+ static readonly colorChangedEvent: Event<[Player]>;
69
85
  static byId(id: number): Player | undefined;
70
86
  }
71
87
  export {};
@@ -1,7 +1,7 @@
1
1
  local ____lualib = require("lualib_bundle")
2
+ local __TS__New = ____lualib.__TS__New
2
3
  local __TS__Class = ____lualib.__TS__Class
3
4
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
- local __TS__New = ____lualib.__TS__New
5
5
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
6
6
  local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
7
7
  local ____exports = {}
@@ -23,14 +23,33 @@ local ____math = require("math")
23
23
  local MAXIMUM_INTEGER = ____math.MAXIMUM_INTEGER
24
24
  local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
25
25
  local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
26
+ local ____lazy = require("utility.lazy")
27
+ local lazyRecord = ____lazy.lazyRecord
28
+ local getPlayerAlliance = GetPlayerAlliance
26
29
  local getPlayerColor = GetPlayerColor
27
30
  local getPlayerName = GetPlayerName
28
31
  local getPlayerTechCount = GetPlayerTechCount
29
32
  local getPlayerTechMaxAllowed = GetPlayerTechMaxAllowed
33
+ local getTriggerPlayer = GetTriggerPlayer
34
+ local setPlayerAlliance = SetPlayerAlliance
30
35
  local setPlayerTechMaxAllowed = SetPlayerTechMaxAllowed
31
36
  local setPlayerTechResearched = SetPlayerTechResearched
32
37
  local setPlayerAbilityAvailable = SetPlayerAbilityAvailable
38
+ local triggerRegisterPlayerAllianceChange = TriggerRegisterPlayerAllianceChange
33
39
  local playerNative = _G.Player
40
+ local nativeByPlayerAllianceType = {
41
+ [0] = ALLIANCE_PASSIVE,
42
+ [1] = ALLIANCE_RESCUABLE,
43
+ [2] = ALLIANCE_HELP_REQUEST,
44
+ [3] = ALLIANCE_HELP_RESPONSE,
45
+ [4] = ALLIANCE_SHARED_XP,
46
+ [5] = ALLIANCE_SHARED_SPELLS,
47
+ [6] = ALLIANCE_SHARED_VISION,
48
+ [7] = ALLIANCE_SHARED_VISION_FORCED,
49
+ [8] = ALLIANCE_SHARED_CONTROL,
50
+ [9] = ALLIANCE_SHARED_ADVANCED_CONTROL
51
+ }
52
+ local playerColorChangedEvent = __TS__New(Event)
34
53
  ____exports.Player = __TS__Class()
35
54
  local Player = ____exports.Player
36
55
  Player.name = "Player"
@@ -85,6 +104,12 @@ end
85
104
  function Player.prototype.isEnemyOf(self, other)
86
105
  return IsPlayerEnemy(self.handle, other.handle)
87
106
  end
107
+ function Player.prototype.setAlliance(self, other, ____type, value)
108
+ setPlayerAlliance(self.handle, other.handle, nativeByPlayerAllianceType[____type], value)
109
+ end
110
+ function Player.prototype.getAlliance(self, other, ____type)
111
+ return getPlayerAlliance(self.handle, other.handle, nativeByPlayerAllianceType[____type])
112
+ end
88
113
  function Player.prototype.setAbilityAvailable(self, abilityId, available)
89
114
  setPlayerAbilityAvailable(self.handle, abilityId, available)
90
115
  end
@@ -124,14 +149,11 @@ function Player.getMouseEvent(self, event, collector)
124
149
  self.events[eventId] = __TS__New(
125
150
  TriggerEvent,
126
151
  function(trigger)
127
- Timer:simple(
128
- 0,
129
- function()
130
- for ____, player in ipairs(____exports.Player.all) do
131
- TriggerRegisterPlayerEvent(trigger, player.handle, event)
132
- end
152
+ Timer:run(function()
153
+ for ____, player in ipairs(____exports.Player.all) do
154
+ TriggerRegisterPlayerEvent(trigger, player.handle, event)
133
155
  end
134
- )
156
+ end)
135
157
  end,
136
158
  collector or (function() return {} end)
137
159
  )
@@ -180,7 +202,7 @@ function Player.getKeyEvent(self, isDown)
180
202
  TriggerAddCondition(
181
203
  trigger,
182
204
  Condition(function()
183
- local player = ____exports.Player:of(GetTriggerPlayer())
205
+ local player = ____exports.Player:of(getTriggerPlayer())
184
206
  local key = BlzGetTriggerPlayerKey()
185
207
  local metaKey = BlzGetTriggerPlayerMetaKey()
186
208
  Event.invoke(event, player, key, metaKey)
@@ -279,6 +301,7 @@ __TS__SetDescriptor(
279
301
  end,
280
302
  set = function(self, color)
281
303
  SetPlayerColor(self.handle, color.handle)
304
+ Event.invoke(playerColorChangedEvent, self)
282
305
  end
283
306
  },
284
307
  true
@@ -369,13 +392,32 @@ __TS__SetDescriptor(
369
392
  end},
370
393
  true
371
394
  )
395
+ __TS__ObjectDefineProperty(
396
+ Player,
397
+ "allianceChangedEvent",
398
+ {get = function(self)
399
+ local event = lazyRecord(function(____type)
400
+ return __TS__New(
401
+ TriggerEvent,
402
+ function(trigger)
403
+ for ____, player in ipairs(____exports.Player.all) do
404
+ triggerRegisterPlayerAllianceChange(trigger, player.handle, nativeByPlayerAllianceType[____type])
405
+ end
406
+ end,
407
+ function() return ____exports.Player:of(getTriggerPlayer()) end
408
+ )
409
+ end)
410
+ rawset(self, "allianceChangedEvent", event)
411
+ return event
412
+ end}
413
+ )
372
414
  __TS__ObjectDefineProperty(
373
415
  Player,
374
416
  "onLeave",
375
417
  {get = function(self)
376
418
  return ____exports.Player:getEvent(
377
419
  EVENT_PLAYER_LEAVE,
378
- function() return ____exports.Player:of(GetTriggerPlayer()) end
420
+ function() return ____exports.Player:of(getTriggerPlayer()) end
379
421
  )
380
422
  end}
381
423
  )
@@ -385,7 +427,7 @@ __TS__ObjectDefineProperty(
385
427
  {get = function(self)
386
428
  return ____exports.Player:getMouseEvent(
387
429
  EVENT_PLAYER_MOUSE_DOWN,
388
- function() return ____exports.Player:of(GetTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
430
+ function() return ____exports.Player:of(getTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
389
431
  )
390
432
  end}
391
433
  )
@@ -395,7 +437,7 @@ __TS__ObjectDefineProperty(
395
437
  {get = function(self)
396
438
  return ____exports.Player:getMouseEvent(
397
439
  EVENT_PLAYER_MOUSE_UP,
398
- function() return ____exports.Player:of(GetTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
440
+ function() return ____exports.Player:of(getTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
399
441
  )
400
442
  end}
401
443
  )
@@ -405,7 +447,7 @@ __TS__ObjectDefineProperty(
405
447
  {get = function(self)
406
448
  return ____exports.Player:getMouseEvent(
407
449
  EVENT_PLAYER_MOUSE_MOVE,
408
- function() return ____exports.Player:of(GetTriggerPlayer()), vec2(
450
+ function() return ____exports.Player:of(getTriggerPlayer()), vec2(
409
451
  BlzGetTriggerPlayerMouseX(),
410
452
  BlzGetTriggerPlayerMouseY()
411
453
  ) end
@@ -441,10 +483,11 @@ __TS__ObjectDefineProperty(
441
483
  TriggerRegisterPlayerChatEvent(trigger, player.handle, "", false)
442
484
  end
443
485
  end,
444
- function() return ____exports.Player:of(GetTriggerPlayer()), GetEventPlayerChatString() end
486
+ function() return ____exports.Player:of(getTriggerPlayer()), GetEventPlayerChatString() end
445
487
  )
446
488
  rawset(self, "onChat", event)
447
489
  return event
448
490
  end}
449
491
  )
492
+ Player.colorChangedEvent = playerColorChangedEvent
450
493
  return ____exports
@@ -1,5 +1,6 @@
1
1
  /** @noSelfInFile */
2
- export declare class TileCell implements Readonly<Vec2> {
2
+ import { AttributesHolder } from "../../attributes";
3
+ export declare class TileCell extends AttributesHolder implements Readonly<Vec2> {
3
4
  private readonly id;
4
5
  readonly x: number;
5
6
  readonly y: number;
@@ -1,8 +1,11 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
+ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
3
4
  local __TS__New = ____lualib.__TS__New
4
5
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
6
  local ____exports = {}
7
+ local ____attributes = require("attributes")
8
+ local AttributesHolder = ____attributes.AttributesHolder
6
9
  local getTerrainType = GetTerrainType
7
10
  local setTerrainType = SetTerrainType
8
11
  local getTerrainVariance = GetTerrainVariance
@@ -13,7 +16,9 @@ local tileCellById = {}
13
16
  ____exports.TileCell = __TS__Class()
14
17
  local TileCell = ____exports.TileCell
15
18
  TileCell.name = "TileCell"
19
+ __TS__ClassExtends(TileCell, AttributesHolder)
16
20
  function TileCell.prototype.____constructor(self, id, x, y, z)
21
+ AttributesHolder.prototype.____constructor(self)
17
22
  self.id = id
18
23
  self.x = x
19
24
  self.y = y
package/destroyable.d.ts CHANGED
@@ -10,6 +10,7 @@ export interface Destroyable {
10
10
  destroy(): void;
11
11
  }
12
12
  export declare abstract class AbstractDestroyable implements Destroyable {
13
+ get isDestroyed(): boolean;
13
14
  /**
14
15
  * An overriding function should always call the super one at the end of it,
15
16
  * in the following manner: `return super.onDestroy()`.
package/destroyable.lua CHANGED
@@ -1,6 +1,7 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__New = ____lualib.__TS__New
4
+ local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
4
5
  local ____exports = {}
5
6
  local ____exception = require("exception")
6
7
  local IllegalStateException = ____exception.IllegalStateException
@@ -28,4 +29,12 @@ function AbstractDestroyable.prototype.destroy(self)
28
29
  end
29
30
  return true
30
31
  end
32
+ __TS__SetDescriptor(
33
+ AbstractDestroyable.prototype,
34
+ "isDestroyed",
35
+ {get = function(self)
36
+ return stateByDestroyable[self] ~= nil
37
+ end},
38
+ true
39
+ )
31
40
  return ____exports
@@ -1,6 +1,11 @@
1
1
  /** @noSelfInFile */
2
2
  import { AbstractDestroyable, Destructor } from "../destroyable";
3
3
  import { Event } from "../event";
4
+ export declare const enum BehaviorPriority {
5
+ HIGH = 0,
6
+ MEDIUM = 1,
7
+ LOW = 2
8
+ }
4
9
  export type BehaviorConstructor<T extends Behavior<AnyNotNil>, Parameters extends any[] = any[]> = OmitConstructor<typeof Behavior<any>> & (abstract new (...parameters: Parameters) => T);
5
10
  declare const enum BehaviorPropertyKey {
6
11
  PREVIOUS_BEHAVIOR = 0,
@@ -9,12 +14,15 @@ declare const enum BehaviorPropertyKey {
9
14
  }
10
15
  export declare abstract class Behavior<T extends AnyNotNil, PeriodicActionParameters extends any[] = any[]> extends AbstractDestroyable {
11
16
  protected readonly object: T;
17
+ readonly priority: BehaviorPriority;
12
18
  private [BehaviorPropertyKey.PREVIOUS_BEHAVIOR]?;
13
19
  private [BehaviorPropertyKey.NEXT_BEHAVIOR]?;
14
20
  private [BehaviorPropertyKey.TIMER]?;
15
- protected constructor(object: T);
21
+ constructor(object: T, priority?: BehaviorPriority);
16
22
  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;
23
+ protected registerGlobalEvent<K extends string, Args extends any[]>(this: Behavior<any, PeriodicActionParameters> & Record<K, (this: this, ...args: Args) => unknown>, event: Event<[...Args]>, listener: K): void;
24
+ protected deregisterGlobalEvent(event: Event<any>): boolean;
25
+ protected registerEvent<K extends string, Args extends any[]>(this: Behavior<any, PeriodicActionParameters> & Record<K, (this: this, ...args: Args) => unknown>, event: Event<[...Args]>, extractObject: (...args: Args) => T | undefined, listener: K): void;
18
26
  protected deregisterEvent(event: Event<any>): boolean;
19
27
  protected onPeriod(...parameters: PeriodicActionParameters): void;
20
28
  protected startPeriodicAction(interval: number, ...parameters: PeriodicActionParameters): void;
@@ -18,56 +18,71 @@ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
18
18
  local ____lua_2Dsets = require("utility.lua-sets")
19
19
  local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
20
20
  local safeCall = warpack.safeCall
21
- local firstBehaviorByObject = {}
22
- local lastBehaviorByObject = {}
21
+ local firstBehaviorByObjectByPriority = {[0] = {}, [2] = {}, [1] = {}}
22
+ local lastBehaviorByObjectByPriority = {[0] = {}, [2] = {}, [1] = {}}
23
23
  local function invokeBehaviorOnPeriod(behavior, ...)
24
24
  behavior.onPeriod(behavior, ...)
25
25
  end
26
26
  local function reduceBehaviors(behaviorConstructor, object, operation, initial, consumerOrKey, ...)
27
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)
28
+ for priority = 0, 2 do
29
+ local behavior = firstBehaviorByObjectByPriority[priority][object]
30
+ if behavior ~= nil then
31
+ if type(consumerOrKey) == "function" then
32
+ repeat
33
+ do
34
+ if __TS__InstanceOf(behavior, behaviorConstructor) then
35
+ local isSuccessful, result = safeCall(consumerOrKey, behavior, ...)
36
+ if isSuccessful then
37
+ accumulator = operation(accumulator, result)
38
+ end
37
39
  end
40
+ behavior = behavior[1]
38
41
  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)
42
+ until not (behavior ~= nil)
43
+ else
44
+ repeat
45
+ do
46
+ if __TS__InstanceOf(behavior, behaviorConstructor) then
47
+ local isSuccessful, result = safeCall(behavior[consumerOrKey], behavior, ...)
48
+ if isSuccessful then
49
+ accumulator = operation(accumulator, result)
50
+ end
49
51
  end
52
+ behavior = behavior[1]
50
53
  end
51
- behavior = behavior[1]
52
- end
53
- until not (behavior ~= nil)
54
+ until not (behavior ~= nil)
55
+ end
54
56
  end
55
57
  end
56
58
  return accumulator
57
59
  end
60
+ local behaviorsByGlobalEvent = {}
61
+ local listenerByBehaviorByGlobalEvent = {}
62
+ local globalEventsByBehavior = {}
58
63
  local behaviorsByEvent = {}
59
64
  local listenerByBehaviorByEvent = {}
60
65
  local eventsByBehavior = {}
66
+ local function safeCallBehaviorListener(behavior, behaviors, listenerByBehavior, ...)
67
+ if behaviors[behavior] ~= nil then
68
+ safeCall(behavior[listenerByBehavior[behavior]], behavior, ...)
69
+ end
70
+ end
61
71
  ____exports.Behavior = __TS__Class()
62
72
  local Behavior = ____exports.Behavior
63
73
  Behavior.name = "Behavior"
64
74
  __TS__ClassExtends(Behavior, AbstractDestroyable)
65
- function Behavior.prototype.____constructor(self, object)
75
+ function Behavior.prototype.____constructor(self, object, priority)
76
+ if priority == nil then
77
+ priority = 1
78
+ end
66
79
  AbstractDestroyable.prototype.____constructor(self)
67
80
  self.object = object
81
+ self.priority = priority
82
+ local lastBehaviorByObject = lastBehaviorByObjectByPriority[priority]
68
83
  local lastBehavior = lastBehaviorByObject[object]
69
84
  if lastBehavior == nil then
70
- firstBehaviorByObject[object] = self
85
+ firstBehaviorByObjectByPriority[priority][object] = self
71
86
  lastBehaviorByObject[object] = self
72
87
  else
73
88
  self[0] = lastBehavior
@@ -80,18 +95,32 @@ function Behavior.prototype.onDestroy(self)
80
95
  if ____opt_0 ~= nil then
81
96
  ____opt_0:destroy()
82
97
  end
83
- local events = eventsByBehavior[self]
84
- if events ~= nil then
85
- for event in pairs(events) do
86
- local ____opt_2 = behaviorsByEvent[event]
98
+ local globalEvents = globalEventsByBehavior[self]
99
+ if globalEvents ~= nil then
100
+ for event in pairs(globalEvents) do
101
+ local ____opt_2 = behaviorsByGlobalEvent[event]
87
102
  if ____opt_2 ~= nil then
88
103
  ____opt_2:remove(self)
89
104
  end
90
- local ____opt_4 = listenerByBehaviorByEvent[event]
105
+ local ____opt_4 = listenerByBehaviorByGlobalEvent[event]
91
106
  if ____opt_4 ~= nil then
92
107
  ____opt_4[self] = nil
93
108
  end
94
109
  end
110
+ globalEventsByBehavior[self] = nil
111
+ end
112
+ local events = eventsByBehavior[self]
113
+ if events ~= nil then
114
+ for event in pairs(events) do
115
+ local ____opt_6 = behaviorsByEvent[event]
116
+ if ____opt_6 ~= nil then
117
+ ____opt_6[self] = nil
118
+ end
119
+ local ____opt_8 = listenerByBehaviorByEvent[event]
120
+ if ____opt_8 ~= nil then
121
+ ____opt_8[self] = nil
122
+ end
123
+ end
95
124
  eventsByBehavior[self] = nil
96
125
  end
97
126
  local previousBehavior = self[0]
@@ -99,16 +128,44 @@ function Behavior.prototype.onDestroy(self)
99
128
  if previousBehavior ~= nil then
100
129
  previousBehavior[1] = nextBehavior
101
130
  else
102
- firstBehaviorByObject[self.object] = nextBehavior
131
+ firstBehaviorByObjectByPriority[self.priority][self.object] = nextBehavior
103
132
  end
104
133
  if nextBehavior ~= nil then
105
134
  nextBehavior[0] = previousBehavior
106
135
  else
107
- lastBehaviorByObject[self.object] = previousBehavior
136
+ lastBehaviorByObjectByPriority[self.priority][self.object] = previousBehavior
108
137
  end
109
138
  return AbstractDestroyable.prototype.onDestroy(self)
110
139
  end
111
- function Behavior.prototype.registerEvent(self, event, listener)
140
+ function Behavior.prototype.registerGlobalEvent(self, event, listener)
141
+ local listenerByBehavior = getOrPut(listenerByBehaviorByGlobalEvent, event, mutableLuaMap)
142
+ listenerByBehavior[self] = listener
143
+ getOrPut(globalEventsByBehavior, self, mutableLuaSet)[event] = true
144
+ local behaviors = behaviorsByGlobalEvent[event]
145
+ if behaviors == nil then
146
+ event:addListener(function(...)
147
+ local behaviors = behaviorsByGlobalEvent[event]
148
+ if behaviors ~= nil then
149
+ for behavior in pairs(behaviors) do
150
+ safeCall(behavior[listenerByBehavior[behavior]], behavior, ...)
151
+ end
152
+ end
153
+ end)
154
+ behaviors = __TS__New(LinkedSet)
155
+ behaviorsByGlobalEvent[event] = behaviors
156
+ end
157
+ behaviors:add(self)
158
+ end
159
+ function Behavior.prototype.deregisterGlobalEvent(self, event)
160
+ local behaviors = behaviorsByGlobalEvent[event]
161
+ if behaviors ~= nil and behaviors:remove(self) then
162
+ globalEventsByBehavior[self][event] = nil
163
+ listenerByBehaviorByGlobalEvent[event][self] = nil
164
+ return true
165
+ end
166
+ return false
167
+ end
168
+ function Behavior.prototype.registerEvent(self, event, extractObject, listener)
112
169
  local listenerByBehavior = getOrPut(listenerByBehaviorByEvent, event, mutableLuaMap)
113
170
  listenerByBehavior[self] = listener
114
171
  getOrPut(eventsByBehavior, self, mutableLuaSet)[event] = true
@@ -117,19 +174,27 @@ function Behavior.prototype.registerEvent(self, event, listener)
117
174
  event:addListener(function(...)
118
175
  local behaviors = behaviorsByEvent[event]
119
176
  if behaviors ~= nil then
120
- for behavior in pairs(behaviors) do
121
- safeCall(behavior[listenerByBehavior[behavior]], behavior, ...)
177
+ local object = extractObject(...)
178
+ if object ~= nil then
179
+ ____exports.Behavior:forAll(
180
+ object,
181
+ safeCallBehaviorListener,
182
+ behaviors,
183
+ listenerByBehavior,
184
+ ...
185
+ )
122
186
  end
123
187
  end
124
188
  end)
125
- behaviors = __TS__New(LinkedSet)
189
+ behaviors = {}
126
190
  behaviorsByEvent[event] = behaviors
127
191
  end
128
- behaviors:add(self)
192
+ behaviors[self] = true
129
193
  end
130
194
  function Behavior.prototype.deregisterEvent(self, event)
131
195
  local behaviors = behaviorsByEvent[event]
132
- if behaviors ~= nil and behaviors:remove(self) then
196
+ if behaviors ~= nil and behaviors[self] ~= nil then
197
+ behaviors[self] = nil
133
198
  eventsByBehavior[self][event] = nil
134
199
  listenerByBehaviorByEvent[event][self] = nil
135
200
  return true
@@ -161,78 +226,94 @@ function Behavior.prototype.stopPeriodicAction(self)
161
226
  end
162
227
  function Behavior.count(self, object, limit)
163
228
  local behaviorsCount = 0
164
- local behavior = firstBehaviorByObject[object]
165
- while behavior ~= nil and (limit == nil or behaviorsCount < limit) do
166
- if __TS__InstanceOf(behavior, self) then
167
- behaviorsCount = behaviorsCount + 1
229
+ for priority = 0, 2 do
230
+ local behavior = firstBehaviorByObjectByPriority[priority][object]
231
+ while behavior ~= nil and (limit == nil or behaviorsCount < limit) do
232
+ if __TS__InstanceOf(behavior, self) then
233
+ behaviorsCount = behaviorsCount + 1
234
+ end
235
+ behavior = behavior[1]
168
236
  end
169
- behavior = behavior[1]
170
237
  end
171
238
  return behaviorsCount
172
239
  end
173
240
  function Behavior.getFirst(self, object, countOrPredicate, ...)
174
- local behavior = firstBehaviorByObject[object]
175
241
  if type(countOrPredicate) ~= "number" then
176
- while behavior ~= nil do
177
- if __TS__InstanceOf(behavior, self) and (countOrPredicate == nil or countOrPredicate(behavior, ...)) then
178
- return behavior
242
+ for priority = 0, 2 do
243
+ local behavior = firstBehaviorByObjectByPriority[priority][object]
244
+ while behavior ~= nil do
245
+ if __TS__InstanceOf(behavior, self) and (countOrPredicate == nil or countOrPredicate(behavior, ...)) then
246
+ return behavior
247
+ end
248
+ behavior = behavior[1]
179
249
  end
180
- behavior = behavior[1]
181
250
  end
182
251
  return nil
183
252
  end
184
253
  local behaviors = {}
185
254
  local behaviorsCount = 0
186
- while behavior ~= nil and behaviorsCount < countOrPredicate do
187
- if __TS__InstanceOf(behavior, self) then
188
- behaviorsCount = behaviorsCount + 1
189
- behaviors[behaviorsCount] = behavior
255
+ for priority = 0, 2 do
256
+ local behavior = firstBehaviorByObjectByPriority[priority][object]
257
+ while behavior ~= nil and behaviorsCount < countOrPredicate do
258
+ if __TS__InstanceOf(behavior, self) then
259
+ behaviorsCount = behaviorsCount + 1
260
+ behaviors[behaviorsCount] = behavior
261
+ end
262
+ behavior = behavior[1]
190
263
  end
191
- behavior = behavior[1]
192
264
  end
193
265
  return behaviors
194
266
  end
195
267
  function Behavior.getLast(self, object)
196
- local behavior = lastBehaviorByObject[object]
197
- while behavior ~= nil do
198
- if __TS__InstanceOf(behavior, self) then
199
- return behavior
268
+ for priority = 2, 0, -1 do
269
+ local behavior = lastBehaviorByObjectByPriority[priority][object]
270
+ while behavior ~= nil do
271
+ if __TS__InstanceOf(behavior, self) then
272
+ return behavior
273
+ end
274
+ behavior = behavior[0]
200
275
  end
201
- behavior = behavior[0]
202
276
  end
203
277
  return nil
204
278
  end
205
279
  function Behavior.getAll(self, object, predicate, ...)
206
280
  local behaviors = {}
207
281
  local behaviorsCount = 0
208
- local behavior = firstBehaviorByObject[object]
209
- while behavior ~= nil do
210
- if __TS__InstanceOf(behavior, self) and (predicate == nil or predicate(behavior, ...)) then
211
- behaviorsCount = behaviorsCount + 1
212
- behaviors[behaviorsCount] = behavior
282
+ for priority = 0, 2 do
283
+ local behavior = firstBehaviorByObjectByPriority[priority][object]
284
+ while behavior ~= nil do
285
+ if __TS__InstanceOf(behavior, self) and (predicate == nil or predicate(behavior, ...)) then
286
+ behaviorsCount = behaviorsCount + 1
287
+ behaviors[behaviorsCount] = behavior
288
+ end
289
+ behavior = behavior[1]
213
290
  end
214
- behavior = behavior[1]
215
291
  end
216
292
  return behaviors
217
293
  end
218
294
  function Behavior.forFirst(self, object, count, consumerOrKey, ...)
219
295
  local behaviorsCount = 0
220
- local behavior = firstBehaviorByObject[object]
221
296
  if type(consumerOrKey) == "function" then
222
- while behavior ~= nil and behaviorsCount < count do
223
- if __TS__InstanceOf(behavior, self) then
224
- safeCall(consumerOrKey, behavior, ...)
225
- behaviorsCount = behaviorsCount + 1
297
+ for priority = 0, 2 do
298
+ local behavior = firstBehaviorByObjectByPriority[priority][object]
299
+ while behavior ~= nil and behaviorsCount < count do
300
+ if __TS__InstanceOf(behavior, self) then
301
+ safeCall(consumerOrKey, behavior, ...)
302
+ behaviorsCount = behaviorsCount + 1
303
+ end
304
+ behavior = behavior[1]
226
305
  end
227
- behavior = behavior[1]
228
306
  end
229
307
  else
230
- while behavior ~= nil and behaviorsCount < count do
231
- if __TS__InstanceOf(behavior, self) then
232
- safeCall(behavior[consumerOrKey], behavior, ...)
233
- behaviorsCount = behaviorsCount + 1
308
+ for priority = 0, 2 do
309
+ local behavior = firstBehaviorByObjectByPriority[priority][object]
310
+ while behavior ~= nil and behaviorsCount < count do
311
+ if __TS__InstanceOf(behavior, self) then
312
+ safeCall(behavior[consumerOrKey], behavior, ...)
313
+ behaviorsCount = behaviorsCount + 1
314
+ end
315
+ behavior = behavior[1]
234
316
  end
235
- behavior = behavior[1]
236
317
  end
237
318
  end
238
319
  return behaviorsCount