warscript 0.0.1-dev.ed60fea → 0.0.1-dev.effa673

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 (89) hide show
  1. package/config.d.ts +5 -0
  2. package/config.lua +10 -0
  3. package/core/types/effect.d.ts +1 -3
  4. package/core/types/effect.lua +26 -29
  5. package/core/types/sound.d.ts +17 -24
  6. package/core/types/sound.lua +94 -24
  7. package/core/util.lua +6 -1
  8. package/engine/behaviour/ability/apply-buff.d.ts +5 -0
  9. package/engine/behaviour/ability/apply-buff.lua +32 -0
  10. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  11. package/engine/behaviour/ability/damage.d.ts +3 -0
  12. package/engine/behaviour/ability/damage.lua +2 -2
  13. package/engine/behaviour/ability.d.ts +7 -2
  14. package/engine/behaviour/ability.lua +34 -7
  15. package/engine/behaviour/unit.d.ts +2 -0
  16. package/engine/buff.d.ts +56 -41
  17. package/engine/buff.lua +295 -228
  18. package/engine/internal/ability.lua +0 -2
  19. package/engine/internal/item/ability.lua +19 -3
  20. package/engine/internal/item.d.ts +2 -2
  21. package/engine/internal/item.lua +56 -25
  22. package/engine/internal/mechanics/ability-duration.lua +1 -1
  23. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  24. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  25. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  26. package/engine/internal/object-data/evasion-probability.lua +16 -0
  27. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  28. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  29. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  30. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  31. package/engine/internal/unit/bonus.d.ts +2 -0
  32. package/engine/internal/unit/bonus.lua +17 -0
  33. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  34. package/engine/internal/unit/ignore-events-items.lua +5 -0
  35. package/engine/internal/unit/item.lua +3 -4
  36. package/engine/internal/unit.d.ts +7 -1
  37. package/engine/internal/unit.lua +28 -8
  38. package/engine/lightning.d.ts +12 -5
  39. package/engine/lightning.lua +48 -14
  40. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  41. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  42. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  43. package/engine/object-data/auxiliary/attachment-preset.lua +2 -2
  44. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  45. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  46. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  47. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  48. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  49. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  50. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  51. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  52. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  53. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  54. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  55. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  56. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  57. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  58. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  59. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  60. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  61. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  62. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  63. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  64. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  65. package/engine/object-data/entry/ability-type/web.lua +52 -0
  66. package/engine/object-data/entry/ability-type.d.ts +19 -17
  67. package/engine/object-data/entry/ability-type.lua +74 -21
  68. package/engine/object-data/entry/buff-type/applicable.lua +13 -37
  69. package/engine/object-data/entry/buff-type.d.ts +1 -1
  70. package/engine/object-data/entry/buff-type.lua +2 -2
  71. package/engine/object-data/entry/destructible-type.d.ts +1 -1
  72. package/engine/object-data/entry/item-type.d.ts +1 -1
  73. package/engine/object-data/entry/item-type.lua +4 -4
  74. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  75. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  76. package/engine/object-data/entry/sound-preset.lua +140 -0
  77. package/engine/object-data/entry/unit-type.d.ts +8 -1
  78. package/engine/object-data/entry/unit-type.lua +61 -8
  79. package/engine/object-data/entry/upgrade.d.ts +1 -1
  80. package/engine/object-data/entry/upgrade.lua +4 -4
  81. package/engine/object-data/entry.d.ts +16 -14
  82. package/engine/object-data/entry.lua +60 -32
  83. package/engine/standard/entries/sound-preset.d.ts +10 -0
  84. package/engine/standard/entries/sound-preset.lua +10 -0
  85. package/engine/unit.d.ts +1 -0
  86. package/engine/unit.lua +1 -0
  87. package/objutil/unit.lua +8 -0
  88. package/package.json +2 -2
  89. package/utility/reflection.lua +11 -7
package/config.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ /** @noSelfInFile */
2
+ export declare class WarscriptConfig {
3
+ private constructor();
4
+ static AUTOMATICALLY_SET_UNIT_TYPE_PORTRAIT_MODEL_PATH: boolean;
5
+ }
package/config.lua ADDED
@@ -0,0 +1,10 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__Class = ____lualib.__TS__Class
3
+ local ____exports = {}
4
+ ____exports.WarscriptConfig = __TS__Class()
5
+ local WarscriptConfig = ____exports.WarscriptConfig
6
+ WarscriptConfig.name = "WarscriptConfig"
7
+ function WarscriptConfig.prototype.____constructor(self)
8
+ end
9
+ WarscriptConfig.AUTOMATICALLY_SET_UNIT_TYPE_PORTRAIT_MODEL_PATH = true
10
+ return ____exports
@@ -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,12 +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 createAtPosition(fileName: string, preset: Sound3DPreset, x?: number, y?: number, z?: number): Sound3D;
68
- 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;
69
62
  }
