warscript 0.0.1-dev.2a08418 → 0.0.1-dev.2ad49fd

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 (88) hide show
  1. package/core/types/frame.lua +47 -1
  2. package/core/types/sound.lua +1 -1
  3. package/destroyable.d.ts +1 -0
  4. package/destroyable.lua +9 -0
  5. package/engine/behavior.d.ts +4 -2
  6. package/engine/behavior.lua +69 -11
  7. package/engine/behaviour/ability/apply-buff.lua +4 -4
  8. package/engine/behaviour/ability/damage.d.ts +3 -0
  9. package/engine/behaviour/ability/damage.lua +8 -2
  10. package/engine/behaviour/ability.d.ts +11 -6
  11. package/engine/behaviour/ability.lua +31 -1
  12. package/engine/behaviour/unit/stun-immunity.d.ts +1 -1
  13. package/engine/behaviour/unit/stun-immunity.lua +5 -4
  14. package/engine/behaviour/unit.lua +13 -3
  15. package/engine/buff.d.ts +58 -20
  16. package/engine/buff.lua +300 -152
  17. package/engine/internal/mechanics/cast-ability.lua +6 -3
  18. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  19. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  20. package/engine/internal/object-data/health-bonus.lua +16 -0
  21. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  22. package/engine/internal/object-data/mana-bonus.lua +16 -0
  23. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  24. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  25. package/engine/internal/unit/attributes.d.ts +17 -0
  26. package/engine/internal/unit/attributes.lua +46 -0
  27. package/engine/internal/unit/bonus.d.ts +6 -0
  28. package/engine/internal/unit/bonus.lua +33 -3
  29. package/engine/internal/unit/fly-height.lua +3 -3
  30. package/engine/internal/unit/interrupts.d.ts +12 -0
  31. package/engine/internal/unit/interrupts.lua +28 -0
  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.lua +3 -3
  35. package/engine/internal/unit+bonus.lua +3 -3
  36. package/engine/internal/unit-missile-launch.lua +12 -5
  37. package/engine/internal/unit.d.ts +2 -9
  38. package/engine/internal/unit.lua +79 -121
  39. package/engine/local-client.d.ts +1 -1
  40. package/engine/local-client.lua +4 -4
  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/auxiliary/unit-attribute.lua +1 -1
  44. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  45. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  46. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  47. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  48. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  49. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  50. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  51. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  52. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  53. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  54. package/engine/object-data/entry/ability-type.d.ts +2 -0
  55. package/engine/object-data/entry/ability-type.lua +84 -4
  56. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  57. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  58. package/engine/object-data/entry/destructible-type.lua +155 -0
  59. package/engine/object-data/entry/unit-type.d.ts +4 -0
  60. package/engine/object-data/entry/unit-type.lua +76 -32
  61. package/engine/object-field/ability.lua +2 -2
  62. package/engine/object-field/unit.d.ts +7 -4
  63. package/engine/object-field/unit.lua +4 -0
  64. package/engine/object-field.d.ts +3 -1
  65. package/engine/object-field.lua +177 -119
  66. package/engine/random.d.ts +1 -0
  67. package/engine/random.lua +8 -0
  68. package/engine/standard/fields/ability.d.ts +2 -2
  69. package/engine/standard/fields/ability.lua +2 -2
  70. package/engine/standard/fields/unit.d.ts +11 -5
  71. package/engine/standard/fields/unit.lua +13 -4
  72. package/engine/unit.d.ts +3 -0
  73. package/engine/unit.lua +3 -0
  74. package/lualib_bundle.lua +1 -1
  75. package/objutil/buff.lua +9 -7
  76. package/objutil/object.lua +1 -1
  77. package/operation.lua +1 -4
  78. package/package.json +5 -5
  79. package/patch-lua.lua +15 -0
  80. package/utility/linked-map.d.ts +34 -0
  81. package/utility/linked-map.lua +101 -0
  82. package/utility/linked-set.d.ts +2 -1
  83. package/utility/linked-set.lua +21 -0
  84. package/utility/records.lua +20 -1
  85. /package/engine/internal/object-data/{armor-increase.d.ts → armor-bonus.d.ts} +0 -0
  86. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  87. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  88. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
@@ -24,11 +24,23 @@ local frameCoordinatesToWorld = ____playerCamera.frameCoordinatesToWorld
24
24
  local worldCoordinatesToFrame = ____playerCamera.worldCoordinatesToFrame
