warscript 0.0.1-dev.fcc9d08 → 0.0.1-dev.fe0aeea

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 (63) hide show
  1. package/core/types/effect.d.ts +1 -3
  2. package/core/types/effect.lua +26 -29
  3. package/core/types/sound.d.ts +17 -25
  4. package/core/types/sound.lua +86 -46
  5. package/core/util.lua +6 -1
  6. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  7. package/engine/behaviour/ability/damage.d.ts +3 -0
  8. package/engine/behaviour/ability/damage.lua +2 -2
  9. package/engine/behaviour/ability.d.ts +5 -1
  10. package/engine/behaviour/ability.lua +18 -4
  11. package/engine/behaviour/unit.d.ts +2 -0
  12. package/engine/buff.d.ts +13 -8
  13. package/engine/buff.lua +81 -50
  14. package/engine/internal/mechanics/ability-duration.lua +1 -1
  15. package/engine/internal/unit.d.ts +6 -1
  16. package/engine/internal/unit.lua +8 -2
  17. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  18. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  19. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  20. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  21. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  22. package/engine/object-data/entry/ability-type/blank-configurable.lua +0 -9
  23. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  24. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  25. package/engine/object-data/entry/ability-type/curse.lua +2 -2
  26. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  27. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  28. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  29. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  30. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  31. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  32. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  33. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  34. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  35. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  36. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  37. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  38. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  39. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  40. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  41. package/engine/object-data/entry/ability-type/web.lua +52 -0
  42. package/engine/object-data/entry/ability-type.d.ts +19 -17
  43. package/engine/object-data/entry/ability-type.lua +74 -21
  44. package/engine/object-data/entry/buff-type/applicable.lua +4 -4
  45. package/engine/object-data/entry/buff-type.d.ts +1 -1
  46. package/engine/object-data/entry/buff-type.lua +2 -2
  47. package/engine/object-data/entry/destructible-type.d.ts +1 -1
  48. package/engine/object-data/entry/item-type.d.ts +1 -1
  49. package/engine/object-data/entry/item-type.lua +4 -4
  50. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  51. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  52. package/engine/object-data/entry/sound-preset.lua +140 -0
  53. package/engine/object-data/entry/unit-type.d.ts +1 -1
  54. package/engine/object-data/entry/unit-type.lua +11 -11
  55. package/engine/object-data/entry/upgrade.d.ts +1 -1
  56. package/engine/object-data/entry/upgrade.lua +4 -4
  57. package/engine/object-data/entry.d.ts +16 -14
  58. package/engine/object-data/entry.lua +60 -32
  59. package/engine/standard/entries/sound-preset.d.ts +10 -0
  60. package/engine/standard/entries/sound-preset.lua +10 -0
  61. package/objutil/unit.lua +2 -2
  62. package/package.json +2 -2
  63. package/utility/reflection.lua +11 -7
@@ -30,12 +30,10 @@ export declare class Effect extends Handle<jeffect> {
30
30
  set pitch(pitch: number);
31
31
  get roll(): number;
32
32
  set roll(roll: number);
33
- static create<T extends Effect>(this: typeof Effect & (new (handle: jeffect) => T), model: string, pos: Vec2): T;
34
- static createTarget<T extends Effect>(this: typeof Effect & (new (handle: jeffect) => T), model: string, target: Widget, attachPoint: string): T;
33
+ static create<T extends Effect>(this: typeof Effect & (new (handle: jeffect) => T), modelPath: string, xOrWidget: number | Widget, yOrAttachmentPoint?: number | string, parameters?: EffectParameters): T;
35
34
  static flash(modelPath: string, ...args: [
36
35
  ...pointOrWidget: [x: number, y: number] | [widget: Widget, attachmentPoint?: string],
37
36
  ...parametersOrDuration: [parametersOrDuration?: EffectParameters | number] | [duration?: number, parameters?: EffectParameters]
38
37
  ]): void;
39
- static flashTarget(model: string, target: Widget, attachPoint: string, duration?: number): void;
40
38
  }
41
39
  export {};
@@ -4,7 +4,7 @@ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
4
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
5
  local __TS__InstanceOf = ____lualib.__TS__InstanceOf
6
6
  local ____exports = {}
7
- local dummyPlayer, flash
7
+ local dummyPlayer, addSpecialEffectInternal, flash
8
8
  local ____handle = require("core.types.handle")
9
9
  local Handle = ____handle.Handle
10
10
  local ____playerColor = require("core.types.playerColor")
@@ -119,6 +119,7 @@ local function setSpecialEffectColor(effect, color)
119
119
  dummyPlayer.color = dummyColor