@@ -5,15 +5,18 @@ 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
13
+ local createSoundFromLabel = CreateSoundFromLabel
9
14
  local setSoundPitch = SetSoundPitch
10
15
  local setSoundChannel = SetSoundChannel
11
16
  local setSoundPosition = SetSoundPosition
12
17
  local setSoundVolume = SetSoundVolume
13
18
  local setSoundDistances = SetSoundDistances
14
19
  local setSoundDistanceCutoff = SetSoundDistanceCutoff
15
- local setSoundConeAngles = SetSoundConeAngles
16
- local setSoundConeOrientation = SetSoundConeOrientation
17
20
  local startSound = StartSound
18
21
  local setSoundPlayPosition = SetSoundPlayPosition
19
22
  local stopSound = StopSound
@@ -50,29 +53,21 @@ ____exports.SoundChannel.Birth = 13
50
53
  ____exports.SoundChannel[____exports.SoundChannel.Birth] = "Birth"
51
54
  ____exports.SoundChannel.Fire = 14
52
55
  ____exports.SoundChannel[____exports.SoundChannel.Fire] = "Fire"
53
- ____exports.SoundEax = SoundEax or ({})
54
- ____exports.SoundEax.Default = "DefaultEAXON"
55
- ____exports.SoundEax.Acknowledgements = "HeroAcksEAX"
56
- ____exports.SoundEax.Environment = "DoodadsEAX"
57
- ____exports.SoundEax.Drums = "KotoDrumsEAX"
58
- ____exports.SoundEax.Attacks = "CombatSoundsEAX"
59
- ____exports.SoundEax.Abilities = "SpellsEAX"
60
- ____exports.SoundEax.Missiles = "MissilesEAX"
61
- ____exports.SoundPreset = {}
62
- local SoundPreset = ____exports.SoundPreset
56
+ ____exports.SoundSettings = {}
57
+ local SoundSettings = ____exports.SoundSettings
63
58
  do