25
25
  local ____get_2Dterrain_2Dz = require("engine.internal.misc.get-terrain-z")
26
26
  local getTerrainZ = ____get_2Dterrain_2Dz.getTerrainZ
27
+ local ____lua_2Dsets = require("utility.lua-sets")
28
+ local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
29
+ local ____socket = require("net.socket")
30
+ local Socket = ____socket.Socket
31
+ local ____lua_2Dmaps = require("utility.lua-maps")
32
+ local getOrPut = ____lua_2Dmaps.getOrPut
33
+ local luaMapInvert = ____lua_2Dmaps.luaMapInvert
34
+ local luaMapOf = ____lua_2Dmaps.luaMapOf
35
+ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
27
36
  local frameClick = BlzFrameClick
28
37
  local frameGetEnable = BlzFrameGetEnable
29
38
  local frameIsVisible = BlzFrameIsVisible
30
39
  local frameSetEnable = BlzFrameSetEnable
31
40
  local frameSetScale = BlzFrameSetScale
41
+ local getHandleId = GetHandleId
42
+ local getOriginFrame = BlzGetOriginFrame
43
+ local location = Location
32
44
  local ____rawget = _G.rawget
33
45
  local rawset = _G.rawset
34
46
  local invoke = Event.invoke
@@ -130,6 +142,30 @@ do
130
142
  FramePoint.BOTTOM_RIGHT = FRAMEPOINT_BOTTOMRIGHT
131
143
  end
132
144
  local tooltipByFrame = setmetatable({}, {__mode = "k"})
145
+ local keyByAsyncInitOriginFrameType = luaMapOf(ORIGIN_FRAME_PORTRAIT_HP_TEXT, "hp", ORIGIN_FRAME_PORTRAIT_MANA_TEXT, "mana")
146
+ local asyncInitOriginFrameTypeByKey = luaMapInvert(keyByAsyncInitOriginFrameType)
147
+ local seenAsyncInitOriginFrameTypes = mutableLuaSet()
148
+ local seenAsyncInitOriginFrameTypesSocket = __TS__New(Socket)
149
+ local seenPlayersByAsyncInitOriginFrameType = mutableLuaMap()
150
+ seenAsyncInitOriginFrameTypesSocket.onMessage:addListener(function(player, key)
151
+ local asyncInitOriginFrameType = asyncInitOriginFrameTypeByKey[key]
152
+ if asyncInitOriginFrameType ~= nil then
153
+ getOrPut(seenPlayersByAsyncInitOriginFrameType, asyncInitOriginFrameType, mutableLuaSet)[player] = true
154
+ end
155
+ end)
156
+ local function haveAllPlayersSeenAsyncInitOriginFrameType(frame)
157
+ local players = seenPlayersByAsyncInitOriginFrameType[frame]
158
+ if players == nil then
159
+ return false
160
+ end
161
+ for ____, player in ipairs(Player.all) do
162
+ if player.isUser and player.isPlaying and not (players[player] ~= nil) then
163
+ return false
164
+ end
165
+ end
166
+ keyByAsyncInitOriginFrameType[frame] = nil
167
+ return true
168
+ end
133
169
  ____exports.Frame = __TS__Class()
134
170
  local Frame = ____exports.Frame
135
171
  Frame.name = "Frame"
@@ -308,7 +344,17 @@ function Frame.byOrigin(self, frameType, index)
308
344
  if index == nil then
309
345
  index = 0
310
346
  end
311
- return self:of(BlzGetOriginFrame(frameType, index))
347
+ local frame = getOriginFrame(frameType, index)
348
+ local asyncInitOriginFrameTypeKey = keyByAsyncInitOriginFrameType[frameType]
349
+ if index == 0 and asyncInitOriginFrameTypeKey ~= nil and not haveAllPlayersSeenAsyncInitOriginFrameType(frameType) then
350
+ if getHandleId(frame) == 0 or seenAsyncInitOriginFrameTypes[frameType] ~= nil then
351
+ location(0, 0)
352
+ else
353
+ seenAsyncInitOriginFrameTypes[frameType] = true
354
+ seenAsyncInitOriginFrameTypesSocket:send(asyncInitOriginFrameTypeKey)
355
+ end
356
+ end
357
+ return self:of(frame)
312
358
  end