120
120
  end
121
121
  local setters = {scale = setSpecialEffectScale, color = setSpecialEffectColor, pitch = setSpecialEffectPitchDegrees, roll = setSpecialEffectRollDegrees}
122
+ local setterProperties = {"scale", "color", "pitch", "roll"}
122
123
  dummyPlayer = Player.neutralExtra
123
124
  local temporaryEffects = {}
124
125
  local temporaryEffectsDurations = {}
@@ -177,11 +178,14 @@ function Effect.prototype.onDestroy(self)
177
178
  destroyEffect(self.handle)
178
179
  return Handle.prototype.onDestroy(self)
179
180
  end
180
- function Effect.create(self, model, pos)
181
- return self:of(addSpecialEffect(model, pos.x, pos.y))
182
- end
183
- function Effect.createTarget(self, model, target, attachPoint)
184
- return self:of(addSpecialEffectTarget(model, target.handle, attachPoint))
181
+ function Effect.create(self, modelPath, xOrWidget, yOrAttachmentPoint, parameters)
182
+ local effect = self:of(addSpecialEffectInternal(modelPath, xOrWidget, yOrAttachmentPoint, parameters))
183
+ if parameters ~= nil then
184
+ effect[100] = parameters.color
185
+ effect[101] = parameters.pitch
186
+ effect[102] = parameters.roll
187
+ end
188
+ return effect
185
189
  end
186
190
  function Effect.flash(self, modelPath, xOrWidget, yOrOrAttachmentPoint, parametersOrDuration, parameters)
187
191
  if type(parametersOrDuration) ~= "number" then
@@ -206,24 +210,12 @@ function Effect.flash(self, modelPath, xOrWidget, yOrOrAttachmentPoint, paramete
206
210
  parameters
207
211
  )
208
212
  end