64
- SoundPreset.UI = {channel = ____exports.SoundChannel.UI, eax = ____exports.SoundEax.Default, fadeInRate = 12700, fadeOutRate = 12700}
65
- SoundPreset.Music = {
59
+ SoundSettings.UI = {channel = ____exports.SoundChannel.UI, eax = "DefaultEAXON", fadeInRate = 12700, fadeOutRate = 12700}
60
+ SoundSettings.Music = {
66
61
  channel = ____exports.SoundChannel.Music,
67
- eax = ____exports.SoundEax.Default,
62
+ eax = "DefaultEAXON",
68
63
  fadeInRate = 12700,
69
64
  fadeOutRate = 12700,
70
65
  looping = true
71
66
  }
72
- SoundPreset.Attack = {channel = ____exports.SoundChannel.Combat, eax = ____exports.SoundEax.Attacks, fadeInRate = 10, fadeOutRate = 10}
73
- SoundPreset.Ability = {
67
+ SoundSettings.Attack = {channel = ____exports.SoundChannel.Combat, eax = "CombatSoundsEAX", fadeInRate = 10, fadeOutRate = 10}
68
+ SoundSettings.Ability = {
74
69
  channel = ____exports.SoundChannel.Animations,
75
- eax = ____exports.SoundEax.Abilities,
70
+ eax = "SpellsEAX",
76
71
  stopWhenOutOfRange = true,
77
72
  volume = 127,
78
73
  fadeInRate = 1,
@@ -82,9 +77,9 @@ do
82
77
  maxDistance = 3500,
83
78
  distanceCutoff = 3000
84
79
  }
85
- SoundPreset.AbilityLooping = {
80
+ SoundSettings.AbilityLooping = {
86
81
  channel = ____exports.SoundChannel.Birth,
87
- eax = ____exports.SoundEax.Abilities,
82
+ eax = "SpellsEAX",
88
83
  looping = true,
89
84
  stopWhenOutOfRange = true,
90
85
  volume = 127,
@@ -95,9 +90,9 @@ do
95
90
  maxDistance = 3000,
96
91
  distanceCutoff = 3000
97
92
  }
98
- SoundPreset.Missile = {
93
+ SoundSettings.Missile = {
99
94
  channel = ____exports.SoundChannel.Animations,
100
- eax = ____exports.SoundEax.Missiles,
95
+ eax = "MissilesEAX",
101
96
  stopWhenOutOfRange = true,
102
97
  volume = 127,
103
98
  fadeInRate = 1,
@@ -108,6 +103,24 @@ do
108
103
  distanceCutoff = 3000
109
104
  }
110
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)
111
124
  local function createPresetSound(fileName, preset)
112
125
  local ____fileName_1 = fileName
113
126
  local ____preset_looping_0 = preset.looping
@@ -121,7 +134,7 @@ local function createPresetSound(fileName, preset)
121
134
  true,
122
135
  preset.fadeInRate or 12700,
123
136
  preset.fadeOutRate or 12700,
124
- preset.eax or ____exports.SoundEax.Default
137
+ preset.eax or "DefaultEAXON"
125
138
  )
126
139
  setSoundChannel(sound, preset.channel or ____exports.SoundChannel.General)
127
140
  setSoundVolume(sound, preset.volume or 127)
@@ -144,7 +157,7 @@ local function createPreset3DSound(fileName, preset)
144
157
  ____preset_stopWhenOutOfRange_3,
145
158
  preset.fadeInRate or 12700,
146
159
  preset.fadeOutRate or 12700,
147
- preset.eax or ____exports.SoundEax.Default
160
+ preset.eax or "DefaultEAXON"
148
161
  )
149
162
  setSoundChannel(sound, preset.channel or ____exports.SoundChannel.General)
150
163
  setSoundVolume(sound, preset.volume or 127)
@@ -153,6 +166,53 @@ local function createPreset3DSound(fileName, preset)
153
166
  setSoundDistanceCutoff(sound, preset.distanceCutoff or 1500)
154
167
  return sound
155
168
  end
169
+ local function createPreset3DSoundFromLabel(label, preset)
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
214
+ end
215
+ end
156
216
  ____exports.Sound = __TS__Class()
157
217
  local Sound = ____exports.Sound
158
218
  Sound.name = "Sound"
@@ -225,6 +285,16 @@ function Sound3D.playOnUnit(self, fileName, preset, unit)
225
285
  startSound(sound)
226
286
  killSoundWhenDone(sound)
227
287
  end
288
+ function Sound3D.playFromLabel(self, label, preset, unitOrX, y, z)
289
+ local sound = createPreset3DSoundFromLabel(label, preset)
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
295
+ startSound(sound)
296
+ killSoundWhenDone(sound)
297
+ end
228
298
  function Sound3D.createAtPosition(self, fileName, preset, x, y, z)
229
299
  if x == nil then
230
300
  x = 0
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
@@ -33,4 +33,9 @@ export declare class ApplyBuffTargetAreaAbilityBehavior<T extends BuffConstructo
33
33
  onPointTargetImpact(caster: Unit, x: number, y: number): void;
34
34
  onWidgetTargetImpact(caster: Unit, target: Widget): void;
35
35
  }
36
+ export declare class ApplyBuffChannelingTargetAbilityBehavior<T extends BuffConstructor = typeof Buff> extends ApplyBuffAbilityBehavior<T> {
37
+ private buff?;
38
+ onUnitTargetChannelingStart(caster: Unit, target: Unit): void;
39
+ onStop(): void;
40
+ }
36
41
  export {};