313
359
  Frame.GAME_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_GAME_UI)
314
360
  Frame.CONSOLE_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_SIMPLE_UI_PARENT)
@@ -22,7 +22,7 @@ local setSoundPlayPosition = SetSoundPlayPosition
22
22
  local stopSound = StopSound
23
23
  local attachSoundToUnit = AttachSoundToUnit
24
24
  local killSoundWhenDone = KillSoundWhenDone
25
- ____exports.SoundChannel = SoundChannel or ({})
25
+ ____exports.SoundChannel = ____exports.SoundChannel or ({})
26
26
  ____exports.SoundChannel.General = 0
27
27
  ____exports.SoundChannel[____exports.SoundChannel.General] = "General"
28
28
  ____exports.SoundChannel.UnitSelection = 1
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
@@ -18,9 +18,11 @@ export declare abstract class Behavior<T extends AnyNotNil, PeriodicActionParame
18
18
  private [BehaviorPropertyKey.PREVIOUS_BEHAVIOR]?;
19
19
  private [BehaviorPropertyKey.NEXT_BEHAVIOR]?;
20
20
  private [BehaviorPropertyKey.TIMER]?;
21
- protected constructor(object: T, priority?: BehaviorPriority);
21
+ constructor(object: T, priority?: BehaviorPriority);
22
22
  protected onDestroy(): Destructor;
23
- 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;
24
26
  protected deregisterEvent(event: Event<any>): boolean;
25
27
  protected onPeriod(...parameters: PeriodicActionParameters): void;
26
28
  protected startPeriodicAction(interval: number, ...parameters: PeriodicActionParameters): void;
@@ -57,9 +57,17 @@ local function reduceBehaviors(behaviorConstructor, object, operation, initial,
57
57
  end
58
58
  return accumulator
59
59
  end
60
+ local behaviorsByGlobalEvent = {}
61
+ local listenerByBehaviorByGlobalEvent = {}
62
+ local globalEventsByBehavior = {}
60
63
  local behaviorsByEvent = {}
61
64
  local listenerByBehaviorByEvent = {}
62
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
63
71
  ____exports.Behavior = __TS__Class()
64
72
  local Behavior = ____exports.Behavior
65
73
  Behavior.name = "Behavior"
@@ -87,18 +95,32 @@ function Behavior.prototype.onDestroy(self)
87
95
  if ____opt_0 ~= nil then
88
96
  ____opt_0:destroy()
89
97
  end
90
- local events = eventsByBehavior[self]
91
- if events ~= nil then
92
- for event in pairs(events) do
93
- 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]
94
102
  if ____opt_2 ~= nil then
95
103
  ____opt_2:remove(self)
96
104
  end
97
- local ____opt_4 = listenerByBehaviorByEvent[event]
105
+ local ____opt_4 = listenerByBehaviorByGlobalEvent[event]
98
106
  if ____opt_4 ~= nil then
99
107
  ____opt_4[self] = nil
100
108
  end
101
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
102
124
  eventsByBehavior[self] = nil
103
125
  end
104
126
  local previousBehavior = self[0]
@@ -115,7 +137,35 @@ function Behavior.prototype.onDestroy(self)
115
137
  end
116
138
  return AbstractDestroyable.prototype.onDestroy(self)
117
139
  end
118
- 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)
119
169
  local listenerByBehavior = getOrPut(listenerByBehaviorByEvent, event, mutableLuaMap)
120
170
  listenerByBehavior[self] = listener
121
171
  getOrPut(eventsByBehavior, self, mutableLuaSet)[event] = true
@@ -124,19 +174,27 @@ function Behavior.prototype.registerEvent(self, event, listener)
124
174
  event:addListener(function(...)
125
175
  local behaviors = behaviorsByEvent[event]
126
176
  if behaviors ~= nil then
127
- for behavior in pairs(behaviors) do
128
- 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
+ )
129
186
  end
130
187
  end
131
188
  end)
132
- behaviors = __TS__New(LinkedSet)
189
+ behaviors = {}
133
190
  behaviorsByEvent[event] = behaviors
134
191
  end
135
- behaviors:add(self)
192
+ behaviors[self] = true
136
193
  end
137
194
  function Behavior.prototype.deregisterEvent(self, event)
138
195
  local behaviors = behaviorsByEvent[event]
