warscript 0.0.1-dev.91a4dce → 0.0.1-dev.94cf7fc

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 (68) 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 +6 -1
  11. package/engine/behaviour/ability.lua +31 -1
  12. package/engine/behaviour/unit/stun-immunity.d.ts +7 -5
  13. package/engine/behaviour/unit/stun-immunity.lua +6 -5
  14. package/engine/behaviour/unit.d.ts +7 -3
  15. package/engine/behaviour/unit.lua +101 -24
  16. package/engine/buff.d.ts +21 -4
  17. package/engine/buff.lua +142 -44
  18. package/engine/internal/mechanics/cast-ability.lua +6 -3
  19. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  20. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  21. package/engine/internal/unit/attributes.d.ts +17 -0
  22. package/engine/internal/unit/attributes.lua +46 -0
  23. package/engine/internal/unit/bonus.d.ts +2 -0
  24. package/engine/internal/unit/bonus.lua +10 -0
  25. package/engine/internal/unit/fly-height.d.ts +7 -0
  26. package/engine/internal/unit/fly-height.lua +20 -0
  27. package/engine/internal/unit/interrupts.d.ts +12 -0
  28. package/engine/internal/unit/interrupts.lua +28 -0
  29. package/engine/internal/unit/range-event.d.ts +12 -0
  30. package/engine/internal/unit/range-event.lua +90 -0
  31. package/engine/internal/unit/scale.d.ts +7 -0
  32. package/engine/internal/unit/scale.lua +20 -0
  33. package/engine/internal/unit-missile-launch.lua +16 -6
  34. package/engine/internal/unit.d.ts +13 -19
  35. package/engine/internal/unit.lua +140 -173
  36. package/engine/local-client.d.ts +2 -0
  37. package/engine/local-client.lua +30 -0
  38. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  39. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  40. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  41. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  42. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  43. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  44. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  45. package/engine/object-data/entry/destructible-type.lua +155 -0
  46. package/engine/object-data/entry/unit-type.d.ts +4 -0
  47. package/engine/object-data/entry/unit-type.lua +76 -32
  48. package/engine/object-field/unit.d.ts +20 -5
  49. package/engine/object-field/unit.lua +61 -0
  50. package/engine/object-field.d.ts +9 -1
  51. package/engine/object-field.lua +265 -122
  52. package/engine/random.d.ts +1 -0
  53. package/engine/random.lua +8 -0
  54. package/engine/standard/fields/ability.d.ts +2 -2
  55. package/engine/standard/fields/ability.lua +2 -2
  56. package/engine/standard/fields/unit.d.ts +11 -3
  57. package/engine/standard/fields/unit.lua +15 -2
  58. package/engine/text-tag.lua +2 -1
  59. package/engine/unit.d.ts +5 -0
  60. package/engine/unit.lua +5 -0
  61. package/objutil/buff.lua +9 -7
  62. package/package.json +2 -2
  63. package/patch-lua.lua +15 -0
  64. package/utility/linked-map.d.ts +34 -0
  65. package/utility/linked-map.lua +101 -0
  66. package/utility/linked-set.d.ts +2 -1
  67. package/utility/linked-set.lua +21 -0
  68. package/utility/records.lua +20 -1
@@ -64,7 +64,7 @@ export declare class Player extends Handle<jplayer> {
64
64
  setUpgradeLevel(upgradeId: UpgradeId, level: number): void;
65
65
  private static getEvent;
66
66
  private static getMouseEvent;
67
- static get allianceChangedEvent(): Event<[Player]>;
67
+ static get allianceChangedEvent(): Readonly<Record<PlayerAllianceType, Event<[Player]>>>;
68
68
  static get onLeave(): Event<[Player]>;
69
69
  static get onMouseDown(): Event<[Player, jmousebuttontype]>;
70
70
  static get onMouseUp(): Event<[Player, jmousebuttontype]>;
@@ -81,6 +81,7 @@ export declare class Player extends Handle<jplayer> {
81
81
  };
82
82
  };
83
83
  static get onChat(): Event<[player: Player, message: string]>;
84
+ static readonly colorChangedEvent: Event<[Player]>;
84
85
  static byId(id: number): Player | undefined;
85
86
  }