209
- function Effect.flashTarget(self, model, target, attachPoint, duration)
210
- local effect = addSpecialEffectTarget(model, target.handle, attachPoint)
211
- if effect ~= nil then
212
- if duration and duration > 0 then
213
- temporaryEffectsCount = temporaryEffectsCount + 1
214
- temporaryEffects[temporaryEffectsCount] = effect
215
- temporaryEffectsDurations[temporaryEffectsCount] = duration
216
- else
217
- destroyEffect(effect)
218
- end
219
- end
220
- end
221
213
  __TS__SetDescriptor(
222
214
  Effect.prototype,
223
215
  "color",
224
216
  {
225
217
  get = function(self)
226
- return self[100] or PlayerColor.black
218
+ return self[100] or PlayerColor.red
227
219
  end,
228
220
  set = function(self, color)
229
221
  setSpecialEffectColor(self.handle, color)
@@ -273,30 +265,35 @@ __TS__SetDescriptor(
273
265
  },
274
266
  true
275
267
  )
276
- flash = function(modelPath, xOrWidget, yOrOrAttachmentPoint, duration, parameters)
268
+ addSpecialEffectInternal = function(modelPath, xOrWidget, yOrAttachmentPoint, parameters)
277
269
  local coordinatesProvided = type(xOrWidget) == "number"
278
270
  local isPositional = coordinatesProvided or (parameters and parameters.detached) == true
279
271
  local x = not isPositional and 0 or (coordinatesProvided and xOrWidget or xOrWidget.x)
280
- local y = not isPositional and 0 or (coordinatesProvided and yOrOrAttachmentPoint or xOrWidget.y)
281
- local effect = isPositional and addSpecialEffect(modelPath, x, y) or addSpecialEffectTarget(modelPath, xOrWidget.handle, yOrOrAttachmentPoint or "origin")
282
- if isPositional and not coordinatesProvided and (parameters and parameters.scale) == nil and __TS__InstanceOf(xOrWidget, Unit) then
283
- setSpecialEffectScale(effect, xOrWidget.scale)
284
- end
272
+ local y = not isPositional and 0 or (coordinatesProvided and yOrAttachmentPoint or xOrWidget.y)
273
+ local effect = isPositional and addSpecialEffect(modelPath, x, y) or addSpecialEffectTarget(modelPath, xOrWidget.handle, yOrAttachmentPoint or "origin")
285
274
  if parameters ~= nil then
286
- for key, value in ____pairs(parameters) do
287
- if key ~= "zOffset" and key ~= "detached" and key ~= "scaleZOffset" and key ~= "delay" then
288
- setters[key](effect, value)
275
+ if isPositional and parameters.scale == nil and __TS__InstanceOf(xOrWidget, Unit) then
276
+ setSpecialEffectScale(effect, xOrWidget.scale)
277
+ end
278
+ for ____, property in ipairs(setterProperties) do
279
+ local value = parameters[property]
280
+ if value ~= nil then
281
+ setters[property](effect, value)
289
282
  end
290
283
  end
291
284
  if isPositional and parameters.zOffset ~= nil then
292
285
  moveLocation(location, x, y)
293
286
  local z = __TS__InstanceOf(xOrWidget, Unit) and getLocationZ(location) + xOrWidget.flyHeight or getLocationZ(location)
294
- BlzSetSpecialEffectZ(
287
+ setSpecialEffectZ(
295
288
  effect,
296
289
  z + parameters.zOffset * (parameters.scaleZOffset and getSpecialEffectScale(effect) or 1)
297
290
  )
298
291
  end
299
292
  end
293
+ return effect
294
+ end
295
+ flash = function(modelPath, xOrWidget, yOrAttachmentPoint, duration, parameters)
296
+ local effect = addSpecialEffectInternal(modelPath, xOrWidget, yOrAttachmentPoint, parameters)
300
297
  if duration ~= nil and duration > 0 then
301
298
  temporaryEffectsCount = temporaryEffectsCount + 1
302
299
  temporaryEffects[temporaryEffectsCount] = effect
@@ -1,6 +1,7 @@
1
1
  /** @noSelfInFile */
2
2
  import { Handle, HandleDestructor } from "./handle";
3
3
  import { Unit } from "./unit";
4
+ import { SoundEax } from "../../engine/object-data/auxiliary/sound-eax";
4
5
  export declare enum SoundChannel {
5
6
  General = 0,
6
7
  UnitSelection = 1,
@@ -18,16 +19,7 @@ export declare enum SoundChannel {
18
19
  Birth = 13,
19
20
  Fire = 14
20
21
  }
21
- export declare enum SoundEax {
22
- Default = "DefaultEAXON",
23
- Acknowledgements = "HeroAcksEAX",
24
- Environment = "DoodadsEAX",
25
- Drums = "KotoDrumsEAX",
26
- Attacks = "CombatSoundsEAX",
27
- Abilities = "SpellsEAX",
28
- Missiles = "MissilesEAX"
29
- }
30
- export type SoundPreset = Readonly<{
22
+ export type SoundSettings = Readonly<{
31
23
  channel?: SoundChannel;
32
24
  eax?: SoundEax;
33
25
  fadeInRate?: number;
@@ -36,19 +28,19 @@ export type SoundPreset = Readonly<{
36
28
  volume?: number;
37
29
  pitch?: number;
38
30
  }>;
39
- export type Sound3DPreset = SoundPreset & Readonly<{
31
+ export type Sound3DSettings = SoundSettings & Readonly<{
40
32
  stopWhenOutOfRange?: boolean;
41
33
  minDistance?: number;
42
34
  maxDistance?: number;
43
35
  distanceCutoff?: number;
44
36
  }>;
45
- export declare namespace SoundPreset {
46
- const UI: SoundPreset;
47
- const Music: SoundPreset;
48
- const Attack: Sound3DPreset;
49
- const Ability: Sound3DPreset;
50
- const AbilityLooping: Sound3DPreset;
51
- const Missile: Sound3DPreset;
37
+ export declare namespace SoundSettings {
38
+ const UI: SoundSettings;
39
+ const Music: SoundSettings;
40
+ const Attack: Sound3DSettings;
41
+ const Ability: Sound3DSettings;
42
+ const AbilityLooping: Sound3DSettings;
43
+ const Missile: Sound3DSettings;
52
44
  }
53
45
  export declare class Sound extends Handle<jsound, [fadeOut?: boolean]> {
54
46
  private _volume?;
@@ -58,13 +50,13 @@ export declare class Sound extends Handle<jsound, [fadeOut?: boolean]> {
58
50
  start(milliseconds?: number): void;
59
51
  stop(fadeOut?: boolean): void;
60
52
  restart(milliseconds?: number): void;
61
- static play(fileName: string, preset: SoundPreset): void;
62
- static create(fileName: string, preset: SoundPreset): Sound;
53
+ static play(fileName: string, preset: SoundSettings): void;
54
+ static create(fileName: string, preset: SoundSettings): Sound;
63
55
  }
64
56
  export declare class Sound3D extends Sound {
65
- static playAtPosition(fileName: string, preset: Sound3DPreset, x?: number, y?: number, z?: number): void;
66
- static playOnUnit(fileName: string, preset: Sound3DPreset, unit: Unit): void;
67
- static playFromLabel(label: string, preset: Sound3DPreset, unit: Unit): void;
68
- static createAtPosition(fileName: string, preset: Sound3DPreset, x?: number, y?: number, z?: number): Sound3D;
69
- static createOnUnit(fileName: string, preset: Sound3DPreset, unit: Unit): Sound3D;
57
+ static playAtPosition(fileName: string, preset: Sound3DSettings, x?: number, y?: number, z?: number): void;
58
+ static playOnUnit(fileName: string, preset: Sound3DSettings, unit: Unit): void;
59
+ static playFromLabel(label: string, preset: Sound3DSettings, ...positionOrUnit: [Unit] | [number, number, number?]): void;
60
+ static createAtPosition(fileName: string, preset: Sound3DSettings, x?: number, y?: number, z?: number): Sound3D;
61
+ static createOnUnit(fileName: string, preset: Sound3DSettings, unit: Unit): Sound3D;
70
62
  }
@@ -5,6 +5,10 @@ local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
5
  local ____exports = {}
6
6
  local ____handle = require("core.types.handle")
7
7
  local Handle = ____handle.Handle
8
+ local ____sound_2Dpreset = require("engine.object-data.entry.sound-preset")
9
+ local SoundPreset = ____sound_2Dpreset.SoundPreset
10
+ local ____random = require("engine.random")
11
+ local randomInteger = ____random.randomInteger
8
12
  local createSound = CreateSound
9
13
  local createSoundFromLabel = CreateSoundFromLabel
10
14
  local setSoundPitch = SetSoundPitch
@@ -49,29 +53,21 @@ ____exports.SoundChannel.Birth = 13
49
53
  ____exports.SoundChannel[____exports.SoundChannel.Birth] = "Birth"
50
54
  ____exports.SoundChannel.Fire = 14
51
55
  ____exports.SoundChannel[____exports.SoundChannel.Fire] = "Fire"
52
- ____exports.SoundEax = SoundEax or ({})
53
- ____exports.SoundEax.Default = "DefaultEAXON"
54
- ____exports.SoundEax.Acknowledgements = "HeroAcksEAX"
55
- ____exports.SoundEax.Environment = "DoodadsEAX"
56
- ____exports.SoundEax.Drums = "KotoDrumsEAX"
57
- ____exports.SoundEax.Attacks = "CombatSoundsEAX"
58
- ____exports.SoundEax.Abilities = "SpellsEAX"
59
- ____exports.SoundEax.Missiles = "MissilesEAX"
60
- ____exports.SoundPreset = {}
61
- local SoundPreset = ____exports.SoundPreset
56
+ ____exports.SoundSettings = {}
57
+ local SoundSettings = ____exports.SoundSettings
62
58
  do
63
- SoundPreset.UI = {channel = ____exports.SoundChannel.UI, eax = ____exports.SoundEax.Default, fadeInRate = 12700, fadeOutRate = 12700}
64
- SoundPreset.Music = {
59
+ SoundSettings.UI = {channel = ____exports.SoundChannel.UI, eax = "DefaultEAXON", fadeInRate = 12700, fadeOutRate = 12700}
60
+ SoundSettings.Music = {
65
61
  channel = ____exports.SoundChannel.Music,
66
- eax = ____exports.SoundEax.Default,
62
+ eax = "DefaultEAXON",
67
63
  fadeInRate = 12700,
68
64
  fadeOutRate = 12700,
69
65
  looping = true
70
66
  }
71
- SoundPreset.Attack = {channel = ____exports.SoundChannel.Combat, eax = ____exports.SoundEax.Attacks, fadeInRate = 10, fadeOutRate = 10}
72
- SoundPreset.Ability = {
67
+ SoundSettings.Attack = {channel = ____exports.SoundChannel.Combat, eax = "CombatSoundsEAX", fadeInRate = 10, fadeOutRate = 10}
68
+ SoundSettings.Ability = {
73
69
  channel = ____exports.SoundChannel.Animations,
74
- eax = ____exports.SoundEax.Abilities,
70
+ eax = "SpellsEAX",
75
71
  stopWhenOutOfRange = true,
76
72
  volume = 127,
77
73
  fadeInRate = 1,
@@ -81,9 +77,9 @@ do
81
77
  maxDistance = 3500,
82
78
  distanceCutoff = 3000
83
79
  }
84
- SoundPreset.AbilityLooping = {
80
+ SoundSettings.AbilityLooping = {
85
81
  channel = ____exports.SoundChannel.Birth,
86
- eax = ____exports.SoundEax.Abilities,
82
+ eax = "SpellsEAX",
87
83
  looping = true,
88
84
  stopWhenOutOfRange = true,
89
85
  volume = 127,
@@ -94,9 +90,9 @@ do
94
90
  maxDistance = 3000,
95
91
  distanceCutoff = 3000
96
92
  }
97
- SoundPreset.Missile = {
93
+ SoundSettings.Missile = {
98
94
  channel = ____exports.SoundChannel.Animations,
99
- eax = ____exports.SoundEax.Missiles,
95
+ eax = "MissilesEAX",
100
96
  stopWhenOutOfRange = true,
101
97
  volume = 127,
102
98
  fadeInRate = 1,
@@ -107,6 +103,24 @@ do
107
103
  distanceCutoff = 3000
108
104
  }
109
105
  end
106
+ local customSoundPresetDataByLabel = postcompile(function()
107
+ local customSoundPresetDataByLabel = {}
108
+ for ____, soundPreset in ipairs(SoundPreset:getAll()) do
109
+ if soundPreset.isCustom then
110
+ customSoundPresetDataByLabel[soundPreset.id] = {
111
+ filePaths = soundPreset.filePaths,
112
+ volume = soundPreset.volume,
113
+ pitch = soundPreset.pitch,
114
+ channel = soundPreset.channel,
115
+ minimumDistance = soundPreset.minimumDistance,
116
+ maximumDistance = soundPreset.maximumDistance,
117
+ distanceCutoff = soundPreset.distanceCutoff,
118
+ eax = soundPreset.eax
119
+ }
120
+ end
121
+ end
122
+ return customSoundPresetDataByLabel
123
+ end)
110
124
  local function createPresetSound(fileName, preset)
111
125
  local ____fileName_1 = fileName
112
126
  local ____preset_looping_0 = preset.looping
@@ -120,7 +134,7 @@ local function createPresetSound(fileName, preset)
120
134
  true,
121
135
  preset.fadeInRate or 12700,
122
136
  preset.fadeOutRate or 12700,
123
- preset.eax or ____exports.SoundEax.Default
137
+ preset.eax or "DefaultEAXON"
124
138
  )
125
139
  setSoundChannel(sound, preset.channel or ____exports.SoundChannel.General)
126
140
  setSoundVolume(sound, preset.volume or 127)
@@ -143,7 +157,7 @@ local function createPreset3DSound(fileName, preset)
143
157
  ____preset_stopWhenOutOfRange_3,
144
158
  preset.fadeInRate or 12700,
145
159
  preset.fadeOutRate or 12700,
146
- preset.eax or ____exports.SoundEax.Default
160
+ preset.eax or "DefaultEAXON"
147
161
  )
148
162
  setSoundChannel(sound, preset.channel or ____exports.SoundChannel.General)
149
163
  setSoundVolume(sound, preset.volume or 127)
@@ -153,29 +167,51 @@ local function createPreset3DSound(fileName, preset)
153
167
  return sound
154
168
  end
155
169
  local function createPreset3DSoundFromLabel(label, preset)
156
- local ____label_7 = label
157
- local ____preset_looping_5 = preset.looping
158
- if ____preset_looping_5 == nil then
159
- ____preset_looping_5 = false
160
- end
161
- local ____preset_stopWhenOutOfRange_6 = preset.stopWhenOutOfRange
162
- if ____preset_stopWhenOutOfRange_6 == nil then
163
- ____preset_stopWhenOutOfRange_6 = true
170
+ local customSoundPresetData = customSoundPresetDataByLabel[label]
171
+ if customSoundPresetData == nil then
172
+ local ____label_7 = label
173
+ local ____preset_looping_5 = preset.looping
174
+ if ____preset_looping_5 == nil then
175
+ ____preset_looping_5 = false
176
+ end
177
+ local ____preset_stopWhenOutOfRange_6 = preset.stopWhenOutOfRange
178
+ if ____preset_stopWhenOutOfRange_6 == nil then
179
+ ____preset_stopWhenOutOfRange_6 = true
180
+ end
181
+ return createSoundFromLabel(
182
+ ____label_7,
183
+ ____preset_looping_5,
184
+ true,
185
+ ____preset_stopWhenOutOfRange_6,
186
+ preset.fadeInRate or 12700,
187
+ preset.fadeOutRate or 12700
188
+ )
189
+ else
190
+ local ____customSoundPresetData_filePaths_index_10 = customSoundPresetData.filePaths[randomInteger(#customSoundPresetData.filePaths - 1) + 1]
191
+ local ____preset_looping_8 = preset.looping
192
+ if ____preset_looping_8 == nil then
193
+ ____preset_looping_8 = false
194
+ end
195
+ local ____preset_stopWhenOutOfRange_9 = preset.stopWhenOutOfRange
196
+ if ____preset_stopWhenOutOfRange_9 == nil then
197
+ ____preset_stopWhenOutOfRange_9 = true
198
+ end
199
+ local sound = createSound(
200
+ ____customSoundPresetData_filePaths_index_10,
201
+ ____preset_looping_8,
202
+ true,
203
+ ____preset_stopWhenOutOfRange_9,
204
+ preset.fadeInRate or 12700,
205
+ preset.fadeOutRate or 12700,
206
+ customSoundPresetData.eax
207
+ )
208
+ setSoundChannel(sound, customSoundPresetData.channel)
209
+ setSoundVolume(sound, customSoundPresetData.volume)
210
+ setSoundPitch(sound, customSoundPresetData.pitch)
211
+ setSoundDistances(sound, customSoundPresetData.minimumDistance, customSoundPresetData.maximumDistance)
212
+ setSoundDistanceCutoff(sound, customSoundPresetData.distanceCutoff)
213
+ return sound
164
214
  end
165
- local sound = createSoundFromLabel(
166
- ____label_7,
167
- ____preset_looping_5,
168
- true,
169
- ____preset_stopWhenOutOfRange_6,
170
- preset.fadeInRate or 12700,
171
- preset.fadeOutRate or 12700
172
- )
173
- setSoundChannel(sound, preset.channel or ____exports.SoundChannel.General)
174
- setSoundVolume(sound, preset.volume or 127)
175
- setSoundPitch(sound, preset.pitch or 1)
176
- setSoundDistances(sound, preset.minDistance or 600, preset.maxDistance or 8000)
177
- setSoundDistanceCutoff(sound, preset.distanceCutoff or 1500)
178
- return sound
179
215
  end
180
216
  ____exports.Sound = __TS__Class()
181
217
  local Sound = ____exports.Sound
@@ -249,9 +285,13 @@ function Sound3D.playOnUnit(self, fileName, preset, unit)
249
285
  startSound(sound)
250
286
  killSoundWhenDone(sound)
251
287
  end
252
- function Sound3D.playFromLabel(self, label, preset, unit)
288
+ function Sound3D.playFromLabel(self, label, preset, unitOrX, y, z)
253
289
  local sound = createPreset3DSoundFromLabel(label, preset)
254
- attachSoundToUnit(sound, unit.handle)
290
+ if type(unitOrX) ~= "number" then
291
+ attachSoundToUnit(sound, unitOrX.handle)
292
+ else
293
+ setSoundPosition(sound, unitOrX, y or 0, z or 0)
294
+ end
255
295
  startSound(sound)
256
296
  killSoundWhenDone(sound)
257
297
  end
package/core/util.lua CHANGED
@@ -1,3 +1,5 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__StringPadEnd = ____lualib.__TS__StringPadEnd
1
3
  local ____exports = {}
2
4
  local ns = {}
3
5
  do
@@ -14,7 +16,10 @@ do
14
16
  if type(id) == "number" then
15
17
  return id
16
18
  else
17
- local numid = string.unpack(">I4", id)
19
+ local numid = string.unpack(
20
+ ">I4",
21
+ __TS__StringPadEnd(id, 4, "\0")
22
+ )
18
23
  return numid
19
24
  end
20
25
  end
@@ -41,6 +41,7 @@ function ApplyUnitBehaviorAbilityBehavior.prototype.onUnitGainAbility(self, unit
41
41
  ____opt_0:destroy()
42
42
  end
43
43
  self.unitBehavior = __TS__New(self.unitBehaviorConstructor, unit)
44
+ self.unitBehavior.sourceAbilityBehavior = self
44
45
  self:update()
45
46
  end
46
47
  function ApplyUnitBehaviorAbilityBehavior.prototype.onUnitLoseAbility(self)
@@ -5,6 +5,7 @@ import { Unit } from "../../internal/unit";
5
5
  import { AbilityDependentValue } from "../../object-field/ability";
6
6
  import { Widget } from "../../../core/types/widget";
7
7
  import { AttackType, DamageType, WeaponType } from "../../internal/unit+damage";
8
+ import { CombatClassifications } from "../../object-data/auxiliary/combat-classification";
8
9
  export type DamageAbilityBehaviorParameters = {
9
10
  damagePerStrength?: AbilityDependentValue<number>;
10
11
  damagePerAgility?: AbilityDependentValue<number>;
@@ -15,6 +16,8 @@ export type DamageAbilityBehaviorParameters = {
15
16
  };
16
17
  export type DamageAreaAbilityBehaviorParameters = DamageAbilityBehaviorParameters & {
17
18
  maximumDamage?: AbilityDependentValue<number>;
19
+ areaOfEffect?: AbilityDependentValue<number>;
20
+ allowedTargetCombatClassifications?: AbilityDependentValue<CombatClassifications>;
18
21
  };
19
22
  declare abstract class DamageAbilityBehavior<T extends DamageAbilityBehaviorParameters = DamageAbilityBehaviorParameters> extends AbilityBehavior {
20
23
  protected readonly damage: AbilityDependentValue<number>;
@@ -82,10 +82,10 @@ function DamageAreaAbilityBehavior.prototype.damageArea(self, caster, x, y)
82
82
  local parameters = self.parameters
83
83
  local targets = Unit.getAllowedTargetsInCollisionRange(
84
84
  caster,
85
- self:resolveCurrentAbilityDependentValue(ALLOWED_TARGETS_ABILITY_COMBAT_CLASSIFICATIONS_LEVEL_FIELD),
85
+ self:resolveCurrentAbilityDependentValue(parameters and parameters.allowedTargetCombatClassifications or ALLOWED_TARGETS_ABILITY_COMBAT_CLASSIFICATIONS_LEVEL_FIELD),
86
86
  x,
87
87
  y,
88
- self:resolveCurrentAbilityDependentValue(AREA_OF_EFFECT_ABILITY_FLOAT_LEVEL_FIELD)
88
+ self:resolveCurrentAbilityDependentValue(parameters and parameters.areaOfEffect or AREA_OF_EFFECT_ABILITY_FLOAT_LEVEL_FIELD)
89
89
  )
90
90
  local damage = self:calculateDamage(caster)
91
91
  local maximumDamage = self:resolveCurrentAbilityDependentValue(parameters and parameters.maximumDamage or 0)
@@ -22,13 +22,17 @@ export declare abstract class AbilityBehavior<Parameters extends {
22
22
  protected subscribe<T extends boolean | number | string>(value: SubscribableAbilityDependentValue<T>): void;
23
23
  protected registerCommandEvent(orderTypeStringId?: string): void;
24
24
  get ability(): Ability;
25
+ get unit(): Unit | undefined;
25
26
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value: AbilityDependentValue<T>): T;
26
27
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value?: AbilityDependentValue<T>): T | undefined;
27
28
  protected flashCasterEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
28
29
  protected flashTargetEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
29
30
  protected flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
30
31
  protected flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
31
- protected flashSpecialEffect(...args: [...pointOrWidget: [x: number, y: number] | [widget: Widget], duration?: number]): void;
32
+ protected flashSpecialEffect(...args: [
33
+ ...pointOrWidget: [x: number, y: number] | [widget: Widget],
34
+ ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]
35
+ ]): void;
32
36
  private static MissileLaunchConfig;
33
37
  private get missileLaunchConfig();
34
38
  protected onCreate(): void;
@@ -148,13 +148,14 @@ function AbilityBehavior.prototype.flashEffect(self, x, y, ...)
148
148
  ...
149
149
  )
150
150
  end
151
- function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrDuration, duration)
151
+ function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrParametersOrDuration, durationOrParameters, parameters)
152
152
  if type(xOrWidget) == "number" then
153
153
  Effect:flash(
154
154
  SPECIAL_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
155
155
  xOrWidget,
156
- yOrDuration,
157
- duration
156
+ yOrParametersOrDuration,
157
+ durationOrParameters,
158
+ parameters
158
159
  )
159
160
  else
160
161
  local attachmentPoint = SPECIAL_EFFECT_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability)
@@ -162,7 +163,8 @@ function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrDurati
162
163
  SPECIAL_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
163
164
  xOrWidget,
164
165
  attachmentPoint ~= "" and attachmentPoint or "origin",
165
- yOrDuration
166
+ yOrParametersOrDuration,
167
+ durationOrParameters
166
168
  )
167
169
  end
168
170
  end
@@ -237,6 +239,18 @@ __TS__SetDescriptor(
237
239
  end},
238
240
  true
239
241
  )
242
+ __TS__SetDescriptor(
243
+ AbilityBehavior.prototype,
244
+ "unit",
245
+ {get = function(self)
246
+ local owner = self.object.owner
247
+ if __TS__InstanceOf(owner, Unit) then
248
+ return owner
249
+ end
250
+ return owner.owner
251
+ end},
252
+ true
253
+ )
240
254
  AbilityBehavior.MissileLaunchConfig = ____class_2
241
255
  __TS__SetDescriptor(
242
256
  AbilityBehavior.prototype,
@@ -5,9 +5,11 @@ import { DamageEvent, DamagingEvent, Unit } from "../internal/unit";
5
5
  import "../internal/unit+ability";
6
6
  import "../internal/unit-missile-launch";
7
7
  import { Item } from "../internal/item";
8
+ import type { AbilityBehavior } from "./ability";
8
9
  export type UnitBehaviorConstructor<Args extends any[]> = new (unit: Unit, ...args: Args) => UnitBehavior;
9
10
  export declare abstract class UnitBehavior<PeriodicActionParameters extends any[] = any[]> extends Behavior<Unit, PeriodicActionParameters> {
10
11
  constructor(unit: Unit);
12
+ readonly sourceAbilityBehavior?: AbilityBehavior;
11
13
  get unit(): Unit;
12
14
  onAutoAttackStart(target: Unit): void;
13
15
  onAutoAttackFinish(target: Unit): void;
package/engine/buff.d.ts CHANGED
@@ -64,6 +64,7 @@ export type BuffParameters<T extends Buff<any> = Buff> = Buff extends T ? {
64
64
  durationIncreaseOnAutoAttack?: NumberParameterValueType;
65
65
  maximumRemainingDuration?: NumberParameterValueType;
66
66
  maximumDuration?: NumberParameterValueType;
67
+ turnsIntoGhost?: BooleanParameterValueType;
67
68
  stuns?: BooleanParameterValueType;
68
69
  ignoresStunImmunity?: BooleanParameterValueType;
69
70
  providesStunImmunity?: BooleanParameterValueType;
@@ -116,13 +117,14 @@ declare const enum BuffPropertyKey {
116
117
  MAXIMUM_DAMAGE_DEALT_EVENT_COUNT = 132,
117
118
  DAMAGE_RECEIVED_EVENT_COUNT = 133,
118
119
  MAXIMUM_DAMAGE_RECEIVED_EVENT_COUNT = 134,
119
- STUNS = 135,
120
- IGNORES_STUN_IMMUNITY = 136,
121
- DISABLES_AUTO_ATTACK = 137,
122
- PROVIDES_INVULNERABILITY = 138,
123
- KILLS_ON_EXPIRATION = 139,
124
- EXPLODES_ON_EXPIRATION = 140,
125
- MISS_PROBABILITY = 141
120
+ TURNS_INTO_GHOST = 135,
121
+ STUNS = 136,
122
+ IGNORES_STUN_IMMUNITY = 137,
123
+ DISABLES_AUTO_ATTACK = 138,
124
+ PROVIDES_INVULNERABILITY = 139,
125
+ KILLS_ON_EXPIRATION = 140,
126
+ EXPLODES_ON_EXPIRATION = 141,
127
+ MISS_PROBABILITY = 142
126
128
  }
127
129
  export declare const enum BuffTypeIdSelectionPolicy {
128
130
  LEAST_DURATION = 0
@@ -136,7 +138,7 @@ export type BuffConstructorParameters<AdditionalParameters extends BuffAdditiona
136
138
  polarity: BuffPolarityParameterType,
137
139
  resistanceType: BuffResistanceTypeParameterType,
138
140
  ...abilityOrParameters: [
139
- ability: Ability,
141
+ ability?: Ability,
140
142
  parameters?: BuffParameters & Omit<AdditionalParameters, keyof BuffParameters>
141
143
  ] | [parameters?: BuffParameters & Omit<AdditionalParameters, keyof BuffParameters>]
142
144
  ];
@@ -178,6 +180,7 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
178
180
  private [BuffPropertyKey.DAMAGE_DEALT_EVENT_COUNT]?;
179
181
  private [BuffPropertyKey.MAXIMUM_DAMAGE_RECEIVED_EVENT_COUNT]?;
180
182
  private [BuffPropertyKey.DAMAGE_RECEIVED_EVENT_COUNT]?;
183
+ private [BuffPropertyKey.TURNS_INTO_GHOST]?;
181
184
  private [BuffPropertyKey.STUNS]?;
182
185
  private [BuffPropertyKey.IGNORES_STUN_IMMUNITY]?;
183
186
  private [BuffPropertyKey.DISABLES_AUTO_ATTACK]?;
@@ -231,6 +234,8 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
231
234
  set receivedDamageFactor(receivedDamageFactor: number);
232
235
  get armorIncrease(): number;
233
236
  set armorIncrease(armorIncrease: number);
237
+ get turnsIntoGhost(): boolean;
238
+ set turnsIntoGhost(turnsIntoGhost: boolean);
234
239
  get stuns(): boolean;
235
240
  set stuns(stuns: boolean);
236
241
  get ignoresStunImmunity(): boolean;