139
- if behaviors ~= nil and behaviors:remove(self) then
196
+ if behaviors ~= nil and behaviors[self] ~= nil then
197
+ behaviors[self] = nil
140
198
  eventsByBehavior[self][event] = nil
141
199
  listenerByBehaviorByEvent[event][self] = nil
142
200
  return true
@@ -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
@@ -25,8 +25,11 @@ export declare abstract class DamageAbilityBehavior<T extends DamageAbilityBehav
25
25
  protected readonly damage: AbilityDependentValue<number>;
26
26
  protected readonly parameters?: T | undefined;
27
27
  protected constructor(ability: Ability, damage: AbilityDependentValue<number>, parameters?: T | undefined);
28
+ protected precalculatedDamage?: number;
28
29
  protected calculateDamage(caster: Unit): number;
29
30
  protected damageTarget(caster: Unit, target: Widget, damage?: number): void;
31
+ onChannelingStart(caster: Unit): void;
32
+ onStop(): void;
30
33
  }
31
34
  export declare class DamageSelfAbilityBehavior extends DamageAbilityBehavior {
32
35
  constructor(ability: Ability, damage: AbilityDependentValue<number>, parameters?: DamageAbilityBehaviorParameters);
@@ -39,7 +39,7 @@ function DamageAbilityBehavior.prototype.damageTarget(self, caster, target, dama
39
39
  local parameters = self.parameters
40
40
  caster:damageTarget(
41
41
  target,
42
- damage or self:calculateDamage(caster),
42
+ damage or self.precalculatedDamage or self:calculateDamage(caster),
43
43
  nil,
44
44
  nil,
45
45
  self:resolveCurrentAbilityDependentValue(parameters and parameters.attackType),
@@ -48,6 +48,12 @@ function DamageAbilityBehavior.prototype.damageTarget(self, caster, target, dama
48
48
  self:resolveCurrentAbilityDependentValue(parameters and parameters.metadata)
49
49
  )
50
50
  end
51
+ function DamageAbilityBehavior.prototype.onChannelingStart(self, caster)
52
+ self.precalculatedDamage = self:calculateDamage(caster)
53
+ end
54
+ function DamageAbilityBehavior.prototype.onStop(self)
55
+ self.precalculatedDamage = nil
56
+ end
51
57
  ____exports.DamageSelfAbilityBehavior = __TS__Class()
52
58
  local DamageSelfAbilityBehavior = ____exports.DamageSelfAbilityBehavior
53
59
  DamageSelfAbilityBehavior.name = "DamageSelfAbilityBehavior"
@@ -83,7 +89,7 @@ function DamageAreaAbilityBehavior.prototype.damageArea(self, caster, x, y)
83
89
  y,
84
90
  self:resolveCurrentAbilityDependentValue(parameters and parameters.areaOfEffect or AREA_OF_EFFECT_ABILITY_FLOAT_LEVEL_FIELD)
85
91
  )
86
- local damage = self:calculateDamage(caster)
92
+ local damage = self.precalculatedDamage or self:calculateDamage(caster)
87
93
  local maximumDamage = self:resolveCurrentAbilityDependentValue(parameters and parameters.maximumDamage or 0)
88
94
  if maximumDamage ~= 0 and damage > maximumDamage then
89
95
  damage = maximumDamage / #targets
@@ -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";
@@ -25,16 +26,20 @@ export declare abstract class AbilityBehavior<Parameters extends {
25
26
  get unit(): Unit | undefined;
26
27
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value: AbilityDependentValue<T>): T;
27
28
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value?: AbilityDependentValue<T>): T | undefined;
28
- protected flashCasterEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
29
- protected flashTargetEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
30
- protected flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
31
- protected flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
32
- protected flashSpecialEffect(...args: [
29
+ flashCasterEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
30
+ flashTargetEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
31
+ flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
32
+ flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
33
+ flashSpecialEffect(...args: [
33
34
  ...pointOrWidget: [x: number, y: number] | [widget: Widget],
34
35
  ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]
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)
@@ -7,7 +7,7 @@ import { Destructor } from "../../../destroyable";
7
7
  import { BehaviorPriority } from "../../behavior";
8
8
  export type StunImmunityUnitBehaviorParameters = {
9
9
  readonly priority?: BehaviorPriority;
10
- buffTypeIds?: LuaSet<BuffTypeId>;
10
+ buffTypeIds?: readonly BuffTypeId[];
11
11
  textTagPreset?: TextTagPreset;
12
12
  textTagText?: string;
13
13
  additionalAction?: (this: void, unit: Unit) => void;
@@ -8,14 +8,15 @@ local UnitBehavior = ____unit.UnitBehavior
8
8
  local ____ability_2Dtype = require("engine.object-data.entry.ability-type")
9
9
  local AbilityType = ____ability_2Dtype.AbilityType
10
10
  local ____arrays = require("utility.arrays")
11
- local flatMapToLuaSet = ____arrays.flatMapToLuaSet
11
+ local distinct = ____arrays.distinct
12
+ local flatMap = ____arrays.flatMap
12
13
  local map = ____arrays.map
13
14
  local ____text_2Dtag = require("engine.text-tag")
14
15
  local TextTag = ____text_2Dtag.TextTag
15
16
  local ____timer = require("core.types.timer")
16
17
  local Timer = ____timer.Timer
17
18
  local DEFAULT_BUFF_TYPE_IDS = postcompile(function()
18
- return flatMapToLuaSet(
19
+ return distinct(flatMap(
19
20
  AbilityType:getAllByBaseIds(map({
20
21
  "AHtb",
21
22
  "AHbh",
@@ -41,11 +42,11 @@ local DEFAULT_BUFF_TYPE_IDS = postcompile(function()
41
42
  "ACcb"
42
43
  }, fourCC)),
43
44
  function(abilityType) return __TS__ArrayFlat(abilityType.buffTypeIds) end
44
- )
45
+ ))
45
46
  end)
46
47
  local function process(behavior)
47
48
  local hasRemovedBuffs = false
48
- for buffTypeId in pairs(behavior.parameters.buffTypeIds or DEFAULT_BUFF_TYPE_IDS) do
49
+ for ____, buffTypeId in ipairs(behavior.parameters.buffTypeIds or DEFAULT_BUFF_TYPE_IDS) do
49
50
  hasRemovedBuffs = hasRemovedBuffs or behavior.unit:removeBuff(buffTypeId)
50
51
  end
51
52
  if hasRemovedBuffs then
@@ -21,6 +21,8 @@ local ____bonus = require("engine.internal.unit.bonus")
21
21
  local addOrUpdateOrRemoveUnitBonus = ____bonus.addOrUpdateOrRemoveUnitBonus
22
22
  local getUnitBonus = ____bonus.getUnitBonus
23
23
  local removeUnitBonus = ____bonus.removeUnitBonus
24
+ local ____linked_2Dmap = require("utility.linked-map")
25
+ local LinkedMap = ____linked_2Dmap.LinkedMap
24
26
  local safeCall = warpack.safeCall
25
27
  local createBehaviorFunctionsByUnitTypeId = {}
26
28
  local behaviorsByOwningPlayerEvent = {}
@@ -79,16 +81,24 @@ function UnitBehavior.prototype.onDestroy(self)
79
81
  end
80
82
  function UnitBehavior.prototype.getUnitBonus(self, bonusType)
81
83
  local ____opt_10 = self._bonusIdByBonusType
82
- local bonusId = ____opt_10 and ____opt_10[bonusType]
84
+ local bonusId = ____opt_10 and ____opt_10:get(bonusType)
83
85
  return bonusId == nil and 0 or getUnitBonus(self.object, bonusType, bonusId)
84
86
  end
85
87
  function UnitBehavior.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, value)
86
88
  local bonusIdByBonusType = self._bonusIdByBonusType
87
89
  if bonusIdByBonusType == nil then
88
- bonusIdByBonusType = {}
90
+ bonusIdByBonusType = __TS__New(LinkedMap)
89
91
  self._bonusIdByBonusType = bonusIdByBonusType
90
92
  end
91
- bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self.object, bonusType, bonusIdByBonusType[bonusType], value)
93
+ bonusIdByBonusType:put(
94
+ bonusType,
95
+ addOrUpdateOrRemoveUnitBonus(
96
+ self.object,
97
+ bonusType,
98
+ bonusIdByBonusType:get(bonusType),
99
+ value
100
+ )
101
+ )
92
102
  end
93
103
  function UnitBehavior.prototype.registerOwningPlayerEvent(self, event, extractPlayer, listener)
94
104
  local listenerByBehavior = getOrPut(listenerByBehaviorByOwningPlayerEvent, event, mutableLuaMap)