86
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,6 +23,8 @@ 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
26
28
  local getPlayerAlliance = GetPlayerAlliance
27
29
  local getPlayerColor = GetPlayerColor
28
30
  local getPlayerName = GetPlayerName
@@ -33,6 +35,7 @@ local setPlayerAlliance = SetPlayerAlliance
33
35
  local setPlayerTechMaxAllowed = SetPlayerTechMaxAllowed
34
36
  local setPlayerTechResearched = SetPlayerTechResearched
35
37
  local setPlayerAbilityAvailable = SetPlayerAbilityAvailable
38
+ local triggerRegisterPlayerAllianceChange = TriggerRegisterPlayerAllianceChange
36
39
  local playerNative = _G.Player
37
40
  local nativeByPlayerAllianceType = {
38
41
  [0] = ALLIANCE_PASSIVE,
@@ -46,6 +49,7 @@ local nativeByPlayerAllianceType = {
46
49
  [8] = ALLIANCE_SHARED_CONTROL,
47
50
  [9] = ALLIANCE_SHARED_ADVANCED_CONTROL
48
51
  }
52
+ local playerColorChangedEvent = __TS__New(Event)
49
53
  ____exports.Player = __TS__Class()
50
54
  local Player = ____exports.Player
51
55
  Player.name = "Player"
@@ -145,14 +149,11 @@ function Player.getMouseEvent(self, event, collector)
145
149
  self.events[eventId] = __TS__New(
146
150
  TriggerEvent,
147
151
  function(trigger)
148
- Timer:simple(
149
- 0,
150
- function()
151
- for ____, player in ipairs(____exports.Player.all) do
152
- TriggerRegisterPlayerEvent(trigger, player.handle, event)
153
- end
152
+ Timer:run(function()
153
+ for ____, player in ipairs(____exports.Player.all) do
154
+ TriggerRegisterPlayerEvent(trigger, player.handle, event)
154
155
  end
155
- )
156
+ end)
156
157
  end,
157
158
  collector or (function() return {} end)
158
159
  )
@@ -300,6 +301,7 @@ __TS__SetDescriptor(
300
301
  end,
301
302
  set = function(self, color)
302
303
  SetPlayerColor(self.handle, color.handle)
304
+ Event.invoke(playerColorChangedEvent, self)
303
305
  end
304
306
  },
305
307
  true
@@ -394,10 +396,19 @@ __TS__ObjectDefineProperty(
394
396
  Player,
395
397
  "allianceChangedEvent",
396
398
  {get = function(self)
397
- return ____exports.Player:getEvent(
398
- EVENT_PLAYER_ALLIANCE_CHANGED,
399
- function() return ____exports.Player:of(getTriggerPlayer()) end
400
- )
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
401
412
  end}
402
413
  )
403
414
  __TS__ObjectDefineProperty(
@@ -478,4 +489,5 @@ __TS__ObjectDefineProperty(
478
489
  return event
479
490
  end}
480
491
  )
492
+ Player.colorChangedEvent = playerColorChangedEvent
481
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
@@ -27,7 +27,7 @@ function ApplyBuffAbilityBehavior.prototype.____constructor(self, ability, const
27
27
  constructorOrTypeIdOrTypeIds,
28
28
  typeIdOrTypeIdsOrPolarityOrTypeIdSelectionPolicy,
29
29
  polarityOrTypeIdSelectionPolicyOrResistanceType,
30
- ability,
30
+ self,
31
31
  resistanceTypeOrPolarityOrParameters
32
32
  )
33
33
  end
@@ -39,7 +39,7 @@ function ApplyBuffAbilityBehavior.prototype.____constructor(self, ability, const
39
39
  typeIdOrTypeIdsOrPolarityOrTypeIdSelectionPolicy,
40
40
  polarityOrTypeIdSelectionPolicyOrResistanceType,
41
41
  resistanceTypeOrPolarityOrParameters,
42
- ability,
42
+ self,
43
43
  parametersOrResistanceType
44
44
  )
45
45
  end
@@ -50,7 +50,7 @@ function ApplyBuffAbilityBehavior.prototype.____constructor(self, ability, const
50
50
  typeIdOrTypeIdsOrPolarityOrTypeIdSelectionPolicy,
51
51
  polarityOrTypeIdSelectionPolicyOrResistanceType,
52
52
  resistanceTypeOrPolarityOrParameters,
53
- ability,
53
+ self,
54
54
  parametersOrResistanceType
55
55
  )
56
56
  end
@@ -62,7 +62,7 @@ function ApplyBuffAbilityBehavior.prototype.____constructor(self, ability, const
62
62
  polarityOrTypeIdSelectionPolicyOrResistanceType,
63
63
  resistanceTypeOrPolarityOrParameters,
64
64
  parametersOrResistanceType,
65
- ability,
65
+ self,
66
66
  parameters
67
67
  )
68
68
  end
@@ -1,6 +1,7 @@
1
1
  /** @noSelfInFile */
2
2
  import { Behavior } from "../behavior";
3
- import { Unit } from "../unit";
3
+ import { Unit } from "../internal/unit";
4
+ import "../internal/unit/ability";
4
5
  import { Ability } from "../internal/ability";
5
6
  import { AbilityTypeId } from "../object-data/entry/ability-type";
6
7
  import { Widget } from "../../core/types/widget";
@@ -35,6 +36,10 @@ export declare abstract class AbilityBehavior<Parameters extends {
35
36
  ]): void;