@@ -123,4 +123,36 @@ function ApplyBuffTargetAreaAbilityBehavior.prototype.onWidgetTargetImpact(self,
123
123
  self.applyBuff(unit)
124
124
  end
125
125
  end
126
+ local behaviorByBuff = {}
127
+ ____exports.ApplyBuffChannelingTargetAbilityBehavior = __TS__Class()
128
+ local ApplyBuffChannelingTargetAbilityBehavior = ____exports.ApplyBuffChannelingTargetAbilityBehavior
129
+ ApplyBuffChannelingTargetAbilityBehavior.name = "ApplyBuffChannelingTargetAbilityBehavior"
130
+ __TS__ClassExtends(ApplyBuffChannelingTargetAbilityBehavior, ____exports.ApplyBuffAbilityBehavior)
131
+ function ApplyBuffChannelingTargetAbilityBehavior.prototype.onUnitTargetChannelingStart(self, caster, target)
132
+ local previousBuff = self.buff
133
+ if previousBuff ~= nil then
134
+ behaviorByBuff[previousBuff] = nil
135
+ previousBuff:destroy()
136
+ end
137
+ local buff = self.applyBuff(target)
138
+ if buff ~= nil then
139
+ behaviorByBuff[buff] = self
140
+ end
141
+ self.buff = buff
142
+ end
143
+ function ApplyBuffChannelingTargetAbilityBehavior.prototype.onStop(self)
144
+ local buff = self.buff
145
+ if buff ~= nil then
146
+ behaviorByBuff[buff] = nil
147
+ buff:destroy()
148
+ self.buff = nil
149
+ end
150
+ end
151
+ Buff.destroyEvent:addListener(function(buff)
152
+ local behavior = behaviorByBuff[buff]
153
+ if behavior ~= nil then
154
+ behaviorByBuff[buff] = nil
155
+ behavior.ability:interruptCast()
156
+ end
157
+ end)
126
158
  return ____exports
@@ -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,12 +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
- protected flashCasterEffect(widget: Widget): void;
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;
28
30
  protected flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
29
31
  protected flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
30
- 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;
31
36
  private static MissileLaunchConfig;
32
37
  private get missileLaunchConfig();
33
38
  protected onCreate(): void;
@@ -24,6 +24,8 @@ local MISSILE_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = ____ability.MISSILE_MODEL
24
24
  local MISSILE_SPEED_ABILITY_INTEGER_FIELD = ____ability.MISSILE_SPEED_ABILITY_INTEGER_FIELD
25
25
  local SPECIAL_EFFECT_ATTACHMENT_POINT_STRING_FIELD = ____ability.SPECIAL_EFFECT_ATTACHMENT_POINT_STRING_FIELD
26
26
  local SPECIAL_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = ____ability.SPECIAL_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD
27
+ local TARGET_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD = ____ability.TARGET_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD
28
+ local TARGET_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = ____ability.TARGET_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD
27
29
  local ____ability = require("engine.object-field.ability")
28
30
  local AbilityField = ____ability.AbilityField
29
31
  local AbilityLevelField = ____ability.AbilityLevelField
@@ -112,12 +114,22 @@ end
112
114
  function AbilityBehavior.prototype.resolveCurrentAbilityDependentValue(self, value)
113
115
  return resolveCurrentAbilityDependentValue(self.ability, value)
114
116
  end
115
- function AbilityBehavior.prototype.flashCasterEffect(self, widget)
117
+ function AbilityBehavior.prototype.flashCasterEffect(self, widget, ...)
116
118
  local attachmentPoint = CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability)
117
119
  Effect:flash(
118
120
  CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
119
121
  widget,
120
- attachmentPoint ~= "" and attachmentPoint or "origin"
122
+ attachmentPoint ~= "" and attachmentPoint or "origin",
123
+ ...
124
+ )
125
+ end
126
+ function AbilityBehavior.prototype.flashTargetEffect(self, widget, ...)
127
+ local attachmentPoint = TARGET_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability)
128
+ Effect:flash(
129
+ TARGET_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
130
+ widget,
131
+ attachmentPoint ~= "" and attachmentPoint or "origin",
132
+ ...
121
133
  )
122
134
  end
123
135
  function AbilityBehavior.prototype.flashAreaEffect(self, x, y, ...)
@@ -136,20 +148,23 @@ function AbilityBehavior.prototype.flashEffect(self, x, y, ...)
136
148
  ...
137
149
  )
138
150
  end
139
- function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrDuration, duration)
151
+ function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrParametersOrDuration, durationOrParameters, parameters)
140
152
  if type(xOrWidget) == "number" then
141
153
  Effect:flash(
142
154
  SPECIAL_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
143
155
  xOrWidget,
144
- yOrDuration,
145
- duration
156
+ yOrParametersOrDuration,
157
+ durationOrParameters,
158
+ parameters
146
159
  )
147
160
  else
161
+ local attachmentPoint = SPECIAL_EFFECT_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability)
148
162
  Effect:flash(
149
163
  SPECIAL_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
150
164
  xOrWidget,
151
- SPECIAL_EFFECT_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability),
152
- yOrDuration
165
+ attachmentPoint ~= "" and attachmentPoint or "origin",
166
+ yOrParametersOrDuration,
167
+ durationOrParameters
153
168
  )
154
169
  end
155
170
  end
@@ -224,6 +239,18 @@ __TS__SetDescriptor(
224
239
  end},
225
240
  true
226
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
+ )
227
254
  AbilityBehavior.MissileLaunchConfig = ____class_2
228
255
  __TS__SetDescriptor(
229
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;