36
37
  private static MissileLaunchConfig;
37
38
  private get missileLaunchConfig();
39
+ protected launchMissile(source: Unit, ...args: [
40
+ ...pointOrWidget: [x: number, y: number] | [widget: Unit /** TODO: support Widget */],
41
+ ...parameters: NonNullable<Parameters["missileParameters"]>
42
+ ]): void;
38
43
  protected onCreate(): void;
39
44
  onValueChange(_value: ReadonlySubscribableAbilityDependentValue<string | number | boolean>): void;
40
45
  onMissileArrival(...parameters: NonNullable<Parameters["missileParameters"]>): void;
@@ -7,8 +7,9 @@ local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
7
7
  local ____exports = {}
8
8
  local ____behavior = require("engine.behavior")
9
9
  local Behavior = ____behavior.Behavior
10
- local ____unit = require("engine.unit")
10
+ local ____unit = require("engine.internal.unit")
11
11
  local Unit = ____unit.Unit
12
+ require("engine.internal.unit.ability")
12
13
  local ____ability = require("engine.internal.ability")
13
14
  local Ability = ____ability.Ability
14
15
  local ____effect = require("core.types.effect")
@@ -29,7 +30,14 @@ local ____ability = require("engine.object-field.ability")
29
30
  local AbilityField = ____ability.AbilityField
30
31
  local AbilityLevelField = ____ability.AbilityLevelField
31
32
  local resolveCurrentAbilityDependentValue = ____ability.resolveCurrentAbilityDependentValue
33
+ local ____missile = require("core.types.missile")
34
+ local Missile = ____missile.Missile
32
35
  local createBehaviorFunctionsByAbilityTypeId = {}
36
+ local function invokeOnMissileArrival(_missile, success, abilityBehavior, ...)
37
+ if success then
38
+ abilityBehavior:onMissileArrival(...)
39
+ end
40
+ end
33
41
  local exclusiveOnImpactHandlerAbilityBehaviorByAbility = setmetatable({}, {__mode = "k"})
34
42
  local function createUnitEventListener(key)
35
43
  return function(unit, ability, ...)
@@ -159,6 +167,28 @@ function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrParame
159
167
  )
160
168
  end
161
169
  end
170
+ function AbilityBehavior.prototype.launchMissile(self, source, xOrWidget, yOrParameter, ...)
171
+ if type(xOrWidget) ~= "number" then
172
+ Missile:launch(
173
+ self.missileLaunchConfig,
174
+ source,
175
+ xOrWidget,
176
+ invokeOnMissileArrival,
177
+ self,
178
+ yOrParameter,
179
+ ...
180
+ )
181
+ else
182
+ Missile:launch(
183
+ self.missileLaunchConfig,
184
+ source,
185
+ vec2(xOrWidget, yOrParameter),
186
+ invokeOnMissileArrival,
187
+ self,
188
+ ...
189
+ )
190
+ end
191
+ end
162
192
  function AbilityBehavior.prototype.onCreate(self)
163
193
  end
164
194
  function AbilityBehavior.prototype.onValueChange(self, _value)